From 85472862b4c0d3762f99d7aad5d83bb825b39883 Mon Sep 17 00:00:00 2001 From: metamaskbot Date: Thu, 22 Jan 2026 20:47:41 +0000 Subject: [PATCH 01/80] [skip ci] Bump version number to 3514 --- android/app/build.gradle | 2 +- bitrise.yml | 4 ++-- ios/MetaMask.xcodeproj/project.pbxproj | 12 ++++++------ 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 4140835ec002..81022898890b 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -188,7 +188,7 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion versionName "7.63.0" - versionCode 3418 + versionCode 3514 testBuildType System.getProperty('testBuildType', 'debug') testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" manifestPlaceholders.MM_BRANCH_KEY_TEST = "$System.env.MM_BRANCH_KEY_TEST" diff --git a/bitrise.yml b/bitrise.yml index 9a792b201d77..f413a2ef4e1c 100644 --- a/bitrise.yml +++ b/bitrise.yml @@ -3472,13 +3472,13 @@ app: VERSION_NAME: 7.63.0 - opts: is_expand: false - VERSION_NUMBER: 3418 + VERSION_NUMBER: 3514 - opts: is_expand: false FLASK_VERSION_NAME: 7.63.0 - opts: is_expand: false - FLASK_VERSION_NUMBER: 3418 + FLASK_VERSION_NUMBER: 3514 - opts: is_expand: false ANDROID_APK_LINK: '' diff --git a/ios/MetaMask.xcodeproj/project.pbxproj b/ios/MetaMask.xcodeproj/project.pbxproj index 923b4f3db6e0..447874c7cdd0 100644 --- a/ios/MetaMask.xcodeproj/project.pbxproj +++ b/ios/MetaMask.xcodeproj/project.pbxproj @@ -1281,7 +1281,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3418; + CURRENT_PROJECT_VERSION = 3514; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 48XVW22RCG; @@ -1350,7 +1350,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3418; + CURRENT_PROJECT_VERSION = 3514; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 48XVW22RCG; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 48XVW22RCG; @@ -1416,7 +1416,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3418; + CURRENT_PROJECT_VERSION = 3514; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 48XVW22RCG; @@ -1483,7 +1483,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3418; + CURRENT_PROJECT_VERSION = 3514; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 48XVW22RCG; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 48XVW22RCG; @@ -1646,7 +1646,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3418; + CURRENT_PROJECT_VERSION = 3514; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 48XVW22RCG; @@ -1716,7 +1716,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3418; + CURRENT_PROJECT_VERSION = 3514; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 48XVW22RCG; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 48XVW22RCG; From d1c9d5f525aebb5c408852c9a4a09adaf7394e58 Mon Sep 17 00:00:00 2001 From: "runway-github[bot]" <73448015+runway-github[bot]@users.noreply.github.com> Date: Fri, 23 Jan 2026 12:13:04 +0000 Subject: [PATCH 02/80] chore(runway): cherry-pick fix(predict): cp-7.63.0 add transaction validation and improve error handling (#25076) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - fix(predict): cp-7.63.0 add transaction validation and improve error handling (#25013) ## **Description** Adds comprehensive validation for deposit transactions to prevent silent failures causing 'not enough input to decode' errors. Changes: - Add transaction validation in depositWithConfirmation: - Verify transaction and params objects exist - Validate 'to' address format (0x prefix, 42 chars) - Validate data field exists and has valid hex format - Enforce minimum data length (10 chars) - Improve error handling in polymarket safe utils: - Re-throw errors in getDeployProxyWalletTransaction instead of returning undefined - Add try-catch with proper error propagation in getProxyWalletAllowancesTransaction - Add call data length validation - Update tests with valid mock addresses/data - Add test coverage for all new validation error scenarios ## **Changelog** CHANGELOG entry: null ## **Related issues** Fixes: #24804 ## **Manual testing steps** ```gherkin Feature: my feature name Scenario: user [verb for user action] Given [describe expected initial app state] When user [verb for user action] Then [describe expected outcome] ``` ## **Screenshots/Recordings** ### **Before** ### **After** ## **Pre-merge author checklist** - [ ] I’ve followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile Coding Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md). - [ ] I've completed the PR template to the best of my ability - [ ] I’ve included tests if applicable - [ ] I’ve documented my code using [JSDoc](https://jsdoc.app/) format if applicable - [ ] I’ve applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors. ## **Pre-merge reviewer checklist** - [ ] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [ ] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots. --- > [!NOTE] > Strengthens deposit flow reliability and surfaces clearer errors. > > - Add `validateDepositTransactions` and integrate into `depositWithConfirmation`; log tx metadata and enforce `to` address format, hex data presence/format, and minimum data length > - Improve Polymarket Safe utils: rethrow errors in `getDeployProxyWalletTransaction`, wrap `getProxyWalletAllowancesTransaction` in try/catch with call data length validation and contextual error messages > - Update tests with valid addresses/data and add coverage for all new validation/error cases (including user-denied signatures) > - Minor test event updates to use realistic `from/to/data` fields > > Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit bdc37dd138c159cb197cb92519996ea3675f403a. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot). [87bc552](https://github.com/MetaMask/metamask-mobile/commit/87bc55200b94ea493d885c34e2a8f30344f18097) Co-authored-by: Caainã Jeronimo --- .../controllers/PredictController.test.ts | 189 +++++++++++++++--- .../Predict/controllers/PredictController.ts | 15 ++ .../providers/polymarket/safe/utils.test.ts | 45 ++++- .../providers/polymarket/safe/utils.ts | 66 ++++-- .../utils/validateTransactions.test.ts | 180 +++++++++++++++++ .../UI/Predict/utils/validateTransactions.ts | 164 +++++++++++++++ 6 files changed, 615 insertions(+), 44 deletions(-) create mode 100644 app/components/UI/Predict/utils/validateTransactions.test.ts create mode 100644 app/components/UI/Predict/utils/validateTransactions.ts diff --git a/app/components/UI/Predict/controllers/PredictController.test.ts b/app/components/UI/Predict/controllers/PredictController.test.ts index d2d15db4748e..89c3af71a407 100644 --- a/app/components/UI/Predict/controllers/PredictController.test.ts +++ b/app/components/UI/Predict/controllers/PredictController.test.ts @@ -2987,14 +2987,14 @@ describe('PredictController', () => { const mockTransactions = [ { params: { - to: '0xToken' as `0x${string}`, - data: '0xapprove' as `0x${string}`, + to: '0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174' as `0x${string}`, + data: '0x095ea7b3000000000000000000000000' as `0x${string}`, }, }, { params: { - to: '0xSafe' as `0x${string}`, - data: '0xdeposit' as `0x${string}`, + to: '0x9876543210987654321098765432109876543210' as `0x${string}`, + data: '0xa9059cbb000000000000000000000000' as `0x${string}`, }, }, ]; @@ -3115,8 +3115,8 @@ describe('PredictController', () => { transactions: [ { params: { - to: '0xToken' as `0x${string}`, - data: '0xapprove' as `0x${string}`, + to: '0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174' as `0x${string}`, + data: '0x095ea7b3000000000000000000000000' as `0x${string}`, }, }, ], @@ -3148,8 +3148,8 @@ describe('PredictController', () => { transactions: [ { params: { - to: '0xToken' as `0x${string}`, - data: '0xapprove' as `0x${string}`, + to: '0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174' as `0x${string}`, + data: '0x095ea7b3000000000000000000000000' as `0x${string}`, }, }, ], @@ -3190,8 +3190,8 @@ describe('PredictController', () => { transactions: [ { params: { - to: '0xToken' as `0x${string}`, - data: '0xapprove' as `0x${string}`, + to: '0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174' as `0x${string}`, + data: '0x095ea7b3000000000000000000000000' as `0x${string}`, }, }, ], @@ -3224,8 +3224,8 @@ describe('PredictController', () => { transactions: [ { params: { - to: '0xToken' as `0x${string}`, - data: '0xapprove' as `0x${string}`, + to: '0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174' as `0x${string}`, + data: '0x095ea7b3000000000000000000000000' as `0x${string}`, }, }, ], @@ -3254,8 +3254,8 @@ describe('PredictController', () => { transactions: [ { params: { - to: '0xToken' as `0x${string}`, - data: '0xapprove' as `0x${string}`, + to: '0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174' as `0x${string}`, + data: '0x095ea7b3000000000000000000000000' as `0x${string}`, }, }, ], @@ -3328,8 +3328,8 @@ describe('PredictController', () => { transactions: [ { params: { - to: '0xToken' as `0x${string}`, - data: '0xapprove' as `0x${string}`, + to: '0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174' as `0x${string}`, + data: '0x095ea7b3000000000000000000000000' as `0x${string}`, }, }, ], @@ -3357,8 +3357,8 @@ describe('PredictController', () => { transactions: [ { params: { - to: '0xToken' as `0x${string}`, - data: '0xapprove' as `0x${string}`, + to: '0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174' as `0x${string}`, + data: '0x095ea7b3000000000000000000000000' as `0x${string}`, }, }, ], @@ -3384,8 +3384,8 @@ describe('PredictController', () => { transactions: [ { params: { - to: '0xToken' as `0x${string}`, - data: '0xapprove' as `0x${string}`, + to: '0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174' as `0x${string}`, + data: '0x095ea7b3000000000000000000000000' as `0x${string}`, }, }, ], @@ -3406,6 +3406,141 @@ describe('PredictController', () => { ).rejects.toThrow('Value must be a hexadecimal string.'); }); }); + + it('throws error when transaction is missing params object', async () => { + mockPolymarketProvider.prepareDeposit.mockResolvedValue({ + transactions: [{ type: 'contractInteraction' } as never], + chainId: '0x89', + }); + + await withController(async ({ controller }) => { + await expect( + controller.depositWithConfirmation({ + providerId: 'polymarket', + }), + ).rejects.toThrow( + 'Invalid transaction: transaction at index 0 is missing params object', + ); + }); + }); + + it('throws error when transaction is missing to address', async () => { + mockPolymarketProvider.prepareDeposit.mockResolvedValue({ + transactions: [ + { + params: { + data: '0x095ea7b3000000000000000000000000' as `0x${string}`, + }, + } as never, + ], + chainId: '0x89', + }); + + await withController(async ({ controller }) => { + await expect( + controller.depositWithConfirmation({ + providerId: 'polymarket', + }), + ).rejects.toThrow( + "Invalid transaction: transaction at index 0 is missing 'to' address", + ); + }); + }); + + it('throws error when transaction to address has invalid format', async () => { + mockPolymarketProvider.prepareDeposit.mockResolvedValue({ + transactions: [ + { + params: { + to: '0xshort' as `0x${string}`, + data: '0x095ea7b3000000000000000000000000' as `0x${string}`, + }, + }, + ], + chainId: '0x89', + }); + + await withController(async ({ controller }) => { + await expect( + controller.depositWithConfirmation({ + providerId: 'polymarket', + }), + ).rejects.toThrow( + "Invalid transaction: transaction at index 0 has invalid 'to' address format", + ); + }); + }); + + it('throws error when transaction data is missing', async () => { + mockPolymarketProvider.prepareDeposit.mockResolvedValue({ + transactions: [ + { + params: { + to: '0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174' as `0x${string}`, + }, + } as never, + ], + chainId: '0x89', + }); + + await withController(async ({ controller }) => { + await expect( + controller.depositWithConfirmation({ + providerId: 'polymarket', + }), + ).rejects.toThrow( + 'Invalid transaction: transaction at index 0 is missing data', + ); + }); + }); + + it('throws error when transaction data has invalid hex format', async () => { + mockPolymarketProvider.prepareDeposit.mockResolvedValue({ + transactions: [ + { + params: { + to: '0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174' as `0x${string}`, + data: 'not-hex-data' as `0x${string}`, + }, + }, + ], + chainId: '0x89', + }); + + await withController(async ({ controller }) => { + await expect( + controller.depositWithConfirmation({ + providerId: 'polymarket', + }), + ).rejects.toThrow( + 'Invalid transaction: transaction at index 0 has invalid data format (must be hex string starting with 0x)', + ); + }); + }); + + it('throws error when transaction data is too short', async () => { + mockPolymarketProvider.prepareDeposit.mockResolvedValue({ + transactions: [ + { + params: { + to: '0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174' as `0x${string}`, + data: '0x1234' as `0x${string}`, + }, + }, + ], + chainId: '0x89', + }); + + await withController(async ({ controller }) => { + await expect( + controller.depositWithConfirmation({ + providerId: 'polymarket', + }), + ).rejects.toThrow( + 'Invalid transaction: transaction at index 0 has insufficient data (length: 6, minimum: 10)', + ); + }); + }); }); describe('clearDepositTransaction', () => { @@ -3488,9 +3623,9 @@ describe('PredictController', () => { hash: '0xabc', status: 'confirmed', txParams: { - from: '0x1', - to: '0xToken', - data: '0xapprove', + from: '0x1234567890123456789012345678901234567890', + to: '0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174', + data: '0x095ea7b3000000000000000000000000', value: '0x0', }, }; @@ -3515,8 +3650,8 @@ describe('PredictController', () => { transactions: [ { params: { - to: '0xToken' as `0x${string}`, - data: '0xapprove' as `0x${string}`, + to: '0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174' as `0x${string}`, + data: '0x095ea7b3000000000000000000000000' as `0x${string}`, }, }, ], @@ -3552,8 +3687,8 @@ describe('PredictController', () => { transactions: [ { params: { - to: '0xToken' as `0x${string}`, - data: '0xapprove' as `0x${string}`, + to: '0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174' as `0x${string}`, + data: '0x095ea7b3000000000000000000000000' as `0x${string}`, }, }, ], diff --git a/app/components/UI/Predict/controllers/PredictController.ts b/app/components/UI/Predict/controllers/PredictController.ts index 60e336664ded..e66cbbb6cb73 100644 --- a/app/components/UI/Predict/controllers/PredictController.ts +++ b/app/components/UI/Predict/controllers/PredictController.ts @@ -41,6 +41,7 @@ import { PredictTradeStatus, PredictTradeStatusValue, } from '../constants/eventNames'; +import { validateDepositTransactions } from '../utils/validateTransactions'; import { PolymarketProvider } from '../providers/polymarket/PolymarketProvider'; import { AccountState, @@ -1873,6 +1874,20 @@ export class PredictController extends BaseController< throw new Error('Chain ID not provided by deposit preparation'); } + DevLogger.log('PredictController: depositWithConfirmation transactions', { + count: transactions.length, + transactions: transactions.map((tx, index) => ({ + index, + type: tx?.type, + to: tx?.params?.to, + dataLength: tx?.params?.data?.length ?? 0, + })), + }); + + validateDepositTransactions(transactions, { + providerId: params.providerId, + }); + const { NetworkController } = Engine.context; const networkClientId = NetworkController.findNetworkClientIdByChainId(chainId); diff --git a/app/components/UI/Predict/providers/polymarket/safe/utils.test.ts b/app/components/UI/Predict/providers/polymarket/safe/utils.test.ts index 016db9d59d3f..1ee3e299d19f 100644 --- a/app/components/UI/Predict/providers/polymarket/safe/utils.test.ts +++ b/app/components/UI/Predict/providers/polymarket/safe/utils.test.ts @@ -479,7 +479,7 @@ describe('safe utils', () => { expect(mockSignTypedMessage).toHaveBeenCalled(); }); - it('handles error gracefully', async () => { + it('throws error when signing fails', async () => { const signer = buildSigner(); mockSignTypedMessage.mockRejectedValue(new Error('Signature rejected')); const consoleErrorSpy = jest @@ -488,12 +488,29 @@ describe('safe utils', () => { // Mock implementation to suppress console output }); - const result = await getDeployProxyWalletTransaction({ signer }); + await expect(getDeployProxyWalletTransaction({ signer })).rejects.toThrow( + 'Failed to generate deploy proxy wallet transaction: Signature rejected', + ); - expect(result).toBeUndefined(); expect(consoleErrorSpy).toHaveBeenCalled(); consoleErrorSpy.mockRestore(); }); + + it('throws error with "Unknown error" when non-Error is thrown', async () => { + const signer = buildSigner(); + mockSignTypedMessage.mockRejectedValue('string error'); + const consoleErrorSpy = jest + .spyOn(console, 'error') + .mockImplementation(() => { + // Mock implementation to suppress console output + }); + + await expect(getDeployProxyWalletTransaction({ signer })).rejects.toThrow( + 'Failed to generate deploy proxy wallet transaction: Unknown error', + ); + + consoleErrorSpy.mockRestore(); + }); }); describe('checkProxyWalletDeployed', () => { @@ -985,6 +1002,28 @@ describe('safe utils', () => { // Then signer's signPersonalMessage is called expect(mockSignPersonalMessage).toHaveBeenCalled(); }); + + it('throws error when signing fails', async () => { + const signer = buildSigner(); + + mockNetworkController(); + mockQuery + .mockResolvedValueOnce( + '0x0000000000000000000000000000000000000000000000000000000000000001', + ) + .mockResolvedValueOnce( + '0xabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcd', + ); + mockSignPersonalMessage.mockRejectedValueOnce( + new Error('User rejected signing'), + ); + + await expect( + getProxyWalletAllowancesTransaction({ signer }), + ).rejects.toThrow( + 'Failed to generate proxy wallet allowances transaction: User rejected signing', + ); + }); }); describe('getClaimTransaction', () => { diff --git a/app/components/UI/Predict/providers/polymarket/safe/utils.ts b/app/components/UI/Predict/providers/polymarket/safe/utils.ts index dde34579b94f..a21b70d05a36 100644 --- a/app/components/UI/Predict/providers/polymarket/safe/utils.ts +++ b/app/components/UI/Predict/providers/polymarket/safe/utils.ts @@ -57,6 +57,8 @@ import { SplitSignature, } from './types'; +const MIN_VALID_HEX_DATA_LENGTH = 10; + function joinHexData(hexData: string[]): string { return `0x${hexData .map((hex) => { @@ -408,6 +410,13 @@ export const getDeployProxyWalletTransaction = async ({ }, }; Logger.error(error as Error, errorContext); + + // Re-throw to prevent silent failures that cause 'not enough input to decode' errors + throw new Error( + `Failed to generate deploy proxy wallet transaction: ${ + error instanceof Error ? error.message : 'Unknown error' + }`, + ); } }; @@ -569,20 +578,49 @@ export const getProxyWalletAllowancesTransaction = async ({ }: { signer: Signer; }) => { - const safeAddress = computeProxyAddress(signer.address); - const safeTxn = createAllowancesSafeTransaction(); - const callData = await getSafeTransactionCallData({ - signer, - safeAddress, - txn: safeTxn, - }); - return { - params: { - to: safeAddress as Hex, - data: callData as Hex, - }, - type: TransactionType.contractInteraction, - }; + try { + const safeAddress = computeProxyAddress(signer.address); + const safeTxn = createAllowancesSafeTransaction(); + const callData = await getSafeTransactionCallData({ + signer, + safeAddress, + txn: safeTxn, + }); + + if (!callData || callData.length < MIN_VALID_HEX_DATA_LENGTH) { + throw new Error( + `Invalid call data generated: ${callData?.length ?? 0} bytes, minimum ${MIN_VALID_HEX_DATA_LENGTH} required`, + ); + } + + return { + params: { + to: safeAddress as Hex, + data: callData as Hex, + }, + type: TransactionType.contractInteraction, + }; + } catch (error) { + const errorContext: LoggerErrorOptions = { + tags: { + feature: PREDICT_CONSTANTS.FEATURE_NAME, + provider: 'polymarket', + }, + context: { + name: 'safeUtils', + data: { + method: 'getProxyWalletAllowancesTransaction', + }, + }, + }; + Logger.error(error as Error, errorContext); + + throw new Error( + `Failed to generate proxy wallet allowances transaction: ${ + error instanceof Error ? error.message : 'Unknown error' + }`, + ); + } }; export const hasAllowances = async ({ address }: { address: string }) => { diff --git a/app/components/UI/Predict/utils/validateTransactions.test.ts b/app/components/UI/Predict/utils/validateTransactions.test.ts new file mode 100644 index 000000000000..8280a96a8fc7 --- /dev/null +++ b/app/components/UI/Predict/utils/validateTransactions.test.ts @@ -0,0 +1,180 @@ +import { TransactionType } from '@metamask/transaction-controller'; +import { Hex } from '@metamask/utils'; +import Logger from '../../../../util/Logger'; +import { validateDepositTransactions } from './validateTransactions'; + +jest.mock('../../../../util/Logger', () => ({ + error: jest.fn(), +})); + +const mockLoggerError = Logger.error as jest.Mock; + +const VALID_ADDRESS = '0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174' as Hex; +const VALID_DATA = '0x095ea7b3000000000000000000000000' as Hex; + +function createValidTransaction(overrides = {}) { + return { + params: { + to: VALID_ADDRESS, + data: VALID_DATA, + }, + type: TransactionType.contractInteraction, + ...overrides, + }; +} + +describe('validateDepositTransactions', () => { + const context = { providerId: 'polymarket' }; + + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('passes validation for valid transactions', () => { + const transactions = [createValidTransaction(), createValidTransaction()]; + + expect(() => + validateDepositTransactions(transactions, context), + ).not.toThrow(); + expect(mockLoggerError).not.toHaveBeenCalled(); + }); + + it('throws error when transaction is null', () => { + const transactions = [null as never]; + + expect(() => validateDepositTransactions(transactions, context)).toThrow( + 'Invalid transaction: transaction at index 0 is null or undefined', + ); + expect(mockLoggerError).toHaveBeenCalled(); + }); + + it('throws error when transaction is undefined', () => { + const transactions = [undefined as never]; + + expect(() => validateDepositTransactions(transactions, context)).toThrow( + 'Invalid transaction: transaction at index 0 is null or undefined', + ); + expect(mockLoggerError).toHaveBeenCalled(); + }); + + it('throws error when params object is missing', () => { + const transactions = [ + { type: TransactionType.contractInteraction } as never, + ]; + + expect(() => validateDepositTransactions(transactions, context)).toThrow( + 'Invalid transaction: transaction at index 0 is missing params object', + ); + expect(mockLoggerError).toHaveBeenCalled(); + }); + + it('throws error when to address is missing', () => { + const transactions = [ + createValidTransaction({ params: { data: VALID_DATA } }), + ]; + + expect(() => validateDepositTransactions(transactions, context)).toThrow( + "Invalid transaction: transaction at index 0 is missing 'to' address", + ); + expect(mockLoggerError).toHaveBeenCalled(); + }); + + it('throws error when to address is too short', () => { + const transactions = [ + createValidTransaction({ params: { to: '0xshort', data: VALID_DATA } }), + ]; + + expect(() => validateDepositTransactions(transactions, context)).toThrow( + "Invalid transaction: transaction at index 0 has invalid 'to' address format", + ); + expect(mockLoggerError).toHaveBeenCalled(); + }); + + it('throws error when to address does not start with 0x', () => { + const transactions = [ + createValidTransaction({ + params: { + to: '1234567890123456789012345678901234567890ab', + data: VALID_DATA, + }, + }), + ]; + + expect(() => validateDepositTransactions(transactions, context)).toThrow( + "Invalid transaction: transaction at index 0 has invalid 'to' address format", + ); + expect(mockLoggerError).toHaveBeenCalled(); + }); + + it('throws error when data is missing', () => { + const transactions = [ + createValidTransaction({ params: { to: VALID_ADDRESS } }), + ]; + + expect(() => validateDepositTransactions(transactions, context)).toThrow( + 'Invalid transaction: transaction at index 0 is missing data', + ); + expect(mockLoggerError).toHaveBeenCalled(); + }); + + it('throws error when data does not start with 0x', () => { + const transactions = [ + createValidTransaction({ + params: { to: VALID_ADDRESS, data: 'not-hex-data' }, + }), + ]; + + expect(() => validateDepositTransactions(transactions, context)).toThrow( + 'Invalid transaction: transaction at index 0 has invalid data format (must be hex string starting with 0x)', + ); + expect(mockLoggerError).toHaveBeenCalled(); + }); + + it('throws error when data is too short', () => { + const transactions = [ + createValidTransaction({ params: { to: VALID_ADDRESS, data: '0x1234' } }), + ]; + + expect(() => validateDepositTransactions(transactions, context)).toThrow( + 'Invalid transaction: transaction at index 0 has insufficient data (length: 6, minimum: 10)', + ); + expect(mockLoggerError).toHaveBeenCalled(); + }); + + it('validates all transactions in array', () => { + const transactions = [ + createValidTransaction(), + createValidTransaction({ params: { to: VALID_ADDRESS, data: '0x1234' } }), + ]; + + expect(() => validateDepositTransactions(transactions, context)).toThrow( + 'Invalid transaction: transaction at index 1 has insufficient data (length: 6, minimum: 10)', + ); + }); + + it('logs error with correct context', () => { + const transactions = [ + { type: TransactionType.contractInteraction } as never, + ]; + + expect(() => validateDepositTransactions(transactions, context)).toThrow(); + + expect(mockLoggerError).toHaveBeenCalledWith( + expect.any(Error), + expect.objectContaining({ + tags: expect.objectContaining({ + feature: 'Predict', + provider: 'polymarket', + }), + context: expect.objectContaining({ + name: 'PredictController', + data: expect.objectContaining({ + method: 'depositWithConfirmation', + providerId: 'polymarket', + transactionIndex: 0, + }), + }), + }), + ); + }); +}); diff --git a/app/components/UI/Predict/utils/validateTransactions.ts b/app/components/UI/Predict/utils/validateTransactions.ts new file mode 100644 index 000000000000..a11abcf8b36b --- /dev/null +++ b/app/components/UI/Predict/utils/validateTransactions.ts @@ -0,0 +1,164 @@ +import { TransactionType } from '@metamask/transaction-controller'; +import { Hex } from '@metamask/utils'; +import Logger, { type LoggerErrorOptions } from '../../../../util/Logger'; +import { PREDICT_CONSTANTS } from '../constants/errors'; + +const MIN_VALID_DATA_LENGTH = 10; +const VALID_ADDRESS_LENGTH = 42; + +interface DepositTransaction { + params?: { + to?: Hex; + data?: Hex; + }; + type?: TransactionType; +} + +interface ValidationContext { + providerId: string; +} + +function getErrorContext( + method: string, + additionalData: Record, +): LoggerErrorOptions { + return { + tags: { + feature: PREDICT_CONSTANTS.FEATURE_NAME, + provider: 'polymarket', + }, + context: { + name: 'PredictController', + data: { + method, + ...additionalData, + }, + }, + }; +} + +export function validateDepositTransactions( + transactions: DepositTransaction[], + context: ValidationContext, +): void { + for (let i = 0; i < transactions.length; i++) { + const tx = transactions[i]; + + if (!tx) { + Logger.error( + new Error( + `Invalid transaction at index ${i}: transaction is null or undefined`, + ), + getErrorContext('depositWithConfirmation', { + providerId: context.providerId, + transactionIndex: i, + }), + ); + throw new Error( + `Invalid transaction: transaction at index ${i} is null or undefined`, + ); + } + + if (!tx.params) { + Logger.error( + new Error( + `Invalid transaction at index ${i}: params object is missing`, + ), + getErrorContext('depositWithConfirmation', { + providerId: context.providerId, + transactionIndex: i, + transactionType: tx.type, + }), + ); + throw new Error( + `Invalid transaction: transaction at index ${i} is missing params object`, + ); + } + + if (!tx.params.to) { + Logger.error( + new Error(`Invalid transaction at index ${i}: 'to' address is missing`), + getErrorContext('depositWithConfirmation', { + providerId: context.providerId, + transactionIndex: i, + transactionType: tx.type, + }), + ); + throw new Error( + `Invalid transaction: transaction at index ${i} is missing 'to' address`, + ); + } + + if ( + typeof tx.params.to !== 'string' || + !tx.params.to.startsWith('0x') || + tx.params.to.length !== VALID_ADDRESS_LENGTH + ) { + Logger.error( + new Error( + `Invalid transaction at index ${i}: 'to' address has invalid format (${tx.params.to})`, + ), + getErrorContext('depositWithConfirmation', { + providerId: context.providerId, + transactionIndex: i, + transactionType: tx.type, + toAddress: tx.params.to, + }), + ); + throw new Error( + `Invalid transaction: transaction at index ${i} has invalid 'to' address format`, + ); + } + + if (!tx.params.data) { + Logger.error( + new Error(`Invalid transaction at index ${i}: data is missing`), + getErrorContext('depositWithConfirmation', { + providerId: context.providerId, + transactionIndex: i, + transactionType: tx.type, + }), + ); + throw new Error( + `Invalid transaction: transaction at index ${i} is missing data`, + ); + } + + if ( + typeof tx.params.data !== 'string' || + !tx.params.data.startsWith('0x') + ) { + Logger.error( + new Error( + `Invalid transaction at index ${i}: data has invalid hex format`, + ), + getErrorContext('depositWithConfirmation', { + providerId: context.providerId, + transactionIndex: i, + transactionType: tx.type, + dataPrefix: tx.params.data?.slice?.(0, 10), + }), + ); + throw new Error( + `Invalid transaction: transaction at index ${i} has invalid data format (must be hex string starting with 0x)`, + ); + } + + if (tx.params.data.length < MIN_VALID_DATA_LENGTH) { + Logger.error( + new Error( + `Invalid transaction at index ${i}: data length ${tx.params.data.length} is less than minimum ${MIN_VALID_DATA_LENGTH}`, + ), + getErrorContext('depositWithConfirmation', { + providerId: context.providerId, + transactionIndex: i, + transactionType: tx.type, + dataLength: tx.params.data.length, + }), + ); + throw new Error( + `Invalid transaction: transaction at index ${i} has insufficient data (length: ${tx.params.data.length}, minimum: ${MIN_VALID_DATA_LENGTH})`, + ); + } + } +} From 92bf2de105a5a48b7daa1d4158f9365d438fa423 Mon Sep 17 00:00:00 2001 From: metamaskbot Date: Fri, 23 Jan 2026 12:14:33 +0000 Subject: [PATCH 03/80] [skip ci] Bump version number to 3518 --- android/app/build.gradle | 2 +- bitrise.yml | 4 ++-- ios/MetaMask.xcodeproj/project.pbxproj | 12 ++++++------ 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 81022898890b..1061bfaa846b 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -188,7 +188,7 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion versionName "7.63.0" - versionCode 3514 + versionCode 3518 testBuildType System.getProperty('testBuildType', 'debug') testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" manifestPlaceholders.MM_BRANCH_KEY_TEST = "$System.env.MM_BRANCH_KEY_TEST" diff --git a/bitrise.yml b/bitrise.yml index f413a2ef4e1c..2397f80cdbf1 100644 --- a/bitrise.yml +++ b/bitrise.yml @@ -3472,13 +3472,13 @@ app: VERSION_NAME: 7.63.0 - opts: is_expand: false - VERSION_NUMBER: 3514 + VERSION_NUMBER: 3518 - opts: is_expand: false FLASK_VERSION_NAME: 7.63.0 - opts: is_expand: false - FLASK_VERSION_NUMBER: 3514 + FLASK_VERSION_NUMBER: 3518 - opts: is_expand: false ANDROID_APK_LINK: '' diff --git a/ios/MetaMask.xcodeproj/project.pbxproj b/ios/MetaMask.xcodeproj/project.pbxproj index 447874c7cdd0..fffde131ff33 100644 --- a/ios/MetaMask.xcodeproj/project.pbxproj +++ b/ios/MetaMask.xcodeproj/project.pbxproj @@ -1281,7 +1281,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3514; + CURRENT_PROJECT_VERSION = 3518; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 48XVW22RCG; @@ -1350,7 +1350,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3514; + CURRENT_PROJECT_VERSION = 3518; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 48XVW22RCG; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 48XVW22RCG; @@ -1416,7 +1416,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3514; + CURRENT_PROJECT_VERSION = 3518; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 48XVW22RCG; @@ -1483,7 +1483,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3514; + CURRENT_PROJECT_VERSION = 3518; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 48XVW22RCG; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 48XVW22RCG; @@ -1646,7 +1646,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3514; + CURRENT_PROJECT_VERSION = 3518; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 48XVW22RCG; @@ -1716,7 +1716,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3514; + CURRENT_PROJECT_VERSION = 3518; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 48XVW22RCG; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 48XVW22RCG; From d82b7aa76319d9d07262e2fa60ed37f013c0ddaa Mon Sep 17 00:00:00 2001 From: "runway-github[bot]" <73448015+runway-github[bot]@users.noreply.github.com> Date: Fri, 23 Jan 2026 18:51:11 +0000 Subject: [PATCH 04/80] chore(runway): cherry-pick feat(predict): cp-7.63.0 add game properties to analytics events (#25123) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - feat(predict): cp-7.63.0 add game properties to analytics events (#25065) ## **Description** Add new analytics properties to Predict market events to improve tracking for sports/game-based prediction markets: 1. **PREDICT_MARKET_DETAILS_OPENED** and **PREDICT_TRADE_TRANSACTION** events now include: - `market_slug` - Market slug identifier - `game_id` - Game identifier - `game_start_time` - Game start timestamp - `game_league` - League name (e.g., "NBA", "NFL") - `game_status` - Game status (e.g., "not_started", "live", "final") - `game_period` - Current game period (nullable) - `game_clock` - Current game clock (nullable) 2. **SHARE_ACTION** event tracking added for share button interactions: - `status` - Share status: "initiated", "success", or "failed" - `market_id` - Market identifier - `market_slug` - Market slug These changes align with the Segment schema updates in [segment-schema PR #429](https://github.com/Consensys/segment-schema/pull/429). ## **Changelog** CHANGELOG entry: null ## **Related issues** Fixes: - https://consensyssoftware.atlassian.net/browse/PRED-422 - https://consensyssoftware.atlassian.net/browse/PRED-505 ## **Manual testing steps** ```gherkin Feature: Predict Analytics Events Scenario: Game properties sent on market details view Given user navigates to a sports prediction market When user opens the market details view Then PREDICT_MARKET_DETAILS_OPENED event includes game properties (game_id, game_league, game_status, etc.) Scenario: Game properties sent on trade transaction Given user is on a sports prediction market buy/sell preview When user completes a buy or sell transaction Then PREDICT_TRADE_TRANSACTION event includes game properties Scenario: Share action tracking Given user is viewing a prediction market with game details When user taps the share button Then SHARE_ACTION event is sent with status "initiated" And when share completes successfully, SHARE_ACTION event is sent with status "success" And when share fails, SHARE_ACTION event is sent with status "failed" ``` ## **Screenshots/Recordings** N/A - Analytics only change, no UI modifications ## **Pre-merge author checklist** - [x] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile Coding Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md). - [x] I've completed the PR template to the best of my ability - [x] I've included tests if applicable - [x] I've documented my code using [JSDoc](https://jsdoc.app/) format if applicable - [x] I've applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors. ## **Pre-merge reviewer checklist** - [ ] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [ ] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots. --- > [!NOTE] > Enhances Predict analytics coverage for sports markets and sharing flows. > > - Adds `market_slug`, `game_id`, `game_start_time`, `game_league`, `game_status`, `game_period`, `game_clock` to `PREDICT_TRADE_TRANSACTION` and `PREDICT_MARKET_DETAILS_OPENED` via `PredictController`, with type updates in `providers/types.ts` > - Introduces `PredictShareStatus` and new `SHARE_ACTION` tracking in `PredictController.trackShareAction` > - Updates `PredictShareButton` to send `SHARE_ACTION` events on press (initiated) and on result (success/failed), and accept/pass `marketSlug`; propagates prop from market detail/game views > - Adds comprehensive tests for share URL, toasts, edge cases, and analytics status flows > > Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 7040a8515cad405ad1b111dabf280ee1505c07fc. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot). [a2d49c6](https://github.com/MetaMask/metamask-mobile/commit/a2d49c6f69774baf4089ff18dc1f5cd00ed13f33) Co-authored-by: Luis Taniça --- .../PredictGameDetailsContent.tsx | 2 +- .../PredictShareButton.test.tsx | 149 +++++++++++++++++- .../PredictShareButton/PredictShareButton.tsx | 31 +++- .../UI/Predict/constants/eventNames.ts | 22 +++ .../Predict/controllers/PredictController.ts | 95 ++++++++++- app/components/UI/Predict/providers/types.ts | 7 + .../PredictBuyPreview/PredictBuyPreview.tsx | 10 +- .../PredictMarketDetails.tsx | 9 +- .../PredictSellPreview/PredictSellPreview.tsx | 10 +- 9 files changed, 312 insertions(+), 23 deletions(-) diff --git a/app/components/UI/Predict/components/PredictGameDetailsContent/PredictGameDetailsContent.tsx b/app/components/UI/Predict/components/PredictGameDetailsContent/PredictGameDetailsContent.tsx index a089566e33fb..27cf000038c6 100644 --- a/app/components/UI/Predict/components/PredictGameDetailsContent/PredictGameDetailsContent.tsx +++ b/app/components/UI/Predict/components/PredictGameDetailsContent/PredictGameDetailsContent.tsx @@ -104,7 +104,7 @@ const PredictGameDetailsContent: React.FC = ({ - + ({ + context: { + PredictController: { + trackShareAction: (...args: unknown[]) => mockTrackShareAction(...args), + }, + }, +})); -// Mock i18n strings jest.mock('../../../../../../locales/i18n', () => ({ strings: jest.fn((key: string) => key), })); @@ -28,16 +38,17 @@ const ToastWrapper = ({ children }: { children: React.ReactNode }) => children, ); -const renderShareButton = (marketId?: string) => +const renderShareButton = (marketId?: string, marketSlug?: string) => renderWithProvider( - + , ); describe('PredictShareButton', () => { beforeEach(() => { jest.clearAllMocks(); + mockTrackShareAction.mockClear(); }); afterEach(() => { @@ -267,7 +278,6 @@ describe('PredictShareButton', () => { activityType: 'com.apple.UIKit.activity.CopyToPasteboard', }); - // Render with null toastRef const NullToastWrapper = ({ children }: { children: React.ReactNode }) => React.createElement( ToastContext.Provider, @@ -285,7 +295,6 @@ describe('PredictShareButton', () => { PredictMarketDetailsSelectorsIDs.SHARE_BUTTON, ); - // Should not throw even when toastRef.current is null await act(async () => { await fireEvent.press(button); }); @@ -293,4 +302,134 @@ describe('PredictShareButton', () => { expect(Share.share).toHaveBeenCalled(); }); }); + + describe('Analytics Tracking', () => { + it('tracks initiated event when share button is pressed', async () => { + jest.spyOn(Share, 'share').mockResolvedValue({ + action: Share.dismissedAction, + }); + renderShareButton('market-123', 'market-slug-123'); + + const button = screen.getByTestId( + PredictMarketDetailsSelectorsIDs.SHARE_BUTTON, + ); + + await act(async () => { + await fireEvent.press(button); + }); + + expect(mockTrackShareAction).toHaveBeenCalledWith({ + status: PredictShareStatus.INITIATED, + marketId: 'market-123', + marketSlug: 'market-slug-123', + }); + }); + + it('tracks success event when share completes', async () => { + jest.spyOn(Share, 'share').mockResolvedValue({ + action: Share.sharedAction, + activityType: 'com.apple.UIKit.activity.AirDrop', + }); + renderShareButton('market-123', 'market-slug-123'); + + const button = screen.getByTestId( + PredictMarketDetailsSelectorsIDs.SHARE_BUTTON, + ); + + await act(async () => { + await fireEvent.press(button); + }); + + expect(mockTrackShareAction).toHaveBeenCalledTimes(2); + expect(mockTrackShareAction).toHaveBeenNthCalledWith(1, { + status: PredictShareStatus.INITIATED, + marketId: 'market-123', + marketSlug: 'market-slug-123', + }); + expect(mockTrackShareAction).toHaveBeenNthCalledWith(2, { + status: PredictShareStatus.SUCCESS, + marketId: 'market-123', + marketSlug: 'market-slug-123', + }); + }); + + it('tracks failed event when share throws an error', async () => { + jest.spyOn(Share, 'share').mockRejectedValue(new Error('Share failed')); + renderShareButton('market-123', 'market-slug-123'); + + const button = screen.getByTestId( + PredictMarketDetailsSelectorsIDs.SHARE_BUTTON, + ); + + await act(async () => { + await fireEvent.press(button); + }); + + expect(mockTrackShareAction).toHaveBeenCalledTimes(2); + expect(mockTrackShareAction).toHaveBeenNthCalledWith(1, { + status: PredictShareStatus.INITIATED, + marketId: 'market-123', + marketSlug: 'market-slug-123', + }); + expect(mockTrackShareAction).toHaveBeenNthCalledWith(2, { + status: PredictShareStatus.FAILED, + marketId: 'market-123', + marketSlug: 'market-slug-123', + }); + }); + + it('tracks analytics with undefined marketSlug when not provided', async () => { + jest.spyOn(Share, 'share').mockResolvedValue({ + action: Share.sharedAction, + }); + renderShareButton('market-123'); + + const button = screen.getByTestId( + PredictMarketDetailsSelectorsIDs.SHARE_BUTTON, + ); + + await act(async () => { + await fireEvent.press(button); + }); + + expect(mockTrackShareAction).toHaveBeenCalledTimes(2); + expect(mockTrackShareAction).toHaveBeenNthCalledWith(1, { + status: PredictShareStatus.INITIATED, + marketId: 'market-123', + marketSlug: undefined, + }); + expect(mockTrackShareAction).toHaveBeenNthCalledWith(2, { + status: PredictShareStatus.SUCCESS, + marketId: 'market-123', + marketSlug: undefined, + }); + }); + + it('tracks failed event when share is dismissed', async () => { + jest.spyOn(Share, 'share').mockResolvedValue({ + action: Share.dismissedAction, + }); + renderShareButton('market-123', 'market-slug-123'); + + const button = screen.getByTestId( + PredictMarketDetailsSelectorsIDs.SHARE_BUTTON, + ); + + await act(async () => { + await fireEvent.press(button); + }); + + expect(mockTrackShareAction).toHaveBeenCalledTimes(2); + expect(mockTrackShareAction).toHaveBeenNthCalledWith(1, { + status: PredictShareStatus.INITIATED, + marketId: 'market-123', + marketSlug: 'market-slug-123', + }); + expect(mockTrackShareAction).toHaveBeenNthCalledWith(2, { + status: PredictShareStatus.FAILED, + marketId: 'market-123', + marketSlug: 'market-slug-123', + }); + }); + }); }); diff --git a/app/components/UI/Predict/components/PredictShareButton/PredictShareButton.tsx b/app/components/UI/Predict/components/PredictShareButton/PredictShareButton.tsx index 6ca023fa5ae5..fa3d878ac239 100644 --- a/app/components/UI/Predict/components/PredictShareButton/PredictShareButton.tsx +++ b/app/components/UI/Predict/components/PredictShareButton/PredictShareButton.tsx @@ -12,18 +12,28 @@ import { ToastVariants, } from '../../../../../component-library/components/Toast'; import { Box } from '@metamask/design-system-react-native'; +import Engine from '../../../../../core/Engine'; +import { PredictShareStatus } from '../../constants/eventNames'; interface PredictShareButtonProps { marketId?: string; + marketSlug?: string; } const PredictShareButton: React.FC = ({ marketId, + marketSlug, }) => { const { toastRef } = useContext(ToastContext); const { colors } = useTheme(); const handleSharePress = useCallback(async () => { + Engine.context.PredictController.trackShareAction({ + status: PredictShareStatus.INITIATED, + marketId, + marketSlug, + }); + try { const url = `https://link.metamask.io/predict?market=${marketId ?? ''}&utm_source=user_shared`; @@ -35,10 +45,15 @@ const PredictShareButton: React.FC = ({ {}, ); if (result.action === Share.sharedAction) { + Engine.context.PredictController.trackShareAction({ + status: PredictShareStatus.SUCCESS, + marketId, + marketSlug, + }); + if ( result.activityType === 'com.apple.UIKit.activity.CopyToPasteboard' ) { - // Copied to clipboard return toastRef?.current?.showToast({ variant: ToastVariants.Icon, labelOptions: [ @@ -52,7 +67,6 @@ const PredictShareButton: React.FC = ({ iconColor: colors.success.default, hasNoTimeout: false, customBottomOffset: -50, - // Need to style manually otherwise the icon is not centered and the text is too far away startAccessory: ( = ({ ), }); } - // Shared - } else if (result.action === Share.dismissedAction) { - // Dismissed + } else { + throw new Error('Failed to share'); } } catch (_error) { - // Ignore errors + Engine.context.PredictController.trackShareAction({ + status: PredictShareStatus.FAILED, + marketId, + marketSlug, + }); } - }, [colors.success.default, marketId, toastRef]); + }, [colors.success.default, marketId, marketSlug, toastRef]); return ( { try { const provider = this.providers.get(params.providerId); diff --git a/app/components/UI/Predict/providers/types.ts b/app/components/UI/Predict/providers/types.ts index 006cffed0cf5..b869d2784270 100644 --- a/app/components/UI/Predict/providers/types.ts +++ b/app/components/UI/Predict/providers/types.ts @@ -66,6 +66,13 @@ export interface PlaceOrderParams { volume?: number; marketType?: string; outcome?: string; + marketSlug?: string; + gameId?: string; + gameStartTime?: string; + gameLeague?: string; + gameStatus?: string; + gamePeriod?: string | null; + gameClock?: string | null; }; } diff --git a/app/components/UI/Predict/views/PredictBuyPreview/PredictBuyPreview.tsx b/app/components/UI/Predict/views/PredictBuyPreview/PredictBuyPreview.tsx index 605f42fa1ff2..0f94d3e4b6b7 100644 --- a/app/components/UI/Predict/views/PredictBuyPreview/PredictBuyPreview.tsx +++ b/app/components/UI/Predict/views/PredictBuyPreview/PredictBuyPreview.tsx @@ -80,7 +80,6 @@ const PredictBuyPreview = () => { const { market, outcome, outcomeToken, entryPoint } = route.params; - // Prepare analytics properties const analyticsProperties = useMemo( () => ({ marketId: market?.id, @@ -92,13 +91,18 @@ const PredictBuyPreview = () => { liquidity: market?.liquidity, volume: market?.volume, sharePrice: outcomeToken?.price, - // Market type: binary if 1 outcome group, multi-outcome otherwise marketType: market?.outcomes?.length === 1 ? PredictEventValues.MARKET_TYPE.BINARY : PredictEventValues.MARKET_TYPE.MULTI_OUTCOME, - // Outcome: use actual outcome token title (e.g., "Yes", "No", "Trump", "Biden", etc.) outcome: outcomeToken?.title?.toLowerCase(), + marketSlug: market?.slug, + gameId: market?.game?.id, + gameStartTime: market?.game?.startTime, + gameLeague: market?.game?.league, + gameStatus: market?.game?.status, + gamePeriod: market?.game?.period, + gameClock: market?.game?.elapsed, }), [market, outcomeToken, entryPoint], ); diff --git a/app/components/UI/Predict/views/PredictMarketDetails/PredictMarketDetails.tsx b/app/components/UI/Predict/views/PredictMarketDetails/PredictMarketDetails.tsx index dec1923f007f..20951c12330f 100644 --- a/app/components/UI/Predict/views/PredictMarketDetails/PredictMarketDetails.tsx +++ b/app/components/UI/Predict/views/PredictMarketDetails/PredictMarketDetails.tsx @@ -630,6 +630,13 @@ const PredictMarketDetails: React.FC = () => { marketTags: market.tags, entryPoint: entryPoint || PredictEventValues.ENTRY_POINT.PREDICT_FEED, marketDetailsViewed: tabKey, + marketSlug: market.slug, + gameId: market.game?.id, + gameStartTime: market.game?.startTime, + gameLeague: market.game?.league, + gameStatus: market.game?.status, + gamePeriod: market.game?.period, + gameClock: market.game?.elapsed, }); }, [market, entryPoint], @@ -787,7 +794,7 @@ const PredictMarketDetails: React.FC = () => { - + ); diff --git a/app/components/UI/Predict/views/PredictSellPreview/PredictSellPreview.tsx b/app/components/UI/Predict/views/PredictSellPreview/PredictSellPreview.tsx index f36e6385d902..61cb94ff330b 100644 --- a/app/components/UI/Predict/views/PredictSellPreview/PredictSellPreview.tsx +++ b/app/components/UI/Predict/views/PredictSellPreview/PredictSellPreview.tsx @@ -64,7 +64,6 @@ const PredictSellPreview = () => { ); const outcomeSideText = outcomeToken?.title ?? position.outcome; - // Prepare analytics properties for sell/cash-out action const analyticsProperties = useMemo( () => ({ marketId: market?.id, @@ -77,13 +76,18 @@ const PredictSellPreview = () => { liquidity: market?.liquidity, volume: outcome?.volume, sharePrice: position?.price, - // Market type: binary if 1 outcome group, multi-outcome otherwise marketType: market?.outcomes?.length === 1 ? PredictEventValues.MARKET_TYPE.BINARY : PredictEventValues.MARKET_TYPE.MULTI_OUTCOME, - // Outcome: use actual outcome text (e.g., "Yes", "No", "Trump", "Biden", etc.) outcome: position?.outcome?.toLowerCase(), + marketSlug: market?.slug, + gameId: market?.game?.id, + gameStartTime: market?.game?.startTime, + gameLeague: market?.game?.league, + gameStatus: market?.game?.status, + gamePeriod: market?.game?.period, + gameClock: market?.game?.elapsed, }), [market, position, outcome, entryPoint], ); From 95050e44c5d9b0a922cfb036f5004fd66a1e43f7 Mon Sep 17 00:00:00 2001 From: metamaskbot Date: Fri, 23 Jan 2026 18:52:49 +0000 Subject: [PATCH 05/80] [skip ci] Bump version number to 3522 --- android/app/build.gradle | 2 +- bitrise.yml | 4 ++-- ios/MetaMask.xcodeproj/project.pbxproj | 12 ++++++------ 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 1061bfaa846b..a1a4e40568b7 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -188,7 +188,7 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion versionName "7.63.0" - versionCode 3518 + versionCode 3522 testBuildType System.getProperty('testBuildType', 'debug') testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" manifestPlaceholders.MM_BRANCH_KEY_TEST = "$System.env.MM_BRANCH_KEY_TEST" diff --git a/bitrise.yml b/bitrise.yml index 2397f80cdbf1..dd6f037f00f4 100644 --- a/bitrise.yml +++ b/bitrise.yml @@ -3472,13 +3472,13 @@ app: VERSION_NAME: 7.63.0 - opts: is_expand: false - VERSION_NUMBER: 3518 + VERSION_NUMBER: 3522 - opts: is_expand: false FLASK_VERSION_NAME: 7.63.0 - opts: is_expand: false - FLASK_VERSION_NUMBER: 3518 + FLASK_VERSION_NUMBER: 3522 - opts: is_expand: false ANDROID_APK_LINK: '' diff --git a/ios/MetaMask.xcodeproj/project.pbxproj b/ios/MetaMask.xcodeproj/project.pbxproj index fffde131ff33..65687fec95bc 100644 --- a/ios/MetaMask.xcodeproj/project.pbxproj +++ b/ios/MetaMask.xcodeproj/project.pbxproj @@ -1281,7 +1281,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3518; + CURRENT_PROJECT_VERSION = 3522; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 48XVW22RCG; @@ -1350,7 +1350,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3518; + CURRENT_PROJECT_VERSION = 3522; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 48XVW22RCG; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 48XVW22RCG; @@ -1416,7 +1416,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3518; + CURRENT_PROJECT_VERSION = 3522; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 48XVW22RCG; @@ -1483,7 +1483,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3518; + CURRENT_PROJECT_VERSION = 3522; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 48XVW22RCG; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 48XVW22RCG; @@ -1646,7 +1646,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3518; + CURRENT_PROJECT_VERSION = 3522; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 48XVW22RCG; @@ -1716,7 +1716,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3518; + CURRENT_PROJECT_VERSION = 3522; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 48XVW22RCG; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 48XVW22RCG; From fee011cf4f5029f37c2debdf952bfeabf47f20b3 Mon Sep 17 00:00:00 2001 From: "runway-github[bot]" <73448015+runway-github[bot]@users.noreply.github.com> Date: Mon, 26 Jan 2026 11:56:58 +0000 Subject: [PATCH 06/80] chore(runway): cherry-pick feat(predict): cp-7.63.0 add Predict Superbowl sport card to wallet Carousel (#25141) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - feat(predict): cp-7.63.0 add Predict Superbowl sport card to wallet Carousel (#25062) ## **Description** This PR integrates the Predict Superbowl sport card into the wallet home Carousel component. When a `predict-superbowl` slide is configured in Contentful with a valid `marketId`, the Carousel renders a `PredictMarketSportCardWrapper` instead of the standard carousel cards. **Key changes:** - Added `PredictMarketSportCardWrapper` component that fetches market data and renders `PredictMarketSportCard` - Added `metadata` field to `CarouselSlide` type to support passing `marketId` - Added `CAROUSEL` entry point for Predict navigation tracking - Modified `PredictSportCardFooter` to navigate through `PREDICT.ROOT` when accessed from Carousel - Added close button functionality to `PredictMarketSportCard` for dismissing the banner - Added comprehensive unit tests for all new components and integration ## **Changelog** CHANGELOG entry: null ## **Related issues** Fixes: ## **Manual testing steps** ```gherkin Feature: my feature name Scenario: user [verb for user action] Given [describe expected initial app state] When user [verb for user action] Then [describe expected outcome] ``` ## **Screenshots/Recordings** https://www.loom.com/share/232ede925eef4c75ab9e322573d03363 ### **Before** ### **After** ## **Pre-merge author checklist** - [ ] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile Coding Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md). - [ ] I've completed the PR template to the best of my ability - [ ] I've included tests if applicable - [ ] I've documented my code using [JSDoc](https://jsdoc.app/) format if applicable - [ ] I've applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors. ## **Pre-merge reviewer checklist** - [ ] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [ ] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots. --- > [!NOTE] > Integrates a special Predict Superbowl experience into the wallet carousel driven by Contentful. > > - Adds `metadata` to `CarouselSlide` and maps Contentful `metadata` through `fetchCarouselSlidesFromContentful` > - When a `predict-superbowl` slide exists with `metadata.marketId`, hides that slide from the stack and renders `PredictMarketSportCardWrapper` instead > - Implements dismissal for the sport card via carousel banner state and fires "Banner Display" metrics on load > - Introduces `PredictMarketSportCardWrapper` to fetch market data and render `PredictMarketSportCard`; adds optional close button to the card > - Adds `CAROUSEL` entry point and updates `PredictSportCardFooter` to navigate via `PREDICT.ROOT` when invoked from the carousel > - Updates types (`PredictCarouselMetadata`, `PredictEntryPoint`, `CarouselSlide.metadata`) and adds constants (`PREDICT_SUPERBOWL_VARIABLE_NAME`) > - Comprehensive tests for carousel integration, wrapper/card behavior, footer navigation, and analytics > > Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit d6a7ef816a3240cd7b7138b21cf112d2d93e84b9. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot). [67f890f](https://github.com/MetaMask/metamask-mobile/commit/67f890f494afce77ec8ccde30398684d9743200b) Co-authored-by: Caainã Jeronimo --- .../fetchCarouselSlidesFromContentful.ts | 2 + app/components/UI/Carousel/index.test.tsx | 142 +++++- app/components/UI/Carousel/index.tsx | 60 ++- app/components/UI/Carousel/types.ts | 1 + .../PredictMarketSportCard.test.tsx | 134 ++++++ .../PredictMarketSportCard.tsx | 18 + .../PredictMarketSportCardWrapper.test.tsx | 429 ++++++++++++++++++ .../PredictMarketSportCardWrapper.tsx | 47 ++ .../PredictMarketSportCard/index.ts | 1 + .../PredictSportCardFooter.test.tsx | 54 +++ .../PredictSportCardFooter.tsx | 26 +- .../UI/Predict/constants/carousel.ts | 1 + app/components/UI/Predict/types/index.ts | 4 + app/components/UI/Predict/types/navigation.ts | 1 + 14 files changed, 911 insertions(+), 9 deletions(-) create mode 100644 app/components/UI/Predict/components/PredictMarketSportCard/PredictMarketSportCardWrapper.test.tsx create mode 100644 app/components/UI/Predict/components/PredictMarketSportCard/PredictMarketSportCardWrapper.tsx create mode 100644 app/components/UI/Predict/constants/carousel.ts diff --git a/app/components/UI/Carousel/fetchCarouselSlidesFromContentful.ts b/app/components/UI/Carousel/fetchCarouselSlidesFromContentful.ts index 20c95ab9b8d2..e1affc1101c5 100644 --- a/app/components/UI/Carousel/fetchCarouselSlidesFromContentful.ts +++ b/app/components/UI/Carousel/fetchCarouselSlidesFromContentful.ts @@ -157,6 +157,7 @@ function mapContentfulEntriesToSlides( variableName, mobileMinimumVersionNumber, mobileMaximumVersionNumber, + metadata, } = entry.fields; const slide: CarouselSlide = { @@ -176,6 +177,7 @@ function mapContentfulEntriesToSlides( endDate, cardPlacement, variableName, + metadata, }; if (!isValidMinimumVersion(mobileMinimumVersionNumber)) { diff --git a/app/components/UI/Carousel/index.test.tsx b/app/components/UI/Carousel/index.test.tsx index 6dea537a1f02..624ef385857a 100644 --- a/app/components/UI/Carousel/index.test.tsx +++ b/app/components/UI/Carousel/index.test.tsx @@ -23,6 +23,7 @@ import Routes from '../../../constants/navigation/Routes'; import { WalletClientType } from '../../../core/SnapKeyring/MultichainWalletSnapClient'; import { SolScope } from '@metamask/keyring-api'; import { setContentPreviewToken } from '../../../actions/notification/helpers'; +import { PREDICT_SUPERBOWL_VARIABLE_NAME } from '../Predict/constants/carousel'; const makeMockState = () => ({ @@ -60,10 +61,14 @@ jest.mock('../../../core/Engine', () => ({ context: { PreferencesController: { state: {} } }, })); +const mockTrackEvent = jest.fn(); +const mockCreateEventBuilder = jest.fn(() => ({ + build: () => ({ category: 'Banner Display', properties: {} }), +})); jest.mock('../../../components/hooks/useMetrics', () => ({ useMetrics: () => ({ - trackEvent: jest.fn(), - createEventBuilder: () => ({ build: () => ({}) }), + trackEvent: mockTrackEvent, + createEventBuilder: mockCreateEventBuilder, }), })); @@ -92,6 +97,32 @@ jest.mock('./fetchCarouselSlidesFromContentful', () => ({ fetchCarouselSlidesFromContentful: jest.fn(), })); +jest.mock('../Predict/components/PredictMarketSportCard', () => { + const { useEffect } = jest.requireActual('react'); + const { View, Text } = jest.requireActual('react-native'); + return { + PredictMarketSportCardWrapper: function MockPredictMarketSportCardWrapper({ + marketId, + testID, + onLoad, + }: { + marketId: string; + testID?: string; + onLoad?: () => void; + }) { + useEffect(() => { + onLoad?.(); + }, [onLoad]); + + return ( + + {marketId} + + ); + }, + }; +}); + const mockDispatch = jest.fn(); const mockFetchCarouselSlides = jest.mocked(fetchCarouselSlidesFromContentful); @@ -483,3 +514,110 @@ describe('useFetchCarouselSlides()', () => { expect(mockFetchCarouselSlides).not.toHaveBeenCalled(); }); }); + +describe('Carousel Predict Superbowl Integration', () => { + it('renders PredictMarketSportCardWrapper for predict-superbowl slides', async () => { + const predictSlide = createMockSlide({ + id: 'predict-superbowl-slide', + variableName: PREDICT_SUPERBOWL_VARIABLE_NAME, + metadata: { marketId: 'test-market-123' }, + }); + mockFetchCarouselSlides.mockResolvedValue({ + prioritySlides: [], + regularSlides: [predictSlide], + }); + + const { findByTestId } = render(); + + const marketIdElement = await findByTestId('predict-sport-card-market-id'); + expect(marketIdElement).toHaveTextContent('test-market-123'); + }); + + it('does not render PredictMarketSportCardWrapper when metadata is missing marketId', async () => { + const regularSlide = createMockSlide({ id: 'regular-slide' }); + const predictSlide = createMockSlide({ + id: 'predict-superbowl-slide', + variableName: PREDICT_SUPERBOWL_VARIABLE_NAME, + metadata: undefined, + }); + mockFetchCarouselSlides.mockResolvedValue({ + prioritySlides: [], + regularSlides: [predictSlide, regularSlide], + }); + + const { findByTestId, queryByTestId } = render(); + + await findByTestId('carousel-slide-regular-slide'); + + expect(queryByTestId('predict-sport-card-wrapper')).toBeNull(); + }); + + it('does not render PredictMarketSportCardWrapper when marketId is empty', async () => { + const regularSlide = createMockSlide({ id: 'regular-slide' }); + const predictSlide = createMockSlide({ + id: 'predict-superbowl-slide', + variableName: PREDICT_SUPERBOWL_VARIABLE_NAME, + metadata: { marketId: '' }, + }); + mockFetchCarouselSlides.mockResolvedValue({ + prioritySlides: [], + regularSlides: [predictSlide, regularSlide], + }); + + const { findByTestId, queryByTestId } = render(); + + await findByTestId('carousel-slide-regular-slide'); + + expect(queryByTestId('predict-sport-card-wrapper')).toBeNull(); + }); + + it('passes correct props to PredictMarketSportCardWrapper', async () => { + const predictSlide = createMockSlide({ + id: 'predict-superbowl-slide', + variableName: PREDICT_SUPERBOWL_VARIABLE_NAME, + metadata: { marketId: 'market-abc-123' }, + testID: 'custom-test-id', + }); + mockFetchCarouselSlides.mockResolvedValue({ + prioritySlides: [predictSlide], + regularSlides: [], + }); + + const { findByTestId } = render(); + + const wrapper = await findByTestId('custom-test-id'); + expect(wrapper).toBeOnTheScreen(); + + const marketId = await findByTestId('predict-sport-card-market-id'); + expect(marketId).toHaveTextContent('market-abc-123'); + }); + + it('fires Banner Display tracking event for predict-superbowl slide', async () => { + mockTrackEvent.mockClear(); + mockCreateEventBuilder.mockClear(); + const predictSlide = createMockSlide({ + id: 'predict-superbowl-slide', + variableName: PREDICT_SUPERBOWL_VARIABLE_NAME, + metadata: { marketId: 'test-market-123' }, + }); + mockFetchCarouselSlides.mockResolvedValue({ + prioritySlides: [], + regularSlides: [predictSlide], + }); + + const { findByTestId } = render(); + + await findByTestId('predict-sport-card-market-id'); + + await waitFor(() => { + expect(mockCreateEventBuilder).toHaveBeenCalledWith({ + category: 'Banner Display', + properties: { + name: PREDICT_SUPERBOWL_VARIABLE_NAME, + }, + }); + }); + + expect(mockTrackEvent).toHaveBeenCalled(); + }); +}); diff --git a/app/components/UI/Carousel/index.tsx b/app/components/UI/Carousel/index.tsx index f276f7c76e6d..92cbdb7a2995 100644 --- a/app/components/UI/Carousel/index.tsx +++ b/app/components/UI/Carousel/index.tsx @@ -45,6 +45,10 @@ import { subscribeToContentPreviewToken } from '../../../actions/notification/he import SharedDeeplinkManager from '../../../core/DeeplinkManager/DeeplinkManager'; import { isInternalDeepLink } from '../../../core/DeeplinkManager/util/deeplinks'; import AppConstants from '../../../core/AppConstants'; +import { PredictMarketSportCardWrapper } from '../Predict/components/PredictMarketSportCard'; +import { PredictEventValues } from '../Predict/constants/eventNames'; +import { PREDICT_SUPERBOWL_VARIABLE_NAME } from '../Predict/constants/carousel'; +import { PredictCarouselMetadata } from '../Predict/types'; const MAX_CAROUSEL_SLIDES = 8; @@ -272,6 +276,24 @@ const CarouselComponent: FC = ({ style, onEmptyState }) => { dismissedBanners, ]); + const predictSuperbowlSlide = useMemo( + () => + slidesConfig.find( + (slide) => + slide.variableName === PREDICT_SUPERBOWL_VARIABLE_NAME && + !dismissedBanners.includes(slide.id), + ), + [slidesConfig, dismissedBanners], + ); + + const predictSuperbowlMarketId = useMemo(() => { + if (!predictSuperbowlSlide) return null; + const metadata = predictSuperbowlSlide.metadata as + | PredictCarouselMetadata + | undefined; + return metadata?.marketId ?? null; + }, [predictSuperbowlSlide]); + const visibleSlides = useMemo(() => { const filtered = slidesConfig.filter((slide: CarouselSlide) => { const active = isActive(slide); @@ -286,6 +308,11 @@ const CarouselComponent: FC = ({ style, onEmptyState }) => { } ///: END:ONLY_INCLUDE_IF + // We dont want to show the predict superbowl slide in the carousel + if (slide.variableName === PREDICT_SUPERBOWL_VARIABLE_NAME) { + return false; + } + return !dismissedBanners.includes(slide.id); }); @@ -537,6 +564,11 @@ const CarouselComponent: FC = ({ style, onEmptyState }) => { } }, [transitionToEmpty, onEmptyState]); + const handleSportCardDismiss = useCallback(() => { + if (!predictSuperbowlSlide) return; + dispatch(dismissBanner(predictSuperbowlSlide.id)); + }, [predictSuperbowlSlide, dispatch]); + const renderCard = useCallback( (slide: CarouselSlide, isCurrentCard: boolean) => { const isEmptyCard = slide.variableName === 'empty'; @@ -584,8 +616,8 @@ const CarouselComponent: FC = ({ style, onEmptyState }) => { nextCardTranslateY, nextCardBgOpacity, handleSlideClick, - handleTransitionToNextCard, handleTransitionToEmpty, + handleTransitionToNextCard, ], ); @@ -617,6 +649,32 @@ const CarouselComponent: FC = ({ style, onEmptyState }) => { } }, [currentSlide, trackEvent, createEventBuilder]); + const handlePredictSuperbowlLoad = useCallback(() => { + if (predictSuperbowlSlide) { + trackEvent( + createEventBuilder({ + category: 'Banner Display', + properties: { + name: + predictSuperbowlSlide.variableName ?? predictSuperbowlSlide.id, + }, + }).build(), + ); + } + }, [predictSuperbowlSlide, trackEvent, createEventBuilder]); + + if (predictSuperbowlMarketId) { + return ( + + ); + } + if ( !isCarouselVisible || (visibleSlides.length === 0 && !isAnimating.current) diff --git a/app/components/UI/Carousel/types.ts b/app/components/UI/Carousel/types.ts index 052371688d83..2b5404254ed2 100644 --- a/app/components/UI/Carousel/types.ts +++ b/app/components/UI/Carousel/types.ts @@ -57,6 +57,7 @@ export interface CarouselSlide { testID?: string; testIDTitle?: string; testIDCloseButton?: string; + metadata?: unknown; } export interface CarouselProps { diff --git a/app/components/UI/Predict/components/PredictMarketSportCard/PredictMarketSportCard.test.tsx b/app/components/UI/Predict/components/PredictMarketSportCard/PredictMarketSportCard.test.tsx index d8dc4fbf3447..ab9fc24c460b 100644 --- a/app/components/UI/Predict/components/PredictMarketSportCard/PredictMarketSportCard.test.tsx +++ b/app/components/UI/Predict/components/PredictMarketSportCard/PredictMarketSportCard.test.tsx @@ -424,4 +424,138 @@ describe('PredictMarketSportCard', () => { ); }); }); + + describe('onDismiss', () => { + it('does not render close button when onDismiss is not provided', () => { + const { queryByTestId } = renderWithProvider( + , + { state: initialState }, + ); + + expect(queryByTestId('sport-card-close-button')).toBeNull(); + }); + + it('renders close button when onDismiss is provided', () => { + const mockOnDismiss = jest.fn(); + + const { getByTestId } = renderWithProvider( + , + { state: initialState }, + ); + + expect(getByTestId('sport-card-close-button')).toBeOnTheScreen(); + }); + + it('calls onDismiss when close button is pressed', () => { + const mockOnDismiss = jest.fn(); + + const { getByTestId } = renderWithProvider( + , + { state: initialState }, + ); + + fireEvent.press(getByTestId('sport-card-close-button')); + + expect(mockOnDismiss).toHaveBeenCalledTimes(1); + }); + + it('does not navigate when close button is pressed', () => { + const mockOnDismiss = jest.fn(); + + const { getByTestId } = renderWithProvider( + , + { state: initialState }, + ); + + fireEvent.press(getByTestId('sport-card-close-button')); + + expect(mockNavigate).not.toHaveBeenCalled(); + }); + + it('renders close button without testID when onDismiss is provided but testID is not', () => { + const mockOnDismiss = jest.fn(); + + const { getByText } = renderWithProvider( + , + { state: initialState }, + ); + + expect(getByText('Super Bowl LX (2026)')).toBeOnTheScreen(); + }); + }); + + describe('team color fallbacks', () => { + const mockGame = mockMarket.game; + + it('uses fallback colors when game team colors are undefined', () => { + if (!mockGame) { + throw new Error('mockGame is required for this test'); + } + + const marketWithoutColors: PredictMarketType = { + ...mockMarket, + game: { + ...mockGame, + awayTeam: { + ...mockGame.awayTeam, + color: undefined as unknown as string, + }, + homeTeam: { + ...mockGame.homeTeam, + color: undefined as unknown as string, + }, + }, + }; + + const { getByText } = renderWithProvider( + , + { state: initialState }, + ); + + expect(getByText('Super Bowl LX (2026)')).toBeOnTheScreen(); + }); + + it('uses fallback colors when game team colors are null', () => { + if (!mockGame) { + throw new Error('mockGame is required for this test'); + } + + const marketWithNullColors: PredictMarketType = { + ...mockMarket, + game: { + ...mockGame, + awayTeam: { + ...mockGame.awayTeam, + color: null as unknown as string, + }, + homeTeam: { + ...mockGame.homeTeam, + color: null as unknown as string, + }, + }, + }; + + const { getByText } = renderWithProvider( + , + { state: initialState }, + ); + + expect(getByText('Super Bowl LX (2026)')).toBeOnTheScreen(); + }); + }); }); diff --git a/app/components/UI/Predict/components/PredictMarketSportCard/PredictMarketSportCard.tsx b/app/components/UI/Predict/components/PredictMarketSportCard/PredictMarketSportCard.tsx index 20deca17a2c9..1df26b498dab 100644 --- a/app/components/UI/Predict/components/PredictMarketSportCard/PredictMarketSportCard.tsx +++ b/app/components/UI/Predict/components/PredictMarketSportCard/PredictMarketSportCard.tsx @@ -3,6 +3,10 @@ import { Text, TextColor, TextVariant, + ButtonIcon, + ButtonIconSize, + IconName, + IconColor, } from '@metamask/design-system-react-native'; import { useTailwind } from '@metamask/design-system-twrnc-preset'; import { NavigationProp, useNavigation } from '@react-navigation/native'; @@ -24,12 +28,14 @@ interface PredictMarketSportCardProps { market: PredictMarketType; testID?: string; entryPoint?: PredictEntryPoint; + onDismiss?: () => void; } const PredictMarketSportCard: React.FC = ({ market, testID, entryPoint = PredictEventValues.ENTRY_POINT.PREDICT_FEED, + onDismiss, }) => { const resolvedEntryPoint = TrendingFeedSessionManager.getInstance() .isFromTrending @@ -63,6 +69,18 @@ const PredictMarketSportCard: React.FC = ({ borderRadius={16} style={tw.style('w-full my-[8px]')} > + {onDismiss && ( + + + + )} ({ + ...jest.requireActual('@react-navigation/native'), + useNavigation: () => ({ + navigate: mockNavigate, + }), +})); + +jest.mock('../../../Trending/services/TrendingFeedSessionManager', () => ({ + __esModule: true, + default: { + getInstance: () => ({ + get isFromTrending() { + return false; + }, + }), + }, +})); + +jest.mock('../PredictSportScoreboard/PredictSportScoreboard', () => { + const { View, Text } = jest.requireActual('react-native'); + return { + __esModule: true, + default: function MockPredictSportScoreboard({ + testID, + }: { + testID?: string; + }) { + return ( + + Mock Scoreboard + + ); + }, + }; +}); + +jest.mock('../PredictSportCardFooter', () => { + const { View, Text } = jest.requireActual('react-native'); + return { + PredictSportCardFooter: function MockPredictSportCardFooter({ + testID, + }: { + testID?: string; + }) { + return ( + + Mock Footer + + ); + }, + }; +}); + +const mockMarket: PredictMarketType = { + id: 'test-market-id', + providerId: 'test-provider', + slug: 'super-bowl-lix', + title: 'Super Bowl LIX', + description: 'Who will win Super Bowl LIX?', + image: 'https://example.com/superbowl.png', + status: 'open', + recurrence: Recurrence.NONE, + category: 'sports', + tags: ['NFL', 'Super Bowl'], + outcomes: [ + { + id: 'outcome-1', + providerId: 'test-provider', + marketId: 'test-market-id', + title: 'Team A', + description: 'Team A wins', + image: '', + status: 'open', + tokens: [{ id: 'token-1', title: 'Yes', price: 0.55 }], + volume: 1000000, + groupItemTitle: 'Team A', + }, + ], + liquidity: 5000000, + volume: 10000000, + game: { + id: 'game-1', + startTime: '2025-02-09T23:30:00Z', + status: 'scheduled', + league: 'nfl', + elapsed: null, + period: null, + score: null, + awayTeam: { + id: 'team-a', + name: 'Team A', + logo: '', + abbreviation: 'TA', + color: '#FF0000', + alias: 'Team A', + }, + homeTeam: { + id: 'team-b', + name: 'Team B', + logo: '', + abbreviation: 'TB', + color: '#0000FF', + alias: 'Team B', + }, + }, +}; + +const initialState = { + engine: { + backgroundState, + }, +}; + +describe('PredictMarketSportCardWrapper', () => { + beforeEach(() => { + jest.clearAllMocks(); + mockUsePredictMarket.mockReturnValue({ + market: null, + isFetching: false, + error: null, + refetch: jest.fn(), + }); + }); + + afterEach(() => { + jest.resetAllMocks(); + }); + + describe('loading state', () => { + it('returns null when fetching market data', () => { + mockUsePredictMarket.mockReturnValue({ + market: null, + isFetching: true, + error: null, + refetch: jest.fn(), + }); + + const { toJSON } = renderWithProvider( + , + { state: initialState }, + ); + + expect(toJSON()).toBeNull(); + }); + }); + + describe('error state', () => { + it('returns null when error occurs', () => { + mockUsePredictMarket.mockReturnValue({ + market: null, + isFetching: false, + error: 'Failed to fetch market', + refetch: jest.fn(), + }); + + const { toJSON } = renderWithProvider( + , + { state: initialState }, + ); + + expect(toJSON()).toBeNull(); + }); + }); + + describe('no market data', () => { + it('returns null when market is null', () => { + mockUsePredictMarket.mockReturnValue({ + market: null, + isFetching: false, + error: null, + refetch: jest.fn(), + }); + + const { toJSON } = renderWithProvider( + , + { state: initialState }, + ); + + expect(toJSON()).toBeNull(); + }); + }); + + describe('successful render', () => { + beforeEach(() => { + mockUsePredictMarket.mockReturnValue({ + market: mockMarket, + isFetching: false, + error: null, + refetch: jest.fn(), + }); + }); + + it('renders PredictMarketSportCard when market data is available', () => { + const { getByText } = renderWithProvider( + , + { state: initialState }, + ); + + expect(getByText('Super Bowl LIX')).toBeOnTheScreen(); + }); + + it('calls usePredictMarket with correct marketId', () => { + renderWithProvider( + , + { state: initialState }, + ); + + expect(mockUsePredictMarket).toHaveBeenCalledWith({ + id: 'custom-market-id', + enabled: true, + }); + }); + + it('passes testID to PredictMarketSportCard', () => { + const { getByTestId } = renderWithProvider( + , + { state: initialState }, + ); + + expect(getByTestId('wrapper-test-id')).toBeOnTheScreen(); + }); + + it('passes entryPoint to PredictMarketSportCard', () => { + const { getByTestId } = renderWithProvider( + , + { state: initialState }, + ); + + expect(getByTestId('wrapper-test-id')).toBeOnTheScreen(); + }); + + it('renders without Animated.View wrapper', () => { + const { toJSON } = renderWithProvider( + , + { state: initialState }, + ); + + const tree = toJSON(); + expect(tree).not.toBeNull(); + }); + + it('renders close button when onDismiss is provided', () => { + const mockOnDismiss = jest.fn(); + + const { getByTestId } = renderWithProvider( + , + { state: initialState }, + ); + + expect(getByTestId('wrapper-card-close-button')).toBeOnTheScreen(); + }); + + it('calls onDismiss when close button is pressed', () => { + const mockOnDismiss = jest.fn(); + + const { getByTestId } = renderWithProvider( + , + { state: initialState }, + ); + + fireEvent.press(getByTestId('wrapper-card-close-button')); + + expect(mockOnDismiss).toHaveBeenCalledTimes(1); + }); + + it('does not render close button when onDismiss is not provided', () => { + const { queryByTestId } = renderWithProvider( + , + { state: initialState }, + ); + + expect(queryByTestId('wrapper-card-close-button')).toBeNull(); + }); + }); + + describe('hook enabled state', () => { + it('disables hook when marketId is empty string', () => { + renderWithProvider(, { + state: initialState, + }); + + expect(mockUsePredictMarket).toHaveBeenCalledWith({ + id: '', + enabled: false, + }); + }); + + it('enables hook when marketId is provided', () => { + renderWithProvider( + , + { state: initialState }, + ); + + expect(mockUsePredictMarket).toHaveBeenCalledWith({ + id: 'valid-market-id', + enabled: true, + }); + }); + }); + + describe('onLoad callback', () => { + it('calls onLoad when market data is available', () => { + const mockOnLoad = jest.fn(); + mockUsePredictMarket.mockReturnValue({ + market: mockMarket, + isFetching: false, + error: null, + refetch: jest.fn(), + }); + + renderWithProvider( + , + { state: initialState }, + ); + + expect(mockOnLoad).toHaveBeenCalledTimes(1); + }); + + it('does not call onLoad when fetching', () => { + const mockOnLoad = jest.fn(); + mockUsePredictMarket.mockReturnValue({ + market: null, + isFetching: true, + error: null, + refetch: jest.fn(), + }); + + renderWithProvider( + , + { state: initialState }, + ); + + expect(mockOnLoad).not.toHaveBeenCalled(); + }); + + it('does not call onLoad when error occurs', () => { + const mockOnLoad = jest.fn(); + mockUsePredictMarket.mockReturnValue({ + market: null, + isFetching: false, + error: 'Failed to fetch', + refetch: jest.fn(), + }); + + renderWithProvider( + , + { state: initialState }, + ); + + expect(mockOnLoad).not.toHaveBeenCalled(); + }); + + it('does not call onLoad when market is null', () => { + const mockOnLoad = jest.fn(); + mockUsePredictMarket.mockReturnValue({ + market: null, + isFetching: false, + error: null, + refetch: jest.fn(), + }); + + renderWithProvider( + , + { state: initialState }, + ); + + expect(mockOnLoad).not.toHaveBeenCalled(); + }); + + it('does not call onLoad when onLoad is not provided', () => { + mockUsePredictMarket.mockReturnValue({ + market: mockMarket, + isFetching: false, + error: null, + refetch: jest.fn(), + }); + + renderWithProvider( + , + { state: initialState }, + ); + + expect(mockUsePredictMarket).toHaveBeenCalled(); + }); + }); +}); diff --git a/app/components/UI/Predict/components/PredictMarketSportCard/PredictMarketSportCardWrapper.tsx b/app/components/UI/Predict/components/PredictMarketSportCard/PredictMarketSportCardWrapper.tsx new file mode 100644 index 000000000000..0b84ef2db27f --- /dev/null +++ b/app/components/UI/Predict/components/PredictMarketSportCard/PredictMarketSportCardWrapper.tsx @@ -0,0 +1,47 @@ +import React, { useEffect, useRef } from 'react'; +import PredictMarketSportCard from './PredictMarketSportCard'; +import { usePredictMarket } from '../../hooks/usePredictMarket'; +import { PredictEntryPoint } from '../../types/navigation'; +import { Box } from '@metamask/design-system-react-native'; + +interface PredictMarketSportCardWrapperProps { + marketId: string; + testID?: string; + entryPoint?: PredictEntryPoint; + onDismiss?: () => void; + onLoad?: () => void; +} + +const PredictMarketSportCardWrapper: React.FC< + PredictMarketSportCardWrapperProps +> = ({ marketId, testID, entryPoint, onDismiss, onLoad }) => { + const { market, isFetching, error } = usePredictMarket({ + id: marketId, + enabled: Boolean(marketId), + }); + const hasCalledOnLoad = useRef(false); + + useEffect(() => { + if (!isFetching && !error && market && onLoad && !hasCalledOnLoad.current) { + hasCalledOnLoad.current = true; + onLoad(); + } + }, [isFetching, error, market, onLoad]); + + if (isFetching || error || !market) { + return null; + } + + return ( + + + + ); +}; + +export default PredictMarketSportCardWrapper; diff --git a/app/components/UI/Predict/components/PredictMarketSportCard/index.ts b/app/components/UI/Predict/components/PredictMarketSportCard/index.ts index 34a38e0efd97..3caa8d28bc95 100644 --- a/app/components/UI/Predict/components/PredictMarketSportCard/index.ts +++ b/app/components/UI/Predict/components/PredictMarketSportCard/index.ts @@ -1 +1,2 @@ export { default } from './PredictMarketSportCard'; +export { default as PredictMarketSportCardWrapper } from './PredictMarketSportCardWrapper'; diff --git a/app/components/UI/Predict/components/PredictSportCardFooter/PredictSportCardFooter.test.tsx b/app/components/UI/Predict/components/PredictSportCardFooter/PredictSportCardFooter.test.tsx index facc5d1aae64..51bb042a6101 100644 --- a/app/components/UI/Predict/components/PredictSportCardFooter/PredictSportCardFooter.test.tsx +++ b/app/components/UI/Predict/components/PredictSportCardFooter/PredictSportCardFooter.test.tsx @@ -585,6 +585,34 @@ describe('PredictSportCardFooter', () => { ); }); }); + + it('navigates through PREDICT.ROOT when entry point is CAROUSEL', async () => { + mockIsFromTrending.mockReturnValue(false); + const market = createMockMarket(); + setupPositionsMock(); + mockExecuteGuardedAction.mockImplementation((callback) => callback()); + + render( + , + ); + fireEvent.press(screen.getByTestId('footer-action-buttons-bet-yes')); + + await waitFor(() => { + expect(mockNavigate).toHaveBeenCalledWith(Routes.PREDICT.ROOT, { + screen: Routes.PREDICT.MODALS.BUY_PREVIEW, + params: { + market, + outcome: market.outcomes[0], + outcomeToken: market.outcomes[0].tokens[0], + entryPoint: PredictEventValues.ENTRY_POINT.CAROUSEL, + }, + }); + }); + }); }); describe('handleClaimPress', () => { @@ -671,5 +699,31 @@ describe('PredictSportCardFooter', () => { expect(screen.getByTestId('mock-action-buttons')).toBeOnTheScreen(); }); + + it('renders picks without testID when testID prop is not provided', () => { + const market = createMockMarket({ status: PredictMarketStatus.OPEN }); + const positions = [createMockPosition({ claimable: false })]; + setupPositionsMock({ activePositions: positions }); + + render(); + + expect(screen.getByTestId('mock-picks-for-card')).toBeOnTheScreen(); + }); + + it('renders claim button without testID when testID prop is not provided', () => { + const market = createMockMarket({ status: PredictMarketStatus.RESOLVED }); + const claimablePositions = [ + createMockPosition({ claimable: true, currentValue: 50 }), + ]; + setupPositionsMock({ + activePositions: claimablePositions, + claimablePositions, + }); + + render(); + + expect(screen.getByTestId('mock-action-buttons')).toBeOnTheScreen(); + expect(screen.getByText('Claim $50')).toBeOnTheScreen(); + }); }); }); diff --git a/app/components/UI/Predict/components/PredictSportCardFooter/PredictSportCardFooter.tsx b/app/components/UI/Predict/components/PredictSportCardFooter/PredictSportCardFooter.tsx index 88f4405b3aa4..a2c89715a4ae 100644 --- a/app/components/UI/Predict/components/PredictSportCardFooter/PredictSportCardFooter.tsx +++ b/app/components/UI/Predict/components/PredictSportCardFooter/PredictSportCardFooter.tsx @@ -69,12 +69,26 @@ const PredictSportCardFooter: React.FC = ({ (token: PredictOutcomeToken) => { executeGuardedAction( () => { - navigation.navigate(Routes.PREDICT.MODALS.BUY_PREVIEW, { - market, - outcome, - outcomeToken: token, - entryPoint: resolvedEntryPoint, - }); + // When accessed from Carousel, we're outside the Predict navigator, + // so we need to navigate through the ROOT first + if (resolvedEntryPoint === PredictEventValues.ENTRY_POINT.CAROUSEL) { + navigation.navigate(Routes.PREDICT.ROOT, { + screen: Routes.PREDICT.MODALS.BUY_PREVIEW, + params: { + market, + outcome, + outcomeToken: token, + entryPoint: resolvedEntryPoint, + }, + }); + } else { + navigation.navigate(Routes.PREDICT.MODALS.BUY_PREVIEW, { + market, + outcome, + outcomeToken: token, + entryPoint: resolvedEntryPoint, + }); + } }, { checkBalance: true, diff --git a/app/components/UI/Predict/constants/carousel.ts b/app/components/UI/Predict/constants/carousel.ts new file mode 100644 index 000000000000..700d93d73d63 --- /dev/null +++ b/app/components/UI/Predict/constants/carousel.ts @@ -0,0 +1 @@ +export const PREDICT_SUPERBOWL_VARIABLE_NAME = 'predict-superbowl'; diff --git a/app/components/UI/Predict/types/index.ts b/app/components/UI/Predict/types/index.ts index 9ce04096914d..570eaab2dfad 100644 --- a/app/components/UI/Predict/types/index.ts +++ b/app/components/UI/Predict/types/index.ts @@ -403,3 +403,7 @@ export type PredictWithdraw = { export type PredictAccountMeta = { isOnboarded: boolean; }; + +export interface PredictCarouselMetadata { + marketId: string; +} diff --git a/app/components/UI/Predict/types/navigation.ts b/app/components/UI/Predict/types/navigation.ts index 06a2cb58c9ba..d4ad293b2f32 100644 --- a/app/components/UI/Predict/types/navigation.ts +++ b/app/components/UI/Predict/types/navigation.ts @@ -9,6 +9,7 @@ import { import { PredictEventValues } from '../constants/eventNames'; export type PredictEntryPoint = + | typeof PredictEventValues.ENTRY_POINT.CAROUSEL | typeof PredictEventValues.ENTRY_POINT.PREDICT_FEED | typeof PredictEventValues.ENTRY_POINT.PREDICT_MARKET_DETAILS | typeof PredictEventValues.ENTRY_POINT.SEARCH From 526aa42831108da036b3511899f0f8bd20010689 Mon Sep 17 00:00:00 2001 From: metamaskbot Date: Mon, 26 Jan 2026 11:58:28 +0000 Subject: [PATCH 07/80] [skip ci] Bump version number to 3540 --- android/app/build.gradle | 2 +- bitrise.yml | 4 ++-- ios/MetaMask.xcodeproj/project.pbxproj | 12 ++++++------ 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index a1a4e40568b7..366856e4b120 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -188,7 +188,7 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion versionName "7.63.0" - versionCode 3522 + versionCode 3540 testBuildType System.getProperty('testBuildType', 'debug') testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" manifestPlaceholders.MM_BRANCH_KEY_TEST = "$System.env.MM_BRANCH_KEY_TEST" diff --git a/bitrise.yml b/bitrise.yml index dd6f037f00f4..75fd4d8bf127 100644 --- a/bitrise.yml +++ b/bitrise.yml @@ -3472,13 +3472,13 @@ app: VERSION_NAME: 7.63.0 - opts: is_expand: false - VERSION_NUMBER: 3522 + VERSION_NUMBER: 3540 - opts: is_expand: false FLASK_VERSION_NAME: 7.63.0 - opts: is_expand: false - FLASK_VERSION_NUMBER: 3522 + FLASK_VERSION_NUMBER: 3540 - opts: is_expand: false ANDROID_APK_LINK: '' diff --git a/ios/MetaMask.xcodeproj/project.pbxproj b/ios/MetaMask.xcodeproj/project.pbxproj index 65687fec95bc..7233146005ab 100644 --- a/ios/MetaMask.xcodeproj/project.pbxproj +++ b/ios/MetaMask.xcodeproj/project.pbxproj @@ -1281,7 +1281,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3522; + CURRENT_PROJECT_VERSION = 3540; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 48XVW22RCG; @@ -1350,7 +1350,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3522; + CURRENT_PROJECT_VERSION = 3540; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 48XVW22RCG; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 48XVW22RCG; @@ -1416,7 +1416,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3522; + CURRENT_PROJECT_VERSION = 3540; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 48XVW22RCG; @@ -1483,7 +1483,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3522; + CURRENT_PROJECT_VERSION = 3540; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 48XVW22RCG; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 48XVW22RCG; @@ -1646,7 +1646,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3522; + CURRENT_PROJECT_VERSION = 3540; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 48XVW22RCG; @@ -1716,7 +1716,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3522; + CURRENT_PROJECT_VERSION = 3540; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 48XVW22RCG; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 48XVW22RCG; From d52e9e9965597b1e19bbeca749b083b2ff92d19d Mon Sep 17 00:00:00 2001 From: "runway-github[bot]" <73448015+runway-github[bot]@users.noreply.github.com> Date: Mon, 26 Jan 2026 13:54:32 +0000 Subject: [PATCH 08/80] chore(runway): cherry-pick fix: compute spread from HL bbo top-of-book feed cp-7.63.0 (#25164) - fix: compute spread from HL bbo top-of-book feed cp-7.63.0 (#25145) ## **Description** ### Summary - Fixes incorrect spread display in Perps order book that changed when users change the aggregate dropdown - Spread now uses BBO (best bid/offer) feed instead of aggregated L2Book, matching Hyperliquid UI behavior - Adds missing test coverage for `subscribeToOrderBook` L2Book subscriptions https://consensyssoftware.atlassian.net/browse/TAT-2425 ### Problem The spread displayed under the order book depth chart was incorrect and would change when the use changed the aggregation dropdown. This diverged from Hyperliquid's UI where spread remains stable regardless of grouping selection. Root cause: Spread was derived from aggregated orderbook levels. When requesting an aggregated book, the best bid/ask are bucketed/rounded prices, causing the spread to inflate to increments resembling the grouping step. ### Solution Split the data sources: - Depth/table display: `subscribeToOrderBook` -> `l2Book` with aggregation params (existing) - Spread display: `subscribeToPrices(includeOrderBook: true)` -> bbo feed (new) The L2Book -> BBO change only affects `subscribeToPrices({ includeOrderBook: true })`, which feeds `usePerpsTopOfBook`. All 5 consumers only need best bid/ask: - Fee calculation (3 views) - compares limit price to best bid/ask for maker/taker determination - Bid/Ask presets - single best prices for quick buttons - Spread display - bestAsk - bestBid Full L2Book depth is still used via separate `subscribeToOrderBook()` path for the order book table/chart. This matches Hyperliquid's frontend: grouping affects the book display, spread is based on actual top-of-book. ### Test plan - Unit tests for processBboData - Unit tests for BBO subscription lifecycle - Unit tests for subscribeToOrderBook (L2Book) - 10 new tests ## **Changelog** CHANGELOG entry: Fixed incorrect spread displayed below Perps orderbook depth chart ## **Related issues** Fixes: https://github.com/MetaMask/metamask-mobile/issues/25162 ## **Manual testing steps** - Verify spread matches Hyperliquid UI across all grouping values - Verify changing grouping doesn't affect spread display ```gherkin Feature: my feature name Scenario: user [verb for user action] Given [describe expected initial app state] When user [verb for user action] Then [describe expected outcome] ``` ## **Screenshots/Recordings** ### **Before** ### **After** https://github.com/user-attachments/assets/43c6c40c-162c-4809-9295-1acaf684d64d ## **Pre-merge author checklist** - [x] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile Coding Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md). - [x] I've completed the PR template to the best of my ability - [x] I've included tests if applicable - [x] I've documented my code using [JSDoc](https://jsdoc.app/) format if applicable - [x] I've applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors. ## **Pre-merge reviewer checklist** - [ ] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [ ] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots. --- > [!NOTE] > **Fix spread to match Hyperliquid UI** > > - Switch spread display in `PerpsOrderBookView` to `usePerpsTopOfBook` (BBO), independent of order book grouping; format via `formatPerpsFiat` > - Update `HyperLiquidSubscriptionService`: replace `l2Book`-based top-of-book with singleton `bbo` subscriptions (`ensureBboSubscription`/`cleanupBboSubscription`), reconnection restore logic, and cache updates via new `processBboData` > - Keep full depth via existing `subscribeToOrderBook` (L2Book); add comprehensive tests for this path plus new BBO lifecycle and processor tests > - Adjust tests to mock `usePerpsTopOfBook` and verify spread rendering and subscription params > > Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 33d552905662685f34a350f3235faac75c0ea47c. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot). [6ca25dd](https://github.com/MetaMask/metamask-mobile/commit/6ca25ddcfd631e4ecbd87c282eb289653d88af9c) Co-authored-by: Matt D. <85914066+geositta@users.noreply.github.com> --- .../PerpsOrderBookView.test.tsx | 16 + .../PerpsOrderBookView/PerpsOrderBookView.tsx | 46 +- .../HyperLiquidSubscriptionService.test.ts | 504 ++++++++++++++++-- .../HyperLiquidSubscriptionService.ts | 60 ++- .../hyperLiquidOrderBookProcessor.test.ts | 141 ++++- .../utils/hyperLiquidOrderBookProcessor.ts | 60 ++- 6 files changed, 755 insertions(+), 72 deletions(-) diff --git a/app/components/UI/Perps/Views/PerpsOrderBookView/PerpsOrderBookView.test.tsx b/app/components/UI/Perps/Views/PerpsOrderBookView/PerpsOrderBookView.test.tsx index 304ee63d41ca..c72693dad975 100644 --- a/app/components/UI/Perps/Views/PerpsOrderBookView/PerpsOrderBookView.test.tsx +++ b/app/components/UI/Perps/Views/PerpsOrderBookView/PerpsOrderBookView.test.tsx @@ -175,6 +175,17 @@ jest.mock('../../hooks/usePerpsOrderBookGrouping', () => ({ })), })); +// Mock usePerpsTopOfBook +const mockUsePerpsTopOfBook = jest.fn(() => ({ + bestBid: '50000', + bestAsk: '50001', + spread: '1.00000', +})); + +jest.mock('../../hooks/stream/usePerpsTopOfBook', () => ({ + usePerpsTopOfBook: () => mockUsePerpsTopOfBook(), +})); + // Mock usePerpsEventTracking const mockTrack = jest.fn(); @@ -285,6 +296,11 @@ describe('PerpsOrderBookView', () => { isLoading: false, error: null, }); + mockUsePerpsTopOfBook.mockReturnValue({ + bestBid: '50000', + bestAsk: '50001', + spread: '1.00000', + }); }); describe('rendering', () => { diff --git a/app/components/UI/Perps/Views/PerpsOrderBookView/PerpsOrderBookView.tsx b/app/components/UI/Perps/Views/PerpsOrderBookView/PerpsOrderBookView.tsx index 2cfc50eb84f6..6a28d138bb6e 100644 --- a/app/components/UI/Perps/Views/PerpsOrderBookView/PerpsOrderBookView.tsx +++ b/app/components/UI/Perps/Views/PerpsOrderBookView/PerpsOrderBookView.tsx @@ -65,12 +65,17 @@ import { } from '../../hooks'; import { useHasExistingPosition } from '../../hooks/useHasExistingPosition'; import { usePerpsLiveOrderBook } from '../../hooks/stream/usePerpsLiveOrderBook'; +import { usePerpsTopOfBook } from '../../hooks/stream/usePerpsTopOfBook'; import { usePerpsEventTracking } from '../../hooks/usePerpsEventTracking'; import { usePerpsMeasurement } from '../../hooks/usePerpsMeasurement'; import { usePerpsOrderBookGrouping } from '../../hooks/usePerpsOrderBookGrouping'; import { selectPerpsButtonColorTestVariant } from '../../selectors/featureFlags'; import { BUTTON_COLOR_TEST } from '../../utils/abTesting/tests'; import { usePerpsABTest } from '../../utils/abTesting/usePerpsABTest'; +import { + formatPerpsFiat, + PRICE_RANGES_UNIVERSAL, +} from '../../utils/formatUtils'; import { getPerpsDisplaySymbol } from '../../utils/marketUtils'; import { calculateAggregationParams, @@ -187,6 +192,37 @@ const PerpsOrderBookView: React.FC = ({ return null; }, [selectedGrouping, groupingOptions]); + // Subscribe to top-of-book (best bid/ask) for spread display. + // This is intentionally independent from order book aggregation/grouping. + const topOfBook = usePerpsTopOfBook({ symbol: symbol || '' }); + + const spreadMetrics = useMemo(() => { + const bidStr = topOfBook?.bestBid; + const askStr = topOfBook?.bestAsk; + if (!bidStr || !askStr) return null; + + const bid = parseFloat(bidStr); + const ask = parseFloat(askStr); + if ( + !Number.isFinite(bid) || + !Number.isFinite(ask) || + bid <= 0 || + ask <= 0 + ) { + return null; + } + + // Round to eliminate floating point artifacts (e.g., 0.09999999999990905 → 0.1) + const spread = Number((ask - bid).toPrecision(10)); + const mid = (ask + bid) / 2; + const spreadPercentage = mid > 0 ? ((spread / mid) * 100).toFixed(3) : '0'; + + return { + spread, + spreadPercentage, + }; + }, [topOfBook]); + // Calculate aggregation params (nSigFigs + mantissa) based on grouping const aggregationParams = useMemo(() => { if (!marketPrice || !currentGrouping) return { nSigFigs: 5 as const }; @@ -215,8 +251,6 @@ const PerpsOrderBookView: React.FC = ({ return rawOrderBook; } - // No client-side aggregation needed - API handles it via nSigFigs - // Just return the raw order book data directly return rawOrderBook; }, [rawOrderBook]); @@ -506,16 +540,18 @@ const PerpsOrderBookView: React.FC = ({ {/* Footer with Spread and Actions */} {/* Spread Row */} - {orderBook && ( + {spreadMetrics && ( {strings('perps.order_book.spread')}: - ${parseFloat(orderBook.spread).toLocaleString()} + {formatPerpsFiat(spreadMetrics.spread, { + ranges: PRICE_RANGES_UNIVERSAL, + })} - ({orderBook.spreadPercentage}%) + ({spreadMetrics.spreadPercentage}%) handleTooltipPress('spread')} diff --git a/app/components/UI/Perps/services/HyperLiquidSubscriptionService.test.ts b/app/components/UI/Perps/services/HyperLiquidSubscriptionService.test.ts index f7e08adde739..bdb62fe3ba86 100644 --- a/app/components/UI/Perps/services/HyperLiquidSubscriptionService.test.ts +++ b/app/components/UI/Perps/services/HyperLiquidSubscriptionService.test.ts @@ -6,6 +6,7 @@ import type { CaipAccountId, Hex } from '@metamask/utils'; import type { + SubscribeOrderBookParams, SubscribeOrderFillsParams, SubscribePositionsParams, SubscribePricesParams, @@ -274,6 +275,20 @@ describe('HyperLiquidSubscriptionService', () => { }, 0); return Promise.resolve(mockSubscription); }), + bbo: jest.fn((_params: any, callback: any) => { + // Simulate BBO data + setTimeout(() => { + callback({ + coin: _params.coin, + time: Date.now(), + bbo: [ + { px: '49900', sz: '1.5', n: 1 }, + { px: '50100', sz: '2.0', n: 1 }, + ], + }); + }, 0); + return Promise.resolve(mockSubscription); + }), activeAsset: jest.fn((params: any, callback: any) => { // Simulate activeAsset data (similar to activeAssetCtx) setTimeout(() => { @@ -1420,26 +1435,27 @@ describe('HyperLiquidSubscriptionService', () => { }); }); - describe('L2 Book (Order Book) Subscriptions', () => { - it('should subscribe to L2 book when includeOrderBook is true', async () => { + describe('BBO (Order Book) Subscriptions', () => { + it('should subscribe to BBO when includeOrderBook is true', async () => { const mockCallback = jest.fn(); - const mockL2BookSubscription = { + const mockBboSubscription = { unsubscribe: jest.fn().mockResolvedValue(undefined), }; - mockSubscriptionClient.l2Book.mockImplementation( + mockSubscriptionClient.bbo.mockImplementation( (_params: any, callback: any) => { - // Simulate L2 book data + // Simulate BBO data setTimeout(() => { callback({ coin: 'BTC', - levels: [ - [{ px: '49900', sz: '1.5' }], // Bid level - [{ px: '50100', sz: '2.0' }], // Ask level + time: Date.now(), + bbo: [ + { px: '49900', sz: '1.5', n: 1 }, // Bid + { px: '50100', sz: '2.0', n: 1 }, // Ask ], }); }, 0); - return Promise.resolve(mockL2BookSubscription); + return Promise.resolve(mockBboSubscription); }, ); @@ -1452,9 +1468,9 @@ describe('HyperLiquidSubscriptionService', () => { // Wait for subscription and data processing await jest.runAllTimersAsync(); - // Verify L2 book subscription was created - expect(mockSubscriptionClient.l2Book).toHaveBeenCalledWith( - { coin: 'BTC', nSigFigs: 5 }, + // Verify BBO subscription was created + expect(mockSubscriptionClient.bbo).toHaveBeenCalledWith( + { coin: 'BTC' }, expect.any(Function), ); @@ -1475,7 +1491,7 @@ describe('HyperLiquidSubscriptionService', () => { unsubscribe(); }); - it('should not subscribe to L2 book when includeOrderBook is false', async () => { + it('should not subscribe to BBO when includeOrderBook is false', async () => { const mockCallback = jest.fn(); const unsubscribe = await service.subscribeToPrices({ @@ -1487,15 +1503,19 @@ describe('HyperLiquidSubscriptionService', () => { // Wait for any potential subscriptions await jest.runAllTimersAsync(); - // Verify L2 book subscription was NOT created - expect(mockSubscriptionClient.l2Book).not.toHaveBeenCalled(); + // Verify BBO subscription was NOT created + expect(mockSubscriptionClient.bbo).not.toHaveBeenCalled(); unsubscribe(); }); - it('should handle multiple L2 book subscriptions with reference counting', async () => { + it('should handle multiple BBO subscriptions with reference counting', async () => { const mockCallback1 = jest.fn(); const mockCallback2 = jest.fn(); + const mockUnsubscribe = jest.fn().mockResolvedValue(undefined); + mockSubscriptionClient.bbo.mockResolvedValue({ + unsubscribe: mockUnsubscribe, + }); // First subscription const unsubscribe1 = await service.subscribeToPrices({ @@ -1516,29 +1536,33 @@ describe('HyperLiquidSubscriptionService', () => { await jest.runAllTimersAsync(); // Should only create one L2 book subscription - expect(mockSubscriptionClient.l2Book).toHaveBeenCalledTimes(1); + expect(mockSubscriptionClient.bbo).toHaveBeenCalledTimes(1); // Unsubscribe first unsubscribe1(); await jest.runAllTimersAsync(); - // L2 book subscription should still be active - expect(mockSubscriptionClient.l2Book).toHaveBeenCalledTimes(1); + // BBO subscription should still be active + expect(mockSubscriptionClient.bbo).toHaveBeenCalledTimes(1); + expect(mockUnsubscribe).not.toHaveBeenCalled(); // Unsubscribe second unsubscribe2(); + await jest.runAllTimersAsync(); + expect(mockUnsubscribe).toHaveBeenCalledTimes(1); }); - it('should handle L2 book data with missing levels gracefully', async () => { + it('should handle BBO data with missing levels gracefully', async () => { const mockCallback = jest.fn(); - mockSubscriptionClient.l2Book.mockImplementation( + mockSubscriptionClient.bbo.mockImplementation( (_params: any, callback: any) => { - // Simulate L2 book data with missing levels + // Simulate BBO data with missing levels setTimeout(() => { callback({ coin: 'BTC', - levels: [], // Empty levels + time: Date.now(), + bbo: [undefined, undefined], }); }, 0); return Promise.resolve({ @@ -1574,11 +1598,11 @@ describe('HyperLiquidSubscriptionService', () => { unsubscribe(); }); - it('should handle L2 book subscription errors', async () => { + it('should handle BBO subscription errors', async () => { const mockCallback = jest.fn(); - mockSubscriptionClient.l2Book.mockRejectedValue( - new Error('L2 book subscription failed'), + mockSubscriptionClient.bbo.mockRejectedValue( + new Error('BBO subscription failed'), ); const unsubscribe = await service.subscribeToPrices({ @@ -1600,14 +1624,15 @@ describe('HyperLiquidSubscriptionService', () => { it('should calculate spread from bid/ask prices', async () => { const mockCallback = jest.fn(); - mockSubscriptionClient.l2Book.mockImplementation( + mockSubscriptionClient.bbo.mockImplementation( (_params: any, callback: any) => { setTimeout(() => { callback({ coin: 'BTC', - levels: [ - [{ px: '49900', sz: '1.5' }], // Bid - [{ px: '50100', sz: '2.0' }], // Ask + time: Date.now(), + bbo: [ + { px: '49900', sz: '1.5', n: 1 }, // Bid + { px: '50100', sz: '2.0', n: 1 }, // Ask ], }); }, 0); @@ -3841,18 +3866,22 @@ describe('HyperLiquidSubscriptionService', () => { unsubscribe2(); }); - it('clears L2Book subscriptions during restoration', async () => { + it('clears BBO subscriptions during restoration', async () => { const mockUnsubscribe = jest.fn().mockResolvedValue(undefined); const mockSubscription = { unsubscribe: mockUnsubscribe }; let subscriptionCallCount = 0; - mockSubscriptionClient.l2Book.mockImplementation( - (_params: any, l2BookCallback: any) => { + mockSubscriptionClient.bbo.mockImplementation( + (_params: any, bboCallback: any) => { subscriptionCallCount++; setTimeout(() => { - l2BookCallback({ + bboCallback({ coin: _params.coin, - levels: { bids: [], asks: [] }, + time: Date.now(), + bbo: [ + { px: '49900', sz: '1.5', n: 1 }, + { px: '50100', sz: '2.0', n: 1 }, + ], }); }, 10); return Promise.resolve(mockSubscription); @@ -3868,12 +3897,12 @@ describe('HyperLiquidSubscriptionService', () => { await jest.runAllTimersAsync(); // Verify initial subscription was created - expect((service as any).globalL2BookSubscriptions.size).toBe(1); + expect((service as any).globalBboSubscriptions.size).toBe(1); const initialCallCount = subscriptionCallCount; // Set up a different subscription reference to verify it's cleared const oldSubscription = { unsubscribe: jest.fn() }; - (service as any).globalL2BookSubscriptions.set('BTC', oldSubscription); + (service as any).globalBboSubscriptions.set('BTC', oldSubscription); // Restore subscriptions await service.restoreSubscriptions(); @@ -3882,12 +3911,12 @@ describe('HyperLiquidSubscriptionService', () => { // Verify old subscription was cleared and new one was re-established // The map should have the new subscription, not the old one - const currentSubscription = ( - service as any - ).globalL2BookSubscriptions.get('BTC'); + const currentSubscription = (service as any).globalBboSubscriptions.get( + 'BTC', + ); expect(currentSubscription).toBeDefined(); expect(currentSubscription).not.toBe(oldSubscription); - // Verify l2Book was called again to re-establish the subscription + // Verify bbo was called again to re-establish the subscription expect(subscriptionCallCount).toBeGreaterThan(initialCallCount); unsubscribe(); @@ -4037,4 +4066,397 @@ describe('HyperLiquidSubscriptionService', () => { unsubscribe3(); }); }); + + describe('subscribeToOrderBook (L2Book)', () => { + it('should subscribe to L2Book with correct params', async () => { + const mockCallback = jest.fn(); + const mockL2BookSubscription = { + unsubscribe: jest.fn().mockResolvedValue(undefined), + }; + + mockSubscriptionClient.l2Book.mockImplementation( + (_params: any, callback: any) => { + setTimeout(() => { + callback({ + coin: 'BTC', + levels: [ + [{ px: '49900', sz: '1.5', n: 3 }], + [{ px: '50100', sz: '2.0', n: 5 }], + ], + }); + }, 0); + return Promise.resolve(mockL2BookSubscription); + }, + ); + + const params: SubscribeOrderBookParams = { + symbol: 'BTC', + levels: 10, + nSigFigs: 5, + callback: mockCallback, + }; + + const unsubscribe = service.subscribeToOrderBook(params); + + await jest.runAllTimersAsync(); + + expect(mockSubscriptionClient.l2Book).toHaveBeenCalledWith( + { coin: 'BTC', nSigFigs: 5, mantissa: undefined }, + expect.any(Function), + ); + + expect(typeof unsubscribe).toBe('function'); + }); + + it('should process L2Book data and call callback with OrderBookData', async () => { + const mockCallback = jest.fn(); + const mockL2BookSubscription = { + unsubscribe: jest.fn().mockResolvedValue(undefined), + }; + + mockSubscriptionClient.l2Book.mockImplementation( + (_params: any, callback: any) => { + setTimeout(() => { + callback({ + coin: 'BTC', + levels: [ + [ + { px: '49900', sz: '1.0', n: 2 }, + { px: '49800', sz: '2.0', n: 3 }, + ], + [ + { px: '50100', sz: '1.5', n: 4 }, + { px: '50200', sz: '2.5', n: 5 }, + ], + ], + }); + }, 0); + return Promise.resolve(mockL2BookSubscription); + }, + ); + + service.subscribeToOrderBook({ + symbol: 'BTC', + levels: 10, + callback: mockCallback, + }); + + await jest.runAllTimersAsync(); + + expect(mockCallback).toHaveBeenCalledWith( + expect.objectContaining({ + bids: expect.arrayContaining([ + expect.objectContaining({ + price: '49900', + size: '1.0', + }), + ]), + asks: expect.arrayContaining([ + expect.objectContaining({ + price: '50100', + size: '1.5', + }), + ]), + spread: expect.any(String), + spreadPercentage: expect.any(String), + midPrice: expect.any(String), + lastUpdated: expect.any(Number), + maxTotal: expect.any(String), + }), + ); + }); + + it('should unsubscribe when cleanup function is called', async () => { + const mockCallback = jest.fn(); + const mockUnsubscribe = jest.fn().mockResolvedValue(undefined); + + mockSubscriptionClient.l2Book.mockImplementation( + (_params: any, callback: any) => { + setTimeout(() => { + callback({ + coin: 'BTC', + levels: [ + [{ px: '49900', sz: '1.5', n: 3 }], + [{ px: '50100', sz: '2.0', n: 5 }], + ], + }); + }, 0); + return Promise.resolve({ unsubscribe: mockUnsubscribe }); + }, + ); + + const unsubscribe = service.subscribeToOrderBook({ + symbol: 'BTC', + callback: mockCallback, + }); + + await jest.runAllTimersAsync(); + + // Unsubscribe + unsubscribe(); + + await jest.runAllTimersAsync(); + + expect(mockUnsubscribe).toHaveBeenCalled(); + }); + + it('should call onError callback when subscription fails', async () => { + const mockCallback = jest.fn(); + const mockOnError = jest.fn(); + + mockSubscriptionClient.l2Book.mockRejectedValue( + new Error('L2Book subscription failed'), + ); + + service.subscribeToOrderBook({ + symbol: 'BTC', + callback: mockCallback, + onError: mockOnError, + }); + + await jest.runAllTimersAsync(); + + expect(mockOnError).toHaveBeenCalledWith( + expect.objectContaining({ + message: 'L2Book subscription failed', + }), + ); + }); + + it('should handle subscription client not available', async () => { + mockClientService.getSubscriptionClient.mockReturnValue(undefined); + + const mockCallback = jest.fn(); + const mockOnError = jest.fn(); + + const unsubscribe = service.subscribeToOrderBook({ + symbol: 'BTC', + callback: mockCallback, + onError: mockOnError, + }); + + await jest.runAllTimersAsync(); + + // Should call onError with appropriate message + expect(mockOnError).toHaveBeenCalledWith( + expect.objectContaining({ + message: 'Subscription client not available', + }), + ); + + // Should return a no-op unsubscribe function + expect(typeof unsubscribe).toBe('function'); + expect(mockSubscriptionClient.l2Book).not.toHaveBeenCalled(); + }); + + it('should handle missing levels gracefully', async () => { + const mockCallback = jest.fn(); + + mockSubscriptionClient.l2Book.mockImplementation( + (_params: any, callback: any) => { + setTimeout(() => { + callback({ + coin: 'BTC', + levels: undefined, + }); + }, 0); + return Promise.resolve({ + unsubscribe: jest.fn().mockResolvedValue(undefined), + }); + }, + ); + + service.subscribeToOrderBook({ + symbol: 'BTC', + callback: mockCallback, + }); + + await jest.runAllTimersAsync(); + + // Should not crash - callback should not be called for invalid data + // (the implementation checks for data?.levels being truthy) + expect(mockCallback).not.toHaveBeenCalled(); + }); + + it('should ignore data for different coins', async () => { + const mockCallback = jest.fn(); + + mockSubscriptionClient.l2Book.mockImplementation( + (_params: any, callback: any) => { + // First send data for wrong coin + setTimeout(() => { + callback({ + coin: 'ETH', + levels: [ + [{ px: '2900', sz: '10', n: 1 }], + [{ px: '3000', sz: '20', n: 1 }], + ], + }); + }, 0); + // Then send data for correct coin + setTimeout(() => { + callback({ + coin: 'BTC', + levels: [ + [{ px: '49900', sz: '1.5', n: 3 }], + [{ px: '50100', sz: '2.0', n: 5 }], + ], + }); + }, 10); + return Promise.resolve({ + unsubscribe: jest.fn().mockResolvedValue(undefined), + }); + }, + ); + + service.subscribeToOrderBook({ + symbol: 'BTC', + callback: mockCallback, + }); + + await jest.runAllTimersAsync(); + + // Should only receive data for BTC, not ETH + expect(mockCallback).toHaveBeenCalledTimes(1); + expect(mockCallback).toHaveBeenCalledWith( + expect.objectContaining({ + bids: expect.arrayContaining([ + expect.objectContaining({ price: '49900' }), + ]), + }), + ); + }); + + it('should pass mantissa parameter when provided', async () => { + const mockCallback = jest.fn(); + + mockSubscriptionClient.l2Book.mockImplementation( + (_params: any, callback: any) => { + setTimeout(() => { + callback({ + coin: 'BTC', + levels: [ + [{ px: '49900', sz: '1.5', n: 3 }], + [{ px: '50100', sz: '2.0', n: 5 }], + ], + }); + }, 0); + return Promise.resolve({ + unsubscribe: jest.fn().mockResolvedValue(undefined), + }); + }, + ); + + service.subscribeToOrderBook({ + symbol: 'BTC', + nSigFigs: 5, + mantissa: 2, + callback: mockCallback, + }); + + await jest.runAllTimersAsync(); + + expect(mockSubscriptionClient.l2Book).toHaveBeenCalledWith( + { coin: 'BTC', nSigFigs: 5, mantissa: 2 }, + expect.any(Function), + ); + }); + + it('should calculate cumulative totals correctly', async () => { + const mockCallback = jest.fn(); + + mockSubscriptionClient.l2Book.mockImplementation( + (_params: any, callback: any) => { + setTimeout(() => { + callback({ + coin: 'BTC', + levels: [ + [ + { px: '50000', sz: '1.0', n: 1 }, + { px: '49900', sz: '2.0', n: 1 }, + { px: '49800', sz: '3.0', n: 1 }, + ], + [ + { px: '50100', sz: '0.5', n: 1 }, + { px: '50200', sz: '1.5', n: 1 }, + ], + ], + }); + }, 0); + return Promise.resolve({ + unsubscribe: jest.fn().mockResolvedValue(undefined), + }); + }, + ); + + service.subscribeToOrderBook({ + symbol: 'BTC', + levels: 10, + callback: mockCallback, + }); + + await jest.runAllTimersAsync(); + + const orderBookData = mockCallback.mock.calls[0][0]; + + // Verify cumulative bid totals: 1.0, 3.0, 6.0 + expect(parseFloat(orderBookData.bids[0].total)).toBe(1); + expect(parseFloat(orderBookData.bids[1].total)).toBe(3); + expect(parseFloat(orderBookData.bids[2].total)).toBe(6); + + // Verify cumulative ask totals: 0.5, 2.0 + expect(parseFloat(orderBookData.asks[0].total)).toBe(0.5); + expect(parseFloat(orderBookData.asks[1].total)).toBe(2); + + // Verify maxTotal is the larger of bid/ask cumulative totals + expect(parseFloat(orderBookData.maxTotal)).toBe(6); + }); + + it('should limit levels based on the levels parameter', async () => { + const mockCallback = jest.fn(); + + mockSubscriptionClient.l2Book.mockImplementation( + (_params: any, callback: any) => { + setTimeout(() => { + callback({ + coin: 'BTC', + levels: [ + [ + { px: '50000', sz: '1.0', n: 1 }, + { px: '49900', sz: '2.0', n: 1 }, + { px: '49800', sz: '3.0', n: 1 }, + { px: '49700', sz: '4.0', n: 1 }, + { px: '49600', sz: '5.0', n: 1 }, + ], + [ + { px: '50100', sz: '0.5', n: 1 }, + { px: '50200', sz: '1.5', n: 1 }, + { px: '50300', sz: '2.5', n: 1 }, + { px: '50400', sz: '3.5', n: 1 }, + { px: '50500', sz: '4.5', n: 1 }, + ], + ], + }); + }, 0); + return Promise.resolve({ + unsubscribe: jest.fn().mockResolvedValue(undefined), + }); + }, + ); + + service.subscribeToOrderBook({ + symbol: 'BTC', + levels: 3, + callback: mockCallback, + }); + + await jest.runAllTimersAsync(); + + const orderBookData = mockCallback.mock.calls[0][0]; + + // Should only have 3 levels on each side + expect(orderBookData.bids.length).toBe(3); + expect(orderBookData.asks.length).toBe(3); + }); + }); }); diff --git a/app/components/UI/Perps/services/HyperLiquidSubscriptionService.ts b/app/components/UI/Perps/services/HyperLiquidSubscriptionService.ts index edd5b6c8764a..8edcf32e72a7 100644 --- a/app/components/UI/Perps/services/HyperLiquidSubscriptionService.ts +++ b/app/components/UI/Perps/services/HyperLiquidSubscriptionService.ts @@ -6,6 +6,7 @@ import { type UserFillsWsEvent, type ActiveAssetCtxWsEvent, type ActiveSpotAssetCtxWsEvent, + type BboWsEvent, type L2BookResponse, type AssetCtxsWsEvent, type FrontendOpenOrdersResponse, @@ -41,7 +42,7 @@ import type { HyperLiquidWalletService } from './HyperLiquidWalletService'; import type { CaipAccountId } from '@metamask/utils'; import { TP_SL_CONFIG, PERPS_CONSTANTS } from '../constants/perpsConfig'; import { ensureError } from '../../../../util/errorUtils'; -import { processL2BookData } from '../utils/hyperLiquidOrderBookProcessor'; +import { processBboData } from '../utils/hyperLiquidOrderBookProcessor'; import { calculateOpenInterestUSD } from '../utils/marketDataTransform'; /** @@ -93,7 +94,7 @@ export class HyperLiquidSubscriptionService { Set<(prices: PriceUpdate[]) => void> >(); - // Track which subscribers want L2Book (order book) data + // Track which subscribers want top-of-book (best bid/ask) data private readonly orderBookSubscribers = new Map< string, Set<(prices: PriceUpdate[]) => void> @@ -106,7 +107,7 @@ export class HyperLiquidSubscriptionService { string, ISubscription >(); - private readonly globalL2BookSubscriptions = new Map(); + private readonly globalBboSubscriptions = new Map(); // Order fill subscriptions keyed by accountId (normalized: undefined -> 'default') private readonly orderFillSubscriptions = new Map(); private readonly symbolSubscriberCounts = new Map(); @@ -885,7 +886,7 @@ export class HyperLiquidSubscriptionService { this.ensureActiveAssetSubscription(symbol); } if (includeOrderBook) { - this.ensureL2BookSubscription(symbol); + this.ensureBboSubscription(symbol); } }); @@ -906,7 +907,7 @@ export class HyperLiquidSubscriptionService { this.cleanupActiveAssetSubscription(symbol); } if (includeOrderBook) { - this.cleanupL2BookSubscription(symbol); + this.cleanupBboSubscription(symbol); } }); @@ -1904,7 +1905,11 @@ export class HyperLiquidSubscriptionService { return () => { if (subscribers instanceof Map && key) { - subscribers.get(key)?.delete(callback); + const set = subscribers.get(key); + set?.delete(callback); + if (set && set.size === 0) { + subscribers.delete(key); + } } else if (subscribers instanceof Set) { subscribers.delete(callback); } @@ -2370,11 +2375,13 @@ export class HyperLiquidSubscriptionService { } /** - * Ensure L2 book subscription for specific symbol (with reference counting) + * Ensure BBO subscription for specific symbol (singleton) + * + * BBO provides best bid/ask without being affected by L2Book aggregation parameters, + * keeping spread consistent across order book grouping selections (matches Hyperliquid UI). */ - private ensureL2BookSubscription(symbol: string): void { - // If subscription already exists, just return - if (this.globalL2BookSubscriptions.has(symbol)) { + private ensureBboSubscription(symbol: string): void { + if (this.globalBboSubscriptions.has(symbol)) { return; } @@ -2384,8 +2391,8 @@ export class HyperLiquidSubscriptionService { } subscriptionClient - .l2Book({ coin: symbol, nSigFigs: 5 }, (data: L2BookResponse) => { - processL2BookData({ + .bbo({ coin: symbol }, (data: BboWsEvent) => { + processBboData({ symbol, data, orderBookCache: this.orderBookCache, @@ -2395,36 +2402,41 @@ export class HyperLiquidSubscriptionService { }); }) .then((sub) => { - this.globalL2BookSubscriptions.set(symbol, sub); + this.globalBboSubscriptions.set(symbol, sub); this.deps.debugLogger.log( - `HyperLiquid: L2 book subscription established for ${symbol}`, + `HyperLiquid: BBO subscription established for ${symbol}`, ); }) .catch((error) => { this.deps.logger.error( ensureError(error), - this.getErrorContext('ensureL2BookSubscription', { symbol }), + this.getErrorContext('ensureBboSubscription', { symbol }), ); }); } /** - * Cleanup L2 book subscription when no longer needed + * Cleanup BBO subscription when no longer needed */ - private cleanupL2BookSubscription(symbol: string): void { - const subscription = this.globalL2BookSubscriptions.get(symbol); + private cleanupBboSubscription(symbol: string): void { + // If anyone still wants order book (top-of-book) data for this symbol, keep the subscription alive. + if ((this.orderBookSubscribers.get(symbol)?.size ?? 0) > 0) { + return; + } + + const subscription = this.globalBboSubscriptions.get(symbol); if (subscription && typeof subscription.unsubscribe === 'function') { const unsubscribeResult = Promise.resolve(subscription.unsubscribe()); unsubscribeResult.catch(() => { // Ignore errors during cleanup }); - this.globalL2BookSubscriptions.delete(symbol); + this.globalBboSubscriptions.delete(symbol); this.orderBookCache.delete(symbol); } else if (subscription) { // Subscription exists but unsubscribe is not a function or doesn't return a Promise // Just clean up the reference - this.globalL2BookSubscriptions.delete(symbol); + this.globalBboSubscriptions.delete(symbol); this.orderBookCache.delete(symbol); } } @@ -2705,17 +2717,17 @@ export class HyperLiquidSubscriptionService { }); } - // Re-establish L2Book subscriptions if there are order book subscribers + // Re-establish BBO subscriptions if there are order book subscribers if (this.orderBookSubscribers.size > 0) { // Clear existing subscriptions (they're dead after reconnection) - this.globalL2BookSubscriptions.clear(); + this.globalBboSubscriptions.clear(); // Re-establish subscriptions for all symbols with order book subscribers const symbolsNeedingOrderBook = Array.from( this.orderBookSubscribers.keys(), ); symbolsNeedingOrderBook.forEach((symbol) => { - this.ensureL2BookSubscription(symbol); + this.ensureBboSubscription(symbol); }); } @@ -2817,7 +2829,7 @@ export class HyperLiquidSubscriptionService { // Clear subscription references (actual cleanup handled by client service) this.globalAllMidsSubscription = undefined; this.globalActiveAssetSubscriptions.clear(); - this.globalL2BookSubscriptions.clear(); + this.globalBboSubscriptions.clear(); this.webData3Subscriptions.clear(); this.webData3SubscriptionPromise = undefined; diff --git a/app/components/UI/Perps/utils/hyperLiquidOrderBookProcessor.test.ts b/app/components/UI/Perps/utils/hyperLiquidOrderBookProcessor.test.ts index 1b57b9f60601..138617a87717 100644 --- a/app/components/UI/Perps/utils/hyperLiquidOrderBookProcessor.test.ts +++ b/app/components/UI/Perps/utils/hyperLiquidOrderBookProcessor.test.ts @@ -2,11 +2,13 @@ * Unit tests for HyperLiquid Order Book Processor */ -import type { L2BookResponse } from '@nktkas/hyperliquid'; +import type { BboWsEvent, L2BookResponse } from '@nktkas/hyperliquid'; import type { PriceUpdate } from '../controllers/types'; import { + processBboData, processL2BookData, type OrderBookCacheEntry, + type ProcessBboDataParams, type ProcessL2BookDataParams, } from './hyperLiquidOrderBookProcessor'; @@ -502,4 +504,141 @@ describe('hyperLiquidOrderBookProcessor', () => { expect(mockNotifySubscribers).toHaveBeenCalledTimes(2); }); }); + + describe('processBboData', () => { + it('processes valid BBO data with bid and ask', () => { + const symbol = 'BTC'; + const data: BboWsEvent = { + coin: 'BTC', + time: Date.now(), + bbo: [ + { px: '49900', sz: '1.5', n: 3 }, // Bid + { px: '50100', sz: '2.0', n: 5 }, // Ask + ], + }; + + mockCachedPriceData.set('BTC', { + symbol: 'BTC', + price: '50000', + timestamp: Date.now(), + }); + + const params: ProcessBboDataParams = { + symbol, + data, + orderBookCache: mockOrderBookCache, + cachedPriceData: mockCachedPriceData, + createPriceUpdate: mockCreatePriceUpdate, + notifySubscribers: mockNotifySubscribers, + }; + + processBboData(params); + + const cacheEntry = mockOrderBookCache.get('BTC'); + expect(cacheEntry).toBeDefined(); + expect(cacheEntry?.bestBid).toBe('49900'); + expect(cacheEntry?.bestAsk).toBe('50100'); + expect(cacheEntry?.spread).toBe('200.00000'); + expect(cacheEntry?.lastUpdated).toBeGreaterThan(0); + expect(mockCreatePriceUpdate).toHaveBeenCalledWith('BTC', '50000'); + expect(mockNotifySubscribers).toHaveBeenCalledTimes(1); + }); + + it('returns early when coin does not match symbol', () => { + const data: BboWsEvent = { + coin: 'ETH', + time: Date.now(), + bbo: [ + { px: '2990', sz: '5.0', n: 2 }, + { px: '3010', sz: '5.0', n: 2 }, + ], + }; + + const params: ProcessBboDataParams = { + symbol: 'BTC', + data, + orderBookCache: mockOrderBookCache, + cachedPriceData: mockCachedPriceData, + createPriceUpdate: mockCreatePriceUpdate, + notifySubscribers: mockNotifySubscribers, + }; + + processBboData(params); + + expect(mockOrderBookCache.size).toBe(0); + expect(mockCreatePriceUpdate).not.toHaveBeenCalled(); + expect(mockNotifySubscribers).not.toHaveBeenCalled(); + }); + + it('returns early when both bid and ask are missing', () => { + const data = { + coin: 'BTC', + time: Date.now(), + bbo: [undefined, undefined], + } as unknown as BboWsEvent; + + const params: ProcessBboDataParams = { + symbol: 'BTC', + data, + orderBookCache: mockOrderBookCache, + cachedPriceData: mockCachedPriceData, + createPriceUpdate: mockCreatePriceUpdate, + notifySubscribers: mockNotifySubscribers, + }; + + processBboData(params); + + expect(mockOrderBookCache.size).toBe(0); + expect(mockCreatePriceUpdate).not.toHaveBeenCalled(); + expect(mockNotifySubscribers).not.toHaveBeenCalled(); + }); + + it('returns early when bbo is a truthy non-array value', () => { + const data = { + coin: 'BTC', + time: Date.now(), + bbo: {}, + } as unknown as BboWsEvent; + + const params: ProcessBboDataParams = { + symbol: 'BTC', + data, + orderBookCache: mockOrderBookCache, + cachedPriceData: mockCachedPriceData, + createPriceUpdate: mockCreatePriceUpdate, + notifySubscribers: mockNotifySubscribers, + }; + + expect(() => processBboData(params)).not.toThrow(); + expect(mockOrderBookCache.size).toBe(0); + expect(mockCreatePriceUpdate).not.toHaveBeenCalled(); + expect(mockNotifySubscribers).not.toHaveBeenCalled(); + }); + + it('updates order book cache but does not notify when no cached price exists', () => { + const data: BboWsEvent = { + coin: 'BTC', + time: Date.now(), + bbo: [ + { px: '49900', sz: '1.5', n: 3 }, + { px: '50100', sz: '2.0', n: 5 }, + ], + }; + + const params: ProcessBboDataParams = { + symbol: 'BTC', + data, + orderBookCache: mockOrderBookCache, + cachedPriceData: mockCachedPriceData, + createPriceUpdate: mockCreatePriceUpdate, + notifySubscribers: mockNotifySubscribers, + }; + + processBboData(params); + + expect(mockOrderBookCache.get('BTC')).toBeDefined(); + expect(mockCreatePriceUpdate).not.toHaveBeenCalled(); + expect(mockNotifySubscribers).not.toHaveBeenCalled(); + }); + }); }); diff --git a/app/components/UI/Perps/utils/hyperLiquidOrderBookProcessor.ts b/app/components/UI/Perps/utils/hyperLiquidOrderBookProcessor.ts index ee930e52ac9a..c0aa77e00980 100644 --- a/app/components/UI/Perps/utils/hyperLiquidOrderBookProcessor.ts +++ b/app/components/UI/Perps/utils/hyperLiquidOrderBookProcessor.ts @@ -1,4 +1,4 @@ -import type { L2BookResponse } from '@nktkas/hyperliquid'; +import type { BboWsEvent, L2BookResponse } from '@nktkas/hyperliquid'; import type { PriceUpdate } from '../controllers/types'; /** @@ -30,6 +30,15 @@ export interface ProcessL2BookDataParams { notifySubscribers: () => void; } +export interface ProcessBboDataParams { + symbol: string; + data: BboWsEvent; + orderBookCache: Map; + cachedPriceData: Map | null; + createPriceUpdate: (symbol: string, price: string) => PriceUpdate; + notifySubscribers: () => void; +} + /** * Process Level 2 order book data and update caches * @@ -87,3 +96,52 @@ export function processL2BookData(params: ProcessL2BookDataParams): void { notifySubscribers(); } } + +/** + * Process BBO (best bid/offer) data and update caches + * + * BBO is lightweight and independent from L2Book aggregation parameters, + * making it ideal for spread / top-of-book display. + */ +export function processBboData(params: ProcessBboDataParams): void { + const { + symbol, + data, + orderBookCache, + cachedPriceData, + createPriceUpdate, + notifySubscribers, + } = params; + + if (data?.coin !== symbol || !Array.isArray(data?.bbo)) { + return; + } + + const [bestBid, bestAsk] = data.bbo; + if (!bestBid && !bestAsk) { + return; + } + + const bidPrice = bestBid ? parseFloat(bestBid.px) : 0; + const askPrice = bestAsk ? parseFloat(bestAsk.px) : 0; + const spread = + bidPrice > 0 && askPrice > 0 ? (askPrice - bidPrice).toFixed(5) : undefined; + + orderBookCache.set(symbol, { + bestBid: bestBid?.px, + bestAsk: bestAsk?.px, + spread, + lastUpdated: Date.now(), + }); + + const currentCachedPrice = cachedPriceData?.get(symbol); + if (!currentCachedPrice) { + return; + } + + const updatedPrice = createPriceUpdate(symbol, currentCachedPrice.price); + if (cachedPriceData) { + cachedPriceData.set(symbol, updatedPrice); + notifySubscribers(); + } +} From 0b330b590c5474af79bc699025e224cb9946e6c0 Mon Sep 17 00:00:00 2001 From: "runway-github[bot]" <73448015+runway-github[bot]@users.noreply.github.com> Date: Mon, 26 Jan 2026 13:55:18 +0000 Subject: [PATCH 09/80] chore(runway): cherry-pick style: (cp-7.63.0) trending view browser button fix (#25173) - style: (cp-7.63.0) trending view browser button fix (#25146) ## **Description** Effectively reverts this PR: https://github.com/MetaMask/metamask-mobile/pull/24424 From discussion with PM and others: https://consensys.slack.com/archives/C07NF2K42LE/p1769204088197769 Makes the browser explore icons much more visible. ## **Changelog** CHANGELOG entry: style: trending view browser button fix ## **Related issues** Fixes: https://consensys.slack.com/archives/C07NF2K42LE/p1769204088197769 ## **Manual testing steps** 1. Go to Explore 2. EXPECTED: when no tabs are added, you should see the explore icon. 3. EXPECTED: when tabs are added, you should see the number w/ border. ## **Screenshots/Recordings** ### **Before** ### **After** | Theme | No Tabs | Some Tabs | |--------|--------|--------| | Dark | Screenshot 2026-01-26 at 11
29 29 | Screenshot 2026-01-26 at 11 29
35 | | Light | Screenshot 2026-01-26 at 11
29 52 | Screenshot 2026-01-26 at 11 29
59 | ## **Pre-merge author checklist** - [x] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile Coding Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md). - [x] I've completed the PR template to the best of my ability - [x] I've included tests if applicable - [x] I've documented my code using [JSDoc](https://jsdoc.app/) format if applicable - [x] I've applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors. ## **Pre-merge reviewer checklist** - [ ] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [ ] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots. --- Open in
Cursor Open in Web --- > [!NOTE] > Improves visibility and clarity of the Explore browser button. > > - In `TrendingView.tsx`, replaces the muted square button with: > - A larger `Explore` icon (`IconSize.Xl`) when there are no tabs > - A compact bordered counter (`h-8 w-8`, `border-2`) showing `browserTabsCount` when tabs exist > - Removes unused `IconColor`/`TextColor` imports and associated color props > > Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit cd90b4a1cd3103690fc4bf5a24a2c5a540772e9c. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot). [f2a00af](https://github.com/MetaMask/metamask-mobile/commit/f2a00af072f8cabcf163906557f0d1da2ebc22f0) Co-authored-by: Prithpal Sooriya --- .../Views/TrendingView/TrendingView.tsx | 25 ++++++------------- 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/app/components/Views/TrendingView/TrendingView.tsx b/app/components/Views/TrendingView/TrendingView.tsx index 76f9280b061f..03677fa121e0 100644 --- a/app/components/Views/TrendingView/TrendingView.tsx +++ b/app/components/Views/TrendingView/TrendingView.tsx @@ -16,8 +16,6 @@ import { IconName, Icon, IconSize, - IconColor, - TextColor, } from '@metamask/design-system-react-native'; import { strings } from '../../../../locales/i18n'; import AppConstants from '../../../core/AppConstants'; @@ -209,22 +207,13 @@ export const ExploreFeed: React.FC = () => { onPress={handleBrowserPress} testID="trending-view-browser-button" > - - {browserTabsCount > 0 ? ( - - {browserTabsCount} - - ) : ( - - )} - + {browserTabsCount > 0 ? ( + + {browserTabsCount} + + ) : ( + + )} From fb50a0383a3d4c8213656a7430e34fe237130809 Mon Sep 17 00:00:00 2001 From: "runway-github[bot]" <73448015+runway-github[bot]@users.noreply.github.com> Date: Mon, 26 Jan 2026 13:55:55 +0000 Subject: [PATCH 10/80] chore(runway): cherry-pick fix(predict): cp-7.63.0 general UI fixes to live games (#25171) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - fix(predict): cp-7.63.0 general UI fixes to live games (#25130) ## **Description** This PR makes UI adjustments to the Predict feature's game markets: 1. **Removed team gradient background** from game market cards and game details screen - the gradient that used team colors as a background is no longer needed 2. **Adjusted padding** around the "Your picks" section in game details - increased top padding from `py-2` to `pt-8` for better visual spacing ### Changes: - `PredictGameDetailsContent.tsx`: Removed `PredictSportTeamGradient` wrapper, now uses `SafeAreaView` directly - `PredictGameDetailsFooter.tsx`: Removed gradient logic and unused `awayColor`/`homeColor` props - `PredictMarketSportCard.tsx`: Replaced gradient with simple `Box` using `bg-muted rounded-xl` - `PredictPicks.tsx`: Adjusted padding from `py-2` to `pt-8` - Updated tests and types to reflect the removal of gradient-related code ## **Changelog** CHANGELOG entry: null ## **Related issues** Fixes: https://consensyssoftware.atlassian.net/browse/PRED-541 ## **Manual testing steps** ```gherkin Feature: Predict game market UI Scenario: User views game market card in feed Given the user is on the Predict feed When the user views a sports game market card Then the card displays with a muted background (no team color gradient) Scenario: User views game details screen Given the user taps on a sports game market When the game details screen opens Then the screen displays without a team color gradient background And the "Your picks" section has proper spacing from the chart above ``` ## **Screenshots/Recordings** ### **Before** ### **After** Screenshot 2026-01-23 at 1 00 33 PM Screenshot 2026-01-23 at 1 00 18 PM ## **Pre-merge author checklist** - [x] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile Coding Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md). - [x] I've completed the PR template to the best of my ability - [x] I've included tests if applicable - [x] I've documented my code using [JSDoc](https://jsdoc.app/) format if applicable - [x] I've applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors. ## **Pre-merge reviewer checklist** - [ ] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [ ] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots. --- > [!NOTE] > Replaces team color gradients with neutral containers and cleans up related props/tests. > > - Remove `PredictSportTeamGradient` from `PredictGameDetailsContent`, `PredictGameDetailsFooter`, and `PredictMarketSportCard`; use `SafeAreaView`/`Box` with `bg-muted` and rounded corners > - Drop `awayColor`/`homeColor` props and gradient logic from footer (`PredictGameDetailsFooter.tsx` and `.types.ts`) > - Adjust "Your picks" heading spacing in `PredictPicks.tsx` from `py-2` to `pt-8` > - Update tests and snapshots to reflect no-gradient UI and removed props > > Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 12abe8158507ca27bd24390e81dfef7e0d949d9a. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot). [06a4e3c](https://github.com/MetaMask/metamask-mobile/commit/06a4e3ca9ecbf5ec4f27259b0efed53925547a9f) Co-authored-by: Luis Taniça --- .../PredictGameDetailsContent.test.tsx | 47 -- .../PredictGameDetailsContent.tsx | 150 +++--- .../PredictGameDetailsContent.test.tsx.snap | 431 +++++++++--------- .../PredictGameDetailsFooter.test.tsx | 43 -- .../PredictGameDetailsFooter.tsx | 19 +- .../PredictGameDetailsFooter.types.ts | 2 - .../PredictMarketSportCard.tsx | 19 +- .../components/PredictPicks/PredictPicks.tsx | 2 +- 8 files changed, 292 insertions(+), 421 deletions(-) diff --git a/app/components/UI/Predict/components/PredictGameDetailsContent/PredictGameDetailsContent.test.tsx b/app/components/UI/Predict/components/PredictGameDetailsContent/PredictGameDetailsContent.test.tsx index c11ae2d9afcd..3021d297f31d 100644 --- a/app/components/UI/Predict/components/PredictGameDetailsContent/PredictGameDetailsContent.test.tsx +++ b/app/components/UI/Predict/components/PredictGameDetailsContent/PredictGameDetailsContent.test.tsx @@ -66,30 +66,6 @@ jest.mock('../PredictGameDetailsFooter/PredictGameAboutSheet', () => { }; }); -jest.mock('../PredictSportTeamGradient', () => { - const { View } = jest.requireActual('react-native'); - return function MockPredictSportTeamGradient({ - children, - testID, - awayColor, - homeColor, - }: { - children: React.ReactNode; - testID?: string; - awayColor?: string; - homeColor?: string; - }) { - return ( - - {children} - - ); - }; -}); - jest.mock('../PredictSportScoreboard', () => { const { View } = jest.requireActual('react-native'); return { @@ -461,29 +437,6 @@ describe('PredictGameDetailsContent', () => { }); }); - describe('Gradient Integration', () => { - it('renders gradient with team colors', () => { - const market = createMockMarket(); - - const { getByTestId } = render( - , - ); - - const gradient = getByTestId('game-details-gradient'); - - expect(gradient).toBeOnTheScreen(); - expect(gradient.props.accessibilityHint).toBe( - 'away:#0000FF,home:#FF0000', - ); - }); - }); - describe('Scoreboard Integration', () => { it('renders scoreboard with team data', () => { const market = createMockMarket(); diff --git a/app/components/UI/Predict/components/PredictGameDetailsContent/PredictGameDetailsContent.tsx b/app/components/UI/Predict/components/PredictGameDetailsContent/PredictGameDetailsContent.tsx index 27cf000038c6..6fbc377f19cd 100644 --- a/app/components/UI/Predict/components/PredictGameDetailsContent/PredictGameDetailsContent.tsx +++ b/app/components/UI/Predict/components/PredictGameDetailsContent/PredictGameDetailsContent.tsx @@ -26,7 +26,6 @@ import PredictGameAboutSheet from '../PredictGameDetailsFooter/PredictGameAboutS import PredictPicks from '../PredictPicks/PredictPicks'; import PredictShareButton from '../PredictShareButton/PredictShareButton'; import PredictSportScoreboard from '../PredictSportScoreboard'; -import PredictSportTeamGradient from '../PredictSportTeamGradient'; import { PredictGameDetailsContentProps } from './PredictGameDetailsContent.types'; import { useTheme } from '../../../../../util/theme'; import { PredictMarketDetailsSelectorsIDs } from '../../Predict.testIds'; @@ -62,97 +61,88 @@ const PredictGameDetailsContent: React.FC = ({ } return ( - - - - + + + + - - + {market.title} + + - - - {market.title} - - + + - + + } + > + + - - } - > - - - + + + - - - + + + + - - - - + - - - {isVisible && ( - - )} - - + )} + ); }; diff --git a/app/components/UI/Predict/components/PredictGameDetailsContent/__snapshots__/PredictGameDetailsContent.test.tsx.snap b/app/components/UI/Predict/components/PredictGameDetailsContent/__snapshots__/PredictGameDetailsContent.test.tsx.snap index 7a4625f73e59..65a9bf8c1a7f 100644 --- a/app/components/UI/Predict/components/PredictGameDetailsContent/__snapshots__/PredictGameDetailsContent.test.tsx.snap +++ b/app/components/UI/Predict/components/PredictGameDetailsContent/__snapshots__/PredictGameDetailsContent.test.tsx.snap @@ -2,98 +2,183 @@ exports[`PredictGameDetailsContent matches snapshot 1`] = ` + + + - + Test Game Market + + + + + + } + style={ + { + "flexBasis": "0%", + "flexGrow": 1, + "flexShrink": 1, + } + } + > + + + - - - Test Game Market - + + style={ + [ + { + "display": "flex", + "paddingBottom": 8, + "paddingLeft": 16, + "paddingRight": 16, + "paddingTop": 8, + }, + undefined, + ] + } + > + + - + + - } - style={ + accessibilityValue={ { - "flexBasis": "0%", - "flexGrow": 1, - "flexShrink": 1, + "max": undefined, + "min": undefined, + "now": undefined, + "text": undefined, } } + accessible={true} + collapsable={false} + focusable={true} + onBlur={[Function]} + onClick={[Function]} + onFocus={[Function]} + onResponderGrant={[Function]} + onResponderMove={[Function]} + onResponderRelease={[Function]} + onResponderTerminate={[Function]} + onResponderTerminationRequest={[Function]} + onStartShouldSetResponder={[Function]} + testID="mock-info-button" > - - - - - - - - - - - - - - - - - Info - - + + Info + diff --git a/app/components/UI/Predict/components/PredictGameDetailsFooter/PredictGameDetailsFooter.test.tsx b/app/components/UI/Predict/components/PredictGameDetailsFooter/PredictGameDetailsFooter.test.tsx index 44dd7b01616e..6cd2c50da34e 100644 --- a/app/components/UI/Predict/components/PredictGameDetailsFooter/PredictGameDetailsFooter.test.tsx +++ b/app/components/UI/Predict/components/PredictGameDetailsFooter/PredictGameDetailsFooter.test.tsx @@ -393,47 +393,4 @@ describe('PredictGameDetailsFooter', () => { expect(screen.getByText('$0 Vol')).toBeOnTheScreen(); }); }); - - describe('gradient integration', () => { - it('renders gradient when team colors are provided', () => { - const props = createDefaultProps({ - awayColor: '#002244', - homeColor: '#FB4F14', - }); - - renderWithProvider(); - - expect( - screen.getByTestId('game-details-footer-gradient'), - ).toBeOnTheScreen(); - }); - - it('does not render gradient when colors are not provided', () => { - const props = createDefaultProps(); - - renderWithProvider(); - - expect(screen.queryByTestId('game-details-footer-gradient')).toBeNull(); - }); - - it('does not render gradient when only awayColor is provided', () => { - const props = createDefaultProps({ - awayColor: '#002244', - }); - - renderWithProvider(); - - expect(screen.queryByTestId('game-details-footer-gradient')).toBeNull(); - }); - - it('does not render gradient when only homeColor is provided', () => { - const props = createDefaultProps({ - homeColor: '#FB4F14', - }); - - renderWithProvider(); - - expect(screen.queryByTestId('game-details-footer-gradient')).toBeNull(); - }); - }); }); diff --git a/app/components/UI/Predict/components/PredictGameDetailsFooter/PredictGameDetailsFooter.tsx b/app/components/UI/Predict/components/PredictGameDetailsFooter/PredictGameDetailsFooter.tsx index 8960f5eb9159..33ff6f4c935b 100644 --- a/app/components/UI/Predict/components/PredictGameDetailsFooter/PredictGameDetailsFooter.tsx +++ b/app/components/UI/Predict/components/PredictGameDetailsFooter/PredictGameDetailsFooter.tsx @@ -17,7 +17,6 @@ import { strings } from '../../../../../../locales/i18n'; import { formatVolume } from '../../utils/format'; import { PredictActionButtons } from '../PredictActionButtons'; import { PredictGameDetailsFooterProps } from './PredictGameDetailsFooter.types'; -import PredictSportTeamGradient from '../PredictSportTeamGradient'; const PredictGameDetailsFooter: React.FC = ({ market, @@ -28,8 +27,6 @@ const PredictGameDetailsFooter: React.FC = ({ claimableAmount = 0, isLoading = false, testID = 'predict-game-details-footer', - awayColor, - homeColor, }) => { const insets = useSafeAreaInsets(); const formattedVolume = useMemo( @@ -46,11 +43,9 @@ const PredictGameDetailsFooter: React.FC = ({ return null; } - const hasGradient = awayColor && homeColor; - const content = ( @@ -105,18 +100,6 @@ const PredictGameDetailsFooter: React.FC = ({ ); - if (hasGradient) { - return ( - - {content} - - ); - } - return content; }; diff --git a/app/components/UI/Predict/components/PredictGameDetailsFooter/PredictGameDetailsFooter.types.ts b/app/components/UI/Predict/components/PredictGameDetailsFooter/PredictGameDetailsFooter.types.ts index b6aa97b72a09..54b31a02fc03 100644 --- a/app/components/UI/Predict/components/PredictGameDetailsFooter/PredictGameDetailsFooter.types.ts +++ b/app/components/UI/Predict/components/PredictGameDetailsFooter/PredictGameDetailsFooter.types.ts @@ -13,8 +13,6 @@ export interface PredictGameDetailsFooterProps { claimableAmount?: number; isLoading?: boolean; testID?: string; - awayColor?: string; - homeColor?: string; } export interface PredictGameAboutSheetProps { diff --git a/app/components/UI/Predict/components/PredictMarketSportCard/PredictMarketSportCard.tsx b/app/components/UI/Predict/components/PredictMarketSportCard/PredictMarketSportCard.tsx index 1df26b498dab..76e2df7b7463 100644 --- a/app/components/UI/Predict/components/PredictMarketSportCard/PredictMarketSportCard.tsx +++ b/app/components/UI/Predict/components/PredictMarketSportCard/PredictMarketSportCard.tsx @@ -8,7 +8,6 @@ import { IconName, IconColor, } from '@metamask/design-system-react-native'; -import { useTailwind } from '@metamask/design-system-twrnc-preset'; import { NavigationProp, useNavigation } from '@react-navigation/native'; import React from 'react'; import { TouchableOpacity } from 'react-native'; @@ -20,9 +19,9 @@ import { import { PredictEventValues } from '../../constants/eventNames'; import Routes from '../../../../../constants/navigation/Routes'; import TrendingFeedSessionManager from '../../../Trending/services/TrendingFeedSessionManager'; -import PredictSportTeamGradient from '../PredictSportTeamGradient/PredictSportTeamGradient'; import PredictSportScoreboard from '../PredictSportScoreboard/PredictSportScoreboard'; import { PredictSportCardFooter } from '../PredictSportCardFooter'; +import { useTailwind } from '@metamask/design-system-twrnc-preset'; interface PredictMarketSportCardProps { market: PredictMarketType; @@ -37,6 +36,7 @@ const PredictMarketSportCard: React.FC = ({ entryPoint = PredictEventValues.ENTRY_POINT.PREDICT_FEED, onDismiss, }) => { + const tw = useTailwind(); const resolvedEntryPoint = TrendingFeedSessionManager.getInstance() .isFromTrending ? PredictEventValues.ENTRY_POINT.TRENDING @@ -44,12 +44,12 @@ const PredictMarketSportCard: React.FC = ({ const navigation = useNavigation>(); - const tw = useTailwind(); const game = market.game; return ( { navigation.navigate(Routes.PREDICT.ROOT, { @@ -63,17 +63,12 @@ const PredictMarketSportCard: React.FC = ({ }); }} > - + {onDismiss && ( - + = ({ testID={testID ? `${testID}-footer` : undefined} /> - + ); }; diff --git a/app/components/UI/Predict/components/PredictPicks/PredictPicks.tsx b/app/components/UI/Predict/components/PredictPicks/PredictPicks.tsx index 8a283c99b108..e9d87eb4f0a7 100644 --- a/app/components/UI/Predict/components/PredictPicks/PredictPicks.tsx +++ b/app/components/UI/Predict/components/PredictPicks/PredictPicks.tsx @@ -59,7 +59,7 @@ const PredictPicks: React.FC = ({ return ( - + {strings('predict.market_details.your_picks')} {livePositions.map((position) => ( From 540e7723b80f4cc7698aae7e1cd9c4ad62632ed5 Mon Sep 17 00:00:00 2001 From: metamaskbot Date: Mon, 26 Jan 2026 13:57:25 +0000 Subject: [PATCH 11/80] [skip ci] Bump version number to 3543 --- android/app/build.gradle | 2 +- bitrise.yml | 4 ++-- ios/MetaMask.xcodeproj/project.pbxproj | 12 ++++++------ 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 366856e4b120..acdef2a1a01a 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -188,7 +188,7 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion versionName "7.63.0" - versionCode 3540 + versionCode 3543 testBuildType System.getProperty('testBuildType', 'debug') testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" manifestPlaceholders.MM_BRANCH_KEY_TEST = "$System.env.MM_BRANCH_KEY_TEST" diff --git a/bitrise.yml b/bitrise.yml index 75fd4d8bf127..e3661289ab4e 100644 --- a/bitrise.yml +++ b/bitrise.yml @@ -3472,13 +3472,13 @@ app: VERSION_NAME: 7.63.0 - opts: is_expand: false - VERSION_NUMBER: 3540 + VERSION_NUMBER: 3543 - opts: is_expand: false FLASK_VERSION_NAME: 7.63.0 - opts: is_expand: false - FLASK_VERSION_NUMBER: 3540 + FLASK_VERSION_NUMBER: 3543 - opts: is_expand: false ANDROID_APK_LINK: '' diff --git a/ios/MetaMask.xcodeproj/project.pbxproj b/ios/MetaMask.xcodeproj/project.pbxproj index 7233146005ab..231396c6e49a 100644 --- a/ios/MetaMask.xcodeproj/project.pbxproj +++ b/ios/MetaMask.xcodeproj/project.pbxproj @@ -1281,7 +1281,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3540; + CURRENT_PROJECT_VERSION = 3543; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 48XVW22RCG; @@ -1350,7 +1350,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3540; + CURRENT_PROJECT_VERSION = 3543; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 48XVW22RCG; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 48XVW22RCG; @@ -1416,7 +1416,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3540; + CURRENT_PROJECT_VERSION = 3543; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 48XVW22RCG; @@ -1483,7 +1483,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3540; + CURRENT_PROJECT_VERSION = 3543; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 48XVW22RCG; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 48XVW22RCG; @@ -1646,7 +1646,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3540; + CURRENT_PROJECT_VERSION = 3543; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 48XVW22RCG; @@ -1716,7 +1716,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3540; + CURRENT_PROJECT_VERSION = 3543; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 48XVW22RCG; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 48XVW22RCG; From 822cdd16aca47df78ffec46f62d113a986cc4fdf Mon Sep 17 00:00:00 2001 From: "runway-github[bot]" <73448015+runway-github[bot]@users.noreply.github.com> Date: Mon, 26 Jan 2026 14:39:40 +0000 Subject: [PATCH 12/80] chore(runway): cherry-pick fix: [Trending tokens] filters overflow cp-7.63.0 (#25182) - fix: [Trending tokens] filters overflow cp-7.63.0 (#25175) ## **Description** Issue: The filters in the Trending tokens screen are overflowing in small screen sizes and/or big font sizes. Solution: I made the filters fit in a horizontal scroll-view, also maintained UI alignment when the font/size changes to a smaller one ## **Changelog** CHANGELOG entry: fix trending token filters overflowing ## **Related issues** Fixes: https://consensyssoftware.atlassian.net/browse/ASSETS-2545 ## **Manual testing steps** ```gherkin Feature: my feature name Scenario: user [verb for user action] Given [describe expected initial app state] When user [verb for user action] Then [describe expected outcome] ``` ## **Screenshots/Recordings** ### **Before** image ### **After** https://github.com/user-attachments/assets/bc67f02c-73ce-41a5-b263-8da4c82ca3f5 ## **Pre-merge author checklist** - [ ] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile Coding Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md). - [ ] I've completed the PR template to the best of my ability - [ ] I've included tests if applicable - [ ] I've documented my code using [JSDoc](https://jsdoc.app/) format if applicable - [ ] I've applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors. ## **Pre-merge reviewer checklist** - [ ] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [ ] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots. --- > [!NOTE] > Addresses filter overflow in the Trending Tokens view by making the control bar horizontally scrollable and refining layout. > > - Wraps the filters control bar in a horizontal `ScrollView` and adds `controlBarScrollView` styles > - Tweaks layout styles (`flexGrow: 0`, `minWidth: '100%'`, added margins/gaps) to maintain alignment and prevent wrapping/overflow > - Imports `ScrollView`; no changes to sorting/filtering logic or data flow > > Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 717bd288a67b5e84d9ecda0154d07d12a29741f4. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot). [1cdf51a](https://github.com/MetaMask/metamask-mobile/commit/1cdf51aaec52e688099c42c5498d9da0ac323a30) Co-authored-by: Juanmi <95381763+juanmigdr@users.noreply.github.com> --- .../TrendingTokensFullView.tsx | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/app/components/Views/TrendingTokens/TrendingTokensFullView/TrendingTokensFullView.tsx b/app/components/Views/TrendingTokens/TrendingTokensFullView/TrendingTokensFullView.tsx index a59a01d4c08f..2d35b51399f1 100644 --- a/app/components/Views/TrendingTokens/TrendingTokensFullView/TrendingTokensFullView.tsx +++ b/app/components/Views/TrendingTokens/TrendingTokensFullView/TrendingTokensFullView.tsx @@ -10,6 +10,7 @@ import { View, TouchableOpacity, RefreshControl, + ScrollView, } from 'react-native'; import { useSelector } from 'react-redux'; import { useAppThemeFromContext } from '../../../../util/theme'; @@ -70,24 +71,26 @@ const createStyles = (theme: Theme) => paddingRight: 16, }, controlBarWrapper: { - flexDirection: 'row', paddingVertical: 16, paddingHorizontal: 16, - justifyContent: 'space-between', + flexGrow: 0, + }, + controlBarScrollView: { + flexGrow: 0, alignItems: 'center', - alignSelf: 'stretch', }, controlButtonOuterWrapper: { flexDirection: 'row', - flex: 1, justifyContent: 'space-between', alignItems: 'center', + minWidth: '100%', }, controlButtonInnerWrapper: { flexDirection: 'row', gap: 8, alignItems: 'center', flexShrink: 0, + marginLeft: 8, }, controlButton: { paddingVertical: 8, @@ -322,7 +325,12 @@ const TrendingTokensFullView = () => { /> {!isSearchVisible ? ( - + { - + ) : null} {isLoading ? ( From 82856ea8f962d979a54ab1461a2d80b9cd150a79 Mon Sep 17 00:00:00 2001 From: metamaskbot Date: Mon, 26 Jan 2026 14:41:05 +0000 Subject: [PATCH 13/80] [skip ci] Bump version number to 3545 --- android/app/build.gradle | 2 +- bitrise.yml | 4 ++-- ios/MetaMask.xcodeproj/project.pbxproj | 12 ++++++------ 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index acdef2a1a01a..98e4ddf027d3 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -188,7 +188,7 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion versionName "7.63.0" - versionCode 3543 + versionCode 3545 testBuildType System.getProperty('testBuildType', 'debug') testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" manifestPlaceholders.MM_BRANCH_KEY_TEST = "$System.env.MM_BRANCH_KEY_TEST" diff --git a/bitrise.yml b/bitrise.yml index e3661289ab4e..d10f378c6ddd 100644 --- a/bitrise.yml +++ b/bitrise.yml @@ -3472,13 +3472,13 @@ app: VERSION_NAME: 7.63.0 - opts: is_expand: false - VERSION_NUMBER: 3543 + VERSION_NUMBER: 3545 - opts: is_expand: false FLASK_VERSION_NAME: 7.63.0 - opts: is_expand: false - FLASK_VERSION_NUMBER: 3543 + FLASK_VERSION_NUMBER: 3545 - opts: is_expand: false ANDROID_APK_LINK: '' diff --git a/ios/MetaMask.xcodeproj/project.pbxproj b/ios/MetaMask.xcodeproj/project.pbxproj index 231396c6e49a..5a02a7bd9138 100644 --- a/ios/MetaMask.xcodeproj/project.pbxproj +++ b/ios/MetaMask.xcodeproj/project.pbxproj @@ -1281,7 +1281,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3543; + CURRENT_PROJECT_VERSION = 3545; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 48XVW22RCG; @@ -1350,7 +1350,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3543; + CURRENT_PROJECT_VERSION = 3545; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 48XVW22RCG; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 48XVW22RCG; @@ -1416,7 +1416,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3543; + CURRENT_PROJECT_VERSION = 3545; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 48XVW22RCG; @@ -1483,7 +1483,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3543; + CURRENT_PROJECT_VERSION = 3545; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 48XVW22RCG; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 48XVW22RCG; @@ -1646,7 +1646,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3543; + CURRENT_PROJECT_VERSION = 3545; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 48XVW22RCG; @@ -1716,7 +1716,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3543; + CURRENT_PROJECT_VERSION = 3545; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 48XVW22RCG; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 48XVW22RCG; From acb6eec52edcce0b27faf110f9300e768bea2570 Mon Sep 17 00:00:00 2001 From: "runway-github[bot]" <73448015+runway-github[bot]@users.noreply.github.com> Date: Mon, 26 Jan 2026 17:58:57 +0000 Subject: [PATCH 14/80] chore(runway): cherry-pick fix: [Explore] predict text overflows from card cp-7.63.0 (#25190) - fix: [Explore] predict text overflows from card cp-7.63.0 (#25170) ## **Description** Issue: Predict text overflows from card when used on explore and the user has a bigger text size set in their device. Solution: Added ellipsis when needed ## **Changelog** CHANGELOG entry: fix predict text overflows from card in explore page ## **Related issues** Fixes: https://consensyssoftware.atlassian.net/jira/software/c/projects/ASSETS/boards/1567?assignee=712020%3A2d07ba60-e2fc-4bce-b062-89ffccf46204&assignee=unassigned&selectedIssue=ASSETS-2544 ## **Manual testing steps** ```gherkin Feature: my feature name Scenario: user [verb for user action] Given [describe expected initial app state] When user [verb for user action] Then [describe expected outcome] ``` ## **Screenshots/Recordings** ### **Before** image ### **After** image https://github.com/user-attachments/assets/037f4df2-f083-4434-a5f4-81c1212bf4d3 ## **Pre-merge author checklist** - [ ] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile Coding Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md). - [ ] I've completed the PR template to the best of my ability - [ ] I've included tests if applicable - [ ] I've documented my code using [JSDoc](https://jsdoc.app/) format if applicable - [ ] I've applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors. ## **Pre-merge reviewer checklist** - [ ] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [ ] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots. --- > [!NOTE] > Prevents overflow of footer text in `PredictMarketMultiple` by enforcing single-line truncation and flexible layout. > > - Adds `numberOfLines={1}` and Tailwind styles (`flex-shrink`, `min-w-0`, `flex-shrink-0`, `ml-2`) to extra outcomes count, total volume, and recurrence label/icon to enable ellipsis and avoid wrapping/overlap > - Minor spacing tweak in the footer container to accommodate truncation without layout breakage > > Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit c30fbc463b19659cb2f6d57a6ef7866676e35071. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot). [64241ce](https://github.com/MetaMask/metamask-mobile/commit/64241cef266f413364b4ccc1c9ffab2c2013bbfa) Co-authored-by: Juanmi <95381763+juanmigdr@users.noreply.github.com> --- .../PredictMarketMultiple.tsx | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/app/components/UI/Predict/components/PredictMarketMultiple/PredictMarketMultiple.tsx b/app/components/UI/Predict/components/PredictMarketMultiple/PredictMarketMultiple.tsx index afc3190056cc..458c6b9067af 100644 --- a/app/components/UI/Predict/components/PredictMarketMultiple/PredictMarketMultiple.tsx +++ b/app/components/UI/Predict/components/PredictMarketMultiple/PredictMarketMultiple.tsx @@ -295,7 +295,12 @@ const PredictMarketMultiple: React.FC = ({ justifyContent={BoxJustifyContent.Between} twClassName={isCarousel ? '' : 'mt-3'} > - + {filteredOutcomes.length > 3 ? `+${filteredOutcomes.length - 3} ${ filteredOutcomes.length - 3 === 1 @@ -307,11 +312,13 @@ const PredictMarketMultiple: React.FC = ({ ${totalVolumeDisplay} {strings('predict.volume_abbreviated')} @@ -319,16 +326,19 @@ const PredictMarketMultiple: React.FC = ({ {strings( `predict.recurrence.${market.recurrence.toLowerCase()}`, From 15bb9c1b3a6ab0ac52fa3a95ce56c4917b00f262 Mon Sep 17 00:00:00 2001 From: "runway-github[bot]" <73448015+runway-github[bot]@users.noreply.github.com> Date: Mon, 26 Jan 2026 18:00:02 +0000 Subject: [PATCH 15/80] chore(runway): cherry-pick fix: Aggregator guard on perps banner in detail screen cp-7.63.0 (#25203) - fix: Aggregator guard on perps banner in detail screen cp-7.63.0 (#25078) ## **Description** **Summary** Adds token trust validation to the Perps Discovery Banner to prevent it from appearing on potentially malicious tokens. **Problem:** The Perps banner was showing based solely on symbol matching (e.g., "SOL"), which caused it to appear on fake tokens with matching symbols. This inadvertently lends credibility to scam tokens. Meaning, a user could open a Perps position from a scam token with the same symbol as a supported Perp (see recording **Solution:** Only show the Perps banner for tokens that are either: - Native tokens (ETH, BNB, SOL, etc.) - Tokens listed on at least 2 aggregators/exchanges (indicates legitimacy) **Changes** - Added `PERPS_MIN_AGGREGATORS_FOR_TRUST` constant to `perpsConfig.ts` - Added isTokenTrustworthy check in AssetOverview.tsx - Added isTokenTrustworthy check in AssetDetails/index.tsx **Future Improvement** **Blockaid Integration:** We could trigger a Blockaid scan via `PhishingController.scanAddress()` when viewing an asset and use the `tokenScanCache` result to determine if the token is malicious. However, this approach was deferred because: - Adds network latency on every asset view - Increases API resource consumption - Requires async handling and loading states for the banner The aggregators-based approach provides an immediate guard with no additional API calls, covering the majority of scam token cases. Blockaid integration could be added as a future enhancement for more comprehensive protection. So, there is still an edge case where scam tokens can game the aggregators and bypass the aggregator guard. Blockaid check would solve this edge case. ## **Changelog** CHANGELOG entry: Add aggregator guard to token detail PerpsBanner ## **Related issues** Fixes: ## **Manual testing steps** ```gherkin Feature: Perps Discovery Banner Token Trust Validation As a user viewing token details I want the Perps trading banner to only appear for legitimate tokens So that I am not misled into thinking a scam token is associated with a real Perps market Background: Given I am logged into MetaMask Mobile And the Perps feature flag is enabled And I am on a network that supports Perps trading Scenario: Banner appears for native tokens with matching Perps market Given I navigate to the Asset Overview for native ETH And a Perps market exists for "ETH" Then I should see the Perps Discovery Banner And the banner should display the ETH market leverage Scenario: Banner appears for tokens listed on multiple exchanges Given I navigate to the Asset Overview for LINK token And LINK has 3 aggregators in its token metadata And a Perps market exists for "LINK" Then I should see the Perps Discovery Banner Scenario: Banner does NOT appear for tokens with insufficient aggregators Given I navigate to the Asset Overview for a token with symbol "SOL" And the token has 0 aggregators in its metadata And the token is not a native token And a Perps market exists for "SOL" Then I should NOT see the Perps Discovery Banner Scenario: Banner does NOT appear for fake tokens mimicking native symbols Given I navigate to the Asset Overview for a fake "SOL" token on Ethereum And the token contract address does not match the real SOL token And the token has fewer than 2 aggregators Then I should NOT see the Perps Discovery Banner Even though a Perps market exists for "SOL" Scenario: Banner navigation works correctly for trusted tokens Given I navigate to the Asset Overview for native BTC And a Perps market exists for "BTC" And I see the Perps Discovery Banner When I tap on the Perps Discovery Banner Then I should be navigated to the BTC Perps Market Details screen ``` ## **Screenshots/Recordings** Before: https://github.com/user-attachments/assets/97a0f6ab-ab03-4798-a5c8-bfb40734049c After: https://github.com/user-attachments/assets/54e75499-84e7-4c9e-9b7f-3a392104bfa8 ## **Pre-merge author checklist** - [x] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile Coding Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md). - [x] I've completed the PR template to the best of my ability - [x] I've included tests if applicable - [x] I've documented my code using [JSDoc](https://jsdoc.app/) format if applicable - [x] I've applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors. ## **Pre-merge reviewer checklist** - [ ] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [ ] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots. --- > [!NOTE] > Adds a token trust guard for the Perps Discovery Banner to avoid showing it on untrusted tokens. > > - Introduces `PERPS_MIN_AGGREGATORS_FOR_TRUST` and `isTokenTrustworthyForPerps` in `perpsConfig` > - Gates `PerpsDiscoveryBanner` in `AssetOverview` and `AssetDetails` on `isTokenTrustworthy` in addition to existing perps market checks > - Adds comprehensive tests for trust logic and banner rendering conditions (`perpsConfig.test.ts`, `AssetOverview.test.tsx`) > - Minor: `Balance` now passes the full `asset` in navigation params when opening `AssetDetails` > > Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 1ae8cdd36663914f7194d396984bfb65d13e13ad. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot). [a4a0d88](https://github.com/MetaMask/metamask-mobile/commit/a4a0d88ff794aa9cb96e4bcc326f3770de93f108) Co-authored-by: Nick Gambino <35090461+gambinish@users.noreply.github.com> --- .../UI/AssetOverview/AssetOverview.test.tsx | 151 ++++++++++++++++++ .../UI/AssetOverview/AssetOverview.tsx | 37 +++-- .../UI/AssetOverview/Balance/Balance.tsx | 3 +- .../UI/Perps/constants/perpsConfig.test.ts | 115 +++++++++++++ .../UI/Perps/constants/perpsConfig.ts | 25 +++ app/components/Views/AssetDetails/index.tsx | 33 ++-- 6 files changed, 336 insertions(+), 28 deletions(-) create mode 100644 app/components/UI/Perps/constants/perpsConfig.test.ts diff --git a/app/components/UI/AssetOverview/AssetOverview.test.tsx b/app/components/UI/AssetOverview/AssetOverview.test.tsx index 58b4ca83e9be..13987c1c66d7 100644 --- a/app/components/UI/AssetOverview/AssetOverview.test.tsx +++ b/app/components/UI/AssetOverview/AssetOverview.test.tsx @@ -313,6 +313,17 @@ jest.mock('../../Views/confirmations/hooks/useSendNavigation', () => ({ useSendNavigation: jest.fn(), })); +// Perps Discovery Banner mocks +const mockUsePerpsMarketForAsset = jest.fn(); +jest.mock('../Perps/hooks/usePerpsMarketForAsset', () => ({ + usePerpsMarketForAsset: () => mockUsePerpsMarketForAsset(), +})); + +const mockSelectPerpsEnabledFlag = jest.fn(); +jest.mock('../Perps', () => ({ + selectPerpsEnabledFlag: () => mockSelectPerpsEnabledFlag(), +})); + const asset = { balance: '400', balanceFiat: '1500', @@ -401,6 +412,13 @@ describe('AssetOverview', () => { mockNavigate('Send', params); }), }); + + // Default Perps mock - disabled and no market exists (banner won't show) + mockSelectPerpsEnabledFlag.mockReturnValue(false); + mockUsePerpsMarketForAsset.mockReturnValue({ + hasPerpsMarket: false, + marketData: null, + }); }); afterEach(() => { @@ -1851,6 +1869,139 @@ describe('AssetOverview', () => { ); }); }); + + describe('Perps Discovery Banner Token Trust Validation', () => { + const mockMarketData = { + symbol: 'ETH', + maxLeverage: 50, + }; + + beforeEach(() => { + // Reset Perps mocks before each test + mockSelectPerpsEnabledFlag.mockReset(); + mockUsePerpsMarketForAsset.mockReset(); + }); + + it('does NOT render Perps banner for token with insufficient aggregators', () => { + // Mock: Perps enabled and market exists + mockSelectPerpsEnabledFlag.mockReturnValue(true); + mockUsePerpsMarketForAsset.mockReturnValue({ + hasPerpsMarket: true, + marketData: mockMarketData, + }); + + const tokenWithNoAggregators = { + ...asset, + aggregators: [], // No aggregators - not trustworthy + isETH: false, + isNative: false, + }; + + const { queryByTestId } = renderWithProvider( + , + { state: mockInitialState }, + ); + + // Banner NOT rendered + expect(queryByTestId('perps-discovery-banner')).toBeNull(); + }); + + it('renders Perps banner for native token regardless of aggregators', () => { + // Mock: Perps enabled and market exists + mockSelectPerpsEnabledFlag.mockReturnValue(true); + mockUsePerpsMarketForAsset.mockReturnValue({ + hasPerpsMarket: true, + marketData: mockMarketData, + }); + + const nativeToken = { + ...asset, + aggregators: [], // No aggregators, but native token is always trusted + isNative: true, + isETH: false, + }; + + const { getByTestId } = renderWithProvider( + , + { state: mockInitialState }, + ); + + // Banner rendered for native tokens + expect(getByTestId('perps-discovery-banner')).toBeOnTheScreen(); + }); + + it('renders Perps banner for ETH token regardless of aggregators', () => { + // Mock: Perps enabled and market exists + mockSelectPerpsEnabledFlag.mockReturnValue(true); + mockUsePerpsMarketForAsset.mockReturnValue({ + hasPerpsMarket: true, + marketData: mockMarketData, + }); + + const ethToken = { + ...asset, + aggregators: [], // No aggregators, but ETH is always trusted + isETH: true, + isNative: false, + }; + + const { getByTestId } = renderWithProvider( + , + { state: mockInitialState }, + ); + + // Banner rendered for ETH tokens + expect(getByTestId('perps-discovery-banner')).toBeOnTheScreen(); + }); + + it('renders Perps banner for token with sufficient aggregators', () => { + // Mock: Perps enabled and market exists + mockSelectPerpsEnabledFlag.mockReturnValue(true); + mockUsePerpsMarketForAsset.mockReturnValue({ + hasPerpsMarket: true, + marketData: mockMarketData, + }); + + const tokenWithAggregators = { + ...asset, + aggregators: ['CoinGecko', 'CoinMarketCap'], // 2 aggregators - trustworthy + isETH: false, + isNative: false, + }; + + const { getByTestId } = renderWithProvider( + , + { state: mockInitialState }, + ); + + // Banner rendered for tokens with sufficient aggregators + expect(getByTestId('perps-discovery-banner')).toBeOnTheScreen(); + }); + + it('does NOT render Perps banner for token with only 1 aggregator', () => { + // Mock: Perps enabled and market exists + mockSelectPerpsEnabledFlag.mockReturnValue(true); + mockUsePerpsMarketForAsset.mockReturnValue({ + hasPerpsMarket: true, + marketData: mockMarketData, + }); + + const tokenWithOneAggregator = { + ...asset, + aggregators: ['CoinGecko'], // Only 1 aggregator - not enough + isETH: false, + isNative: false, + }; + + const { queryByTestId } = renderWithProvider( + , + { state: mockInitialState }, + ); + + // Banner NOT rendered - 1 aggregator is not enough + expect(queryByTestId('perps-discovery-banner')).toBeNull(); + }); + }); }); describe('getSwapTokens', () => { diff --git a/app/components/UI/AssetOverview/AssetOverview.tsx b/app/components/UI/AssetOverview/AssetOverview.tsx index dca90811b09e..4e548f7c26a6 100644 --- a/app/components/UI/AssetOverview/AssetOverview.tsx +++ b/app/components/UI/AssetOverview/AssetOverview.tsx @@ -114,6 +114,7 @@ import { selectPerpsEnabledFlag } from '../Perps'; import { usePerpsMarketForAsset } from '../Perps/hooks/usePerpsMarketForAsset'; import PerpsDiscoveryBanner from '../Perps/components/PerpsDiscoveryBanner'; import { PerpsEventValues } from '../Perps/constants/eventNames'; +import { isTokenTrustworthyForPerps } from '../Perps/constants/perpsConfig'; import DSText, { TextVariant, } from '../../../component-library/components/Texts/Text'; @@ -312,6 +313,9 @@ const AssetOverview: React.FC = ({ isPerpsEnabled ? asset.symbol : null, ); + // Check if token is trustworthy for showing Perps banner + const isTokenTrustworthy = isTokenTrustworthyForPerps(asset); + const { styles } = useStyles(styleSheet, {}); const dispatch = useDispatch(); @@ -857,21 +861,24 @@ const AssetOverview: React.FC = ({ )} - {isPerpsEnabled && hasPerpsMarket && marketData && ( - <> - - - {strings('asset_overview.perps_position')} - - - - - )} + {isPerpsEnabled && + hasPerpsMarket && + marketData && + isTokenTrustworthy && ( + <> + + + {strings('asset_overview.perps_position')} + + + + + )} diff --git a/app/components/UI/AssetOverview/Balance/Balance.tsx b/app/components/UI/AssetOverview/Balance/Balance.tsx index 5e7554f8a6ed..b38669ef6744 100644 --- a/app/components/UI/AssetOverview/Balance/Balance.tsx +++ b/app/components/UI/AssetOverview/Balance/Balance.tsx @@ -202,8 +202,9 @@ const Balance = ({ navigation.navigate('AssetDetails', { chainId: asset.chainId, address: asset.address, + asset, }), - [asset.address, asset.chainId, asset.isNative, navigation], + [asset, navigation], ); const label = asset.accountType diff --git a/app/components/UI/Perps/constants/perpsConfig.test.ts b/app/components/UI/Perps/constants/perpsConfig.test.ts new file mode 100644 index 000000000000..55e2fbb993ac --- /dev/null +++ b/app/components/UI/Perps/constants/perpsConfig.test.ts @@ -0,0 +1,115 @@ +import { + PERPS_MIN_AGGREGATORS_FOR_TRUST, + isTokenTrustworthyForPerps, +} from './perpsConfig'; + +describe('isTokenTrustworthyForPerps', () => { + describe('native assets', () => { + it('returns true for native asset (isNative: true)', () => { + const asset = { + isNative: true, + isETH: false, + aggregators: [], + }; + + expect(isTokenTrustworthyForPerps(asset)).toBe(true); + }); + + it('returns true for ETH asset (isETH: true)', () => { + const asset = { + isNative: false, + isETH: true, + aggregators: [], + }; + + expect(isTokenTrustworthyForPerps(asset)).toBe(true); + }); + + it('returns true for native asset even with no aggregators', () => { + const asset = { + isNative: true, + aggregators: [], + }; + + expect(isTokenTrustworthyForPerps(asset)).toBe(true); + }); + }); + + describe('non-native assets with aggregators', () => { + it('returns true when aggregators count equals minimum threshold', () => { + const asset = { + isNative: false, + isETH: false, + aggregators: Array(PERPS_MIN_AGGREGATORS_FOR_TRUST).fill('exchange'), + }; + + expect(isTokenTrustworthyForPerps(asset)).toBe(true); + }); + + it('returns true when aggregators count exceeds minimum threshold', () => { + const asset = { + isNative: false, + isETH: false, + aggregators: ['CoinGecko', 'CoinMarketCap', 'Uniswap'], + }; + + expect(isTokenTrustworthyForPerps(asset)).toBe(true); + }); + + it('returns false when aggregators count is below minimum threshold', () => { + const asset = { + isNative: false, + isETH: false, + aggregators: ['CoinGecko'], // Only 1 + }; + + expect(isTokenTrustworthyForPerps(asset)).toBe(false); + }); + + it('returns false when aggregators is empty', () => { + const asset = { + isNative: false, + isETH: false, + aggregators: [], + }; + + expect(isTokenTrustworthyForPerps(asset)).toBe(false); + }); + }); + + describe('edge cases', () => { + it('handles undefined aggregators', () => { + const asset = { + isNative: false, + isETH: false, + aggregators: undefined, + }; + + expect(isTokenTrustworthyForPerps(asset)).toBe(false); + }); + + it('handles missing properties', () => { + const asset = {}; + + expect(isTokenTrustworthyForPerps(asset)).toBe(false); + }); + + it('handles asset with only aggregators property', () => { + const asset = { + aggregators: ['CoinGecko', 'CoinMarketCap'], + }; + + expect(isTokenTrustworthyForPerps(asset)).toBe(true); + }); + }); +}); + +describe('PERPS_MIN_AGGREGATORS_FOR_TRUST', () => { + it('is defined and is a number', () => { + expect(typeof PERPS_MIN_AGGREGATORS_FOR_TRUST).toBe('number'); + }); + + it('equals 2', () => { + expect(PERPS_MIN_AGGREGATORS_FOR_TRUST).toBe(2); + }); +}); diff --git a/app/components/UI/Perps/constants/perpsConfig.ts b/app/components/UI/Perps/constants/perpsConfig.ts index 95604eac4579..51d5e6ea5ab6 100644 --- a/app/components/UI/Perps/constants/perpsConfig.ts +++ b/app/components/UI/Perps/constants/perpsConfig.ts @@ -1,3 +1,5 @@ +import { TokenI } from '../../Tokens/types'; + /** * Perps feature constants */ @@ -64,6 +66,29 @@ export const METAMASK_FEE_CONFIG = { // which returns complete fee breakdown including MetaMask fees } as const; +/** + * Minimum number of aggregators (exchanges) a token must be listed on + * to be considered trustworthy for showing the Perps Discovery Banner. + * Native tokens (ETH, BNB, etc.) bypass this check. + */ +export const PERPS_MIN_AGGREGATORS_FOR_TRUST = 2; + +/** + * Checks if an asset is trustworthy for displaying the Perps Discovery Banner. + * An asset is considered trustworthy if: + * - It is a native asset (ETH, BNB, SOL, etc.), OR + * - It is listed on at least PERPS_MIN_AGGREGATORS_FOR_TRUST exchanges + * + * @param asset - Asset object (TokenI or partial TokenI) + * @returns true if the asset is trustworthy, false otherwise + */ +export const isTokenTrustworthyForPerps = (asset: Partial): boolean => { + const isNativeAsset = asset.isNative || asset.isETH; + const hasEnoughAggregators = + (asset.aggregators?.length ?? 0) >= PERPS_MIN_AGGREGATORS_FOR_TRUST; + return isNativeAsset || hasEnoughAggregators; +}; + /** * Validation thresholds for UI warnings and checks * These values control when warnings are shown to users diff --git a/app/components/Views/AssetDetails/index.tsx b/app/components/Views/AssetDetails/index.tsx index 41719ed88e75..5c45ff4797e0 100644 --- a/app/components/Views/AssetDetails/index.tsx +++ b/app/components/Views/AssetDetails/index.tsx @@ -69,6 +69,7 @@ import { selectPerpsEnabledFlag } from '../../UI/Perps'; import { usePerpsMarketForAsset } from '../../UI/Perps/hooks/usePerpsMarketForAsset'; import PerpsDiscoveryBanner from '../../UI/Perps/components/PerpsDiscoveryBanner'; import { PerpsEventValues } from '../../UI/Perps/constants/eventNames'; +import { isTokenTrustworthyForPerps } from '../../UI/Perps/constants/perpsConfig'; import type { PerpsNavigationParamList } from '../../UI/Perps/types/navigation'; // Inline header styles @@ -207,6 +208,9 @@ const AssetDetails = (props: InnerProps) => { isPerpsEnabled ? symbol : null, ); + // Check if token is trustworthy for showing Perps banner + const isTokenTrustworthy = isTokenTrustworthyForPerps(token); + // Handler for perps discovery banner press // Analytics (PERPS_SCREEN_VIEWED) tracked by PerpsMarketDetailsView on mount const handlePerpsDiscoveryPress = useCallback(() => { @@ -461,18 +465,21 @@ const AssetDetails = (props: InnerProps) => { {renderTokenSymbol()} {renderSectionTitle(strings('asset_details.amount'))} {renderTokenBalance()} - {/* Perps Discovery Banner - show when perps market exists for this asset */} - {isPerpsEnabled && hasPerpsMarket && marketData && ( - <> - {renderSectionTitle(strings('asset_details.perps_trading'))} - - - )} + {/* Perps Discovery Banner - show when perps market exists and token is trustworthy */} + {isPerpsEnabled && + hasPerpsMarket && + marketData && + isTokenTrustworthy && ( + <> + {renderSectionTitle(strings('asset_details.perps_trading'))} + + + )} {renderSectionTitle(strings('asset_details.address'))} {renderTokenAddressLink()} {renderSectionTitle(strings('asset_details.decimal'))} @@ -528,6 +535,8 @@ const AssetDetailsContainer = (props: Props) => { aggregators: asset.aggregators || [], name: asset.name, image: asset.image, + isNative: asset.isNative, + isETH: asset.isETH, // Add other required fields with defaults isERC721: false, } as TokenType; From 6cd0bbf0916782f1ca4a31c6d48b7d7ba3dcc74f Mon Sep 17 00:00:00 2001 From: "runway-github[bot]" <73448015+runway-github[bot]@users.noreply.github.com> Date: Mon, 26 Jan 2026 18:08:06 +0000 Subject: [PATCH 16/80] chore(runway): cherry-pick fix: [Explore] search text is invisible on android cp-7.63.0 (#25191) - fix: [Explore] search text is invisible on android cp-7.63.0 (#25180) ## **Description** Typing any text in the search bar of Explore is not visible on Android, this PR fixes this by changing the text color so that it is correctly picked up. Furthermore I have added some top margin for the search bar since it was too close to the top on android ## **Changelog** CHANGELOG entry: fix text invisible when searching on explore (Android) ## **Related issues** Fixes: https://github.com/MetaMask/metamask-mobile/issues/25115 & https://consensyssoftware.atlassian.net/browse/ASSETS-2536 ## **Manual testing steps** ```gherkin Feature: my feature name Scenario: user [verb for user action] Given [describe expected initial app state] When user [verb for user action] Then [describe expected outcome] ``` ## **Screenshots/Recordings** ### **Before** No placeholder or text can be seen https://github.com/user-attachments/assets/b39bc0e3-0c3c-4dc5-b2bf-45088364849e ### **After** It looks slow cause my laptop is currently running quite slow https://github.com/user-attachments/assets/5fba7ec4-b156-4fe6-9940-c1734dd80f0b ## **Pre-merge author checklist** - [ ] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile Coding Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md). - [ ] I've completed the PR template to the best of my ability - [ ] I've included tests if applicable - [ ] I've documented my code using [JSDoc](https://jsdoc.app/) format if applicable - [ ] I've applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors. ## **Pre-merge reviewer checklist** - [ ] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [ ] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots. --- > [!NOTE] > - Updates `ExploreSearchBar.tsx` to use `colors.text.muted` for `placeholderTextColor` and `text-base` input style for clearer search text rendering. > - Adds Android-only extra top padding (`+16`) in `ExploreSearchScreen.tsx` to improve spacing near the status bar. > > Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 14c161610afadb4b1b475a8748ad3a2aafb52535. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot). [6d470fc](https://github.com/MetaMask/metamask-mobile/commit/6d470fc1db8e0d282bb45e96b44eb9b47e2fc4e4) Co-authored-by: Juanmi <95381763+juanmigdr@users.noreply.github.com> --- .../Views/ExploreSearchScreen/ExploreSearchScreen.tsx | 7 +++++-- .../components/ExploreSearchBar/ExploreSearchBar.tsx | 4 ++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/app/components/Views/TrendingView/Views/ExploreSearchScreen/ExploreSearchScreen.tsx b/app/components/Views/TrendingView/Views/ExploreSearchScreen/ExploreSearchScreen.tsx index 728184570197..98e832fa7104 100644 --- a/app/components/Views/TrendingView/Views/ExploreSearchScreen/ExploreSearchScreen.tsx +++ b/app/components/Views/TrendingView/Views/ExploreSearchScreen/ExploreSearchScreen.tsx @@ -1,5 +1,5 @@ import React, { useState, useCallback } from 'react'; -import { Keyboard } from 'react-native'; +import { Keyboard, Platform } from 'react-native'; import { useSafeAreaInsets } from 'react-native-safe-area-context'; import { useNavigation } from '@react-navigation/native'; import { Box } from '@metamask/design-system-react-native'; @@ -20,7 +20,10 @@ const ExploreSearchScreen: React.FC = () => { }, [navigation]); return ( - + = (props) => { value={props.searchQuery} onChangeText={props.onSearchChange} placeholder={placeholder} - placeholderTextColor={colors.text.alternative} - style={tw.style('flex-1 text-body-md leading-0 text-default')} + placeholderTextColor={colors.text.muted} + style={tw.style('flex-1 text-base text-default')} testID="explore-view-search-input" autoFocus={props.type === 'interactive'} autoCapitalize="none" From 4fa454fa7a7579a4eb452c3c68a4dc6970bdea2f Mon Sep 17 00:00:00 2001 From: "runway-github[bot]" <73448015+runway-github[bot]@users.noreply.github.com> Date: Mon, 26 Jan 2026 18:53:48 +0000 Subject: [PATCH 17/80] chore(runway): cherry-pick fix: [Explore] design issues cp-7.63.0 (#25193) - fix: [Explore] design issues cp-7.63.0 (#25165) ## **Description** Solved multiple bugs: - [Explore] Arrow in subheads should be near titles and remove "View More". Design is dark screen attached. - [Explore] Rename "Tokens" to "Trending tokens" - [Explore] Button corner radius for button row should be 12px, not 16px. ## **Changelog** CHANGELOG entry: solved multiple design issues in trending ## **Related issues** Fixes: https://consensyssoftware.atlassian.net/browse/ASSETS-2540 & https://consensyssoftware.atlassian.net/browse/ASSETS-2541 & https://consensyssoftware.atlassian.net/browse/ASSETS-2542 ## **Manual testing steps** ```gherkin Feature: my feature name Scenario: user [verb for user action] Given [describe expected initial app state] When user [verb for user action] Then [describe expected outcome] ``` ## **Screenshots/Recordings** ### **Before** ### **After** https://github.com/user-attachments/assets/67338a81-72e2-459d-afb9-72ccdd931306 ## **Pre-merge author checklist** - [ ] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile Coding Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md). - [ ] I've completed the PR template to the best of my ability - [ ] I've included tests if applicable - [ ] I've documented my code using [JSDoc](https://jsdoc.app/) format if applicable - [ ] I've applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors. ## **Pre-merge reviewer checklist** - [ ] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [ ] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots. --- > [!NOTE] > Implements design tweaks for Explore/Trending. > > - SectionHeader: header is now a `TouchableOpacity` that triggers `viewAllAction`; shows title with right arrow; removes separate "View all" text/button while keeping `testID` prefix `section-header-view-all-...` > - Rename "Tokens" to `trending.trending_tokens` ("Trending tokens") in `sections.config.tsx`, tests, e2e selectors/mappings, and `en.json` > - QuickActions: change chip style from `rounded-2xl` to `rounded-xl` (12px) > - Updated unit/e2e tests and selectors to align with new titles and header interaction > > Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit d51db7693dc2b66c16be53c6efc987082414b13f. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot). [b7e231d](https://github.com/MetaMask/metamask-mobile/commit/b7e231dc9d747478446ecf0935fb188e335c8152) Co-authored-by: Juanmi <95381763+juanmigdr@users.noreply.github.com> --- .../ExploreSearchResults.test.tsx | 4 +- .../components/QuickActions/QuickActions.tsx | 2 +- .../SectionHeader/SectionHeader.test.tsx | 17 ++++----- .../SectionHeader/SectionHeader.tsx | 38 +++++++++---------- .../Views/TrendingView/sections.config.tsx | 2 +- e2e/pages/Trending/TrendingView.ts | 8 ++-- .../Trending/TrendingView.selectors.ts | 5 +-- locales/languages/en.json | 2 - 8 files changed, 34 insertions(+), 44 deletions(-) diff --git a/app/components/Views/TrendingView/components/ExploreSearchResults/ExploreSearchResults.test.tsx b/app/components/Views/TrendingView/components/ExploreSearchResults/ExploreSearchResults.test.tsx index 0a1c0a150aee..e2751674596a 100644 --- a/app/components/Views/TrendingView/components/ExploreSearchResults/ExploreSearchResults.test.tsx +++ b/app/components/Views/TrendingView/components/ExploreSearchResults/ExploreSearchResults.test.tsx @@ -104,7 +104,7 @@ describe('ExploreSearchResults', () => { ); expect(getByTestId('trending-search-results-list')).toBeDefined(); - expect(getByText('Tokens')).toBeDefined(); + expect(getByText('Trending tokens')).toBeDefined(); expect(getByText('Perps')).toBeDefined(); expect(getByText('Predictions')).toBeDefined(); }); @@ -129,7 +129,7 @@ describe('ExploreSearchResults', () => { , ); - expect(getByText('Tokens')).toBeDefined(); + expect(getByText('Trending tokens')).toBeDefined(); expect(queryByText('Perps')).toBeNull(); expect(queryByText('Predictions')).toBeNull(); }); diff --git a/app/components/Views/TrendingView/components/QuickActions/QuickActions.tsx b/app/components/Views/TrendingView/components/QuickActions/QuickActions.tsx index b9c4587a2d27..1d3fba1d54d2 100644 --- a/app/components/Views/TrendingView/components/QuickActions/QuickActions.tsx +++ b/app/components/Views/TrendingView/components/QuickActions/QuickActions.tsx @@ -45,7 +45,7 @@ const QuickActions: React.FC = ({ emptySections }) => { onPress={() => section.viewAllAction(navigation)} testID={`quick-action-${section.id}`} style={tw.style( - 'flex-row items-center justify-center gap-1 rounded-2xl bg-background-section px-3 py-2', + 'flex-row items-center justify-center gap-1 rounded-xl bg-background-section px-3 py-2', )} > { jest.clearAllMocks(); }); - it('renders title and view all text for predictions section', () => { + it('renders title for predictions section', () => { const { getByText } = renderWithProvider( , { state: initialState }, ); expect(getByText('Predictions')).toBeOnTheScreen(); - expect(getByText('View all')).toBeOnTheScreen(); }); - it('renders title and view all text for tokens section', () => { + it('renders title for tokens section', () => { const { getByText } = renderWithProvider( , { state: initialState }, ); - expect(getByText('Tokens')).toBeOnTheScreen(); - expect(getByText('View all')).toBeOnTheScreen(); + expect(getByText('Trending tokens')).toBeOnTheScreen(); }); - it('renders title and view all text for perps section', () => { + it('renders title for perps section', () => { const { getByText } = renderWithProvider( , { state: initialState }, ); expect(getByText('Perps')).toBeOnTheScreen(); - expect(getByText('View all')).toBeOnTheScreen(); }); - it('calls navigation action when view all button is pressed', () => { - const { getByText } = renderWithProvider( + it('calls navigation action when header is pressed', () => { + const { getByTestId } = renderWithProvider( , { state: initialState }, ); - fireEvent.press(getByText('View all')); + fireEvent.press(getByTestId('section-header-view-all-perps')); expect(mockNavigate).toHaveBeenCalledTimes(1); }); diff --git a/app/components/Views/TrendingView/components/SectionHeader/SectionHeader.tsx b/app/components/Views/TrendingView/components/SectionHeader/SectionHeader.tsx index 5f24a814a8fa..a6ebbc537d13 100644 --- a/app/components/Views/TrendingView/components/SectionHeader/SectionHeader.tsx +++ b/app/components/Views/TrendingView/components/SectionHeader/SectionHeader.tsx @@ -3,18 +3,16 @@ import { TouchableOpacity } from 'react-native'; import { useTailwind } from '@metamask/design-system-twrnc-preset'; import { Box, - BoxFlexDirection, - BoxAlignItems, - BoxJustifyContent, + Text, + TextVariant, + TextColor, Icon, IconName, IconSize, IconColor, - Text, - TextVariant, - TextColor, + BoxFlexDirection, + BoxAlignItems, } from '@metamask/design-system-react-native'; -import { strings } from '../../../../../../locales/i18n'; import { SectionId, SECTIONS_CONFIG } from '../../sections.config'; import { useNavigation } from '@react-navigation/native'; @@ -35,28 +33,26 @@ const SectionHeader: React.FC = ({ sectionId }) => { const sectionConfig = SECTIONS_CONFIG[sectionId]; return ( - sectionConfig.viewAllAction(navigation)} > - {sectionConfig.title} - sectionConfig.viewAllAction(navigation)} - style={tw.style('flex-row items-center justify-center gap-1')} + - - {strings('trending.view_all')} + + {sectionConfig.title} - - + + ); }; diff --git a/app/components/Views/TrendingView/sections.config.tsx b/app/components/Views/TrendingView/sections.config.tsx index 04bac24810f7..265d5c60d4f3 100644 --- a/app/components/Views/TrendingView/sections.config.tsx +++ b/app/components/Views/TrendingView/sections.config.tsx @@ -126,7 +126,7 @@ const PREDICTIONS_FUSE_OPTIONS: FuseOptions = { export const SECTIONS_CONFIG: Record = { tokens: { id: 'tokens', - title: strings('trending.tokens'), + title: strings('trending.trending_tokens'), icon: IconName.Ethereum, viewAllAction: (navigation) => { navigation.navigate(Routes.WALLET.TRENDING_TOKENS_FULL_VIEW); diff --git a/e2e/pages/Trending/TrendingView.ts b/e2e/pages/Trending/TrendingView.ts index 4d2556c2e78b..531be6602a93 100644 --- a/e2e/pages/Trending/TrendingView.ts +++ b/e2e/pages/Trending/TrendingView.ts @@ -133,7 +133,7 @@ class TrendingView { */ private getSectionId(sectionTitle: string): string { const sectionIdMap: Record = { - Tokens: 'tokens', + 'Trending tokens': 'tokens', Sites: 'sites', Predictions: 'predictions', Perps: 'perps', @@ -192,11 +192,11 @@ class TrendingView { `section-header-view-all-${id}`, ); - // Determine scroll direction: Predictions and Tokens are usually near top - // But scrollToElement can handle both directions, so we try 'down' first + // Determine scroll direction: Predictions and Trending tokens are usually near top + // But scrollToElement can handle both directions, so we try 'up' first for top sections // and it will automatically adjust if needed const direction = - sectionTitle === 'Predictions' || sectionTitle === 'Tokens' + sectionTitle === 'Predictions' || sectionTitle === 'Trending tokens' ? 'up' : 'down'; diff --git a/e2e/selectors/Trending/TrendingView.selectors.ts b/e2e/selectors/Trending/TrendingView.selectors.ts index 6111ae7243dc..5a61cbd9c2ed 100644 --- a/e2e/selectors/Trending/TrendingView.selectors.ts +++ b/e2e/selectors/Trending/TrendingView.selectors.ts @@ -19,10 +19,9 @@ export const TrendingViewSelectorsIDs = { } as const; export const TrendingViewSelectorsText = { - VIEW_ALL: 'View all', - // Section titles might vary by localization, but these are for logical mapping + // Section titles - must match the actual localized strings from sections.config.tsx SECTION_PREDICTIONS: 'Predictions', - SECTION_TOKENS: 'Tokens', + SECTION_TOKENS: 'Trending tokens', SECTION_PERPS: 'Perps', SECTION_SITES: 'Sites', } as const; diff --git a/locales/languages/en.json b/locales/languages/en.json index d71ed984fcba..e2a2b5895a40 100644 --- a/locales/languages/en.json +++ b/locales/languages/en.json @@ -7361,8 +7361,6 @@ }, "trending": { "title": "Explore", - "view_all": "View all", - "tokens": "Tokens", "trending_tokens": "Trending tokens", "price_change": "Price change", "all_networks": "All networks", From 1b2131306116e6a882e390de0b0ab0a218e1c0a2 Mon Sep 17 00:00:00 2001 From: metamaskbot Date: Mon, 26 Jan 2026 18:55:19 +0000 Subject: [PATCH 18/80] [skip ci] Bump version number to 3547 --- android/app/build.gradle | 2 +- bitrise.yml | 4 ++-- ios/MetaMask.xcodeproj/project.pbxproj | 12 ++++++------ 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 98e4ddf027d3..0e83a7577017 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -188,7 +188,7 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion versionName "7.63.0" - versionCode 3545 + versionCode 3547 testBuildType System.getProperty('testBuildType', 'debug') testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" manifestPlaceholders.MM_BRANCH_KEY_TEST = "$System.env.MM_BRANCH_KEY_TEST" diff --git a/bitrise.yml b/bitrise.yml index d10f378c6ddd..7bd44ca0f100 100644 --- a/bitrise.yml +++ b/bitrise.yml @@ -3472,13 +3472,13 @@ app: VERSION_NAME: 7.63.0 - opts: is_expand: false - VERSION_NUMBER: 3545 + VERSION_NUMBER: 3547 - opts: is_expand: false FLASK_VERSION_NAME: 7.63.0 - opts: is_expand: false - FLASK_VERSION_NUMBER: 3545 + FLASK_VERSION_NUMBER: 3547 - opts: is_expand: false ANDROID_APK_LINK: '' diff --git a/ios/MetaMask.xcodeproj/project.pbxproj b/ios/MetaMask.xcodeproj/project.pbxproj index 5a02a7bd9138..118684bdf4e8 100644 --- a/ios/MetaMask.xcodeproj/project.pbxproj +++ b/ios/MetaMask.xcodeproj/project.pbxproj @@ -1281,7 +1281,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3545; + CURRENT_PROJECT_VERSION = 3547; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 48XVW22RCG; @@ -1350,7 +1350,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3545; + CURRENT_PROJECT_VERSION = 3547; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 48XVW22RCG; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 48XVW22RCG; @@ -1416,7 +1416,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3545; + CURRENT_PROJECT_VERSION = 3547; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 48XVW22RCG; @@ -1483,7 +1483,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3545; + CURRENT_PROJECT_VERSION = 3547; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 48XVW22RCG; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 48XVW22RCG; @@ -1646,7 +1646,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3545; + CURRENT_PROJECT_VERSION = 3547; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 48XVW22RCG; @@ -1716,7 +1716,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3545; + CURRENT_PROJECT_VERSION = 3547; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 48XVW22RCG; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 48XVW22RCG; From 655dac36901c29eba0101fc3c5d34e17054a4da9 Mon Sep 17 00:00:00 2001 From: "runway-github[bot]" <73448015+runway-github[bot]@users.noreply.github.com> Date: Mon, 26 Jan 2026 20:28:57 +0000 Subject: [PATCH 19/80] chore(runway): cherry-pick fix(predict): cp-7.63.0 override team colors for Super Bowl (#25208) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - fix(predict): cp-7.63.0 override team colors for Super Bowl (#25204) ## **Description** Override team colors for Super Bowl teams to ensure correct branding display. The Polymarket API returns incorrect team colors for the New England Patriots and Seattle Seahawks, so we apply manual overrides when caching team data. **Changes:** - Added `TEAM_COLOR_OVERRIDES` constant with corrected colors for NE (Patriots blue) and SEA (Seahawks green) - Applied color overrides during team cache population ## **Changelog** CHANGELOG entry: null ## **Related issues** Fixes: https://consensyssoftware.atlassian.net/browse/PRED-545 ## **Manual testing steps** ```gherkin Feature: Predict team colors display Scenario: user views Super Bowl market with correct team colors Given user has navigated to a Super Bowl prediction market When user views the market details Then Patriots (NE) should display with color #1D4E9B And Seahawks (SEA) should display with color #69BE28 ``` ## **Screenshots/Recordings** ### **Before** ### **After** Screenshot 2026-01-26 at 9 50 42 AM Screenshot 2026-01-26 at 9 50 29 AM ## **Pre-merge author checklist** - [x] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile Coding Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md). - [x] I've completed the PR template to the best of my ability - [x] I've included tests if applicable - [x] I've documented my code using [JSDoc](https://jsdoc.app/) format if applicable - [x] I've applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors. ## **Pre-merge reviewer checklist** - [ ] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [ ] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots. --- > [!NOTE] > Ensures correct branding colors for specific teams when ingesting Polymarket data. > > - Adds `TEAM_COLOR_OVERRIDES` with NE `#1D4E9B` and SEA `#69BE28` > - Applies overrides in `TeamsCache.fetchAndCacheTeams` before storing teams in cache > > Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 4640b4412fbb0b376594e2f3ac237d7a7c46c92d. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot). [903f214](https://github.com/MetaMask/metamask-mobile/commit/903f21498ecdd8ad40c068e1539dc3c43ff3d289) Co-authored-by: Luis Taniça --- .../UI/Predict/providers/polymarket/TeamsCache.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/components/UI/Predict/providers/polymarket/TeamsCache.ts b/app/components/UI/Predict/providers/polymarket/TeamsCache.ts index ac29fcc050bf..a1d09d9966fa 100644 --- a/app/components/UI/Predict/providers/polymarket/TeamsCache.ts +++ b/app/components/UI/Predict/providers/polymarket/TeamsCache.ts @@ -1,9 +1,15 @@ +/* eslint-disable @metamask/design-tokens/color-no-hex */ import DevLogger from '../../../../../core/SDKConnect/utils/DevLogger'; import Logger from '../../../../../util/Logger'; import { PredictSportsLeague } from '../../types'; import { PolymarketApiTeam } from './types'; import { getPolymarketEndpoints } from './utils'; +const TEAM_COLOR_OVERRIDES: Record = { + ne: '#1D4E9B', + sea: '#69BE28', +}; + export class TeamsCache { private static instance: TeamsCache | null = null; private cache: Map> = @@ -113,6 +119,7 @@ export class TeamsCache { for (const team of teams) { if (team.abbreviation) { + team.color = TEAM_COLOR_OVERRIDES[team.abbreviation] ?? team.color; leagueCache.set(team.abbreviation.toLowerCase(), team); } } From 687b3e26c3cddb8fe940eadedd6eef53adbbc9c1 Mon Sep 17 00:00:00 2001 From: "runway-github[bot]" <73448015+runway-github[bot]@users.noreply.github.com> Date: Mon, 26 Jan 2026 20:31:56 +0000 Subject: [PATCH 20/80] chore(runway): cherry-pick fix(predict): cp-7.63.0 override Super Bowl event title (#25217) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - fix(predict): cp-7.63.0 override Super Bowl event title (#25206) ## **Description** Temporarily overrides the title for Super Bowl LX event (ID: 188978) in Polymarket to display "Super Bowl LX" instead of the original title from the API. This is a targeted fix for the Super Bowl event display in the Predict feature. ## **Changelog** CHANGELOG entry: null ## **Related issues** Fixes: https://consensyssoftware.atlassian.net/browse/PRED-549 ## **Manual testing steps** ```gherkin Feature: Super Bowl event title display Scenario: user views Super Bowl LX event Given user has access to Predict feature And the Polymarket events are loaded When user views the Super Bowl LX event (ID: 188978) Then the event title displays as "Super Bowl LX" ``` ## **Screenshots/Recordings** ### **Before** N/A ### **After** Screenshot 2026-01-26 at 10 55 15 AM ## **Pre-merge author checklist** - [x] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile Coding Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md). - [x] I've completed the PR template to the best of my ability - [x] I've included tests if applicable - [x] I've documented my code using [JSDoc](https://jsdoc.app/) format if applicable - [x] I've applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors. ## **Pre-merge reviewer checklist** - [ ] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [ ] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots. --- > [!NOTE] > Ensures correct display of the Super Bowl event name in Predict. > > - In `utils.ts` (`parsePolymarketEvents`), overrides `title` to "Super Bowl LX" when `event.id === '188978'` (temporary fix) > > Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 7e14b210e51d692e5be3aa796d556b594f36ed84. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot). [ffa928d](https://github.com/MetaMask/metamask-mobile/commit/ffa928df484ef53988acc0015e11335960e38ffb) Co-authored-by: Luis Taniça --- app/components/UI/Predict/providers/polymarket/utils.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/components/UI/Predict/providers/polymarket/utils.ts b/app/components/UI/Predict/providers/polymarket/utils.ts index d3470acb9f72..7fe21a6fece1 100644 --- a/app/components/UI/Predict/providers/polymarket/utils.ts +++ b/app/components/UI/Predict/providers/polymarket/utils.ts @@ -659,7 +659,8 @@ export const parsePolymarketEvents = ( id: event.id, slug: event.slug, providerId: 'polymarket', - title: event.title, + // TODO: remove this temporary fix for Super Bowl LX + title: event.id === '188978' ? 'Super Bowl LX' : event.title, description: event.description, image: event.icon, status: event.closed From 61472663abde4377ed98ff1fe4589cf130997b03 Mon Sep 17 00:00:00 2001 From: metamaskbot Date: Mon, 26 Jan 2026 20:33:25 +0000 Subject: [PATCH 21/80] [skip ci] Bump version number to 3549 --- android/app/build.gradle | 2 +- bitrise.yml | 4 ++-- ios/MetaMask.xcodeproj/project.pbxproj | 12 ++++++------ 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 0e83a7577017..dfc56f8b9fe7 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -188,7 +188,7 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion versionName "7.63.0" - versionCode 3547 + versionCode 3549 testBuildType System.getProperty('testBuildType', 'debug') testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" manifestPlaceholders.MM_BRANCH_KEY_TEST = "$System.env.MM_BRANCH_KEY_TEST" diff --git a/bitrise.yml b/bitrise.yml index 7bd44ca0f100..7214a9cda901 100644 --- a/bitrise.yml +++ b/bitrise.yml @@ -3472,13 +3472,13 @@ app: VERSION_NAME: 7.63.0 - opts: is_expand: false - VERSION_NUMBER: 3547 + VERSION_NUMBER: 3549 - opts: is_expand: false FLASK_VERSION_NAME: 7.63.0 - opts: is_expand: false - FLASK_VERSION_NUMBER: 3547 + FLASK_VERSION_NUMBER: 3549 - opts: is_expand: false ANDROID_APK_LINK: '' diff --git a/ios/MetaMask.xcodeproj/project.pbxproj b/ios/MetaMask.xcodeproj/project.pbxproj index 118684bdf4e8..1c7dc8823d26 100644 --- a/ios/MetaMask.xcodeproj/project.pbxproj +++ b/ios/MetaMask.xcodeproj/project.pbxproj @@ -1281,7 +1281,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3547; + CURRENT_PROJECT_VERSION = 3549; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 48XVW22RCG; @@ -1350,7 +1350,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3547; + CURRENT_PROJECT_VERSION = 3549; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 48XVW22RCG; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 48XVW22RCG; @@ -1416,7 +1416,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3547; + CURRENT_PROJECT_VERSION = 3549; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 48XVW22RCG; @@ -1483,7 +1483,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3547; + CURRENT_PROJECT_VERSION = 3549; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 48XVW22RCG; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 48XVW22RCG; @@ -1646,7 +1646,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3547; + CURRENT_PROJECT_VERSION = 3549; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 48XVW22RCG; @@ -1716,7 +1716,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3547; + CURRENT_PROJECT_VERSION = 3549; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 48XVW22RCG; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 48XVW22RCG; From 9d961dfdab73bf8fdcb76d8657ff2aa9bfc06ecc Mon Sep 17 00:00:00 2001 From: "runway-github[bot]" <73448015+runway-github[bot]@users.noreply.github.com> Date: Mon, 26 Jan 2026 22:14:13 +0000 Subject: [PATCH 22/80] chore(runway): cherry-pick fix(predict): cp-7.63.0 compact game card in explore tab (#25224) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - fix(predict): cp-7.63.0 compact game card in explore tab (#25212) ## **Description** This PR makes the PredictMarketSportCard display a more compact UI when used in the carousel (Explore tab), consistent with other predict market card types. **Changes:** - Buttons use `ButtonBaseSize.Md` when in carousel mode (making them smaller/more compact) - Picks/positions are hidden when in carousel mode (reducing visual clutter) - Backward compatible: non-carousel usage remains unchanged ## **Changelog** CHANGELOG entry: null ## **Related issues** Fixes: https://consensyssoftware.atlassian.net/browse/PRED-543 ## **Manual testing steps** ```gherkin Feature: Compact PredictMarketSportCard in Carousel Scenario: User views sport prediction card in Explore carousel Given the user is on the Explore tab And a sport prediction market is displayed in the carousel When user views the PredictMarketSportCard Then the buttons should appear at medium size (smaller than normal) And no picks/positions should be displayed Scenario: User views sport prediction card outside carousel Given the user navigates to the Predict feed And a sport prediction market is displayed When user views the PredictMarketSportCard Then the buttons should appear at normal size And picks/positions should display if user has any ``` ## **Screenshots/Recordings** ### **Before** ### **After** Screenshot 2026-01-26 at 11 23 55 AM ## **Pre-merge author checklist** - [x] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile Coding Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md). - [x] I've completed the PR template to the best of my ability - [ ] I've included tests if applicable - [x] I've documented my code using [JSDoc](https://jsdoc.app/) format if applicable - [x] I've applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors. ## **Pre-merge reviewer checklist** - [ ] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [ ] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots. --- > [!NOTE] > Implements a compact layout for Predict sport market cards when rendered in the Explore carousel. > > - Propagates `isCarousel` through `PredictMarket` → `PredictMarketSportCard`/`PredictSportCardFooter` → `PredictActionButtons`/`PredictBetButtons` > - Sets bet buttons to `ButtonBaseSize.Md` in carousel; hides picks/positions (`PredictPicksForCard`) when in carousel > - Adjusts navigation for bet flow when in carousel to route via `Routes.PREDICT.ROOT` and allows bet buttons even if user has positions > - Minor UI tweaks: remove vertical margin in carousel and use `rounded-[16px]` on card container > > Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 05d578ec1f212a797a48acddb8ba289fffeaff32. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot). [bbffe08](https://github.com/MetaMask/metamask-mobile/commit/bbffe089afbba3dea30fe5b0dcde5c8ff84b8e0b) Co-authored-by: Luis Taniça --- .../PredictActionButtons.tsx | 2 ++ .../PredictActionButtons.types.ts | 4 ++++ .../PredictActionButtons/PredictBetButton.tsx | 4 +++- .../PredictBetButtons.tsx | 9 +++++++- .../PredictMarket/PredictMarket.tsx | 1 + .../PredictMarketSportCard.tsx | 7 ++++-- .../PredictSportCardFooter.tsx | 23 +++++++++++++++---- 7 files changed, 42 insertions(+), 8 deletions(-) diff --git a/app/components/UI/Predict/components/PredictActionButtons/PredictActionButtons.tsx b/app/components/UI/Predict/components/PredictActionButtons/PredictActionButtons.tsx index a601facd9af9..07babea75a5f 100644 --- a/app/components/UI/Predict/components/PredictActionButtons/PredictActionButtons.tsx +++ b/app/components/UI/Predict/components/PredictActionButtons/PredictActionButtons.tsx @@ -15,6 +15,7 @@ const PredictActionButtons: React.FC = ({ claimableAmount = 0, isLoading = false, testID = 'predict-action-buttons', + isCarousel, }) => { const isGameMarket = Boolean(market.game); const isMarketOpen = market.status === PredictMarketStatus.OPEN; @@ -94,6 +95,7 @@ const PredictActionButtons: React.FC = ({ yesTeamColor={buttonConfig.yesTeamColor} noTeamColor={buttonConfig.noTeamColor} testID={`${testID}-bet`} + isCarousel={isCarousel} /> ); diff --git a/app/components/UI/Predict/components/PredictActionButtons/PredictActionButtons.types.ts b/app/components/UI/Predict/components/PredictActionButtons/PredictActionButtons.types.ts index f31ce2cbb3e3..ab1619737eed 100644 --- a/app/components/UI/Predict/components/PredictActionButtons/PredictActionButtons.types.ts +++ b/app/components/UI/Predict/components/PredictActionButtons/PredictActionButtons.types.ts @@ -3,6 +3,7 @@ import { PredictOutcome, PredictOutcomeToken, } from '../../types'; +import { ButtonBaseSize } from '@metamask/design-system-react-native'; export type PredictBetButtonVariant = 'yes' | 'no'; @@ -14,6 +15,7 @@ export interface PredictBetButtonProps { teamColor?: string; disabled?: boolean; testID?: string; + size?: ButtonBaseSize; } export interface PredictBetButtonsProps { @@ -27,6 +29,7 @@ export interface PredictBetButtonsProps { noTeamColor?: string; disabled?: boolean; testID?: string; + isCarousel?: boolean; } export interface PredictClaimButtonProps { @@ -44,4 +47,5 @@ export interface PredictActionButtonsProps { claimableAmount?: number; isLoading?: boolean; testID?: string; + isCarousel?: boolean; } diff --git a/app/components/UI/Predict/components/PredictActionButtons/PredictBetButton.tsx b/app/components/UI/Predict/components/PredictActionButtons/PredictBetButton.tsx index fdde7aa0af5f..463a734221b6 100644 --- a/app/components/UI/Predict/components/PredictActionButtons/PredictBetButton.tsx +++ b/app/components/UI/Predict/components/PredictActionButtons/PredictBetButton.tsx @@ -12,6 +12,7 @@ const PredictBetButton: React.FC = ({ teamColor, disabled = false, testID, + size, }) => { const tw = useTailwind(); const { colors } = useTheme(); @@ -39,8 +40,9 @@ const PredictBetButton: React.FC = ({ testID={testID} style={{ backgroundColor: getBackgroundColor() }} isFullWidth + size={size} > - + {label.toUpperCase()} · {price}¢ diff --git a/app/components/UI/Predict/components/PredictActionButtons/PredictBetButtons.tsx b/app/components/UI/Predict/components/PredictActionButtons/PredictBetButtons.tsx index 8ca51c670b57..a2d2b4a24956 100644 --- a/app/components/UI/Predict/components/PredictActionButtons/PredictBetButtons.tsx +++ b/app/components/UI/Predict/components/PredictActionButtons/PredictBetButtons.tsx @@ -1,5 +1,9 @@ import React from 'react'; -import { Box, BoxFlexDirection } from '@metamask/design-system-react-native'; +import { + Box, + BoxFlexDirection, + ButtonBaseSize, +} from '@metamask/design-system-react-native'; import PredictBetButton from './PredictBetButton'; import { PredictBetButtonsProps } from './PredictActionButtons.types'; @@ -14,6 +18,7 @@ const PredictBetButtons: React.FC = ({ noTeamColor, disabled = false, testID = 'predict-bet-buttons', + isCarousel, }) => ( @@ -25,6 +30,7 @@ const PredictBetButtons: React.FC = ({ teamColor={yesTeamColor} disabled={disabled} testID={`${testID}-yes`} + size={isCarousel ? ButtonBaseSize.Md : undefined} /> @@ -36,6 +42,7 @@ const PredictBetButtons: React.FC = ({ teamColor={noTeamColor} disabled={disabled} testID={`${testID}-no`} + size={isCarousel ? ButtonBaseSize.Md : undefined} /> diff --git a/app/components/UI/Predict/components/PredictMarket/PredictMarket.tsx b/app/components/UI/Predict/components/PredictMarket/PredictMarket.tsx index 0e5529b1ef64..2d24c47fbc37 100644 --- a/app/components/UI/Predict/components/PredictMarket/PredictMarket.tsx +++ b/app/components/UI/Predict/components/PredictMarket/PredictMarket.tsx @@ -25,6 +25,7 @@ const PredictMarket: React.FC = ({ market={market} testID={testID} entryPoint={entryPoint} + isCarousel={isCarousel} /> ); } diff --git a/app/components/UI/Predict/components/PredictMarketSportCard/PredictMarketSportCard.tsx b/app/components/UI/Predict/components/PredictMarketSportCard/PredictMarketSportCard.tsx index 76e2df7b7463..c3a5a9525ac6 100644 --- a/app/components/UI/Predict/components/PredictMarketSportCard/PredictMarketSportCard.tsx +++ b/app/components/UI/Predict/components/PredictMarketSportCard/PredictMarketSportCard.tsx @@ -28,6 +28,7 @@ interface PredictMarketSportCardProps { testID?: string; entryPoint?: PredictEntryPoint; onDismiss?: () => void; + isCarousel?: boolean; } const PredictMarketSportCard: React.FC = ({ @@ -35,6 +36,7 @@ const PredictMarketSportCard: React.FC = ({ testID, entryPoint = PredictEventValues.ENTRY_POINT.PREDICT_FEED, onDismiss, + isCarousel, }) => { const tw = useTailwind(); const resolvedEntryPoint = TrendingFeedSessionManager.getInstance() @@ -49,7 +51,7 @@ const PredictMarketSportCard: React.FC = ({ return ( { navigation.navigate(Routes.PREDICT.ROOT, { @@ -63,7 +65,7 @@ const PredictMarketSportCard: React.FC = ({ }); }} > - + {onDismiss && ( = ({ market={market} entryPoint={resolvedEntryPoint} testID={testID ? `${testID}-footer` : undefined} + isCarousel={isCarousel} /> diff --git a/app/components/UI/Predict/components/PredictSportCardFooter/PredictSportCardFooter.tsx b/app/components/UI/Predict/components/PredictSportCardFooter/PredictSportCardFooter.tsx index a2c89715a4ae..677232045c12 100644 --- a/app/components/UI/Predict/components/PredictSportCardFooter/PredictSportCardFooter.tsx +++ b/app/components/UI/Predict/components/PredictSportCardFooter/PredictSportCardFooter.tsx @@ -25,12 +25,14 @@ interface PredictSportCardFooterProps { market: PredictMarketType; testID?: string; entryPoint?: PredictEntryPoint; + isCarousel?: boolean; } const PredictSportCardFooter: React.FC = ({ market, testID, entryPoint = PredictEventValues.ENTRY_POINT.PREDICT_FEED, + isCarousel, }) => { const tw = useTailwind(); const navigation = @@ -71,7 +73,10 @@ const PredictSportCardFooter: React.FC = ({ () => { // When accessed from Carousel, we're outside the Predict navigator, // so we need to navigate through the ROOT first - if (resolvedEntryPoint === PredictEventValues.ENTRY_POINT.CAROUSEL) { + if ( + isCarousel || + resolvedEntryPoint === PredictEventValues.ENTRY_POINT.CAROUSEL + ) { navigation.navigate(Routes.PREDICT.ROOT, { screen: Routes.PREDICT.MODALS.BUY_PREVIEW, params: { @@ -96,7 +101,14 @@ const PredictSportCardFooter: React.FC = ({ }, ); }, - [executeGuardedAction, navigation, market, outcome, resolvedEntryPoint], + [ + executeGuardedAction, + isCarousel, + resolvedEntryPoint, + navigation, + market, + outcome, + ], ); const handleClaimPress = useCallback(async () => { @@ -115,7 +127,8 @@ const PredictSportCardFooter: React.FC = ({ 0, ); - const showBetButtons = isMarketOpen && !hasPositions && outcome; + const showBetButtons = + isMarketOpen && (!hasPositions || isCarousel) && outcome; const showClaimButton = hasClaimablePositions && outcome; if (isLoading) { @@ -147,7 +160,7 @@ const PredictSportCardFooter: React.FC = ({ return ( <> - {hasPositions && ( + {!isCarousel && hasPositions && ( = ({ onClaimPress={handleClaimPress} claimableAmount={claimableAmount} testID={testID ? `${testID}-action-buttons` : undefined} + isCarousel={isCarousel} /> )} @@ -173,6 +187,7 @@ const PredictSportCardFooter: React.FC = ({ outcome={outcome} onBetPress={handleBetPress} testID={testID ? `${testID}-action-buttons` : undefined} + isCarousel={isCarousel} /> )} From 618764313c7b0edad4abe38920d84c4b6d0741b8 Mon Sep 17 00:00:00 2001 From: "runway-github[bot]" <73448015+runway-github[bot]@users.noreply.github.com> Date: Mon, 26 Jan 2026 22:14:21 +0000 Subject: [PATCH 23/80] chore(runway): cherry-pick fix(predict): cp-7.63.0 game picks not showing for claimable positions (#25229) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - fix(predict): cp-7.63.0 game picks not showing for claimable positions (#25220) ## **Description** Fixed an issue where positions/picks were not visible for game markets after the market was closed when users had claimable positions. **Root Cause:** The `PredictPicks` component was only checking for live positions when determining whether to render. When a market closed and positions became claimable (no longer "live"), the component would return `null` even though there were claimable positions to display. **Solution:** 1. Added a second `usePredictPositions` hook call with `claimable: true` to fetch claimable positions 2. Updated render condition to show component when either live OR claimable positions exist 3. Conditionally hide Cash Out button for claimable positions (since they can only be claimed, not cashed out) 4. Updated `PredictSportCardFooter` to also render claimable positions ## **Changelog** CHANGELOG entry: null ## **Related issues** Fixes: https://consensyssoftware.atlassian.net/browse/PRED-551 ## **Manual testing steps** ```gherkin Feature: Game picks display for claimable positions Scenario: user views game picks after market closes with claimable positions Given user has an open position on a game market And the game market has ended and positions are now claimable When user navigates to the market details Then user sees their position(s) in the "Your picks" section And the Cash Out button is not displayed for claimable positions And the Claim button is available ``` ## **Screenshots/Recordings** ### **Before** Positions/picks section was hidden when market closed and positions became claimable. ### **After** Positions/picks section now displays for both live and claimable positions, with Cash Out button only shown for non-claimable positions. Screenshot 2026-01-26 at 11 57 12 AM Screenshot 2026-01-26 at 11 57 02 AM ## **Pre-merge author checklist** - [x] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile Coding Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md). - [x] I've completed the PR template to the best of my ability - [x] I've included tests if applicable - [x] I've documented my code using [JSDoc](https://jsdoc.app/) format if applicable - [x] I've applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors. ## **Pre-merge reviewer checklist** - [ ] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [ ] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots. --- > [!NOTE] > Ensures users see their picks after markets close by including claimable positions alongside live ones and adjusting actions accordingly. > > - PredictPicks: adds a second `usePredictPositions` call with `claimable: true`, renders when either `livePositions` or `claimablePositions` exist, and passes both to `PredictPickItem`; `Cash out` button is hidden for `claimable` positions > - PredictSportCardFooter: also fetches `claimablePositions`, renders them via `PredictPicksForCard`, and shows claim CTA with aggregated `claimableAmount` > - Tests: comprehensive unit tests added/updated for live vs claimable flows, hook parameters, optimistic states, navigation, and action guards > > Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit afdbf844123e4475e0dae515edfc44f57abbb148. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot). [c560e11](https://github.com/MetaMask/metamask-mobile/commit/c560e11161b36b4648a1438854ce85e3a68378f8) Co-authored-by: Luis Taniça --- .../PredictPicks/PredictPickItem.test.tsx | 245 ++++++++++++++ .../PredictPicks/PredictPickItem.tsx | 24 +- .../PredictPicks/PredictPicks.test.tsx | 319 ++++++++---------- .../components/PredictPicks/PredictPicks.tsx | 14 +- .../PredictSportCardFooter.test.tsx | 4 +- .../PredictSportCardFooter.tsx | 8 + 6 files changed, 419 insertions(+), 195 deletions(-) create mode 100644 app/components/UI/Predict/components/PredictPicks/PredictPickItem.test.tsx diff --git a/app/components/UI/Predict/components/PredictPicks/PredictPickItem.test.tsx b/app/components/UI/Predict/components/PredictPicks/PredictPickItem.test.tsx new file mode 100644 index 000000000000..dd841da95199 --- /dev/null +++ b/app/components/UI/Predict/components/PredictPicks/PredictPickItem.test.tsx @@ -0,0 +1,245 @@ +import React from 'react'; +import { fireEvent, render, screen } from '@testing-library/react-native'; +import PredictPickItem from './PredictPickItem'; +import { PredictPositionStatus, type PredictPosition } from '../../types'; +import { formatPrice } from '../../utils/format'; + +import { usePredictOptimisticPositionRefresh } from '../../hooks/usePredictOptimisticPositionRefresh'; + +jest.mock('../../hooks/usePredictOptimisticPositionRefresh'); +jest.mock('../../utils/format'); + +const mockUsePredictOptimisticPositionRefresh = + usePredictOptimisticPositionRefresh as jest.MockedFunction< + typeof usePredictOptimisticPositionRefresh + >; +const mockFormatPrice = formatPrice as jest.MockedFunction; + +const createMockPosition = ( + overrides: Partial = {}, +): PredictPosition => ({ + id: 'position-1', + providerId: 'polymarket', + marketId: 'market-1', + outcomeId: 'outcome-1', + outcomeTokenId: '0', + icon: 'https://example.com/icon.png', + title: 'Will BTC hit 100k?', + outcome: 'Yes', + outcomeIndex: 0, + amount: 10, + price: 0.67, + status: PredictPositionStatus.OPEN, + size: 50, + cashPnl: 15.5, + percentPnl: 5.25, + initialValue: 100, + currentValue: 115.5, + avgPrice: 0.5, + claimable: false, + endDate: '2025-12-31T00:00:00Z', + ...overrides, +}); + +describe('PredictPickItem', () => { + const mockOnCashOut = jest.fn(); + + beforeEach(() => { + jest.clearAllMocks(); + mockUsePredictOptimisticPositionRefresh.mockImplementation( + ({ position }) => position as PredictPosition, + ); + mockFormatPrice.mockImplementation( + (value: number | string, _options?: { maximumDecimals?: number }) => { + const num = typeof value === 'string' ? parseFloat(value) : value; + if (isNaN(num)) return '$0.00'; + return `$${num.toFixed(2)}`; + }, + ); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + describe('rendering', () => { + it('renders position info with initialValue and outcome', () => { + const position = createMockPosition({ initialValue: 50, outcome: 'Yes' }); + + render( + , + ); + + expect(screen.getByText(/\$50\.00 on/)).toBeOnTheScreen(); + expect(screen.getByText(/Yes/)).toBeOnTheScreen(); + }); + + it('renders positive cashPnl value with SuccessDefault color', () => { + const position = createMockPosition({ id: 'pos-1', cashPnl: 25.75 }); + + render( + , + ); + + const pnlText = screen.getByTestId('predict-picks-pnl-pos-1'); + expect(pnlText).toBeOnTheScreen(); + expect(screen.getByText('$25.75')).toBeOnTheScreen(); + }); + + it('renders negative cashPnl value with ErrorDefault color', () => { + const position = createMockPosition({ id: 'pos-1', cashPnl: -10.5 }); + + render( + , + ); + + expect(screen.getByText('$-10.50')).toBeOnTheScreen(); + }); + }); + + describe('Cash Out button', () => { + it('renders Cash Out button when position is not claimable', () => { + const position = createMockPosition({ id: 'pos-1', claimable: false }); + + render( + , + ); + + expect( + screen.getByTestId('predict-picks-cash-out-button-pos-1'), + ).toBeOnTheScreen(); + expect(screen.getByText('Cash out')).toBeOnTheScreen(); + }); + + it('does not render Cash Out button when position is claimable', () => { + const position = createMockPosition({ id: 'pos-1', claimable: true }); + + render( + , + ); + + expect( + screen.queryByTestId('predict-picks-cash-out-button-pos-1'), + ).toBeNull(); + expect(screen.queryByText('Cash out')).toBeNull(); + }); + + it('calls onCashOut with position when Cash Out button is pressed', () => { + const position = createMockPosition({ id: 'pos-1', claimable: false }); + + render( + , + ); + + fireEvent.press( + screen.getByTestId('predict-picks-cash-out-button-pos-1'), + ); + + expect(mockOnCashOut).toHaveBeenCalledTimes(1); + expect(mockOnCashOut).toHaveBeenCalledWith(position); + }); + }); + + describe('optimistic updates', () => { + it('renders Skeleton when position is optimistic', () => { + const position = createMockPosition({ + id: 'pos-1', + claimable: false, + }); + mockUsePredictOptimisticPositionRefresh.mockReturnValue({ + ...position, + optimistic: true, + }); + + render( + , + ); + + expect(screen.queryByTestId('predict-picks-pnl-pos-1')).toBeNull(); + }); + + it('disables Cash Out button when position is optimistic', () => { + const position = createMockPosition({ + id: 'pos-1', + claimable: false, + }); + mockUsePredictOptimisticPositionRefresh.mockReturnValue({ + ...position, + optimistic: true, + }); + + render( + , + ); + + const button = screen.getByTestId('predict-picks-cash-out-button-pos-1'); + expect(button.props.accessibilityState?.disabled).toBe(true); + }); + }); + + describe('formatPrice calls', () => { + it('calls formatPrice for position initialValue', () => { + const position = createMockPosition({ initialValue: 15.75 }); + + render( + , + ); + + expect(mockFormatPrice).toHaveBeenCalledWith(15.75, { + maximumDecimals: 2, + }); + }); + + it('calls formatPrice for cashPnl', () => { + const position = createMockPosition({ cashPnl: 1234.56 }); + + render( + , + ); + + expect(mockFormatPrice).toHaveBeenNthCalledWith(2, 1234.56, { + maximumDecimals: 2, + }); + }); + }); +}); diff --git a/app/components/UI/Predict/components/PredictPicks/PredictPickItem.tsx b/app/components/UI/Predict/components/PredictPicks/PredictPickItem.tsx index d7262fa86316..7d6975c28ae9 100644 --- a/app/components/UI/Predict/components/PredictPicks/PredictPickItem.tsx +++ b/app/components/UI/Predict/components/PredictPicks/PredictPickItem.tsx @@ -61,17 +61,19 @@ const PredictPickItem: React.FC = ({ )} - + {!position.claimable && ( + + )} ); }; diff --git a/app/components/UI/Predict/components/PredictPicks/PredictPicks.test.tsx b/app/components/UI/Predict/components/PredictPicks/PredictPicks.test.tsx index 682423fc7c37..4e1e6d92ccac 100644 --- a/app/components/UI/Predict/components/PredictPicks/PredictPicks.test.tsx +++ b/app/components/UI/Predict/components/PredictPicks/PredictPicks.test.tsx @@ -43,6 +43,32 @@ const mockUsePredictActionGuard = usePredictActionGuard as jest.MockedFunction< >; const mockFormatPrice = formatPrice as jest.MockedFunction; +interface MockPositionsConfig { + livePositions?: PredictPosition[]; + claimablePositions?: PredictPosition[]; + isLoading?: boolean; + isRefreshing?: boolean; + error?: string | null; +} + +const setupPositionsMock = (config: MockPositionsConfig = {}) => { + const { + livePositions = [], + claimablePositions = [], + isLoading = false, + isRefreshing = false, + error = null, + } = config; + + mockUsePredictPositions.mockImplementation((options) => ({ + positions: options?.claimable ? claimablePositions : livePositions, + isLoading, + isRefreshing, + error, + loadPositions: jest.fn(), + })); +}; + const createMockMarket = ( overrides: Partial = {}, ): PredictMarket => ({ @@ -115,19 +141,12 @@ const createMockPosition = ( }); describe('PredictPicks', () => { - const mockLoadPositions = jest.fn(); const mockExecuteGuardedAction = jest.fn(); beforeEach(() => { jest.clearAllMocks(); mockNavigate.mockClear(); - mockUsePredictPositions.mockReturnValue({ - positions: [], - isLoading: false, - isRefreshing: false, - error: null, - loadPositions: mockLoadPositions, - }); + setupPositionsMock(); mockUsePredictActionGuard.mockReturnValue({ executeGuardedAction: mockExecuteGuardedAction, isEligible: true, @@ -148,13 +167,7 @@ describe('PredictPicks', () => { describe('rendering states', () => { it('returns null when there are no positions and not loading', () => { - mockUsePredictPositions.mockReturnValue({ - positions: [], - isLoading: false, - isRefreshing: false, - error: null, - loadPositions: mockLoadPositions, - }); + setupPositionsMock(); render(); @@ -162,13 +175,7 @@ describe('PredictPicks', () => { }); it('returns null when loading with no existing positions', () => { - mockUsePredictPositions.mockReturnValue({ - positions: [], - isLoading: true, - isRefreshing: false, - error: null, - loadPositions: mockLoadPositions, - }); + setupPositionsMock({ isLoading: true }); render(); @@ -176,26 +183,25 @@ describe('PredictPicks', () => { }); it('returns null when refreshing with no existing positions', () => { - mockUsePredictPositions.mockReturnValue({ - positions: [], - isLoading: false, - isRefreshing: true, - error: null, - loadPositions: mockLoadPositions, - }); + setupPositionsMock({ isRefreshing: true }); render(); expect(screen.queryByTestId('predict-picks')).toBeNull(); }); - it('renders container when positions exist', () => { - mockUsePredictPositions.mockReturnValue({ - positions: [createMockPosition()], - isLoading: false, - isRefreshing: false, - error: null, - loadPositions: mockLoadPositions, + it('renders container when live positions exist', () => { + setupPositionsMock({ livePositions: [createMockPosition()] }); + + render(); + + expect(screen.getAllByTestId('predict-picks').length).toBeGreaterThan(0); + }); + + it('renders container when only claimable positions exist', () => { + setupPositionsMock({ + livePositions: [], + claimablePositions: [createMockPosition({ claimable: true })], }); render(); @@ -204,13 +210,7 @@ describe('PredictPicks', () => { }); it('renders "Your Picks" header when positions exist', () => { - mockUsePredictPositions.mockReturnValue({ - positions: [createMockPosition()], - isLoading: false, - isRefreshing: false, - error: null, - loadPositions: mockLoadPositions, - }); + setupPositionsMock({ livePositions: [createMockPosition()] }); render(); @@ -220,12 +220,10 @@ describe('PredictPicks', () => { describe('position display', () => { it('displays position initialValue and outcome', () => { - mockUsePredictPositions.mockReturnValue({ - positions: [createMockPosition({ initialValue: 50, outcome: 'Yes' })], - isLoading: false, - isRefreshing: false, - error: null, - loadPositions: mockLoadPositions, + setupPositionsMock({ + livePositions: [ + createMockPosition({ initialValue: 50, outcome: 'Yes' }), + ], }); render(); @@ -235,12 +233,8 @@ describe('PredictPicks', () => { }); it('displays positive cashPnl value', () => { - mockUsePredictPositions.mockReturnValue({ - positions: [createMockPosition({ cashPnl: 25.75 })], - isLoading: false, - isRefreshing: false, - error: null, - loadPositions: mockLoadPositions, + setupPositionsMock({ + livePositions: [createMockPosition({ cashPnl: 25.75 })], }); render(); @@ -249,12 +243,8 @@ describe('PredictPicks', () => { }); it('displays negative cashPnl value', () => { - mockUsePredictPositions.mockReturnValue({ - positions: [createMockPosition({ cashPnl: -10.5 })], - isLoading: false, - isRefreshing: false, - error: null, - loadPositions: mockLoadPositions, + setupPositionsMock({ + livePositions: [createMockPosition({ cashPnl: -10.5 })], }); render(); @@ -263,12 +253,8 @@ describe('PredictPicks', () => { }); it('displays zero cashPnl value', () => { - mockUsePredictPositions.mockReturnValue({ - positions: [createMockPosition({ cashPnl: 0 })], - isLoading: false, - isRefreshing: false, - error: null, - loadPositions: mockLoadPositions, + setupPositionsMock({ + livePositions: [createMockPosition({ cashPnl: 0 })], }); render(); @@ -277,12 +263,10 @@ describe('PredictPicks', () => { }); it('applies SuccessDefault color when cashPnl is positive', () => { - mockUsePredictPositions.mockReturnValue({ - positions: [createMockPosition({ id: 'pos-positive', cashPnl: 25.75 })], - isLoading: false, - isRefreshing: false, - error: null, - loadPositions: mockLoadPositions, + setupPositionsMock({ + livePositions: [ + createMockPosition({ id: 'pos-positive', cashPnl: 25.75 }), + ], }); render(); @@ -298,12 +282,10 @@ describe('PredictPicks', () => { }); it('applies ErrorDefault color when cashPnl is negative', () => { - mockUsePredictPositions.mockReturnValue({ - positions: [createMockPosition({ id: 'pos-negative', cashPnl: -10.5 })], - isLoading: false, - isRefreshing: false, - error: null, - loadPositions: mockLoadPositions, + setupPositionsMock({ + livePositions: [ + createMockPosition({ id: 'pos-negative', cashPnl: -10.5 }), + ], }); render(); @@ -319,12 +301,8 @@ describe('PredictPicks', () => { }); it('applies SuccessDefault color when cashPnl is zero (break-even)', () => { - mockUsePredictPositions.mockReturnValue({ - positions: [createMockPosition({ id: 'pos-zero', cashPnl: 0 })], - isLoading: false, - isRefreshing: false, - error: null, - loadPositions: mockLoadPositions, + setupPositionsMock({ + livePositions: [createMockPosition({ id: 'pos-zero', cashPnl: 0 })], }); render(); @@ -339,35 +317,40 @@ describe('PredictPicks', () => { ); }); - it('renders Cash Out button for each position', () => { - mockUsePredictPositions.mockReturnValue({ - positions: [createMockPosition()], - isLoading: false, - isRefreshing: false, - error: null, - loadPositions: mockLoadPositions, + it('renders Cash Out button for non-claimable position', () => { + setupPositionsMock({ + livePositions: [createMockPosition({ claimable: false })], }); render(); expect(screen.getByText('Cash out')).toBeOnTheScreen(); }); + + it('does not render Cash Out button for claimable position', () => { + setupPositionsMock({ + livePositions: [], + claimablePositions: [ + createMockPosition({ id: 'pos-claimable', claimable: true }), + ], + }); + + render(); + + expect( + screen.queryByTestId('predict-picks-cash-out-button-pos-claimable'), + ).toBeNull(); + }); }); describe('multiple positions', () => { - it('renders all positions in the list', () => { + it('renders all live positions in the list', () => { const positions = [ createMockPosition({ id: 'pos-1', outcome: 'Yes', size: 100 }), createMockPosition({ id: 'pos-2', outcome: 'No', size: 200 }), createMockPosition({ id: 'pos-3', outcome: 'Maybe', size: 50 }), ]; - mockUsePredictPositions.mockReturnValue({ - positions, - isLoading: false, - isRefreshing: false, - error: null, - loadPositions: mockLoadPositions, - }); + setupPositionsMock({ livePositions: positions }); render(); @@ -376,18 +359,30 @@ describe('PredictPicks', () => { expect(screen.getByText(/Maybe/)).toBeOnTheScreen(); }); - it('renders Cash Out button for each position', () => { + it('renders both live and claimable positions', () => { + setupPositionsMock({ + livePositions: [createMockPosition({ id: 'pos-live', outcome: 'Yes' })], + claimablePositions: [ + createMockPosition({ + id: 'pos-claim', + outcome: 'No', + claimable: true, + }), + ], + }); + + render(); + + expect(screen.getByText(/Yes/)).toBeOnTheScreen(); + expect(screen.getByText(/No/)).toBeOnTheScreen(); + }); + + it('renders Cash Out button only for non-claimable positions', () => { const positions = [ - createMockPosition({ id: 'pos-1' }), - createMockPosition({ id: 'pos-2' }), + createMockPosition({ id: 'pos-1', claimable: false }), + createMockPosition({ id: 'pos-2', claimable: false }), ]; - mockUsePredictPositions.mockReturnValue({ - positions, - isLoading: false, - isRefreshing: false, - error: null, - loadPositions: mockLoadPositions, - }); + setupPositionsMock({ livePositions: positions }); render(); @@ -398,14 +393,8 @@ describe('PredictPicks', () => { }); describe('hook configuration', () => { - it('calls usePredictPositions with correct market.id', () => { - mockUsePredictPositions.mockReturnValue({ - positions: [], - isLoading: false, - isRefreshing: false, - error: null, - loadPositions: mockLoadPositions, - }); + it('calls usePredictPositions with correct market.id for live positions', () => { + setupPositionsMock(); render( { }); }); - it('passes autoRefreshTimeout of 10000ms to hook', () => { - mockUsePredictPositions.mockReturnValue({ - positions: [], - isLoading: false, - isRefreshing: false, - error: null, - loadPositions: mockLoadPositions, + it('calls usePredictPositions with claimable flag for claimable positions', () => { + setupPositionsMock(); + + render( + , + ); + + expect(mockUsePredictPositions).toHaveBeenCalledWith({ + marketId: 'specific-market-123', + claimable: true, }); + }); + + it('passes autoRefreshTimeout of 10000ms to hook', () => { + setupPositionsMock(); render(); @@ -440,12 +438,8 @@ describe('PredictPicks', () => { describe('formatPrice calls', () => { it('calls formatPrice for position initialValue', () => { - mockUsePredictPositions.mockReturnValue({ - positions: [createMockPosition({ initialValue: 15.75 })], - isLoading: false, - isRefreshing: false, - error: null, - loadPositions: mockLoadPositions, + setupPositionsMock({ + livePositions: [createMockPosition({ initialValue: 15.75 })], }); render(); @@ -456,12 +450,8 @@ describe('PredictPicks', () => { }); it('calls formatPrice for cashPnl', () => { - mockUsePredictPositions.mockReturnValue({ - positions: [createMockPosition({ cashPnl: 1234.56 })], - isLoading: false, - isRefreshing: false, - error: null, - loadPositions: mockLoadPositions, + setupPositionsMock({ + livePositions: [createMockPosition({ cashPnl: 1234.56 })], }); render(); @@ -474,14 +464,8 @@ describe('PredictPicks', () => { describe('cash out functionality', () => { it('calls executeGuardedAction when Cash Out button is pressed', () => { - const position = createMockPosition({ id: 'pos-1' }); - mockUsePredictPositions.mockReturnValue({ - positions: [position], - isLoading: false, - isRefreshing: false, - error: null, - loadPositions: mockLoadPositions, - }); + const position = createMockPosition({ id: 'pos-1', claimable: false }); + setupPositionsMock({ livePositions: [position] }); render(); fireEvent.press( @@ -492,14 +476,8 @@ describe('PredictPicks', () => { }); it('passes CASHOUT as attemptedAction option to executeGuardedAction', () => { - const position = createMockPosition({ id: 'pos-1' }); - mockUsePredictPositions.mockReturnValue({ - positions: [position], - isLoading: false, - isRefreshing: false, - error: null, - loadPositions: mockLoadPositions, - }); + const position = createMockPosition({ id: 'pos-1', claimable: false }); + setupPositionsMock({ livePositions: [position] }); render(); fireEvent.press( @@ -517,14 +495,9 @@ describe('PredictPicks', () => { const position = createMockPosition({ id: 'pos-1', outcomeId: 'outcome-1', + claimable: false, }); - mockUsePredictPositions.mockReturnValue({ - positions: [position], - isLoading: false, - isRefreshing: false, - error: null, - loadPositions: mockLoadPositions, - }); + setupPositionsMock({ livePositions: [position] }); mockExecuteGuardedAction.mockImplementation((callback) => callback()); render(); @@ -547,14 +520,9 @@ describe('PredictPicks', () => { const position = createMockPosition({ id: 'pos-1', outcomeId: 'outcome-2', + claimable: false, }); - mockUsePredictPositions.mockReturnValue({ - positions: [position], - isLoading: false, - isRefreshing: false, - error: null, - loadPositions: mockLoadPositions, - }); + setupPositionsMock({ livePositions: [position] }); mockExecuteGuardedAction.mockImplementation((callback) => callback()); render(); @@ -575,14 +543,9 @@ describe('PredictPicks', () => { const position = createMockPosition({ id: 'pos-1', outcomeId: 'non-existent-outcome', + claimable: false, }); - mockUsePredictPositions.mockReturnValue({ - positions: [position], - isLoading: false, - isRefreshing: false, - error: null, - loadPositions: mockLoadPositions, - }); + setupPositionsMock({ livePositions: [position] }); mockExecuteGuardedAction.mockImplementation((callback) => callback()); render(); @@ -600,13 +563,7 @@ describe('PredictPicks', () => { it('calls usePredictActionGuard with market.providerId', () => { const market = createMockMarket({ providerId: 'custom-provider' }); - mockUsePredictPositions.mockReturnValue({ - positions: [createMockPosition()], - isLoading: false, - isRefreshing: false, - error: null, - loadPositions: mockLoadPositions, - }); + setupPositionsMock({ livePositions: [createMockPosition()] }); render(); diff --git a/app/components/UI/Predict/components/PredictPicks/PredictPicks.tsx b/app/components/UI/Predict/components/PredictPicks/PredictPicks.tsx index e9d87eb4f0a7..2798e2026422 100644 --- a/app/components/UI/Predict/components/PredictPicks/PredictPicks.tsx +++ b/app/components/UI/Predict/components/PredictPicks/PredictPicks.tsx @@ -27,6 +27,10 @@ const PredictPicks: React.FC = ({ marketId: market.id, autoRefreshTimeout: 10000, }); + const { positions: claimablePositions } = usePredictPositions({ + marketId: market.id, + claimable: true, + }); const { livePositions } = useLivePositions(positions); const navigation = useNavigation>(); @@ -53,7 +57,7 @@ const PredictPicks: React.FC = ({ ); }; - if (livePositions.length === 0) { + if (livePositions.length === 0 && claimablePositions.length === 0) { return null; } @@ -70,6 +74,14 @@ const PredictPicks: React.FC = ({ testID={`${testID}-item-${position.id}`} /> ))} + {claimablePositions.map((position) => ( + + ))} ); }; diff --git a/app/components/UI/Predict/components/PredictSportCardFooter/PredictSportCardFooter.test.tsx b/app/components/UI/Predict/components/PredictSportCardFooter/PredictSportCardFooter.test.tsx index 51bb042a6101..6ffd276b784c 100644 --- a/app/components/UI/Predict/components/PredictSportCardFooter/PredictSportCardFooter.test.tsx +++ b/app/components/UI/Predict/components/PredictSportCardFooter/PredictSportCardFooter.test.tsx @@ -417,13 +417,13 @@ describe('PredictSportCardFooter', () => { expect(screen.getByText('Claim $50')).toBeOnTheScreen(); }); - it('renders positions with claim button when claimable', () => { + it('renders claimable positions with claim button when claimable', () => { const market = createMockMarket({ status: PredictMarketStatus.RESOLVED }); const claimablePositions = [ createMockPosition({ claimable: true, currentValue: 50 }), ]; setupPositionsMock({ - activePositions: claimablePositions, + activePositions: [], claimablePositions, }); diff --git a/app/components/UI/Predict/components/PredictSportCardFooter/PredictSportCardFooter.tsx b/app/components/UI/Predict/components/PredictSportCardFooter/PredictSportCardFooter.tsx index 677232045c12..8b4cfa51f84d 100644 --- a/app/components/UI/Predict/components/PredictSportCardFooter/PredictSportCardFooter.tsx +++ b/app/components/UI/Predict/components/PredictSportCardFooter/PredictSportCardFooter.tsx @@ -168,6 +168,14 @@ const PredictSportCardFooter: React.FC = ({ testID={testID ? `${testID}-picks` : undefined} /> )} + {hasClaimablePositions && ( + + )} {showClaimButton && ( Date: Mon, 26 Jan 2026 22:15:46 +0000 Subject: [PATCH 24/80] [skip ci] Bump version number to 3550 --- android/app/build.gradle | 2 +- bitrise.yml | 4 ++-- ios/MetaMask.xcodeproj/project.pbxproj | 12 ++++++------ 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index dfc56f8b9fe7..bf41bd28bbd9 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -188,7 +188,7 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion versionName "7.63.0" - versionCode 3549 + versionCode 3550 testBuildType System.getProperty('testBuildType', 'debug') testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" manifestPlaceholders.MM_BRANCH_KEY_TEST = "$System.env.MM_BRANCH_KEY_TEST" diff --git a/bitrise.yml b/bitrise.yml index 7214a9cda901..0fe501882c3c 100644 --- a/bitrise.yml +++ b/bitrise.yml @@ -3472,13 +3472,13 @@ app: VERSION_NAME: 7.63.0 - opts: is_expand: false - VERSION_NUMBER: 3549 + VERSION_NUMBER: 3550 - opts: is_expand: false FLASK_VERSION_NAME: 7.63.0 - opts: is_expand: false - FLASK_VERSION_NUMBER: 3549 + FLASK_VERSION_NUMBER: 3550 - opts: is_expand: false ANDROID_APK_LINK: '' diff --git a/ios/MetaMask.xcodeproj/project.pbxproj b/ios/MetaMask.xcodeproj/project.pbxproj index 1c7dc8823d26..12db3e4372a4 100644 --- a/ios/MetaMask.xcodeproj/project.pbxproj +++ b/ios/MetaMask.xcodeproj/project.pbxproj @@ -1281,7 +1281,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3549; + CURRENT_PROJECT_VERSION = 3550; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 48XVW22RCG; @@ -1350,7 +1350,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3549; + CURRENT_PROJECT_VERSION = 3550; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 48XVW22RCG; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 48XVW22RCG; @@ -1416,7 +1416,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3549; + CURRENT_PROJECT_VERSION = 3550; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 48XVW22RCG; @@ -1483,7 +1483,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3549; + CURRENT_PROJECT_VERSION = 3550; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 48XVW22RCG; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 48XVW22RCG; @@ -1646,7 +1646,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3549; + CURRENT_PROJECT_VERSION = 3550; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 48XVW22RCG; @@ -1716,7 +1716,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3549; + CURRENT_PROJECT_VERSION = 3550; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 48XVW22RCG; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 48XVW22RCG; From 7eefd25c00acf3b2ffc44d092a7e08b4b3b7b97e Mon Sep 17 00:00:00 2001 From: "runway-github[bot]" <73448015+runway-github[bot]@users.noreply.github.com> Date: Tue, 27 Jan 2026 00:13:52 +0000 Subject: [PATCH 25/80] chore(runway): cherry-pick fix(predict): update Seahawks team color for accessibility cp-7.63.0 (#25232) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - fix(predict): update Seahawks team color for accessibility cp-7.63.0 (#25230) ## **Description** Updated the Seattle Seahawks team color from `#69BE28` to `#5BA423` to improve accessibility. The previous color did not provide sufficient contrast when used with white text labels, failing accessibility tests. ## **Changelog** CHANGELOG entry: null ## **Related issues** Fixes: https://consensyssoftware.atlassian.net/browse/PRED-545 ## **Manual testing steps** ```gherkin Feature: Predict Team Colors Scenario: user views Seahawks team in Predict Given user is on a Predict screen showing NFL teams When user views a market involving the Seattle Seahawks Then the Seahawks team color should display with accessible contrast And white text on the Seahawks color background should be readable ``` ## **Screenshots/Recordings** ### **Before** Color: `#69BE28` (lime green - insufficient contrast with white text) ### **After** Color: `#5BA423` (darker green - meets accessibility contrast requirements) ## **Pre-merge author checklist** - [x] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile Coding Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md). - [x] I've completed the PR template to the best of my ability - [x] I've included tests if applicable - [x] I've documented my code using [JSDoc](https://jsdoc.app/) format if applicable - [x] I've applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors. ## **Pre-merge reviewer checklist** - [ ] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [ ] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots. --- > [!NOTE] > Adjusts the Seattle Seahawks team color override to improve contrast. > > - Updates `TEAM_COLOR_OVERRIDES` in `TeamsCache.ts` to change `sea` from `#69BE28` to `#5BA423` > > Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit afa83aae4a44cbdf3083cc28831ed6fd0a247206. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot). [7bd5d82](https://github.com/MetaMask/metamask-mobile/commit/7bd5d82c8f217e280c3e9b63f7e9330b3565ec94) Co-authored-by: Luis Taniça --- app/components/UI/Predict/providers/polymarket/TeamsCache.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/components/UI/Predict/providers/polymarket/TeamsCache.ts b/app/components/UI/Predict/providers/polymarket/TeamsCache.ts index a1d09d9966fa..195d09d6f860 100644 --- a/app/components/UI/Predict/providers/polymarket/TeamsCache.ts +++ b/app/components/UI/Predict/providers/polymarket/TeamsCache.ts @@ -7,7 +7,7 @@ import { getPolymarketEndpoints } from './utils'; const TEAM_COLOR_OVERRIDES: Record = { ne: '#1D4E9B', - sea: '#69BE28', + sea: '#5BA423', }; export class TeamsCache { From f9ef1d0e722e9b5e3cbcc1551b0bc21aef16925a Mon Sep 17 00:00:00 2001 From: metamaskbot Date: Tue, 27 Jan 2026 00:15:48 +0000 Subject: [PATCH 26/80] [skip ci] Bump version number to 3551 --- android/app/build.gradle | 2 +- bitrise.yml | 4 ++-- ios/MetaMask.xcodeproj/project.pbxproj | 12 ++++++------ 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index bf41bd28bbd9..29b3d1a8095f 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -188,7 +188,7 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion versionName "7.63.0" - versionCode 3550 + versionCode 3551 testBuildType System.getProperty('testBuildType', 'debug') testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" manifestPlaceholders.MM_BRANCH_KEY_TEST = "$System.env.MM_BRANCH_KEY_TEST" diff --git a/bitrise.yml b/bitrise.yml index 0fe501882c3c..387b1562a143 100644 --- a/bitrise.yml +++ b/bitrise.yml @@ -3472,13 +3472,13 @@ app: VERSION_NAME: 7.63.0 - opts: is_expand: false - VERSION_NUMBER: 3550 + VERSION_NUMBER: 3551 - opts: is_expand: false FLASK_VERSION_NAME: 7.63.0 - opts: is_expand: false - FLASK_VERSION_NUMBER: 3550 + FLASK_VERSION_NUMBER: 3551 - opts: is_expand: false ANDROID_APK_LINK: '' diff --git a/ios/MetaMask.xcodeproj/project.pbxproj b/ios/MetaMask.xcodeproj/project.pbxproj index 12db3e4372a4..148504be3af0 100644 --- a/ios/MetaMask.xcodeproj/project.pbxproj +++ b/ios/MetaMask.xcodeproj/project.pbxproj @@ -1281,7 +1281,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3550; + CURRENT_PROJECT_VERSION = 3551; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 48XVW22RCG; @@ -1350,7 +1350,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3550; + CURRENT_PROJECT_VERSION = 3551; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 48XVW22RCG; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 48XVW22RCG; @@ -1416,7 +1416,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3550; + CURRENT_PROJECT_VERSION = 3551; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 48XVW22RCG; @@ -1483,7 +1483,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3550; + CURRENT_PROJECT_VERSION = 3551; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 48XVW22RCG; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 48XVW22RCG; @@ -1646,7 +1646,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3550; + CURRENT_PROJECT_VERSION = 3551; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 48XVW22RCG; @@ -1716,7 +1716,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3550; + CURRENT_PROJECT_VERSION = 3551; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 48XVW22RCG; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 48XVW22RCG; From ade18785331f6509e44b71793f9132e0d0d55802 Mon Sep 17 00:00:00 2001 From: "runway-github[bot]" <73448015+runway-github[bot]@users.noreply.github.com> Date: Tue, 27 Jan 2026 12:48:24 +0000 Subject: [PATCH 27/80] chore(runway): cherry-pick fix: bump transaction-pay-controller to 11.1.0 (#25250) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - fix: cp-7.63.0 bump transaction-pay-controller to 11.1.0 (#25179) ## **Description** Bumps `@metamask/transaction-pay-controller` from `^11.0.0` to `^11.1.0`. ## **Changelog** CHANGELOG entry: null ## **Related issues** Fixes: #25113 ## **Manual testing steps** ## **Screenshots/Recordings** ### **Before** ### **After** ## **Pre-merge author checklist** - [x] I’ve followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile Coding Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md). - [x] I've completed the PR template to the best of my ability - [x] I’ve included tests if applicable - [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format if applicable - [x] I’ve applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors. ## **Pre-merge reviewer checklist** - [ ] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [ ] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots. [ec8b3b8](https://github.com/MetaMask/metamask-mobile/commit/ec8b3b8c0007fbb020c1bf2b01e2244ef47f661f) --- > [!NOTE] > Updates dependency versions to align with the latest transaction pay flow. > > - Bumps `@metamask/transaction-pay-controller` to `^11.1.0` in `package.json` > - Refreshes `yarn.lock` resolving newer MetaMask controller packages (e.g., `bridge-controller 64.8.2`, `bridge-status-controller 64.4.4`, `assets-controllers 96/97`, `keyring-controller 25.1.0`, `multichain-account-service 5.1.0`, and related `gas-fee`/`network`/`polling` deps) > - No application source changes > > Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit d1f24a31063fc0b87170cc9514249abe882e7742. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot). Co-authored-by: Matthew Walsh --- package.json | 2 +- yarn.lock | 236 ++++++++++++++++++++++++++++++++++++--------------- 2 files changed, 169 insertions(+), 69 deletions(-) diff --git a/package.json b/package.json index 417565fcca8e..54e3045429ae 100644 --- a/package.json +++ b/package.json @@ -296,7 +296,7 @@ "@metamask/swaps-controller": "^15.0.0", "@metamask/token-search-discovery-controller": "^4.0.0", "@metamask/transaction-controller": "patch:@metamask/transaction-controller@npm%3A62.9.0#~/.yarn/patches/@metamask-transaction-controller-npm-61.0.0-cccac388c7.patch", - "@metamask/transaction-pay-controller": "^11.0.0", + "@metamask/transaction-pay-controller": "^11.1.0", "@metamask/tron-wallet-snap": "^1.19.1", "@metamask/utils": "^11.8.1", "@ngraveio/bc-ur": "^1.1.6", diff --git a/yarn.lock b/yarn.lock index e8cb158fd426..73b832394f8f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7048,7 +7048,7 @@ __metadata: languageName: node linkType: hard -"@metamask/accounts-controller@npm:^35.0.0, @metamask/accounts-controller@npm:^35.0.1, @metamask/accounts-controller@npm:^35.0.2": +"@metamask/accounts-controller@npm:^35.0.0, @metamask/accounts-controller@npm:^35.0.2": version: 35.0.2 resolution: "@metamask/accounts-controller@npm:35.0.2" dependencies: @@ -7131,7 +7131,7 @@ __metadata: languageName: node linkType: hard -"@metamask/assets-controllers@npm:^95.1.0, @metamask/assets-controllers@npm:^95.3.0": +"@metamask/assets-controllers@npm:^95.3.0": version: 95.3.0 resolution: "@metamask/assets-controllers@npm:95.3.0" dependencies: @@ -7185,6 +7185,115 @@ __metadata: languageName: node linkType: hard +"@metamask/assets-controllers@npm:^96.0.0": + version: 96.0.0 + resolution: "@metamask/assets-controllers@npm:96.0.0" + dependencies: + "@ethereumjs/util": "npm:^9.1.0" + "@ethersproject/abi": "npm:^5.7.0" + "@ethersproject/address": "npm:^5.7.0" + "@ethersproject/bignumber": "npm:^5.7.0" + "@ethersproject/contracts": "npm:^5.7.0" + "@ethersproject/providers": "npm:^5.7.0" + "@metamask/abi-utils": "npm:^2.0.3" + "@metamask/account-tree-controller": "npm:^4.0.0" + "@metamask/accounts-controller": "npm:^35.0.2" + "@metamask/approval-controller": "npm:^8.0.0" + "@metamask/base-controller": "npm:^9.0.0" + "@metamask/contract-metadata": "npm:^2.4.0" + "@metamask/controller-utils": "npm:^11.18.0" + "@metamask/core-backend": "npm:^5.0.0" + "@metamask/eth-query": "npm:^4.0.0" + "@metamask/keyring-api": "npm:^21.0.0" + "@metamask/keyring-controller": "npm:^25.0.0" + "@metamask/messenger": "npm:^0.3.0" + "@metamask/metamask-eth-abis": "npm:^3.1.1" + "@metamask/multichain-account-service": "npm:^5.1.0" + "@metamask/network-controller": "npm:^29.0.0" + "@metamask/permission-controller": "npm:^12.2.0" + "@metamask/phishing-controller": "npm:^16.1.0" + "@metamask/polling-controller": "npm:^16.0.2" + "@metamask/preferences-controller": "npm:^22.0.0" + "@metamask/profile-sync-controller": "npm:^27.0.0" + "@metamask/rpc-errors": "npm:^7.0.2" + "@metamask/snaps-controllers": "npm:^17.2.0" + "@metamask/snaps-sdk": "npm:^10.3.0" + "@metamask/snaps-utils": "npm:^11.7.0" + "@metamask/transaction-controller": "npm:^62.9.2" + "@metamask/utils": "npm:^11.9.0" + "@types/bn.js": "npm:^5.1.5" + "@types/uuid": "npm:^8.3.0" + async-mutex: "npm:^0.5.0" + bitcoin-address-validation: "npm:^2.2.3" + bn.js: "npm:^5.2.1" + immer: "npm:^9.0.6" + lodash: "npm:^4.17.21" + multiformats: "npm:^9.9.0" + reselect: "npm:^5.1.1" + single-call-balance-checker-abi: "npm:^1.0.0" + uuid: "npm:^8.3.2" + peerDependencies: + "@metamask/providers": ^22.0.0 + webextension-polyfill: ^0.10.0 || ^0.11.0 || ^0.12.0 + checksum: 10/c5cf7363972b2f267ba96a925fd74eaee3eebde8bf470af7d4c49589b33b34fc9b8574289e4592cbce13e941201893d2ad20018da0dada8025317db0ce33df0f + languageName: node + linkType: hard + +"@metamask/assets-controllers@npm:^97.0.0": + version: 97.0.0 + resolution: "@metamask/assets-controllers@npm:97.0.0" + dependencies: + "@ethereumjs/util": "npm:^9.1.0" + "@ethersproject/abi": "npm:^5.7.0" + "@ethersproject/address": "npm:^5.7.0" + "@ethersproject/bignumber": "npm:^5.7.0" + "@ethersproject/contracts": "npm:^5.7.0" + "@ethersproject/providers": "npm:^5.7.0" + "@metamask/abi-utils": "npm:^2.0.3" + "@metamask/account-tree-controller": "npm:^4.0.0" + "@metamask/accounts-controller": "npm:^35.0.2" + "@metamask/approval-controller": "npm:^8.0.0" + "@metamask/base-controller": "npm:^9.0.0" + "@metamask/contract-metadata": "npm:^2.4.0" + "@metamask/controller-utils": "npm:^11.18.0" + "@metamask/core-backend": "npm:^5.0.0" + "@metamask/eth-query": "npm:^4.0.0" + "@metamask/keyring-api": "npm:^21.0.0" + "@metamask/keyring-controller": "npm:^25.1.0" + "@metamask/messenger": "npm:^0.3.0" + "@metamask/metamask-eth-abis": "npm:^3.1.1" + "@metamask/multichain-account-service": "npm:^5.1.0" + "@metamask/network-controller": "npm:^29.0.0" + "@metamask/network-enablement-controller": "npm:^4.1.0" + "@metamask/permission-controller": "npm:^12.2.0" + "@metamask/phishing-controller": "npm:^16.1.0" + "@metamask/polling-controller": "npm:^16.0.2" + "@metamask/preferences-controller": "npm:^22.0.0" + "@metamask/profile-sync-controller": "npm:^27.0.0" + "@metamask/rpc-errors": "npm:^7.0.2" + "@metamask/snaps-controllers": "npm:^17.2.0" + "@metamask/snaps-sdk": "npm:^10.3.0" + "@metamask/snaps-utils": "npm:^11.7.0" + "@metamask/transaction-controller": "npm:^62.9.2" + "@metamask/utils": "npm:^11.9.0" + "@types/bn.js": "npm:^5.1.5" + "@types/uuid": "npm:^8.3.0" + async-mutex: "npm:^0.5.0" + bitcoin-address-validation: "npm:^2.2.3" + bn.js: "npm:^5.2.1" + immer: "npm:^9.0.6" + lodash: "npm:^4.17.21" + multiformats: "npm:^9.9.0" + reselect: "npm:^5.1.1" + single-call-balance-checker-abi: "npm:^1.0.0" + uuid: "npm:^8.3.2" + peerDependencies: + "@metamask/providers": ^22.0.0 + webextension-polyfill: ^0.10.0 || ^0.11.0 || ^0.12.0 + checksum: 10/44f6adc0f3263a17c2be49aff7c558f0478c41f8c0318c03db5706451284ccf56c5534d56366c6504538e89eda8aa86669310467a170276f28875c17bcbd6367 + languageName: node + linkType: hard + "@metamask/auth-network-utils@npm:^0.3.0": version: 0.3.1 resolution: "@metamask/auth-network-utils@npm:0.3.1" @@ -7254,9 +7363,9 @@ __metadata: languageName: node linkType: hard -"@metamask/bridge-controller@npm:^64.4.0, @metamask/bridge-controller@npm:^64.4.1, @metamask/bridge-controller@npm:^64.7.0": - version: 64.7.0 - resolution: "@metamask/bridge-controller@npm:64.7.0" +"@metamask/bridge-controller@npm:^64.7.0, @metamask/bridge-controller@npm:^64.8.1": + version: 64.8.2 + resolution: "@metamask/bridge-controller@npm:64.8.2" dependencies: "@ethersproject/address": "npm:^5.7.0" "@ethersproject/bignumber": "npm:^5.7.0" @@ -7264,7 +7373,7 @@ __metadata: "@ethersproject/contracts": "npm:^5.7.0" "@ethersproject/providers": "npm:^5.7.0" "@metamask/accounts-controller": "npm:^35.0.2" - "@metamask/assets-controllers": "npm:^95.3.0" + "@metamask/assets-controllers": "npm:^97.0.0" "@metamask/base-controller": "npm:^9.0.0" "@metamask/controller-utils": "npm:^11.18.0" "@metamask/gas-fee-controller": "npm:^26.0.2" @@ -7281,28 +7390,28 @@ __metadata: bignumber.js: "npm:^9.1.2" reselect: "npm:^5.1.1" uuid: "npm:^8.3.2" - checksum: 10/ede8913026dcb21f0ac9147e3894cdf5ba3afc735e79535893d86d05b4283a422ddbc0685cb04129d09616fd61aef916e440f221355bb702f4f881f223854cfb + checksum: 10/d909662a42e24bae9c1489cf719460c455905e25e3a61ba3f69f67e74a3c93d9ffe50fe5eff6e8959464902432875bfc874cf4f95329c4f6bec8c6d06561c3e2 languageName: node linkType: hard -"@metamask/bridge-status-controller@npm:^64.4.1": - version: 64.4.2 - resolution: "@metamask/bridge-status-controller@npm:64.4.2" +"@metamask/bridge-status-controller@npm:^64.4.1, @metamask/bridge-status-controller@npm:^64.4.4": + version: 64.4.4 + resolution: "@metamask/bridge-status-controller@npm:64.4.4" dependencies: - "@metamask/accounts-controller": "npm:^35.0.1" + "@metamask/accounts-controller": "npm:^35.0.2" "@metamask/base-controller": "npm:^9.0.0" - "@metamask/bridge-controller": "npm:^64.4.1" + "@metamask/bridge-controller": "npm:^64.8.1" "@metamask/controller-utils": "npm:^11.18.0" - "@metamask/gas-fee-controller": "npm:^26.0.1" - "@metamask/network-controller": "npm:^28.0.0" - "@metamask/polling-controller": "npm:^16.0.1" + "@metamask/gas-fee-controller": "npm:^26.0.2" + "@metamask/network-controller": "npm:^29.0.0" + "@metamask/polling-controller": "npm:^16.0.2" "@metamask/snaps-controllers": "npm:^17.2.0" "@metamask/superstruct": "npm:^3.1.0" - "@metamask/transaction-controller": "npm:^62.9.1" + "@metamask/transaction-controller": "npm:^62.9.2" "@metamask/utils": "npm:^11.9.0" bignumber.js: "npm:^9.1.2" uuid: "npm:^8.3.2" - checksum: 10/8c104759083aae0cc7a61974c812d0c0d4a9082e98378db94cd3133ae2b476b9969ab390ffb53b4d30e6c59934810b153441e3377611372c3e0caf45e815368c + checksum: 10/92d41e1c7441884c82fe6108011d8e33180998f470bb6b5610a15660741f543d07932223b0d56fc7c0c5c98fcad33a54d0ecf1d6b8a104e0ce595c3c6b4aa86e languageName: node linkType: hard @@ -7934,7 +8043,7 @@ __metadata: languageName: node linkType: hard -"@metamask/gas-fee-controller@npm:^26.0.0, @metamask/gas-fee-controller@npm:^26.0.1, @metamask/gas-fee-controller@npm:^26.0.2": +"@metamask/gas-fee-controller@npm:^26.0.0, @metamask/gas-fee-controller@npm:^26.0.2": version: 26.0.2 resolution: "@metamask/gas-fee-controller@npm:26.0.2" dependencies: @@ -8037,9 +8146,9 @@ __metadata: languageName: node linkType: hard -"@metamask/keyring-controller@npm:^25.0.0": - version: 25.0.0 - resolution: "@metamask/keyring-controller@npm:25.0.0" +"@metamask/keyring-controller@npm:^25.0.0, @metamask/keyring-controller@npm:^25.1.0": + version: 25.1.0 + resolution: "@metamask/keyring-controller@npm:25.1.0" dependencies: "@ethereumjs/util": "npm:^9.1.0" "@metamask/base-controller": "npm:^9.0.0" @@ -8050,13 +8159,13 @@ __metadata: "@metamask/keyring-api": "npm:^21.0.0" "@metamask/keyring-internal-api": "npm:^9.0.0" "@metamask/messenger": "npm:^0.3.0" - "@metamask/utils": "npm:^11.8.1" + "@metamask/utils": "npm:^11.9.0" async-mutex: "npm:^0.5.0" ethereumjs-wallet: "npm:^1.0.1" immer: "npm:^9.0.6" lodash: "npm:^4.17.21" ulid: "npm:^2.3.0" - checksum: 10/7258f70ef463f8f7260e64f7e22b695ed01520da46e77a4a01e8beff14b8da1545f905f615386b9d4e10b7f383651828b97f655202f410667f5028e2633aac25 + checksum: 10/e81fccb901ea3627b97e725a789832eb1e1f2ae61bfc00eaee6ce5717d65a39c73d6c683c8643b87de1ce6d98db76fc3e60004acb0a4b5ea21f05a404204f708 languageName: node linkType: hard @@ -8217,12 +8326,12 @@ __metadata: languageName: node linkType: hard -"@metamask/multichain-account-service@npm:^5.0.0": - version: 5.0.0 - resolution: "@metamask/multichain-account-service@npm:5.0.0" +"@metamask/multichain-account-service@npm:^5.0.0, @metamask/multichain-account-service@npm:^5.1.0": + version: 5.1.0 + resolution: "@metamask/multichain-account-service@npm:5.1.0" dependencies: "@ethereumjs/util": "npm:^9.1.0" - "@metamask/accounts-controller": "npm:^35.0.0" + "@metamask/accounts-controller": "npm:^35.0.2" "@metamask/base-controller": "npm:^9.0.0" "@metamask/eth-snap-keyring": "npm:^18.0.0" "@metamask/key-tree": "npm:^10.1.1" @@ -8243,7 +8352,7 @@ __metadata: "@metamask/account-api": ^0.12.0 "@metamask/providers": ^22.0.0 webextension-polyfill: ^0.10.0 || ^0.11.0 || ^0.12.0 - checksum: 10/2a65158752f5b92cfbaa00a7488382e489af8178a585a4a327fa025f885e2c08fbdbf48f141d8efbea3405e4104d5d976081c9fe7bfec2a7ae9b6a7a67d074ec + checksum: 10/800ab4ec699ab3f3f602f54126b451934186754f1c02d19a3c398138ef48ebc816117c1dabd261ab8b9cbd383c2c0a35f9f55a01ac33a1382507d4c509a8de70 languageName: node linkType: hard @@ -8373,33 +8482,6 @@ __metadata: languageName: node linkType: hard -"@metamask/network-controller@npm:^28.0.0": - version: 28.0.0 - resolution: "@metamask/network-controller@npm:28.0.0" - dependencies: - "@metamask/base-controller": "npm:^9.0.0" - "@metamask/controller-utils": "npm:^11.18.0" - "@metamask/eth-block-tracker": "npm:^15.0.0" - "@metamask/eth-json-rpc-infura": "npm:^10.3.0" - "@metamask/eth-json-rpc-middleware": "npm:^22.0.1" - "@metamask/eth-json-rpc-provider": "npm:^6.0.0" - "@metamask/eth-query": "npm:^4.0.0" - "@metamask/json-rpc-engine": "npm:^10.2.0" - "@metamask/messenger": "npm:^0.3.0" - "@metamask/rpc-errors": "npm:^7.0.2" - "@metamask/swappable-obj-proxy": "npm:^2.3.0" - "@metamask/utils": "npm:^11.9.0" - async-mutex: "npm:^0.5.0" - fast-deep-equal: "npm:^3.1.3" - immer: "npm:^9.0.6" - loglevel: "npm:^1.8.1" - reselect: "npm:^5.1.1" - uri-js: "npm:^4.4.1" - uuid: "npm:^8.3.2" - checksum: 10/893142b6c27bc787c7ed647de112655851df4b51f3cf4e61773a2c9abdfcfb90a7907ad1a574b82ba6664cbf0d0fe0d31456ac513859ad66072053bf9336ec1c - languageName: node - linkType: hard - "@metamask/network-controller@npm:^29.0.0": version: 29.0.0 resolution: "@metamask/network-controller@npm:29.0.0" @@ -8446,6 +8528,24 @@ __metadata: languageName: node linkType: hard +"@metamask/network-enablement-controller@npm:^4.1.0": + version: 4.1.0 + resolution: "@metamask/network-enablement-controller@npm:4.1.0" + dependencies: + "@metamask/base-controller": "npm:^9.0.0" + "@metamask/controller-utils": "npm:^11.18.0" + "@metamask/keyring-api": "npm:^21.0.0" + "@metamask/messenger": "npm:^0.3.0" + "@metamask/multichain-network-controller": "npm:^3.0.2" + "@metamask/network-controller": "npm:^29.0.0" + "@metamask/slip44": "npm:^4.3.0" + "@metamask/transaction-controller": "npm:^62.9.2" + "@metamask/utils": "npm:^11.9.0" + reselect: "npm:^5.1.1" + checksum: 10/3cc79865a49b95e7c7577eda6c1d00e1fdeb60c4357adde865fcacd4e334d421865f319d78c2659bd6745196beefed4651075bbb81e4b8caeeede20d5f8622ae + languageName: node + linkType: hard + "@metamask/network-enablement-controller@patch:@metamask/network-enablement-controller@npm%3A3.1.0#~/.yarn/patches/@metamask-network-enablement-controller-npm-3.1.0-1c0cfefdc3.patch": version: 3.1.0 resolution: "@metamask/network-enablement-controller@patch:@metamask/network-enablement-controller@npm%3A3.1.0#~/.yarn/patches/@metamask-network-enablement-controller-npm-3.1.0-1c0cfefdc3.patch::version=3.1.0&hash=e5166e" @@ -8599,7 +8699,7 @@ __metadata: languageName: node linkType: hard -"@metamask/polling-controller@npm:^16.0.0, @metamask/polling-controller@npm:^16.0.1, @metamask/polling-controller@npm:^16.0.2": +"@metamask/polling-controller@npm:^16.0.0, @metamask/polling-controller@npm:^16.0.2": version: 16.0.2 resolution: "@metamask/polling-controller@npm:16.0.2" dependencies: @@ -9368,7 +9468,7 @@ __metadata: languageName: node linkType: hard -"@metamask/transaction-controller@npm:^62.9.1, @metamask/transaction-controller@npm:^62.9.2": +"@metamask/transaction-controller@npm:^62.9.2": version: 62.9.2 resolution: "@metamask/transaction-controller@npm:62.9.2" dependencies: @@ -9444,29 +9544,29 @@ __metadata: languageName: node linkType: hard -"@metamask/transaction-pay-controller@npm:^11.0.0": - version: 11.0.0 - resolution: "@metamask/transaction-pay-controller@npm:11.0.0" +"@metamask/transaction-pay-controller@npm:^11.1.0": + version: 11.1.0 + resolution: "@metamask/transaction-pay-controller@npm:11.1.0" dependencies: "@ethersproject/abi": "npm:^5.7.0" "@ethersproject/contracts": "npm:^5.7.0" - "@metamask/assets-controllers": "npm:^95.1.0" + "@metamask/assets-controllers": "npm:^96.0.0" "@metamask/base-controller": "npm:^9.0.0" - "@metamask/bridge-controller": "npm:^64.4.0" - "@metamask/bridge-status-controller": "npm:^64.4.1" + "@metamask/bridge-controller": "npm:^64.8.1" + "@metamask/bridge-status-controller": "npm:^64.4.4" "@metamask/controller-utils": "npm:^11.18.0" - "@metamask/gas-fee-controller": "npm:^26.0.0" + "@metamask/gas-fee-controller": "npm:^26.0.2" "@metamask/messenger": "npm:^0.3.0" "@metamask/metamask-eth-abis": "npm:^3.1.1" - "@metamask/network-controller": "npm:^27.2.0" + "@metamask/network-controller": "npm:^29.0.0" "@metamask/remote-feature-flag-controller": "npm:^4.0.0" - "@metamask/transaction-controller": "npm:^62.9.0" + "@metamask/transaction-controller": "npm:^62.9.2" "@metamask/utils": "npm:^11.9.0" bignumber.js: "npm:^9.1.2" bn.js: "npm:^5.2.1" immer: "npm:^9.0.6" lodash: "npm:^4.17.21" - checksum: 10/a2a0f8108cd6da860901c460f1df905d1bd8c337231c5b956678ef73e67e2d0f7487f1c6ed3a598cf7eaf5a9c531fbc6ee8e49d25d7070c99875f8f5adbd5493 + checksum: 10/98385db74a16ed91e21d5e646bf302046b80bbf6f48303f8393b9bf98c42e6f5dac0b5c883abb999be884f2cebf422b15dd34aa04cc7a215ea17a15c10a4e1ad languageName: node linkType: hard @@ -34146,7 +34246,7 @@ __metadata: "@metamask/test-dapp-solana": "npm:^0.3.0" "@metamask/token-search-discovery-controller": "npm:^4.0.0" "@metamask/transaction-controller": "patch:@metamask/transaction-controller@npm%3A62.9.0#~/.yarn/patches/@metamask-transaction-controller-npm-61.0.0-cccac388c7.patch" - "@metamask/transaction-pay-controller": "npm:^11.0.0" + "@metamask/transaction-pay-controller": "npm:^11.1.0" "@metamask/tron-wallet-snap": "npm:^1.19.1" "@metamask/utils": "npm:^11.8.1" "@ngraveio/bc-ur": "npm:^1.1.6" From 848d1e702a3bec7ca27fee827349fd2bb8921212 Mon Sep 17 00:00:00 2001 From: metamaskbot Date: Tue, 27 Jan 2026 12:49:54 +0000 Subject: [PATCH 28/80] [skip ci] Bump version number to 3555 --- android/app/build.gradle | 2 +- bitrise.yml | 4 ++-- ios/MetaMask.xcodeproj/project.pbxproj | 12 ++++++------ 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 29b3d1a8095f..336650c8831a 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -188,7 +188,7 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion versionName "7.63.0" - versionCode 3551 + versionCode 3555 testBuildType System.getProperty('testBuildType', 'debug') testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" manifestPlaceholders.MM_BRANCH_KEY_TEST = "$System.env.MM_BRANCH_KEY_TEST" diff --git a/bitrise.yml b/bitrise.yml index 387b1562a143..2390cb0ab789 100644 --- a/bitrise.yml +++ b/bitrise.yml @@ -3472,13 +3472,13 @@ app: VERSION_NAME: 7.63.0 - opts: is_expand: false - VERSION_NUMBER: 3551 + VERSION_NUMBER: 3555 - opts: is_expand: false FLASK_VERSION_NAME: 7.63.0 - opts: is_expand: false - FLASK_VERSION_NUMBER: 3551 + FLASK_VERSION_NUMBER: 3555 - opts: is_expand: false ANDROID_APK_LINK: '' diff --git a/ios/MetaMask.xcodeproj/project.pbxproj b/ios/MetaMask.xcodeproj/project.pbxproj index 148504be3af0..5d2ab04ac07d 100644 --- a/ios/MetaMask.xcodeproj/project.pbxproj +++ b/ios/MetaMask.xcodeproj/project.pbxproj @@ -1281,7 +1281,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3551; + CURRENT_PROJECT_VERSION = 3555; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 48XVW22RCG; @@ -1350,7 +1350,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3551; + CURRENT_PROJECT_VERSION = 3555; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 48XVW22RCG; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 48XVW22RCG; @@ -1416,7 +1416,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3551; + CURRENT_PROJECT_VERSION = 3555; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 48XVW22RCG; @@ -1483,7 +1483,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3551; + CURRENT_PROJECT_VERSION = 3555; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 48XVW22RCG; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 48XVW22RCG; @@ -1646,7 +1646,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3551; + CURRENT_PROJECT_VERSION = 3555; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 48XVW22RCG; @@ -1716,7 +1716,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3551; + CURRENT_PROJECT_VERSION = 3555; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 48XVW22RCG; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 48XVW22RCG; From f2ddb8c50f8d4c8e175c162001b1580f5ac0f2c4 Mon Sep 17 00:00:00 2001 From: "runway-github[bot]" <73448015+runway-github[bot]@users.noreply.github.com> Date: Tue, 27 Jan 2026 13:40:25 +0000 Subject: [PATCH 29/80] chore(runway): cherry-pick fix: rehydration login cp-7.63.0 (#25261) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - fix: rehydration login cp-7.63.0 (#25246) ## **Description** The new unlockWallet check for existingUser flag before proceed with rehydration since rehydration happen before existing flag is set, it will always not able to rehydrate when call with unLockWallet. ## **Changelog** CHANGELOG entry: null ## **Related issues** Fixes: https://github.com/MetaMask/metamask-mobile/issues/25247 ## **Manual testing steps** ```gherkin Feature: Login with rehydration Scenario: user login with existing social account Given enter password at rehydration screen Then should unlocked the wallet ``` ## **Screenshots/Recordings** ### **Before** https://github.com/user-attachments/assets/da6b051f-d859-4625-9f08-d3256de85d00 ### **After** https://github.com/user-attachments/assets/5a313b68-8702-488c-b4a4-789e72b77a5d ## **Pre-merge author checklist** - [x] I’ve followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile Coding Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md). - [x] I've completed the PR template to the best of my ability - [x] I’ve included tests if applicable - [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format if applicable - [x] I’ve applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors. ## **Pre-merge reviewer checklist** - [ ] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [ ] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots. --- > [!NOTE] > Allows seedless OAuth rehydration to unlock during app start. > > - Updates `unlockWallet` to treat `authPreference.oauth2Login` as an existing user, attempting unlock even when `existingUser` is not yet set > - Prevents blocked rehydration flows by deriving/using password and proceeding with post-login steps > > Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 54718af9174e1422e3fd6499d2f30e4e5bfc485b. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot). [732c3e5](https://github.com/MetaMask/metamask-mobile/commit/732c3e5dc134c8a8b31624f2f315d054a2947bb9) Co-authored-by: ieow <4881057+ieow@users.noreply.github.com> --- app/core/Authentication/Authentication.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/core/Authentication/Authentication.ts b/app/core/Authentication/Authentication.ts index 4e78cec7975a..6df97d380051 100644 --- a/app/core/Authentication/Authentication.ts +++ b/app/core/Authentication/Authentication.ts @@ -765,8 +765,9 @@ class AuthenticationService { try { const existingUser = selectExistingUser(ReduxService.store.getState()); - if (existingUser) { + if (existingUser || authPreference?.oauth2Login) { // User exists. Attempt to unlock wallet. + // existing user is always false when user try to rehydrate if (password) { // Explicitly provided password. From cbf4e7b844cfccdd4298ff137866378aa8fa0805 Mon Sep 17 00:00:00 2001 From: metamaskbot Date: Tue, 27 Jan 2026 13:41:57 +0000 Subject: [PATCH 30/80] [skip ci] Bump version number to 3557 --- android/app/build.gradle | 2 +- bitrise.yml | 4 ++-- ios/MetaMask.xcodeproj/project.pbxproj | 12 ++++++------ 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 336650c8831a..322fea817912 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -188,7 +188,7 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion versionName "7.63.0" - versionCode 3555 + versionCode 3557 testBuildType System.getProperty('testBuildType', 'debug') testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" manifestPlaceholders.MM_BRANCH_KEY_TEST = "$System.env.MM_BRANCH_KEY_TEST" diff --git a/bitrise.yml b/bitrise.yml index 2390cb0ab789..2dd0fdb9714b 100644 --- a/bitrise.yml +++ b/bitrise.yml @@ -3472,13 +3472,13 @@ app: VERSION_NAME: 7.63.0 - opts: is_expand: false - VERSION_NUMBER: 3555 + VERSION_NUMBER: 3557 - opts: is_expand: false FLASK_VERSION_NAME: 7.63.0 - opts: is_expand: false - FLASK_VERSION_NUMBER: 3555 + FLASK_VERSION_NUMBER: 3557 - opts: is_expand: false ANDROID_APK_LINK: '' diff --git a/ios/MetaMask.xcodeproj/project.pbxproj b/ios/MetaMask.xcodeproj/project.pbxproj index 5d2ab04ac07d..b2ea0615c06c 100644 --- a/ios/MetaMask.xcodeproj/project.pbxproj +++ b/ios/MetaMask.xcodeproj/project.pbxproj @@ -1281,7 +1281,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3555; + CURRENT_PROJECT_VERSION = 3557; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 48XVW22RCG; @@ -1350,7 +1350,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3555; + CURRENT_PROJECT_VERSION = 3557; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 48XVW22RCG; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 48XVW22RCG; @@ -1416,7 +1416,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3555; + CURRENT_PROJECT_VERSION = 3557; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 48XVW22RCG; @@ -1483,7 +1483,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3555; + CURRENT_PROJECT_VERSION = 3557; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 48XVW22RCG; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 48XVW22RCG; @@ -1646,7 +1646,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3555; + CURRENT_PROJECT_VERSION = 3557; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 48XVW22RCG; @@ -1716,7 +1716,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3555; + CURRENT_PROJECT_VERSION = 3557; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 48XVW22RCG; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 48XVW22RCG; From 4812116151816c29a22b48e37537cdc36c30e8a2 Mon Sep 17 00:00:00 2001 From: "runway-github[bot]" <73448015+runway-github[bot]@users.noreply.github.com> Date: Wed, 28 Jan 2026 15:58:29 +0000 Subject: [PATCH 31/80] chore(runway): cherry-pick fix: cp-7.63.0 Fix `mm_pay_quote_*` metrics (#25306) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - fix: cp-7.63.0 Fix `mm_pay_quote_*` metrics (#25159) ## **Description** This PR aims to fix `mm_pay_quote_requested` and `mm_pay_quote_loaded` on certain `Transaction*` events. After this PR metrics will be setlled as noted below: 1. On `TransactionAdded, both `mm_pay_quote_requested` and `mm_pay_quote_loaded` are initialized to `false`. 2. If no quote is requested and the user rejects the transaction, both values stay `false`. 3. If the user views the quote and then rejects the transaction, both values are true in the `TransactionRejected` event. 4. If the user requests a quote but it hasn’t finished loading before they reject, `mm_pay_quote_requested` is true and `mm_pay_quote_loaded` is false. 5. If the user requests a quote, let it load then change the amount to get new quote but leave it while loading, both values remain `true` as they request and load before. 6. If the user views the quote and approves the transaction, both values are true in the finalized `TransactionConfirmed` event. ## **Changelog** CHANGELOG entry: ## **Related issues** Fixes: https://github.com/MetaMask/metamask-mobile/issues/25112 ## **Manual testing steps** ```gherkin Feature: my feature name Scenario: user [verb for user action] Given [describe expected initial app state] When user [verb for user action] Then [describe expected outcome] ``` ## **Screenshots/Recordings** ### **Before** ### **After** ## **Pre-merge author checklist** - [X] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile Coding Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md). - [X] I've completed the PR template to the best of my ability - [X] I've included tests if applicable - [X] I've documented my code using [JSDoc](https://jsdoc.app/) format if applicable - [X] I've applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors. ## **Pre-merge reviewer checklist** - [ ] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [ ] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots. --- > [!NOTE] > Aligns `mm_pay_quote_*` metrics and centralizes source-amount logic. > > - New `useTransactionPayHasSourceAmount` hook (with tests) to detect when quotes are required; integrated into `custom-amount-info` and `useTransactionCustomAmount` > - `useTransactionCustomAmount` now sets `mm_pay_quote_requested` when updating amount only if a source amount exists > - `useTransactionPayMetrics` refactored to read `mm_pay_quote_requested` from stored metrics and set `mm_pay_quote_loaded` via an internal ref once quotes are present; removes dependency on quote-loading flag > - Expanded/updated tests for metrics, custom amount behavior, and quote flags > > Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit e1b4bd1433896fe63f200dcefe0181f2fa3b858f. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot). [5f3d172](https://github.com/MetaMask/metamask-mobile/commit/5f3d1729386bf97b7f5d0c032912edd25b5fb327) Co-authored-by: OGPoyraz --- .../custom-amount-info/custom-amount-info.tsx | 13 +- .../useTransactionPayHasSourceAmount.test.ts | 119 ++++++++++++++++++ .../pay/useTransactionPayHasSourceAmount.ts | 26 ++++ .../pay/useTransactionPayMetrics.test.ts | 40 ++---- .../hooks/pay/useTransactionPayMetrics.ts | 32 +++-- .../useTransactionCustomAmount.test.ts | 50 ++++++++ .../useTransactionCustomAmount.ts | 17 ++- 7 files changed, 241 insertions(+), 56 deletions(-) create mode 100644 app/components/Views/confirmations/hooks/pay/useTransactionPayHasSourceAmount.test.ts create mode 100644 app/components/Views/confirmations/hooks/pay/useTransactionPayHasSourceAmount.ts diff --git a/app/components/Views/confirmations/components/info/custom-amount-info/custom-amount-info.tsx b/app/components/Views/confirmations/components/info/custom-amount-info/custom-amount-info.tsx index ab49fce7f7af..25667964d6ff 100644 --- a/app/components/Views/confirmations/components/info/custom-amount-info/custom-amount-info.tsx +++ b/app/components/Views/confirmations/components/info/custom-amount-info/custom-amount-info.tsx @@ -28,8 +28,8 @@ import { useIsTransactionPayLoading, useTransactionPayQuotes, useTransactionPayRequiredTokens, - useTransactionPaySourceAmounts, } from '../../../hooks/pay/useTransactionPayData'; +import { useTransactionPayHasSourceAmount } from '../../../hooks/pay/useTransactionPayHasSourceAmount'; import { useTransactionPayMetrics } from '../../../hooks/pay/useTransactionPayMetrics'; import { useTransactionPayAvailableTokens } from '../../../hooks/pay/useTransactionPayAvailableTokens'; import Text, { @@ -290,16 +290,7 @@ function useIsResultReady({ }) { const quotes = useTransactionPayQuotes(); const isQuotesLoading = useIsTransactionPayLoading(); - const requiredTokens = useTransactionPayRequiredTokens(); - const sourceAmounts = useTransactionPaySourceAmounts(); - - const hasSourceAmount = sourceAmounts?.some((a) => - requiredTokens.some( - (rt) => - rt.address.toLowerCase() === a.targetTokenAddress.toLowerCase() && - !rt.skipIfBalance, - ), - ); + const hasSourceAmount = useTransactionPayHasSourceAmount(); return ( !isKeyboardVisible && diff --git a/app/components/Views/confirmations/hooks/pay/useTransactionPayHasSourceAmount.test.ts b/app/components/Views/confirmations/hooks/pay/useTransactionPayHasSourceAmount.test.ts new file mode 100644 index 000000000000..794d362ecc92 --- /dev/null +++ b/app/components/Views/confirmations/hooks/pay/useTransactionPayHasSourceAmount.test.ts @@ -0,0 +1,119 @@ +import { + TransactionPayRequiredToken, + TransactionPaySourceAmount, +} from '@metamask/transaction-pay-controller'; +import { renderHookWithProvider } from '../../../../../util/test/renderWithProvider'; +import { useTransactionPayHasSourceAmount } from './useTransactionPayHasSourceAmount'; +import { merge } from 'lodash'; +import { + simpleSendTransactionControllerMock, + transactionIdMock, +} from '../../__mocks__/controllers/transaction-controller-mock'; +import { transactionApprovalControllerMock } from '../../__mocks__/controllers/approval-controller-mock'; +import { Hex } from '@metamask/utils'; +import { + ConfirmationContextParams, + useConfirmationContext, +} from '../../context/confirmation-context'; + +jest.mock('../../context/confirmation-context'); + +const TOKEN_ADDRESS_MOCK = '0x123' as Hex; +const OTHER_TOKEN_ADDRESS_MOCK = '0x456' as Hex; + +function createSourceAmount( + targetTokenAddress: Hex, +): TransactionPaySourceAmount { + return { + targetTokenAddress, + } as unknown as TransactionPaySourceAmount; +} + +function createRequiredToken( + address: Hex, + skipIfBalance: boolean, +): TransactionPayRequiredToken { + return { + address, + skipIfBalance, + } as unknown as TransactionPayRequiredToken; +} + +function runHook({ + sourceAmounts = [], + tokens = [], +}: { + sourceAmounts?: TransactionPaySourceAmount[]; + tokens?: TransactionPayRequiredToken[]; +} = {}) { + const state = merge( + {}, + simpleSendTransactionControllerMock, + transactionApprovalControllerMock, + { + engine: { + backgroundState: { + TransactionPayController: { + transactionData: { + [transactionIdMock]: { + isLoading: false, + sourceAmounts, + tokens, + }, + }, + }, + }, + }, + }, + ); + + return renderHookWithProvider(useTransactionPayHasSourceAmount, { state }); +} + +describe('useTransactionPayHasSourceAmount', () => { + const useConfirmationContextMock = jest.mocked(useConfirmationContext); + + beforeEach(() => { + jest.resetAllMocks(); + + useConfirmationContextMock.mockReturnValue({ + isTransactionDataUpdating: false, + } as ConfirmationContextParams); + }); + + it('returns true when there are non-optional source amounts', () => { + const { result } = runHook({ + sourceAmounts: [createSourceAmount(TOKEN_ADDRESS_MOCK)], + tokens: [createRequiredToken(TOKEN_ADDRESS_MOCK, false)], + }); + + expect(result.current).toBe(true); + }); + + it('returns false when source amounts are empty', () => { + const { result } = runHook({ + sourceAmounts: [], + tokens: [createRequiredToken(TOKEN_ADDRESS_MOCK, false)], + }); + + expect(result.current).toBe(false); + }); + + it('returns false when all source amounts are optional', () => { + const { result } = runHook({ + sourceAmounts: [createSourceAmount(TOKEN_ADDRESS_MOCK)], + tokens: [createRequiredToken(TOKEN_ADDRESS_MOCK, true)], + }); + + expect(result.current).toBe(false); + }); + + it('returns false when source amounts do not match required tokens', () => { + const { result } = runHook({ + sourceAmounts: [createSourceAmount(OTHER_TOKEN_ADDRESS_MOCK)], + tokens: [createRequiredToken(TOKEN_ADDRESS_MOCK, false)], + }); + + expect(result.current).toBe(false); + }); +}); diff --git a/app/components/Views/confirmations/hooks/pay/useTransactionPayHasSourceAmount.ts b/app/components/Views/confirmations/hooks/pay/useTransactionPayHasSourceAmount.ts new file mode 100644 index 000000000000..4b395d8c88ef --- /dev/null +++ b/app/components/Views/confirmations/hooks/pay/useTransactionPayHasSourceAmount.ts @@ -0,0 +1,26 @@ +import { useMemo } from 'react'; +import { + useTransactionPayRequiredTokens, + useTransactionPaySourceAmounts, +} from './useTransactionPayData'; + +/** + * Returns whether there are non-optional source amounts that require a quote. + * This is true when the user needs to bridge/swap tokens to complete the transaction. + */ +export function useTransactionPayHasSourceAmount() { + const sourceAmounts = useTransactionPaySourceAmounts(); + const requiredTokens = useTransactionPayRequiredTokens(); + + return useMemo( + () => + sourceAmounts?.some((a) => + requiredTokens.some( + (rt) => + rt.address.toLowerCase() === a.targetTokenAddress.toLowerCase() && + !rt.skipIfBalance, + ), + ) ?? false, + [sourceAmounts, requiredTokens], + ); +} diff --git a/app/components/Views/confirmations/hooks/pay/useTransactionPayMetrics.test.ts b/app/components/Views/confirmations/hooks/pay/useTransactionPayMetrics.test.ts index a54e9dffe912..8027479a64cd 100644 --- a/app/components/Views/confirmations/hooks/pay/useTransactionPayMetrics.test.ts +++ b/app/components/Views/confirmations/hooks/pay/useTransactionPayMetrics.test.ts @@ -21,7 +21,6 @@ import { } from '@metamask/transaction-pay-controller'; import { Json } from '@metamask/utils'; import { - useIsTransactionPayQuoteLoading, useTransactionPayQuotes, useTransactionPayRequiredTokens, useTransactionPayTotals, @@ -37,9 +36,13 @@ jest.mock('../pay/useTransactionPayData'); jest.mock('./useTransactionPayAvailableTokens'); jest.mock('../send/useAccountTokens'); +const mockSelectConfirmationMetricsById = jest.fn(); + jest.mock('../../../../../core/redux/slices/confirmationMetrics', () => ({ ...jest.requireActual('../../../../../core/redux/slices/confirmationMetrics'), updateConfirmationMetric: jest.fn(), + selectConfirmationMetricsById: (...args: unknown[]) => + mockSelectConfirmationMetricsById(...args), })); const CHAIN_ID_MOCK = '0x1'; @@ -89,10 +92,6 @@ describe('useTransactionPayMetrics', () => { useTransactionPayAvailableTokens, ); - const useIsTransactionPayQuoteLoadingMock = jest.mocked( - useIsTransactionPayQuoteLoading, - ); - const useAccountTokensMock = jest.mocked(useAccountTokens); beforeEach(() => { @@ -114,8 +113,8 @@ describe('useTransactionPayMetrics', () => { } as never); useTransactionPayQuotesMock.mockReturnValue([]); - useIsTransactionPayQuoteLoadingMock.mockReturnValue(false); useAccountTokensMock.mockReturnValue([]); + mockSelectConfirmationMetricsById.mockReturnValue(undefined); useTransactionPayAvailableTokensMock.mockReturnValue([ {}, @@ -343,12 +342,14 @@ describe('useTransactionPayMetrics', () => { }); }); - it('is true when loading starts', async () => { + it('is true when stored in metrics', async () => { useTransactionPayTokenMock.mockReturnValue({ payToken: PAY_TOKEN_MOCK, setPayToken: noop, } as ReturnType); - useIsTransactionPayQuoteLoadingMock.mockReturnValue(true); + mockSelectConfirmationMetricsById.mockReturnValue({ + properties: { mm_pay_quote_requested: true }, + }); runHook(); @@ -389,29 +390,6 @@ describe('useTransactionPayMetrics', () => { }); }); - it('is true when has quotes even while loading new quotes', async () => { - useTransactionPayTokenMock.mockReturnValue({ - payToken: PAY_TOKEN_MOCK, - setPayToken: noop, - } as ReturnType); - useIsTransactionPayQuoteLoadingMock.mockReturnValue(true); - useTransactionPayQuotesMock.mockReturnValue([QUOTE_MOCK]); - - runHook(); - - await act(async () => noop()); - - expect(updateConfirmationMetricMock).toHaveBeenCalledWith({ - id: transactionIdMock, - params: { - properties: expect.objectContaining({ - mm_pay_quote_loaded: true, - }), - sensitiveProperties: {}, - }, - }); - }); - it('is false when no quotes', async () => { useTransactionPayTokenMock.mockReturnValue({ payToken: PAY_TOKEN_MOCK, diff --git a/app/components/Views/confirmations/hooks/pay/useTransactionPayMetrics.ts b/app/components/Views/confirmations/hooks/pay/useTransactionPayMetrics.ts index a42bdf7f7f28..a4310203a8c9 100644 --- a/app/components/Views/confirmations/hooks/pay/useTransactionPayMetrics.ts +++ b/app/components/Views/confirmations/hooks/pay/useTransactionPayMetrics.ts @@ -1,6 +1,10 @@ import { useEffect, useMemo, useRef } from 'react'; -import { useDispatch } from 'react-redux'; -import { updateConfirmationMetric } from '../../../../../core/redux/slices/confirmationMetrics'; +import { useDispatch, useSelector } from 'react-redux'; +import { + selectConfirmationMetricsById, + updateConfirmationMetric, +} from '../../../../../core/redux/slices/confirmationMetrics'; +import { RootState } from '../../../../../reducers'; import { useTransactionMetadataRequest } from '../transactions/useTransactionMetadataRequest'; import { useDeepMemo } from '../useDeepMemo'; import { Hex, Json, isCaipChainId, isHexString } from '@metamask/utils'; @@ -10,7 +14,6 @@ import { useTransactionPayToken } from './useTransactionPayToken'; import { BridgeToken } from '../../../../UI/Bridge/types'; import { hasTransactionType } from '../../utils/transaction'; import { - useIsTransactionPayQuoteLoading, useTransactionPayQuotes, useTransactionPayRequiredTokens, useTransactionPayTotals, @@ -28,22 +31,26 @@ export function useTransactionPayMetrics() { const requiredTokens = useTransactionPayRequiredTokens(); const highestBalanceChainId = useHighestBalanceCaipChainId(); const automaticPayToken = useRef(); - const hasRequestedQuoteRef = useRef(false); + const hasLoadedQuoteRef = useRef(false); const quotes = useTransactionPayQuotes(); - const isQuotesLoading = useIsTransactionPayQuoteLoading(); const totals = useTransactionPayTotals(); const tokens = useTransactionPayAvailableTokens(); - if (isQuotesLoading && !hasRequestedQuoteRef.current) { - hasRequestedQuoteRef.current = true; + const transactionId = transactionMeta?.id ?? ''; + const storedMetrics = useSelector((state: RootState) => + selectConfirmationMetricsById(state, transactionId), + ); + + const hasQuotes = (quotes?.length ?? 0) > 0; + + if (hasQuotes && !hasLoadedQuoteRef.current) { + hasLoadedQuoteRef.current = true; } const availableTokens = useMemo( () => tokens.filter((t) => !t.disabled), [tokens], ); - - const transactionId = transactionMeta?.id ?? ''; const { chainId, type } = transactionMeta ?? {}; const primaryRequiredToken = requiredTokens.find((t) => !t.skipIfBalance); const sendingValue = Number(primaryRequiredToken?.amountHuman ?? '0'); @@ -55,8 +62,6 @@ export function useTransactionPayMetrics() { const properties: Json = {}; const sensitiveProperties: Json = {}; - const hasQuotes = (quotes?.length ?? 0) > 0; - if (payToken) { properties.mm_pay = true; properties.mm_pay_token_selected = payToken.symbol; @@ -74,8 +79,9 @@ export function useTransactionPayMetrics() { properties.mm_pay_payment_token_list_size = availableTokens.length; - properties.mm_pay_quote_requested = hasRequestedQuoteRef.current; - properties.mm_pay_quote_loaded = hasQuotes; + properties.mm_pay_quote_requested = + (storedMetrics?.properties?.mm_pay_quote_requested as boolean) ?? false; + properties.mm_pay_quote_loaded = hasLoadedQuoteRef.current; properties.mm_pay_chain_highest_balance_caip = highestBalanceChainId ?? null; } diff --git a/app/components/Views/confirmations/hooks/transactions/useTransactionCustomAmount.test.ts b/app/components/Views/confirmations/hooks/transactions/useTransactionCustomAmount.test.ts index eefe7ddc0675..b5e35f10c29c 100644 --- a/app/components/Views/confirmations/hooks/transactions/useTransactionCustomAmount.test.ts +++ b/app/components/Views/confirmations/hooks/transactions/useTransactionCustomAmount.test.ts @@ -19,6 +19,7 @@ import { useTransactionPayTotals, useTransactionPayIsMaxAmount, } from '../pay/useTransactionPayData'; +import { useTransactionPayHasSourceAmount } from '../pay/useTransactionPayHasSourceAmount'; import { TransactionPaymentToken, TransactionPayTotals, @@ -30,6 +31,7 @@ jest.mock('../tokens/useTokenFiatRates'); jest.mock('../transactions/useUpdateTokenAmount'); jest.mock('../pay/useTransactionPayToken'); jest.mock('../pay/useTransactionPayData'); +jest.mock('../pay/useTransactionPayHasSourceAmount'); jest.mock('../useTokenAmount'); jest.mock('../../../../../util/navigation/navUtils'); jest.mock('../../../../UI/Predict/hooks/usePredictBalance'); @@ -98,6 +100,9 @@ describe('useTransactionCustomAmount', () => { const useTransactionPayIsMaxAmountMock = jest.mocked( useTransactionPayIsMaxAmount, ); + const useTransactionPayHasSourceAmountMock = jest.mocked( + useTransactionPayHasSourceAmount, + ); const setIsMaxAmountMock = jest.mocked( Engine.context.TransactionPayController.setIsMaxAmount, ); @@ -135,6 +140,7 @@ describe('useTransactionCustomAmount', () => { } as unknown as ReturnType); useTransactionPayTotalsMock.mockReturnValue(undefined); useTransactionPayIsMaxAmountMock.mockReturnValue(false); + useTransactionPayHasSourceAmountMock.mockReturnValue(true); }); it('returns pending amount provided by updatePendingAmount', async () => { @@ -243,6 +249,50 @@ describe('useTransactionCustomAmount', () => { expect(updateTokenAmountMock).toHaveBeenCalledWith('61.725'); }); + it('sets quote requested metric when updateTokenAmount is called and hasSourceAmount is true', async () => { + useTransactionPayHasSourceAmountMock.mockReturnValue(true); + + const { result } = runHook(); + + await act(async () => { + result.current.updatePendingAmount('123.45'); + }); + + setConfirmationMetricMock.mockClear(); + + await act(async () => { + result.current.updateTokenAmount(); + }); + + expect(setConfirmationMetricMock).toHaveBeenCalledWith({ + properties: { + mm_pay_quote_requested: true, + }, + }); + }); + + it('does not set quote requested metric when updateTokenAmount is called and hasSourceAmount is false', async () => { + useTransactionPayHasSourceAmountMock.mockReturnValue(false); + + const { result } = runHook(); + + await act(async () => { + result.current.updatePendingAmount('123.45'); + }); + + setConfirmationMetricMock.mockClear(); + + await act(async () => { + result.current.updateTokenAmount(); + }); + + expect(setConfirmationMetricMock).not.toHaveBeenCalledWith({ + properties: { + mm_pay_quote_requested: true, + }, + }); + }); + it('returns default amount from params if available', async () => { useParamsMock.mockReturnValue({ amount: '43.21' }); diff --git a/app/components/Views/confirmations/hooks/transactions/useTransactionCustomAmount.ts b/app/components/Views/confirmations/hooks/transactions/useTransactionCustomAmount.ts index 6e42d674d5d8..05002528bbb5 100644 --- a/app/components/Views/confirmations/hooks/transactions/useTransactionCustomAmount.ts +++ b/app/components/Views/confirmations/hooks/transactions/useTransactionCustomAmount.ts @@ -17,6 +17,7 @@ import { useTransactionPayIsMaxAmount, useTransactionPayTotals, } from '../pay/useTransactionPayData'; +import { useTransactionPayHasSourceAmount } from '../pay/useTransactionPayHasSourceAmount'; import { useConfirmationMetricEvents } from '../metrics/useConfirmationMetricEvents'; import Engine from '../../../../../core/Engine'; @@ -32,6 +33,7 @@ export function useTransactionCustomAmount({ const [hasInput, setHasInput] = useState(false); const [amountHumanDebounced, setAmountHumanDebounced] = useState('0'); const totals = useTransactionPayTotals(); + const hasSourceAmount = useTransactionPayHasSourceAmount(); const { setConfirmationMetric } = useConfirmationMetricEvents(); const debounceSetAmountDelayed = useMemo( @@ -152,7 +154,20 @@ export function useTransactionCustomAmount({ const updateTokenAmount = useCallback(() => { updateTokenAmountCallback(amountHuman); - }, [amountHuman, updateTokenAmountCallback]); + + if (hasSourceAmount) { + setConfirmationMetric({ + properties: { + mm_pay_quote_requested: true, + }, + }); + } + }, [ + amountHuman, + hasSourceAmount, + setConfirmationMetric, + updateTokenAmountCallback, + ]); return { amountFiat, From ef19971c7b58e0a7d850d8b8d241d3d87d33f408 Mon Sep 17 00:00:00 2001 From: metamaskbot Date: Wed, 28 Jan 2026 16:00:01 +0000 Subject: [PATCH 32/80] [skip ci] Bump version number to 3564 --- android/app/build.gradle | 2 +- bitrise.yml | 4 ++-- ios/MetaMask.xcodeproj/project.pbxproj | 12 ++++++------ 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 322fea817912..653f6a1ca1c9 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -188,7 +188,7 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion versionName "7.63.0" - versionCode 3557 + versionCode 3564 testBuildType System.getProperty('testBuildType', 'debug') testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" manifestPlaceholders.MM_BRANCH_KEY_TEST = "$System.env.MM_BRANCH_KEY_TEST" diff --git a/bitrise.yml b/bitrise.yml index 2dd0fdb9714b..12bbb50c8e0e 100644 --- a/bitrise.yml +++ b/bitrise.yml @@ -3472,13 +3472,13 @@ app: VERSION_NAME: 7.63.0 - opts: is_expand: false - VERSION_NUMBER: 3557 + VERSION_NUMBER: 3564 - opts: is_expand: false FLASK_VERSION_NAME: 7.63.0 - opts: is_expand: false - FLASK_VERSION_NUMBER: 3557 + FLASK_VERSION_NUMBER: 3564 - opts: is_expand: false ANDROID_APK_LINK: '' diff --git a/ios/MetaMask.xcodeproj/project.pbxproj b/ios/MetaMask.xcodeproj/project.pbxproj index b2ea0615c06c..0713aad35b89 100644 --- a/ios/MetaMask.xcodeproj/project.pbxproj +++ b/ios/MetaMask.xcodeproj/project.pbxproj @@ -1281,7 +1281,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3557; + CURRENT_PROJECT_VERSION = 3564; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 48XVW22RCG; @@ -1350,7 +1350,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3557; + CURRENT_PROJECT_VERSION = 3564; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 48XVW22RCG; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 48XVW22RCG; @@ -1416,7 +1416,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3557; + CURRENT_PROJECT_VERSION = 3564; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 48XVW22RCG; @@ -1483,7 +1483,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3557; + CURRENT_PROJECT_VERSION = 3564; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 48XVW22RCG; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 48XVW22RCG; @@ -1646,7 +1646,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3557; + CURRENT_PROJECT_VERSION = 3564; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 48XVW22RCG; @@ -1716,7 +1716,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3557; + CURRENT_PROJECT_VERSION = 3564; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 48XVW22RCG; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 48XVW22RCG; From 5b84ef7ced42fbc164191fb3633ae1a21d88b076 Mon Sep 17 00:00:00 2001 From: "runway-github[bot]" <73448015+runway-github[bot]@users.noreply.github.com> Date: Wed, 28 Jan 2026 18:56:48 +0000 Subject: [PATCH 33/80] chore(runway): cherry-pick fix(perps): geo-restrict modify and close cp-7.63.0 (#25328) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - fix(perps): geo-restrict modify and close cp-7.63.0 (#25314) ## **Description** Implements geo-restriction for 'close position' and 'modify' actions in Perps trading to ensure compliance with regional regulations. **Problem:** Currently, there is no geo-restriction check for the 'close position' and 'modify' actions. Users in geo-restricted regions can access these features, which should be blocked for compliance. **Solution:** Added geo-restriction checks to both `handleClosePosition` and `handleModifyPress` handlers in `PerpsMarketDetailsView`. When a geo-restricted user taps either button: 1. The geo-block bottom sheet is displayed 2. The action is blocked (no navigation occurs) 3. Analytics event is tracked with the specific action source for monitoring ## **Changelog** CHANGELOG entry: null ## **Related issues** Fixes: #25315 Jira: https://consensyssoftware.atlassian.net/browse/TAT-2449 ## **Manual testing steps** ```gherkin Feature: Geo-restriction for close position and modify actions Scenario: Geo-restricted user tries to close position Given user is in a geo-restricted region And user has an open position in Perps When user taps the "Close" button on the market details screen Then the geo-restriction bottom sheet is displayed And the close position flow is not initiated Scenario: Geo-restricted user tries to modify position Given user is in a geo-restricted region And user has an open position in Perps When user taps the "Modify" button on the market details screen Then the geo-restriction bottom sheet is displayed And the modify action sheet is not opened Scenario: Eligible user can close position Given user is NOT in a geo-restricted region And user has an open position in Perps When user taps the "Close" button on the market details screen Then user is navigated to the close position flow Scenario: Eligible user can modify position Given user is NOT in a geo-restricted region And user has an open position in Perps When user taps the "Modify" button on the market details screen Then the modify action sheet is opened ``` ## **Screenshots/Recordings** ### **Before** Geo-restricted users could tap Close/Modify buttons and proceed with the actions. ### **After** Geo-restricted users see the geo-block bottom sheet when tapping Close or Modify buttons. ## **Pre-merge author checklist** - [x] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile Coding Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md). - [x] I've completed the PR template to the best of my ability - [x] I've included tests if applicable - [x] I've documented my code using [JSDoc](https://jsdoc.app/) format if applicable - [ ] I've applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors. ## **Pre-merge reviewer checklist** - [ ] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [ ] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots. [4d2533f](https://github.com/MetaMask/metamask-mobile/commit/4d2533fcc5f669277e40ed5e2af3897cacbaad33) --- > [!NOTE] > Implements geo-restriction gating for position management on the Perps market details screen. > > - Blocks `close` and `modify` actions when `isEligible` is false: shows `geo_block` bottom sheet and tracks `PERPS_SCREEN_VIEWED` with `SCREEN_TYPE` `geo_block_notif` and new sources `close_position_action` / `modify_position_action` > - Updates `handleClosePosition` and `handleModifyPress` to include eligibility checks and tracking > - Extends analytics constants with `SOURCE.CLOSE_POSITION_ACTION` and `SOURCE.MODIFY_POSITION_ACTION` > - Adds tests verifying geo-block modal appears and navigation/sheets don’t open for ineligible users on `close` and `modify` > > Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 59adc5d85b3355bb42f932a9537ab6ba19ccef1b. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot). Co-authored-by: Alejandro Garcia Anglada --- .../PerpsMarketDetailsView.test.tsx | 111 ++++++++++++++++++ .../PerpsMarketDetailsView.tsx | 30 ++++- .../UI/Perps/constants/eventNames.ts | 3 + 3 files changed, 142 insertions(+), 2 deletions(-) diff --git a/app/components/UI/Perps/Views/PerpsMarketDetailsView/PerpsMarketDetailsView.test.tsx b/app/components/UI/Perps/Views/PerpsMarketDetailsView/PerpsMarketDetailsView.test.tsx index 90065e1630ed..12f691f89ed4 100644 --- a/app/components/UI/Perps/Views/PerpsMarketDetailsView/PerpsMarketDetailsView.test.tsx +++ b/app/components/UI/Perps/Views/PerpsMarketDetailsView/PerpsMarketDetailsView.test.tsx @@ -1372,6 +1372,117 @@ describe('PerpsMarketDetailsView', () => { expect(queryByText('Geo Block Tooltip')).toBeNull(); }); + + // TAT-2449: Geo-restriction tests for close/modify actions + it('shows geo block modal when close position button is pressed and user is not eligible', () => { + const { useSelector } = jest.requireMock('react-redux'); + const mockSelectPerpsEligibility = jest.requireMock( + '../../selectors/perpsController', + ).selectPerpsEligibility; + useSelector.mockImplementation((selector: unknown) => { + if (selector === mockSelectPerpsEligibility) { + return false; + } + return undefined; + }); + + // Set up existing position to show close button + mockUseHasExistingPosition.mockReturnValue({ + hasPosition: true, + isLoading: false, + error: null, + existingPosition: { + symbol: 'BTC', + size: '0.5', + entryPrice: '44000', + positionValue: '22000', + unrealizedPnl: '50', + marginUsed: '500', + leverage: { type: 'isolated', value: 5 }, + liquidationPrice: '40000', + maxLeverage: 20, + returnOnEquity: '1.14', + cumulativeFunding: { + allTime: '0', + sinceOpen: '0', + sinceChange: '0', + }, + }, + refreshPosition: jest.fn(), + }); + + const { getByTestId, getByText } = renderWithProvider( + + + , + { + state: initialState, + }, + ); + + const closeButton = getByTestId( + PerpsMarketDetailsViewSelectorsIDs.CLOSE_BUTTON, + ); + fireEvent.press(closeButton); + + expect(getByText('Geo Block Tooltip')).toBeTruthy(); + expect(mockNavigate).not.toHaveBeenCalled(); + }); + + it('shows geo block modal when modify button is pressed and user is not eligible', () => { + const { useSelector } = jest.requireMock('react-redux'); + const mockSelectPerpsEligibility = jest.requireMock( + '../../selectors/perpsController', + ).selectPerpsEligibility; + useSelector.mockImplementation((selector: unknown) => { + if (selector === mockSelectPerpsEligibility) { + return false; + } + return undefined; + }); + + // Set up existing position to show modify button + mockUseHasExistingPosition.mockReturnValue({ + hasPosition: true, + isLoading: false, + error: null, + existingPosition: { + symbol: 'BTC', + size: '0.5', + entryPrice: '44000', + positionValue: '22000', + unrealizedPnl: '50', + marginUsed: '500', + leverage: { type: 'isolated', value: 5 }, + liquidationPrice: '40000', + maxLeverage: 20, + returnOnEquity: '1.14', + cumulativeFunding: { + allTime: '0', + sinceOpen: '0', + sinceChange: '0', + }, + }, + refreshPosition: jest.fn(), + }); + + const { getByTestId, getByText } = renderWithProvider( + + + , + { + state: initialState, + }, + ); + + const modifyButton = getByTestId( + PerpsMarketDetailsViewSelectorsIDs.MODIFY_BUTTON, + ); + fireEvent.press(modifyButton); + + expect(getByText('Geo Block Tooltip')).toBeTruthy(); + // Modify sheet should NOT open when user is not eligible + }); }); describe('Notification tooltip functionality', () => { diff --git a/app/components/UI/Perps/Views/PerpsMarketDetailsView/PerpsMarketDetailsView.tsx b/app/components/UI/Perps/Views/PerpsMarketDetailsView/PerpsMarketDetailsView.tsx index 34ffcd04631b..bbe9b9ce4a07 100644 --- a/app/components/UI/Perps/Views/PerpsMarketDetailsView/PerpsMarketDetailsView.tsx +++ b/app/components/UI/Perps/Views/PerpsMarketDetailsView/PerpsMarketDetailsView.tsx @@ -784,14 +784,40 @@ const PerpsMarketDetailsView: React.FC = () => { // Close position handler const handleClosePosition = useCallback(() => { if (!existingPosition) return; + + // Geo-restriction check for close position action + if (!isEligible) { + track(MetaMetricsEvents.PERPS_SCREEN_VIEWED, { + [PerpsEventProperties.SCREEN_TYPE]: + PerpsEventValues.SCREEN_TYPE.GEO_BLOCK_NOTIF, + [PerpsEventProperties.SOURCE]: + PerpsEventValues.SOURCE.CLOSE_POSITION_ACTION, + }); + setIsEligibilityModalVisible(true); + return; + } + navigateToClosePosition(existingPosition); - }, [existingPosition, navigateToClosePosition]); + }, [existingPosition, navigateToClosePosition, isEligible, track]); // Modify position handler - opens the modify action sheet const handleModifyPress = useCallback(() => { if (!existingPosition) return; + + // Geo-restriction check for modify position action + if (!isEligible) { + track(MetaMetricsEvents.PERPS_SCREEN_VIEWED, { + [PerpsEventProperties.SCREEN_TYPE]: + PerpsEventValues.SCREEN_TYPE.GEO_BLOCK_NOTIF, + [PerpsEventProperties.SOURCE]: + PerpsEventValues.SOURCE.MODIFY_POSITION_ACTION, + }); + setIsEligibilityModalVisible(true); + return; + } + openModifySheet(); - }, [existingPosition, openModifySheet]); + }, [existingPosition, openModifySheet, isEligible, track]); // Handler for "Add Margin" from stop loss prompt banner const handleAddMarginFromBanner = useCallback(() => { diff --git a/app/components/UI/Perps/constants/eventNames.ts b/app/components/UI/Perps/constants/eventNames.ts index a5947a0d0655..3d67548c58fa 100644 --- a/app/components/UI/Perps/constants/eventNames.ts +++ b/app/components/UI/Perps/constants/eventNames.ts @@ -211,6 +211,9 @@ export const PerpsEventValues = { ADD_FUNDS_ACTION: 'add_funds_action', CANCEL_ORDER: 'cancel_order', ASSET_DETAIL_SCREEN: 'asset_detail_screen', + // TAT-2449: Geo-block sources for close/modify actions + CLOSE_POSITION_ACTION: 'close_position_action', + MODIFY_POSITION_ACTION: 'modify_position_action', }, WARNING_TYPE: { MINIMUM_DEPOSIT: 'minimum_deposit', From a0e9313d71194c773742947b00d4530ab7d4fdf2 Mon Sep 17 00:00:00 2001 From: "runway-github[bot]" <73448015+runway-github[bot]@users.noreply.github.com> Date: Wed, 28 Jan 2026 18:57:10 +0000 Subject: [PATCH 34/80] chore(runway): cherry-pick fix: filter unclickable trending cp-7.63.0 (#25322) - fix: filter unclickable trending cp-7.63.0 (#25309) ## **Description** Issue: After making the filters scrollable, there is a weird bug that makes the `24h` button unclickable on small font sizes. Solution: I have removed the scrollable filters and instead added a ellipsis to the `network` filter ## **Changelog** CHANGELOG entry: fix time filter not clickable on trending tokens page ## **Related issues** Fixes: ## **Manual testing steps** ```gherkin Feature: my feature name Scenario: user [verb for user action] Given [describe expected initial app state] When user [verb for user action] Then [describe expected outcome] ``` ## **Screenshots/Recordings** ### **Before** https://github.com/user-attachments/assets/63ead594-414e-4367-9e3f-a9b6870c646a ### **After** https://github.com/user-attachments/assets/5c88c690-13b1-4711-b5fd-5d585885c9fb ## **Pre-merge author checklist** - [ ] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile Coding Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md). - [ ] I've completed the PR template to the best of my ability - [ ] I've included tests if applicable - [ ] I've documented my code using [JSDoc](https://jsdoc.app/) format if applicable - [ ] I've applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors. ## **Pre-merge reviewer checklist** - [ ] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [ ] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots. --- > [!NOTE] > Removes horizontal scrolling from the Trending Tokens control bar to prevent the `24h` button from becoming unclickable on small fonts. > > - Replace `ScrollView` with a static `View` for the control bar > - Add `controlButtonRightFixed` and layout tweaks (`flexShrink`, `minWidth`) to avoid overlap and preserve button hit areas > - Truncate network filter label with ellipsis via `numberOfLines={1}` and `ellipsizeMode="tail"` on `selectedNetworkName` > > Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit c5b23779f5be05b06e20b5171f98aaba653fa3b0. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot). [9fd380d](https://github.com/MetaMask/metamask-mobile/commit/9fd380d014d861c0ef9bf9660ca826a4d6b5b46c) Co-authored-by: Juanmi <95381763+juanmigdr@users.noreply.github.com> --- .../TrendingTokensFullView.tsx | 37 +++++++++++-------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/app/components/Views/TrendingTokens/TrendingTokensFullView/TrendingTokensFullView.tsx b/app/components/Views/TrendingTokens/TrendingTokensFullView/TrendingTokensFullView.tsx index 2d35b51399f1..a07169ae910c 100644 --- a/app/components/Views/TrendingTokens/TrendingTokensFullView/TrendingTokensFullView.tsx +++ b/app/components/Views/TrendingTokens/TrendingTokensFullView/TrendingTokensFullView.tsx @@ -10,7 +10,6 @@ import { View, TouchableOpacity, RefreshControl, - ScrollView, } from 'react-native'; import { useSelector } from 'react-redux'; import { useAppThemeFromContext } from '../../../../util/theme'; @@ -75,22 +74,18 @@ const createStyles = (theme: Theme) => paddingHorizontal: 16, flexGrow: 0, }, - controlBarScrollView: { - flexGrow: 0, - alignItems: 'center', - }, controlButtonOuterWrapper: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', - minWidth: '100%', }, controlButtonInnerWrapper: { flexDirection: 'row', gap: 8, alignItems: 'center', - flexShrink: 0, + flexShrink: 1, marginLeft: 8, + minWidth: 0, }, controlButton: { paddingVertical: 8, @@ -104,6 +99,15 @@ const createStyles = (theme: Theme) => alignItems: 'center', borderRadius: 8, backgroundColor: theme.colors.background.muted, + flexShrink: 1, + minWidth: 0, + }, + controlButtonRightFixed: { + padding: 8, + alignItems: 'center', + borderRadius: 8, + backgroundColor: theme.colors.background.muted, + flexShrink: 0, }, controlButtonContent: { flexDirection: 'row', @@ -117,6 +121,8 @@ const createStyles = (theme: Theme) => fontWeight: '600', lineHeight: 19.6, // 140% of 14px fontStyle: 'normal', + flexShrink: 1, + minWidth: 0, }, controlButtonDisabled: { opacity: 0.5, @@ -325,12 +331,7 @@ const TrendingTokensFullView = () => { /> {!isSearchVisible ? ( - + { activeOpacity={0.2} > - + {selectedNetworkName} { testID="24h-button" onPress={handle24hPress} style={[ - styles.controlButtonRight, + styles.controlButtonRightFixed, searchQuery?.trim() && styles.controlButtonDisabled, ]} activeOpacity={0.2} @@ -394,7 +399,7 @@ const TrendingTokensFullView = () => { - + ) : null} {isLoading ? ( From e3f8e8e107b10cb607cacdec7d7b063787f8702f Mon Sep 17 00:00:00 2001 From: metamaskbot Date: Wed, 28 Jan 2026 18:58:38 +0000 Subject: [PATCH 35/80] [skip ci] Bump version number to 3566 --- android/app/build.gradle | 2 +- bitrise.yml | 4 ++-- ios/MetaMask.xcodeproj/project.pbxproj | 12 ++++++------ 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 653f6a1ca1c9..abe87175bba1 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -188,7 +188,7 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion versionName "7.63.0" - versionCode 3564 + versionCode 3566 testBuildType System.getProperty('testBuildType', 'debug') testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" manifestPlaceholders.MM_BRANCH_KEY_TEST = "$System.env.MM_BRANCH_KEY_TEST" diff --git a/bitrise.yml b/bitrise.yml index 12bbb50c8e0e..95935420c6c1 100644 --- a/bitrise.yml +++ b/bitrise.yml @@ -3472,13 +3472,13 @@ app: VERSION_NAME: 7.63.0 - opts: is_expand: false - VERSION_NUMBER: 3564 + VERSION_NUMBER: 3566 - opts: is_expand: false FLASK_VERSION_NAME: 7.63.0 - opts: is_expand: false - FLASK_VERSION_NUMBER: 3564 + FLASK_VERSION_NUMBER: 3566 - opts: is_expand: false ANDROID_APK_LINK: '' diff --git a/ios/MetaMask.xcodeproj/project.pbxproj b/ios/MetaMask.xcodeproj/project.pbxproj index 0713aad35b89..29a89d6e3ba7 100644 --- a/ios/MetaMask.xcodeproj/project.pbxproj +++ b/ios/MetaMask.xcodeproj/project.pbxproj @@ -1281,7 +1281,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3564; + CURRENT_PROJECT_VERSION = 3566; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 48XVW22RCG; @@ -1350,7 +1350,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3564; + CURRENT_PROJECT_VERSION = 3566; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 48XVW22RCG; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 48XVW22RCG; @@ -1416,7 +1416,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3564; + CURRENT_PROJECT_VERSION = 3566; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 48XVW22RCG; @@ -1483,7 +1483,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3564; + CURRENT_PROJECT_VERSION = 3566; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 48XVW22RCG; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 48XVW22RCG; @@ -1646,7 +1646,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3564; + CURRENT_PROJECT_VERSION = 3566; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 48XVW22RCG; @@ -1716,7 +1716,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3564; + CURRENT_PROJECT_VERSION = 3566; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 48XVW22RCG; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 48XVW22RCG; From 83bb8e091fad23cbb0ae92fa781a8bcf776501eb Mon Sep 17 00:00:00 2001 From: "runway-github[bot]" <73448015+runway-github[bot]@users.noreply.github.com> Date: Thu, 29 Jan 2026 00:55:22 +0000 Subject: [PATCH 36/80] chore(runway): cherry-pick chore(rewards): modal copy changes for eos (#25352) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - chore(rewards): modal copy changes for eos (#25313) ## **Description** Updates the Rewards dashboard modal copy for the end of season (EOS). The text changes simplify messaging and make it more consistent across different modal states, replacing "earning points" language with more direct calls to action to add accounts to Rewards. ## **Changelog** CHANGELOG entry: rewards modal copy changes for eos --- > [!NOTE] > **Low Risk** > Low risk: only updates localized strings and test expectations for Rewards dashboard modal messaging, with no logic or data-flow changes. > > **Overview** > Updates the Rewards dashboard modal copy to be more consistent across states, standardizing the title to "Don’t miss out" and simplifying descriptions to "Add your account(s) to Rewards.". > > Adjusts `useRewardDashboardModals.test.tsx` mocks and assertions to match the new i18n strings in `locales/languages/en.json` (e.g., confirm CTA text like "Add account(s)"). > > Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 604bd67a4262265a1af51a8ea33aa0a50a1bce60. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot). [93cc2a9](https://github.com/MetaMask/metamask-mobile/commit/93cc2a9124a7d571318b2ffd6ecf98698533d9c5) Co-authored-by: VGR --- .../hooks/useRewardDashboardModals.test.tsx | 20 +++++++++---------- locales/languages/en.json | 6 +++--- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/app/components/UI/Rewards/hooks/useRewardDashboardModals.test.tsx b/app/components/UI/Rewards/hooks/useRewardDashboardModals.test.tsx index 4f7751917611..abb41b14e0fe 100644 --- a/app/components/UI/Rewards/hooks/useRewardDashboardModals.test.tsx +++ b/app/components/UI/Rewards/hooks/useRewardDashboardModals.test.tsx @@ -43,15 +43,15 @@ jest.mock('../../../../../locales/i18n', () => ({ strings: jest.fn((key: string) => { const mockStrings: Record = { 'rewards.dashboard_modal_info.multiple_unlinked_accounts.title': - 'Start earning rewards', + "Don't miss out", 'rewards.dashboard_modal_info.multiple_unlinked_accounts.description': - 'Link your accounts to start earning', + 'Add your accounts to Rewards.', 'rewards.dashboard_modal_info.multiple_unlinked_accounts.confirm': - 'Go to Settings', + 'Add accounts', 'rewards.dashboard_modal_info.active_account.title': "Don't miss out", 'rewards.dashboard_modal_info.active_account.description': - 'Link this account to earn rewards', - 'rewards.dashboard_modal_info.active_account.confirm': 'Link Account', + 'Add your account to Rewards.', + 'rewards.dashboard_modal_info.active_account.confirm': 'Add account', 'rewards.dashboard_modal_info.account_not_supported.title': 'Account not supported', 'rewards.dashboard_modal_info.account_not_supported.description_hardware': @@ -144,11 +144,11 @@ describe('useRewardDashboardModals', () => { expect(mockNavigate).toHaveBeenCalledWith( Routes.MODAL.REWARDS_BOTTOM_SHEET_MODAL, { - title: 'Start earning rewards', - description: 'Link your accounts to start earning', + title: "Don't miss out", + description: 'Add your accounts to Rewards.', customIcon: expect.any(Object), confirmAction: { - label: 'Go to Settings', + label: 'Add accounts', onPress: expect.any(Function), variant: 'Primary', }, @@ -284,10 +284,10 @@ describe('useRewardDashboardModals', () => { Routes.MODAL.REWARDS_BOTTOM_SHEET_MODAL, { title: "Don't miss out", - description: 'Link this account to earn rewards', + description: 'Add your account to Rewards.', customIcon: expect.any(Object), confirmAction: { - label: 'Link Account', + label: 'Add account', loadOnPress: true, onPress: expect.any(Function), variant: 'Primary', diff --git a/locales/languages/en.json b/locales/languages/en.json index e2a2b5895a40..e7a2ea145d35 100644 --- a/locales/languages/en.json +++ b/locales/languages/en.json @@ -7138,12 +7138,12 @@ "dashboard_modal_info": { "active_account": { "title": "Don't miss out", - "description": "Add your account to start earning points from your activity.", + "description": "Add your account to Rewards.", "confirm": "Add account" }, "multiple_unlinked_accounts": { - "title": "Start earning points", - "description": "Add your accounts so you can track your rewards at a glance.", + "title": "Don't miss out", + "description": "Add your accounts to Rewards.", "confirm": "Add accounts" }, "account_not_supported": { From 5661f0c3d8381fddce156014042d0b5c3408ef0c Mon Sep 17 00:00:00 2001 From: "runway-github[bot]" <73448015+runway-github[bot]@users.noreply.github.com> Date: Thu, 29 Jan 2026 00:56:01 +0000 Subject: [PATCH 37/80] chore(runway): cherry-pick chore: New Crowdin translations by Github Action - cp-7.63.0 (#25353) - chore: New Crowdin translations by Github Action - cp-7.63.0 (#24364) --- > [!NOTE] > **Low Risk** > Low risk localization-only change, but incorrect/mixed-language strings or removed keys could surface as untranslated UI text in German. > > **Overview** > Updates `locales/languages/de.json` with the latest Crowdin sync: numerous German wording/consistency fixes, capitalization/punctuation tweaks, and a handful of strings reverted to English. > > Adds and expands translation coverage for newer UI areas (notably **Perps**, **Predict/Predictions**, **Earn/mUSD bonus & claims**, **Card onboarding/limits**, **Fiat on-ramp settings**, and **Bridge/Explore empty states**) by introducing many new keys and error/status messages. > > Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit c081f1b3416cdb9673223ec7f39c82ff8dff3b13. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot). Co-authored-by: metamaskbot [5500c95](https://github.com/MetaMask/metamask-mobile/commit/5500c95282ec74ba7e54be9b5043ef5f63780fb9) Co-authored-by: MetaMask Bot <37885440+metamaskbot@users.noreply.github.com> Co-authored-by: metamaskbot --- locales/languages/de.json | 619 ++++++++++++++++++++------------ locales/languages/el.json | 698 ++++++++++++++++++++++-------------- locales/languages/es.json | 626 ++++++++++++++++++++------------ locales/languages/fr.json | 609 ++++++++++++++++++++------------ locales/languages/hi.json | 646 +++++++++++++++++++++------------- locales/languages/id.json | 718 ++++++++++++++++++++++--------------- locales/languages/ja.json | 600 +++++++++++++++++++------------ locales/languages/ko.json | 622 ++++++++++++++++++++------------ locales/languages/pt.json | 656 +++++++++++++++++++++------------- locales/languages/ru.json | 634 ++++++++++++++++++++------------- locales/languages/tl.json | 724 +++++++++++++++++++++++--------------- locales/languages/tr.json | 706 +++++++++++++++++++++++-------------- locales/languages/vi.json | 648 +++++++++++++++++++++------------- locales/languages/zh.json | 606 +++++++++++++++++++------------ 14 files changed, 5675 insertions(+), 3437 deletions(-) diff --git a/locales/languages/de.json b/locales/languages/de.json index 1638393e3710..045659d40b5b 100644 --- a/locales/languages/de.json +++ b/locales/languages/de.json @@ -8,7 +8,7 @@ "increment": "Redux-Zähler erhöhen" }, "pet_name": { - "list_count_text": "Pet names on this network", + "list_count_text": "Kosenamen in diesem Netzwerk", "add_pet_name_button": "Add pet name", "address": "Adresse", "address_placeholder": "0x ...", @@ -193,11 +193,10 @@ "connector": "bei" }, "autocomplete": { - "placeholder": "Suche nach Token, Website oder Adresse", + "placeholder": "Search by site or address", "recents": "Aktuelle", "favorites": "Favoriten", - "sites": "Websites", - "tokens": "TOKEN" + "sites": "Websites" }, "navigation": { "back": "Zurück", @@ -306,7 +305,7 @@ "get_started": "Fangen Sie an" }, "onboarding_wizard": { - "skip_tutorial": "Skip tutorial", + "skip_tutorial": "Tutorial überspringen", "coachmark": { "action_back": "Nein, Danke!", "action_next": "Tour starten", @@ -330,7 +329,7 @@ "content3": "um den Kontonamen zu bearbeiten." }, "step4": { - "title": "Main menu", + "title": "Hauptmenü", "content1": "In diesem Menü können Sie auf Transaktionsverlauf, Einstellungen und Support zugreifen.", "content2": "Sie können mehr Aktionen mit Ihren Konten durchführen u. auf MetaMask-Einstellungen zugreifen." }, @@ -596,9 +595,9 @@ "transaction_activity": "Aktivität", "request_feature": "Eine Funktion anfragen", "submit_feedback_message": "Wählen Sie die Art des Feedbacks, das Sie senden möchten.", - "submit_bug": "Bug report", + "submit_bug": "Fehlerbericht", "submit_general_feedback": "Allgemein", - "share_address": "Share my public address", + "share_address": "Meine öffentliche Adresse teilen", "view_in_etherscan": "Auf Etherscan ansehen", "view_in": "Ansehen auf", "browser": "Browser", @@ -612,12 +611,13 @@ "lock_cancel": "NEIN", "feedback": "Feedback", "metamask_support": "MetaMask-Support", - "public_address": "Public address" + "public_address": "Öffentliche Adresse" }, "send": { "available": "verfügbar", "invalid_value": "Ungültiger Wert", "insufficient_funds": "Unzureichende Gelder", + "insufficient_balance_to_cover_fee": "Insufficient balance to cover fees", "continue": "Fortfahren", "unit": "Einheit", "units": "Einheiten", @@ -643,8 +643,8 @@ "no_tokens_available": "Keine Token verfügbar", "sign": "Unterzeichnen", "network_not_found_title": "Netzwerk nicht gefunden", - "network_not_found_description": "Das Netzwerk mit der Chain-ID {{chain_id}} wurde in Ihrem Wallet nicht gefunden. Bitte fügen Sie das Netzwerk erst hinzu.", - "network_missing_id": "Fehlende Chain-ID.", + "network_not_found_description": "Network with chain ID {{chain_id}} not found in your wallet. Please add the network first.", + "network_missing_id": "Missing chain ID.", "search_tokens": "Token suchen", "search_tokens_and_nfts": "Token und NFTs suchen", "tokens": "Token", @@ -675,13 +675,13 @@ "limitError": "Die Überprüfung Ihrer Einzahlungslimits ist fehlgeschlagen. Bitte versuchen Sie es später erneut." }, "token_modal": { - "select_a_token": "Token wählen", + "select_a_token": "Ein Token wählen", "select_token": "Token auswählen", "search_by_name_or_address": "Token nach Name oder Adresse suchen", "no_tokens_found": "Keine Tokens stimmen mit „{{searchString}}“ überein", "unsupported_token_title": "Nicht verfügbar", - "unsupported_token_description": "This token may not be available in your region or supported by any local payment providers", - "error_loading_tokens": "Unable to load tokens. Please try again later." + "unsupported_token_description": "Dieses Token ist möglicherweise in Ihrer Region nicht verfügbar oder wird von keinem lokalen Zahlungsanbieter unterstützt", + "error_loading_tokens": "Tokens können nicht geladen werden. Bitte versuchen Sie es später erneut." }, "networks_filter_bar": { "all_networks": "Alle Netzwerke" @@ -696,12 +696,12 @@ "title": "Einstellungen", "view_order_history": "Order-Verlauf anzeigen", "contact_support": "Support kontaktieren", - "log_out": "Log out of Transak", + "log_out": "Von Transak abmelden", "logged_out_success": "Erfolgreich abgemeldet", "error_sdk_not_initialized": "SDK nicht eingeleitet", "logged_out_error": "Fehler beim Abmelden", - "more_ways_to_buy": "More ways to buy", - "more_ways_to_buy_description": "Switch to the classic version" + "more_ways_to_buy": "Weitere Kaufmöglichkeiten", + "more_ways_to_buy_description": "Zur klassischen Version wechseln" }, "region_modal": { "select_a_region": "Region auswählen", @@ -714,7 +714,7 @@ "no_state_results": "Keine Bundesländer stimmen mit „{{searchString}}“ überein" }, "payment_modal": { - "select_a_payment_method": "Select a payment method" + "select_a_payment_method": "Zahlungsmethode auswählen" }, "payment_duration": { "instant": "Sofort", @@ -805,7 +805,7 @@ "button": "Zustimmen und fortfahren" }, "additional_verification": { - "title": "Additional verification", + "title": "Zusätzliche Verifizierung", "paragraph_1": "Für größere Einzahlungen benötigen Sie einen gültigen Ausweis (z. B. einen Führerschein) sowie ein Selfie in Echtzeit.", "paragraph_2": "Um die Verifizierung abschließen zu können, müssen Sie den Zugriff auf Ihre Kamera aktivieren.", "button": "Fortfahren" @@ -832,7 +832,7 @@ "dob_invalid": "Geben Sie bitte ein gültiges Geburtsdatum ein", "ssn_required": "Sozialversicherungsnummer ist erforderlich", "unexpected_error": "Ein unerwarteter Fehler ist aufgetreten. Bitte versuchen Sie es erneut.", - "phone_already_registered": "This phone number is already in use by {{email}}. Log in using this email to continue.", + "phone_already_registered": "Diese Telefonnummer wird bereits von {{email}} verwendet. Melden Sie sich zum Fortfahren mit dieser E-Mail an.", "login_with_email": "Mit E-Mail-Adresse anmelden" }, "enter_address": { @@ -844,7 +844,7 @@ "address_line_2": "Adresszeile 2 (optional)", "state": "Bundesland/Region", "city": "Stadt", - "postal_code": "Postal/zip code", + "postal_code": "Postleitzahl", "country": "Land", "select_state": "Bundesland auswählen", "address_line_1_required": "Adresszeile 1 ist erforderlich", @@ -854,7 +854,7 @@ "city_invalid": "Geben Sie bitte eine gültige Stadt ein", "state_required": "Bundesland/Region ist erforderlich", "state_invalid": "Geben Sie bitte ein gültiges Bundesland ein", - "postal_code_required": "Postal/zip code is required", + "postal_code_required": "Postleitzahl ist erforderlich", "postal_code_invalid": "Geben Sie bitte eine gültige Postleitzahl ein", "unexpected_error": "Ein unerwarteter Fehler." }, @@ -903,7 +903,7 @@ "cancel_order_button": "Order stornieren" }, "order_details": { - "title": "Deposit order", + "title": "Einzahlungsauftrag", "error_title": "Bei Ihrem Einzahlungsauftrag ist ein Fehler aufgetreten", "error_message": "Ein unerwarteter Fehler ist aufgetreten." }, @@ -946,7 +946,7 @@ }, "error_view": { "title": "Ein Fehler ist aufgetreten", - "description": "Bei der Verarbeitung Ihrer Einzahlung ist ein Fehler aufgetreten. Bitte wenden Sie sich an den Support, sollte das Problem weiterhin bestehen.", + "description": "Bei der Verarbeitung Ihrer Einzahlung ist ein Fehler aufgetreten. Bitte wenden Sie sich an den Support, falls das Problem fortbestehen sollte.", "try_again": "Erneut versuchen" }, "errors": { @@ -955,25 +955,29 @@ "fetch_payment_methods": "Beim Abrufen der Zahlungsmethoden gab es ein Problem.", "fetch_user_details": "Es gab ein Problem beim Abrufen der Benutzerdetails.", "try_again": "Erneut versuchen", - "error_details_title": "Error details", + "error_details_title": "Fehlerdetails", "see_more": "Mehr sehen" } }, "perps": { - "basic_functionality_disabled_title": "Perps is not available", + "basic_functionality_disabled_title": "Perps nicht verfügbar", "title": "Perps", "perps_trading": "Perps-Trading", "perp_account_balance": "Perp-Guthaben abrufen", "manage_balance": "Guthaben verwalten", - "total_balance": "Gesamtguthaben", + "total_balance": "Gesamtsaldo", "available_balance": "Verfügbares Guthaben", - "margin_used": "Genutzte Margin", + "margin_used": "Verwendete Margin", "gtm_content": { "title": "PERPS SIND DA", "title_description": "Gehen Sie Long- oder Short-Positionen mit bis zu 40-fachem Hebel ein. Finanzieren Sie Ihr Konto mit nur einem Klick.", "not_now": "Nicht jetzt", "try_now": "Erste Schritte" }, + "discovery_banner": { + "title": "Handeln Sie {{symbol}}-Perp", + "subtitle": "Vervielfachen Sie Ihre GuV bis zu {{leverage}}" + }, "today": "Heute", "yesterday": "Gestern", "unrealized_pnl": "Nicht realisierte GuV", @@ -1414,6 +1418,7 @@ "failedToEstablishAllMids": "Abonnement von globalen AllMids (Mittelkurs) fehlgeschlagen", "failedToEstablishMarketData": "Abonnement der Marktdaten für {{symbol}} fehlgeschlagen", "failed_to_toggle_network": "Umschalten des Netzwerks fehlgeschlagen", + "failed_to_switch_provider": "Wechsel des Anbieters fehlgeschlagen", "noAccountSelected": "Kein Konto ausgewählt", "unsupportedMethod": "Nicht unterstützte Methode: {{method}}", "invalidAddressFormat": "Ungültiges Format der Adresse: {{address}}", @@ -1452,6 +1457,24 @@ "orderLeverageReductionFailed": "Sie können Ihren Hebel nicht reduzieren", "insufficientLiquidity": "Unzureichende Liquidität zur Orderausführung. Versuchen Sie es mit einer Limit-Order oder wiederholen Sie den Vorgang in Kürze.", "connectionTimeout": "Verbindung abgelaufen. Bitte überprüfen Sie Ihr Netzwerk und versuchen Sie es erneut.", + "clientReinitializing": "Der Dienst wird neu initialisiert. Bitte warten Sie einen Augenblick und versuchen Sie es erneut.", + "transferFailed": "Gelder können nicht geladen werden. Bitte versuchen Sie es erneut.", + "swapFailed": "Tokens können nicht geswappt werden. Bitte versuchen Sie es erneut.", + "spotPairNotFound": "Das Handelspaar ist derzeit nicht verfügbar.", + "priceUnavailable": "Preisdaten sind nicht verfügbar. Bitte aktualisieren und erneut versuchen.", + "batchCancelFailed": "Einige Orders konnten nicht storniert werden. Bitte versuchen Sie es erneut.", + "batchCloseFailed": "Einige Positionen konnten nicht geschlossen werden. Bitte versuchen Sie es erneut.", + "insufficientMargin": "Die Margin für diesen Handel ist nicht ausreichend. Erwägen Sie die Aufstockung Ihres Kapitals oder die Verringerung Ihrer Positionsgröße.", + "reduceOnlyViolation": "Diese Order würde Ihre Position erhöhen. Nur reduzierende Aufträge sind erlaubt.", + "positionWouldFlip": "Diese Order würde die Richtung Ihrer Position umkehren. Bitte schließen Sie zuerst Ihre bestehende Position.", + "marginAdjustmentFailed": "Margin kann nicht angepasst werden. Bitte versuchen Sie es erneut.", + "tpslUpdateFailed": "Take-Profit/Stop-Loss kann nicht aktualisiert werden. Bitte versuchen Sie es erneut.", + "orderRejected": "Order wurde abgelehnt. Bitte überprüfen Sie Ihre Parameter und versuchen Sie es erneut.", + "slippageExceeded": "Der Kurs hat sich zu stark verschoben. Versuchen Sie es mit einer Limit-Order oder erhöhen Sie die Slippage-Toleranz.", + "rateLimitExceeded": "Zu viele Anfragen. Bitte warten Sie einen Augenblick und versuchen Sie es erneut.", + "serviceUnavailable": "Der Service ist vorübergehend nicht verfügbar. Bitte versuchen Sie es später erneut.", + "networkErrorSimple": "Ein Netzwerkfehler ist aufgetreten. Bitte überprüfen Sie Ihre Verbindung und versuchen Sie es erneut.", + "insufficientBalance": "Unzureichendes Guthaben, um diesen Vorgang abzuschließen. Bitte überprüfen Sie Ihr verfügbares Guthaben.", "connectionFailed": { "title": "Keine Verbindung zu Perps möglich", "description": "Wir arbeiten daran, bald wieder online zu sein.", @@ -1697,7 +1720,14 @@ "retry_connection": "Verbindung erneut herstellen", "retrying_connection": "Verbindung wird hergestellt ...", "connecting_to_perps": "Verbindungsherstellung zu Perps", - "timeout_title": "Der Verbindungsaufbau benötigt länger als erwartet" + "timeout_title": "Der Verbindungsaufbau benötigt länger als erwartet", + "websocket_disconnected": "Ihre Verbindung ist offline.", + "websocket_disconnected_message": "Die Daten sind womöglich nicht aktuell.", + "websocket_connecting": "Verbindung zu Perps wird hergestellt ...", + "websocket_connecting_message": "Verbindung wird wiederhergestellt n... {{attempt}} versuchen", + "websocket_connected": "Verbunden", + "websocket_connected_message": "Update der Live-Daten fortgesetzt", + "websocket_retry": "Erneut versuchen" }, "chart": { "no_data": "Keine Diagrammdaten verfügbar", @@ -1754,6 +1784,9 @@ "title": "Support kontaktieren", "description": "Wenden Sie sich für Unterstützung an den MetaMask-Support" }, + "feedback": { + "title": "Geben Sie uns Feedback" + }, "close_all_modal": { "title": "Alle Positionen schließen", "description": "Wir werden alle Ihre offenen Positionen zum aktuellen Marktpreis schließen.", @@ -1795,8 +1828,8 @@ "funding_rate_short": "Finanzierung", "open_interest": "Open Interest", "open_interest_short": "OI", - "high_to_low": "Hoch zu niedrig", - "low_to_high": "Niedrig zu hoch", + "high_to_low": "Hoch bis niedrig", + "low_to_high": "Niedrig bis hoch", "high": "Hoch", "low": "Niedrig", "sort_by": "Sortieren nach", @@ -1806,7 +1839,11 @@ "price_change_low_to_high": "Preisänderung: niedrig zu hoch", "past_hour": "Vergangene Stunde", "past_24_hours": "Vergangene 24 Stunden", - "time": "Zeit" + "time": "Zeit", + "apply": "Anwenden" + }, + "market_type": { + "filter_by": "Filtern nach" }, "perps_markets": "Perps-Märkte", "volume": "Volumen", @@ -1823,6 +1860,7 @@ "mainnet": "Mainnet", "developer_options": { "hyperliquid_network_toggle": "Umschalten des Hyperliquid-Netzwerks", + "provider_mode_toggle": "Anbieter-Modus", "simulate_connection_error": "Verbindungsfehler simulieren" }, "transactions": { @@ -1942,7 +1980,7 @@ } }, "predict": { - "title": "MetaMask Predict", + "title": "MetaMask Predictions", "prediction_markets": "Prognosemärkte", "market_list": "Marktliste", "loading": "Wird geladen ...", @@ -1981,7 +2019,8 @@ "fee_exemption": "Auf diesem Markt erheben wir keine Gebühren.", "ended": "Beendet", "resolved_early": "Frühzeitig gelöst", - "disclaimer": "Diese Informationen sind möglicherweise unvollständig. Alle Marktregeln, Auflösungskriterien und Endergebnisse unterliegen allein der Kontrolle von Polymarket. Handelsgeschäfte müssen auf der Grundlage der vollständigen Regeln, die auf Polymarket verfügbar sind, getätigt werden." + "disclaimer": "Diese Informationen sind möglicherweise unvollständig. Alle Marktregeln, Auflösungskriterien und Endergebnisse unterliegen allein der Kontrolle von Polymarket. Handelsgeschäfte müssen auf der Grundlage der vollständigen Regeln, die auf Polymarket verfügbar sind, getätigt werden.", + "your_picks": "Ihre Auswahl" }, "tab": { "no_predictions_description": "Ihre Prognosen werden hier angezeigt und zeigen Ihren Stake und die Marktbewegung.", @@ -2001,6 +2040,8 @@ "cashout_info": "{{amount}} bei {{outcome}} zu {{initialPrice}}", "cashout_info_multiple": "{{amount}} bei {{outcomeGroupTitle}} • {{outcome}} zu {{initialPrice}}", "position_info": "{{initialValue}} bei {{outcome}} um {{shares}} zu gewinnen", + "position_pick_info": "{{initialValue}} bei {{outcome}}", + "position_pick_info_to_win": "{{initialValue}} bei {{outcome}} um zu gewinnen", "buy_yes": "Ja", "buy_no": "Nein", "outcomes": "Ergebnisse", @@ -2035,6 +2076,7 @@ "won_markets_text": "{{count}} Markt{{s}} gewonnen", "available_balance": "Verfügbares Guthaben", "claim_amount_text": "{{amount}} $ einfordern", + "claim_winnings_text": "Gewinne einfordern", "unrealized_pnl_label": "Nicht realisierte GuV", "unrealized_pnl_value": "{{amount}} ({{percent}})", "unrealized_pnl_error": "Laden nicht möglich", @@ -2093,8 +2135,8 @@ "price_per_share": "Preis pro Aktie", "price_impact": "Preiseinfluss", "net_pnl": "Netto-GuV", - "total_net_pnl": "Gesamter Nettogewinn und -verlust", - "market_net_pnl": "Marktnettogewinn und -verlust", + "total_net_pnl": "Gesamte Netto-GuV", + "market_net_pnl": "Marktnetto-GuV", "activity_details": "Aktivitätsdetails", "today": "Heute", "yesterday": "Gestern" @@ -2173,6 +2215,15 @@ "order_not_fully_filled": "Ausführung Ihrer Order fehlgeschlagen", "buy_order_not_fully_filled": "Nicht genügend Aktien zum Marktpreis verfügbar, um Ihre Order jetzt zu platzieren.", "sell_order_not_fully_filled": "Die Nachfrage zum Marktpreis reicht derzeit nicht aus für eine Auszahlung." + }, + "game_details_footer": { + "pick_a_winner": "Einen Gewinner auswählen", + "volume_display": "{{volume}} $ Vol.", + "read_terms": "Lesen Sie die vollständigen Vertragsbedingungen" + }, + "sports": { + "halftime": "Halbzeit", + "final": "Finale" } }, "receive": { @@ -2290,7 +2341,7 @@ "add_funds": "Gelder hinzufügen", "next": "Weiter", "buy_asset": "{{asset}} kaufen", - "no_tokens": "Sie haben keine Token!", + "no_tokens": "Sie haben keine Tokens", "show_tokens_without_balance": "Tokens ohne Guthaben anzeigen", "nfts_autodetection_title": "NFT-Erkennung", "nfts_autodetection_desc": "Lassen Sie zu, dass MetaMask NFTs automatisch in Ihrer Wallet erkennt und anzeigt.", @@ -2303,7 +2354,7 @@ "target_scam_network": "was sie zu einem Ziel für Betrüger macht. Betrüger könnten Sie dazu verleiten, ihnen im Gegenzug wertvollere Währung zu senden. Überprüfen Sie alles, bevor Sie fortfahren.", "use_the_currency_symbol": "verwendet das Währungssymbol", "use_correct_symbol": "Vergewissern Sie sich, dass Sie das richtige Symbol verwenden, bevor Sie fortfahren.", - "chain_id_currently_used": "Diese Chain-ID wird derzeit verwendet von der", + "chain_id_currently_used": "This chain ID is currently used by the", "incorrect_network_name_warning": "Laut unseren Aufzeichnungen stimmt dieser Netzwerkname nicht mit dieser Chain-ID überein.", "suggested_name": "Vorgeschlagener Name:", "network_check_validation_desc": "verringert die Wahrscheinlichkeit, dass Sie sich mit einem böswilligen oder falschen Netz verbinden.", @@ -2314,7 +2365,7 @@ "nft_empty_description": "Es gibt eine ganze Welt voller NFTs da draußen. Beginnen Sie noch heute mit Ihrer Sammlung.", "tokens_empty_description": "Nothing to see yet. Why not browse tokens or make a trade?", "discover_nfts": "NFTs importieren", - "no_transactions": "Sie haben keine Transaktionen!", + "no_transactions": "Sie haben keine Transaktionen", "switch_network_to_view_transactions": "Wechseln Sie bitte das Netzwerk, um Transaktionen anzuzeigen", "send_button": "Senden", "deposit_button": "Einzahlen", @@ -2362,6 +2413,7 @@ "network_fee": "Netzwerk-Gebühr", "lists": "Token lists", "hide_cta": "Token verbergen", + "perps_trading": "Perps-Trading", "options": { "title": "Token options", "view_on_portfolio": "Auf Portfolio ansehen", @@ -2409,8 +2461,8 @@ "add_token": "IMPORTIEREN" }, "collectibles": { - "cancel_add_collectible": "STORNIEREN", - "add_collectible": "IMPORTIEREN" + "cancel_add_collectible": "Stornieren", + "add_collectible": "Importieren" }, "banners": { "search_desc": "Eine verbesserte Token-Erkennung ist derzeit im {{network}}-Netzwerk verfügbar.", @@ -2521,19 +2573,20 @@ "billion_abbreviation": "Mrd.", "trillion_abbreviation": "Trill.", "million_abbreviation": "Mio.", - "thousand_abbreviation": "Tsd.", + "thousand_abbreviation": "K", "token_details": "Token-Details", "contract_address": "Contract-Adresse", "token_list": "Token-Liste", "market_details": "Marktdetails", "market_cap": "Market cap", "total_volume": "Total volume (24h)", - "volume_to_marketcap": "Volume / market cap", + "volume_to_marketcap": "Volume / Market cap", "circulating_supply": "Zirkulierende Versorgung", "all_time_high": "Allzeithoch", "all_time_low": "Allzeittief", "fully_diluted": "Vollständig verwässert", - "unknown": "Unbekannt" + "unknown": "Unbekannt", + "stock": "Stock" }, "collectible": { "collectible_address": "Adresse", @@ -2584,7 +2637,7 @@ "remove_snap_account": "Snap-Konto entfernen", "remove_snap_account_alert_description": "Dieses Konto wird aus Ihrer Wallet entfernt. Vergewissern Sie sich bitte, dass die ursprüngliche geheime Wiederherstellungsphrase oder der private Schlüssel für dieses importierte Konto Ihnen vorliegen, bevor Sie fortfahren. Über das Dropdown-Menü „Konto“ können Sie Konten erneut importieren oder erstellen.", "remove_account_alert_remove_btn": "Entfernen", - "remove_account_alert_cancel_btn": "Schon gut", + "remove_account_alert_cancel_btn": "Never mind", "accounts_title": "Konten", "connect_account_title": "Konto verbinden", "connect_accounts_title": "Konten verbinden", @@ -2621,7 +2674,7 @@ "advisory_by": "Hinweis von Ethereum Phishing-Detektor und PhishFor", "potential_threat": "Mögliche Bedrohungen umfassen", "fake_metamask": "Fake-Version von MetaMask", - "srp_theft": "Diebstahl der geheimen Wiederherstellungsphrase oder des Passworts", + "srp_theft": "Secret Recovery Phrase or password theft", "malicious_transactions": "Böswillige Transaktionen, die zu gestohlenen Assets führen", "secret_recovery_phrase": "Geheime Wiederherstellungsphrase", "account_name": "Kontoname", @@ -2676,8 +2729,8 @@ }, "connect_qr_hardware": { "title": "Eine QR-basierte Hardware-Wallet verknüpfen", - "description1": "Verknüpfen Sie eine Hardware-Wallet mit Airgap, die über QR-Codes kommuniziert.", - "description2": "Wie es funktioniert?", + "description1": "Connect an airgapped hardware wallet that communicates through QR codes.", + "description2": "Wie es funktioniert", "description3": "Zu den offiziell unterstützten Hardware-Wallets mit Airgap zählen:", "keystone": "Keystone", "ngravezero": "Ngrave Zero", @@ -2694,7 +2747,7 @@ "select_accounts": "Ein Konto auswählen" }, "data_collection_modal": { - "accept": "Okay", + "accept": "OK", "content": "Sie haben die Datenerhebung für unsere Marketingzwecke deaktiviert. Dies gilt nur für dieses Gerät. Wenn Sie MetaMask auf anderen Geräten verwenden, stellen Sie sicher, dass Sie sich auch dort abmelden." }, "account_selector": { @@ -2718,14 +2771,14 @@ "select_rpc_url": "RPC-URL auswählen", "title": "Einstellungen", "current_conversion": "Basiswährung", - "current_language": "Current language", + "current_language": "Aktuelle Sprache", "ipfs_gateway": "IPFS-Gateway", "ipfs_gateway_content": "MetaMask verwendet Dienste von Drittanbietern, um Bilder Ihrer auf IPFS gespeicherten NFTs wiederzugeben, Informationen zu ENS-Adressen anzuzeigen, die Sie in die Adressleiste Ihres Browsers eingeben, und Symbole für verschiedene Tokens abzurufen. Ihre IP-Adresse kann diesen Diensten offengelegt werden, wenn Sie diese nutzen.", "ipfs_gateway_down": "Ihr aktuelles IPFS-Gateway ist offline", "ipfs_gateway_desc": "Wählen Sie Ihr bevorzugtes IPFS-Gateway.", - "search_engine": "Search engine", + "search_engine": "Suchmaschine", "new_RPC_URL": "Neues RPC-Netzwerk", - "state_logs": "State logs", + "state_logs": "Statusprotokolle", "add_network_title": "Ein Netzwerk hinzufügen", "auto_lock": "Automatische Sperrung", "auto_lock_desc": "Legen Sie den Zeitraum fest, bevor die App automatisch gesperrt wird.", @@ -2734,15 +2787,15 @@ "autolock_never": "Niemals", "autolock_after": "Nach {{time}} Sekunden", "autolock_after_minutes": "Nach {{time}} Minuten", - "reveal_seed_words": "Reveal seed words", - "reset_account": "Reset account", - "state_logs_button": "Download state logs", + "reveal_seed_words": "Seed-Wörter offenlegen", + "reset_account": "Konto zurücksetzen", + "state_logs_button": "Statusprotokolle herunterladen", "reveal_seed_words_button": "SEED-WÖRTER OFFENLEGEN", - "reset_account_button": "Reset account", + "reset_account_button": "Konto zurücksetzen", "reset_account_confirm_button": "Ja, zurücksetzen", "reset_account_cancel_button": "Stornieren", - "reset_account_modal_title": "Reset account?", - "clear_approvals_modal_title": "Clear approval data?", + "reset_account_modal_title": "Konto zurücksetzen?", + "clear_approvals_modal_title": "Freigabedaten löschen?", "clear_approvals_modal_message": "Alle Apps müssen Zugriff anfragen, um erneut Kontoinformationen anzuzeigen.", "clear_browser_history_modal_title": "Browserverlauf löschen?", "clear_browser_history_modal_message": "Wir löschen Ihren gesamten Browserverlauf. Sind Sie sicher?", @@ -2764,7 +2817,7 @@ "protect_title": "Wallet-Wiederherstellung", "banner_social_login_enabled": "Mit {{authConnection}} anmelden", "manage_recovery_method": "Wiederherstellungsmethoden verwalten", - "video_failed": "Video failed to load.", + "video_failed": "Video konnte nicht geladen werden.", "protect_desc": "Sichern Sie Ihre geheime Wiederherstellungsphrase, damit Sie nie den Zugriff auf Ihre Wallet verlieren. Verwahren Sie sie an einem sicheren Ort, auf den nur Sie zugreifen können und den Sie nie vergessen werden", "protect_desc_no_backup": "Dies ist die 12-Worte-Phrase Ihres Wallets. Diese Phrase kann verwendet werden, um die Kontrolle über alle Ihre aktuellen und zukünftigen Konten zu erlangen, einschließlich der Möglichkeit, Guthaben in Ihrem Wallet zu transferieren. Bewahren Sie diese Phrase sicher auf, TEILEN SIE SIE MIOT NIEMANDEN. MetaMask kann Ihnen nicht dabei helfen, diesen Key wiederzufinden.", "learn_more": "Mehr erfahren.", @@ -2780,12 +2833,12 @@ "nft_autodetect_mode": "NFTs automatisch erkennen", "nft_autodetect_desc": "Das Anzeigen von NFT-Medien und -Daten könnte Ihre IT-Adresse an zentralisierte Server weitergeben. Drittanbieter-APIs (wie OpenSea) werden zur Erkennung von NFTs in Ihrem Wallet verwendet. Dies gibt Ihre Kontoadresse an diese Dienste weiter. Lassen Sie diese Funktion deaktiviert, wenn Sie nicht möchten, dass die App Daten von diesen Diensten abruft.", "show_fiat_on_testnets": "Umrechnung auf Testnetzwerk anzeigen", - "show_fiat_on_testnets_desc": "Select this to show fiat conversion on test networks.", + "show_fiat_on_testnets_desc": "Wählen Sie dies aus, um die Fiat-Umrechnung in Testnetzwerken anzuzeigen.", "show_fiat_on_testnets_modal_title": "Sein Sie vorsichtig.", "show_fiat_on_testnets_modal_description": "Wenn Sie aufgefordert wurden, diese Funktion zu aktivieren, werden Sie möglicherweise betrogen. Diese Tokens haben keinen Geldwert und sind nur für Testzwecke gedacht. Diese Funktion hilft Entwicklern, sicherzustellen, dass ihre Apps funktionieren.", - "show_fiat_on_testnets_modal_learn_more": "Mehr erfahren.", + "show_fiat_on_testnets_modal_learn_more": "Mehr erfahren", "show_fiat_on_testnets_modal_button": "Fortfahren", - "show_hex_data": "Show hex data", + "show_hex_data": "Hex-Daten anzeigen", "show_hex_data_desc": "Wählen Sie dies, um das Hex-Datenfeld auf dem Sendebildschirm anzuzeigen.", "accounts_identicon_title": "Konto-Symbol", "accounts_identicon_desc": "Wählen Sie aus drei verschiedenen Stilen einzigartiger Symbole, mit denen Sie Konten auf einen Blick erkennen können.", @@ -2794,7 +2847,7 @@ "general_title": "Allgemein", "general_desc": "Währungsumrechnung, Primärwährung, Sprache und Suchmaschine.", "advanced_title": "Erweitert", - "advanced_desc": "Access developer features, reset account, setup testnets, state logs, IPFS gateway and custom RPC.", + "advanced_desc": "Greifen Sie auf Entwicklerfunktionen, die Kontozurücksetzung, die Erstellung von Testnets, Statusprotokolle, das IPFS-Gateway und benutzerdefiniertes RPC zu.", "notifications_title": "Benachrichtigungen", "notifications_desc": "Verwalten Sie Ihre Benachrichtigungen", "allow_notifications": "Benachrichtigungen erlauben", @@ -2805,10 +2858,10 @@ "customize_session_desc": "Schalten Sie die Arten von Benachrichtigungen ein, die Sie erhalten möchten:", "account_session_title": "Kontoaktivität", "account_session_desc": "Wählen Sie die Konten aus, über die Sie benachrichtigt werden möchten:", - "assets_sent_title": "Assets sent", + "assets_sent_title": "Assets gesendet", "assets_sent_desc": "Fonds und NFT", - "assets_received_title": "Assets received", - "assets_received_desc": "Fonds und NFT", + "assets_received_title": "Assets erhalten", + "assets_received_desc": "Fonds und NFTs", "defi_title": "DeFi", "defi_desc": "Staking, Swapping und Bridging", "snaps_title": "Snaps", @@ -2823,18 +2876,18 @@ "permissions_desc": "Verwalten Sie die für Websites und Apps erteilten Genehmigungen.", "no_permissions": "Keine Genehmigungen", "no_permissions_desc": "Wenn Sie ein Konto mit einer Website oder einer App verbinden, wird es hier angezeigt.", - "security_title": "Sicherheit & Privatsphäre", + "security_title": "Sicherheit und Datenschutz", "back": "Zurück", "security_desc": "Datenschutzeinstellungen, MetaMetrics, privater Schlüssel und geheime Wiederherstellungsphrase.", "networks_title": "Netzwerke", - "networks_default_title": "Default network", + "networks_default_title": "Standardnetzwerk", "network_delete": "Wenn Sie dieses Netzwerk löschen, müssen Sie es erneut hinzufügen, um Ihre Assets in diesem Netzwerk anzuzeigen", "networks_default_cta": "Dieses Netzwerk verwenden", "add_rpc_url": "RPC-URL hinzufügen", "add_block_explorer_url": "Block-Explorer-URL hinzufügen", "networks_desc": "Benutzerdefinierte RPC-Netzwerke hinzufügen und verwalten", - "network_name_label": "Network name", - "network_name_placeholder": "Network name (optional)", + "network_name_label": "Netzwerkname", + "network_name_placeholder": "Netzwerkname (optional)", "network_rpc_url_label": "RPC-URL", "network_rpc_name_label": "RPC-Name", "network_rpc_placeholder": "Neues RPC-Netzwerk", @@ -2846,9 +2899,9 @@ "network_block_explorer_label": "Block-Explorer-URL", "network_block_explorer_placeholder": "Explorer-URL blockieren (optional)", "network_chain_id_warning": "Ungültige Chain-ID", - "network_other_networks": "Other networks", + "network_other_networks": "Sonstige Netzwerke", "network_rpc_networks": "RPC-Netzwerke", - "network_add_network": "Add network", + "network_add_network": "Netzwerk hinzufügen", "network_add_custom_network": "Benutzerdefiniertes Netzwerk hinzufügen", "network_add": "Hinzufügen", "network_save": "Speichern", @@ -2859,11 +2912,11 @@ "info_title_beta": "Über MetaMask Beta", "info_title_flask": "Über MetaMask Flask", "experimental_title": "Experimentell", - "experimental_desc": "WalletConnect & mehr ...", + "experimental_desc": "WalletConnect und mehr ...", "legal_title": "Rechtliches", "conversion_title": "Währungsumrechnung", "conversion_desc": "Zeigt Fiatwerte durch die Nutzung einer bestimmten Währung innerhalb der App an.", - "primary_currency_title": "Primary currency", + "primary_currency_title": "Primärwährung", "primary_currency_desc": "Wählen Sie „Nativ“ aus, um die Darstellung der Werte in der nativen Währung der Chain (z. B. ETH) anzuzeigen. Wählen Sie „Fiat“ aus, um die Darstellung der Werte in Ihrer ausgewählten Fiat-Währung zu priorisieren.", "primary_currency_text_first": "Nativ", "primary_currency_text_second": "Fiat", @@ -2884,7 +2937,7 @@ "batch_balance_requests_description": "Erhalten Sie Aktualisierungen zum Kontostand all Ihrer Konten gleichzeitig. Bei Deaktivierung dieser Funktion wird es für Dritte schwieriger, Konten miteinander zu verknüpfen.", "third_party_title": "Erhalten Sie eingehende Transaktionen", "third_party_description": "APIs von Drittanbietern (Etherscan) werden verwendet, um Ihnen eingehende Transaktionen im Verlauf anzuzeigen. Schalten Sie dies ab, wenn Sie keine Daten von diesen Diensten abrufen möchten.", - "metametrics_opt_out": "MetaMetrics Opt-out", + "metametrics_opt_out": "MetaMetrics opt-out", "metametrics_restart_required": "Sie müssen die App neu starten, damit die Änderungen angewandt werden.", "create_password": "Passwort erstellen", "invalid_password": "Ungültiges Passwort", @@ -2900,11 +2953,11 @@ "invalid_number": "Ungültige Zahl. Geben Sie eine Dezimalzahl oder eine mit „0x“ beginnende Hexadezimalzahl ein.", "invalid_number_leading_zeros": "Ungültige Zahl. Entfernen Sie Nullen am Anfang.", "invalid_number_range": "Ungültige Zahl. Geben Sie eine Zahl zwischen 1 und %{maxSafeChainId} ein", - "hide_zero_balance_tokens_title": "Hide tokens without balance", + "hide_zero_balance_tokens_title": "Tokens ohne Guthaben verbergen", "hide_zero_balance_tokens_desc": "Vermeiden Sie, dass Token ohne Guthaben in Ihrer Token-Liste angezeigt werden.", "token_detection_title": "Tokens automatisch erkennen", "token_detection_description": "Wir verwenden APIs von Drittanbietern, um neue Token zu erkennen und anzuzeigen, die in Ihr Wallet gesendet werden. Schalten Sie dies ab, wenn Sie keine Daten von diesen Diensten beziehen möchten.", - "theme_button_text": "Change theme", + "theme_button_text": "Theme ändern", "theme_title": "Design ({{theme}})", "theme_description": "Verändern Sie das Aussehen Ihrer App, indem Sie das Design einstellen.", "theme_os": "System", @@ -2936,13 +2989,13 @@ "delete_metrics_description_after_delete_part_two": ". Dieser Prozess kann bis zu 30 Tage in Anspruch nehmen. Lesen Sie unsere", "delete_metrics_description_privacy_policy": "Datenschutzerklärung.", "delete_metrics_button": "MetaMetrics-Daten löschen", - "check_status_button": "Check status", + "check_status_button": "Status überprüfen", "delete_metrics_confirm_modal_title": "MetaMetrics-Daten löschen?", "delete_metrics_confirm_modal_description": "Wir löschen all Ihre MetaMetrics-Daten. Sind Sie sicher?", "delete_wallet_data_title": "Wallet zurücksetzen", "delete_wallet_data_description": "Dadruch werden alle mit der Wallet in Verbindung stehenden Daten von Ihrem Gerät gelöscht. Ihre Konten existieren auf der Blockchain und stehen nicht mit MetaMask in Verbindung. Sie können Ihre Konten jederzeit mit Ihrer geheimen Wiederherstellungsphrase wiederherstellen.", "delete_wallet_data_button": "Wallet zurücksetzen", - "delete_data_status_title": "Deletion task status", + "delete_data_status_title": "Status der Löschaufgabe", "delete_data_status_description": "Der aktuelle Status lautet", "delete_metrics_error_title": "Wir können diese Daten im Moment nicht löschen.", "delete_metrics_error_description": "Die Anfrage kann aktuell nicht abgeschlossen werden, da ein Problem mit dem Analytik-System des Servers vorliegt. Bitte versuchen Sie es später erneut.", @@ -2957,6 +3010,7 @@ "description": "Region und mehr ...", "current_region": "Aktuelle Region", "reset_region": "Region zurücksetzen", + "change_region": "Region ändern", "no_region_selected": "Keine Region ausgewählt", "sdk_activation_keys": "SDK-Aktivierungsschlüssel", "activation_keys_description": "Aktivierungsschlüssel aktivieren bestimmte Funktionen oder Anbieter.", @@ -3007,13 +3061,13 @@ }, "snap_details": { "install_date": "Installiert am {{date}}", - "install_origin": "Install origin", + "install_origin": "Installationsquelle", "enabled": "Aktiviert", "version": "Version" }, "keyring_account_list_item": { "account_name": "Kontoname", - "public_address": "Public address" + "public_address": "Öffentliche Adresse" }, "snap_permissions": { "approved_date": "Genehmigt am {{date}}", @@ -3068,24 +3122,24 @@ "dismiss_smart_account_update_desc": "Schalten Sie dies ein, um den Vorschlag „Zum Smart-Konto wechseln“ für kein Konto mehr anzuzeigen. Smart-Konten ermöglichen schnellere Transaktionen, niedrigere Netzwerkgebühren und mehr Flexibilität bei der Zahlung.", "use_smart_account_heading": "Smart-Konto verwenden", "use_smart_account_desc": "Lassen Sie diese Option aktiviert, um in MetaMask erstellte Konten automatisch in Smart-Konten umzuwandeln, sobald relevante Funktionen verfügbar sind, wie z. B. schnellere Transaktionen, niedrigere Netzwerkgebühren und Flexibilität bei der Zahlungsabwicklung für diese.", - "use_smart_account_learn_more": "Erfahren Sie mehr.", + "use_smart_account_learn_more": "Mehr erfahren", "smart_transactions_opt_in_heading": "Smart Transactions", "smart_transactions_opt_in_desc_supported_networks": "Schalten Sie Smart Transactions für zuverlässigere und sicherere Transaktionen auf unterstützten Netzwerken ein.", - "smart_transactions_learn_more": "Erfahren Sie mehr.", + "smart_transactions_learn_more": "Mehr erfahren", "simulation_details": "Geschätzte Kontostandänderungen", "simulation_details_description": "Schalten Sie dies ein, um die Kontostandänderungen von Transaktionen zu schätzen, bevor Sie sie bestätigen. Dies ist keine Garantie für das endgültige Ergebnis Ihrer Transaktionen. ", "simulation_details_learn_more": "Erfahren Sie mehr.", - "aes_crypto_test_form_title": "AES crypto - test form", + "aes_crypto_test_form_title": "AES Crypto – Testformular", "aes_crypto_test_form_description": "Abschnitt, der ausschließlich für E2E-Tests entwickelt wurde. Wenn dies in Ihrer App sichtbar ist, melden Sie es bitte dem MetaMask-Support.", "developer_options": { - "title": "Developer options", - "generate_trace_test": "Generate trace test", - "generate_trace_test_desc": "Generate a developer test Sentry trace.", - "navigate_to_sample_feature": "Navigate to sample feature", + "title": "Entwickler-Optionen", + "generate_trace_test": "Trace-Test erstellen", + "generate_trace_test_desc": "Erstellen Sie ein Entwickler-Test-Sentry-Trace.", + "navigate_to_sample_feature": "Zur Beispielfunktion navigieren", "sample_feature_desc": "Eine Beispielfunktion als eine Vorlage für Entwickler." }, "feature_flag_override": { - "title": "Feature flag override", + "title": "Feature-Flag-Überschreibung", "description": "Überschreiben Sie die Feature-Flags der App lokal." } }, @@ -3138,7 +3192,7 @@ "sdk_feedback_modal": { "ok": "OK", "title": "Konto konnte keine Verbindung herstellen", - "info": "Bitte scannen Sie den QR-Code auf der dApp, um sich erneut mit MetaMask zu verbinden." + "info": "Please scan the QR code on the site to reconnect to MetaMask" }, "app_information": { "title": "Information", @@ -3146,8 +3200,8 @@ "privacy_policy": "Datenschutzerklärung", "terms_of_use": "Nutzungsbedingungen", "attributions": "Zuschreibungen", - "support_center": "Visit our support center", - "web_site": "Besuchen Sie unsere Webseite", + "support_center": "Besuchen Sie unser Support Center", + "web_site": "Visit our website", "contact_us": "Contact us" }, "reveal_credential": { @@ -3217,7 +3271,7 @@ "password_reset": { "password_title": "Passwort", "password_desc": "Legen Sie ein starkes Passwort fest, um die MetaMask-App auf Ihrem Gerät zu aktivieren. Wenn Sie dieses Passwort verlieren, benötigen Sie Ihre geheime Wiederherstellungsphrase, um Ihr Wallet erneut zu importieren.", - "password_learn_more": "Mehr erfahren.", + "password_learn_more": "Mehr erfahren", "change_password": "Passwort ändern", "password_hint": "Passworthinweis" }, @@ -3247,19 +3301,28 @@ "swap": "Swappen", "bridge": "Bridge", "earn": "Verdienen", - "convert_to_musd": "Convert to mUSD", + "convert_to_musd": "Zu mUSD konvertieren", + "merkl_rewards": { + "annual_bonus": "% Bonus {{apy}}", + "claimable_bonus": "Anspruchsberechtigter Bonus", + "claimable_bonus_tooltip_description": "mUSD bonuses are claimed on Linea.", + "terms_apply": "Terms apply.", + "ok": "OK", + "claim": "Einfordern", + "processing_claim": "Processing claim..." + }, "tron": { - "daily_resource_new_energy": "New daily energy", - "sufficient_to_cover": "Sufficient to cover", + "daily_resource_new_energy": "Neue tägliche Energie", + "sufficient_to_cover": "Ausreichend zur Deckung", "transactions": "Transaktionen", "daily_resource": "Tägliche Ressource", "bandwidth": "Bandbreite", "energy": "Energie", - "daily_resource_description": "This is your daily allowance based on your staked TRX. Hold TRX to get 600 bandwidth daily.", - "sufficient_to_cover_trx_transfers": "Covers ~{{amount}} TRX transfers", - "sufficient_to_cover_trx_transfer": "Covers 1 TRX transfer", - "sufficient_to_cover_usdt_transfers": "Covers ~{{amount}} USDT transfers", - "sufficient_to_cover_usdt_transfer": "Covers 1 USDT transfer" + "daily_resource_description": "Dies ist Ihr tägliches Datenvolumen basierend auf Ihren gestakten TRX. Halten Sie TRX, um täglich 600 Bandbreite zu erhalten.", + "sufficient_to_cover_trx_transfers": "Deckt ~{{amount}} TRX-Transfers", + "sufficient_to_cover_trx_transfer": "Deckt 1 TRX-Transfer", + "sufficient_to_cover_usdt_transfers": "Deckt ~{{amount}} USDT-Transfers", + "sufficient_to_cover_usdt_transfer": "Deckt 1 USDT-Transfer" }, "disabled_button": { "buy": "Kaufen wird für dieses Konto nicht unterstützt", @@ -3312,9 +3375,11 @@ }, "no_chart_data": { "title": "Keine Diagrammdaten", - "description": "Für dieses Token konnten keine Daten abgerufen werden." + "description": "Für dieses Token konnten keine Daten abgerufen werden.", + "insufficient_data": "Data is not available for this time period" }, "your_balance": "Ihr Kontostand", + "perps_position": "Perps-Position", "unable_to_load_balance": "Ihr Guthaben konnte nicht geladen werden.", "about": "Über", "about_content_display": { @@ -3364,11 +3429,11 @@ "address_copied_to_clipboard": "Token-Adresse in die Zwischenablage kopiert" }, "qr_scanner": { - "invalid_qr_code_title": "Ungültiger QR-Code", + "invalid_qr_code_title": "Invalid QR code", "invalid_qr_code_message": "Der QR-Code, den Sie zu scannen versuchen, ist ungültig.", "allow_camera_dialog_title": "Kamerazugriff erlauben", "allow_camera_dialog_message": "Wir benötigen Ihre Berechtigung, um QR-Codes zu scannen", - "scanning": "Scanne ...", + "scanning": "Scan ...", "ok": "Ok", "continue": "Fortfahren", "cancel": "Stornieren", @@ -3377,14 +3442,14 @@ "attempting_sync_from_wallet_error": "Es sieht aus, als würden Sie versuchen, die Erweiterung zu synchronisieren. Um dies zu tun, müssen Sie Ihr aktuelles Waller löschen. \n\nNachdem Sie die App gelöscht oder eine aktuelle Version der App neu installiert haben, wählen Sie die Option „Mit MetaMask-Erweiterung synchronisieren“. Wichtig! Bevor Sie Ihr Wallet löschen, stellen Sie sicher, dass Sie ein Backup Ihrer geheimen Wiederherstellungsphrase haben.", "not_allowed_error_title": "Kamerazugriff einschalten", "not_allowed_error_desc": "Um einen QR-Code zu scannen, müssen Sie MetaMask über das Einstellungsmenü Ihres Geräts Zugriff auf die Kamera gewähren.", - "unrecognized_address_qr_code_title": "Unbekannter QR-Code", + "unrecognized_address_qr_code_title": "Unrecognized QR code", "unrecognized_address_qr_code_desc": "Es tut uns leid, aber dieser QR-Code ist mit keiner Konto- oder Contract-Adresse verbunden.", "url_redirection_alert_title": "Sie sind im Begriff, einen externen Link abzurufen", "url_redirection_alert_desc": "Links können verwendet werden, um versuchen, Personen zu betrügen oder zu phishen, also besuchen Sie nur Webseiten, denen Sie vertrauen.", "label": "Einen QR-Code scannen", "open_settings": "Einstellungen", "camera_not_available": "Kamera nicht verfügbar", - "tron_address_not_supported": "Tron addresses are not currently supported" + "tron_address_not_supported": "Tron-Adressen werden derzeit nicht unterstützt" }, "action_view": { "cancel": "Stornieren", @@ -3472,10 +3537,10 @@ "cancel_tx_message": "Das Absenden dieses Versuches garantiert nicht, dass die Transaktion storniert wird. Wenn der Abbruchversuch erfolgreich ist, wird Ihnen die obige Transaktionsgebühr in Rechnung gestellt.", "speedup_tx_title": "Versuchen, zu beschleunigen?", "speedup_tx_message": "Das Absenden dieses Versuches garantiert nicht, dass die Transaktion beschleunigt wird. Wenn der Beschleunigungsversuch erfolgreich ist, wird Ihnen die obige Transaktionsgebühr in Rechnung gestellt.", - "nevermind": "Schon gut", + "nevermind": "Never mind", "edit_network_fee": "Gas-Gebühr bearbeiten", "edit_priority": "Priorität bearbeiten", - "gas_cancel_fee": "Gas-Stornogebühr", + "gas_cancel_fee": "Gas cancellation fee", "gas_speedup_fee": "Gas-Beschleunigungsgebühr", "use_max": "Maximum verwenden", "set_gas": "Festlegen", @@ -3603,7 +3668,7 @@ "reload": "Erneut laden", "share": "Teilen", "bookmark": "Lesezeichen erstellen", - "add_to_favorites": "Zu Favoriten hinzufügen", + "add_to_favorites": "Add to favorites", "error": "Fehler", "cancel": "Stornieren", "go_back": "Zurück", @@ -3611,7 +3676,7 @@ "home": "Startseite", "close": "Schließen", "open_in_browser": "In Browser öffnen", - "change_url": "URL ändern", + "change_url": "Change URL", "switch_network": "Netzwerk wechseln", "dapp_browser": "DAPP-BROWSER", "dapp_browser_message": "MetaMask ist Ihr Wallet und Ihr Browser für das dezentralisierte Internet. Sehen Sie sich um!", @@ -3665,7 +3730,7 @@ "approve": { "title": "Genehmigen", "deeplink": "Deeplink", - "qr_code": "QR-CODE" + "qr_code": "QR-Code" }, "transactions": { "tx_review_confirm": "Bestätigen", @@ -3677,30 +3742,30 @@ "tx_review_increase_allowance": "Increase allowance", "tx_review_set_approval_for_all": "Set approval for all", "tx_review_staking_claim": "Staking claim", - "tx_review_staking_deposit": "Staking deposit", + "tx_review_staking_deposit": "Staking-Einzahlung", "tx_review_staking_unstake": "Unstaken", - "tx_review_lending_deposit": "Lending deposit", + "tx_review_lending_deposit": "Krediteinzahlung", "tx_review_lending_withdraw": "Lending withdrawal", "tx_review_perps_deposit": "Finanzierte Perps", "tx_review_predict_deposit": "Finanzierte Prognosen", "tx_review_predict_claim": "Eingeforderte Gewinne", "tx_review_predict_withdraw": "Prognosenwiderruf", - "tx_review_musd_conversion": "mUSD Conversion", - "sent_ether": "Ether senden", - "self_sent_ether": "Sent yourself Ether", - "received_ether": "Ether empfangen", + "tx_review_musd_conversion": "mUSD-Konvertierung", + "sent_ether": "Sent ETH", + "self_sent_ether": "Sent yourself ETH", + "received_ether": "Received ETH", "sent_dai": "DAI senden", "self_sent_dai": "Senden Sie sich selbst DAI", "received_dai": "DAI empfangen", "sent_tokens": "Sent tokens", "received_tokens": "Received tokens", - "ether": "Ether", + "ether": "ETH", "sent_unit": "{{unit}} senden", "self_sent_unit": "Sent yourself {{unit}}", "received_unit": "{{unit}} empfangen", "sent_collectible": "Sent collectible", "received_collectible": "Received collectible", - "send_ether": "Send Ether", + "send_ether": "Send ETH", "send_unit": "Send {{unit}}", "send_collectible": "Send collectible", "receive_collectible": "Receive collectible", @@ -3733,9 +3798,9 @@ }, "gas_used": "Gas used (units)", "gas_limit": "Gas limit (units)", - "gas_price": "Gas-Preis (GWEI)", - "base_fee": "Grundgebühr (GWEI)", - "priority_fee": "Prioritätsgebühr (GWEI)", + "gas_price": "Gas price (GWEI)", + "base_fee": "Base fee (GWEI)", + "priority_fee": "Priority fee (GWEI)", "multichain_priority_fee": "Prioritätsgebühr", "max_fee": "Max fee per gas", "total": "Gesamt", @@ -3768,7 +3833,7 @@ "confirm_gas_fee_token_tooltip": "Diese Gebühr wird für die Bearbeitung Ihrer Transaktion an das Netzwerk gezahlt. Sie schließt eine {{metamaskFeeFiat}}-MetaMask-Gebühr für Nicht-ETH-Token oder vorfinanzierte ETH ein.", "paid_by_metamask": "Bezahlt von MetaMask", "confirm_gas_fee_token_metamask_fee": "Beinhaltet {{metamaskFeeFiat}} Gebühr", - "smart_account_upgrade": "Auf Smart-Konto upgraden", + "smart_account_upgrade": "Zum Smart-Konto wechseln", "smart_account_downgrade": "Zum Standardkonto wechseln", "batched_transactions": "Gestapelte Transaktionen", "gas_modal": { @@ -4005,8 +4070,8 @@ "biometrics": { "enable_touchid": "Mit Touch ID entsperren?", "enable_faceid": "Mit Face ID entsperren?", - "enable_fingerprint": "Mit Fingerabdruck entsperren?", - "enable_biometrics": "Mit Biometrik entsperren?", + "enable_fingerprint": "Unlock with fingerprint?", + "enable_biometrics": "Unlock with biometrics?", "enable_device_passcode_ios": "Mit Geräte-Passcode entsperren?", "enable_device_passcode_android": "Mit Geräte-PIN entsperren?" }, @@ -4021,18 +4086,18 @@ "title": "VERBINDUNGSANFRAGE", "walletconnect_title": "WALLET-VERBINDUNGSANFRAGE", "action": "Mit dieser Seite verbinden?", - "action_reconnect": "Wählen Sie zur Fortsetzung der Verbindung die Nummer, die Sie auf der dApp sehen.", - "action_reconnect_deeplink": "Möchten Sie sich erneut mit dieser dApp verbinden?", + "action_reconnect": "To resume connection, choose the number you see on the site", + "action_reconnect_deeplink": "Do you want to reconnect to this site?", "connect": "Verbinden", "resume": "Fortsetzen", "cancel": "Stornieren", - "donot_rememberme": "dApp-Verbindung nicht merken", + "donot_rememberme": "Do not remember this site connection", "disconnect": "Verbindung trennen", "permission": "Anzeigen:", "address": "öffentliche adresse", "sign_messages": "Nachrichten unterzeichnen", "on_your_behalf": "unterschreiben", - "warning": "Wenn Sie auf „Verbinden“ klicken, erlauben Sie dieser Dapp, Ihre öffentliche Adresse einzusehen. Dies ist ein wichtiger Sicherheitsschritt, um Ihre Daten vor potenziellen Phishing-Risiken zu schützen." + "warning": "By clicking connect, you allow this site to view your public address. This is an important security step to protect your data from potential phishing risks." }, "import_private_key": { "title": "Konto importieren", @@ -4048,7 +4113,7 @@ "error_title": "Etwas ist schiefgelaufen", "error_message": "Wir konnten den privaten Key nicht importieren. Bitte überprüfen Sie, ob Sie ihn korrekt eingegeben haben.", "error_empty_message": "Sie müssen Ihren privaten Key eingeben.", - "or_scan_a_qr_code": "Oder einen QR-Code scannen" + "or_scan_a_qr_code": "or scan a QR code" }, "import_private_key_success": { "title": "Konto erfolgreich importiert!", @@ -4065,12 +4130,12 @@ "paste": "Einfügen", "clear": "Alle löschen", "srp_number_of_words_option_title": "Anzahl der Wörter", - "12_word_option": "Ich habe eine 12-Wort-Phrase", - "24_word_option": "Ich habe eine 24-Wort-Phrase", + "12_word_option": "I have a 12-word phrase", + "24_word_option": "I have a 24-word phrase", "error_title": "Hoppla! Etwas ist schiefgelaufen ...", "error_message": "We couldn't import that Secret Recovery Phrase. Please make sure you entered it correctly.", "error_empty_message": "You need to enter your Secret Recovery Phrase.", - "error_number_of_words_error_message": "Geheime Wiederherstellungsphrasen enthalten 12 oder 24 Wörter", + "error_number_of_words_error_message": "Secret Recovery Phrases contain 12 or 24 words", "error_srp_is_case_sensitive": "Ungültige Eingabe! Bei der geheimen Wiederherstellungsphrase wird zwischen Groß- und Kleinschreibung unterschieden.", "error_srp_word_error_1": "Wort ", "error_srp_word_error_2": " ist falsch oder falsch geschrieben.", @@ -4080,7 +4145,7 @@ "error_invalid_srp": "Geheime Wiederherstellungsphrase ungültig", "error_duplicate_srp": "Diese geheime Wiederherstellungsphrase wurde bereits importiert.", "error_duplicate_account": "The account you are trying to import is a duplicate.", - "invalid_qr_code_title": "Ungültiger QR-Code", + "invalid_qr_code_title": "Invalid QR code", "invalid_qr_code_message": "The QR code does not contain a valid Secret Recovery Phrase", "success_1": "Wallet", "success_2": "importiert" @@ -4152,7 +4217,7 @@ "why_secure_2": "Es ist die einzige Möglichkeit, um Ihr Wallet wiederherzustellen, wenn Sie aus der App ausgesperrt werden oder ein neues Gerät kaufen." }, "account_backup_step_2": { - "cancel_backup_title": "Cancel backup", + "cancel_backup_title": "Backup abbrechen", "cancel_backup_message": "Wir empfehlen Ihnen nachdrücklich, ihre geheime Wiederherstellungsphrase aufzubewahren bzw. zu speichern, um Ihre Wallet wiederherzustellen.", "cancel_backup_ok": "Ja, ich nehme das Risiko in Kauf", "cancel_backup_no": "Nein, Backup der geheimen Wiederherstellungsphrase erstellen", @@ -4164,7 +4229,7 @@ "cta_text": "OK" }, "account_backup_step_3": { - "cancel_backup_title": "Cancel backup", + "cancel_backup_title": "Backup abbrechen", "cancel_backup_message": "Wir empfehlen Ihnen nachdrücklich, ihre geheime Wiederherstellungsphrase zu speichern, um Ihr Wallet wiederherzustellen.", "cancel_backup_ok": "Ja, ich nehme das Risiko in Kauf.", "cancel_backup_no": "Nein, Backup der geheimen Wiederherstellungsphrase erstellen", @@ -4173,7 +4238,7 @@ "cta_text": "MICH BEOBACHTET NIEMAND" }, "account_backup_step_4": { - "cancel_backup_title": "Cancel backup", + "cancel_backup_title": "Backup abbrechen", "cancel_backup_message": "Wir empfehlen Ihnen nachdrücklich, ihre geheime Wiederherstellungsphrase aufzubewahren bzw. zu speichern, um Ihre Wallet wiederherzustellen.", "cancel_backup_ok": "Ja, ich nehme das Risiko in Kauf", "cancel_backup_no": "Nein, Backup der geheimen Wiederherstellungsphrase erstellen", @@ -4198,16 +4263,16 @@ "modal_button": "WEITER" }, "account_backup_step_6": { - "title": "Security tips", + "title": "Sicherheitstipps", "info_text": "MetaMask kann ihre geheime Wiederherstellungsphrase nicht wiederherstellen, wenn Sie diese verlieren", "tip_1": "Erstellen Sie mehrere Backups Ihrer geheimen Wiederherstellungsphrase", "tip_2": "Speichern Sie die Phrase in einem Passwortmanager Ihres Vertrauens und bewahren Sie außerdem papierbasierte Backups an einem sicheren Ort auf.", "tip_3": "Teilen Sie diese Phrase niemals mit anderen", "disclaimer": "* Um Ihre geheime Wiederherstellungsphrase zu finden, gehen Sie zu", - "disclaimer_bold": "Einstellungen > Sicherheit & Datenschutz gehen", - "cta_text": "ALLES KLAR!", + "disclaimer_bold": "Einstellungen > Sicherheit und Datenschutz", + "cta_text": "VERSTANDEN", "modal_title": "Glückwunsch!", - "modal_text": "Sie haben Ihre Backups erstellt und können loslegen!", + "modal_text": "Sie haben Ihre Backups erstellt und können loslegen.", "modal_button": "FERTIG", "copy_seed_phrase": "Geheime Wiederherstellungsphrase IN DIE ZWISCHENABLAGE KOPIEREN" }, @@ -4239,7 +4304,7 @@ "steps": "Schritt {{currentStep}} von {{totalSteps}}", "action": "Geheime Wiederherstellungsphrase bestätigen", "info": "Wählen Sie die fehlenden Wörter in der richtigen Reihenfolge.", - "complete": "Complete backup", + "complete": "Backup abschließen", "success": "Erfolg", "error-title": "Nicht ganz richtig", "error-description": "Überprüfen Sie Ihre geheime Wiederherstellungsphrase noch einmal und versuchen Sie es erneut.", @@ -4254,7 +4319,7 @@ "congratulations": "Glückwunsch", "success": "Sie haben Ihr Wallet erfolgreich geschützt. Denken Sie daran, ihre geheime Wiederherstellungsphrase sicher aufzubewahren. Die Verantwortung dafür liegt bei ihnen!", "hint": "Sich selbst einen Hinweis hinterlassen?", - "recover": "MetaMask kann Ihr Wallet nicht wiederherstellen, falls Sie es verlieren. Sie können Ihre geheime Wiederherstellungsphrase in Einstellungen > Sicherheit & Datenschutz finden", + "recover": "MetaMask kann Ihre Wallet nicht wiederherstellen, falls Sie sie verlieren. Sie können Ihre geheime Wiederherstellungsphrase in Einstellungen > Sicherheit und Datenschutz finden.", "learn": "Mehr erfahren", "done": "Fertig", "recovery_hint": "Wiederherstellungshinweis", @@ -4418,7 +4483,7 @@ "metamask_swap_completed_title": "Swap abgeschlossen", "metamask_swap_completed_description": "Ihr MetaMask-Swap war erfolgreich", "nft_sent_title": "NFT gesendet", - "nft_sent_description": "Sie haben erfolgreich ein NFT gesendet", + "nft_sent_description": "You successfully sent an NFT", "nft_received_title": "NFT empfangen", "nft_received_description": "Sie haben neue NFTs empfangen", "rocketpool_stake_completed_title": "Stake abgeschlossen", @@ -4518,16 +4583,16 @@ "description_1": "Ihr Anfragelink kann jetzt gesendet werden!", "description_2": "Senden Sie diesen Link an eine/n Freund/in und er/sie wird gebeten, zu senden", "copy_to_clipboard": "In die Zwischenablage kopieren", - "qr_code": "QR-CODE", + "qr_code": "QR-Code", "send_link": "Send link", - "request_qr_code": "QR-Code der Zahlungsanfrage", + "request_qr_code": "Payment request QR code", "balance": "Guthaben" }, "receive_request": { "title": "Abheben", "share_title": "Share address", "share_description": "Senden Sie Ihre Adresse via E-Mail oder Kurznachricht", - "qr_code_title": "QR-CODE", + "qr_code_title": "QR-Code", "qr_code_description": "Scanbares Bild, auf dem Ihre Adresse lesbar ist", "request_title": "Anfragen", "request_description": "Fragen Sie Vermögenswerte bei Freunden an", @@ -4562,12 +4627,12 @@ "close_current_session": "Schließen Sie die aktuelle Sitzung, bevor Sie eine neue beginnen." }, "paymentRequest": { - "title": "ZAHLUNGSANFRAGE", - "title_complete": "ZAHLUNG ABGESCHLOSSEN", - "confirm": "ZAHLEN", - "cancel": "ABLEHNEN", + "title": "Payment request", + "title_complete": "Payment complete", + "confirm": "Pay", + "cancel": "Decline", "is_requesting_you_to_pay": "bittet Sie um eine Zahlung", - "total": "GESAMT:" + "total": "Insgesamt:" }, "webview_error": { "title": "Etwas ist schiefgelaufen", @@ -4590,6 +4655,10 @@ "fiat_on_ramp": { "buy_eth": "EHT kaufen", "buy": "{{ticker}} kaufen", + "on_network": "auf {{networkName}}", + "debit_card": "Debitkarte", + "continue": "Fortfahren", + "powered_by_provider": "Unterstützt von {{provider}}", "purchased_currency": "{{currency}} gekauft", "network_not_supported": "Aktuelles Netzwerk nicht unterstützt", "switch_network": "Bitte wechseln Sie zu Mainnet", @@ -4677,6 +4746,14 @@ "subtitle_5": "und zu sehen, wie hoch die Gas-Gebühren sind.", "cta": "Mit dem Kauf von {{ticker}} fortfahren" } + }, + "build_quote_settings_modal": { + "title": "Einstellungen", + "view_order_history": "Order-Verlauf anzeigen", + "contact_support": "Support kontaktieren", + "log_out": "Von {{provider}} abmelden", + "logged_out_success": "Erfolgreich abgemeldet", + "logged_out_error": "Fehler beim Abmelden" } }, "fiat_on_ramp_aggregator": { @@ -4823,6 +4900,7 @@ "title": "Wählen Sie Ihre Region.", "description": "Die Ihnen zur Verfügung stehenden Zahlungsmethoden und Tokens hängen von unseren Drittanbieter-Integrationen ab und könnten sich je nach Ihrer Region und der Unterstützung unsere Integrationen unterscheiden.", "sell_description": "Bargeldzieloptionen und Tokens können je nach Region variieren.", + "region_variation_notice": "Die Zahlungsmethoden und verfügbaren Tokens können je nach Region und unseren Anbietern variieren.", "search_by_country": "Suche nach Land", "search_by_state": "Nach Bundesland suchen", "no_region_results": "Keine übereinstimmenden Regionen", @@ -4850,7 +4928,7 @@ "continue_order_description": "Um Ihre Order fortzusetzen, müssen Sie die Schaltfläche am unteren Rand dieser Seite anklicken.", "the_provider": "Der Dienstleister", "processing": "Order wird verarbeitet", - "processing_card_description": "Kredit-/Debitkäufe brauchen normalerweise ein paar Minuten", + "processing_card_description": "Kredit-/Debitkäufe dauern in der Regel nur wenige Minuten", "processing_bank_description": "Banküberweisungen dauern normalerweise ein paar Werktage", "details": "Order-Details", "via": "via", @@ -4884,11 +4962,11 @@ "sent": "Versendet!" }, "notifications": { - "purchase_failed_title": "Der Kauf von {{currency}} ist fehlgeschlagen! Bitte versuchen Sie es erneut. Wir entschuldigen uns für die Umstände!", + "purchase_failed_title": "Der Kauf von {{currency}} ist fehlgeschlagen. Bitte versuchen Sie es in Kürze erneut.", "purchase_failed_description": "Verifizieren Sie Ihre Zahlungsmethode und Ihren Kartensupport", "purchase_cancelled_title": "Ihr Kauf wurde storniert.", "purchase_cancelled_description": "Verifizieren Sie Ihre Zahlungsmethode und Ihren Kartensupport", - "purchase_completed_title": "Ihr Kauf im Wert von {{amount}} {{currency}} war erfolgreich!", + "purchase_completed_title": "Ihr Kauf von {{amount}} {{currency}} war erfolgreich.", "purchase_completed_description": "Ihre {{currency}} steht jetzt zur Verfügung.", "purchase_pending_title": "Der Kauf von {{currency}} wird bearbeitet.", "purchase_pending_description": "Dies sollte nur ein paar Minuten dauern ...", @@ -4897,7 +4975,7 @@ "sale_cancelled_title": "Bestellung storniert", "sale_cancelled_description": "Ihre Bestellung konnte nicht abgeschlossen werden.", "sale_completed_title": "Bestellung abgeschlossen", - "sale_completed_description": "Ihre Bestellung war erfolgreich!", + "sale_completed_description": "Ihre Order wurde erfolgreich abgeschlossen.", "sale_pending_title": "{{currency}}-Verkaufsabwicklung", "sale_pending_description": "Ihre Order wird soeben verarbeitet.", "no_date": "Unbekannt" @@ -4922,7 +5000,7 @@ "start_swapping": "Mit dem Tausch beginnen" }, "feature_off_title": "Vorrübergehend nicht verfügbar", - "feature_off_body": "MetaMask Swaps wird zur Zeit gewartet. Bitte versuchen Sie es später.", + "feature_off_body": "MetaMask Swaps are undergoing maintenance. Please check back later.", "wrong_network_title": "Tauschgeschäfte (Swaps) nicht verfügbar", "wrong_network_body": "Sie können Token nur über das Ethereum-Netzwerk tauschen.", "unallowed_asset_title": "Dieser Token kann nicht umgetauscht werden", @@ -5003,7 +5081,7 @@ "edit": "Bearbeiten", "quotes_include_fee": "Angebote beinhalten eine MetaMask-Gebühr in Höhe von {{fee}} %.", "quotes_include_gas_and_metamask_fee": "Angebot umfasst Gas und eine MetaMask-Gebühr von {{fee}} %", - "tap_to_swap": "Zum Tauschen tippen", + "tap_to_swap": "Tap to swap", "swipe_to_swap": "Zum Tauschen wischen", "swipe_to": "Wischen, um zu", "swap": "Swap", @@ -5303,7 +5381,7 @@ }, "network_information": { "things_to_keep_in_mind": "Was Sie beachten sollten", - "testnet_network": "{{type}}-Testnet", + "testnet_network": "{{type}}-testnet", "first_description": "Das native Token dieses Netzwerks ist {{ticker}}. Dieses Token wird für die Gasgebühr verwendet.", "second_description": "Wenn Sie versuchen, einen Vermögenswert direkt von einem Netzwerk an ein anderes zu senden, könnte dies einen permanenten Verlust zufolge haben. Stellen Sie sicher, dass Sie eine Brücke verwenden.", "third_description": "Ihre Tokens werden möglicherweise nicht automatisch in Ihrer Wallet angezeigt.", @@ -5386,7 +5464,7 @@ "learn_more": "Mehr erfahren" }, "token_allowance": { - "verify_third_party_details": "Drittanbieterdetails verifizieren", + "verify_third_party_details": "Verify third-party details", "protect_from_scams": "Nehmen Sie sich einen Moment Zeit, um die Drittanbieterdetails zu verifizieren und sich so vor Betrügern zu schützen.", "learn_to_verify": "Erfahren Sie, wie Sie Drittanbieterdetails überprüfen können.", "spending_cap": "ausgabenobergrenze", @@ -5400,7 +5478,7 @@ }, "restore_wallet": { "restore_needed_title": "Wiederherstellung erforderlich", - "restore_needed_description": "Etwas ist schiefgelaufen, aber keine Sorge! Versuchen wir, Ihre Wallet wiederherzustellen.", + "restore_needed_description": "Something went wrong, but don’t worry! Let’s try to restore your wallet.", "restore_needed_action": "Wallet wiederherstellen" }, "wallet_restored": { @@ -5599,6 +5677,10 @@ "error_description": "Installation von {{snap}} fehlgeschlagen." }, "earn": { + "claimable_bonus_tooltip": "An annual bonus claimable daily from your wallet.", + "earn_a_percentage_bonus": "Earn a {{percentage}}% bonus", + "claimable_bonus": "Claimable bonus", + "claim_bonus": "Claim bonus", "empty_state_cta": { "heading": "Verleihen Sie {{tokenSymbol}} und verdienen Sie", "body": "Verleihen Sie Ihre {{tokenSymbol}} mit {{protocol}} und verdienen Sie", @@ -5682,21 +5764,36 @@ "fee": "Gebühr" }, "musd_conversion": { - "convert_to_musd": "Convert to mUSD", + "ok": "OK", + "continue": "Continue", + "convert_and_get_percentage_bonus": "Konvertieren und {{percentage}} % erhalten", + "get_a_percentage_musd_bonus": "Erhalten Sie {{percentage}} % mUSD-Bonus", + "convert": "Konvertieren", "toasts": { - "converting": "Converting {{token}} → mUSD", + "converting": "Konvertierung von {{token}} → mUSD", "eta": "~{{time}}", - "delivered": "Your mUSD has been delivered!", - "failed": "mUSD conversion failed" + "delivered": "Ihr mUSD ist hier!", + "failed": "mUSD-Konvertierung fehlgeschlagen" }, "education": { - "heading": "Erhalten Sie Belohnungen mit mUSD", - "description": "Convert your USDC, USDT, or DAI for mUSD, MetaMask’s dollar-backed stablecoin.Earn points every time you convert or hold $100.", - "continue_button": "Erste Schritte" + "heading": "ERHALTEN SIE {{percentage}} % AUF\nSTABILECOINS", + "description": "Convert your stablecoins to mUSD, MetaMask’s US dollar-backed stablecoin, and receive up to a {{percentage}}% bonus.", + "terms_apply": "Terms apply.", + "primary_button": "Erste Schritte", + "secondary_button": "Nicht jetzt" }, - "earn_points_daily": "Earn points daily", - "buy_musd": "Buy mUSD", - "get_musd": "Get mUSD" + "buy_musd": "mUSD kaufen", + "get_musd": "mUSD erhalten", + "boost_title": "Get {{percentage}}% on your stablecoins", + "boost_description": "Convert your stablecoins to mUSD and receive up to a {{percentage}}% bonus.", + "powered_by_relay": "Unterstützt von Relay" + }, + "bonus_claim": { + "toasts": { + "claiming": "Your mUSD bonus is processing", + "delivered": "Your mUSD bonus is here!", + "failed": "Bonus claim failed" + } }, "rewards": { "rewards_tag_label": "Belohnungen", @@ -5712,22 +5809,22 @@ "stake": "Stake", "earn": "Verdienen", "tron": { - "stake_completed": "Staking completed", - "stake_completed_description": "Your staking transaction has been completed successfully.", - "stake_failed": "Staking failed", + "stake_completed": "Staking abgeschlossen", + "stake_completed_description": "Ihre Staking-Transaktion wurde erfolgreich abgeschlossen.", + "stake_failed": "Staking fehlgeschlagen", "unstake_completed": "Unstaking abgeschlossen", - "unstake_completed_description": "Your unstaking transaction has been completed successfully.", - "unstake_failed": "Unstaking failed", + "unstake_completed_description": "Ihre Unstaking-Transaktion wurde erfolgreich abgeschlossen.", + "unstake_failed": "Unstaking fehlgeschlagen", "bandwidth": "Bandbreite", "energy": "Energie", "estimated_annual_reward": "Geschätzte jährliche Belohnung", - "trx_locked_for": "TRX locked for", - "trx_locked_for_minimum_time": "~3 days", - "trx_released_in": "TRX released in", - "trx_released_in_minimum_time": "~14 days", + "trx_locked_for": "TRX gesperrt für", + "trx_locked_for_minimum_time": "~3 Tage", + "trx_released_in": "TRX freigegeben in", + "trx_released_in_minimum_time": "~14 Tage", "fee": "Gebühr", "errors": { - "insufficient_balance": "You don't have enough resource balance to do this action." + "insufficient_balance": "Sie haben nicht genügend Ressourcen, um diese Aktion durchzuführen." } }, "stake_eth": "ETH staken", @@ -5773,12 +5870,19 @@ "learn_more_with_period": "Erfahren Sie mehr." }, "stake_your_trx_cta": { - "title": "Lend Tron and earn", - "description_start": "Stake your Tron and earn ", + "title": "Verleihen Sie Tron und verdienen Sie", + "description_start": "Staken Sie Ihr Tron und verdienen Sie ", "description_end": " jährlich.", "learn_more": "Mehr erfahren.", "earn_button": "Verdienen" }, + "trx_learn_more": { + "title": "Stake TRX and earn", + "stake_any_amount": "Stake any amount of TRX.", + "earn_trx_rewards": "Verdienen Sie TRX-Belohnungen.", + "earn_trx_rewards_description": "Verdienen Sie, sobald Sie Ihre Einlage getätigt haben. Die Prämien werden automatisch gutgeschrieben.", + "flexible_unstaking_description": "Unstake anytime. Unstaking takes 14 days to process." + }, "day": { "zero": "", "one": "Tag", @@ -6003,14 +6107,15 @@ "transaction_fee": "Wir swappen Ihre Token gegen USDC auf HyperCore, dem von Perps verwendeten Netzwerk. Swap-Anbieter können eine Gebühr erheben, MetaMask jedoch nicht." }, "predict_deposit": { - "transaction_fee": "Wir swappen Ihre Token gegen USDC.e auf Polygon, dem von Predict verwendeten Netzwerk. Swap-Anbieter erheben möglicherweise eine Gebühr, MetaMask jedoch nicht." + "transaction_fee": "Wir swappen Ihre Token gegen USDC.e auf Polygon, dem von Predictions verwendeten Netzwerk. Swap-Anbieter erheben möglicherweise eine Gebühr, MetaMask jedoch nicht." }, "musd_conversion": { - "transaction_fee": "mUSD conversion fees include network costs and may include provider fees." + "transaction_fee": "Die Gebühren für die Umstellung von mUSD umfassen Netzwerkkosten und können Anbietergebühren beinhalten." }, "title": { "transaction_fee": "Gebühren" - } + }, + "network_fee": "Die Netzwerkgebühren richten sich nach der Netzwerkauslastung und der Komplexität Ihrer Transaktion." }, "spending_cap": "Ausgabenobergrenze", "withdraw": "Auszahlen", @@ -6079,7 +6184,7 @@ }, "includes_transaction": "Umfasst {{transactionCount}} Transaktionen", "useSmartAccount": "Smart-Konto verwenden", - "successful": "Erfolg!", + "successful": "Erfolg", "success_message": "Ihr Konto wird mit Ihrer nächsten Transaktion auf ein Smart-Konto aktualisiert." }, "edit_spending_cap_modal": { @@ -6087,9 +6192,9 @@ "cancel": "Stornieren", "description": "Geben Sie den Betrag ein, den Sie gerne in Ihrem Namen ausgeben würden.", "invalid_number_error": "Ausgabenobergrenze muss eine Zahl sein", - "no_empty_error": "Ausgabenobergrenze darf nicht leer sein", - "no_extra_decimals_error": "Ausgabenobergrenze darf nicht mehr Dezimalstellen enthalten als der Token", - "no_zero_error": "Ausgabenobergrenze darf nicht 0 sein", + "no_empty_error": "Spending cap can't be empty", + "no_extra_decimals_error": "Spending cap can't have more decimals than the token", + "no_zero_error": "Spending cap can't be 0", "no_zero_error_decrease_allowance": "Ausgabenobergrenze von 0 hat keine Auswirkungen auf die Methode ‚decreaseAllowance‘", "no_zero_error_increase_allowance": "Ausgabenobergrenze von 0 hat keine Auswirkungen auf die Methode ‚increaseAllowance‘", "save": "Speichern", @@ -6120,7 +6225,7 @@ "edit_amount_done": "Fortfahren", "deposit_edit_amount_done": "Gelder hinzufügen", "deposit_edit_amount_predict_withdraw": "Auszahlen", - "deposit_edit_amount_musd_conversion": "Convert to mUSD" + "deposit_edit_amount_musd_conversion": "Zu mUSD konvertieren" }, "change_in_simulation_modal": { "title": "Ergebnisse haben sich geändert", @@ -6145,6 +6250,8 @@ "confirm_swap": "Swap", "terms_and_conditions": "Geschäftsbedingungen", "select_token": "Token auswählen", + "no_tokens_found": "Keine Tokens gefunden", + "no_tokens_found_description": "We couldn't find any tokens with this name. Try a different search.", "select_network": "Netzwerk wählen", "all_networks": "Alle Netzwerke", "num_networks": "{{numNetworks}} Netzwerke", @@ -6152,6 +6259,7 @@ "select_all_networks": "Alle auswählen", "deselect_all_networks": "Alle abwählen", "see_all": "Alle sehen", + "all": "Alle", "apply": "Anwenden", "slippage": "Slippage", "slippage_info": "Wenn der Preis sich zwischen dem Zeitpunkt Ihrer Order und deren Bestätigung ändert, bezeichnet man dies als „Slippage“. Ihr Swap wird automatisch storniert, wenn diese Slippage die von Ihnen hier festgelegte Toleranz überschreitet.", @@ -6192,9 +6300,9 @@ "title": "Bridge", "submitting_transaction": "Absenden", "fetching_quote": "Angebot einholen", - "fee_disclaimer": "Beinhaltet {{feePercentage}} % MM-Gebühr.", + "fee_disclaimer": "Includes {{feePercentage}}% MetaMask fee.", "no_mm_fee": "Keine MM-Gebühr", - "no_mm_fee_disclaimer": "Keine MM-Gebühr beim Swappen in {{destTokenSymbol}}.", + "no_mm_fee_disclaimer": "No MetaMask fee swapping into {{destTokenSymbol}}.", "hardware_wallet_not_supported": "Hardware-Wallets werden noch nicht unterstützt. Verwenden Sie eine Hot Wallet, um fortzufahren.", "hardware_wallet_not_supported_solana": "Hardware-Wallets werden für Solana noch nicht unterstützt. Verwenden Sie ein Hot Wallet, um fortzufahren.", "price_impact_info_title": "Preiseinfluss", @@ -6209,15 +6317,7 @@ "approval_tooltip_content": "Sie gewähren Zugriff auf den angegebenen Betrag in Höhe von {{amount}} {{symbol}}. Der Kontrakt hat keinen Zugriff auf weitere Gelder.", "minimum_received": "Minimum received", "minimum_received_tooltip_title": "Minimum received", - "minimum_received_tooltip_content": "Der Mindestbetrag, den Sie erhalten, wenn sich der Kurs während der Bearbeitung Ihrer Transaktion entsprechend Ihrer Slippage-Toleranz ändert. Dies ist eine Schätzung unserer Liquiditätsanbieter. Die Endbeträge können abweichen.", - "verified_token": "Verifizierter Token", - "price": "Preis", - "percent_change": "Prozentänderung", - "volume": "Volumen", - "market_cap_fdv": "Marktkapitalisierung (FDV)", - "listed_on": "Gelistet auf", - "centralized_exchanges": "Zentralisierte Börse", - "contract_address": "Contract-Adresse" + "minimum_received_tooltip_content": "Der Mindestbetrag, den Sie erhalten, wenn sich der Kurs während der Bearbeitung Ihrer Transaktion entsprechend Ihrer Slippage-Toleranz ändert. Dies ist eine Schätzung unserer Liquiditätsanbieter. Die Endbeträge können abweichen." }, "quote_expired_modal": { "title": "Neue Angebote sind verfügbar", @@ -6291,7 +6391,7 @@ "title": "Wallet-Wiederherstellung", "login_with_social": "Mit Social-Media-Konten anmelden", "setup": "Einrichten", - "secret_recovery_phrase": "Geheime Wiederherstellungsphrase {{num}}", + "secret_recovery_phrase": "Secret Recovery Phrase {{num}}", "back_up": "Backup", "reveal": "Offenlegen", "social_recovery_title": "{{authConnection}}-WIEDERHERSTELLUNG", @@ -6350,7 +6450,7 @@ "section_1_title": "Was sind Multichain-Konten?", "section_1_description": "Ein Konto, Adressen auf allen von MetaMask unterstützten Netzwerken. Nun können Sie Ethereum, Solana und mehr nutzen, ohne das Konto wechseln zu müssen.", "section_2_title": "Dieselbe Adresse, mehr Netzwerke", - "section_2_description": "Wir haben Ihre Konten gruppiert, sodass Sie MetaMask wie gewohnt weiter nutzen können. Ihre Gelder sind sicher und unverändert", + "section_2_description": "Wir haben Ihre Konten gruppiert, sodass Sie MetaMask wie gewohnt weiter nutzen können. Ihre Gelder sind sicher und unverändert.", "view_accounts_button": "Konten anzeigen", "learn_more_button": "Mehr erfahren", "setting_up_accounts": "Einrichtung Ihrer Konten" @@ -6512,8 +6612,10 @@ }, "card_onboarding": { "title": "Ausgeben\nund\nVerdienen", - "description": "Mit der MetaMask-Karte können Sie Ihre Kryptowährung schnell und einfach wie Bargeld ausgeben und Belohnungen verdienen.", + "description": "Mit der MetaMask-Karte können Sie schnell und einfach Ihre Kryptowährung ausgeben und bis zu 3 % Cashback verdienen.", "apply_now_button": "Jetzt beantragen", + "login_button": "Anmelden", + "not_now_button": "Nicht jetzt", "sign_up": { "title": "Lassen Sie uns beginnen", "description": "Erstellen Sie Ihr MetaMask Card-Konto, das von Crypto Life bereitgestellt wird. Dieses Konto ist unabhängig von Ihrem MetaMask-Konto.", @@ -6541,6 +6643,7 @@ "phone_number_label": "Telefonnummer eingeben", "country_area_code_label": "Ländervorwahl", "invalid_phone_number": "Ungültige Telefonnummer", + "invalid_us_phone_number": "Bitte geben Sie eine gültige US-Telefonnummer (10 Ziffern) ein, um fortzufahren.", "legal_terms": "Indem Sie fortfahren, stimmen Sie dem Empfang von SMS zur Verifizierung Ihrer Telefonnummer zu." }, "confirm_phone_number": { @@ -6577,8 +6680,8 @@ "terms": "Die Genehmigung dauert in der Regel etwa 12 Stunden. Wir benachrichtigen Sie, sobald eine Entscheidung getroffen wurde." }, "verifying_veriff_kyc": { - "title": "Verifizieren Ihrer Identität", - "description": "Bitte warten Sie, während wir Ihre Identität verifizieren.", + "title": "Warten auf Genehmigung", + "description": "Unser Partner muss zur Genehmigung Ihres Antrags Ihre Identität verifizieren.", "helper_text": "Dies dauert in der Regel einige Sekunden. Bitte schließen Sie die App nicht." }, "verifying_registration": { @@ -6615,7 +6718,7 @@ }, "physical_address": { "title": "Fügen Sie Ihre Adresse hinzu", - "description": "Geben Sie Ihre Privatadresse ein. Nach der Genehmigung senden wir Ihnen dorthin Ihre physische Karte.", + "description": "Geben Sie Ihre aktuelle Wohnadresse ein. Diese Adresse wird von uns zu Verifizierungszwecken verwendet.", "address_line_1_label": "Adresszeile 1", "address_line_2_label": "Adresszeile 2", "city_label": "Stadt", @@ -6623,7 +6726,7 @@ "zip_code_label": "Postleitzahl", "country_label": "Land", "electronic_consent_1": "Ich stimme der Einwilligung und Offenlegung gemäß dem E-Sign Act zu und bin damit einverstanden, alle Mitteilungen elektronisch zu erhalten. ", - "electronic_consent_2": "View document(PDF)" + "electronic_consent_2": "Dokument (PDF) anzeigen" }, "mailing_address": { "title": "Postanschrift", @@ -6669,22 +6772,24 @@ } }, "card_home": { + "title": "Card", + "available_balance": "Verfügbares Guthaben", "error_title": "Daten können nicht abgerufen werden", "error_description": "Es scheint ein Problem zu geben, das Sie an der Anzeige des Inhalts dieser Seite hindert. Bitte überprüfen Sie Ihre Verbindung oder aktualisieren Sie die Seite.", "try_again": "Erneut versuchen", - "limited_spending_warning": "Ihre tatsächliche Ausgabenkapazität ist möglicherweise begrenzt. Um Ihr Limit anzupassen, gehen Sie zu {{manageCard}}.", + "limited_spending_warning": "Your actual spending ability may be limited. To adjust your limit, go to ", "add_funds": "Gelder hinzufügen", "change_asset": "Asset ändern", "enable_card_button_label": "Karte aktivieren", "enable_assets_button_label": "Assets aktivieren", "spending_limit_warning": "Sie haben Ihr Ausgabenlimit fast erreicht. Aktualisieren Sie Ihr Konto, um Ablehnungen zu vermeiden.", "logout": "Abmelden", - "logout_description": "Melden Sie sich von Ihrem MetaMask-Karte-Konto ab", "logout_confirmation_title": "Von Karte abmelden?", "logout_confirmation_message": "Möchten Sie sich wirklich von Ihrem MetaMask-Karte-Konto abmelden?", "logout_confirmation_cancel": "Stornieren", "logout_confirmation_confirm": "Abmelden", "enable_card_error": "Aktivierung der Karte fehlgeschlagen. Bitte versuchen Sie es später erneut.", + "view_card_details_error": "Unable to load card details. Please try again.", "warnings": { "close_spending_limit": { "title": "Sie sind Ihrem Ausgabenlimit nahe", @@ -6707,6 +6812,16 @@ "blocked": { "title": "Ihre Karte ist blockiert", "description": "Bitte wenden Sie sich an den Support, um Ihre Karte zu entsperren." + }, + "kyc_pending": { + "title": "Verifizierung läuft", + "description": "Your identity verification is being reviewed. This typically takes less than 12 hours." + } + }, + "messages": { + "card_provisioning": { + "title": "Card being created", + "description": "Your card is being created. This may take a few moments." } }, "kyc_status": { @@ -6730,33 +6845,46 @@ "ok_button": "OK" }, "manage_card_options": { - "manage_spending_limit": "Ausgabenlimit verwalten", + "view_card_details": "View card details", + "hide_card_details": "Hide card details", + "view_card_details_description": "Card number, expiration and CVV", + "manage_spending_limit": "Manage limit", "manage_spending_limit_description_restricted": "Begrenzte Ausgaben sind an", "manage_spending_limit_description_full": "Vollzugriff ist an", "manage_card": "Karte verwalten", - "advanced_card_management_description": "Siehe Kartendetails, Transaktionen und mehr", + "advanced_card_management_description": "See activity, cashback, freeze card, and more", "travel_title": "MetaMask Travel", - "travel_description": "Buchen Sie Hotels mit bis zu 60 % Rabatt im Vergleich zu Expedia", - "card_tos_title": "Kartennutzungsbedingungen", - "card_tos_description": "Lesen Sie die Bedingungen des Kartenanbieters" + "travel_description": "Book hotels with up to 70% discounts", + "card_tos_title": "Terms and conditions" } }, "card_spending_limit": { "title_change_token": "Token und Netzwerk ändern", "title_enable_token": "Token aktivieren", + "title_onboarding": "Ausgaben aktivieren", + "setup_title": "Set up your card", + "setup_description": "Select the token you'd like to use and set a limit for how much you can spend.", + "asset_label": "Asset", + "limit_label": "Limit", + "other_token": "Other", "full_access_title": "Vollständiger Zugriff", - "full_access_description": "Ihre Karte kann Ihr Guthaben automatisch nutzen, ohne dass Sie jedes Mal um Genehmigung bitten müssen.", - "restricted_limit_title": "Begrenzte Ausgaben", - "restricted_limit_description": "Sie müssen jedes Mal zurückkommen und eine Netzwerkgebühr bezahlen, wenn Sie das Limit erhöhen möchten.", + "full_access_description": "Your card can use your funds automatically without asking for approval each time.", + "restricted_limit_title": "Ausgabelimit", + "restricted_limit_description": "Sie können nur bis zu diesem Limit Ausgaben tätigen. Bei jeder Aktualisierung dieses Limits fällt eine Netzwerkgebühr an.", "edit_limit": "Limit bearbeiten", "confirm_new_limit": "Bestätigen", "cancel": "Stornieren", + "skip": "Vorläufig überspringen", "set_new_limit": "Limit festlegen", "dismiss": "Verwerfen", "update_success": "Ausgabenlimit erfolgreich aktualisiert", "update_error": "Aktualisierung des Ausgabenlimits fehlgeschlagen", "solana_not_supported": "Aktivieren Sie Solana-Token auf card.metamask.io", - "select_token": "Token auswählen" + "select_token": "Token auswählen", + "loading": "Verfügbare Tokens werden geladen ...", + "load_error": "Tokens können nicht geladen werden. Bitte versuchen Sie es erneut.", + "retry": "Erneut versuchen", + "on_linea": "auf Linea" }, "change_asset": { "title": "Token und Netzwerk ändern", @@ -6794,6 +6922,7 @@ "signup_button": "Anmelden", "errors": { "invalid_credentials": "Ungültige Anmeldedaten", + "invalid_otp_code": "Falscher Code, bitte versuchen Sie es erneut", "unknown_error": "Unbekannter Fehler. Bitte versuchen Sie es später erneut.", "email_required": "E-Mail-Adresse ist erforderlich", "password_required": "Passwort ist erforderlich", @@ -6840,8 +6969,8 @@ }, "rewards": { "auth_fail_title": "Unbekannter Fehler.", - "auth_fail_description": "Bei der Authentifizierung dieses Kontos mit dem Belohnungsprogramm ist ein unbekannter Fehler aufgetreten. Bitte versuchen Sie es später erneut.", - "failed_to_authenticate": "Authentifizierung beim Belohnungsprogramm fehlgeschlagen", + "auth_fail_description": "Bei der Authentifizierung dieses Kontos bei MetaMask Rewards ist ein unbekannter Fehler aufgetreten. Versuchen Sie es später erneut.", + "failed_to_authenticate": "Die Authentifizierung bei MetaMask Rewards ist fehlgeschlagen", "not_implemented": "Demnächst verfügbar", "not_implemented_season_summary": "Zusammenfassung der Saison demnächst verfügbar", "optin_error": { @@ -6868,6 +6997,10 @@ "error_fetching_description": "Überprüfen Sie Ihre Verbindung und versuchen Sie es erneut.", "retry_button": "Erneut versuchen" }, + "linea_tokens": { + "default_title": "$LINEA", + "title_earned": "Sie haben {{amount}} $LINEA verdient" + }, "upcoming_rewards_error": { "error_fetching_title": "Belohnungen konnten nicht geladen werden", "error_fetching_description": "Überprüfen Sie Ihre Verbindung und versuchen Sie es erneut.", @@ -6899,6 +7032,15 @@ "claim_reward_error": { "title": "Einforderung der Belohnung fehlgeschlagen" }, + "metal_card_claim": { + "title": "Lösen Sie Ihre Belohnung ein", + "description": "Die MetaMask Metal Card unterliegt bestimmten Voraussetzungen und ist nicht in allen Regionen verfügbar. Wenn Sie die Voraussetzungen nicht erfüllen, erhalten Sie stattdessen eine exklusive Premium-Merchandise-Belohnung.", + "contact_info": "Teilen Sie uns Ihre Kontaktdaten mit und Sie erhalten innerhalb von zwei Wochen eine Antwort von @MidwitMilhouse auf Telegram oder von christian.montoya@consensys.net.", + "email_label": "E-Mail", + "email_validation_error": "Bitte geben Sie eine gültige E-Mail-Adresse ein", + "telegram_label": "Telegram-Benutzername", + "telegram_placeholder": "Optional" + }, "accounts_opt_in_state_error": { "error_fetching_title": "Konten konnten nicht geladen werden", "error_fetching_description": "Überprüfen Sie Ihre Verbindung und versuchen Sie es erneut.", @@ -7053,12 +7195,12 @@ "dashboard_modal_info": { "active_account": { "title": "Nicht verpassen", - "description": "Fügen Sie Ihr Konto hinzu und fangen Sie an, durch Ihre Aktivitäten Punkte zu sammeln.", + "description": "Add your account to Rewards.", "confirm": "Konto hinzufügen" }, "multiple_unlinked_accounts": { - "title": "Beginnen Sie mit dem Sammeln von Punkten", - "description": "Fügen Sie Ihre Konten hinzu, damit Sie den Überblick über Ihre Belohnungen behalten.", + "title": "Nicht verpassen", + "description": "Add your accounts to Rewards.", "confirm": "Konten hinzufügen" }, "account_not_supported": { @@ -7111,10 +7253,10 @@ } }, "predict": { - "title": "Prognosemärkte", + "title": "Prognosen", "description": "20 Punkte pro 10 $ Prognose", "sheet": { - "title": "Prognosemärkte", + "title": "Prognosen", "points": "20 Punkte pro 10 $", "description": "Verdienen Sie bei jedem 10-$-Trade Punkte.", "cta_label": "Märkte durchsuchen" @@ -7192,6 +7334,19 @@ "time_left": "verbleibend", "expired": "Abgelaufen" }, + "end_of_season_rewards": { + "confirm_label_default": "Bestätigen", + "confirm_label_access": "Zugriff", + "redeem_success_title": "Belohnung eingelöst", + "metal_card_claim_success": "Kontaktdaten bestätigt", + "linea_tokens_claim_success": "Adresse bestätigt", + "arriving_soon": "In Kürze verfügbar", + "check_back_soon": "Schauen Sie bald wieder vorbei, um Ihren Anspruch geltend zu machen", + "redeem_failure_title": "Einlösung fehlgeschlagen", + "redeem_failure_description": "Bitte versuchen Sie es später erneut.", + "reward_details": "Belohnungsdetails", + "select_account_description": "Wählen Sie das Konto, auf das diese Belohnung überwiesen werden soll, aus. Die Tokens werden innerhalb von zwei Wochen verteilt." + }, "animation": { "could_not_load": "Laden fehlgeschlagen" } @@ -7258,13 +7413,13 @@ "still_connecting_network": "Noch beim Verbindungsaufbau zu {{networkName}} ...", "unable_to_connect_network": "Verbindungsherstellung mit {{networkName}} nicht möglich.", "update_rpc": "RPC aktualisieren", + "switch_to_metamask_default_rpc": "Switch to MetaMask default RPC", "check_network_connectivity": "Überprüfen Sie Ihre Netzwerkverbindung.", - "check_network_connectivity_or": "Überprüfen Sie Ihre Netzwerkverbindung oder" + "check_network_connectivity_or": "Überprüfen Sie Ihre Netzwerkverbindung oder", + "updated_to_metamask_default": "Updated to MetaMask default" }, "trending": { "title": "Explore", - "view_all": "View all", - "tokens": "Token", "trending_tokens": "Trending tokens", "price_change": "Price change", "all_networks": "Alle Netzwerke", @@ -7296,6 +7451,10 @@ "title": "Trending tokens is not available", "description": "We can't fetch this page right now", "try_again": "Erneut versuchen" + }, + "empty_search_result_state": { + "title": "Keine Tokens gefunden", + "description": "We were not able to find this token" } }, "ota_update_modal": { diff --git a/locales/languages/el.json b/locales/languages/el.json index 22825f49ee83..6a5b9e393ddd 100644 --- a/locales/languages/el.json +++ b/locales/languages/el.json @@ -8,7 +8,7 @@ "increment": "Αύξηση του μετρητή Redux" }, "pet_name": { - "list_count_text": "Pet names on this network", + "list_count_text": "Ονόματα κατοικίδιων σε αυτό το δίκτυο", "add_pet_name_button": "Add pet name", "address": "Διεύθυνση", "address_placeholder": "0x...", @@ -193,11 +193,10 @@ "connector": "σε" }, "autocomplete": { - "placeholder": "Αναζήτηση ανά token, ιστότοπο ή διεύθυνση", + "placeholder": "Αναζήτηση ανά ιστότοπο ή διεύθυνση", "recents": "Πρόσφατα", "favorites": "Αγαπημένα", - "sites": "Ιστότοποι", - "tokens": "Token" + "sites": "Ιστότοποι" }, "navigation": { "back": "Πίσω", @@ -306,7 +305,7 @@ "get_started": "Ξεκινήστε" }, "onboarding_wizard": { - "skip_tutorial": "Skip tutorial", + "skip_tutorial": "Παράλειψη οδηγού εκμάθησης", "coachmark": { "action_back": "Όχι, ευχαριστώ", "action_next": "Δείτε την παρουσίαση", @@ -330,12 +329,12 @@ "content3": "τώρα για να επεξεργαστείτε το όνομα του λογαριασμού." }, "step4": { - "title": "Main menu", - "content1": "Από αυτό το μενού μπορείτε να έχετε πρόσβαση στο Ιστορικό συναλλαγών, τις Ρυθμίσεις και την Υποστήριξη.", + "title": "Κύριο μενού", + "content1": "Από αυτό το μενού μπορείτε να έχετε πρόσβαση στο ιστορικό συναλλαγών, τις ρυθμίσεις και την υποστήριξη.", "content2": "Μπορείτε να κάνετε περισσότερες ενέργειες με τους λογαριασμούς σας και να αποκτήσετε πρόσβαση στις ρυθμίσεις του MetaMask." }, "step5": { - "title": "Εξερευνήστε το πρόγραμμα περιήγησης", + "title": "Εξερευνήστε στο πρόγραμμα περιήγησης", "content1": "Μπορείτε να εξερευνήσετε το web3 χρησιμοποιώντας το πρόγραμμα περιήγησης" }, "step6": { @@ -596,9 +595,9 @@ "transaction_activity": "Δραστηριότητα", "request_feature": "Ζητήστε μια Λειτουργία", "submit_feedback_message": "Επιλέξτε τύπο ανατροφοδότησης για αποστολή.", - "submit_bug": "Bug report", + "submit_bug": "Αναφορά σφάλματος", "submit_general_feedback": "Γενικά", - "share_address": "Share my public address", + "share_address": "Κοινοποίηση της δημόσιας διεύθυνσής μου", "view_in_etherscan": "Προβολή στο Etherscan", "view_in": "Προβολη στο", "browser": "Πρόγραμμα περιήγησης", @@ -612,12 +611,13 @@ "lock_cancel": "ΌΧΙ", "feedback": "Ανατροφοδότηση", "metamask_support": "Υποστήριξη του MetaMask", - "public_address": "Public address" + "public_address": "Δημόσια διεύθυνση" }, "send": { "available": "διαθέσιμο", "invalid_value": "Μη έγκυρη τιμή", "insufficient_funds": "Ανεπαρκή κεφάλαια", + "insufficient_balance_to_cover_fee": "Insufficient balance to cover fees", "continue": "Συνέχεια", "unit": "μονάδα", "units": "μονάδες", @@ -643,8 +643,8 @@ "no_tokens_available": "Δεν υπάρχουν διαθέσιμα tokens", "sign": "Υπογραφή", "network_not_found_title": "Δεν βρέθηκε δίκτυο", - "network_not_found_description": "Το δίκτυο με αναγνωριστικό αλυσίδας (chain id) {{chain_id}} δεν βρέθηκε στο πορτοφόλι σας. Παρακαλώ προσθέστε πρώτα το δίκτυο.", - "network_missing_id": "Λείπει το αναγνωριστικό αλυσίδας.", + "network_not_found_description": "Network with chain ID {{chain_id}} not found in your wallet. Please add the network first.", + "network_missing_id": "Missing chain ID.", "search_tokens": "Αναζήτηση tokens", "search_tokens_and_nfts": "Αναζήτηση tokens και NFT", "tokens": "Tokens", @@ -675,13 +675,13 @@ "limitError": "Αποτυχία ελέγχου των ορίων κατάθεσης. Παρακαλώ δοκιμάστε ξανά αργότερα." }, "token_modal": { - "select_a_token": "Επιλέξτε ένα Token", + "select_a_token": "Επιλέξτε ένα token", "select_token": "Επιλέξτε token", "search_by_name_or_address": "Αναζητήστε tokens με βάση το όνομα ή τη διεύθυνση", "no_tokens_found": "Κανένα token δεν αντιστοιχεί στο '{{searchString}}'\"", "unsupported_token_title": "Μη διαθέσιμο", - "unsupported_token_description": "This token may not be available in your region or supported by any local payment providers", - "error_loading_tokens": "Unable to load tokens. Please try again later." + "unsupported_token_description": "Αυτό το token ενδέχεται να μην είναι διαθέσιμο στην περιοχή σας ή να μην υποστηρίζεται από τοπικούς παρόχους πληρωμών.", + "error_loading_tokens": "Δεν ήταν δυνατή η φόρτωση των tokens. Δοκιμάστε ξανά αργότερα." }, "networks_filter_bar": { "all_networks": "Όλα τα δίκτυα" @@ -696,12 +696,12 @@ "title": "Ρυθμίσεις", "view_order_history": "Προβολή ιστορικού εντολών", "contact_support": "Επικοινωνία με την υποστήριξη", - "log_out": "Log out of Transak", + "log_out": "Αποσύνδεση από το Transak", "logged_out_success": "Αποσυνδεθήκατε με επιτυχία", "error_sdk_not_initialized": "Το πακέτο ανάπτυξης λογισμικού (SDK) δεν έχει αρχικοποιηθεί", "logged_out_error": "Σφάλμα κατά την αποσύνδεση", - "more_ways_to_buy": "More ways to buy", - "more_ways_to_buy_description": "Switch to the classic version" + "more_ways_to_buy": "Περισσότεροι τρόποι αγοράς", + "more_ways_to_buy_description": "Εναλλαγή στην κλασική έκδοση" }, "region_modal": { "select_a_region": "Επιλέξτε μια περιοχή", @@ -714,7 +714,7 @@ "no_state_results": "Καμία πολιτεία δεν ταιριάζει με \"{{searchString}}\"" }, "payment_modal": { - "select_a_payment_method": "Select a payment method" + "select_a_payment_method": "Επιλέξτε τρόπο πληρωμής" }, "payment_duration": { "instant": "Άμεσα", @@ -805,7 +805,7 @@ "button": "Αποδοχή και συνέχεια" }, "additional_verification": { - "title": "Additional verification", + "title": "Επιπλέον επαλήθευση", "paragraph_1": "Για μεγαλύτερες καταθέσεις, θα χρειαστείτε μια έγκυρη ταυτότητα (όπως δίπλωμα οδήγησης) και μια selfie σε πραγματικό χρόνο.", "paragraph_2": "Για την ολοκλήρωση της διαδικασίας επαλήθευσης, πρέπει να επιτρέψετε την πρόσβαση στην κάμερα.", "button": "Συνέχεια" @@ -832,7 +832,7 @@ "dob_invalid": "Παρακαλούμε πληκτρολογήστε μια έγκυρη ημερομηνία γέννησης", "ssn_required": "Απαιτείται ο αριθμός κοινωνικής ασφάλισης", "unexpected_error": "Παρουσιάστηκε ένα απρόβλεπτο σφάλμα. Προσπαθήστε ξανά.", - "phone_already_registered": "This phone number is already in use by {{email}}. Log in using this email to continue.", + "phone_already_registered": "Αυτός ο αριθμός τηλεφώνου χρησιμοποιείται ήδη από το {{email}}. Συνδεθείτε με αυτό το email για να συνεχίσετε.", "login_with_email": "Σύνδεση με email" }, "enter_address": { @@ -844,7 +844,7 @@ "address_line_2": "Γραμμή διεύθυνσης 2 (προαιρετικά)", "state": "Πολιτεία/Περιοχή", "city": "Πόλη", - "postal_code": "Postal/zip code", + "postal_code": "Ταχυδρομικός κώδικας", "country": "Χώρα", "select_state": "Επιλέξτε πολιτεία", "address_line_1_required": "Απαιτείται η γραμμή διεύθυνσης 1", @@ -854,7 +854,7 @@ "city_invalid": "Παρακαλούμε πληκτρολογήστε μια έγκυρη πόλη", "state_required": "Απαιτείται η πολιτεία/περιοχή", "state_invalid": "Παρακαλούμε πληκτρολογήστε μια έγκυρη πολιτεία", - "postal_code_required": "Postal/zip code is required", + "postal_code_required": "Απαιτείται ο ταχυδρομικός κώδικας", "postal_code_invalid": "Παρακαλούμε πληκτρολογήστε έναν έγκυρο ταχυδρομικό κώδικα", "unexpected_error": "Μη αναμενόμενο σφάλμα." }, @@ -903,7 +903,7 @@ "cancel_order_button": "Ακύρωση εντολής" }, "order_details": { - "title": "Deposit order", + "title": "Εντολή κατάθεσης", "error_title": "Υπήρξε σφάλμα με την εντολή κατάθεσής σας", "error_message": "Προέκυψε ένα απρόσμενο σφάλμα." }, @@ -946,7 +946,7 @@ }, "error_view": { "title": "Παρουσιάστηκε σφάλμα", - "description": "Παρουσιάστηκε σφάλμα κατά την επεξεργασία της κατάθεσής σας. Παρακαλούμε επικοινωνήστε με την υποστήριξη εάν το πρόβλημα συνεχίζεται.", + "description": "Παρουσιάστηκε σφάλμα κατά την επεξεργασία της κατάθεσής σας. Παρακαλούμε επικοινωνήστε με την υποστήριξη αν το πρόβλημα συνεχιστεί.", "try_again": "Προσπαθήστε ξανά" }, "errors": { @@ -955,28 +955,32 @@ "fetch_payment_methods": "Παρουσιάστηκε πρόβλημα κατά την ανάκτηση των μεθόδων πληρωμής.", "fetch_user_details": "Παρουσιάστηκε πρόβλημα κατά την ανάκτηση των στοιχείων χρήστη.", "try_again": "Προσπαθήστε ξανά", - "error_details_title": "Error details", + "error_details_title": "Λεπτομέρειες σφάλματος", "see_more": "Δείτε περισσότερα" } }, "perps": { - "basic_functionality_disabled_title": "Perps is not available", + "basic_functionality_disabled_title": "Τα Perps δεν είναι διαθέσιμα", "title": "Συμβ.αορ.", - "perps_trading": "Συναλλαγές με συμβόλαια αόριστης διάρκειας", + "perps_trading": "Συναλλαγές με συμβόλαια αορίστου διάρκειας", "perp_account_balance": "Υπόλοιπο λογαριασμού συμβολαίων αορίστου διάρκειας", "manage_balance": "Διαχείριση υπολοίπου", "total_balance": "Συνολικό υπόλοιπο", "available_balance": "Διαθέσιμο υπόλοιπο", - "margin_used": "Περιθώριο που χρησιμοποιήθηκε", + "margin_used": "Περιθώριο που χρησιμοποιείται", "gtm_content": { "title": "ΤΑ ΣΥΜΒΟΛΑΙΑ ΑΟΡΙΣΤΟΥ ΔΙΑΡΚΕΙΑΣ (PERPS) ΕΙΝΑΙ ΕΔΩ", "title_description": "Επενδύστε σε θέσεις long ή short με μόχλευση έως και 40x. Χρηματοδοτήστε τον λογαριασμό σας με ένα κλικ.", "not_now": "Όχι τώρα", "try_now": "Ξεκινήστε" }, + "discovery_banner": { + "title": "Κάντε συναλλαγές με perp του {{symbol}}", + "subtitle": "Πολλαπλασιάστε τα κέρδη και τις ζημίες σας έως και {{leverage}}" + }, "today": "Σήμερα", "yesterday": "Χθες", - "unrealized_pnl": "Μη οριστικοποιημένα κέρδη/ζημίες", + "unrealized_pnl": "Μη οριστικοποιημένα κέρδη & ζημίες", "withdraw": "Ανάληψη", "refresh_balance": "Ανανέωση υπολοίπου", "add_funds": "Προσθήκη κεφαλαίων", @@ -1047,7 +1051,7 @@ "preparing": "Προετοιμασία κατάθεσης...", "swapping": "Ανταλλαγή {{token}} με USDC", "bridging": "Μεταφορά κεφαλαίων στο Hyperliquid", - "depositing": "Κατάθεση σε λογαριασμό συμβολαίων αορίστου χρόνου", + "depositing": "Κατάθεση σε λογαριασμό Perps", "depositing_direct": "Μεταφορά USDC απευθείας στον λογαριασμό σας στο HyperLiquid..." }, "step_descriptions": { @@ -1138,7 +1142,7 @@ "trigger_price": "Τιμή ενεργοποίησης", "liquidation_price": "Τιμή ρευστοποίησης", "fees": "Τέλη", - "estimated_points": "Εκτ. Πόντοι", + "estimated_points": "Εκτ. πόντοι", "market": "Αγορά", "limit": "Όριο", "open_orders": "Εντολές", @@ -1199,7 +1203,7 @@ "short": "Πώληση {{asset}}" }, "tpsl_modal": { - "title": "Λήψη κέρδους & Περιορισμός ζημίας", + "title": "Λήψη κέρδων & περιορισμός ζημιών", "save": "Αποθήκευση", "current_price": "Τρέχουσα τιμή: {{price}}", "on": "ΕΝΕΡΓΟΠΟΙΗΣΗ", @@ -1306,7 +1310,7 @@ "cancel": "Ακύρωση", "margin": "Περιθώριο", "includes_pnl": "περιλαμβάνει κέρδη & ζημίες", - "pnl": "Κέρδη & Ζημιές", + "pnl": "Κ&Ζ", "estimated_pnl": "Εκτιμώμενα Κέρδη & Ζημιές", "fees": "Τέλη", "receive": "Θα λάβετε", @@ -1414,6 +1418,7 @@ "failedToEstablishAllMids": "Αποτυχία δημιουργίας καθολικής συνδρομής allMids", "failedToEstablishMarketData": "Αποτυχία δημιουργίας συνδρομής σε δεδομένα αγοράς για το {{symbol}}", "failed_to_toggle_network": "Αποτυχία εναλλαγής δικτύου", + "failed_to_switch_provider": "Δεν ήταν δυνατή η αλλαγή παρόχου", "noAccountSelected": "Δεν έχει επιλεχθεί λογαριασμός", "unsupportedMethod": "Μη υποστηριζόμενη μέθοδος: {{method}}", "invalidAddressFormat": "Μη έγκυρη μορφή διεύθυνσης: {{address}}", @@ -1452,6 +1457,24 @@ "orderLeverageReductionFailed": "Δεν μπορείτε να μειώσετε τη μόχλευση", "insufficientLiquidity": "Μη επαρκής ρευστότητα για την εκτέλεση της εντολής. Δοκιμάστε να χρησιμοποιήσετε εντολή ορίου ή επαναλάβετε σε λίγο.", "connectionTimeout": "Η σύνδεση έληξε λόγω χρονικού ορίου. Παρακαλούμε ελέγξτε το δίκτυό σας και προσπαθήστε ξανά.", + "clientReinitializing": "Η υπηρεσία βρίσκεται σε επανεκκίνηση. Περιμένετε λίγο και προσπαθήστε ξανά.", + "transferFailed": "Δεν ήταν δυνατή η μεταφορά χρημάτων. Παρακαλούμε δοκιμάστε ξανά.", + "swapFailed": "Δεν ήταν δυνατή η ανταλλαγή των tokens. Παρακαλούμε δοκιμάστε ξανά.", + "spotPairNotFound": "Οι συναλλαγές σε ζεύγη δεν είναι διαθέσιμες αυτή τη στιγμή.", + "priceUnavailable": "Τα δεδομένα τιμών δεν είναι διαθέσιμα. Παρακαλούμε ανανεώστε και δοκιμάστε ξανά.", + "batchCancelFailed": "Ορισμένες εντολές δεν ήταν δυνατό να ακυρωθούν. Παρακαλούμε δοκιμάστε ξανά.", + "batchCloseFailed": "Ορισμένες θέσεις δεν ήταν δυνατό να κλείσουν. Παρακαλούμε δοκιμάστε ξανά.", + "insufficientMargin": "Μη επαρκές περιθώριο για την εκτέλεση αυτής της συναλλαγής. Προσθέστε περισσότερα χρήματα ή μειώστε το μέγεθος της θέσης σας.", + "reduceOnlyViolation": "Αυτή η εντολή θα αυξήσει τη θέση σας. Επιτρέπονται μόνο εντολές μείωσης θέσης.", + "positionWouldFlip": "Αυτή η εντολή θα αλλάξει την κατεύθυνση της θέσης σας. Παρακαλούμε κλείστε πρώτα την υπάρχουσα θέση σας.", + "marginAdjustmentFailed": "Δεν ήταν δυνατή η προσαρμογή του περιθωρίου. Παρακαλούμε δοκιμάστε ξανά.", + "tpslUpdateFailed": "Δεν ήταν δυνατή η ενημέρωση της λήψης κερδών/περιορισμός ζημιών. Παρακαλούμε δοκιμάστε ξανά.", + "orderRejected": "Η εντολή απορρίφθηκε. Παρακαλούμε ελέγξτε τις παραμέτρους σας και δοκιμάστε ξανά.", + "slippageExceeded": "Η τιμή μεταβλήθηκε σημαντικά. Δοκιμάστε να χρησιμοποιήσετε εντολή ορίου ή αυξήστε την επιτρεπόμενη απόκλιση.", + "rateLimitExceeded": "Πάρα πολλά αιτήματα. Παρακαλούμε περιμένετε λίγο και δοκιμάστε ξανά.", + "serviceUnavailable": "Η υπηρεσία δεν είναι προσωρινά διαθέσιμη. Παρακαλούμε δοκιμάστε ξανά αργότερα.", + "networkErrorSimple": "Παρουσιάστηκε σφάλμα δικτύου. Παρακαλούμε ελέγξτε τη σύνδεσή σας και δοκιμάστε ξανά.", + "insufficientBalance": "Μη επαρκές υπόλοιπο για την ολοκλήρωση αυτής της ενέργειας. Παρακαλούμε ελέγξτε τα διαθέσιμα κεφάλαιά σας.", "connectionFailed": { "title": "Δεν ήταν δυνατή η σύνδεση με τα perps", "description": "Προσπαθούμε να τα επαναφέρουμε σύντομα σε λειτουργία.", @@ -1521,7 +1544,7 @@ "total_balance": "Συνολικό υπόλοιπο", "available_balance": "Διαθέσιμο υπόλοιπο", "margin_used": "Περιθώριο που χρησιμοποιείται", - "total_unrealized_pnl": "Σύνολο μη πραγματοποιημένων κερδών & ζημιών", + "total_unrealized_pnl": "Συνολικά μη πραγματοποιηθέντα κέρδη και ζημίες", "unrealized_pnl": "Μη οριστικοποιημένα κέρδη & ζημίες" }, "tpsl": { @@ -1654,7 +1677,7 @@ }, "tp_sl": { "title": "Λήψη κέρδων & περιορισμός ζημιών", - "content": "Η εντολή \"Λήψη Κέρδους\" (ΛΚ) κλείνει αυτόματα τη θέση σας όταν φτάσετε στο επιθυμητό κέρδος. Η εντολή \"Περιορισμός Ζημιάς\" (ΠΖ) περιορίζει τις ζημίες σας κλείνοντας τη θέση σας αν η τιμή κινηθεί εναντίον σας." + "content": "Η εντολή Λήψης Κερδών κλείνει αυτόματα τη θέση σας όταν επιτευχθεί ο στόχος κερδών που έχετε ορίσει. Η εντολή Περιορισμός Ζημιών περιορίζει τις ζημιές κλείνοντας αυτόματα τη θέση σας εάν η τιμή κινηθεί αντίθετα προς το συμφέρον σας." }, "close_position_you_receive": { "title": "Ποσό που θα λάβετε", @@ -1679,12 +1702,12 @@ "market_hours": { "title": "Ώρες αγοράς", "closes_in": "Κλείνει σε {{time}}", - "content": "Κάνετε συναλλαγές εντός των κανονικών ωρών αγοράς (9:30 π.μ. – 4:00 μ.μ. ET). Όταν οι αγορές είναι κλειστές, υπάρχει κίνδυνος για μεγαλύτερα σπρεντ, μεταβολές τιμών και υψηλότερα επιτόκια χρηματοδότησης." + "content": "Πραγματοποιείτε συναλλαγές εντός των κανονικών ωρών λειτουργίας της αγοράς (9:30 π.μ. έως 4 μ.μ. ET). Όταν οι αγορές είναι κλειστές, υπάρχει κίνδυνος για μεγαλύτερα spreads, απότομες μεταβολές τιμών και υψηλότερα επιτόκια χρηματοδότησης." }, "after_hours_trading": { "title": "Συναλλαγές εκτός ωραρίου αγοράς", "reopens_in": "Ανοίγει ξανά σε {{time}}", - "content": "Κάνετε συναλλαγές εκτός των κανονικών ωρών αγοράς (9:30 π.μ. – 4:00 μ.μ. ET). Όταν οι αγορές είναι κλειστές, υπάρχει κίνδυνος για μεγαλύτερα σπρεντ, μεταβολές τιμών και υψηλότερα επιτόκια χρηματοδότησης." + "content": "Πραγματοποιείτε συναλλαγές εκτός των κανονικών ωρών λειτουργίας της αγοράς (9:30 π.μ. έως 4 μ.μ. ET). Όταν οι αγορές είναι κλειστές, υπάρχει κίνδυνος για μεγαλύτερα spreads, απότομες μεταβολές τιμών και υψηλότερα επιτόκια χρηματοδότησης." }, "spread": { "title": "Σπρεντ", @@ -1697,7 +1720,14 @@ "retry_connection": "Επανάληψη σύνδεσης", "retrying_connection": "Σύνδεση...", "connecting_to_perps": "Σύνδεση με Συμβόλαια αόριστ. διάρκειας", - "timeout_title": "Η σύνδεση διαρκεί περισσότερο από το αναμενόμενο" + "timeout_title": "Η σύνδεση διαρκεί περισσότερο από το αναμενόμενο", + "websocket_disconnected": "Η σύνδεσή σας είναι εκτός λειτουργίας.", + "websocket_disconnected_message": "Τα δεδομένα ενδέχεται να μην είναι ενημερωμένα.", + "websocket_connecting": "Σύνδεση με τα perps ..", + "websocket_connecting_message": "Επαναφορά σύνδεσης… Προσπάθεια {{attempt}}", + "websocket_connected": "Συνδέθηκε", + "websocket_connected_message": "Η ροή ζωντανών δεδομένων επανήλθε", + "websocket_retry": "Επανάληψη" }, "chart": { "no_data": "Δεν υπάρχουν διαθέσιμα δεδομένα γραφήματος", @@ -1746,7 +1776,7 @@ "markets": "Αγορές" }, "learn_more": { - "title": "Μάθετε περισσότερα για τα Perps", + "title": "Μάθετε για τα Perps", "description": "Ανακαλύψτε πώς λειτουργούν οι συναλλαγές με perpetual συμβόλαια και πώς να ξεκινήσετε", "cta": "Μάθετε περισσότερα" }, @@ -1754,6 +1784,9 @@ "title": "Επικοινωνία με την υποστήριξη", "description": "Επικοινωνήστε με την Υποστήριξη του MetaMask για βοήθεια" }, + "feedback": { + "title": "Πείτε μας τη γνώμη σας" + }, "close_all_modal": { "title": "Κλείσιμο όλων των θέσεων", "description": "Θα κλείσουμε όλες τις ανοιχτές θέσεις σας στην τρέχουσα τιμή της αγοράς.", @@ -1806,7 +1839,11 @@ "price_change_low_to_high": "Μεταβολή τιμής: από χαμηλή προς υψηλή", "past_hour": "Την τελευταία ώρα", "past_24_hours": "Τις τελευταίες 24 ώρες", - "time": "Ώρα" + "time": "Ώρα", + "apply": "Εφαρμογή" + }, + "market_type": { + "filter_by": "Φιλτράρισμα κατά" }, "perps_markets": "Αγορές συμβολαίων αορίστου διάρκειας", "volume": "Όγκος", @@ -1823,6 +1860,7 @@ "mainnet": "Mainnet", "developer_options": { "hyperliquid_network_toggle": "Εναλλαγή δικτύου στο Hyperliquid", + "provider_mode_toggle": "Λειτουργία Παρόχου", "simulate_connection_error": "Προσομοίωση σφάλματος σύνδεσης" }, "transactions": { @@ -1857,7 +1895,7 @@ "liquidated": "Ρευστοποιήθηκε", "take_profit": "Λήψη κέρδους", "stop_loss": "Περιορισμός ζημιάς (ΠΖ)", - "auto_deleveraging": "Αυτόματη Μείωση Μόχλευσης" + "auto_deleveraging": "Αυτόματη μείωση μόχλευσης" }, "funding": { "date": "Ημερομηνία", @@ -1925,7 +1963,7 @@ } }, "points": "Πόντοι", - "estimated_points": "Εκτ. Πόντοι", + "estimated_points": "Εκτ. πόντοι", "points_error": "Δεν είναι δυνατή η φόρτωση πόντων αυτή τη στιγμή", "points_error_content": "Μην ανησυχείτε, εξακολουθείτε να κερδίζετε πόντους. Θα εμφανιστούν σύντομα στον λογαριασμό σας ή μπορείτε να ελέγξετε την καρτέλα Ανταμοιβές αργότερα.", "tp_on_chart": "ΛΚ στο διάγραμμα", @@ -1942,7 +1980,7 @@ } }, "predict": { - "title": "Προβλέψεις MetaMask", + "title": "Προβλέψεις στο MetaMask", "prediction_markets": "Αγορές προβλέψεων", "market_list": "Λίστα αγορών", "loading": "Φόρτωση...", @@ -1981,7 +2019,8 @@ "fee_exemption": "Δεν χρεώνουμε καμία προμήθεια σε αυτήν την αγορά.", "ended": "Έληξε", "resolved_early": "Έκλεισε πρόωρα", - "disclaimer": "Αυτές οι πληροφορίες ενδέχεται να μην είναι πλήρεις. Όλοι οι κανόνες της αγοράς, τα κριτήρια επίλυσης και τα τελικά αποτελέσματα καθορίζονται αποκλειστικά από το Polymarket. Οι συναλλαγές πρέπει να πραγματοποιούνται βάσει των πλήρων κανόνων που είναι διαθέσιμοι στο Polymarket." + "disclaimer": "Αυτές οι πληροφορίες ενδέχεται να μην είναι πλήρεις. Όλοι οι κανόνες της αγοράς, τα κριτήρια επίλυσης και τα τελικά αποτελέσματα καθορίζονται αποκλειστικά από το Polymarket. Οι συναλλαγές πρέπει να πραγματοποιούνται βάσει των πλήρων κανόνων που είναι διαθέσιμοι στο Polymarket.", + "your_picks": "Οι επιλογές σας" }, "tab": { "no_predictions_description": "Οι προβλέψεις σας θα εμφανιστούν εδώ, μαζί με το ποσό συμμετοχής και την κίνηση της πλατφόρμας.", @@ -2001,6 +2040,8 @@ "cashout_info": "{{amount}} στο {{outcome}} με τιμή {{initialPrice}}", "cashout_info_multiple": "{{amount}} στο {{outcomeGroupTitle}} • {{outcome}} για {{initialPrice}}", "position_info": "{{initialValue}} στο {{outcome}} για να κερδίσετε {{shares}}", + "position_pick_info": "{{initialValue}} στο {{outcome}}", + "position_pick_info_to_win": "{{initialValue}} στο {{outcome}} για να κερδίσετε", "buy_yes": "Ναι", "buy_no": "Όχι", "outcomes": "αποτελέσματα", @@ -2035,6 +2076,7 @@ "won_markets_text": "Κερδίσατε {{count}} αγορά{{s}}", "available_balance": "Διαθέσιμο υπόλοιπο", "claim_amount_text": "Εξαργυρώστε ${{amount}}", + "claim_winnings_text": "Εξαργύρωση κερδών", "unrealized_pnl_label": "Μη οριστικοποιημένα κέρδη & ζημίες", "unrealized_pnl_value": "{{amount}} ({{percent}})", "unrealized_pnl_error": "Δεν ήταν δυνατή η φόρτωση", @@ -2093,8 +2135,8 @@ "price_per_share": "Τιμή ανά μετοχή", "price_impact": "Αντίκτυπος στην τιμή", "net_pnl": "Καθαρά Κέρδη & Ζημιές", - "total_net_pnl": "Συνολικό καθαρό κέρδος ή ζημία", - "market_net_pnl": "Καθαρό κέρδος ή ζημία από την πλατφόρμα", + "total_net_pnl": "Συνολικά καθαρά κέρδη και ζημίες", + "market_net_pnl": "Καθαρά κέρδη και ζημίες αγοράς", "activity_details": "Λεπτομέρειες δραστηριότητας", "today": "Σήμερα", "yesterday": "Χθες" @@ -2173,6 +2215,15 @@ "order_not_fully_filled": "Αποτυχία εκτέλεσης της εντολής σας", "buy_order_not_fully_filled": "Δεν υπάρχουν αρκετές διαθέσιμες μετοχές στην τιμή αγοράς για να εκτελεστεί η εντολή σας αυτή τη στιγμή.", "sell_order_not_fully_filled": "Δεν υπάρχει αρκετή ζήτηση στην τιμή αγοράς για να πραγματοποιηθεί η εξαργύρωση αυτή τη στιγμή." + }, + "game_details_footer": { + "pick_a_winner": "Επιλέξτε έναν νικητή", + "volume_display": "${{volume}} Όγκος συναλλαγών", + "read_terms": "Διαβάστε τους πλήρεις όρους και τις προϋποθέσεις της σύμβασης" + }, + "sports": { + "halftime": "Ημίχρονο", + "final": "Λήξη" } }, "receive": { @@ -2290,7 +2341,7 @@ "add_funds": "Προσθήκη κεφαλαίων", "next": "Επόμενο", "buy_asset": "Αγοράστε {{asset}}", - "no_tokens": "Δεν έχετε καθόλου tokens!", + "no_tokens": "Δεν έχετε καθόλου tokens", "show_tokens_without_balance": "Εμφάνιση token χωρίς υπόλοιπο", "nfts_autodetection_title": "Εντοπισμός NFT", "nfts_autodetection_desc": "Επιτρέψτε στο MetaMask να ανιχνεύσει και να εμφανίσει αυτόματα τα NFT στο πορτοφόλι σας.", @@ -2303,7 +2354,7 @@ "target_scam_network": "καθιστώντας το στόχο για απάτες. Οι απατεώνες μπορεί να σας ξεγελάσουν για να τους στείλετε πιο πολύτιμα νομίσματα σε αντάλλαγμα. Επαληθεύστε τα πάντα προτού συνεχίσετε.", "use_the_currency_symbol": "χρησιμοποιεί το σύμβολο νομίσματος", "use_correct_symbol": "Βεβαιωθείτε ότι χρησιμοποιείτε το σωστό σύμβολο προτού συνεχίσετε", - "chain_id_currently_used": "Αυτό το αναγνωριστικό αλυσίδας χρησιμοποιείται προς το παρόν από το", + "chain_id_currently_used": "This chain ID is currently used by the", "incorrect_network_name_warning": "Σύμφωνα με τα αρχεία μας, το όνομα του δικτύου ενδέχεται να μην ταιριάζει απόλυτα με αυτό το αναγνωριστικό αλυσίδας.", "suggested_name": "Προτεινόμενο όνομα:", "network_check_validation_desc": "μειώνει τις πιθανότητες σύνδεσης σε κακόβουλο ή λανθασμένο δίκτυο.", @@ -2314,7 +2365,7 @@ "nft_empty_description": "Υπάρχει ένας ολόκληρος κόσμος NFT εκεί έξω. Ξεκινήστε τη συλλογή σας σήμερα.", "tokens_empty_description": "Nothing to see yet. Why not browse tokens or make a trade?", "discover_nfts": "Εισαγωγή NFT", - "no_transactions": "Δεν έχετε συναλλαγές!", + "no_transactions": "Δεν έχετε συναλλαγές", "switch_network_to_view_transactions": "Παρακαλούμε αλλάξτε δίκτυο για να δείτε τις συναλλαγές", "send_button": "Αποστολή", "deposit_button": "Κατάθεση", @@ -2362,6 +2413,7 @@ "network_fee": "Τέλη δικτύου", "lists": "Token lists", "hide_cta": "Απόκρυψη token", + "perps_trading": "Συναλλαγές με συμβόλαια αορίστου διάρκειας", "options": { "title": "Token options", "view_on_portfolio": "Προβολή στο Portfolio", @@ -2409,8 +2461,8 @@ "add_token": "ΕΙΣΑΓΩΓΉ" }, "collectibles": { - "cancel_add_collectible": "ΆΚΥΡΟ", - "add_collectible": "ΕΙΣΑΓΩΓΉ" + "cancel_add_collectible": "Ακύρωση", + "add_collectible": "Εισαγωγή" }, "banners": { "search_desc": "Τώρα είναι διαθέσιμος ο βελτιωμένος εντοπισμός token στο δίκτυο {{network}}. ", @@ -2521,18 +2573,20 @@ "billion_abbreviation": "Δ", "trillion_abbreviation": "Τ", "million_abbreviation": "Ε", + "thousand_abbreviation": "K", "token_details": "Λεπτομέρειες token", "contract_address": "Διεύθυνση συμβολαίου", "token_list": "Λίστα με tokens", "market_details": "Λεπτομέρειες της αγοράς", "market_cap": "Market cap", "total_volume": "Total volume (24h)", - "volume_to_marketcap": "Volume / market cap", + "volume_to_marketcap": "Volume / Market cap", "circulating_supply": "Διαθέσιμη προσφορά", "all_time_high": "Υψηλό όλων των εποχών", "all_time_low": "Χαμηλό όλων των εποχών", "fully_diluted": "Πλήρως κατανεμημένα", - "unknown": "Άγνωστο" + "unknown": "Άγνωστο", + "stock": "Stock" }, "collectible": { "collectible_address": "Διεύθυνση", @@ -2583,7 +2637,7 @@ "remove_snap_account": "Αφαίρεση λογαριασμού snap", "remove_snap_account_alert_description": "Αυτός ο λογαριασμός θα αφαιρεθεί από το πορτοφόλι σας. Βεβαιωθείτε ότι έχετε την αρχική Μυστική Φράση Ανάκτησης ή το ιδιωτικό κλειδί για αυτόν τον λογαριασμό που έχετε εισαγάγει πριν συνεχίσετε. Μπορείτε να εισαγάγετε ή να δημιουργήσετε ξανά λογαριασμούς από το αναπτυσσόμενο μενού λογαριασμών.", "remove_account_alert_remove_btn": "Διαγραφή", - "remove_account_alert_cancel_btn": "Δεν πειράζει", + "remove_account_alert_cancel_btn": "Never mind", "accounts_title": "Λογαριασμοί", "connect_account_title": "Σύνδεση λογαριασμού", "connect_accounts_title": "Σύνδεση λογαριασμών", @@ -2620,7 +2674,7 @@ "advisory_by": "Συμβουλές που παρέχονται από το Ethereum Phishing Detector και PhishFort", "potential_threat": "Πιθανές απειλές περιλαμβάνουν", "fake_metamask": "Ψεύτικες εκδόσεις του MetaMask", - "srp_theft": "Μυστική φράση ανάκτησης ή κλοπή κωδικού πρόσβασης", + "srp_theft": "Secret Recovery Phrase or password theft", "malicious_transactions": "Κακόβουλες συναλλαγές που οδηγούν σε απώλεια περιουσιακών στοιχείων", "secret_recovery_phrase": "Μυστική Φράση Ανάκτησής σας", "account_name": "Όνομα λογαριασμού", @@ -2675,8 +2729,8 @@ }, "connect_qr_hardware": { "title": "Συνδέστε ένα πορτοφόλι υλικού με βάση το QR", - "description1": "Συνδέστε ένα πορτοφόλι υλικού που επικοινωνεί μέσω κωδικών QR.", - "description2": "Πώς λειτουργεί?", + "description1": "Connect an airgapped hardware wallet that communicates through QR codes.", + "description2": "Πώς λειτουργεί", "description3": "Τα επίσημα υποστηριζόμενα πορτοφόλια υλικού περιλαμβάνουν:", "keystone": "Βασικά στοιχεία", "ngravezero": "Ngrave Zero", @@ -2690,7 +2744,7 @@ "hint_text": "Σαρώστε το πορτοφόλι υλικολογισμικού για ", "purpose_connect": "συνδεθείτε", "purpose_sign": "επιβεβαιώσετε τη συναλλαγή", - "select_accounts": "Επιλέξτε Λογαριασμό" + "select_accounts": "Επιλέξτε έναν λογαριασμό" }, "data_collection_modal": { "accept": "Εντάξει", @@ -2716,15 +2770,15 @@ "notifications_dismiss_modal": "Απόρριψη", "select_rpc_url": "Επιλέξτε την διεύθυνση URL του RPC", "title": "Ρυθμίσεις", - "current_conversion": "Βασικό Νόμισμα", - "current_language": "Current language", + "current_conversion": "Βασικό νόμισμα", + "current_language": "Τρέχουσα γλώσσα", "ipfs_gateway": "Πύλη IPFS", "ipfs_gateway_content": "Το MetaMask χρησιμοποιεί υπηρεσίες τρίτων για να προβάλει εικόνες των NFT σας που είναι αποθηκευμένα στο IPFS, εμφάνιζει πληροφορίες σχετικά με τις διευθύνσεις ENS που έχουν εισαχθεί στη γραμμή διευθύνσεων του προγράμματος περιήγησής σας και αντλεί εικονίδια για διαφορετικά tokens. Η διεύθυνση IP σας ενδέχεται να είναι εκτεθειμένη σε αυτές τις υπηρεσίες όταν τις χρησιμοποιείτε.", "ipfs_gateway_down": "Η τρέχουσα πύλη σας IPFS είναι εκτός λειτουργίας", "ipfs_gateway_desc": "Επιλέξτε την πύλη IPFS που προτιμάτε.", - "search_engine": "Search engine", - "new_RPC_URL": "Νέο Δίκτυο RPC", - "state_logs": "State logs", + "search_engine": "Μηχανή αναζήτησης", + "new_RPC_URL": "Νέο δίκτυο RPC", + "state_logs": "Αρχεία καταγραφής κατάστασης", "add_network_title": "Προσθήκη δικτύου", "auto_lock": "Αυτόματο κλείδωμα", "auto_lock_desc": "Επιλέξτε το χρονικό διάστημα πριν κλειδώσει αυτόματα η εφαρμογή.", @@ -2733,15 +2787,15 @@ "autolock_never": "Ποτέ", "autolock_after": "Μετά από {{time}} δευτερόλεπτα", "autolock_after_minutes": "Μετά από {{time}} λεπτά", - "reveal_seed_words": "Reveal seed words", - "reset_account": "Reset account", - "state_logs_button": "Download state logs", + "reveal_seed_words": "ΑΠΟΚΑΛΥΨΗ ΤΗΣ ΜΥΣΤΙΚΗΣ ΦΡΑΣΗΣ", + "reset_account": "Επαναφορά λογαριασμού", + "state_logs_button": "Λήψη των αρχείων καταγραφής κατάστασης", "reveal_seed_words_button": "ΑΠΟΚΑΛΥΨΗ ΤΗΣ ΜΥΣΤΙΚΗΣ ΦΡΑΣΗΣ", - "reset_account_button": "Reset account", + "reset_account_button": "Επαναφορά λογαριασμού", "reset_account_confirm_button": "Ναι, επαναφορά", "reset_account_cancel_button": "Άκυρο", - "reset_account_modal_title": "Reset account?", - "clear_approvals_modal_title": "Clear approval data?", + "reset_account_modal_title": "Επαναφορά λογαριασμού;", + "clear_approvals_modal_title": "Διαγραφή δεδομένων εγκρίσεων;", "clear_approvals_modal_message": "Όλες οι αποκεντρωμένες εφαρμογές θα πρέπει να ζητήσουν εκ νέου πρόσβαση για προβολή πληροφοριών λογαριασμού.", "clear_browser_history_modal_title": "Εκκαθάριση ιστορικού του προγράμματος περιήγησης?", "clear_browser_history_modal_message": "Θα αφαιρέσουμε όλο το ιστορικό του προγράμματος περιήγησής σας. Είστε σίγουροι;", @@ -2763,7 +2817,7 @@ "protect_title": "Επαναφορά πορτοφολιού", "banner_social_login_enabled": "Συνδεθείτε με {{authConnection}}", "manage_recovery_method": "Διαχείριση μεθόδων ανάκτησης", - "video_failed": "Video failed to load.", + "video_failed": "Δεν ήταν δυνατή η φόρτωση του βίντεο.", "protect_desc": "Δημιουργήστε αντίγραφο ασφαλείας της Μυστικής Φράσης Ανάκτησης για να διασφαλίσετε την πρόσβαση στο πορτοφόλι σας. Βεβαιωθείτε ότι θα την αποθηκεύσετε σε ασφαλές μέρος στο οποίο μόνο εσείς θα έχετε πρόσβαση και δεν θα το ξεχάσετε", "protect_desc_no_backup": "Αυτή είναι η φράση 12 λέξεων του πορτοφολιού σας. Αυτή η φράση μπορεί να χρησιμοποιηθεί για τον έλεγχο όλων των τρεχόντων και μελλοντικών λογαριασμών σας, όπως και για τη δυνατότητα να στέλνετε χρήματα στο πορτοφόλι σας. Αποθηκεύστε με ασφάλεια αυτήν τη φράση και ΜΗΝ την μοιραστείτε με κανέναν. Το MetaMask δεν μπορεί να σας βοηθήσει να ανακτήσετε αυτό το κλειδί.", "learn_more": "Μάθετε περισσότερα.", @@ -2782,9 +2836,9 @@ "show_fiat_on_testnets_desc": "Επιλέξτε αυτό για να εμφανίσετε τη μετατροπή παραστατικών χρημάτων σε δίκτυα δοκιμών.", "show_fiat_on_testnets_modal_title": "Να είστε προσεκτικοί", "show_fiat_on_testnets_modal_description": "Εαν σας ζητήθηκε να ενεργοποιήσετε αυτή τη λειτουργία, μπορεί να έχετε πέσει θύμα απάτης. Αυτά τα tokens δεν έχουν χρηματική αξία και προορίζονται μόνο για δοκιμαστικούς σκοπούς. Αυτή η λειτουργία βοηθά τους προγραμματιστές να βεβαιωθούν ότι οι εφαρμογές τους λειτουργούν.", - "show_fiat_on_testnets_modal_learn_more": "Μάθετε περισσότερα.", + "show_fiat_on_testnets_modal_learn_more": "Μάθετε περισσότερα", "show_fiat_on_testnets_modal_button": "Συνεχίστε", - "show_hex_data": "Show hex data", + "show_hex_data": "Εμφάνιση δεκαεξαδικών δεδομένων", "show_hex_data_desc": "Επιλέξτε αυτό για να προβάλλετε το πεδίο δεκαεξαδικών δεδομένων στην οθόνη αποστολής.", "accounts_identicon_title": "Εικονίδιο λογαριασμού", "accounts_identicon_desc": "Επιλέξτε ανάμεσα σε τρία διαφορετικά στυλ μοναδικών εικονιδίων που σας βοηθούν να αναγνωρίζετε τους λογαριασμούς σας με μια ματιά.", @@ -2793,7 +2847,7 @@ "general_title": "Γενικά", "general_desc": "Μετατροπή νομίσματος, πρωτεύον νόμισμα, γλώσσα και μηχανή αναζήτησης.", "advanced_title": "Για Προχωρημένους", - "advanced_desc": "Αποκτήστε πρόσβαση σε λειτουργίες προγραμματιστών, επαναφορά λογαριασμού, ρύθμιση δοκιμαστικών δικτύων, αρχεία καταγραφής κατάστασης, πύλες IPFS και προσαρμοσμένα RPC.", + "advanced_desc": "Πρόσβαση σσε λειτουργίες για προγραμματιστές, επαναφορά λογαριασμού, ρύθμιση testnets, αρχεία καταγραφής κατάστασης, πύλη IPFS και προσαρμοσμένο RPC.", "notifications_title": "Ειδοποιήσεις", "notifications_desc": "Διαχειριστείτε τις ειδοποιήσεις σας", "allow_notifications": "Επιτρέψτε τις ειδοποιήσεις", @@ -2804,9 +2858,9 @@ "customize_session_desc": "Ενεργοποιήστε τους τύπους ειδοποιήσεων που θέλετε να λαμβάνετε:", "account_session_title": "Δραστηριότητα λογαριασμού", "account_session_desc": "Επιλέξτε τους λογαριασμούς για τους οποίους θέλετε να λαμβάνετε ειδοποιήσεις:", - "assets_sent_title": "Assets sent", + "assets_sent_title": "Τα περιουσιακά στοιχεία στάλθηκαν", "assets_sent_desc": "Κεφάλαια και NFT", - "assets_received_title": "Assets received", + "assets_received_title": "Τα περιουσιακά στοιχεία ελήφθησαν", "assets_received_desc": "Κεφάλαια και NFT", "defi_title": "DeFi", "defi_desc": "Ποντάρισμα (staking), ανταλλαγή και διασύνδεση", @@ -2822,32 +2876,32 @@ "permissions_desc": "Διαχειριστείτε τις άδειες που έχετε δώσει σε ιστότοπους και εφαρμογές.", "no_permissions": "Δεν υπάρχουν άδειες", "no_permissions_desc": "Εάν συνδέσετε έναν λογαριασμό σε έναν ιστότοπο ή μια εφαρμογή, θα τον δείτε εδώ.", - "security_title": "Ασφάλεια και Απόρρητο", + "security_title": "Ασφάλεια και ιδιωτικότητα", "back": "Πίσω", "security_desc": "Ρυθμίσεις απορρήτου, MetaMetrics, ιδιωτικό κλειδί και Μυστική Φράση Ανάκτησης.", "networks_title": "Δίκτυα", - "networks_default_title": "Default network", + "networks_default_title": "Προεπιλεγμένο δίκτυο", "network_delete": "Εάν διαγράψετε αυτό το δίκτυο, θα πρέπει να το προσθέσετε ξανά για να δείτε τα περιουσιακά σας στοιχεία σε αυτό το δίκτυο", "networks_default_cta": "Χρήση αυτού του δικτύου", "add_rpc_url": "Προσθήκη διεύθυνσης URL του RPC", - "add_block_explorer_url": "Προσθήκη διεύθυνσης URL του Block Explorer", + "add_block_explorer_url": "Προσθήκη διεύθυνσης URL στο block explorer", "networks_desc": "Προσθέστε και επεξεργαστείτε προσαρμοσμένα δίκτυα RPC", - "network_name_label": "Network name", - "network_name_placeholder": "Network name (optional)", + "network_name_label": "Όνομα δικτύου", + "network_name_placeholder": "Όνομα δικτύου (προαιρετικά)", "network_rpc_url_label": "Διεύθυνση URL του RPC", - "network_rpc_name_label": "Όνομα του RPC", - "network_rpc_placeholder": "Νέο Δίκτυο RPC", + "network_rpc_name_label": "Όνομα RPC", + "network_rpc_placeholder": "Νέο δίκτυο RPC", "network_failover_rpc_url_label": "Απέτυχε η διεύθυνση URL του RPC", "failover": "Αποτυχία", "network_chain_id_label": "Αναγνωριστικό αλυσίδας", "network_chain_id_placeholder": "Αναγνωριστικό αλυσίδας", "network_symbol_label": "Σύμβολο", - "network_block_explorer_label": "Αποκλεισμός διεύθυνσης URL του Explorer", - "network_block_explorer_placeholder": "Αποκλεισμός διεύθυνσης URL του Explorer (προαιρετικά)", - "network_chain_id_warning": "Μη έγκυρο Αναγνωριστικό αλυσίδας", - "network_other_networks": "Other networks", + "network_block_explorer_label": "Διεύθυνση URL του Block Explorer", + "network_block_explorer_placeholder": "Διεύθυνση URL του block explorer (προαιρετικά)", + "network_chain_id_warning": "Μη έγκυρο αναγνωριστικό αλυσίδας (chain ID)", + "network_other_networks": "Άλλα δίκτυα", "network_rpc_networks": "Δίκτυα RPC", - "network_add_network": "Add network", + "network_add_network": "Προσθήκη δικτύου", "network_add_custom_network": "Προσθήκη προσαρμοσμένου δικτύου", "network_add": "Προσθήκη", "network_save": "Αποθήκευση", @@ -2858,11 +2912,11 @@ "info_title_beta": "Σχετικά με το MetaMask Beta", "info_title_flask": "Σχετικά με το MetaMask Flask", "experimental_title": "Πειραματικά", - "experimental_desc": "WalletConnect και άλλα...", + "experimental_desc": "WalletConnect και άλλα…", "legal_title": "Νομικές πληροφορίες", "conversion_title": "Μετατροπή νομίσματος", "conversion_desc": "Εμφάνιση τιμών παραστατικού χρήματος (fiat) με τη χρήση ενός συγκεκριμένου νομίσματος μέσα στην εφαρμογή.", - "primary_currency_title": "Primary currency", + "primary_currency_title": "Κύριο νόμισμα", "primary_currency_desc": "Επιλέξτε Εγγενές (Native) για να δώσετε προτεραιότητα στην εμφάνιση τιμών στο εγγενές νομίσμα της αλυσίδας (π.χ. ETH). Επιλέξτε Fiat για να δώσετε προτεραιότητα στην εμφάνιση τιμών στο επιλεγμένο νομίσμα fiat.", "primary_currency_text_first": "Εγγενές", "primary_currency_text_second": "Παραστατικό Χρήμα (Fiat)", @@ -2883,7 +2937,7 @@ "batch_balance_requests_description": "Λάβετε ενημερώσεις υπολοίπου για όλους τους λογαριασμούς σας ταυτόχρονα. Η απενεργοποίηση αυτής της λειτουργίας σημαίνει ότι δεν είναι ιδιαίτερα πιθανό οι άλλοι να συσχετίσουν έναν λογαριασμό με κάποιον άλλον.", "third_party_title": "Λήψη εισερχόμενων συναλλαγών", "third_party_description": "Τα API τρίτων (Etherscan) χρησιμοποιούνται για την εμφάνιση των εισερχόμενων συναλλαγών σας στο ιστορικό. Απενεργοποιήστε το εάν δεν θέλετε να αντλούμε δεδομένα από αυτές τις υπηρεσίες.", - "metametrics_opt_out": "Εξαίρεση από τα MetaMetrics", + "metametrics_opt_out": "εξαίρεση από τα MetaMetrics", "metametrics_restart_required": "Πρέπει να επανεκκινήσετε την εφαρμογή για να τεθούν σε ισχύ οι αλλαγές.", "create_password": "Δημιουργία κωδικού πρόσβασης", "invalid_password": "Μη έγκυρος κωδικός πρόσβασης", @@ -2899,11 +2953,11 @@ "invalid_number": "Μη έγκυρος αριθμός. Εισαγάγετε έναν δεκαδικό ή προκαθορισμένο δεκαεξαδικό αριθμό '0x'.", "invalid_number_leading_zeros": "Μη έγκυρος αριθμός. Αφαιρέστε τα αρχικά μηδενικά.", "invalid_number_range": "Μη έγκυρος αριθμός. Εισαγάγετε έναν αριθμό μεταξύ 1 και %{maxSafeChainId}", - "hide_zero_balance_tokens_title": "Hide tokens without balance", + "hide_zero_balance_tokens_title": "Απόκρυψη tokens χωρίς διαθέσιμο υπόλοιπο", "hide_zero_balance_tokens_desc": "Αποτρέπει την εμφάνιση των tokens χωρίς υπόλοιπο στην λίστα των tokens σας.", "token_detection_title": "Αυτόματη ανίχνευση tokens", "token_detection_description": "Χρησιμοποιούμε API τρίτων για τον εντοπισμό και την εμφάνιση νέων tokens που αποστέλλονται στο πορτοφόλι σας. Απενεργοποιήστε το εάν δεν θέλετε η εφαρμογή να αντλεί δεδομένα από αυτές τις υπηρεσίες.", - "theme_button_text": "Change theme", + "theme_button_text": "Αλλαγή θέματος", "theme_title": "Θέμα ({{theme}})", "theme_description": "Αλλάξτε την εμφάνιση της εφαρμογής σας επιλέγοντας θέμα.", "theme_os": "Σύστημα", @@ -2935,18 +2989,18 @@ "delete_metrics_description_after_delete_part_two": ". Η διαδικασία αυτή μπορεί να διαρκέσει έως και 30 ημέρες. Δείτε την", "delete_metrics_description_privacy_policy": "Πολιτική Απορρήτου.", "delete_metrics_button": "Διαγραφή δεδομένων MetaMetrics", - "check_status_button": "Check status", + "check_status_button": "Έλεγχος κατάστασης", "delete_metrics_confirm_modal_title": "Διαγραφή δεδομένων MetaMetrics?", "delete_metrics_confirm_modal_description": "Πρόκειται να αφαιρέσουμε όλα τα δεδομένα σας στο MetaMetrics. Είστε σίγουροι;", "delete_wallet_data_title": "Επαναφορά πορτοφολιού", "delete_wallet_data_description": "Αυτό θα αφαιρέσει από τη συσκευή όλα τα δεδομένα που σχετίζονται με το πορτοφόλι σας. Οι λογαριασμοί σας υπάρχουν στο blockchain και δεν σχετίζονται με το MetaMask. Μπορείτε πάντα να ανακτήσετε τους λογαριασμούς σας χρησιμοποιώντας την Μυστική σας Φράση Ανάκτησης.", "delete_wallet_data_button": "Επαναφορά πορτοφολιού", - "delete_data_status_title": "Deletion task status", + "delete_data_status_title": "Κατάσταση εργασίας διαγραφής", "delete_data_status_description": "Η τρέχουσα κατάσταση είναι", "delete_metrics_error_title": "Δεν μπορούμε να διαγράψουμε αυτά τα δεδομένα προς το παρόν.", "delete_metrics_error_description": "Αυτό το αίτημα δεν μπορεί να ολοκληρωθεί αυτή τη στιγμή λόγω προβλήματος του διακομιστή του συστήματος ανάλυσης, παρακαλούμε προσπαθήστε ξανά αργότερα.", "ok": "Εντάξει", - "clear_sdk_connections_title": "Εκκαθάριση όλων των συνδέσεων MetaMask SDK", + "clear_sdk_connections_title": "Διαγραφή όλων των συνδέσεων MetaMask SDK", "clear_sdk_connections_text": "Όλες οι συνδέσεις θα εκκαθαριστούν και οι αποκεντρωμένες εφαρμογές θα πρέπει να ζητήσουν ξανά σύνδεση", "sdk_connections": "Συνδέσεις MetaMask SDK", "manage_sdk_connections_title": "Διαχείριση συνδέσεων", @@ -2956,8 +3010,9 @@ "description": "Περιοχή & άλλα...", "current_region": "Τρέχουσα περιοχή", "reset_region": "Επαναφορά περιοχής", + "change_region": "Αλλαγή περιοχής", "no_region_selected": "Δεν έχει επιλεχθεί περιοχή", - "sdk_activation_keys": "Κλειδιά Ενεργοποίησης SDK", + "sdk_activation_keys": "Κλειδιά ενεργοποίησης SDK", "activation_keys_description": "Τα κλειδιά ενεργοποίησης θα ενεργοποιήσουν συγκεκριμένες λειτουργίες ή παρόχους.", "add_activation_key": "Προσθήκη κλειδιού ενεργοποίησης", "edit_activation_key": "Επεξεργασία κλειδιού ενεργοποίησης", @@ -3006,13 +3061,13 @@ }, "snap_details": { "install_date": "Εγκαταστάθηκε στις {{date}}", - "install_origin": "Install origin", + "install_origin": "Προέλευση εγκατάστασης", "enabled": "Ενεργοποιημένο", "version": "Έκδοση" }, "keyring_account_list_item": { "account_name": "Όνομα λογαριασμού", - "public_address": "Public address" + "public_address": "Δημόσια διεύθυνση" }, "snap_permissions": { "approved_date": "Εγκρίθηκε στις {{date}}", @@ -3063,28 +3118,28 @@ "blockaid_desc": "Αυτή η λειτουργία σας προειδοποιεί για κακόβουλη δραστηριότητα, καθώς ελέγχει ενεργά τα αιτήματα συναλλαγών και υπογραφών.", "security_alerts": "Ειδοποιήσεις ασφαλείας", "security_alerts_desc": "Αυτή η λειτουργία σας ειδοποιεί για κακόβουλη δραστηριότητα, ελέγχοντας τοπικά τα αιτήματα συναλλαγών και υπογραφών σας. Κάνετε πάντα τη δική σας ενδελεχή έρευνα πριν εγκρίνετε οποιαδήποτε αιτήματα. Δεν υπάρχει καμία εγγύηση ότι αυτή η λειτουργία θα ανιχνεύσει όλες τις κακόβουλες δραστηριότητες. Ενεργοποιώντας αυτή τη λειτουργία, συμφωνείτε με τους όρους χρήσης του παρόχου.", - "dismiss_smart_account_update_heading": "Απόρριψη της υπόδειξης \"Μετάβαση σε Έξυπνο Λογαριασμό\"", - "dismiss_smart_account_update_desc": "Ενεργοποιήστε αυτήν την επιλογή ώστε να μην εμφανίζεται ξανά η υπόδειξη \"Μετάβαση σε Έξυπνο Λογαριασμό\" σε κανένα λογαριασμό. Οι Έξυπνοι Λογαριασμοί προσφέρουν γρηγορότερες συναλλαγές, χαμηλότερα τέλη δικτύου και μεγαλύτερη ευελιξία στις πληρωμές.", + "dismiss_smart_account_update_heading": "Απόρριψη της πρότασης “Αλλαγή σε έξυπνο λογαριασμό”", + "dismiss_smart_account_update_desc": "Ενεργοποιήστε αυτήν την επιλογή για να μην εμφανίζεται πλέον η πρόταση “Αλλαγή σε έξυπνο λογαριασμό” σε κανέναν λογαριασμό. Οι έξυπνοι λογαριασμοί προσφέρουν ταχύτερες συναλλαγές, χαμηλότερα τέλη δικτύου και μεγαλύτερη ευελιξία στον τρόπο πληρωμής.", "use_smart_account_heading": "Χρησιμοποιήστε έξυπνο λογαριασμό", "use_smart_account_desc": "Διατήρησε αυτή την επιλογή ενεργή για να γίνεται αυτόματη εναλλαγή των λογαριασμών που δημιουργούνται μέσα στο MetaMask σε έξυπνους λογαριασμούς όποτε είναι διαθέσιμες σχετικές λειτουργίες, όπως ταχύτερες συναλλαγές, χαμηλότερα τέλη δικτύου και ευελιξία στην πληρωμή αυτών.", - "use_smart_account_learn_more": "Μάθετε περισσότερα.", + "use_smart_account_learn_more": "Μάθετε περισσότερα", "smart_transactions_opt_in_heading": "Έξυπνες Συναλλαγές", "smart_transactions_opt_in_desc_supported_networks": "Ενεργοποιήστε τις Έξυπνες Συναλλαγές για πιο αξιόπιστες και ασφαλείς συναλλαγές σε υποστηριζόμενα δίκτυα.", - "smart_transactions_learn_more": "Μάθετε περισσότερα.", + "smart_transactions_learn_more": "Μάθετε περισσότερα", "simulation_details": "Εκτίμηση μεταβολών υπολοίπου", "simulation_details_description": "Ενεργοποιήστε το για να εκτιμήσετε τις αλλαγές στο υπόλοιπο των συναλλαγών πριν τις επιβεβαιώσετε. Αυτό δεν εγγυάται την τελική αποτίμηση των συναλλαγών σας. ", "simulation_details_learn_more": "Μάθετε περισσότερα.", - "aes_crypto_test_form_title": "AES crypto - test form", + "aes_crypto_test_form_title": "AES κρυπτογράφηση – δοκιμαστική φόρμα", "aes_crypto_test_form_description": "Το τμήμα αναπτύχθηκε αποκλειστικά για δοκιμές E2E. Εάν αυτό είναι ορατό στην εφαρμογή σας, αναφέρετέ το στην υποστήριξη του MetaMask.", "developer_options": { - "title": "Developer options", - "generate_trace_test": "Generate trace test", - "generate_trace_test_desc": "Generate a developer test Sentry trace.", - "navigate_to_sample_feature": "Navigate to sample feature", + "title": "Επιλογές για προγραμματιστές", + "generate_trace_test": "Δημιουργία δοκιμής ιχνηλάτησης", + "generate_trace_test_desc": "Δημιουργία δοκιμαστικής ιχνηλάτισης Sentry για προγραμματιστές.", + "navigate_to_sample_feature": "Μετάβαση στη δοκιμαστική λειτουργία", "sample_feature_desc": "Δοκιμαστική λειτουργία ως πρότυπο για προγραμματιστές." }, "feature_flag_override": { - "title": "Feature flag override", + "title": "Παράκαμψη ρύθμισης λειτουργίας", "description": "Παράκαμψη των ρυθμιστικών λειτουργιών (feature flags) της εφαρμογής τοπικά." } }, @@ -3137,7 +3192,7 @@ "sdk_feedback_modal": { "ok": "Εντάξει", "title": "Ο λογαριασμός δεν μπόρεσε να συνδεθεί", - "info": "Σαρώστε τον κωδικό QR στην αποκεντρωμένη εφαρμογή για να συνδεθείτε εκ νέου στο MetaMask" + "info": "Please scan the QR code on the site to reconnect to MetaMask" }, "app_information": { "title": "Πληροφορίες", @@ -3145,8 +3200,8 @@ "privacy_policy": "Πολιτική Απορρήτου", "terms_of_use": "Όροι χρήσης", "attributions": "Αποδόσεις", - "support_center": "Visit our support center", - "web_site": "Επισκεφθείτε την Ιστοσελίδα μας", + "support_center": "Επισκεφθείτε το κέντρο υποστήριξής μας", + "web_site": "Visit our website", "contact_us": "Contact us" }, "reveal_credential": { @@ -3203,7 +3258,7 @@ "keep_credential_safe": "Κρατήστε το {{credentialName}} σας ασφαλές", "srp_abbreviation_text": "ΜΦΑ", "srp_text": "Μυστική Φράση Ανάκτησής σας", - "private_key_text": "Ιδιωτικό Κλειδί", + "private_key_text": "Ιδιωτικό κλειδί", "got_it": "Κατανοητό", "learn_more": "Μάθετε περισσότερα" }, @@ -3211,12 +3266,12 @@ "title": "Ειδοποίηση ασφαλείας", "description": "Τα στιγμιότυπα οθόνης δεν είναι ένας ασφαλής τρόπος για να διατηρείτε τη {{credentialName}}. Αποθηκεύστε την κάπου που δεν έχει δημιουργηθεί αντίγραφο ασφαλείας στο διαδίκτυο για να διαφυλάξετε τον λογαριασμό σας.", "srp_text": "Μυστική Φράση Ανάκτησής σας", - "priv_key_text": "Ιδιωτικό Κλειδί" + "priv_key_text": "Ιδιωτικό κλειδί" }, "password_reset": { "password_title": "Κωδικός πρόσβασης", "password_desc": "Επιλέξτε έναν ισχυρό κωδικό για να ξεκλειδώσετε την εφαρμογή MetaMask στη συσκευή σας. Εάν χάσετε τον κωδικό πρόσβασης θα χρειαστείτε τη Μυστική Φράση Ανάκτησης για να εισαγάγετε εκ νέου το πορτοφόλι σας.", - "password_learn_more": "Μάθετε περισσότερα.", + "password_learn_more": "Μάθετε περισσότερα", "change_password": "Αλλαγή κωδικού πρόσβασης", "password_hint": "Υπόδειξη κωδικού πρόσβασης" }, @@ -3246,19 +3301,28 @@ "swap": "Ανταλλαγή", "bridge": "Διασύνδεση", "earn": "Κερδίστε", - "convert_to_musd": "Convert to mUSD", + "convert_to_musd": "Μετατροπή σε mUSD", + "merkl_rewards": { + "annual_bonus": "{{apy}}% μπόνους", + "claimable_bonus": "Μπόνους προς εξαργύρωση", + "claimable_bonus_tooltip_description": "mUSD bonuses are claimed on Linea.", + "terms_apply": "Terms apply.", + "ok": "Εντάξει", + "claim": "Εξαργύρωση", + "processing_claim": "Processing claim..." + }, "tron": { - "daily_resource_new_energy": "New daily energy", - "sufficient_to_cover": "Sufficient to cover", + "daily_resource_new_energy": "Νέα ημερήσια ενέργεια", + "sufficient_to_cover": "Επαρκές για να καλύψει", "transactions": "συναλλαγές", "daily_resource": "Καθημερινός πόρος", "bandwidth": "Εύρος ζώνης", "energy": "Ενέργεια", - "daily_resource_description": "This is your daily allowance based on your staked TRX. Hold TRX to get 600 bandwidth daily.", - "sufficient_to_cover_trx_transfers": "Covers ~{{amount}} TRX transfers", - "sufficient_to_cover_trx_transfer": "Covers 1 TRX transfer", - "sufficient_to_cover_usdt_transfers": "Covers ~{{amount}} USDT transfers", - "sufficient_to_cover_usdt_transfer": "Covers 1 USDT transfer" + "daily_resource_description": "Αυτή είναι η ημερήσια ποσότητα που δικαιούστε, βάσει τα TRX που έχετε δεσμεύσει. Διατηρήστε τα TRX για να λαμβάνετε καθημερινά 600 bandwidth.", + "sufficient_to_cover_trx_transfers": "Καλύπτει περίπου {{amount}} μεταφορές TRX", + "sufficient_to_cover_trx_transfer": "Καλύπτει 1 μεταφορά TRX", + "sufficient_to_cover_usdt_transfers": "Καλύπτει περίπου {{amount}} μεταφορές USDT", + "sufficient_to_cover_usdt_transfer": "Καλύπτει 1 μεταφορά USDT" }, "disabled_button": { "buy": "Η αγορά δεν υποστηρίζεται για αυτόν τον λογαριασμό", @@ -3311,9 +3375,11 @@ }, "no_chart_data": { "title": "Δεν υπάρχουν δεδομένα γραφήματος", - "description": "Δεν μπορέσαμε να αντλήσουμε δεδομένα για αυτό το token" + "description": "Δεν μπορέσαμε να αντλήσουμε δεδομένα για αυτό το token", + "insufficient_data": "Data is not available for this time period" }, "your_balance": "Το υπόλοιπό σας", + "perps_position": "Θέση στα Perps", "unable_to_load_balance": "Δεν είναι δυνατή η φόρτωση του υπολοίπου σας", "about": "Σχετικά", "about_content_display": { @@ -3363,11 +3429,11 @@ "address_copied_to_clipboard": "Η διεύθυνση του token αντιγράφηκε στο πρόχειρο" }, "qr_scanner": { - "invalid_qr_code_title": "Μη έγκυρος κωδικός QR", + "invalid_qr_code_title": "Invalid QR code", "invalid_qr_code_message": "Ο κωδικός QR που προσπαθείτε να σαρώσετε δεν είναι έγκυρος.", "allow_camera_dialog_title": "Επιτρέψτε την πρόσβαση στην κάμερα", "allow_camera_dialog_message": "Χρειαζόμαστε την άδειά σας για να σαρώσουμε κωδικούς QR", - "scanning": "σάρωση...", + "scanning": "Σάρωση...", "ok": "Εντάξει", "continue": "Συνεχίστε", "cancel": "Άκυρο", @@ -3376,14 +3442,14 @@ "attempting_sync_from_wallet_error": "Φαίνεται ότι προσπαθείτε να συγχρονιστείτε με την επέκταση. Για να το κάνετε αυτό, θα πρέπει να διαγράψετε το τρέχον πορτοφόλι σας. \n\nΑφού διαγράψετε ή εγκαταστήσετε εκ νέου μια νέα έκδοση της εφαρμογής, επιλέξτε «Συγχρονισμός με την Επέκταση του MetaMask». Σημαντικό! Πριν διαγράψετε το πορτοφόλι σας, σιγουρευτείτε ότι έχετε δημιουργήσει αντίγραφο ασφαλείας της Μυστικής Φράσης Ανάκτησης.", "not_allowed_error_title": "Ενεργοποίηση της πρόσβασης στην κάμερα", "not_allowed_error_desc": "Για να σαρώσετε έναν κωδικό QR, θα πρέπει να δώσετε πρόσβαση στην κάμερα στο MetaMask από το μενού ρυθμίσεων της συσκευής σας.", - "unrecognized_address_qr_code_title": "Μη αναγνωρίσιμος κωδικός QR", + "unrecognized_address_qr_code_title": "Unrecognized QR code", "unrecognized_address_qr_code_desc": "Λυπούμαστε, αυτός ο κωδικός QR δεν συνδέεται με μια διεύθυνση λογαριασμού ή διεύθυνση συμβολαίου.", "url_redirection_alert_title": "Πρόκειται να ανοίξετε έναν εξωτερικό σύνδεσμο", "url_redirection_alert_desc": "Οι σύνδεσμοι μπορούν να χρησιμοποιηθούν με σκοπό να παραπλανήσουν ή να εξαπατήσουν τους χρήστες, γι' αυτό φροντίστε να επισκέπτεστε μόνο ιστότοπους που εμπιστεύεστε.", "label": "Σάρωση ενός κωδικού QR", "open_settings": "Ρυθμίσεις", "camera_not_available": "Η κάμερα δεν είναι διαθέσιμη", - "tron_address_not_supported": "Tron addresses are not currently supported" + "tron_address_not_supported": "Οι διευθύνσεις Tron δεν υποστηρίζονται προς το παρόν" }, "action_view": { "cancel": "Άκυρο", @@ -3471,10 +3537,10 @@ "cancel_tx_message": "Η υποβολή αυτής της προσπάθειας δεν εγγυάται ότι η αρχική σας συναλλαγή θα ακυρωθεί. Εάν η προσπάθεια ακύρωσης είναι επιτυχής, θα χρεωθείτε με το παραπάνω τέλος συναλλαγής.", "speedup_tx_title": "Προσπάθεια για επιτάχυνση;", "speedup_tx_message": "Η υποβολή αυτής της προσπάθειας δεν εγγυάται ότι η αρχική σας συναλλαγή θα επιταχυνθεί. Εάν η προσπάθεια επιτάχυνσης είναι επιτυχής, θα χρεωθείτε με το παραπάνω τέλος συναλλαγής.", - "nevermind": "Δεν πειράζει", + "nevermind": "Never mind", "edit_network_fee": "Επεξεργασία τέλους συναλλαγής", "edit_priority": "Επεξεργασία προτεραιότητας", - "gas_cancel_fee": "Τέλος ακύρωσης συναλλαγής", + "gas_cancel_fee": "Gas cancellation fee", "gas_speedup_fee": "Τέλος επιτάχυνσης συναλλαγής", "use_max": "Χρήση μέγιστου", "set_gas": "Ορισμός", @@ -3602,7 +3668,7 @@ "reload": "Επαναφόρτωση", "share": "Κοινοποίηση", "bookmark": "Σελιδοδείκτης", - "add_to_favorites": "Προσθήκη στα Αγαπημένα", + "add_to_favorites": "Add to favorites", "error": "Σφάλμα", "cancel": "Άκυρο", "go_back": "Πίσω", @@ -3610,7 +3676,7 @@ "home": "Αρχική σελίδα", "close": "Κλείσιμο", "open_in_browser": "Άνοιγμα στο πρόγραμμα περιήγησης", - "change_url": "Αλλαγή διεύθυνσης url", + "change_url": "Change URL", "switch_network": "Αλλαγή δικτύου", "dapp_browser": "ΠΡΟΓΡΑΜΜΑ ΠΕΡΙΗΓΗΣΗΣ ΑΠΟΚΕΝΤΡΩΜΕΝΩΝ ΕΦΑΡΜΟΓΩΝ", "dapp_browser_message": "Το MetaMask είναι το πορτοφόλι σας και το πρόγραμμα περιήγησής σας για τον αποκεντρωμένο ιστό. Ρίξτε μια ματιά!", @@ -3654,7 +3720,7 @@ "add_favorite": { "title": "Add favorite", "title_label": "Όνομα", - "url_label": "Διεύθυνση Url", + "url_label": "Διεύθυνση URL", "add_button": "Προσθήκη", "cancel_button": "Άκυρο" }, @@ -3676,30 +3742,30 @@ "tx_review_increase_allowance": "Increase allowance", "tx_review_set_approval_for_all": "Set approval for all", "tx_review_staking_claim": "Staking claim", - "tx_review_staking_deposit": "Staking deposit", + "tx_review_staking_deposit": "Κατάθεση για δέσμευση κρυπτονομισμάτων", "tx_review_staking_unstake": "Ακύρωση πονταρίσματος", - "tx_review_lending_deposit": "Lending deposit", + "tx_review_lending_deposit": "Κατάθεση για δανεισμό", "tx_review_lending_withdraw": "Lending withdrawal", - "tx_review_perps_deposit": "Χρηματοδοτούμενα perpetual συμβόλαια", + "tx_review_perps_deposit": "Χρηματοδοτούμενα perps", "tx_review_predict_deposit": "Χρηματοδοτούμενες προβλέψεις", "tx_review_predict_claim": "Κατοχυρωμένες νίκες", "tx_review_predict_withdraw": "Ανάληψη προβλέψεων", - "tx_review_musd_conversion": "mUSD Conversion", - "sent_ether": "Αποστολή Ether", - "self_sent_ether": "Sent yourself Ether", - "received_ether": "Ληφθέντα Ether", + "tx_review_musd_conversion": "Μετατροπή σε mUSD", + "sent_ether": "Sent ETH", + "self_sent_ether": "Sent yourself ETH", + "received_ether": "Received ETH", "sent_dai": "Αποστολή DAI", "self_sent_dai": "Στείλτε DAI στον εαυτό σας", "received_dai": "Ληφθέντα DAI", "sent_tokens": "Sent tokens", "received_tokens": "Received tokens", - "ether": "Ether", + "ether": "ETH", "sent_unit": "Στείλτε {{unit}}", "self_sent_unit": "Sent yourself {{unit}}", "received_unit": "Λήφθησαν {{unit}}", "sent_collectible": "Sent collectible", "received_collectible": "Received collectible", - "send_ether": "Send Ether", + "send_ether": "Send ETH", "send_unit": "Send {{unit}}", "send_collectible": "Send collectible", "receive_collectible": "Receive collectible", @@ -3732,9 +3798,9 @@ }, "gas_used": "Gas used (units)", "gas_limit": "Gas limit (units)", - "gas_price": "Τιμή τελών συναλλαγής (GWEI)", - "base_fee": "Βασικό Τέλος (GWEI)", - "priority_fee": "Τέλος Προτεραιότητας (GWEI)", + "gas_price": "Gas price (GWEI)", + "base_fee": "Base fee (GWEI)", + "priority_fee": "Priority fee (GWEI)", "multichain_priority_fee": "Τέλος προτεραιότητας", "max_fee": "Max fee per gas", "total": "Σύνολο", @@ -3767,7 +3833,7 @@ "confirm_gas_fee_token_tooltip": "Αυτό καταβάλλεται στο δίκτυο για την επεξεργασία της συναλλαγής σας. Περιλαμβάνει μια χρέωση {{metamaskFeeFiat}} στο MetaMask για token εκτός ETH ή για προ-χρηματοδοτημένα ETH.", "paid_by_metamask": "Πληρωμή μέσω MetaMask", "confirm_gas_fee_token_metamask_fee": "Περιλαμβάνει προμήθεια {{metamaskFeeFiat}}", - "smart_account_upgrade": "Αναβάθμιση σε έξυπνο λογαριασμό", + "smart_account_upgrade": "Αλλαγή σε έξυπνο λογαριασμό", "smart_account_downgrade": "Αλλαγή σε βασικό λογαριασμό", "batched_transactions": "Ομαδοποιημένες συναλλαγές", "gas_modal": { @@ -3883,7 +3949,7 @@ "network_select_confirm_use_safe_check": "Selecting confirm turns on network details check. You can turn off network details check in ", "network_settings_security_privacy": "Ρυθμίσεις > Ασφάλεια και απόρρητο", "network_currency_symbol": "Σύμβολο νομίσματος", - "network_block_explorer_url": "Αποκλεισμός διεύθυνσης URL του Explorer", + "network_block_explorer_url": "Διεύθυνση URL του Block Explorer", "search": "Αναζήτηση για δίκτυο που έχει ήδη προστεθεί", "search-short": "Search", "add": "Προσθήκη", @@ -3906,7 +3972,7 @@ "select_all": "Επιλογή όλων", "deselect_all": "Αποεπιλογή όλων", "new_network": "Προστέθηκε νέο δίκτυο", - "network_name": "Το Δίκτυο {{networkName}}", + "network_name": "το Δίκτυο {{networkName}}", "network_added": " είναι τώρα διαθέσιμο στην επιλογή δικτύου.", "provider": "Ένας πάροχος θεωρείται αξιόπιστος για να αναφέρει στο πορτοφόλι σας τα υπόλοιπά του και να μεταδίδει πιστά τις συναλλαγές του", "no_match": "Δε βρέθηκαν αποτελέσματα που να ταιριάζουν.", @@ -4004,8 +4070,8 @@ "biometrics": { "enable_touchid": "Ξεκλείδωμα με Touch ID;", "enable_faceid": "Ξεκλείδωμα με Face ID;", - "enable_fingerprint": "Ξεκλείδωμα με Δακτυλικό Αποτύπωμα;", - "enable_biometrics": "Ξεκλείδωμα με Βιομετρικά;", + "enable_fingerprint": "Unlock with fingerprint?", + "enable_biometrics": "Unlock with biometrics?", "enable_device_passcode_ios": "Ξεκλείδωμα με κωδικό συσκευής;", "enable_device_passcode_android": "Ξεκλείδωμα με PIN συσκευής;" }, @@ -4020,18 +4086,18 @@ "title": "ΑΙΤΗΜΑ ΣΥΝΔΕΣΗΣ", "walletconnect_title": "ΑΙΤΗΜΑ WALLETCONNECT", "action": "Σύνδεση σε αυτήν την ιστοσελίδα;", - "action_reconnect": "Για να συνεχίσετε τη σύνδεση, επιλέξτε τον αριθμό που βλέπετε στην αποκεντρωμένη εφαρμογή", - "action_reconnect_deeplink": "Θέλετε να συνδεθείτε εκ νέου σε αυτή την αποκεντρωμένη εφαρμογή;", + "action_reconnect": "To resume connection, choose the number you see on the site", + "action_reconnect_deeplink": "Do you want to reconnect to this site?", "connect": "Σύνδεση", "resume": "Συνέχεια ", "cancel": "Άκυρο", - "donot_rememberme": "Μην θυμάστε αυτή τη σύνδεση στην αποκεντρωμένη εφαρμογή", + "donot_rememberme": "Do not remember this site connection", "disconnect": "Αποσύνδεση", "permission": "Δείτε τη", "address": "δημόσια διεύθυνσή σας", "sign_messages": "Υπογράψτε μηνύματα", "on_your_behalf": "εκ μέρους σας", - "warning": "Κάνοντας κλικ στην επιλογή «σύνδεση», επιτρέπετε σε αυτή την αποκεντρωμένη εφαρμογή να δει την δημόσια διεύθυνσή σας. Αυτό είναι ένα σημαντικό βήμα ασφαλείας για την προστασία των δεδομένων σας από πιθανούς κινδύνους phishing." + "warning": "By clicking connect, you allow this site to view your public address. This is an important security step to protect your data from potential phishing risks." }, "import_private_key": { "title": "Εισαγωγή λογαριασμού", @@ -4047,7 +4113,7 @@ "error_title": "Κάτι πήγε στραβά", "error_message": "Δεν μπορούσαμε να εισάγουμε αυτό το ιδιωτικό κλειδί. Βεβαιωθείτε ότι το καταχωρήσατε σωστά.", "error_empty_message": "Πρέπει να καταχωρήσετε το ιδιωτικό σας κλειδί.", - "or_scan_a_qr_code": "ή σαρώστε έναν Κωδικό QR" + "or_scan_a_qr_code": "or scan a QR code" }, "import_private_key_success": { "title": "Ο λογαριασμός εισήχθη με επιτυχία!", @@ -4064,12 +4130,12 @@ "paste": "Επικόλληση", "clear": "Εκκαθάριση όλων", "srp_number_of_words_option_title": "Αριθμός λέξεων", - "12_word_option": "Έχω μια φράση 12 λέξεων", - "24_word_option": "Έχω μια φράση 24 λέξεων", + "12_word_option": "I have a 12-word phrase", + "24_word_option": "I have a 24-word phrase", "error_title": "Κάτι πήγε στραβά", "error_message": "We couldn't import that Secret Recovery Phrase. Please make sure you entered it correctly.", "error_empty_message": "You need to enter your Secret Recovery Phrase.", - "error_number_of_words_error_message": "Οι Μυστικές Φράσεις Ανάκτησης περιέχουν 12 ή 24 λέξεις", + "error_number_of_words_error_message": "Secret Recovery Phrases contain 12 or 24 words", "error_srp_is_case_sensitive": "Μη έγκυρη καταχώριση! Η Μυστική Φράση Ανάκτησης διακρίνει τα πεζά/κεφαλαία γράμματα.", "error_srp_word_error_1": "Η λέξη ", "error_srp_word_error_2": " είναι λανθασμένη ή ανορθόγραφη.", @@ -4079,7 +4145,7 @@ "error_invalid_srp": "Μη έγκυρη Μυστική Φράση Ανάκτησης", "error_duplicate_srp": "Έχει ήδη γίνει εισαγωγή αυτής της Μυστικής Φράσης Ανάκτησης.", "error_duplicate_account": "The account you are trying to import is a duplicate.", - "invalid_qr_code_title": "Μη έγκυρος κωδικός QR", + "invalid_qr_code_title": "Invalid QR code", "invalid_qr_code_message": "The QR code does not contain a valid Secret Recovery Phrase", "success_1": "Πορτοφόλι", "success_2": "έγινε εισαγωγή" @@ -4151,7 +4217,7 @@ "why_secure_2": "Είναι ο μόνος τρόπος να ανακτήσετε το πορτοφόλι σας εάν κλειδωθείτε εκτός της εφαρμογής ή πάρετε νέα συσκευή." }, "account_backup_step_2": { - "cancel_backup_title": "Cancel backup", + "cancel_backup_title": "Ακύρωση δημιουργίας αντιγράφου ασφαλείας", "cancel_backup_message": "Σας συνιστούμε να αποθηκεύσετε τη Μυστική Φράση Ανάκτησης για να επαναφέρετε το πορτοφόλι σας.", "cancel_backup_ok": "Ναι, αντιλαμβάνομαι τον κίνδυνο", "cancel_backup_no": "Όχι, να δημιουργηθεί αντίγραφο ασφαλείας της Μυστικής Φράσης Ανάκτησης", @@ -4163,7 +4229,7 @@ "cta_text": "Εντάξει" }, "account_backup_step_3": { - "cancel_backup_title": "Cancel backup", + "cancel_backup_title": "Ακύρωση δημιουργίας αντιγράφου ασφαλείας", "cancel_backup_message": "Σας συνιστούμε να αποθηκεύσετε τη Μυστική Φράση Ανάκτησης για να επαναφέρετε το πορτοφόλι σας.", "cancel_backup_ok": "Ναι, αντιλαμβάνομαι τον κίνδυνο", "cancel_backup_no": "Όχι, να δημιουργηθεί αντίγραφο ασφαλείας της Μυστικής Φράσης Ανάκτησης", @@ -4172,7 +4238,7 @@ "cta_text": "ΚΑΝΕΝΑΣ ΔΕΝ ΜΕ ΠΑΡΑΚΟΛΟΥΘΕΙ" }, "account_backup_step_4": { - "cancel_backup_title": "Cancel backup", + "cancel_backup_title": "Ακύρωση δημιουργίας αντιγράφου ασφαλείας", "cancel_backup_message": "Σας συνιστούμε να αποθηκεύσετε τη Μυστική Φράση Ανάκτησης για να επαναφέρετε το πορτοφόλι σας.", "cancel_backup_ok": "Ναι, αντιλαμβάνομαι τον κίνδυνο", "cancel_backup_no": "Όχι, να δημιουργηθεί αντίγραφο ασφαλείας της Μυστικής Φράσης Ανάκτησης", @@ -4197,16 +4263,16 @@ "modal_button": "ΕΠΌΜΕΝΟ" }, "account_backup_step_6": { - "title": "Security tips", + "title": "Συμβουλές ασφαλείας", "info_text": "Το MetaMask δεν μπορεί να ανακτήσει την Μυστική Φράση Ανάκτησης εάν την χάσετε", "tip_1": "Κρατήστε πολλά αντίγραφα ασφαλείας από τη Μυστική Φράση Ανάκτησης", "tip_2": "Αποθηκεύστε τη φράση σε έναν αξιόπιστο διαχειριστή κωδικών πρόσβασης και κρατήστε αντίγραφα σε χαρτί, σε ασφαλές μέρος", "tip_3": "Μην μοιραστείτε αυτήν τη φράση ποτέ και με κανέναν", "disclaimer": "* Θα βρείτε τη Μυστική Φράση Ανάκτησης, εάν μεταβείτε στις", - "disclaimer_bold": "Ρυθμίσεις > Ασφάλεια και Απόρρητο", - "cta_text": "ΤΟ ΚΑΤΑΛΑΒΑ!", + "disclaimer_bold": "Ρυθμίσεις > Ασφάλεια και απόρρητο", + "cta_text": "ΤΟ ΚΑΤΑΛΑΒΑ", "modal_title": "Συγχαρητήρια!", - "modal_text": "Έχετε όλα τα αντίγραφα ασφαλείας και είστε έτοιμοι!", + "modal_text": "Έχετε όλα τα αντίγραφα ασφαλείας και είστε έτοιμοι.", "modal_button": "ΤΕΛΟΣ", "copy_seed_phrase": "ΑΝΤΙΓΡΑΨΤΕ τη Μυστική Φράση Ανάκτησης ΣΤΟ ΠΡΟΧΕΙΡΟ" }, @@ -4238,7 +4304,7 @@ "steps": "Βήμα {{currentStep}} από {{totalSteps}}", "action": "Επιβεβαιώστε τη Μυστική Φράση Ανάκτησής σας", "info": "Επιλέξτε τις λέξεις που λείπουν με τη σωστή σειρά.", - "complete": "Complete backup", + "complete": "Ολοκλήρωση δημιουργίας αντιγράφου ασφαλείας", "success": "Επιτυχία", "error-title": "Δεν είναι εντελώς σωστή", "error-description": "Ελέγξτε προσεκτικά τη Μυστική Φράση Ανάκτησης και προσπαθήστε ξανά.", @@ -4253,7 +4319,7 @@ "congratulations": "Συγχαρητήρια", "success": "Προστατεύσατε με επιτυχία το πορτοφόλι σας. Να θυμάστε να διατηρείτε την Μυστική Φράση Ανάκτησης ασφαλή. Είναι δική σας ευθύνη!", "hint": "Θέλετε να αφήσετε μια υπόδειξη;", - "recover": "Το MetaMask δεν μπορεί να ανακτήσει το πορτοφόλι σας εάν το χάσετε. Μπορείτε να βρείτε τη Μυστική Φράση Ανάκτησης στις Ρυθμίσεις > Ασφάλεια και Απόρρητο", + "recover": "Το MetaMask δεν μπορεί να ανακτήσει το πορτοφόλι σας εάν το χάσετε. Μπορείτε να βρείτε τη Μυστική Φράση Ανάκτησης στις Ρυθμίσεις > Ασφάλεια και ιδιωτικότητα.", "learn": "Μάθετε περισσότερα", "done": "Τέλος", "recovery_hint": "Υπόδειξη ανάκτησης", @@ -4300,7 +4366,7 @@ "withdrawal_completed": "Η ανάληψη ολοκληρώθηκε", "unstake_completed": "Μη ολοκλήρωση του πονταρίσματος (unstake)", "withdrawal_requested": "Αίτημα ανάληψης", - "stake_ready_to_be_withdrawn": "Το ποντάρισμα (stake) είναι έτοιμο για ανάληψη", + "stake_ready_to_be_withdrawn": "Το ποντάρισμα είναι έτοιμο για ανάληψη", "swap_completed": "Ανταλλάξατε {{from}} για {{to}}", "swap": "Ανταλλαγή", "sent": "Στάλθηκαν σε {{address}}", @@ -4417,7 +4483,7 @@ "metamask_swap_completed_title": "Η ανταλλαγή ολοκληρώθηκε", "metamask_swap_completed_description": "Η ανταλλαγή σας στο MetaMask ήταν επιτυχής", "nft_sent_title": "Στάλθηκαν NFT", - "nft_sent_description": "Στείλατε επιτυχώς ένα NFT", + "nft_sent_description": "You successfully sent an NFT", "nft_received_title": "Ελήφθη NFT", "nft_received_description": "Λάβατε νέα NFT", "rocketpool_stake_completed_title": "Ολοκλήρωση πονταρίσματος", @@ -4516,10 +4582,10 @@ "send_link_title": "Send link", "description_1": "Ο σύνδεσμος του αιτήματός σας είναι έτοιμος για αποστολή!", "description_2": "Στείλτε αυτόν τον σύνδεσμο σε έναν φίλο και θα του ζητήσει να στείλει", - "copy_to_clipboard": "Αντιγραφή στο Πρόχειρο", + "copy_to_clipboard": "Αντιγραφή στο πρόχειρο", "qr_code": "Κωδικός QR", "send_link": "Send link", - "request_qr_code": "Κώδικας QR για αίτημα πληρωμής", + "request_qr_code": "Payment request QR code", "balance": "Υπόλοιπο" }, "receive_request": { @@ -4561,12 +4627,12 @@ "close_current_session": "Κλείστε την τρέχουσα συνεδρία πριν ξεκινήσετε μια νέα." }, "paymentRequest": { - "title": "ΑΙΤΗΜΑ ΠΛΗΡΩΜΗΣ", - "title_complete": "ΟΛΟΚΛΗΡΩΣΗ ΠΛΗΡΩΜΗΣ", - "confirm": "ΠΛΗΡΩΜΗ", - "cancel": "ΑΠΟΡΡΙΨΗ", + "title": "Payment request", + "title_complete": "Payment complete", + "confirm": "Pay", + "cancel": "Decline", "is_requesting_you_to_pay": "σας ζητά να πληρώσετε", - "total": "ΣΥΝΟΛΟ:" + "total": "Σύνολο:" }, "webview_error": { "title": "Κάτι πήγε στραβά", @@ -4589,6 +4655,10 @@ "fiat_on_ramp": { "buy_eth": "Αγορά ETH", "buy": "Αγορά {{ticker}}", + "on_network": "στο {{networkName}}", + "debit_card": "Χρεωστική κάρτα", + "continue": "Συνεχίστε", + "powered_by_provider": "Με την υποστήριξη του {{provider}}", "purchased_currency": "Αγοράστηκαν {{currency}}", "network_not_supported": "Το τρέχον δίκτυο δεν υποστηρίζεται", "switch_network": "Παρακαλούμε μεταβείτε στο Mainnet", @@ -4609,7 +4679,7 @@ "second_line": "την αγορά σας;" }, "buy_ticker": "Αγορά {{ticker}}", - "buy_ticker_stablecoins": "Αγοράστε {{ticker}} και Stablecoins", + "buy_ticker_stablecoins": "Αγοράστε {{ticker}} και stablecoins", "multiple_payment_methods": "Πολλαπλές μέθοδοι πληρωμής", "debit_credit_bank_transfers_country": "Χρεωστικές/Πιστωτικές κάρτες και τραπεζικές μεταφορές ανάλογα με τη χώρα σας.", "debit_credit_bank_transfers_more_country": "Χρεωστικές/Πιστωτικές κάρτες, τραπεζικές μεταφορές και ακόμα περισσότερα ανάλογα με τη χώρα σας.", @@ -4676,6 +4746,14 @@ "subtitle_5": "και να δείτε πόσα τέλη συναλλαγής κοστίζει.", "cta": "Συνέχεια με την αγορά {{ticker}}" } + }, + "build_quote_settings_modal": { + "title": "Ρυθμίσεις", + "view_order_history": "Προβολή ιστορικού εντολών", + "contact_support": "Επικοινωνία με την υποστήριξη", + "log_out": "Αποσύνδεση από το {{provider}}", + "logged_out_success": "Αποσυνδεθήκατε με επιτυχία", + "logged_out_error": "Σφάλμα κατά την αποσύνδεση" } }, "fiat_on_ramp_aggregator": { @@ -4706,7 +4784,7 @@ "use_new_buy_experience_description": "Μετάβαση στη νέα έκδοση" }, "onboarding": { - "what_to_expect": "Τι να Αναμένετε", + "what_to_expect": "Τι να περιμένετε", "quotes": "Η λειτουργία μας αγοράς κρυπτονομισμάτων συγκεντρώνει προσφορές από ενταγμένους προμηθευτές, παρέχοντας προσφορές από αυτές τις πηγές για να λάβετε τα κρυπτονομίσματα απευθείας στο πορτοφόλι σας χωρίς περίοδο αναμονής.", "quotes_sell": "Τώρα μπορείτε να εξαργυρώσετε απευθείας στο MetaMask! Λάβετε ενημερωμένες προσφορές από αξιόπιστους παρόχους, ενώ εμείς θα σας καθοδηγούμε σε κάθε βήμα.", "benefits": "Λιγότερα τέλη συναλλαγών για πληρωμή και υποστήριξη πολυάριθμων δικτύων, tokens και μεθόδων πληρωμής", @@ -4761,7 +4839,7 @@ "get_quotes": "Πάρτε προσφορές", "done": "Τέλος", "fetching_quotes": "Λήψη προσφορών", - "select_a_quote": "Επιλέξτε μια Προσφορά", + "select_a_quote": "Επιλέξτε μια προσφορά", "recommended_quote": "Προτεινόμενη προσφορά", "select_a_cryptocurrency": "Επιλέξτε κρυπτονόμισμα", "select_a_cryptocurrency_description": "Επιλέξτε από τη λίστα των διαθέσιμων token.", @@ -4819,15 +4897,16 @@ "region": { "buy_crypto_tokens": "Αγορά κρυπτονομισμάτων (tokens)", "sell_crypto_tokens": "Αγορά κρυπτονομισμάτων (tokens)", - "title": "Επιλέξτε την Περιοχή σας", + "title": "Επιλέξτε την περιοχή σας", "description": "Οι μέθοδοι πληρωμής και τα tokens που έχετε στη διάθεσή σας καθορίζονται από τις ενσωματώσεις τρίτων και ενδέχεται να διαφέρουν ανάλογα με την περιοχή σας και την υποστήριξη από τις ενσωματώσεις μας.", "sell_description": "Οι επιλογές προορισμού μετρητών και τα tokens ενδέχεται να διαφέρουν ανάλογα με την περιοχή σας.", + "region_variation_notice": "Οι μέθοδοι πληρωμής και τα διαθέσιμα tokens ενδέχεται να διαφέρουν ανάλογα με την περιοχή σας και τους παρόχους μας.", "search_by_country": "Αναζήτηση ανά χώρα", "search_by_state": "Αναζήτηση ανά πολιτεία", "no_region_results": "Δεν βρέθηκαν περιοχές που να ταιριάζουν", "your_region": "Η περιοχή σας", "select_region": "Επιλέξτε την περιοχή σας", - "select_region_title": "Επιλέξτε την Περιοχή σας", + "select_region_title": "Επιλέξτε την περιοχή σας", "select_country_registered": "Επιλέξτε τη χώρα στην οποία είναι καταχωρημένη η κάρτα σας (ανεξάρτητα από το πού βρίσκεστε).", "unsupported": "Η περιοχή δεν υποστηρίζεται", "unsupported_description": "Εργαζόμαστε σκληρά για να επεκτείνουμε την κάλυψη στην περιοχή σας το συντομότερο δυνατό. Εν τω μεταξύ, ανατρέξτε στο άρθρο μας για υποστήριξη σχετικά με άλλους τρόπους που μπορείτε για {{rampType}}κρυπτονομισμάτων.", @@ -4849,7 +4928,7 @@ "continue_order_description": "Για να συνεχίσετε με την εντολή, θα πρέπει να επιλέξετε το κουμπί στο κάτω μέρος αυτής της σελίδας.", "the_provider": "ο πάροχος", "processing": "Επεξεργασία εντολής", - "processing_card_description": "Οι αγορές με πιστωτική/χρεωστική κάρτα διαρκούν συνήθως λίγα λεπτά.", + "processing_card_description": "Οι αγορές με πιστωτική/χρεωστική κάρτα διαρκούν συνήθως λίγα λεπτά", "processing_bank_description": "Οι τραπεζικές μεταφορές συνήθως διαρκούν μερικές εργάσιμες ημέρες", "details": "Λεπτομέρειες εντολής", "via": "μέσω", @@ -4863,7 +4942,7 @@ "support": "την Υποστήριξη", "view_order_status": "Δείτε την κατάσταση παραγγελίας στο {{provider}}", "id": "Αριθμός Εντολής", - "date_and_time": "Ημερομηνία και Ώρα", + "date_and_time": "Ημερομηνία και ώρα", "payment_method": "Μέθοδος πληρωμής", "destination": "Προορισμός", "token_amount": "Ποσότητα tokens", @@ -4883,11 +4962,11 @@ "sent": "Εστάλη!" }, "notifications": { - "purchase_failed_title": "Η αγορά του {{currency}} απέτυχε! Προσπαθήστε ξανά, συγγνώμη για την ταλαιπωρία!", + "purchase_failed_title": "Η αγορά των {{currency}} απέτυχε. Παρακαλούμε δοκιμάστε ξανά σε λίγο.", "purchase_failed_description": "Επαληθεύστε τη μέθοδο πληρωμής και αν υποστηρίζεται η κάρτα σας", "purchase_cancelled_title": "Η αγορά σας ακυρώθηκε", "purchase_cancelled_description": "Επαληθεύστε τη μέθοδο πληρωμής και αν υποστηρίζεται η κάρτα σας", - "purchase_completed_title": "Η αγορά σας των {{amount}} {{currency}} ήταν επιτυχής!", + "purchase_completed_title": "Η αγορά {{amount}} {{currency}} ήταν επιτυχής.", "purchase_completed_description": "Τα {{currency}} σας είναι τώρα διαθέσιμα", "purchase_pending_title": "Επεξεργασία της αγοράς σας των {{currency}}", "purchase_pending_description": "Αναμένεται να ολοκληρωθεί σε λίγα λεπτά...", @@ -4896,7 +4975,7 @@ "sale_cancelled_title": "Ακύρωση παραγγελίας", "sale_cancelled_description": "Η παραγγελία σας δεν μπόρεσε να ολοκληρωθεί.", "sale_completed_title": "Ολοκλήρωση παραγγελίας", - "sale_completed_description": "Η παραγγελία σας ήταν επιτυχής!.", + "sale_completed_description": "Η παραγγελία σας ήταν επιτυχής.", "sale_pending_title": "Επεξεργασία πώλησης {{currency}}", "sale_pending_description": "Η παραγγελία σας βρίσκεται τώρα υπό επεξεργασία.", "no_date": "Άγνωστο" @@ -4921,7 +5000,7 @@ "start_swapping": "Ξεκινήστε τις ανταλλαγές" }, "feature_off_title": "Προσωρινά μη διαθέσιμο", - "feature_off_body": "Το MetaMask Swaps βρίσκεται υπό συντήρηση. Προσπαθήστε ξανά αργότερα.", + "feature_off_body": "MetaMask Swaps are undergoing maintenance. Please check back later.", "wrong_network_title": "Οι ανταλλαγές δεν είναι διαθέσιμες", "wrong_network_body": "Μπορείτε να ανταλλάξετε tokens μόνο στο Κύριο Δίκτυο του Ethereum.", "unallowed_asset_title": "Δεν είναι δυνατή η ανταλλαγή αυτού του token", @@ -5002,7 +5081,7 @@ "edit": "Επεξεργασία", "quotes_include_fee": "Οι προσφορές περιλαμβάνουν μια χρέωση {{fee}}% στο MetaMask", "quotes_include_gas_and_metamask_fee": "Η προσφορά περιλαμβάνει τέλη συναλλαγών και μια χρέωση {{fee}}% στο MetaMask", - "tap_to_swap": "Πατήστε για Ανταλλαγή", + "tap_to_swap": "Tap to swap", "swipe_to_swap": "Σύρετε για ανταλλαγή", "swipe_to": "Σύρετε για", "swap": "Ανταλλαγή", @@ -5302,7 +5381,7 @@ }, "network_information": { "things_to_keep_in_mind": "Πράγματα που πρέπει να θυμάστε", - "testnet_network": "{{type}} Testnet", + "testnet_network": "{{type}} testnet", "first_description": "Τα εγγενή token σε αυτό το δίκτυο είναι {{ticker}}. Είναι το token που χρησιμοποιείται για τα τέλη συναλλαγής.", "second_description": "Εάν επιχειρήσετε να στείλετε περιουσιακά στοιχεία απευθείας από ένα δίκτυο σε ένα άλλο, αυτό μπορεί να οδηγήσει σε μόνιμη απώλεια περιουσιακών στοιχείων. Βεβαιωθείτε ότι χρησιμοποιείτε μια διασύνδεση.", "third_description": "Τα tokens σας ενδέχεται να μην εμφανίζονται αυτόματα στο πορτοφόλι σας.", @@ -5385,7 +5464,7 @@ "learn_more": "Μάθετε περισσότερα" }, "token_allowance": { - "verify_third_party_details": "Επαλήθευση στοιχείων τρίτων", + "verify_third_party_details": "Verify third-party details", "protect_from_scams": "Για να προστατευτείτε από τους απατεώνες, αφιερώστε λίγο χρόνο για να επαληθεύσετε τα στοιχεία τρίτων.", "learn_to_verify": "Μάθετε πώς να επαληθεύετε τα στοιχεία τρίτων", "spending_cap": "όριο δαπανών", @@ -5399,7 +5478,7 @@ }, "restore_wallet": { "restore_needed_title": "Απαιτείται επαναφορά", - "restore_needed_description": "Κάτι πήγε στραβά, αλλά μην ανησυχείτε! Ας προσπαθήσουμε να επαναφέρουμε το πορτοφόλι σας.", + "restore_needed_description": "Something went wrong, but don’t worry! Let’s try to restore your wallet.", "restore_needed_action": "Επαναφορά πορτοφολιού" }, "wallet_restored": { @@ -5545,7 +5624,7 @@ "add_bitcoin_account": "Λογαριασμός στο Bitcoin", "add_solana_account": "Λογαριασμός στο Solana", "add_tron_account": "Λογαριασμός Tron", - "switch_to_smart_account": "Αλλαγή σε Έξυπνο λογαριασμό", + "switch_to_smart_account": "Αλλαγή σε έξυπνο λογαριασμό", "rename_account": "Μετονομασία λογαριασμού", "addresses": "Διευθύνσεις", "headers": { @@ -5598,6 +5677,10 @@ "error_description": "Η εγκατάσταση του {{snap}} απέτυχε." }, "earn": { + "claimable_bonus_tooltip": "An annual bonus claimable daily from your wallet.", + "earn_a_percentage_bonus": "Earn a {{percentage}}% bonus", + "claimable_bonus": "Claimable bonus", + "claim_bonus": "Claim bonus", "empty_state_cta": { "heading": "Δανείστε {{tokenSymbol}} και κερδίστε", "body": "Δανείστε τα {{tokenSymbol}} μέσω του {{protocol}} και κερδίστε", @@ -5681,21 +5764,36 @@ "fee": "Τέλη" }, "musd_conversion": { - "convert_to_musd": "Convert to mUSD", + "ok": "Εντάξει", + "continue": "Continue", + "convert_and_get_percentage_bonus": "Μετατρέψτε και κερδίστε {{percentage}}%", + "get_a_percentage_musd_bonus": "Κερδίστε {{percentage}}% μπόνους σε mUSD", + "convert": "Μετατροπή", "toasts": { - "converting": "Converting {{token}} → mUSD", + "converting": "Μετατροπή {{token}} → mUSD", "eta": "~{{time}}", - "delivered": "Your mUSD has been delivered!", - "failed": "mUSD conversion failed" + "delivered": "Τα mUSD σας είναι εδώ!", + "failed": "Η μετατροπή σε mUSD απέτυχε" }, "education": { - "heading": "Κερδίστε ανταμοιβές σε mUSD", - "description": "Convert your USDC, USDT, or DAI for mUSD, MetaMask’s dollar-backed stablecoin.Earn points every time you convert or hold $100.", - "continue_button": "Ξεκινήστε" + "heading": "ΚΕΡΔΙΣΤΕ {{percentage}}% ΣΤΑ\nSTABLECOINS", + "description": "Convert your stablecoins to mUSD, MetaMask’s US dollar-backed stablecoin, and receive up to a {{percentage}}% bonus.", + "terms_apply": "Terms apply.", + "primary_button": "Ξεκινήστε", + "secondary_button": "Όχι τώρα" }, - "earn_points_daily": "Earn points daily", - "buy_musd": "Buy mUSD", - "get_musd": "Get mUSD" + "buy_musd": "Αγοράστε mUSD", + "get_musd": "Αποκτήστε mUSD", + "boost_title": "Get {{percentage}}% on your stablecoins", + "boost_description": "Convert your stablecoins to mUSD and receive up to a {{percentage}}% bonus.", + "powered_by_relay": "Υποστηρίζεται από το Relay" + }, + "bonus_claim": { + "toasts": { + "claiming": "Your mUSD bonus is processing", + "delivered": "Your mUSD bonus is here!", + "failed": "Bonus claim failed" + } }, "rewards": { "rewards_tag_label": "Ανταμοιβές", @@ -5711,22 +5809,22 @@ "stake": "Stake", "earn": "Κερδίστε", "tron": { - "stake_completed": "Staking completed", - "stake_completed_description": "Your staking transaction has been completed successfully.", - "stake_failed": "Staking failed", + "stake_completed": "Η δέσμευση κρυπτονομισμάτων ολοκληρώθηκε", + "stake_completed_description": "Η διαδικασία δέσμευσης κρυπτονομισμάτων ολοκληρώθηκε με επιτυχία.", + "stake_failed": "Η δέσμευση κρυπτονομισμάτων απέτυχε", "unstake_completed": "Ολοκλήρωση ακύρωσης πονταρίσματος", - "unstake_completed_description": "Your unstaking transaction has been completed successfully.", - "unstake_failed": "Unstaking failed", + "unstake_completed_description": "Η διαδικασία αποδέσμευσης κρυπτονομισμάτων ολοκληρώθηκε με επιτυχία.", + "unstake_failed": "Η διαδικασία αποδέσμευσης κρυπτονομισμάτων απέτυχε", "bandwidth": "Εύρος ζώνης", "energy": "Ενέργεια", "estimated_annual_reward": "Εκτ. ετήσια ανταμοιβή", - "trx_locked_for": "TRX locked for", - "trx_locked_for_minimum_time": "~3 days", - "trx_released_in": "TRX released in", - "trx_released_in_minimum_time": "~14 days", + "trx_locked_for": "Τα TRX κλειδωμένα για", + "trx_locked_for_minimum_time": "~3 ημέρες", + "trx_released_in": "Τα TRX θα είναι διαθέσιμα σε", + "trx_released_in_minimum_time": "~14 ημέρες", "fee": "Τέλη", "errors": { - "insufficient_balance": "You don't have enough resource balance to do this action." + "insufficient_balance": "Δεν έχετε αρκετό υπόλοιπο πόρων για να εκτελέσετε αυτή την ενέργεια." } }, "stake_eth": "Ποντάρισμα σε ETH", @@ -5772,12 +5870,19 @@ "learn_more_with_period": "Μάθετε περισσότερα." }, "stake_your_trx_cta": { - "title": "Lend Tron and earn", - "description_start": "Stake your Tron and earn ", + "title": "Δανείστε Tron και κερδίστε", + "description_start": "Δεσμεύστε τα Tron σας και κερδίστε ", "description_end": " ετησίως.", "learn_more": "Μάθετε περισσότερα.", "earn_button": "Κερδίστε" }, + "trx_learn_more": { + "title": "Stake TRX and earn", + "stake_any_amount": "Stake any amount of TRX.", + "earn_trx_rewards": "Κερδίστε ανταμοιβές σε TRX.", + "earn_trx_rewards_description": "Ξεκινάτε να κερδίζετε μόλις δεσμεύσετε τα tokens. Οι ανταμοιβές συσσωρεύονται αυτόματα.", + "flexible_unstaking_description": "Unstake anytime. Unstaking takes 14 days to process." + }, "day": { "zero": "", "one": "ημέρα", @@ -5981,7 +6086,7 @@ "switch_account_type": "Ενημέρωση λογαριασμού", "approve": "Έγκριση αιτήματος", "perps_deposit": "Προσθήκη κεφαλαίων", - "predict_deposit": "Προσθήκη κεφαλαίων για προβλέψεις", + "predict_deposit": "Προσθήκη κεφαλαίων για Προβλέψεις", "predict_withdraw": "Ανάληψη" }, "sub_title": { @@ -6002,14 +6107,15 @@ "transaction_fee": "Θα ανταλλάξουμε τα tokens σας με USDC στο HyperCore, το δίκτυο που χρησιμοποιείται από τα Perps. Οι πάροχοι ανταλλαγής ενδέχεται να χρεώσουν προμήθεια, αλλά το MetaMask δεν χρεώνει." }, "predict_deposit": { - "transaction_fee": "Θα ανταλλάξουμε τα tokens σας με USDC στο δίκτυο Polygon, που χρησιμοποιείται από το Predict. Οι πάροχοι ανταλλαγών ενδέχεται να χρεώσουν προμήθεια, αλλά το MetaMask δεν χρεώνει." + "transaction_fee": "Θα ανταλλάξουμε τα tokens σας με USDC.e στο δίκτυο Polygon, που χρησιμοποιείται για τις Προβλέψεις. Οι πάροχοι ανταλλαγών ενδέχεται να χρεώσουν προμήθεια, αλλά το MetaMask δεν χρεώνει." }, "musd_conversion": { - "transaction_fee": "mUSD conversion fees include network costs and may include provider fees." + "transaction_fee": "Τα τέλη μετατροπής σε mUSD περιλαμβάνουν τις χρεώσεις δικτύου και ενδέχεται να περιλαμβάνουν χρεώσεις παρόχου." }, "title": { "transaction_fee": "Τέλη" - } + }, + "network_fee": "Τα τέλη δικτύου εξαρτώνται από το φόρτο του δικτύου και από το πόσο περίπλοκη είναι η συναλλαγή σας." }, "spending_cap": "Ανώτατο όριο δαπανών", "withdraw": "Ανάληψη", @@ -6078,7 +6184,7 @@ }, "includes_transaction": "Περιλαμβάνει {{transactionCount}} συναλλαγές", "useSmartAccount": "Χρησιμοποιήστε έξυπνο λογαριασμό", - "successful": "Επιτυχία!", + "successful": "Επιτυχία", "success_message": "Ο λογαριασμός σας θα μετατραπεί σε έξυπνο λογαριασμό κατά την επόμενη συναλλαγή." }, "edit_spending_cap_modal": { @@ -6086,9 +6192,9 @@ "cancel": "Ακύρωση", "description": "Εισάγετε το ποσό που αισθάνεστε άνετα ότι μπορείτε να δαπανήσετε.", "invalid_number_error": "Το όριο δαπανών πρέπει να είναι αριθμός", - "no_empty_error": "Το όριο δαπανών δεν μπορεί να είναι κενό", - "no_extra_decimals_error": "Το όριο δαπανών δεν μπορεί να έχει περισσότερα δεκαδικά ψηφία από το token", - "no_zero_error": "Το όριο δαπανών δεν μπορεί να είναι 0", + "no_empty_error": "Spending cap can't be empty", + "no_extra_decimals_error": "Spending cap can't have more decimals than the token", + "no_zero_error": "Spending cap can't be 0", "no_zero_error_decrease_allowance": "Το όριο δαπανών 0 δεν επηρεάζει τη μέθοδο 'decreaseAllowance'", "no_zero_error_increase_allowance": "Το όριο δαπανών 0 δεν επηρεάζει τη μέθοδο 'increaseAllowance'", "save": "Αποθήκευση", @@ -6119,7 +6225,7 @@ "edit_amount_done": "Συνεχίστε", "deposit_edit_amount_done": "Προσθήκη κεφαλαίων", "deposit_edit_amount_predict_withdraw": "Ανάληψη", - "deposit_edit_amount_musd_conversion": "Convert to mUSD" + "deposit_edit_amount_musd_conversion": "Μετατροπή σε mUSD" }, "change_in_simulation_modal": { "title": "Τα αποτελέσματα έχουν αλλάξει", @@ -6144,6 +6250,8 @@ "confirm_swap": "Ανταλλαγή", "terms_and_conditions": "Όροι & Προϋποθέσεις", "select_token": "Επιλέξτε token", + "no_tokens_found": "Δεν βρέθηκαν token", + "no_tokens_found_description": "We couldn't find any tokens with this name. Try a different search.", "select_network": "Επιλέξτε δίκτυο", "all_networks": "Όλα τα δίκτυα", "num_networks": "{{numNetworks}} δίκτυα", @@ -6151,6 +6259,7 @@ "select_all_networks": "Επιλογή όλων", "deselect_all_networks": "Αποεπιλογή όλων", "see_all": "Προβολή όλων", + "all": "Όλα", "apply": "Εφαρμογή", "slippage": "Απόκλιση", "slippage_info": "Εάν η τιμή αλλάξει τη στιγμή που η εντολή σας υποβάλλεται και επιβεβαιώνεται, αυτό ονομάζεται «απόκλιση». Η ανταλλαγή σας θα ακυρωθεί αυτόματα εάν η απόκλιση υπερβαίνει τα όρια ανοχής που έχετε ορίσει εδώ.", @@ -6191,9 +6300,9 @@ "title": "Διασύνδεση", "submitting_transaction": "Υποβολή", "fetching_quote": "Λήψη προσφοράς", - "fee_disclaimer": "Περιλαμβάνει προμήθεια {{feePercentage}}% MM.", + "fee_disclaimer": "Includes {{feePercentage}}% MetaMask fee.", "no_mm_fee": "Χωρίς προμήθεια MM", - "no_mm_fee_disclaimer": "Χωρίς προμήθεια MM για ανταλλαγή σε {{destTokenSymbol}}.", + "no_mm_fee_disclaimer": "No MetaMask fee swapping into {{destTokenSymbol}}.", "hardware_wallet_not_supported": "Τα πορτοφόλια υλικού δεν υποστηρίζονται ακόμη. Χρησιμοποιήστε ένα θερμό πορτοφόλι για να συνεχίσετε.", "hardware_wallet_not_supported_solana": "Τα πορτοφόλια υλικού δεν υποστηρίζουν ακόμα την Solana. Χρησιμοποιήστε ένα θερμό πορτοφόλι για να συνεχίσετε.", "price_impact_info_title": "Αντίκτυπος στην τιμή", @@ -6208,15 +6317,7 @@ "approval_tooltip_content": "Επιτρέπετε την πρόσβαση για συγκεκριμένο ποσό, {{amount}} {{symbol}}. Το συμβόλαιο δεν θα έχει πρόσβαση σε επιπλέον κεφάλαια.", "minimum_received": "Minimum received", "minimum_received_tooltip_title": "Minimum received", - "minimum_received_tooltip_content": "Το ελάχιστο ποσό που θα λάβετε, αν η τιμή αλλάξει όσο η συναλλαγή σας εκτελείται, με βάση την ανοχή σας στην απόκλιση. Πρόκειται για εκτίμηση από τους παρόχους ρευστότητας. Τα τελικά ποσά ενδέχεται να διαφέρουν.", - "verified_token": "Επαληθευμένο token", - "price": "Τιμή", - "percent_change": "Ποσοστιαία μεταβολή", - "volume": "Όγκος", - "market_cap_fdv": "Κεφαλαιοποίηση αγοράς (FDV)", - "listed_on": "Εγγεγραμμένο σε", - "centralized_exchanges": "Κεντρικό χρηματιστήριο", - "contract_address": "Διεύθυνση συμβολαίου" + "minimum_received_tooltip_content": "Το ελάχιστο ποσό που θα λάβετε, αν η τιμή αλλάξει όσο η συναλλαγή σας εκτελείται, με βάση την ανοχή σας στην απόκλιση. Πρόκειται για εκτίμηση από τους παρόχους ρευστότητας. Τα τελικά ποσά ενδέχεται να διαφέρουν." }, "quote_expired_modal": { "title": "Υπάρχουν διαθέσιμες νέες προσφορές", @@ -6290,12 +6391,12 @@ "title": "Επαναφορά πορτοφολιού", "login_with_social": "Σύνδεση μέσω κοινωνικών δικτύων", "setup": "Διαμόρφωση", - "secret_recovery_phrase": "Μυστική φράση ανάκτησης {{num}}", + "secret_recovery_phrase": "Secret Recovery Phrase {{num}}", "back_up": "Aντιγράφο ασφαλείας", "reveal": "Εμφάνιση", "social_recovery_title": "ΑΝΑΚΤΗΣΗ ΜΕ {{authConnection}}", "social_recovery_enable": "Ενεργοποιημένο", - "social_login_description": "Συνδεθείτε με {{authConnection}} και τον κωδικό πρόσβασης στο MetaMask για να ανακτήσετε τον λογαριασμό σας και τις μυστικές φράσεις ανάκτησης.", + "social_login_description": "Χρησιμοποιήστε τα στοιχεία σύνδεσης του {{authConnection}} και τον κωδικό πρόσβασης στο MetaMask για να ανακτήσετε τον λογαριασμό σας και τις Μυστικές Φράσεις Ανάκτησης.", "srps_title": "ΜΥΣΤΙΚΕΣ ΦΡΑΣΕΙΣ ΑΝΑΚΤΗΣΗΣ", "srps_description": "Το πορτοφόλι σας είναι πιο προστατευμένο όταν και οι δύο μέθοδοι ανάκτησης έχουν ενεργοποιηθεί. Αν η μία αποτύχει, η άλλη σας βοηθά να ανακτήσετε το πορτοφόλι σας." }, @@ -6349,7 +6450,7 @@ "section_1_title": "Τι είναι οι λογαριασμοί πολλαπλών αλυσίδων (multichain accounts);", "section_1_description": "Ένας λογαριασμός, διευθύνσεις σε όλα τα δίκτυα που υποστηρίζει το MetaMask. Έτσι, τώρα μπορείτε να χρησιμοποιείτε το Ethereum, το Solana και άλλα δίκτυα χωρίς να αλλάζετε λογαριασμούς.", "section_2_title": "Ίδια διεύθυνση, περισσότερα δίκτυα", - "section_2_description": "Ομαδοποιήσαμε τους λογαριασμούς σας, όποτε συνεχίστε να χρησιμοποιείτε το MetaMask όπως πριν. Τα κεφάλαιά σας είναι ασφαλή και αμετάβλητα.", + "section_2_description": "We’ve grouped your accounts, so keep using MetaMask the same as before. Your funds are safe and unchanged.", "view_accounts_button": "Προβολή λογαριασμών", "learn_more_button": "Μάθετε περισσότερα", "setting_up_accounts": "Διαμόρφωση λογαριασμών" @@ -6511,8 +6612,10 @@ }, "card_onboarding": { "title": "Ξοδέψτε \nκαι \nΚερδίστε", - "description": "Η MetaMask Card είναι ο γρήγορος και εύκολος τρόπος να ξοδέψετε τα κρυπτονομίσματά σας σαν μετρητά και να κερδίσετε ανταμοιβές.", + "description": "Η MetaMask Card είναι ο γρήγορος και εύκολος τρόπος να ξοδέψετε τα κρυπτονομίσματά σας και να κερδίσετε έως 3% επιστροφή.", "apply_now_button": "Κάντε αίτηση τώρα", + "login_button": "Σύνδεση", + "not_now_button": "Όχι τώρα", "sign_up": { "title": "Ας ξεκινήσουμε", "description": "Δημιουργήστε λογαριασμό για την MetaMask Card, που παρέχεται από την Crypto Life. Αυτός θα είναι ξεχωριστός από τον λογαριασμό σας στο MetaMask.", @@ -6540,6 +6643,7 @@ "phone_number_label": "Εισάγετε τον αριθμό τηλεφώνου", "country_area_code_label": "Διεθνής κωδικός χώρας", "invalid_phone_number": "Μη έγκυρος αριθμός τηλεφώνου", + "invalid_us_phone_number": "Πληκτρολογήστε έναν έγκυρο αριθμό τηλεφώνου ΗΠΑ (10 ψηφία) για να συνεχίσετε.", "legal_terms": "Συνεχίζοντας, αποδέχεστε την αποστολή SMS για επαλήθευση του αριθμού τηλεφώνου σας." }, "confirm_phone_number": { @@ -6576,9 +6680,9 @@ "terms": "Οι εγκρίσεις συνήθως χρειάζονται περίπου 12 ώρες. Θα σας ειδοποιήσουμε όταν υπάρξει απόφαση." }, "verifying_veriff_kyc": { - "title": "Επαλήθευση της ταυτότητάς σας", - "description": "Παρακαλούμε περιμένετε όσο επαληθεύουμε την ταυτότητά σας.", - "helper_text": "Αυτό συνήθως διαρκεί λίγα δευτερόλεπτα. Παρακαλούμε μην κλείσετε την εφαρμογή." + "title": "Σε αναμονή έγκρισης", + "description": "Ο συνεργάτης μας πρέπει να επαληθεύσει την ταυτότητά σας για να εγκρίνει την αίτησή σας.", + "helper_text": "Αυτό συνήθως διαρκεί λίγα λεπτά. Μην κλείσετε την εφαρμογή." }, "verifying_registration": { "title": "Επαλήθευση της ταυτότητάς σας", @@ -6614,7 +6718,7 @@ }, "physical_address": { "title": "Προσθέστε τη διεύθυνσή σας", - "description": "Καταχωρίστε τη διεύθυνση κατοικίας σας. Σε περίπτωση έγκρισης, θα στείλουμε την φυσική σας κάρτα εδώ.", + "description": "Πληκτρολογήστε την τρέχουσα διεύθυνση κατοικίας σας. Θα τη χρησιμοποιήσουμε για σκοπούς επαλήθευσης.", "address_line_1_label": "Γραμμή διεύθυνσης 1", "address_line_2_label": "Γραμμή διεύθυνσης 2", "city_label": "Πόλη", @@ -6622,7 +6726,7 @@ "zip_code_label": "Ταχυδρομικός κώδικας", "country_label": "Χώρα", "electronic_consent_1": "Συμφωνώ με τη Συναίνεση και Γνωστοποίηση του Νόμου περί Ηλεκτρονικών Υπογραφών για να λαμβάνω όλες τις επικοινωνίες ηλεκτρονικά. ", - "electronic_consent_2": "View document(PDF)" + "electronic_consent_2": "Προβολή εγγράφου (PDF)" }, "mailing_address": { "title": "Διεύθυνση αλληλογραφίας", @@ -6668,22 +6772,24 @@ } }, "card_home": { + "title": "Card", + "available_balance": "Διαθέσιμο υπόλοιπο", "error_title": "Δεν είναι δυνατή η ανάκτηση δεδομένων", "error_description": "Φαίνεται πως υπάρχει κάποιο πρόβλημα που εμποδίζει την προβολή του περιεχομένου αυτής της σελίδας. Ελέγξτε τη σύνδεσή σας ή δοκιμάστε να ανανεώσετε τη σελίδα.", "try_again": "Προσπαθήστε ξανά", - "limited_spending_warning": "Η πραγματική δυνατότητα δαπανών σας ενδέχεται να είναι περιορισμένη. Για να προσαρμόσετε το όριό σας, μεταβείτε στη {{manageCard}}", + "limited_spending_warning": "Η πραγματική δυνατότητα δαπανών σας ενδέχεται να είναι περιορισμένη. Για να προσαρμόσετε το όριό σας, μεταβείτε στη ", "add_funds": "Προσθήκη κεφαλαίων", "change_asset": "Αλλαγή περιουσιακού στοιχείου", "enable_card_button_label": "Ενεργοποίηση κάρτας", "enable_assets_button_label": "Ενεργοποιήστε τα περιουσιακά στοιχεία", "spending_limit_warning": "Έχετε σχεδόν φτάσει το όριο δαπανών σας. Ενημερώστε για να αποφύγετε απορρίψεις.", "logout": "Αποσύνδεση", - "logout_description": "Αποσυνδεθείτε από τον λογαριασμό σας στην MetaMask Card", "logout_confirmation_title": "Αποσύνδεση από την κάρτα;", "logout_confirmation_message": "Είστε σίγουροι ότι θέλετε να αποσυνδεθείτε από τον λογαριασμό σας στην MetaMask Card;", "logout_confirmation_cancel": "Άκυρο", "logout_confirmation_confirm": "Αποσύνδεση", "enable_card_error": "Αποτυχία ενεργοποίησης της κάρτας. Προσπαθήστε ξανά αργότερα.", + "view_card_details_error": "Unable to load card details. Please try again.", "warnings": { "close_spending_limit": { "title": "Έχετε σχεδόν φτάσει το όριο δαπανών σας", @@ -6706,11 +6812,21 @@ "blocked": { "title": "Η κάρτα σας είναι μπλοκαρισμένη", "description": "Επικοινωνήστε με την υποστήριξη για να ξεμπλοκάρετε την κάρτα σας" + }, + "kyc_pending": { + "title": "Επαλήθευση σε εξέλιξη", + "description": "Your identity verification is being reviewed. This typically takes less than 12 hours." + } + }, + "messages": { + "card_provisioning": { + "title": "Card being created", + "description": "Your card is being created. This may take a few moments." } }, "kyc_status": { "pending": { - "title": "Η επαλήθευση βρίσκεται σε εξέλιξη", + "title": "Επαλήθευση σε εξέλιξη", "description": "Η επαλήθευση της ταυτότητάς σας βρίσκεται σε εξέλιξη. Συνήθως χρειάζεται λίγα λεπτά. Παρακαλούμε ελέγξτε ξανά σύντομα για να ενεργοποιήσετε την κάρτα σας." }, "rejected": { @@ -6729,33 +6845,46 @@ "ok_button": "Εντάξει" }, "manage_card_options": { - "manage_spending_limit": "Διαχείριση ορίου δαπανών", + "view_card_details": "View card details", + "hide_card_details": "Hide card details", + "view_card_details_description": "Card number, expiration and CVV", + "manage_spending_limit": "Manage limit", "manage_spending_limit_description_restricted": "Ο περιορισμός συναλλαγών είναι ενεργός", "manage_spending_limit_description_full": "Η πλήρης πρόσβαση είναι ενεργή", "manage_card": "Διαχείριση κάρτας", - "advanced_card_management_description": "Δείτε λεπτομέρειες κάρτας, συναλλαγές και άλλα", + "advanced_card_management_description": "See activity, cashback, freeze card, and more", "travel_title": "MetaMask Travel", - "travel_description": "Κάντε κράτηση σε ξενοδοχεία με εκπτώσεις έως 60% σε σχέση με το Expedia", - "card_tos_title": "Όροι και Προϋποθέσεις της Κάρτας", - "card_tos_description": "Διαβάστε τους όρους του παρόχου της κάρτας" + "travel_description": "Book hotels with up to 70% discounts", + "card_tos_title": "Terms and conditions" } }, "card_spending_limit": { "title_change_token": "Αλλαγή token και δικτύου", "title_enable_token": "Ενεργοποίηση token", + "title_onboarding": "Ενεργοποίηση δαπανών", + "setup_title": "Set up your card", + "setup_description": "Select the token you'd like to use and set a limit for how much you can spend.", + "asset_label": "Περιουσιακό στοιχείο", + "limit_label": "Όριο", + "other_token": "Other", "full_access_title": "Πλήρης πρόσβαση", - "full_access_description": "Η κάρτα σας μπορεί να χρησιμοποιεί τα διαθέσιμα χρήματά σας αυτόματα, χωρίς να ζητά έγκριση κάθε φορά.", - "restricted_limit_title": "Περιορισμός δαπανών", - "restricted_limit_description": "Θα χρειαστεί να επιστρέψετε και να πληρώσετε τέλη δικτύου κάθε φορά που θέλετε να αυξήσετε το όριο.", + "full_access_description": "Your card can use your funds automatically without asking for approval each time.", + "restricted_limit_title": "Όριο δαπανών", + "restricted_limit_description": "Μπορείτε να ξοδέψετε μόνο έως αυτό το όριο. Θα καταβάλλετε τα τέλη δικτύου κάθε φορά που ενημερώνεται αυτό το όριο.", "edit_limit": "Επεξεργασία ορίου", "confirm_new_limit": "Επιβεβαίωση", "cancel": "Ακύρωση", + "skip": "Παράλειψη για τώρα", "set_new_limit": "Καθορίστε όριο", "dismiss": "Απόρριψη", "update_success": "Το όριο δαπανών ενημερώθηκε με επιτυχία", "update_error": "Απέτυχε η ενημέρωση του ορίου δαπανών", "solana_not_supported": "Ενεργοποιήστε τα tokens στη Solana στο card.metamask.io", - "select_token": "Επιλέξτε token" + "select_token": "Επιλέξτε token", + "loading": "Φόρτωση διαθέσιμων tokens...", + "load_error": "Δεν ήταν δυνατή η φόρτωση των tokens. Παρακαλούμε δοκιμάστε ξανά.", + "retry": "Προσπαθήστε ξανά", + "on_linea": "στο δίκτυο Linea" }, "change_asset": { "title": "Αλλαγή token και δικτύου", @@ -6793,6 +6922,7 @@ "signup_button": "Εγγραφή", "errors": { "invalid_credentials": "Μη έγκυρα στοιχεία σύνδεσης", + "invalid_otp_code": "Λανθασμένος κωδικός, παρακαλούμε δοκιμάστε ξανά", "unknown_error": "Άγνωστο σφάλμα, δοκιμάστε ξανά αργότερα", "email_required": "Το email είναι υποχρεωτικό", "password_required": "Ο κωδικός πρόσβασης είναι υποχρεωτικός", @@ -6811,7 +6941,7 @@ "description_without_phone_number": "Σας στείλαμε έναν κωδικό επιβεβαίωσης στο κινητό σας. Καταχωρήστε τον για να συνεχίσετε.", "confirm_code_label": "Κωδικός επιβεβαίωσης", "confirm_button": "Επιβεβαίωση", - "back_to_login_button": "Πίσω στην είσοδο", + "back_to_login_button": "Επιστροφή στη σύνδεση", "didnt_receive_code": "Δεν λάβατε τον κωδικό; ", "resend_verification": "Επαναποστολή", "resend_cooldown": "Η επαναποστολή θα είναι διαθέσιμη σε {{seconds}} δευτερόλεπτα" @@ -6839,8 +6969,8 @@ }, "rewards": { "auth_fail_title": "Άγνωστο σφάλμα.", - "auth_fail_description": "Παρουσιάστηκε άγνωστο σφάλμα κατά την ταυτοποίηση του λογαριασμού με το πρόγραμμα ανταμοιβών. Προσπαθήστε ξανά αργότερα.", - "failed_to_authenticate": "Η ταυτοποίηση με το πρόγραμμα ανταμοιβών απέτυχε", + "auth_fail_description": "Παρουσιάστηκε ένα άγνωστο σφάλμα κατά την ταυτοποίηση αυτού του λογαριασμού με το MetaMask Rewards. Προσπαθήστε ξανά αργότερα.", + "failed_to_authenticate": "Αποτυχία ταυτοποίησης με το MetaMask Rewards", "not_implemented": "Προσεχώς", "not_implemented_season_summary": "Η σύνοψη της περιόδου έρχεται σύντομα", "optin_error": { @@ -6867,6 +6997,10 @@ "error_fetching_description": "Ελέγξτε τη σύνδεσή σας και προσπαθήστε ξανά.", "retry_button": "Επανάληψη" }, + "linea_tokens": { + "default_title": "$LINEA", + "title_earned": "Κερδίσατε {{amount}} $LINEA" + }, "upcoming_rewards_error": { "error_fetching_title": "Δεν ήταν δυνατή η φόρτωση των ανταμοιβών", "error_fetching_description": "Ελέγξτε τη σύνδεσή σας και προσπαθήστε ξανά.", @@ -6898,6 +7032,15 @@ "claim_reward_error": { "title": "Η ενεργοποίηση της ανταμοιβής απέτυχε" }, + "metal_card_claim": { + "title": "Εξαργυρώστε την ανταμοιβή σας", + "description": "Η MetaMask Metal Card υπόκειται σε κριτήρια επιλεξιμότητας και δεν είναι διαθέσιμη σε όλες τις περιοχές. Εάν δεν πληροίτε τις προϋποθέσεις, θα λάβετε ως ανταμοιβή αποκλειστικά premium προϊόντα της εταιρείας.", + "contact_info": "Δώστε τα στοιχεία επικοινωνίας σας και θα λάβετε απάντηση εντός 2 εβδομάδων από τον @MidwitMilhouse στο Telegram ή από το christian.montoya@consensys.net.", + "email_label": "Email", + "email_validation_error": "Παρακαλούμε εισάγετε μια έγκυρη διεύθυνση email", + "telegram_label": "Όνομα χρήστη στο Telegram", + "telegram_placeholder": "Προαιρετικά" + }, "accounts_opt_in_state_error": { "error_fetching_title": "Δεν ήταν δυνατή η φόρτωση των λογαριασμών", "error_fetching_description": "Ελέγξτε τη σύνδεσή σας και προσπαθήστε ξανά.", @@ -6979,7 +7122,7 @@ "gtm_title": "Οι ανταμοιβές είναι εδώ", "gtm_description": "Κερδίστε πόντους με τη δραστηριότητά σας. \nΑνεβείτε επίπεδα για να ξεκλειδώσετε ανταμοιβές.", "gtm_confirm": "Ξεκινήστε", - "intro_title": "Η Σεζόν 1 \nξεκίνησε", + "intro_title": "Η Σεζόν 1\nείναι πλέον διαθέσιμη", "intro_description": "Κερδίστε πόντους με τη δραστηριότητά σας. \nΑνεβείτε επίπεδα για να ξεκλειδώσετε ανταμοιβές.", "intro_confirm": "Διεκδικήστε 250 πόντους", "intro_confirm_geo_loading": "Έλεγχος περιοχής…", @@ -7052,12 +7195,12 @@ "dashboard_modal_info": { "active_account": { "title": "Μην το χάσετε", - "description": "Προσθέστε τον λογαριασμό σας για να αρχίσετε να κερδίζετε πόντους από τη δραστηριότητά σας.", + "description": "Add your account to Rewards.", "confirm": "Προσθήκη λογαριασμού" }, "multiple_unlinked_accounts": { - "title": "Ξεκινήστε να κερδίζετε πόντους", - "description": "Προσθέστε τους λογαριασμούς σας για να παρακολουθείτε τις ανταμοιβές σας με μια ματιά.", + "title": "Μην το χάσετε", + "description": "Add your accounts to Rewards.", "confirm": "Προσθήκη λογαριασμών" }, "account_not_supported": { @@ -7110,10 +7253,10 @@ } }, "predict": { - "title": "Αγορές προβλέψεων", + "title": "Προβλέψεις", "description": "20 πόντοι για κάθε πρόβλεψη αξίας $10", "sheet": { - "title": "Αγορές προβλέψεων", + "title": "Προβλέψεις", "points": "20 πόντοι ανά $10", "description": "Κερδίστε πόντους σε κάθε συναλλαγή των $10.", "cta_label": "Περιήγηση στις πλατφόρμες" @@ -7191,6 +7334,19 @@ "time_left": "απομένει", "expired": "Έληξε" }, + "end_of_season_rewards": { + "confirm_label_default": "Επιβεβαίωση", + "confirm_label_access": "Πρόσβαση", + "redeem_success_title": "Η ανταμοιβή εξαργυρώθηκε", + "metal_card_claim_success": "Τα στοιχεία επικοινωνίας επιβεβαιώθηκαν", + "linea_tokens_claim_success": "Η διεύθυνση επιβεβαιώθηκε", + "arriving_soon": "Έρχεται σύντομα", + "check_back_soon": "Ελέγξτε ξανά σύντομα για να διεκδικήσετε", + "redeem_failure_title": "Η εξαργύρωση απέτυχε", + "redeem_failure_description": "Παρακαλούμε δοκιμάστε ξανά αργότερα.", + "reward_details": "Λεπτομέρειες Ανταμοιβών", + "select_account_description": "Επιλέξτε τον λογαριασμό στον οποίο θέλετε να σταλεί αυτή η ανταμοιβή. Τα tokens θα διανεμηθούν μέσα σε δύο εβδομάδες." + }, "animation": { "could_not_load": "Δεν ήταν δυνατή η φόρτωση" } @@ -7257,13 +7413,13 @@ "still_connecting_network": "Ακόμη γίνεται σύνδεση με το {{networkName}}...", "unable_to_connect_network": "Δεν είναι δυνατή η σύνδεση με το {{networkName}}.", "update_rpc": "Ενημέρωση RPC", + "switch_to_metamask_default_rpc": "Switch to MetaMask default RPC", "check_network_connectivity": "Ελέγξτε τη σύνδεση δικτύου σας.", - "check_network_connectivity_or": "Ελέγξτε τη σύνδεση δικτύου σας ή" + "check_network_connectivity_or": "Ελέγξτε τη σύνδεση δικτύου σας ή", + "updated_to_metamask_default": "Updated to MetaMask default" }, "trending": { "title": "Explore", - "view_all": "View all", - "tokens": "Token", "trending_tokens": "Trending tokens", "price_change": "Price change", "all_networks": "Όλα τα δίκτυα", @@ -7295,6 +7451,10 @@ "title": "Trending tokens is not available", "description": "We can't fetch this page right now", "try_again": "Προσπαθήστε ξανά" + }, + "empty_search_result_state": { + "title": "Δεν βρέθηκαν token", + "description": "We were not able to find this token" } }, "ota_update_modal": { diff --git a/locales/languages/es.json b/locales/languages/es.json index 958249337c5e..b3d2b774a50c 100644 --- a/locales/languages/es.json +++ b/locales/languages/es.json @@ -8,7 +8,7 @@ "increment": "Incrementar contador de Redux" }, "pet_name": { - "list_count_text": "Pet names on this network", + "list_count_text": "Nombres de mascotas en esta red", "add_pet_name_button": "Add pet name", "address": "Dirección", "address_placeholder": "0x...", @@ -193,11 +193,10 @@ "connector": "en" }, "autocomplete": { - "placeholder": "Buscar por token, sitio o dirección", + "placeholder": "Búsqueda por sitio o dirección", "recents": "Recientes", "favorites": "Favoritos", - "sites": "Sitios", - "tokens": "Tokens" + "sites": "Sitios" }, "navigation": { "back": "Volver", @@ -306,7 +305,7 @@ "get_started": "Comenzar" }, "onboarding_wizard": { - "skip_tutorial": "Skip tutorial", + "skip_tutorial": "Omitir tutorial", "coachmark": { "action_back": "No, gracias", "action_next": "Tomar el recorrido", @@ -330,12 +329,12 @@ "content3": "ahora para editar el nombre de la cuenta." }, "step4": { - "title": "Main menu", - "content1": "Puede acceder al Historial de transacciones, Configuración y Soporte desde este menú.", + "title": "Menú principal", + "content1": "Puedes acceder al historial de transacciones, configuración y soporte desde este menú.", "content2": "Puede hacer más acciones con sus cuentas y acceder a la configuración de MetaMask." }, "step5": { - "title": "Explorador el explorador", + "title": "Explorar el navegador", "content1": "Puede explorar Web3 con el explorador" }, "step6": { @@ -596,9 +595,9 @@ "transaction_activity": "Actividad", "request_feature": "Solicitar una función", "submit_feedback_message": "Elija el tipo de comentarios que se va a enviar.", - "submit_bug": "Bug report", + "submit_bug": "Informe de errores", "submit_general_feedback": "General", - "share_address": "Share my public address", + "share_address": "Compartir mi dirección pública", "view_in_etherscan": "Ver en Etherscan", "view_in": "Ver en", "browser": "Explorador", @@ -612,12 +611,13 @@ "lock_cancel": "NO", "feedback": "Comentarios", "metamask_support": "el equipo de soporte de MetaMask", - "public_address": "Public address" + "public_address": "Dirección pública" }, "send": { "available": "disponible", "invalid_value": "Valor no válido", "insufficient_funds": "Fondos insuficientes", + "insufficient_balance_to_cover_fee": "Insufficient balance to cover fees", "continue": "Continuar", "unit": "unidad", "units": "unidades", @@ -643,8 +643,8 @@ "no_tokens_available": "No hay tokens disponibles", "sign": "Firmar", "network_not_found_title": "No se encontró la red", - "network_not_found_description": "La red con ID de cadena {{chain_id}} no se encontró en su monedero. Instale primero la red.", - "network_missing_id": "Falta la identificación en la cadena.", + "network_not_found_description": "Network with chain ID {{chain_id}} not found in your wallet. Please add the network first.", + "network_missing_id": "Missing chain ID.", "search_tokens": "Buscar tokens", "search_tokens_and_nfts": "Buscar tokens y NFT", "tokens": "Tokens", @@ -680,8 +680,8 @@ "search_by_name_or_address": "Buscar token por nombre o dirección", "no_tokens_found": "No se encontraron tokens que coincidan con “{{searchString}}\"", "unsupported_token_title": "No disponible", - "unsupported_token_description": "This token may not be available in your region or supported by any local payment providers", - "error_loading_tokens": "Unable to load tokens. Please try again later." + "unsupported_token_description": "Es posible que este token no esté disponible en tu región o que no sea compatible con proveedores de pago locales", + "error_loading_tokens": "No se pueden cargar los tokens. Inténtalo de nuevo más tarde." }, "networks_filter_bar": { "all_networks": "Todas las redes" @@ -696,12 +696,12 @@ "title": "Configuración", "view_order_history": "Ver historial de órdenes", "contact_support": "Contactar a soporte", - "log_out": "Log out of Transak", + "log_out": "Cerrar sesión en Transak", "logged_out_success": "La sesión se cerró correctamente", "error_sdk_not_initialized": "SDK no iniciado", "logged_out_error": "Error al cerrar sesión", - "more_ways_to_buy": "More ways to buy", - "more_ways_to_buy_description": "Switch to the classic version" + "more_ways_to_buy": "Más formas de comprar", + "more_ways_to_buy_description": "Cambiar a la versión clásica" }, "region_modal": { "select_a_region": "Selecciona una región", @@ -714,7 +714,7 @@ "no_state_results": "No se encontraron estados que coincidan con “{{searchString}}\"" }, "payment_modal": { - "select_a_payment_method": "Select a payment method" + "select_a_payment_method": "Selecciona un método de pago" }, "payment_duration": { "instant": "Instantáneo", @@ -805,7 +805,7 @@ "button": "Aceptar y continuar" }, "additional_verification": { - "title": "Additional verification", + "title": "Verificación adicional", "paragraph_1": "Para depósitos más grandes, necesitarás una identificación válida (como una licencia de conducir) y una selfie en tiempo real.", "paragraph_2": "Para completar tu verificación, deberás habilitar el acceso a tu cámara.", "button": "Continuar" @@ -832,7 +832,7 @@ "dob_invalid": "Ingresa una fecha de nacimiento válida", "ssn_required": "Se requiere un número de seguro social", "unexpected_error": "Ocurrió un error inesperado. Inténtalo de nuevo.", - "phone_already_registered": "This phone number is already in use by {{email}}. Log in using this email to continue.", + "phone_already_registered": "{{email}} ya usa este número de teléfono. Inicia sesión con este correo electrónico para continuar.", "login_with_email": "Iniciar sesión con correo electrónico" }, "enter_address": { @@ -844,7 +844,7 @@ "address_line_2": "Línea de dirección 2 (opcional)", "state": "Estado/Región", "city": "Ciudad", - "postal_code": "Postal/zip code", + "postal_code": "Código postal", "country": "País", "select_state": "Seleccionar el estado", "address_line_1_required": "Se requiere la línea de dirección 1", @@ -854,7 +854,7 @@ "city_invalid": "Ingresa una ciudad válida", "state_required": "Se requiere el estado/región", "state_invalid": "Ingresa un estado válido", - "postal_code_required": "Postal/zip code is required", + "postal_code_required": "Se requiere el código postal", "postal_code_invalid": "Ingresa un código postal válido", "unexpected_error": "Error inesperado." }, @@ -903,7 +903,7 @@ "cancel_order_button": "Cancelar orden" }, "order_details": { - "title": "Deposit order", + "title": "Orden de depósito", "error_title": "Hubo un error con tu orden de depósito", "error_message": "Ocurrió un error inesperado." }, @@ -946,7 +946,7 @@ }, "error_view": { "title": "Hubo un error", - "description": "Hubo un error al procesar tu depósito. comunícate con el equipo de soporte si el problema persiste.", + "description": "Se produjo un error al procesar tu depósito. Comunícate con el equipo de soporte si el problema continúa.", "try_again": "Inténtalo de nuevo" }, "errors": { @@ -955,14 +955,14 @@ "fetch_payment_methods": "Hubo un problema al obtener los métodos de pago.", "fetch_user_details": "Hubo un problema al obtener los datos del usuario.", "try_again": "Inténtalo de nuevo", - "error_details_title": "Error details", + "error_details_title": "Detalles del error", "see_more": "Ver más" } }, "perps": { - "basic_functionality_disabled_title": "Perps is not available", + "basic_functionality_disabled_title": "Perps no está disponible", "title": "Perps", - "perps_trading": "Operaciones con contratos perpetuos", + "perps_trading": "Trading con contratos perpetuos", "perp_account_balance": "Saldo de contratos perpetuos", "manage_balance": "Administrar saldo", "total_balance": "Saldo total", @@ -974,6 +974,10 @@ "not_now": "Ahora no", "try_now": "Comenzar" }, + "discovery_banner": { + "title": "Opera con contratos perpetuos de {{symbol}}", + "subtitle": "Multiplica tus pérdidas y ganancias hasta {{leverage}}" + }, "today": "Hoy", "yesterday": "Ayer", "unrealized_pnl": "P&L no realizado", @@ -1199,7 +1203,7 @@ "short": "{{asset}} corto" }, "tpsl_modal": { - "title": "Toma de ganancias y Límite de pérdidas", + "title": "Toma de ganancias y límite de pérdidas", "save": "Guardar", "current_price": "Precio actual: {{price}}", "on": "ACTIVADO", @@ -1414,6 +1418,7 @@ "failedToEstablishAllMids": "Error al establecer la suscripción global a allMids", "failedToEstablishMarketData": "Error al establecer la suscripción a datos de mercado para {{symbol}}", "failed_to_toggle_network": "Error al alternar la red", + "failed_to_switch_provider": "Error al cambiar de proveedor", "noAccountSelected": "No hay ninguna cuenta seleccionada", "unsupportedMethod": "Método no compatible: {{method}}", "invalidAddressFormat": "Formato de dirección no válido: {{address}}", @@ -1452,6 +1457,24 @@ "orderLeverageReductionFailed": "No puedes reducir tu apalancamiento", "insufficientLiquidity": "Liquidez insuficiente para ejecutar la orden. Intenta usar una orden límite o vuelve a intentarlo en unos momentos.", "connectionTimeout": "Se agotó el tiempo de conexión. Verifica tu red y vuelve a intentarlo.", + "clientReinitializing": "El servicio se está reiniciando. Espera un momento e inténtalo de nuevo.", + "transferFailed": "No se pueden transferir fondos. Inténtalo de nuevo.", + "swapFailed": "No se pueden canjear tokens. Inténtalo de nuevo.", + "spotPairNotFound": "El par de trading no está disponible en este momento.", + "priceUnavailable": "Los datos de precios no están disponibles. Actualiza la página e inténtalo de nuevo.", + "batchCancelFailed": "No se pudieron cancelar algunas órdenes. Inténtalo de nuevo.", + "batchCloseFailed": "No se pudieron cerrar algunas posiciones. Inténtalo de nuevo.", + "insufficientMargin": "Margen insuficiente para ejecutar esta operación. Considera la posibilidad de añadir más fondos o reducir el tamaño de tu posición.", + "reduceOnlyViolation": "Esta orden aumentaría tu posición. Únicamente se permiten órdenes de solo reducción.", + "positionWouldFlip": "Esta orden cambiaría la dirección de tu posición. Cierra primero tu posición actual.", + "marginAdjustmentFailed": "No se puede ajustar el margen. Inténtalo de nuevo.", + "tpslUpdateFailed": "No se puede actualizar toma de ganancias/límite de pérdidas. Inténtalo de nuevo.", + "orderRejected": "Se rechazó la orden. Comprueba tus parámetros e inténtalo de nuevo.", + "slippageExceeded": "El precio varió demasiado. Intenta usar una orden límiteo aumenta la tolerancia al deslizamiento.", + "rateLimitExceeded": "Demasiadas solicitudes. Espera un momento e inténtalo de nuevo.", + "serviceUnavailable": "El servicio no está disponible temporalmente. Vuelve a intentarlo más tarde.", + "networkErrorSimple": "Se produjo un error de red. Comprueba tu conexión e inténtalo de nuevo.", + "insufficientBalance": "Saldo insuficiente para realizar esta operación. Comprueba tus fondos disponibles.", "connectionFailed": { "title": "No se pudo conectar a los contratos perpetuos", "description": "Estamos trabajando para que vuelva a estar en línea pronto.", @@ -1521,7 +1544,7 @@ "total_balance": "Saldo total", "available_balance": "Saldo disponible", "margin_used": "Margen utilizado", - "total_unrealized_pnl": "P&L total no realizado", + "total_unrealized_pnl": "Pérdidas y ganancias totales no realizadas", "unrealized_pnl": "P&L no realizado" }, "tpsl": { @@ -1697,7 +1720,14 @@ "retry_connection": "Reintentar la conexión", "retrying_connection": "Conectando...", "connecting_to_perps": "Conectándose a Perps", - "timeout_title": "La conexión tarda más de lo esperado" + "timeout_title": "La conexión tarda más de lo esperado", + "websocket_disconnected": "Tu conexión está desactivada.", + "websocket_disconnected_message": "Es posible que los datos no estén actualizados.", + "websocket_connecting": "Conectándose a contratos perpetuos...", + "websocket_connecting_message": "Restaurando la conexión... Intento {{attempt}}", + "websocket_connected": "Conectado", + "websocket_connected_message": "Las actualizaciones de datos en tiempo real se reanudaron", + "websocket_retry": "Reintentar" }, "chart": { "no_data": "No hay datos gráficos disponibles", @@ -1754,6 +1784,9 @@ "title": "Contactar a soporte", "description": "Ponte en contacto con el soporte de MetaMask para obtener ayuda" }, + "feedback": { + "title": "Envíanos tus comentarios" + }, "close_all_modal": { "title": "Cerrar todas las posiciones", "description": "Cerraremos todas tus posiciones abiertas al precio de mercado actual.", @@ -1806,7 +1839,11 @@ "price_change_low_to_high": "Variación de precio: de mínimo a máximo", "past_hour": "Última hora", "past_24_hours": "Últimas 24 horas", - "time": "Hora" + "time": "Hora", + "apply": "Aplicar" + }, + "market_type": { + "filter_by": "Filtrar por" }, "perps_markets": "Mercados de contratos perpetuos", "volume": "Volumen", @@ -1823,6 +1860,7 @@ "mainnet": "Red principal", "developer_options": { "hyperliquid_network_toggle": "Alternar red de Hyperliquid", + "provider_mode_toggle": "Modo proveedor", "simulate_connection_error": "Simular error de conexión" }, "transactions": { @@ -1942,7 +1980,7 @@ } }, "predict": { - "title": "Predicción de MetaMask", + "title": "Predicciones de MetaMask", "prediction_markets": "Mercados de predicción", "market_list": "Lista de mercado", "loading": "Cargando…", @@ -1981,7 +2019,8 @@ "fee_exemption": "No cobramos tarifas en este mercado.", "ended": "Finalizado", "resolved_early": "Resuelto anticipadamente", - "disclaimer": "Esta información puede estar incompleta. Todas las reglas del mercado, criterios de resolución y resultados finales se rigen únicamente por Polymarket. Las operaciones deben realizarse según las reglas completas disponibles en Polymarket." + "disclaimer": "Esta información puede estar incompleta. Todas las reglas del mercado, criterios de resolución y resultados finales se rigen únicamente por Polymarket. Las operaciones deben realizarse según las reglas completas disponibles en Polymarket.", + "your_picks": "Tus selecciones" }, "tab": { "no_predictions_description": "Tus predicciones aparecerán aquí, mostrando tu apuesta y el movimiento del mercado.", @@ -2001,6 +2040,8 @@ "cashout_info": "{{amount}} por {{outcome}} a {{initialPrice}}", "cashout_info_multiple": "{{amount}} en {{outcomeGroupTitle}} • {{outcome}} a {{initialPrice}}", "position_info": "{{initialValue}} en {{outcome}} para ganar {{shares}}", + "position_pick_info": "{{initialValue}} en {{outcome}}", + "position_pick_info_to_win": "{{initialValue}} en {{outcome}} para ganar", "buy_yes": "Sí", "buy_no": "No", "outcomes": "resultados", @@ -2035,6 +2076,7 @@ "won_markets_text": "Ganaron {{count}} mercado{{s}}", "available_balance": "Saldo disponible", "claim_amount_text": "Reclamar ${{amount}}", + "claim_winnings_text": "Reclama tus ganancias", "unrealized_pnl_label": "P&L no realizado", "unrealized_pnl_value": "{{amount}} ({{percent}})", "unrealized_pnl_error": "No se puede cargar", @@ -2173,6 +2215,15 @@ "order_not_fully_filled": "Error al completar tu orden", "buy_order_not_fully_filled": "No hay suficientes acciones disponibles al precio de mercado para colocar tu orden en este momento.", "sell_order_not_fully_filled": "No hay suficiente demanda al precio de mercado para cobrar en este momento." + }, + "game_details_footer": { + "pick_a_winner": "Elige un ganador", + "volume_display": "Vol de ${{volume}}", + "read_terms": "Lee los términos y condiciones completos del contrato" + }, + "sports": { + "halftime": "Medio tiempo", + "final": "Final" } }, "receive": { @@ -2290,7 +2341,7 @@ "add_funds": "Agregar fondos", "next": "Siguiente", "buy_asset": "Comprar {{asset}}", - "no_tokens": "No tiene ningún token.", + "no_tokens": "You don't have any tokens", "show_tokens_without_balance": "Mostrar tokens sin saldo", "nfts_autodetection_title": "Detección de NFT", "nfts_autodetection_desc": "Deje que MetaMask detecte y muestre automáticamente los NFT en su monedero.", @@ -2303,7 +2354,7 @@ "target_scam_network": "lo que los convierte en blanco de estafas. Los estafadores pueden engañarlo para que les envíe dinero más valioso a cambio. Verifique todo antes de continuar.", "use_the_currency_symbol": "utiliza el símbolo de moneda", "use_correct_symbol": "Asegúrese de estar utilizando el símbolo correcto antes de continuar", - "chain_id_currently_used": "Esta ID de cadena es utilizada actualmente por el", + "chain_id_currently_used": "This chain ID is currently used by the", "incorrect_network_name_warning": "Según nuestros registros, es posible que el nombre de la red no coincida correctamente con este ID de cadena.", "suggested_name": "Nombre sugerido:", "network_check_validation_desc": "reduce las posibilidades de conectarse a una red maliciosa o incorrecta.", @@ -2314,7 +2365,7 @@ "nft_empty_description": "Hay un mundo de NFT disponible. Empieza tu colección hoy mismo.", "tokens_empty_description": "Nothing to see yet. Why not browse tokens or make a trade?", "discover_nfts": "Importar NFT", - "no_transactions": "No tiene transacciones.", + "no_transactions": "You have no transactions", "switch_network_to_view_transactions": "Cambie de red para ver las transacciones", "send_button": "Enviar", "deposit_button": "Depósito", @@ -2362,6 +2413,7 @@ "network_fee": "Tarifa de red", "lists": "Token lists", "hide_cta": "Ocultar token", + "perps_trading": "Trading con contratos perpetuos", "options": { "title": "Token options", "view_on_portfolio": "Ver en Portfolio", @@ -2409,8 +2461,8 @@ "add_token": "IMPORTAR" }, "collectibles": { - "cancel_add_collectible": "CANCELAR", - "add_collectible": "IMPORTAR" + "cancel_add_collectible": "Cancelar", + "add_collectible": "Importar" }, "banners": { "search_desc": "La detección mejorada de tokens está disponible actualmente en la red {{network}}. ", @@ -2521,18 +2573,20 @@ "billion_abbreviation": "B", "trillion_abbreviation": "T", "million_abbreviation": "M", + "thousand_abbreviation": "K", "token_details": "Detalles del token", "contract_address": "Dirección del contrato", "token_list": "Lista de tokens", "market_details": "Detalles del mercado", "market_cap": "Market cap", "total_volume": "Total volume (24h)", - "volume_to_marketcap": "Volume / market cap", + "volume_to_marketcap": "Volume / Market cap", "circulating_supply": "Suministro circulante", "all_time_high": "Punto más alto", "all_time_low": "Punto más bajo", "fully_diluted": "Totalmente diluido", - "unknown": "Desconocida" + "unknown": "Desconocida", + "stock": "Stock" }, "collectible": { "collectible_address": "Dirección", @@ -2583,7 +2637,7 @@ "remove_snap_account": "Eliminar cuenta Snap", "remove_snap_account_alert_description": "Esta cuenta se eliminará de su billetera. Antes de continuar, asegúrese de que dispone de la frase secreta de recuperación original o de la clave privada de esta cuenta importada. Puede importar o volver a crear cuentas desde el menú desplegable de cuentas.", "remove_account_alert_remove_btn": "Eliminar", - "remove_account_alert_cancel_btn": "No es importante", + "remove_account_alert_cancel_btn": "Never mind", "accounts_title": "Cuentas", "connect_account_title": "Conectar cuenta", "connect_accounts_title": "Conectar cuentas", @@ -2620,7 +2674,7 @@ "advisory_by": "Aviso proporcionado por Ethereum Phishing Detector y PhishFort", "potential_threat": "Las amenazas potenciales incluyen", "fake_metamask": "Versiones falsas de MetaMask", - "srp_theft": "Robo de frase secreta de recuperación o contraseña", + "srp_theft": "Secret Recovery Phrase or password theft", "malicious_transactions": "Transacciones maliciosas que resultan en activos robados", "secret_recovery_phrase": "Frase secreta de recuperación", "account_name": "Nombre de la cuenta", @@ -2675,8 +2729,8 @@ }, "connect_qr_hardware": { "title": "Conectar un monedero físico basado en QR", - "description1": "Conectar un monedero físico aislado de la red que se comunique a través de códigos QR.", - "description2": "Cómo funciona?", + "description1": "Connect an airgapped hardware wallet that communicates through QR codes.", + "description2": "Cómo funciona", "description3": "Lss monederos físicos aislados de la red con soporte oficial incluyen:", "keystone": "Keystone", "ngravezero": "Ngrave Zero", @@ -2693,7 +2747,7 @@ "select_accounts": "Seleccionar una cuenta" }, "data_collection_modal": { - "accept": "De acuerdo", + "accept": "OK", "content": "Desactivó la recopilación de datos para nuestros fines de marketing. Esto solo se aplica a este dispositivo. Si utiliza MetaMask en otros dispositivos, asegúrese de desactivarlo allí también." }, "account_selector": { @@ -2717,14 +2771,14 @@ "select_rpc_url": "Seleccionar URL de RPC", "title": "Configuración", "current_conversion": "Moneda base", - "current_language": "Current language", + "current_language": "Idioma actual", "ipfs_gateway": "Puerta de enlace de IPFS", "ipfs_gateway_content": "MetaMask utiliza servicios de terceros para mostrar imágenes de sus NFT almacenados en IPFS, mostrar información relacionada con las direcciones ENS ingresadas en la barra de direcciones de su navegador y obtener íconos para diferentes tokens. Su dirección IP puede estar expuesta a estos servicios cuando los está utilizando.", "ipfs_gateway_down": "La puerta de enlace de IPFS actual está inactiva", "ipfs_gateway_desc": "Elija la puerta de enlace de IPFS de su preferencia.", - "search_engine": "Search engine", + "search_engine": "Motor de búsqueda", "new_RPC_URL": "Nueva red RPC", - "state_logs": "State logs", + "state_logs": "Registros de estado", "add_network_title": "Agregar una red", "auto_lock": "Bloqueo automático", "auto_lock_desc": "Elija la cantidad de tiempo antes de que la aplicación se bloquee automáticamente.", @@ -2733,15 +2787,15 @@ "autolock_never": "Nunca", "autolock_after": "Después de {{time}} segundos", "autolock_after_minutes": "Después de {{time}} minutos", - "reveal_seed_words": "Reveal seed words", - "reset_account": "Reset account", - "state_logs_button": "Download state logs", + "reveal_seed_words": "Revelar palabras de recuperación", + "reset_account": "Restablecer cuenta", + "state_logs_button": "Descargar registros de estado", "reveal_seed_words_button": "REVELAR PALABRAS DE RECUPERACIÓN", - "reset_account_button": "Reset account", + "reset_account_button": "Restablecer cuenta", "reset_account_confirm_button": "Sí, restablecer", "reset_account_cancel_button": "Cancelar", - "reset_account_modal_title": "Reset account?", - "clear_approvals_modal_title": "Clear approval data?", + "reset_account_modal_title": "¿Restablecer cuenta?", + "clear_approvals_modal_title": "¿Borrar datos de aprobación?", "clear_approvals_modal_message": "Todas las dapps necesitará solicitar acceso para ver nuevamente la información de la cuenta.", "clear_browser_history_modal_title": "¿Borrar historial del explorador?", "clear_browser_history_modal_message": "Estamos a punto de quitar todo el historial del explorador. ¿Está seguro?", @@ -2763,7 +2817,7 @@ "protect_title": "Recuperación de billetera", "banner_social_login_enabled": "Iniciar sesión con {{authConnection}}", "manage_recovery_method": "Administrar métodos de recuperación", - "video_failed": "Video failed to load.", + "video_failed": "Error al cargar el video.", "protect_desc": "Haz una copia de respaldo de tu frase secreta de recuperación para no perder nunca el acceso a tu billetera. Asegúrate de guardarla en un lugar seguro al que solo tú puedas acceder y que no olvides", "protect_desc_no_backup": "Esta es la frase de 12 palabras de su monedero. Esta frase se puede usar para tomar el control de todas sus cuentas actuales y futuras, incluida la capacidad de enviar fondos desde su monedero. Mantenga esta frase guardada de forma segura, NO la comparta con nadie. MetaMask no puede ayudarlo a recuperar esta clave.", "learn_more": "Obtenga más información.", @@ -2782,9 +2836,9 @@ "show_fiat_on_testnets_desc": "Seleccione esta opción para mostrar la conversión de moneda fiduciaria en las redes de prueba.", "show_fiat_on_testnets_modal_title": "Sea cuidadoso", "show_fiat_on_testnets_modal_description": "Si le pidieron que active esta función, es posible que lo estén estafando. Estos tokenes no tienen valor monetario y son solo para fines de prueba. Esta función ayuda a los desarrolladores a asegurarse de que sus aplicaciones funcionen.", - "show_fiat_on_testnets_modal_learn_more": "Obtenga más información.", + "show_fiat_on_testnets_modal_learn_more": "Conozca más", "show_fiat_on_testnets_modal_button": "Continuar", - "show_hex_data": "Show hex data", + "show_hex_data": "Mostrar datos hexadecimales", "show_hex_data_desc": "Seleccione esta opción para mostrar el campo de datos hexadecimales en la pantalla de envío.", "accounts_identicon_title": "Ícono de cuenta", "accounts_identicon_desc": "Elige entre tres estilos diferentes de íconos únicos que pueden ayudarte a identificar cuentas rápidamente.", @@ -2793,7 +2847,7 @@ "general_title": "General", "general_desc": "Conversión de moneda, moneda principal, idioma y motor de búsqueda.", "advanced_title": "Avanzado", - "advanced_desc": "Acceder a recursos para desarrolladores, restablecer cuenta, configurar redes de prueba, registros de estado, puerta de enlace de IPFS y RPC personalizada.", + "advanced_desc": "Accede a funciones para desarrolladores, restablece la cuenta, configura redes de prueba, registros de estado, puerta de enlace IPFS y RPC personalizada.", "notifications_title": "Notificaciones", "notifications_desc": "Administre sus notificaciones", "allow_notifications": "Permitir notificaciones", @@ -2804,9 +2858,9 @@ "customize_session_desc": "Active los tipos de notificaciones que desea recibir:", "account_session_title": "Actividad de la cuenta", "account_session_desc": "Seleccione las cuentas sobre las que desea recibir notificaciones:", - "assets_sent_title": "Assets sent", + "assets_sent_title": "Activos enviados", "assets_sent_desc": "Fondos y NFT", - "assets_received_title": "Assets received", + "assets_received_title": "Activos recibidos", "assets_received_desc": "Fondos y NFT", "defi_title": "DeFi", "defi_desc": "Staking, canjeando y puenteando", @@ -2826,14 +2880,14 @@ "back": "Volver", "security_desc": "Configuración de privacidad, MetaMetrics, clave privada y frase secreta de recuperación.", "networks_title": "Redes", - "networks_default_title": "Default network", + "networks_default_title": "Red predeterminada", "network_delete": "Si elimina esta red, deberá volver a agregarla para ver sus activos en esta red", "networks_default_cta": "Usar esta red", "add_rpc_url": "Agregar URL de RPC", - "add_block_explorer_url": "Agregar URL del explorador de bloques", + "add_block_explorer_url": "Añadir URL del explorador de bloques", "networks_desc": "Agregar y editar redes RPC personalizadas", - "network_name_label": "Network name", - "network_name_placeholder": "Network name (optional)", + "network_name_label": "Nombre de la red", + "network_name_placeholder": "Nombre de la red (opcional)", "network_rpc_url_label": "URL de RPC", "network_rpc_name_label": "Nombre de RPC", "network_rpc_placeholder": "Nueva red RPC", @@ -2843,11 +2897,11 @@ "network_chain_id_placeholder": "ID de cadena", "network_symbol_label": "Símbolo", "network_block_explorer_label": "Dirección URL del explorador de bloques", - "network_block_explorer_placeholder": "Dirección URL del explorador de bloques (opcional)", - "network_chain_id_warning": "Identificador de cadena no válido", - "network_other_networks": "Other networks", + "network_block_explorer_placeholder": "URL del explorador de bloques (opcional)", + "network_chain_id_warning": "ID de cadena no válida", + "network_other_networks": "Otras redes", "network_rpc_networks": "Redes RPC", - "network_add_network": "Add network", + "network_add_network": "Añadir red", "network_add_custom_network": "Agregar una red personalizada", "network_add": "Agregar", "network_save": "Guardar", @@ -2862,7 +2916,7 @@ "legal_title": "Legal", "conversion_title": "Conversión de moneda", "conversion_desc": "Muestre los valores fiduciarios con una moneda específica en toda la aplicación", - "primary_currency_title": "Primary currency", + "primary_currency_title": "Moneda principal", "primary_currency_desc": "Seleccione Nativa para dar prioridad a mostrar los valores en la moneda nativa de la cadena (p. ej., ETH). Seleccione Fiduciaria para dar prioridad a mostrar los valores en la moneda fiduciaria seleccionada.", "primary_currency_text_first": "Nativa", "primary_currency_text_second": "Fiduciaria", @@ -2883,7 +2937,7 @@ "batch_balance_requests_description": "Reciba actualizaciones de saldo de todas sus cuentas a la vez. Si desactiva esta función, es menos probable que otras personas asocien una cuenta con otra.", "third_party_title": "Obtener transacciones entrantes", "third_party_description": "Las API de terceros (Etherscan) se usan para mostrar las transacciones entrantes en el historial. Desactive esta opción si no quiere que extraigamos datos provenientes de esos servicios.", - "metametrics_opt_out": "Desactivar MetaMetrics", + "metametrics_opt_out": "desactivar MetaMetrics", "metametrics_restart_required": "Debe reiniciar la aplicación para que los cambios surtan efecto.", "create_password": "Crear una contraseña", "invalid_password": "Contraseña no válida", @@ -2899,11 +2953,11 @@ "invalid_number": "Número no válido. Escriba un número decimal o un número hexadecimal con el prefijo “0x”.", "invalid_number_leading_zeros": "Número no válido. Quite todos los ceros iniciales.", "invalid_number_range": "Número no válido. Escriba un número entre 1 y %{maxSafeChainId}.", - "hide_zero_balance_tokens_title": "Hide tokens without balance", + "hide_zero_balance_tokens_title": "Ocultar tokens sin saldo", "hide_zero_balance_tokens_desc": "Al ocultar los tokens sin saldo, estos no aparecerán en su lista de tokens.", "token_detection_title": "Detectar tókenes automáticamente", "token_detection_description": "Usamos API de terceros para detectar y mostrar nuevos tokens enviados a su monedero. Desactívelo si no desea que la aplicación extraiga datos de esos servicios.", - "theme_button_text": "Change theme", + "theme_button_text": "Cambiar tema", "theme_title": "Tema ({{theme}})", "theme_description": "Cambie la apariencia de su aplicación configurando el tema.", "theme_os": "Sistema", @@ -2935,20 +2989,20 @@ "delete_metrics_description_after_delete_part_two": ". Este proceso puede tardar hasta 30 días. Consulte nuestra", "delete_metrics_description_privacy_policy": "Política de privacidad.", "delete_metrics_button": "Eliminar datos de MetaMetrics", - "check_status_button": "Check status", + "check_status_button": "Comprobar estado", "delete_metrics_confirm_modal_title": "Eliminar datos de MetaMetrics?", "delete_metrics_confirm_modal_description": "Estamos a punto de eliminar todos sus datos de MetaMetrics. ¿Está seguro?", "delete_wallet_data_title": "Restablecer billetera", "delete_wallet_data_description": "Esto eliminará de su dispositivo todos los datos relacionados con el monedero. Sus cuentas existen en la cadena de bloques y no están relacionadas con MetaMask. Siempre puede recuperar sus cuentas usando su frase secreta de recuperación.", "delete_wallet_data_button": "Restablecer billetera", - "delete_data_status_title": "Deletion task status", + "delete_data_status_title": "Estado de la tarea de eliminación", "delete_data_status_description": "El estado actual es", "delete_metrics_error_title": "No pudimos eliminar estos datos en este momento.", "delete_metrics_error_description": "Esta solicitud no se puede completar en este momento debido a un problema con el servidor del sistema de análisis. Por favor, vuelva a intentarlo más tarde.", "ok": "OK", - "clear_sdk_connections_title": "Borrar todas las conexiones SDK de MetaMask", + "clear_sdk_connections_title": "Borrar todas las conexiones de MetaMask SDK", "clear_sdk_connections_text": "Todas las conexiones se borrarán y las dapps deberán solicitar la conexión nuevamente", - "sdk_connections": "Conexiones SDK de MetaMask", + "sdk_connections": "Conexiones de MetaMask SDK", "manage_sdk_connections_title": "Administrar conexiones", "manage_sdk_connections_text": "Eliminar conexiones a sitios y/o SDK de MetaMask.", "fiat_on_ramp": { @@ -2956,6 +3010,7 @@ "description": "Región y más...", "current_region": "Región actual", "reset_region": "Restablecer región", + "change_region": "Cambiar región", "no_region_selected": "Ninguna región seleccionada", "sdk_activation_keys": "Claves de activación SDK", "activation_keys_description": "Las claves de activación habilitarán funciones o proveedores específicos.", @@ -3006,13 +3061,13 @@ }, "snap_details": { "install_date": "Instalado el {{date}}", - "install_origin": "Install origin", + "install_origin": "Instalar origen", "enabled": "Activada", "version": "Versión" }, "keyring_account_list_item": { "account_name": "Nombre de la cuenta", - "public_address": "Public address" + "public_address": "Dirección pública" }, "snap_permissions": { "approved_date": "Aprobada el {{date}}", @@ -3064,27 +3119,27 @@ "security_alerts": "Alertas de seguridad", "security_alerts_desc": "Esta función le alerta sobre actividad maliciosa al revisar localmente sus solicitudes de transacción y firma. Haga siempre su propia diligencia debida antes de aprobar cualquier solicitud. No hay garantía de que esta función detecte toda la actividad maliciosa. Al activar esta función, acepta los términos de uso del proveedor.", "dismiss_smart_account_update_heading": "Descartar la sugerencia \"Cambiar a cuenta inteligente\"", - "dismiss_smart_account_update_desc": "Activa esta opción para que ya no aparezca la sugerencia \"Cambiar a cuenta inteligente\" en ninguna cuenta. Las cuentas inteligentes permiten transacciones más rápidas, comisiones de red más bajas y mayor flexibilidad de pago.", + "dismiss_smart_account_update_desc": "Activa esta opción para dejar de ver la sugerencia \"Cambiar a cuenta inteligente\" en ninguna cuenta. Las cuentas inteligentes permiten transacciones más rápidas, tarifas de red más bajas y mayor flexibilidad en los pagos.", "use_smart_account_heading": "Usar cuenta inteligente", "use_smart_account_desc": "Mantén esta opción activada para cambiar automáticamente las cuentas creadas en MetaMask a cuentas inteligentes cuando haya funciones relevantes disponibles, como transacciones más rápidas, tarifas de red más bajas y mayor flexibilidad en los pagos.", - "use_smart_account_learn_more": "Obtenga más información.", + "use_smart_account_learn_more": "Conozca más", "smart_transactions_opt_in_heading": "Transacciones inteligentes", "smart_transactions_opt_in_desc_supported_networks": "Active las transacciones inteligentes para realizar transacciones más confiables y seguras en las redes compatibles.", - "smart_transactions_learn_more": "Obtenga más información.", + "smart_transactions_learn_more": "Conozca más", "simulation_details": "Estimar cambios de saldo", "simulation_details_description": "Active esta opción para estimar los cambios de saldo de las transacciones antes de confirmarlas. Esto no garantiza el resultado final de sus transacciones. ", "simulation_details_learn_more": "Obtenga más información.", - "aes_crypto_test_form_title": "AES crypto - test form", + "aes_crypto_test_form_title": "AES Crypto: formulario de prueba", "aes_crypto_test_form_description": "Sección desarrollada exclusivamente para pruebas E2E. Si esto es visible en su aplicación, infórmelo al soporte de MetaMask.", "developer_options": { - "title": "Developer options", - "generate_trace_test": "Generate trace test", - "generate_trace_test_desc": "Generate a developer test Sentry trace.", - "navigate_to_sample_feature": "Navigate to sample feature", + "title": "Opciones para desarrolladores", + "generate_trace_test": "Generar prueba de rastreo", + "generate_trace_test_desc": "Generar un rastreo de Sentry de prueba para desarrolladores.", + "navigate_to_sample_feature": "Ir a la función de muestra", "sample_feature_desc": "Una función de muestra como plantilla para desarrolladores." }, "feature_flag_override": { - "title": "Feature flag override", + "title": "Anulación de la bandera de función", "description": "Anula las opciones de configuración de la aplicación localmente." } }, @@ -3137,7 +3192,7 @@ "sdk_feedback_modal": { "ok": "OK", "title": "No se pudo conectar la cuenta", - "info": "Escaneé el código QR de la dApp para volver a conectarla a MetaMask" + "info": "Please scan the QR code on the site to reconnect to MetaMask" }, "app_information": { "title": "Información", @@ -3145,8 +3200,8 @@ "privacy_policy": "de privacidad de Transak", "terms_of_use": "Términos de uso", "attributions": "Atribuciones", - "support_center": "Visit our support center", - "web_site": "Visite nuestro sitio web", + "support_center": "Visita nuestro centro de soporte", + "web_site": "Visit our website", "contact_us": "Contact us" }, "reveal_credential": { @@ -3216,7 +3271,7 @@ "password_reset": { "password_title": "Contraseña", "password_desc": "Elija una contraseña segura para desbloquear la aplicación MetaMask en el dispositivo. Si pierde esta contraseña, necesitará la frase secreta de recuperación para volver a importar el monedero.", - "password_learn_more": "Obtenga más información.", + "password_learn_more": "Conozca más", "change_password": "Cambiar contraseña", "password_hint": "Pista de contraseña" }, @@ -3246,19 +3301,28 @@ "swap": "Canjear", "bridge": "Puentear", "earn": "Ganar", - "convert_to_musd": "Convert to mUSD", + "convert_to_musd": "Convertir a mUSD", + "merkl_rewards": { + "annual_bonus": "Bonificación del {{apy}} %", + "claimable_bonus": "Bonificación reclamable", + "claimable_bonus_tooltip_description": "mUSD bonuses are claimed on Linea.", + "terms_apply": "Terms apply.", + "ok": "OK", + "claim": "Reclamar", + "processing_claim": "Processing claim..." + }, "tron": { - "daily_resource_new_energy": "New daily energy", - "sufficient_to_cover": "Sufficient to cover", + "daily_resource_new_energy": "Nueva energía diaria", + "sufficient_to_cover": "Suficiente para cubrir", "transactions": "transacciones", "daily_resource": "Recurso diario", "bandwidth": "Ancho de banda", "energy": "Energía", - "daily_resource_description": "This is your daily allowance based on your staked TRX. Hold TRX to get 600 bandwidth daily.", - "sufficient_to_cover_trx_transfers": "Covers ~{{amount}} TRX transfers", - "sufficient_to_cover_trx_transfer": "Covers 1 TRX transfer", - "sufficient_to_cover_usdt_transfers": "Covers ~{{amount}} USDT transfers", - "sufficient_to_cover_usdt_transfer": "Covers 1 USDT transfer" + "daily_resource_description": "Esta es tu asignación diaria basada en tus TRX en staking. Mantén TRX para obtener 600 de ancho de banda diario.", + "sufficient_to_cover_trx_transfers": "Cubre ~{{amount}} transferencias de TRX", + "sufficient_to_cover_trx_transfer": "Cubre 1 transferencia de TRX", + "sufficient_to_cover_usdt_transfers": "Cubre ~{{amount}} transferencias de USDT", + "sufficient_to_cover_usdt_transfer": "Cubre 1 transferencia de USDT" }, "disabled_button": { "buy": "No es posible comprar en esta cuenta", @@ -3311,9 +3375,11 @@ }, "no_chart_data": { "title": "Sin datos de gráfico", - "description": "No pudimos obtener ningún dato para este token" + "description": "No pudimos obtener ningún dato para este token", + "insufficient_data": "Data is not available for this time period" }, "your_balance": "Su saldo", + "perps_position": "Posición de los contratos perpetuos", "unable_to_load_balance": "No se puede cargar su saldo", "about": "Acerca de", "about_content_display": { @@ -3363,11 +3429,11 @@ "address_copied_to_clipboard": "Dirección del token copiada en el portapapeles" }, "qr_scanner": { - "invalid_qr_code_title": "Código QR no válido", + "invalid_qr_code_title": "Invalid QR code", "invalid_qr_code_message": "El código QR que intenta escanear no es válido.", "allow_camera_dialog_title": "Permitir acceso a la cámara", "allow_camera_dialog_message": "Necesitamos su permiso para escanear códigos QR", - "scanning": "escaneando…", + "scanning": "Escaneando…", "ok": "Aceptar", "continue": "Continuar", "cancel": "Cancelar", @@ -3376,14 +3442,14 @@ "attempting_sync_from_wallet_error": "Parece que intenta sincronizar con la extensión. debe borrar el monedero actual. \n\nUna vez que haya borrado o vuelto a instalar una versión nueva de la aplicación, seleccione la opción \"Sincronizar con la extensión MetaMask\". Importante: Antes de borrar el monedero, asegúrese de haber hecho una copia de seguridad de la frase secreta de recuperación.", "not_allowed_error_title": "Activar el acceso a la cámara", "not_allowed_error_desc": "Para escanear un código QR, deberá otorgar acceso a la cámara a MetaMask desde el menú de configuración de su dispositivo.", - "unrecognized_address_qr_code_title": "Código QR no reconocido", + "unrecognized_address_qr_code_title": "Unrecognized QR code", "unrecognized_address_qr_code_desc": "Lo sentimos, este código QR no está asociado con una dirección de cuenta o una dirección de contrato.", "url_redirection_alert_title": "Estás a punto de visitar un enlace externo", "url_redirection_alert_desc": "Los enlaces se pueden usar para tratar de estafar o hacer phishing a las personas, así que asegúrese de visitar solo sitios web en los que confíe.", "label": "Escanear un código QR", "open_settings": "Configuración", "camera_not_available": "Cámara no disponible", - "tron_address_not_supported": "Tron addresses are not currently supported" + "tron_address_not_supported": "Las direcciones Tron no son compatibles actualmente" }, "action_view": { "cancel": "Cancelar", @@ -3471,10 +3537,10 @@ "cancel_tx_message": "Enviar este intento no garantiza que se cancelará la transacción original. Si el intento de cancelación se completa correctamente, se le cobrará la tarifa de transacción anterior.", "speedup_tx_title": "¿Intentar acelerar?", "speedup_tx_message": "Enviar este intento no garantiza que se acelerará la transacción original. Si el intento de aceleración se completa correctamente, se le cobrará la tarifa de transacción anterior.", - "nevermind": "No importa", + "nevermind": "Never mind", "edit_network_fee": "Editar tarifa de gas", "edit_priority": "Editar prioridad", - "gas_cancel_fee": "Tarifa de cancelación de gas", + "gas_cancel_fee": "Gas cancellation fee", "gas_speedup_fee": "Cuota por aceleración de gas", "use_max": "Usar máx.", "set_gas": "Establecer", @@ -3602,7 +3668,7 @@ "reload": "Recargar", "share": "Compartir", "bookmark": "Marcador", - "add_to_favorites": "Agregar a favoritos", + "add_to_favorites": "Add to favorites", "error": "Error", "cancel": "Cancelar", "go_back": "Atrás", @@ -3610,7 +3676,7 @@ "home": "Inicio", "close": "Cerrar", "open_in_browser": "Abrir en el explorador", - "change_url": "Cambiar dirección URL", + "change_url": "Change URL", "switch_network": "Cambiar red", "dapp_browser": "EXPLORADOR DE DAPP", "dapp_browser_message": "MetaMask es su monedero y el explorador para la Web descentralizada. ¡Eche una vistazo!", @@ -3654,7 +3720,7 @@ "add_favorite": { "title": "Add favorite", "title_label": "Nombre", - "url_label": "Dirección URL", + "url_label": "URL", "add_button": "Agregar", "cancel_button": "Cancelar" }, @@ -3676,30 +3742,30 @@ "tx_review_increase_allowance": "Increase allowance", "tx_review_set_approval_for_all": "Set approval for all", "tx_review_staking_claim": "Staking claim", - "tx_review_staking_deposit": "Staking deposit", + "tx_review_staking_deposit": "Depósito en staking", "tx_review_staking_unstake": "Dejar de hacer staking", - "tx_review_lending_deposit": "Lending deposit", + "tx_review_lending_deposit": "Depósito en préstamo", "tx_review_lending_withdraw": "Lending withdrawal", "tx_review_perps_deposit": "Contratos perpetuos financiados", "tx_review_predict_deposit": "Predicciones financiadas", "tx_review_predict_claim": "Victorias reclamadas", "tx_review_predict_withdraw": "Predicciones retiradas", - "tx_review_musd_conversion": "mUSD Conversion", - "sent_ether": "Ether enviado", - "self_sent_ether": "Sent yourself Ether", - "received_ether": "Ether recibido", + "tx_review_musd_conversion": "Conversión de mUSD", + "sent_ether": "Sent ETH", + "self_sent_ether": "Sent yourself ETH", + "received_ether": "Received ETH", "sent_dai": "DAI enviado", "self_sent_dai": "DAI enviado a usted mismo", "received_dai": "DAI recibido", "sent_tokens": "Sent tokens", "received_tokens": "Received tokens", - "ether": "Ether", + "ether": "ETH", "sent_unit": "{{unit}} enviado", "self_sent_unit": "Sent yourself {{unit}}", "received_unit": "{{unit}} recibido", "sent_collectible": "Sent collectible", "received_collectible": "Received collectible", - "send_ether": "Send Ether", + "send_ether": "Send ETH", "send_unit": "Send {{unit}}", "send_collectible": "Send collectible", "receive_collectible": "Receive collectible", @@ -3732,9 +3798,9 @@ }, "gas_used": "Gas used (units)", "gas_limit": "Gas limit (units)", - "gas_price": "Precio de gas (GWEI)", - "base_fee": "Tarifa base (GWEI)", - "priority_fee": "Tarifa de prioridad (GWEI)", + "gas_price": "Gas price (GWEI)", + "base_fee": "Base fee (GWEI)", + "priority_fee": "Priority fee (GWEI)", "multichain_priority_fee": "Tarifa de prioridad", "max_fee": "Max fee per gas", "total": "Total", @@ -3767,7 +3833,7 @@ "confirm_gas_fee_token_tooltip": "Esto se paga a la red para procesar tu transacción. Incluye una tarifa de MetaMask de {{metamaskFeeFiat}} para tokens que no sean ETH o ETH prefinanciado.", "paid_by_metamask": "Pagado por MetaMask", "confirm_gas_fee_token_metamask_fee": "Incluye la tarifa de {{metamaskFeeFiat}}", - "smart_account_upgrade": "Actualizar a cuenta inteligente", + "smart_account_upgrade": "Cambiar a cuenta inteligente", "smart_account_downgrade": "Cambiar a cuenta estándar", "batched_transactions": "Transacciones por lotes", "gas_modal": { @@ -3906,7 +3972,7 @@ "select_all": "Seleccionar todo", "deselect_all": "Deseleccionar todo", "new_network": "Se agregó una red nueva", - "network_name": "Red {{networkName}}", + "network_name": "red {{networkName}}", "network_added": " ya está disponible en el selector de redes.", "provider": "Existe la confianza de que un proveedor le comunique a su monedero sus saldos y transmita fielmente sus transacciones", "no_match": "No se encontraron resultados coincidentes.", @@ -3923,7 +3989,7 @@ "show_test_networks": "Mostrar redes de prueba", "deprecated_goerli": "Debido a los cambios de protocolo de Ethereum: es posible que la red de prueba de Goerli no funcione de manera tan confiable y pronto quedará obsoleta.", "network_deprecated_title": "Esta red está en desuso", - "network_deprecated_description": "The network you're trying to connect to is no longer supported on MetaMask.", + "network_deprecated_description": "La red a la que está intentando conectarse ya no es compatible con MetaMask.", "edit_networks_title": "Editar redes", "no_network_fee": "No network fee" }, @@ -4004,8 +4070,8 @@ "biometrics": { "enable_touchid": "Desbloquear con Touch ID?", "enable_faceid": "¿Desbloquear con Face ID?", - "enable_fingerprint": "Desbloquear con huella dactilar?", - "enable_biometrics": "Desbloquear con datos biométricos?", + "enable_fingerprint": "Unlock with fingerprint?", + "enable_biometrics": "Unlock with biometrics?", "enable_device_passcode_ios": "Desbloquear con el código de acceso del dispositivo?", "enable_device_passcode_android": "Desbloquear con el PIN del dispositivo?" }, @@ -4020,18 +4086,18 @@ "title": "SOLICITUD DE CONEXIÓN", "walletconnect_title": "SOLICITUD DE WALLETCONNECT", "action": "¿Conectarse a este sitio?", - "action_reconnect": "Para reanudar la conexión, elija el número que ve en la dApp", - "action_reconnect_deeplink": "¿Desea volver a conectarse a esta dApp?", + "action_reconnect": "To resume connection, choose the number you see on the site", + "action_reconnect_deeplink": "Do you want to reconnect to this site?", "connect": "Conectar", "resume": "Reanudar", "cancel": "Cancelar", - "donot_rememberme": "No recordar la conexión a esta dApp", + "donot_rememberme": "Do not remember this site connection", "disconnect": "Desconectar", "permission": "Ver su", "address": "dirección pública", "sign_messages": "Firmar mensajes", "on_your_behalf": "en su nombre", - "warning": "Al hacer clic en Conectar, permite que esta dapp vea su dirección pública. Este es un paso de seguridad importante para proteger sus datos de posibles riesgos de phishing." + "warning": "By clicking connect, you allow this site to view your public address. This is an important security step to protect your data from potential phishing risks." }, "import_private_key": { "title": "Importar cuenta", @@ -4047,7 +4113,7 @@ "error_title": "Algo salió mal", "error_message": "No se pudo importar esa clave privada. Asegúrese de que la escribió correctamente.", "error_empty_message": "Debe escribir su clave privada.", - "or_scan_a_qr_code": "o escanear un código QR" + "or_scan_a_qr_code": "or scan a QR code" }, "import_private_key_success": { "title": "La cuenta se importó correctamente.", @@ -4064,12 +4130,12 @@ "paste": "Pegar", "clear": "Borrar todo", "srp_number_of_words_option_title": "Número de palabras", - "12_word_option": "Tengo una frase de 12 palabras", - "24_word_option": "Tengo una frase de 24 palabras", + "12_word_option": "I have a 12-word phrase", + "24_word_option": "I have a 24-word phrase", "error_title": "Algo salió mal", "error_message": "We couldn't import that Secret Recovery Phrase. Please make sure you entered it correctly.", "error_empty_message": "You need to enter your Secret Recovery Phrase.", - "error_number_of_words_error_message": "Las frases secretas de recuperación contienen 12 o 24 palabras", + "error_number_of_words_error_message": "Secret Recovery Phrases contain 12 or 24 words", "error_srp_is_case_sensitive": "¡Entrada no válida! La frase secreta de recuperación distingue entre mayúsculas y minúsculas.", "error_srp_word_error_1": "Palabra ", "error_srp_word_error_2": " es incorrecta o está mal escrita.", @@ -4079,7 +4145,7 @@ "error_invalid_srp": "Frase secreta de recuperación no válida", "error_duplicate_srp": "Esta frase secreta de recuperación ya se importó.", "error_duplicate_account": "The account you are trying to import is a duplicate.", - "invalid_qr_code_title": "Código QR no válido", + "invalid_qr_code_title": "Invalid QR code", "invalid_qr_code_message": "The QR code does not contain a valid Secret Recovery Phrase", "success_1": "Billetera", "success_2": "importado" @@ -4151,7 +4217,7 @@ "why_secure_2": " Es la única manera que tiene de recuperar el monedero si no puede acceder a la aplicación o si cambia de dispositivo." }, "account_backup_step_2": { - "cancel_backup_title": "Cancel backup", + "cancel_backup_title": "Cancelar copia de seguridad", "cancel_backup_message": "Le recomendamos encarecidamente que guarde la frase secreta de recuperación para poder restaurar su monedero.", "cancel_backup_ok": "Sí, asumiré el riesgo", "cancel_backup_no": "No se creó una copia de seguridad de la frase secreta de recuperación.", @@ -4163,7 +4229,7 @@ "cta_text": "OK" }, "account_backup_step_3": { - "cancel_backup_title": "Cancel backup", + "cancel_backup_title": "Cancelar copia de seguridad", "cancel_backup_message": "Le recomendamos encarecidamente que guarde la frase secreta de recuperación para poder restaurar su monedero.", "cancel_backup_ok": "Sí, asumiré el riesgo", "cancel_backup_no": "No se creó una copia de seguridad de la frase secreta de recuperación.", @@ -4172,7 +4238,7 @@ "cta_text": "NO HAY NADIE MIRANDO" }, "account_backup_step_4": { - "cancel_backup_title": "Cancel backup", + "cancel_backup_title": "Cancelar copia de seguridad", "cancel_backup_message": "Le recomendamos encarecidamente que guarde la frase secreta de recuperación para poder restaurar su monedero.", "cancel_backup_ok": "Sí, asumiré el riesgo", "cancel_backup_no": "No se creó una copia de seguridad de la frase secreta de recuperación.", @@ -4197,16 +4263,16 @@ "modal_button": "PROX" }, "account_backup_step_6": { - "title": "Security tips", + "title": "Consejos de seguridad", "info_text": "MetaMask no podrá recuperar la frase secreta de recuperación si usted llegara a perderla.", "tip_1": "Conserve varias copias de seguridad de la frase secreta de recuperación", "tip_2": "Guarde la frase en un gestor de contraseñas de confianza y en varios papeles en un lugar seguro", "tip_3": "No comparta esta frase con nadie", "disclaimer": "* Puede encontrar la frase secreta de recuperación en ", - "disclaimer_bold": "Configuración > Seguridad y privacidad", + "disclaimer_bold": "Configuración > Seguridad y privacidad", "cta_text": "ENTENDIDO", "modal_title": "¡Felicidades!", - "modal_text": "Ya creó sus copias de seguridad y está listo para empezar.", + "modal_text": "Ya creaste tus copias de seguridad y estás listo para empezar.", "modal_button": "HECHO", "copy_seed_phrase": "COPIAR frase secreta de recuperación EN EL PORTAPAPELES" }, @@ -4238,7 +4304,7 @@ "steps": "Paso {{currentStep}} de {{totalSteps}}", "action": "Confirma tu frase secreta de recuperación", "info": "Selecciona las palabras que faltan en el orden correcto.", - "complete": "Complete backup", + "complete": "Completar copia de seguridad", "success": "Éxito", "error-title": "No es del todo correcto", "error-description": "Revisa tu frase secreta de recuperación e inténtalo de nuevo.", @@ -4253,7 +4319,7 @@ "congratulations": "Felicitaciones", "success": "Protegió correctamente su monedero. Recuerde guardar la frase secreta de recuperación en un lugar seguro; ¡es su responsabilidad!", "hint": "¿Quiere dejarse una pista?", - "recover": "MetaMask no podrá recuperar su monedero en caso de que lo pierda. Puede encontrar la frase secreta de recuperación en Configuración > Seguridad y privacidad.", + "recover": "MetaMask no podrá recuperar tu billetera en caso de que la pierdas. Puedes encontrar la frase secreta de recuperación en Configuración > Seguridad y privacidad.", "learn": "Conozca más", "done": "Hecho", "recovery_hint": "Pista de recuperación", @@ -4300,7 +4366,7 @@ "withdrawal_completed": "Retiro finalizado", "unstake_completed": "Unstaking finalizado", "withdrawal_requested": "Retiro solicitado", - "stake_ready_to_be_withdrawn": "Staking listo para ser retirado", + "stake_ready_to_be_withdrawn": "Staking listo para retiro", "swap_completed": "Se intercambió {{from}} por {{to}}", "swap": "Canjeado", "sent": "Enviado a {{address}}", @@ -4417,7 +4483,7 @@ "metamask_swap_completed_title": "Intercambio finalizado", "metamask_swap_completed_description": "Su intercambio de MetaMask se realizó correctamente", "nft_sent_title": "NFT enviado", - "nft_sent_description": "Envió correctamente un NFT", + "nft_sent_description": "You successfully sent an NFT", "nft_received_title": "NFT recibido", "nft_received_description": "Recibió un nuevo NFT", "rocketpool_stake_completed_title": "Staking finalizado", @@ -4519,7 +4585,7 @@ "copy_to_clipboard": "Copiar al Portapapeles", "qr_code": "Código QR", "send_link": "Send link", - "request_qr_code": "Código QR de solicitud de pago", + "request_qr_code": "Payment request QR code", "balance": "Saldo" }, "receive_request": { @@ -4561,12 +4627,12 @@ "close_current_session": "Cierre la sesión actual antes de iniciar una nueva." }, "paymentRequest": { - "title": "SOLICITUD DE PAGO", - "title_complete": "PAGO COMPLETO", - "confirm": "PAGAR", - "cancel": "RECHAZAR", + "title": "Payment request", + "title_complete": "Payment complete", + "confirm": "Pay", + "cancel": "Decline", "is_requesting_you_to_pay": "le solicita que pague", - "total": "TOTAL:" + "total": "Total:" }, "webview_error": { "title": "Se produjo un error", @@ -4589,6 +4655,10 @@ "fiat_on_ramp": { "buy_eth": "Comprar ETH", "buy": "Comprar {{ticker}}", + "on_network": "en {{networkName}}", + "debit_card": "Tarjeta de débito", + "continue": "Continuar", + "powered_by_provider": "Desarrollado por {{provider}}", "purchased_currency": "{{currency}} comprado", "network_not_supported": "No se admite la red actual", "switch_network": "Cambie a la red principal", @@ -4676,6 +4746,14 @@ "subtitle_5": "y ver cuánto cuesta el Gas.", "cta": "Continuar comprando {{ticker}}" } + }, + "build_quote_settings_modal": { + "title": "Configuración", + "view_order_history": "Ver historial de órdenes", + "contact_support": "Contactar a soporte", + "log_out": "Cerrar sesión en {{provider}}", + "logged_out_success": "La sesión se cerró correctamente", + "logged_out_error": "Error al cerrar sesión" } }, "fiat_on_ramp_aggregator": { @@ -4761,7 +4839,7 @@ "get_quotes": "Obtener cotizaciones", "done": "Hecho", "fetching_quotes": "Obtener cotizaciones", - "select_a_quote": "Seleccione una cotización", + "select_a_quote": "Selecciona una cotización", "recommended_quote": "Cotización recomendada", "select_a_cryptocurrency": "Seleccione una criptomoneda", "select_a_cryptocurrency_description": "Selecciona de la lista de tokens disponibles.", @@ -4822,6 +4900,7 @@ "title": "Seleccione su región", "description": "Los métodos de pago y los tokens disponibles para usted están determinados por nuestras integraciones de terceros y pueden variar según su región y el soporte de nuestras integraciones.", "sell_description": "Las opciones de destino de efectivo y los tokens pueden variar según su región.", + "region_variation_notice": "Los métodos de pago y los tokens disponibles pueden variar según tu región y nuestros proveedores.", "search_by_country": "Buscar por país", "search_by_state": "Buscar por estado", "no_region_results": "No hay coincidencias de región", @@ -4849,7 +4928,7 @@ "continue_order_description": "Para continuar con su órden, deberá seleccionar el botón en la parte inferior de esta página.", "the_provider": "el proveedor", "processing": "Procesando la orden", - "processing_card_description": "Las compras de crédito/débito suelen tardar unos minutos", + "processing_card_description": "Las compras con tarjeta de crédito/débito suelen tardar unos minutos", "processing_bank_description": "Las transferencias bancarias tardan normalmente unos días hábiles", "details": "Detalles del pedido", "via": "mediante", @@ -4883,11 +4962,11 @@ "sent": "Enviado!" }, "notifications": { - "purchase_failed_title": "Error al comprar {{currency}}. Vuelva a intentarlo, lamentamos los inconvenientes.", + "purchase_failed_title": "La compra de {{currency}} falló. Inténtalo de nuevo.", "purchase_failed_description": "Verifica tu método de pago y las tarjetas aceptadas", "purchase_cancelled_title": "Se canceló la compra", "purchase_cancelled_description": "Verifica tu método de pago y las tarjetas aceptadas", - "purchase_completed_title": "La compra de {{amount}} {{currency}} se completó correctamente.", + "purchase_completed_title": "Tu compra de {{amount}} {{currency}} se realizó correctamente.", "purchase_completed_description": "Su {{currency}} ahora está disponible", "purchase_pending_title": "Procesando su compra de {{currency}}", "purchase_pending_description": "Esto solo tardará unos minutos...", @@ -4896,7 +4975,7 @@ "sale_cancelled_title": "Orden cancelada", "sale_cancelled_description": "Su orden no se pudo completar.", "sale_completed_title": "Orden completada", - "sale_completed_description": "¡Su orden fue exitosa!", + "sale_completed_description": "Tu orden se realizó correctamente.", "sale_pending_title": "Procesamiento de venta de {{currency}}", "sale_pending_description": "Su orden esta siendo procesada.", "no_date": "Desconocida" @@ -4921,7 +5000,7 @@ "start_swapping": "Comenzar a canjear" }, "feature_off_title": "Temporalmente no disponible", - "feature_off_body": "MetaMask Swaps está en mantenimiento. Vuelva a comprobarlo más tarde.", + "feature_off_body": "MetaMask Swaps are undergoing maintenance. Please check back later.", "wrong_network_title": "Los intercambios no están disponibles", "wrong_network_body": "Solo puede canjear tokens en la red principal de Ethereum.", "unallowed_asset_title": "No se puede canjear este token", @@ -5002,7 +5081,7 @@ "edit": "Editar", "quotes_include_fee": "Las cotizaciones incluyen un {{fee}} % de tarifa de MetaMask", "quotes_include_gas_and_metamask_fee": "La cotización incluye el gas y una tarifa del {{fee}} % de MetaMask", - "tap_to_swap": "Toque para canjear", + "tap_to_swap": "Tap to swap", "swipe_to_swap": "Deslice para canjear", "swipe_to": "Deslice para", "swap": "Canjear", @@ -5302,7 +5381,7 @@ }, "network_information": { "things_to_keep_in_mind": "Cosas a tener en cuenta", - "testnet_network": "{{type}} Red de pruebas", + "testnet_network": "{{type}} red de pruebas", "first_description": "El token nativo en esta red es {{ticker}}. Es el token utilizado para las comisiones de gas.", "second_description": "Si intenta enviar activos directamente de una red a otra, esto puede provocar la pérdida permanente de activos. Asegúrese de usar un puente.", "third_description": "Es posible que sus tokens no aparezcan automáticamente en su monedero.", @@ -5385,7 +5464,7 @@ "learn_more": "Conozca más" }, "token_allowance": { - "verify_third_party_details": "Verificar detalles de terceros", + "verify_third_party_details": "Verify third-party details", "protect_from_scams": "Para protegerse contra estafadores, tómese un momento para verificar los datos del tercero.", "learn_to_verify": "Más información sobre cómo verificar los datos de terceros", "spending_cap": "límite de gasto", @@ -5399,7 +5478,7 @@ }, "restore_wallet": { "restore_needed_title": "Restauración necesaria", - "restore_needed_description": "¡Algo salió mal, pero no se preocupe! Intentemos restaurar su monedero.", + "restore_needed_description": "Something went wrong, but don’t worry! Let’s try to restore your wallet.", "restore_needed_action": "Restaurar monedero" }, "wallet_restored": { @@ -5598,6 +5677,10 @@ "error_description": "Instalación fallida de {{snap}}." }, "earn": { + "claimable_bonus_tooltip": "An annual bonus claimable daily from your wallet.", + "earn_a_percentage_bonus": "Earn a {{percentage}}% bonus", + "claimable_bonus": "Claimable bonus", + "claim_bonus": "Claim bonus", "empty_state_cta": { "heading": "Presta {{tokenSymbol}} y gana", "body": "Presta tu {{tokenSymbol}} con {{protocol}} y gana", @@ -5681,27 +5764,42 @@ "fee": "Tarifa" }, "musd_conversion": { - "convert_to_musd": "Convert to mUSD", + "ok": "OK", + "continue": "Continue", + "convert_and_get_percentage_bonus": "Convierte y obtén un {{percentage}} %", + "get_a_percentage_musd_bonus": "Obtén un bono del {{percentage}} % en mUSD", + "convert": "Convertir", "toasts": { - "converting": "Converting {{token}} → mUSD", + "converting": "Convirtiendo {{token}} → mUSD", "eta": "~{{time}}", - "delivered": "Your mUSD has been delivered!", - "failed": "mUSD conversion failed" + "delivered": "¡Tus mUSD ya están aquí!", + "failed": "Conversión de mUSD fallida" }, "education": { - "heading": "Gana recompensas con mUSD", - "description": "Convert your USDC, USDT, or DAI for mUSD, MetaMask’s dollar-backed stablecoin.Earn points every time you convert or hold $100.", - "continue_button": "Comenzar" + "heading": "OBTÉN {{percentage}} % EN\nMONEDAS ESTABLES", + "description": "Convert your stablecoins to mUSD, MetaMask’s US dollar-backed stablecoin, and receive up to a {{percentage}}% bonus.", + "terms_apply": "Terms apply.", + "primary_button": "Comenzar", + "secondary_button": "Ahora no" }, - "earn_points_daily": "Earn points daily", - "buy_musd": "Buy mUSD", - "get_musd": "Get mUSD" + "buy_musd": "Comprar mUSD", + "get_musd": "Obtener USDC", + "boost_title": "Get {{percentage}}% on your stablecoins", + "boost_description": "Convert your stablecoins to mUSD and receive up to a {{percentage}}% bonus.", + "powered_by_relay": "Desarrollado por Relay" + }, + "bonus_claim": { + "toasts": { + "claiming": "Your mUSD bonus is processing", + "delivered": "Your mUSD bonus is here!", + "failed": "Bonus claim failed" + } }, "rewards": { "rewards_tag_label": "Recompensas", "tooltip_title": "Gana recompensas con mUSD", "tooltip_points_suffix": "por cada $100", - "tooltip_description": "Convierte tus USDC, USDT o DAI en mUSD, la stablecoin de MetaMask respaldada por dólares.\nGana puntos con cada conversión.", + "tooltip_description": "Convierte tus USDC, USDT o DAI en mUSD, la stablecoin de MetaMask respaldada por dólares. Gana puntos con cada conversión.", "tooltip_opted_in_footer": "Los puntos se agregarán automáticamente a tu cuenta.", "tooltip_not_opted_in_footer": "Regístrate en las recompensas para recibir tus puntos.", "tooltip_close": "Cerrar" @@ -5711,22 +5809,22 @@ "stake": "Stake", "earn": "Ganar", "tron": { - "stake_completed": "Staking completed", - "stake_completed_description": "Your staking transaction has been completed successfully.", - "stake_failed": "Staking failed", + "stake_completed": "Staking finalizado", + "stake_completed_description": "Tu transacción de staking finalizó correctamente.", + "stake_failed": "Staking fallido", "unstake_completed": "Unstaking finalizado", - "unstake_completed_description": "Your unstaking transaction has been completed successfully.", - "unstake_failed": "Unstaking failed", + "unstake_completed_description": "Tu transacción de cancelación de staking finalizó correctamente.", + "unstake_failed": "Cancelación de staking fallida", "bandwidth": "Ancho de banda", "energy": "Energía", "estimated_annual_reward": "Recompensa anual est.", - "trx_locked_for": "TRX locked for", - "trx_locked_for_minimum_time": "~3 days", - "trx_released_in": "TRX released in", - "trx_released_in_minimum_time": "~14 days", + "trx_locked_for": "TRX bloqueado durante", + "trx_locked_for_minimum_time": "~3 días", + "trx_released_in": "TRX liberado en", + "trx_released_in_minimum_time": "~14 días", "fee": "Tarifa", "errors": { - "insufficient_balance": "You don't have enough resource balance to do this action." + "insufficient_balance": "No tienes suficiente saldo de recursos para realizar esta acción." } }, "stake_eth": "Hacer staking de ETH", @@ -5772,12 +5870,19 @@ "learn_more_with_period": "Obtenga más información." }, "stake_your_trx_cta": { - "title": "Lend Tron and earn", - "description_start": "Stake your Tron and earn ", + "title": "Presta Tron y gana", + "description_start": "Haz staking de tu Tron y gana ", "description_end": " anualmente.", "learn_more": "Más información.", "earn_button": "Ganar" }, + "trx_learn_more": { + "title": "Stake TRX and earn", + "stake_any_amount": "Stake any amount of TRX.", + "earn_trx_rewards": "Gana recompensas de TRX.", + "earn_trx_rewards_description": "Empieza a ganar en cuanto realices el staking. Las recompensas se acumulan automáticamente.", + "flexible_unstaking_description": "Unstake anytime. Unstaking takes 14 days to process." + }, "day": { "zero": "", "one": "día", @@ -5855,7 +5960,7 @@ "one_year_average": "Promedio de 1 año" }, "default_settings": { - "title": "Your wallet is ready", + "title": "Tu billetera está lista", "description": "MetaMask utiliza la configuración por defecto para equilibrar mejor la seguridad y la facilidad de uso. Cambie esta configuración para aumentar aún más su privacidad.", "learn_more_about_privacy": "Obtenga más información sobre las mejores prácticas de privacidad.", "privacy_policy": "Política de privacidad", @@ -5981,7 +6086,7 @@ "switch_account_type": "Actualización de la cuenta", "approve": "Aprobar la solicitud", "perps_deposit": "Agregar fondos", - "predict_deposit": "Añadir fondos de Predict", + "predict_deposit": "Añadir fondos de Predicciones", "predict_withdraw": "Retirar" }, "sub_title": { @@ -6002,14 +6107,15 @@ "transaction_fee": "Canjearemos tus tokens por USDC en HyperCore, la red que usan los contratos perpetuos. Los proveedores de canje pueden cobrar una comisión, pero MetaMask no." }, "predict_deposit": { - "transaction_fee": "Canjearemos tus tokens por USDC en Polygon, la red que usa Predict. Los proveedores de canje pueden cobrar una comisión, pero MetaMask no." + "transaction_fee": "Canjearemos tus tokens por USDC en Polygon, la red que usa Predicciones. Los proveedores de canje pueden cobrar una comisión, pero MetaMask no." }, "musd_conversion": { - "transaction_fee": "mUSD conversion fees include network costs and may include provider fees." + "transaction_fee": "Las tarifas de conversión de mUSD incluyen los costos de red y pueden incluir las tarifas del proveedor." }, "title": { "transaction_fee": "Tarifas" - } + }, + "network_fee": "Las tarifas de red dependen de qué tan ocupada esté la red y de qué tan compleja sea tu transacción." }, "spending_cap": "Límite de gasto", "withdraw": "Retirar", @@ -6078,7 +6184,7 @@ }, "includes_transaction": "Incluye {{transactionCount}} transacciones", "useSmartAccount": "Usar cuenta inteligente", - "successful": "¡Correcto!", + "successful": "Éxito", "success_message": "Tu cuenta se actualizará a cuenta inteligente con tu próxima transacción." }, "edit_spending_cap_modal": { @@ -6086,9 +6192,9 @@ "cancel": "Cancelar", "description": "Ingresa el monto que consideras cómodo para que se gaste en tu nombre.", "invalid_number_error": "El límite de gasto debe ser un número", - "no_empty_error": "El límite de gasto no puede estar vacío", - "no_extra_decimals_error": "El límite de gasto no puede tener más decimales que el token", - "no_zero_error": "El límite de gasto no puede ser 0", + "no_empty_error": "Spending cap can't be empty", + "no_extra_decimals_error": "Spending cap can't have more decimals than the token", + "no_zero_error": "Spending cap can't be 0", "no_zero_error_decrease_allowance": "Un límite de gasto de 0 no tiene ningún efecto sobre el método de 'decreaseAllowance'", "no_zero_error_increase_allowance": "Un límite de gasto de 0 no tiene ningún efecto sobre el método de 'increaseAllowance'", "save": "Guardar", @@ -6119,7 +6225,7 @@ "edit_amount_done": "Continuar", "deposit_edit_amount_done": "Agregar fondos", "deposit_edit_amount_predict_withdraw": "Retirar", - "deposit_edit_amount_musd_conversion": "Convert to mUSD" + "deposit_edit_amount_musd_conversion": "Convertir a mUSD" }, "change_in_simulation_modal": { "title": "Los resultados cambiaron", @@ -6144,6 +6250,8 @@ "confirm_swap": "Canjear", "terms_and_conditions": "Términos y condiciones", "select_token": "Seleccione un token", + "no_tokens_found": "No se encontraron tokens", + "no_tokens_found_description": "We couldn't find any tokens with this name. Try a different search.", "select_network": "Seleccionar red", "all_networks": "Todas las redes", "num_networks": "{{numNetworks}} redes", @@ -6151,6 +6259,7 @@ "select_all_networks": "Seleccionar todo", "deselect_all_networks": "Deseleccionar todo", "see_all": "Ver todo", + "all": "Todas", "apply": "Aplicar", "slippage": "Deslizamiento", "slippage_info": "Si el precio cambia entre el momento en que se coloca la orden y cuando se confirma, se denomina \"deslizamiento\". Su intercambio se cancelará automáticamente si el deslizamiento supera la tolerancia que establezca aquí.", @@ -6191,9 +6300,9 @@ "title": "Puentear", "submitting_transaction": "Enviando", "fetching_quote": "Obteniendo cotización", - "fee_disclaimer": "Incluye una tarifa MM del {{feePercentage}}%.", + "fee_disclaimer": "Includes {{feePercentage}}% MetaMask fee.", "no_mm_fee": "Sin tarifa de MM", - "no_mm_fee_disclaimer": "Sin tarifa de MM al canjear por {{destTokenSymbol}}.", + "no_mm_fee_disclaimer": "No MetaMask fee swapping into {{destTokenSymbol}}.", "hardware_wallet_not_supported": "Las billeteras físicas aún no son compatibles. Usa una billetera en caliente para continuar.", "hardware_wallet_not_supported_solana": "Las billeteras físicas aún no son compatibles con Solana. Usa una billetera en caliente para continuar.", "price_impact_info_title": "Impacto sobre el precio", @@ -6208,15 +6317,7 @@ "approval_tooltip_content": "Permitirás el acceso a la cantidad especificada, {{amount}} {{symbol}}. El contrato no accederá a fondos adicionales.", "minimum_received": "Minimum received", "minimum_received_tooltip_title": "Minimum received", - "minimum_received_tooltip_content": "La cantidad mínima que recibirás si el precio cambia mientras se procesa tu transacción, según tu tolerancia al deslizamiento. Esta es una estimación de nuestros proveedores de liquidez. Los montos finales pueden variar.", - "verified_token": "Token verificado", - "price": "Precio", - "percent_change": "Cambio porcentual", - "volume": "Volumen", - "market_cap_fdv": "Capitalización de mercado (FDV)", - "listed_on": "Listado en", - "centralized_exchanges": "Cambios centralizados", - "contract_address": "Dirección del contrato" + "minimum_received_tooltip_content": "La cantidad mínima que recibirás si el precio cambia mientras se procesa tu transacción, según tu tolerancia al deslizamiento. Esta es una estimación de nuestros proveedores de liquidez. Los montos finales pueden variar." }, "quote_expired_modal": { "title": "Hay nuevas cotizaciones disponibles", @@ -6290,7 +6391,7 @@ "title": "Recuperación de billetera", "login_with_social": "Iniciar sesión con cuentas de redes sociales", "setup": "Configuración", - "secret_recovery_phrase": "Frase secreta de recuperación {{num}}", + "secret_recovery_phrase": "Secret Recovery Phrase {{num}}", "back_up": "Respaldo", "reveal": "Revelar", "social_recovery_title": "RECUPERACIÓN DE {{authConnection}}", @@ -6349,7 +6450,7 @@ "section_1_title": "¿Qué son las cuentas multicadena?", "section_1_description": "Una sola cuenta, direcciones en todas las redes compatibles con MetaMask. Ahora puedes usar Ethereum, Solana y más sin cambiar de cuenta.", "section_2_title": "La misma dirección, más redes", - "section_2_description": "Hemos agrupado tus cuentas, así que sigue usando MetaMask como antes. Tus fondos están seguros y sin cambios", + "section_2_description": "Hemos agrupado tus cuentas, así que sigue usando MetaMask como antes. Tus fondos están seguros y sin cambios.", "view_accounts_button": "Ver cuentas", "learn_more_button": "Conozca más", "setting_up_accounts": "Configurar tus cuentas" @@ -6511,8 +6612,10 @@ }, "card_onboarding": { "title": "Gasta\ny\ngana", - "description": "La tarjeta MetaMask es la forma rápida y sencilla de gastar tus criptomonedas como efectivo y ganar recompensas.", + "description": "La tarjeta MetaMask es la forma rápida y fácil de gastar tus criptomonedas y obtener hasta un 3 % de cashback.", "apply_now_button": "Aplicar ahora", + "login_button": "Iniciar sesión", + "not_now_button": "Ahora no", "sign_up": { "title": "Comencemos", "description": "Crea tu cuenta de Tarjeta MetaMask, proporcionada por Crypto Life. Esto será independiente de tu cuenta de MetaMask.", @@ -6540,6 +6643,7 @@ "phone_number_label": "Ingresar el número de teléfono", "country_area_code_label": "Código de área del país", "invalid_phone_number": "Número de teléfono inválido", + "invalid_us_phone_number": "Ingresa un número de teléfono estadounidense válido (10 dígitos) para continuar.", "legal_terms": "Al continuar, aceptas recibir SMS para verificar tu número de teléfono." }, "confirm_phone_number": { @@ -6576,8 +6680,8 @@ "terms": "Las aprobaciones suelen tardar unas 12 horas. Te notificaremos cuando se tome una decisión." }, "verifying_veriff_kyc": { - "title": "Verificando tu identidad", - "description": "Espera mientras verificamos tu identidad.", + "title": "En espera de aprobación", + "description": "Nuestro socio necesita verificar tu identidad para aprobar tu solicitud.", "helper_text": "Esto suele tardar unos segundos. No cierres la aplicación." }, "verifying_registration": { @@ -6614,7 +6718,7 @@ }, "physical_address": { "title": "Agrega tu dirección", - "description": "Ingresa la dirección de tu casa. Si se aprueba, te enviaremos tu tarjeta física aquí.", + "description": "Ingresa tu domicilio actual. Lo usaremos para fines de verificación.", "address_line_1_label": "Línea de dirección 1", "address_line_2_label": "Línea de dirección 2", "city_label": "Ciudad", @@ -6622,7 +6726,7 @@ "zip_code_label": "Código postal", "country_label": "País", "electronic_consent_1": "Acepto el consentimiento y divulgación de la Ley de firma electrónica y recibir todas las comunicaciones de forma electrónica. ", - "electronic_consent_2": "View document(PDF)" + "electronic_consent_2": "Ver documento (PDF)" }, "mailing_address": { "title": "Dirección postal", @@ -6668,22 +6772,24 @@ } }, "card_home": { + "title": "Card", + "available_balance": "Saldo disponible", "error_title": "No se puede obtener la fecha", "error_description": "Parece que hay un problema que te impide ver el contenido de esta página. Comprueba tu conexión o intenta actualizar la página.", "try_again": "Inténtalo de nuevo", - "limited_spending_warning": "Tu capacidad de gasto real podría estar limitada. Para ajustar tu límite, visita {{manageCard}}", + "limited_spending_warning": "Tu capacidad de gasto real podría estar limitada. Para ajustar tu límite, visita ", "add_funds": "Agregar fondos", "change_asset": "Cambiar activo", "enable_card_button_label": "Habilitar tarjeta", "enable_assets_button_label": "Habilitar activos", "spending_limit_warning": "Estás cerca de tu límite de gasto. Actualiza tu cuenta para evitar rechazos.", "logout": "Cerrar sesión", - "logout_description": "Cierra sesión en tu cuenta de MetaMask Card", "logout_confirmation_title": "¿Cerrar sesión en Card?", "logout_confirmation_message": "¿Seguro que quieres cerrar sesión en tu cuenta de MetaMask Card?", "logout_confirmation_cancel": "Cancelar", "logout_confirmation_confirm": "Cerrar sesión", "enable_card_error": "No se pudo habilitar la tarjeta. Inténtelo de nuevo más tarde.", + "view_card_details_error": "Unable to load card details. Please try again.", "warnings": { "close_spending_limit": { "title": "Estás cerca de tu límite de gasto", @@ -6706,6 +6812,16 @@ "blocked": { "title": "Tu tarjeta está bloqueada", "description": "Comunícate con soporte para desbloquear tu tarjeta" + }, + "kyc_pending": { + "title": "Verificación en curso", + "description": "Your identity verification is being reviewed. This typically takes less than 12 hours." + } + }, + "messages": { + "card_provisioning": { + "title": "Card being created", + "description": "Your card is being created. This may take a few moments." } }, "kyc_status": { @@ -6729,33 +6845,46 @@ "ok_button": "OK" }, "manage_card_options": { - "manage_spending_limit": "Administrar el límite de gasto", + "view_card_details": "View card details", + "hide_card_details": "Hide card details", + "view_card_details_description": "Card number, expiration and CVV", + "manage_spending_limit": "Manage limit", "manage_spending_limit_description_restricted": "Hay un gasto limitado", "manage_spending_limit_description_full": "El acceso completo está activado", "manage_card": "Administrar tarjeta", - "advanced_card_management_description": "Consulta los detalles de tu tarjeta, las transacciones y mucho más", + "advanced_card_management_description": "See activity, cashback, freeze card, and more", "travel_title": "MetaMask Travel", - "travel_description": "Reserva hoteles con hasta un 60 % de descuento vs. Expedia", - "card_tos_title": "Términos y condiciones de la tarjeta", - "card_tos_description": "Lee los términos del proveedor de la tarjeta" + "travel_description": "Book hotels with up to 70% discounts", + "card_tos_title": "Terms and conditions" } }, "card_spending_limit": { "title_change_token": "Cambiar token y red", "title_enable_token": "Activar token", + "title_onboarding": "Habilita gastos", + "setup_title": "Set up your card", + "setup_description": "Select the token you'd like to use and set a limit for how much you can spend.", + "asset_label": "Activo", + "limit_label": "Límite", + "other_token": "Other", "full_access_title": "Acceso completo", - "full_access_description": "Tu tarjeta puede usar tus fondos automáticamente, sin pedirte aprobación en cada instancia.", - "restricted_limit_title": "Gasto limitado", - "restricted_limit_description": "Deberás volver y pagar una tarifa de red cada vez que quieras aumentar el límite.", + "full_access_description": "Your card can use your funds automatically without asking for approval each time.", + "restricted_limit_title": "Límite de gastos", + "restricted_limit_description": "Solo puedes gastar hasta este límite. Pagarás una tarifa de red cada vez que se actualice.", "edit_limit": "Editar límite", "confirm_new_limit": "Confirmar", "cancel": "Cancelar", + "skip": "Omitir por ahora", "set_new_limit": "Establecer un límite", "dismiss": "Ignorar", "update_success": "Límite de gasto actualizado correctamente", "update_error": "No se pudo actualizar el límite de gasto", "solana_not_supported": "Habilita los tokens de Solana en card.metamask.io", - "select_token": "Selecciona un token" + "select_token": "Selecciona un token", + "loading": "Cargando tokens disponibles...", + "load_error": "No se pueden cargar los tokens. Inténtalo de nuevo.", + "retry": "Inténtalo de nuevo", + "on_linea": "en Linea" }, "change_asset": { "title": "Cambiar token y red", @@ -6793,6 +6922,7 @@ "signup_button": "Inscribirse", "errors": { "invalid_credentials": "Datos de inicio de sesión no válidos", + "invalid_otp_code": "Código incorrecto, inténtalo de nuevo", "unknown_error": "Error desconocido, inténtalo de nuevo más tarde", "email_required": "Se requiere correo electrónico", "password_required": "Se requiere contraseña", @@ -6839,8 +6969,8 @@ }, "rewards": { "auth_fail_title": "Error desconocido.", - "auth_fail_description": "Se produjo un error desconocido al autenticar esta cuenta con el programa de recompensas. Inténtalo de nuevo más tarde.", - "failed_to_authenticate": "Error al autenticar con el programa de recompensas", + "auth_fail_description": "Se produjo un error desconocido al autenticar esta cuenta con Recompensas de MetaMask. Inténtalo de nuevo más tarde.", + "failed_to_authenticate": "Error al autenticar con Recompensas de MetaMask", "not_implemented": "Próximamente", "not_implemented_season_summary": "Resumen de la temporada disponible en breve", "optin_error": { @@ -6867,6 +6997,10 @@ "error_fetching_description": "Comprueba tu conexión y vuelve a intentarlo.", "retry_button": "Reintentar" }, + "linea_tokens": { + "default_title": "$LINEA", + "title_earned": "Ganaste {{amount}} $LINEA" + }, "upcoming_rewards_error": { "error_fetching_title": "No se pudieron cargar las recompensas", "error_fetching_description": "Comprueba tu conexión y vuelve a intentarlo.", @@ -6898,6 +7032,15 @@ "claim_reward_error": { "title": "No se pudo reclamar la recompensa" }, + "metal_card_claim": { + "title": "Canjea tu recompensa", + "description": "La tarjeta MetaMask Metal está sujeta a requisitos de elegibilidad y no está disponible en todas las regiones. Si no cumples los requisitos, recibirás una recompensa exclusiva de mercancía premium.", + "contact_info": "Comparte tu información de contacto y recibirás una respuesta dentro de 2 semanas de @MidwitMilhouse en Telegram o christian.montoya@consensys.net.", + "email_label": "Correo electrónico", + "email_validation_error": "Ingresa una dirección de correo electrónico válida", + "telegram_label": "Nombre de usuario de Telegram", + "telegram_placeholder": "Opcional" + }, "accounts_opt_in_state_error": { "error_fetching_title": "No se pudieron cargar las cuentas", "error_fetching_description": "Comprueba tu conexión y vuelve a intentarlo.", @@ -7052,12 +7195,12 @@ "dashboard_modal_info": { "active_account": { "title": "No te lo pierdas", - "description": "Agrega tu cuenta para comenzar a ganar puntos por tu actividad.", + "description": "Add your account to Rewards.", "confirm": "Agregar cuenta" }, "multiple_unlinked_accounts": { - "title": "Empieza a ganar puntos", - "description": "Agrega tus cuentas para que puedas realizar un seguimiento de tus recompensas de un vistazo.", + "title": "No te lo pierdas", + "description": "Add your accounts to Rewards.", "confirm": "Agregar cuentas" }, "account_not_supported": { @@ -7110,10 +7253,10 @@ } }, "predict": { - "title": "Mercados de predicción", + "title": "Predicciones", "description": "20 puntos por cada predicción de $10", "sheet": { - "title": "Mercados de predicción", + "title": "Predicciones", "points": "20 puntos cada $10", "description": "Gana puntos por cada $10 en operaciones.", "cta_label": "Explorar mercados" @@ -7191,6 +7334,19 @@ "time_left": "restantes", "expired": "Vencida" }, + "end_of_season_rewards": { + "confirm_label_default": "Confirmar", + "confirm_label_access": "Acceso", + "redeem_success_title": "Recompensa canjeada", + "metal_card_claim_success": "Información de contacto confirmada", + "linea_tokens_claim_success": "Dirección confirmada", + "arriving_soon": "Llegando pronto", + "check_back_soon": "Vuelve pronto para reclamar", + "redeem_failure_title": "Canje fallido", + "redeem_failure_description": "Inténtalo de nuevo más tarde.", + "reward_details": "Detalles de la recompensa", + "select_account_description": "Selecciona la cuenta a la que quieres enviar la recompensa. Los tokens se distribuirán en dos semanas." + }, "animation": { "could_not_load": "No se pudo cargar" } @@ -7257,13 +7413,13 @@ "still_connecting_network": "Todavía conectándose a {{networkName}}...", "unable_to_connect_network": "No se puede conectar a {{networkName}}.", "update_rpc": "Actualizar RPC", + "switch_to_metamask_default_rpc": "Switch to MetaMask default RPC", "check_network_connectivity": "Comprueba tu conectividad de red.", - "check_network_connectivity_or": "Comprueba tu conectividad de red o" + "check_network_connectivity_or": "Comprueba tu conectividad de red o", + "updated_to_metamask_default": "Updated to MetaMask default" }, "trending": { "title": "Explore", - "view_all": "View all", - "tokens": "Tokens", "trending_tokens": "Trending tokens", "price_change": "Price change", "all_networks": "Todas las redes", @@ -7295,6 +7451,10 @@ "title": "Trending tokens is not available", "description": "We can't fetch this page right now", "try_again": "Inténtalo de nuevo" + }, + "empty_search_result_state": { + "title": "No se encontraron tokens", + "description": "We were not able to find this token" } }, "ota_update_modal": { diff --git a/locales/languages/fr.json b/locales/languages/fr.json index 31462ab8038a..ca67582dd908 100644 --- a/locales/languages/fr.json +++ b/locales/languages/fr.json @@ -8,7 +8,7 @@ "increment": "Incrémenter le compteur Redux" }, "pet_name": { - "list_count_text": "Pet names on this network", + "list_count_text": "Noms d’animaux de compagnie sur ce réseau", "add_pet_name_button": "Add pet name", "address": "adresse", "address_placeholder": "0x…", @@ -193,11 +193,10 @@ "connector": "à" }, "autocomplete": { - "placeholder": "Recherche par jeton, site ou adresse", + "placeholder": "Rechercher par site ou par adresse", "recents": "Récents", "favorites": "Favoris", - "sites": "Sites", - "tokens": "Jetons" + "sites": "Sites" }, "navigation": { "back": "Retour", @@ -306,7 +305,7 @@ "get_started": "Premiers pas" }, "onboarding_wizard": { - "skip_tutorial": "Skip tutorial", + "skip_tutorial": "Ignorer le tutoriel", "coachmark": { "action_back": "Non, merci.", "action_next": "Présentation", @@ -330,12 +329,12 @@ "content3": "maintenant pour modifier le nom du compte." }, "step4": { - "title": "Main menu", + "title": "Menu principal", "content1": "Ce menu vous permet d’accéder à l’historique des transactions, aux paramètres et au service d’assistance.", "content2": "Vous pouvez effectuer d’autres actions sur vos comptes et accéder aux paramètres de MetaMask." }, "step5": { - "title": "Explorer à l’aide du navigateur", + "title": "Explorer le navigateur", "content1": "Vous pouvez explorer le Web3 depuis le navigateur" }, "step6": { @@ -596,9 +595,9 @@ "transaction_activity": "Activité", "request_feature": "Solliciter une fonctionnalité", "submit_feedback_message": "Choisissez le type de commentaire à envoyer.", - "submit_bug": "Bug report", + "submit_bug": "Rapport de bogue", "submit_general_feedback": "Général", - "share_address": "Share my public address", + "share_address": "Partager mon adresse publique", "view_in_etherscan": "Afficher sur Etherscan", "view_in": "Afficher sur", "browser": "Navigateur", @@ -612,12 +611,13 @@ "lock_cancel": "NON", "feedback": "Commentaires", "metamask_support": "Service d’assistance MetaMask", - "public_address": "Public address" + "public_address": "Adresse publique" }, "send": { "available": "disponible", "invalid_value": "Valeur non valide", "insufficient_funds": "Fonds insuffisants", + "insufficient_balance_to_cover_fee": "Insufficient balance to cover fees", "continue": "Continuer", "unit": "unité", "units": "unités", @@ -643,8 +643,8 @@ "no_tokens_available": "Aucun jeton disponible", "sign": "Signer", "network_not_found_title": "Réseau introuvable", - "network_not_found_description": "Le réseau portant l’identificateur de chaîne {{chain_id}} n’a pas été trouvé dans votre portefeuille. Veuillez commencer par ajouter le réseau.", - "network_missing_id": "Identificateur de chaîne manquant.", + "network_not_found_description": "Network with chain ID {{chain_id}} not found in your wallet. Please add the network first.", + "network_missing_id": "Missing chain ID.", "search_tokens": "Rechercher des jetons", "search_tokens_and_nfts": "Rechercher des jetons et des NFT", "tokens": "Jetons", @@ -675,13 +675,13 @@ "limitError": "Échec de la vérification de vos limites de dépôt. Veuillez réessayer plus tard." }, "token_modal": { - "select_a_token": "Sélectionner un jeton", + "select_a_token": "Sélectionnez un jeton", "select_token": "Sélectionnez un jeton", "search_by_name_or_address": "Rechercher un jeton par nom ou adresse", "no_tokens_found": "Aucun jeton correspondant à vos critères de recherche : {{searchString}}", "unsupported_token_title": "Non disponible", - "unsupported_token_description": "This token may not be available in your region or supported by any local payment providers", - "error_loading_tokens": "Unable to load tokens. Please try again later." + "unsupported_token_description": "Ce jeton peut ne pas être disponible dans votre région ou pris en charge par les prestataires de services de paiement locaux", + "error_loading_tokens": "Impossible de charger les jetons. Veuillez réessayer plus tard." }, "networks_filter_bar": { "all_networks": "Tous les réseaux" @@ -696,12 +696,12 @@ "title": "Paramètres", "view_order_history": "Consultez l’historique des ordres", "contact_support": "Contacter le service d’assistance", - "log_out": "Log out of Transak", + "log_out": "Se déconnecter de Transak", "logged_out_success": "Déconnexion réussie", "error_sdk_not_initialized": "SDK non initialisé", "logged_out_error": "Erreur lors de la déconnexion", - "more_ways_to_buy": "More ways to buy", - "more_ways_to_buy_description": "Switch to the classic version" + "more_ways_to_buy": "Autres moyens d’effectuer un achat", + "more_ways_to_buy_description": "Passer à la version classique" }, "region_modal": { "select_a_region": "Sélectionner la région", @@ -714,7 +714,7 @@ "no_state_results": "Aucun État correspondant à vos critères de recherche : {{searchString}}" }, "payment_modal": { - "select_a_payment_method": "Select a payment method" + "select_a_payment_method": "Sélectionnez un mode de paiement" }, "payment_duration": { "instant": "Instantané", @@ -805,7 +805,7 @@ "button": "Accepter et continuer" }, "additional_verification": { - "title": "Additional verification", + "title": "Vérification supplémentaire", "paragraph_1": "Pour les dépôts plus importants, vous devrez fournir une pièce d’identité valide (comme un permis de conduire) ainsi qu’un selfie en temps réel.", "paragraph_2": "Pour finaliser le processus de vérification, vous devez autoriser l’accès à votre caméra.", "button": "Continuer" @@ -832,7 +832,7 @@ "dob_invalid": "Veuillez saisir une date de naissance valide", "ssn_required": "Le champ « Numéro de sécurité sociale » est obligatoire", "unexpected_error": "Une erreur inattendue est survenue, veuillez réessayer.", - "phone_already_registered": "This phone number is already in use by {{email}}. Log in using this email to continue.", + "phone_already_registered": "Ce numéro de téléphone est déjà utilisé par {{email}}. Connectez-vous à l’aide de cette adresse e-mail pour continuer.", "login_with_email": "Connectez-vous avec votre adresse e-mail" }, "enter_address": { @@ -844,7 +844,7 @@ "address_line_2": "Ligne d’adresse 2 (facultatif)", "state": "État/Région", "city": "Ville", - "postal_code": "Postal/zip code", + "postal_code": "Code postal", "country": "Pays", "select_state": "Sélectionner un État", "address_line_1_required": "Le champ « Ligne d’adresse 1 » est obligatoire", @@ -854,7 +854,7 @@ "city_invalid": "Veuillez saisir une ville valide", "state_required": "Le champ « État/Région » est obligatoire", "state_invalid": "Veuillez saisir un État valide", - "postal_code_required": "Postal/zip code is required", + "postal_code_required": "Le champ « Code postal » est obligatoire", "postal_code_invalid": "Veuillez saisir un code postal valide", "unexpected_error": "Erreur inattendue." }, @@ -903,7 +903,7 @@ "cancel_order_button": "Annuler l’ordre" }, "order_details": { - "title": "Deposit order", + "title": "Ordre de dépôt", "error_title": "Une erreur s’est produite lors du traitement de votre ordre de dépôt", "error_message": "Une erreur inattendue est survenue." }, @@ -955,14 +955,14 @@ "fetch_payment_methods": "Un problème est survenu lors de la récupération de la liste des modes de paiement.", "fetch_user_details": "Un problème est survenu lors de la récupération des informations de l’utilisateur.", "try_again": "Réessayez", - "error_details_title": "Error details", + "error_details_title": "Détails de l’erreur", "see_more": "Afficher plus" } }, "perps": { - "basic_functionality_disabled_title": "Perps is not available", + "basic_functionality_disabled_title": "Contrats à terme perpétuels non disponibles", "title": "Perps", - "perps_trading": "Trading de contrats perpétuels", + "perps_trading": "Trading de contrats à terme perpétuels (perps)", "perp_account_balance": "Solde du compte de trading de contrats à terme perpétuels (perps)", "manage_balance": "Gérer le solde", "total_balance": "Solde total", @@ -974,6 +974,10 @@ "not_now": "Pas maintenant", "try_now": "Commencer" }, + "discovery_banner": { + "title": "Tradez un contrat à terme perpétuel sur {{symbol}}", + "subtitle": "Multipliez vos pertes et profits jusqu’à {{leverage}} fois" + }, "today": "Aujourd’hui", "yesterday": "Hier", "unrealized_pnl": "Profits et pertes non réalisés", @@ -1047,7 +1051,7 @@ "preparing": "En train de préparer le dépôt…", "swapping": "Échange de {{token}} contre des USDC", "bridging": "Établir une passerelle vers Hyperliquid", - "depositing": "Effectuer un dépôt sur le compte de contrats à terme perpétuels (perps)", + "depositing": "Effectuer un dépôt sur le compte de trading contrats à terme perpétuels", "depositing_direct": "En train de transférer des USDC directement sur votre compte HyperLiquid…" }, "step_descriptions": { @@ -1199,7 +1203,7 @@ "short": "Vendre {{asset}}" }, "tpsl_modal": { - "title": "Take profit et Stop loss", + "title": "Take profit et stop loss", "save": "Sauvegarder", "current_price": "Prix actuel : {{price}}", "on": "ACTIVÉ", @@ -1306,8 +1310,8 @@ "cancel": "Annuler", "margin": "Marge", "includes_pnl": "comprend les profits et pertes", - "pnl": "Profits et pertes", - "estimated_pnl": "Estimation des profits et pertes", + "pnl": "Résultat", + "estimated_pnl": "Pertes et profits estimés", "fees": "Frais", "receive": "Vous recevrez", "you_receive": "Vous recevrez", @@ -1414,6 +1418,7 @@ "failedToEstablishAllMids": "La mise en place de l’abonnement global à allMids a échoué", "failedToEstablishMarketData": "La mise en place de l’abonnement aux données de marchés pour {{symbol}} a échoué", "failed_to_toggle_network": "L’activation/la désactivation du réseau a échoué", + "failed_to_switch_provider": "Échec du changement de fournisseur", "noAccountSelected": "Aucun compte sélectionné", "unsupportedMethod": "Méthode non prise en charge : {{method}}", "invalidAddressFormat": "Format d’adresse non valide : {{address}}", @@ -1452,6 +1457,24 @@ "orderLeverageReductionFailed": "Vous ne pouvez pas réduire votre effet de levier", "insufficientLiquidity": "Liquidités insuffisantes pour exécuter l’ordre. Essayez d’utiliser un ordre à cours limité ou réessayez dans quelques instants.", "connectionTimeout": "Le délai de connexion a expiré. Veuillez vérifier votre connexion réseau et réessayer.", + "clientReinitializing": "Le service est en cours de réinitialisation. Veuillez patienter un instant et réessayer.", + "transferFailed": "Impossible de transférer des fonds. Veuillez réessayer.", + "swapFailed": "Impossible d’échanger des jetons. Veuillez réessayer.", + "spotPairNotFound": "La paire que vous essayez de trader n’est pas disponible pour le moment.", + "priceUnavailable": "Les données de prix ne sont pas disponibles. Veuillez actualiser la page et réessayer.", + "batchCancelFailed": "Certains ordres n’ont pas pu être annulés. Veuillez réessayer.", + "batchCloseFailed": "Certaines positions n’ont pas pu être clôturées. Veuillez réessayer.", + "insufficientMargin": "Marge insuffisante pour exécuter cet ordre de bourse. Envisagez d’ajouter des fonds ou de réduire la taille de votre position.", + "reduceOnlyViolation": "Cette ordre augmenterait votre position. Seuls les ordres de réduction sont autorisés.", + "positionWouldFlip": "Cet ordre inverserait la direction de votre position. Veuillez d’abord clôturer votre position existante.", + "marginAdjustmentFailed": "Impossible d’ajuster la marge. Veuillez réessayer.", + "tpslUpdateFailed": "Impossible de mettre à jour le take profit/stop loss. Veuillez réessayer.", + "orderRejected": "L’ordre a été rejeté. Veuillez vérifier vos paramètres et réessayer.", + "slippageExceeded": "Le prix a trop fluctué. Essayez d’utiliser un ordre à cours limité ou augmentez la tolérance au slippage.", + "rateLimitExceeded": "Trop de demandes. Veuillez patienter un instant et réessayer.", + "serviceUnavailable": "Le service est temporairement indisponible. Veuillez réessayer plus tard.", + "networkErrorSimple": "Une erreur réseau s’est produite. Veuillez vérifier votre connexion et réessayer.", + "insufficientBalance": "Solde insuffisant pour effectuer cette opération. Veuillez vérifier vos fonds disponibles.", "connectionFailed": { "title": "Impossible de se connecter aux contrats à terme perpétuels", "description": "Nous mettons tout en œuvre pour rétablir la connexion.", @@ -1697,7 +1720,14 @@ "retry_connection": "Réessayer d’établir une connexion", "retrying_connection": "Connexion en cours…", "connecting_to_perps": "Connexion aux contrats à terme perpétuels", - "timeout_title": "La connexion prend plus de temps que prévu" + "timeout_title": "La connexion prend plus de temps que prévu", + "websocket_disconnected": "Votre connexion est hors ligne.", + "websocket_disconnected_message": "Les données ne sont peut-être pas à jour.", + "websocket_connecting": "Connexion aux contrats à terme perpétuels…", + "websocket_connecting_message": "Restauration de la connexion… Tentative {{attempt}}", + "websocket_connected": "Connecté", + "websocket_connected_message": "Reprise des mises à jour en temps réel des données", + "websocket_retry": "Réessayer" }, "chart": { "no_data": "Aucune donnée graphique disponible", @@ -1754,6 +1784,9 @@ "title": "Contacter le service d’assistance", "description": "Contactez le service d’assistance de MetaMask pour obtenir de l’aide" }, + "feedback": { + "title": "Donnez-nous votre avis" + }, "close_all_modal": { "title": "Fermer toutes les positions", "description": "Nous fermerons toutes vos positions ouvertes au prix actuel du marché.", @@ -1806,7 +1839,11 @@ "price_change_low_to_high": "Variation des prix : du plus bas au plus élevé", "past_hour": "Dernière heure", "past_24_hours": "Dernières 24 heures", - "time": "Temps" + "time": "Temps", + "apply": "Appliquer" + }, + "market_type": { + "filter_by": "Filtrer par" }, "perps_markets": "Marchés de contrats à terme perpétuels (perps)", "volume": "Volume", @@ -1823,6 +1860,7 @@ "mainnet": "Mainnet", "developer_options": { "hyperliquid_network_toggle": "Activer/désactiver le réseau Hyperliquid", + "provider_mode_toggle": "Mode fournisseur", "simulate_connection_error": "Simuler une erreur de connexion" }, "transactions": { @@ -1942,7 +1980,7 @@ } }, "predict": { - "title": "MetaMask Predict", + "title": "Prédictions MetaMask", "prediction_markets": "Marchés prédictifs", "market_list": "Liste des marchés", "loading": "Chargement…", @@ -1981,7 +2019,8 @@ "fee_exemption": "Nous ne facturons aucun frais sur ce marché.", "ended": "Terminé", "resolved_early": "Résolu prématurément", - "disclaimer": "Ces informations peuvent être incomplètes. Toutes les règles du marché, les critères de résolution et les résultats finaux sont régis exclusivement par Polymarket. Les ordres de bourse doivent être exécutés conformément à l’ensemble des règles disponibles sur Polymarket." + "disclaimer": "Ces informations peuvent être incomplètes. Toutes les règles du marché, les critères de résolution et les résultats finaux sont régis exclusivement par Polymarket. Les ordres de bourse doivent être exécutés conformément à l’ensemble des règles disponibles sur Polymarket.", + "your_picks": "Vos pronostics" }, "tab": { "no_predictions_description": "Vos prédictions apparaîtront ici, indiquant votre mise et l’évolution du marché.", @@ -2001,6 +2040,8 @@ "cashout_info": "{{amount}} sur {{outcome}} à {{initialPrice}} ", "cashout_info_multiple": "{{amount}} sur {{outcomeGroupTitle}} • {{outcome}} à {{initialPrice}}", "position_info": "{{initialValue}} sur {{outcome}} pour gagner {{shares}}", + "position_pick_info": "{{initialValue}} sur {{outcome}}", + "position_pick_info_to_win": "{{initialValue}} sur {{outcome}} pour gagner", "buy_yes": "Oui", "buy_no": "Non", "outcomes": "résultats", @@ -2035,6 +2076,7 @@ "won_markets_text": "{{count}} marché{{s}} gagné(s)", "available_balance": "Solde disponible", "claim_amount_text": "Réclamer {{amount}} $", + "claim_winnings_text": "Réclamer vos gains", "unrealized_pnl_label": "Profits et pertes non réalisés", "unrealized_pnl_value": "{{amount}} ({{percent}})", "unrealized_pnl_error": "Impossible de charger", @@ -2173,6 +2215,15 @@ "order_not_fully_filled": "Votre ordre n’a pas pu être exécuté", "buy_order_not_fully_filled": "Il n’y a actuellement pas suffisamment d’actions disponibles au prix du marché pour passer votre ordre.", "sell_order_not_fully_filled": "Il n’y a actuellement pas assez de demande au prix du marché pour effectuer un retrait." + }, + "game_details_footer": { + "pick_a_winner": "Choisissez un gagnant", + "volume_display": "{{volume}} $ vol.", + "read_terms": "Lisez l’intégralité des conditions générales du contrat" + }, + "sports": { + "halftime": "Mi-temps", + "final": "Finale" } }, "receive": { @@ -2290,7 +2341,7 @@ "add_funds": "Ajouter des fonds", "next": "Suivant", "buy_asset": "Achetez {{asset}}", - "no_tokens": "Vous n’avez aucun jeton !", + "no_tokens": "Vous n’avez aucun jeton ", "show_tokens_without_balance": "Afficher les jetons sans solde", "nfts_autodetection_title": "Détection de NFT", "nfts_autodetection_desc": "Laissez MetaMask détecter et afficher automatiquement les NFT dans votre portefeuille.", @@ -2303,7 +2354,7 @@ "target_scam_network": ", ce qui en fait une cible pour les escrocs. Vérifiez toutes les informations avant de continuer, car vous risquez de vous faire arnaquer.", "use_the_currency_symbol": "utilise le symbole monétaire", "use_correct_symbol": "Assurez-vous que vous utilisez le bon symbole avant de continuer", - "chain_id_currently_used": "Cet ID de chaîne est actuellement utilisé par le", + "chain_id_currently_used": "This chain ID is currently used by the", "incorrect_network_name_warning": "Selon nos informations, il se peut que le nom du réseau ne corresponde pas exactement à cet ID de chaîne.", "suggested_name": "Nom suggéré :", "network_check_validation_desc": "réduit les risques de connexion au mauvais réseau ou à un réseau malveillant.", @@ -2314,7 +2365,7 @@ "nft_empty_description": "Le monde des NFT s’offre à vous. Commencez votre collection dès aujourd’hui.", "tokens_empty_description": "Nothing to see yet. Why not browse tokens or make a trade?", "discover_nfts": "Importer des NFT", - "no_transactions": "Vous n’avez aucune transaction !", + "no_transactions": "Vous n’avez aucune transaction ", "switch_network_to_view_transactions": "Veuillez changer de réseau pour visualiser les transactions", "send_button": "Envoyer", "deposit_button": "Dépôt", @@ -2362,6 +2413,7 @@ "network_fee": "Frais de réseau", "lists": "Token lists", "hide_cta": "Masquer le jeton", + "perps_trading": "Trading de contrats à terme perpétuels (perps)", "options": { "title": "Token options", "view_on_portfolio": "Voir sur Portfolio", @@ -2409,8 +2461,8 @@ "add_token": "IMPORTER" }, "collectibles": { - "cancel_add_collectible": "ANNULER", - "add_collectible": "IMPORTER" + "cancel_add_collectible": "Annuler", + "add_collectible": "Importer" }, "banners": { "search_desc": "La détection améliorée des jetons est actuellement disponible sur le réseau {{network}}. ", @@ -2521,19 +2573,20 @@ "billion_abbreviation": "Mrd", "trillion_abbreviation": "B", "million_abbreviation": "M", - "thousand_abbreviation": "k", + "thousand_abbreviation": "K", "token_details": "Détails du jeton", "contract_address": "Adresse du contrat", "token_list": "Liste des jetons", "market_details": "Détails du marché", "market_cap": "Market cap", "total_volume": "Total volume (24h)", - "volume_to_marketcap": "Volume / market cap", + "volume_to_marketcap": "Volume / Market cap", "circulating_supply": "Offre en circulation", "all_time_high": "Le plus haut niveau jamais atteint", "all_time_low": "Le plus bas niveau jamais atteint", "fully_diluted": "Entièrement diluée", - "unknown": "Inconnu" + "unknown": "Inconnu", + "stock": "Stock" }, "collectible": { "collectible_address": "Adresse", @@ -2584,7 +2637,7 @@ "remove_snap_account": "Supprimer le compte Snap", "remove_snap_account_alert_description": "Ce compte sera supprimé de votre portefeuille. Veuillez vous assurer que vous disposez de la phrase secrète de récupération ou de la clé privée d’origine pour ce compte importé avant de continuer. Vous pouvez importer ou créer à nouveau des comptes à partir du menu déroulant des comptes.", "remove_account_alert_remove_btn": "Supprimer", - "remove_account_alert_cancel_btn": "Tant pis", + "remove_account_alert_cancel_btn": "Never mind", "accounts_title": "Comptes", "connect_account_title": "Connecter le compte", "connect_accounts_title": "Connecter les comptes", @@ -2621,7 +2674,7 @@ "advisory_by": "Avis fourni par le détecteur d’hameçonnage Ethereum et PhishFort", "potential_threat": "Parmi les menaces potentielles, il y a", "fake_metamask": "Les fausses versions de MetaMask", - "srp_theft": "Le vol de phrase secrète de récupération ou de mot de passe", + "srp_theft": "Secret Recovery Phrase or password theft", "malicious_transactions": "Les transactions malveillantes pour voler vos actifs", "secret_recovery_phrase": "Phrase secrète de récupération", "account_name": "Nom du compte", @@ -2676,8 +2729,8 @@ }, "connect_qr_hardware": { "title": "Connecter un hardware wallet (portefeuille matériel) basé sur code QR", - "description1": "Connecter un portefeuille matériel AirGap qui communique par codes QR.", - "description2": "Comment ça marche ?", + "description1": "Connect an airgapped hardware wallet that communicates through QR codes.", + "description2": "Comment ça marche ", "description3": "Voici les portefeuilles matériels AirGap officiellement pris en charge :", "keystone": "Keystone", "ngravezero": "Ngrave Zero", @@ -2718,14 +2771,14 @@ "select_rpc_url": "Sélectionner l’URL du RPC", "title": "Paramètres", "current_conversion": "Devise de base", - "current_language": "Current language", - "ipfs_gateway": "Passerelle IPFS", + "current_language": "Langue actuelle", + "ipfs_gateway": "passerelle IPFS", "ipfs_gateway_content": "MetaMask utilise des services tiers pour afficher des images de vos NFT stockés sur IPFS, des informations relatives aux adresses ENS saisies dans la barre d’adresse de votre navigateur et l’icône des différents jetons. Votre adresse IP peut être exposée si vous avez recours à ces services.", "ipfs_gateway_down": "Votre passerelle IPFS actuelle est hors service", "ipfs_gateway_desc": "Choisissez votre passerelle IPFS préférée.", - "search_engine": "Search engine", + "search_engine": "Moteur de recherche", "new_RPC_URL": "Nouveau réseau RPC", - "state_logs": "State logs", + "state_logs": "Journaux d’état", "add_network_title": "Ajouter un réseau", "auto_lock": "Verrouillage automatique", "auto_lock_desc": "Définissez le délai avant le verrouillage automatique de l’application.", @@ -2734,15 +2787,15 @@ "autolock_never": "Jamais", "autolock_after": "Après {{time}} secondes", "autolock_after_minutes": "Après {{time}} minutes", - "reveal_seed_words": "Reveal seed words", - "reset_account": "Reset account", - "state_logs_button": "Download state logs", + "reveal_seed_words": "Révéler les mots de phrase secrète", + "reset_account": "Réinitialiser le compte", + "state_logs_button": "Télécharger les journaux d’état", "reveal_seed_words_button": "RÉVÉLER LES MOTS DE PHRASE SECRÈTE", - "reset_account_button": "Reset account", + "reset_account_button": "Réinitialiser le compte", "reset_account_confirm_button": "Oui, réinitialiser", "reset_account_cancel_button": "Annuler", - "reset_account_modal_title": "Reset account?", - "clear_approvals_modal_title": "Clear approval data?", + "reset_account_modal_title": "Voulez-vous réinitialiser le compte ?", + "clear_approvals_modal_title": "Voulez-vous effacer les données d’approbation ?", "clear_approvals_modal_message": "Toutes les applications décentralisées (Ðapps) devront demander un accès pour consulter à nouveau les informations du compte.", "clear_browser_history_modal_title": "Voulez-vous effacer l’historique du navigateur ?", "clear_browser_history_modal_message": "Nous sommes sur le point de supprimer tout l’historique de votre navigateur. Êtes-vous sûr(e) de vouloir continuer ?", @@ -2764,7 +2817,7 @@ "protect_title": "Récupération du portefeuille", "banner_social_login_enabled": "Se connecter avec {{authConnection}}", "manage_recovery_method": "Gérer les méthodes de récupération", - "video_failed": "Video failed to load.", + "video_failed": "Échec du chargement de la vidéo.", "protect_desc": "Sauvegardez votre phrase secrète de récupération pour ne jamais perdre l’accès à votre portefeuille. Veillez à la conserver dans un endroit sûr auquel personne d’autre que vous ne peut accéder et que vous ne risquez pas d’oublier", "protect_desc_no_backup": "Voici la phrase de 12 mots de votre portefeuille. Celle-ci peut être utilisée pour prendre le contrôle de tous vos comptes actuels et futurs, y compris la possibilité d’envoyer des fonds dans votre portefeuille. Conservez-la en sécurité et ne la partagez avec PERSONNE. MetaMask ne peut en aucun cas vous aider à récupérer cette clé.", "learn_more": "En savoir plus.", @@ -2783,9 +2836,9 @@ "show_fiat_on_testnets_desc": "Sélectionnez cette option pour afficher la conversion des monnaies fiduciaires sur les réseaux de test.", "show_fiat_on_testnets_modal_title": "Soyez prudent", "show_fiat_on_testnets_modal_description": "Si jamais on vous demande d’activer cette fonction, faites attention, car il peut s’agir d’une arnaque. Ces jetons n’ont aucune valeur monétaire et ne sont utilisés qu’à des fins de test. Cette fonction permet aux développeurs de vérifier si leurs applications fonctionnent correctement.", - "show_fiat_on_testnets_modal_learn_more": "En savoir plus.", + "show_fiat_on_testnets_modal_learn_more": "En savoir plus", "show_fiat_on_testnets_modal_button": "Continuer", - "show_hex_data": "Show hex data", + "show_hex_data": "Afficher les données hexadécimales", "show_hex_data_desc": "Sélectionnez cette option pour afficher le champ de données hexadécimales sur l’écran d’envoi.", "accounts_identicon_title": "Icône du compte", "accounts_identicon_desc": "Choisissez parmi trois styles différents d’icônes uniques qui vous aideront à identifier vos comptes en un coup d’œil.", @@ -2805,9 +2858,9 @@ "customize_session_desc": "Activez les types de notifications que vous souhaitez recevoir :", "account_session_title": "Activité du compte", "account_session_desc": "Sélectionnez les comptes pour lesquels vous souhaitez recevoir des notifications :", - "assets_sent_title": "Assets sent", + "assets_sent_title": "Actifs envoyés", "assets_sent_desc": "Fonds et NFT", - "assets_received_title": "Assets received", + "assets_received_title": "Actifs reçus", "assets_received_desc": "Fonds et NFT", "defi_title": "DeFi", "defi_desc": "Staking, échange et pontage", @@ -2827,14 +2880,14 @@ "back": "Retour", "security_desc": "Paramètres de confidentialité, MetaMetrics, clé privée et phrase secrète de récupération.", "networks_title": "Réseaux", - "networks_default_title": "Default network", + "networks_default_title": "Réseau par défaut", "network_delete": "Si vous supprimez ce réseau, vous devrez l’ajouter à nouveau pour voir vos actifs sur ce réseau", "networks_default_cta": "Utiliser ce réseau", "add_rpc_url": "Ajouter l’URL de l’appel de procédure à distance (RPC)", "add_block_explorer_url": "Ajouter l’URL de l’explorateur de blocs", "networks_desc": "Ajouter et modifier des réseaux RPC personnalisés", - "network_name_label": "Network name", - "network_name_placeholder": "Network name (optional)", + "network_name_label": "Nom du réseau", + "network_name_placeholder": "Nom du réseau (facultatif)", "network_rpc_url_label": "URL de l’appel de procédure à distance", "network_rpc_name_label": "Nom du RPC", "network_rpc_placeholder": "Nouveau réseau RPC", @@ -2846,9 +2899,9 @@ "network_block_explorer_label": "URL de l’explorateur de blocs", "network_block_explorer_placeholder": "URL de l’explorateur de blocs (facultatif)", "network_chain_id_warning": "ID de chaîne non valide", - "network_other_networks": "Other networks", + "network_other_networks": "Autres réseaux", "network_rpc_networks": "Réseaux RPC", - "network_add_network": "Add network", + "network_add_network": "Ajouter un réseau", "network_add_custom_network": "Ajouter un réseau personnalisé", "network_add": "Ajouter", "network_save": "Enregistrer", @@ -2859,11 +2912,11 @@ "info_title_beta": "À propos de MetaMask Bêta", "info_title_flask": "À propos de MetaMask Flask", "experimental_title": "Expérimental", - "experimental_desc": "WalletConnect et bien plus encore...", + "experimental_desc": "WalletConnect et bien plus encore…", "legal_title": "Mentions légales", "conversion_title": "Conversion des devises", "conversion_desc": "Affichez les valeurs en monnaie fiat en utilisant une devise spécifique dans toute l’application.", - "primary_currency_title": "Primary currency", + "primary_currency_title": "Devise principale", "primary_currency_desc": "Sélectionnez Native pour afficher en priorité les valeurs dans la monnaie native de la chaîne (p. ex. ETH). Sélectionnez Fiat pour afficher en priorité les valeurs dans la monnaie fiat que vous avez choisie.", "primary_currency_text_first": "Native", "primary_currency_text_second": "Fiat", @@ -2884,7 +2937,7 @@ "batch_balance_requests_description": "Mettez à jour le solde de tous vos comptes en même temps. Si vous désactivez cette fonction, les autres utilisateurs seront moins susceptibles d’associer un compte à un autre.", "third_party_title": "Obtenir les transactions entrantes", "third_party_description": "Des API tierces (Etherscan) sont utilisées pour afficher vos transactions entrantes dans l’historique. Désactivez cette option si vous ne voulez pas que nous récupérions les données de ces services.", - "metametrics_opt_out": "Désactiver MetaMetrics", + "metametrics_opt_out": "désactiver MetaMetrics", "metametrics_restart_required": "Vous devez redémarrer l’application pour que les modifications prennent effet.", "create_password": "Créer un mot de passe", "invalid_password": "Mot de passe incorrect", @@ -2900,11 +2953,11 @@ "invalid_number": "Numéro non valide. Saisissez un nombre décimal ou hexadécimal avec le préfixe « 0x ».", "invalid_number_leading_zeros": "Numéro non valide. Supprimez tous les zéros en trop.", "invalid_number_range": "Numéro non valide. Saisissez un nombre compris entre 1 et %{maxSafeChainId}.", - "hide_zero_balance_tokens_title": "Hide tokens without balance", + "hide_zero_balance_tokens_title": "Masquer les jetons sans solde", "hide_zero_balance_tokens_desc": "Empêche l’affichage des jetons sans solde dans votre liste de jetons.", "token_detection_title": "Détection automatique des jetons", "token_detection_description": "Nous utilisons des API tierces pour détecter et afficher les nouveaux jetons envoyés à votre portefeuille. Désactivez cette option si vous ne souhaitez pas que l’application récupère les données de ces services.", - "theme_button_text": "Change theme", + "theme_button_text": "Changer le thème", "theme_title": "Thème ({{theme}})", "theme_description": "Changez l’apparence de votre application en configurant le thème.", "theme_os": "Système", @@ -2936,13 +2989,13 @@ "delete_metrics_description_after_delete_part_two": ". Ce processus peut prendre jusqu’à 30 jours. Veuillez consulter notre", "delete_metrics_description_privacy_policy": "Politique de confidentialité.", "delete_metrics_button": "Supprimer les données MetaMetrics", - "check_status_button": "Check status", + "check_status_button": "Vérifier l’état", "delete_metrics_confirm_modal_title": "Supprimer les données MetaMetrics?", "delete_metrics_confirm_modal_description": "Nous sommes sur le point de supprimer toutes vos données MetaMetrics. Êtes-vous sûr(e) de vouloir continuer ?", "delete_wallet_data_title": "Réinitialiser le portefeuille", "delete_wallet_data_description": "Cela supprimera toutes les données liées au portefeuille de votre appareil. Vos comptes existent sur la blockchain et ne sont pas liés à MetaMask. Vous pouvez toujours récupérer vos comptes en utilisant votre phrase secrète de récupération.", "delete_wallet_data_button": "Réinitialiser le portefeuille", - "delete_data_status_title": "Deletion task status", + "delete_data_status_title": "État d’avancement de la suppression", "delete_data_status_description": "L’état actuel de la demande est", "delete_metrics_error_title": "Il nous est impossible de supprimer ces données pour le moment.", "delete_metrics_error_description": "Impossible de répondre à cette demande pour le moment en raison d’un problème avec le serveur du système d’analyse. Veuillez réessayer plus tard.", @@ -2957,6 +3010,7 @@ "description": "Région et plus encore...", "current_region": "Région actuelle", "reset_region": "Réinitialiser la région", + "change_region": "Changer de région", "no_region_selected": "Aucune région sélectionnée", "sdk_activation_keys": "Clés d'activation du SDK", "activation_keys_description": "Les clés d’activation permettent d’activer des fonctions ou des fournisseurs spécifiques.", @@ -3007,13 +3061,13 @@ }, "snap_details": { "install_date": "Installé le {{date}}", - "install_origin": "Install origin", + "install_origin": "Installer Origin", "enabled": "Activé", "version": "Version" }, "keyring_account_list_item": { "account_name": "Nom du compte", - "public_address": "Public address" + "public_address": "Adresse publique" }, "snap_permissions": { "approved_date": "Approuvé le {{date}}", @@ -3068,24 +3122,24 @@ "dismiss_smart_account_update_desc": "Activez cette option si vous ne voulez plus voir la suggestion « Passer à un compte intelligent » sur aucun de vos comptes. Les comptes intelligents vous permettent de bénéficier de transactions plus rapides, de frais de réseau moins élevés et d’une plus grande flexibilité de paiement.", "use_smart_account_heading": "Utiliser un compte intelligent", "use_smart_account_desc": "Gardez cette option activée pour basculer automatiquement les comptes créés dans MetaMask vers des comptes intelligents dès que des fonctionnalités pertinentes sont disponibles, telles que des transactions plus rapides, des frais de réseau réduits et une plus grande flexibilité de paiement.", - "use_smart_account_learn_more": "En savoir plus.", + "use_smart_account_learn_more": "En savoir plus", "smart_transactions_opt_in_heading": "Transactions intelligentes", "smart_transactions_opt_in_desc_supported_networks": "Activez les transactions intelligentes pour profiter de transactions plus fiables et plus sûres sur les réseaux pris en charge.", - "smart_transactions_learn_more": "En savoir plus.", + "smart_transactions_learn_more": "En savoir plus", "simulation_details": "Estimer les changements de solde", "simulation_details_description": "Activez cette option pour estimer les changements de solde des transactions avant de les confirmer. Cela ne garantit pas le résultat final de vos transactions. ", "simulation_details_learn_more": "En savoir plus.", - "aes_crypto_test_form_title": "AES crypto - test form", + "aes_crypto_test_form_title": "AES Crypto - Formulaire de test", "aes_crypto_test_form_description": "Section exclusivement développée pour les tests de bout en bout. Si vous la voyez dans votre application, veuillez le signaler au service d’assistance de MetaMask.", "developer_options": { - "title": "Developer options", - "generate_trace_test": "Generate trace test", - "generate_trace_test_desc": "Generate a developer test Sentry trace.", - "navigate_to_sample_feature": "Navigate to sample feature", + "title": "Options pour les développeurs", + "generate_trace_test": "Générer un test de traçabilité", + "generate_trace_test_desc": "Générer une trace du test en mode développeur de Sentry.", + "navigate_to_sample_feature": "Accéder à l’exemple de fonctionnalité", "sample_feature_desc": "Un exemple de fonctionnalité servant de modèle pour les développeurs." }, "feature_flag_override": { - "title": "Feature flag override", + "title": "Outrepasser le commutateur de fonctionnalité", "description": "Outrepasser localement les commutateurs de fonctionnalité pour cette application." } }, @@ -3138,7 +3192,7 @@ "sdk_feedback_modal": { "ok": "OK", "title": "Impossible de connecter le compte", - "info": "Veuillez scanner le code QR sur la dApp pour vous reconnecter à MetaMask" + "info": "Please scan the QR code on the site to reconnect to MetaMask" }, "app_information": { "title": "Informations", @@ -3146,8 +3200,8 @@ "privacy_policy": "Politique de confidentialité", "terms_of_use": "Conditions d’utilisation", "attributions": "Crédits", - "support_center": "Visit our support center", - "web_site": "Visitez notre site web", + "support_center": "Visitez notre centre d’assistance", + "web_site": "Visit our website", "contact_us": "Contact us" }, "reveal_credential": { @@ -3217,7 +3271,7 @@ "password_reset": { "password_title": "Mot de passe", "password_desc": "Choisissez un mot de passe fort pour déverrouiller l’application MetaMask sur votre appareil. Si vous oubliez ce mot de passe, vous aurez besoin de votre phrase secrète de récupération pour réimporter votre portefeuille.", - "password_learn_more": "En savoir plus.", + "password_learn_more": "En savoir plus", "change_password": "Modifier le mot de passe", "password_hint": "Indice de mot de passe" }, @@ -3247,19 +3301,28 @@ "swap": "Échanger", "bridge": "Passerelle", "earn": "Gagner", - "convert_to_musd": "Convert to mUSD", + "convert_to_musd": "Convertir en mUSD", + "merkl_rewards": { + "annual_bonus": "Bonus de {{apy}} %", + "claimable_bonus": "Bonus réclamable", + "claimable_bonus_tooltip_description": "mUSD bonuses are claimed on Linea.", + "terms_apply": "Terms apply.", + "ok": "OK", + "claim": "Réclamer", + "processing_claim": "Processing claim..." + }, "tron": { - "daily_resource_new_energy": "New daily energy", - "sufficient_to_cover": "Sufficient to cover", + "daily_resource_new_energy": "Nouvelle énergie quotidienne", + "sufficient_to_cover": "Suffisant pour couvrir", "transactions": "en moins", "daily_resource": "Ressource quotidienne", "bandwidth": "Bande passante", "energy": "Énergie", - "daily_resource_description": "This is your daily allowance based on your staked TRX. Hold TRX to get 600 bandwidth daily.", - "sufficient_to_cover_trx_transfers": "Covers ~{{amount}} TRX transfers", - "sufficient_to_cover_trx_transfer": "Covers 1 TRX transfer", - "sufficient_to_cover_usdt_transfers": "Covers ~{{amount}} USDT transfers", - "sufficient_to_cover_usdt_transfer": "Covers 1 USDT transfer" + "daily_resource_description": "Il s’agit de votre quota quotidien de données calculé en fonction des TRX que vous stakez. Conservez des TRX pour bénéficier gratuitement de 600 Mo de bande passante chaque jour.", + "sufficient_to_cover_trx_transfers": "Couvre environ {{amount}} transferts de TRX", + "sufficient_to_cover_trx_transfer": "Couvre 1 transfert de TRX", + "sufficient_to_cover_usdt_transfers": "Couvre environ {{amount}} transferts de USDT", + "sufficient_to_cover_usdt_transfer": "Couvre 1 transfert de USDT" }, "disabled_button": { "buy": "Impossible d’effectuer un achat en utilisant ce compte", @@ -3312,9 +3375,11 @@ }, "no_chart_data": { "title": "Aucune donnée graphique", - "description": "Nous n’avons pas pu obtenir de données relatives à ce jeton" + "description": "Nous n’avons pas pu obtenir de données relatives à ce jeton", + "insufficient_data": "Data is not available for this time period" }, "your_balance": "Votre solde", + "perps_position": "Position sur contrats à terme", "unable_to_load_balance": "Impossible d’afficher votre solde", "about": "À propos", "about_content_display": { @@ -3364,7 +3429,7 @@ "address_copied_to_clipboard": "Adresse du jeton copiée dans le presse-papiers" }, "qr_scanner": { - "invalid_qr_code_title": "Code QR non valide", + "invalid_qr_code_title": "Invalid QR code", "invalid_qr_code_message": "Le code QR que vous essayez de scanner n’est pas valide.", "allow_camera_dialog_title": "Autoriser l’accès à la caméra", "allow_camera_dialog_message": "Nous avons besoin de votre autorisation pour scanner les codes QR", @@ -3377,14 +3442,14 @@ "attempting_sync_from_wallet_error": "Il semble que vous essayez de vous synchroniser avec l’extension. Pour ce faire, vous devrez effacer votre portefeuille actuel. \n\nAprès avoir effacé ou réinstallé une nouvelle version de l’appli, sélectionnez l’option « Synchroniser avec l’extension MetaMask ». Attention ! Avant d’effacer votre portefeuille, effectuez une copie de votre phrase secrète de récupération.", "not_allowed_error_title": "Activer l’accès à l’appareil photo", "not_allowed_error_desc": "Pour scanner un code QR, vous devez autoriser MetaMask à accéder à l’appareil photo depuis le menu des paramètres de votre appareil.", - "unrecognized_address_qr_code_title": "Code QR non reconnu", + "unrecognized_address_qr_code_title": "Unrecognized QR code", "unrecognized_address_qr_code_desc": "Désolé, ce code QR n’est pas associé à une adresse de compte ou à une adresse de contrat.", "url_redirection_alert_title": "Vous allez consulter un lien externe", "url_redirection_alert_desc": "Sachez que les liens peuvent être utilisés pour tenter d’escroquer ou d’hameçonner les utilisateurs. Faites donc bien attention de ne visiter que des sites Web fiables.", "label": "Scanner un code QR", "open_settings": "Paramètres", "camera_not_available": "Caméra non disponible", - "tron_address_not_supported": "Tron addresses are not currently supported" + "tron_address_not_supported": "Les adresses Tron ne sont actuellement pas prises en charge" }, "action_view": { "cancel": "Annuler", @@ -3472,10 +3537,10 @@ "cancel_tx_message": "Cette tentative ne garantit aucunement l’annulation de votre transaction initiale. Si la tentative d’annulation réussit, les frais de transaction ci-dessus vous seront facturés.", "speedup_tx_title": "Essayer d’accélérer ?", "speedup_tx_message": "Cette tentative ne garantit aucunement l’accélération de votre transaction initiale. Si la tentative d’accélération réussit, les frais de transaction ci-dessus vous seront facturés.", - "nevermind": "Tant pis", + "nevermind": "Never mind", "edit_network_fee": "Modifier les frais de gaz", "edit_priority": "Modifier la priorité", - "gas_cancel_fee": "Frais de gaz d’annulation", + "gas_cancel_fee": "Gas cancellation fee", "gas_speedup_fee": "Frais de gaz d’accélération", "use_max": "Utiliser le maximum", "set_gas": "Configurer", @@ -3603,7 +3668,7 @@ "reload": "Recharger", "share": "Partager", "bookmark": "Favori", - "add_to_favorites": "Ajouter aux Favoris", + "add_to_favorites": "Add to favorites", "error": "Erreur", "cancel": "Annuler", "go_back": "Retour", @@ -3611,7 +3676,7 @@ "home": "Accueil", "close": "Fermer", "open_in_browser": "Ouvrir dans le navigateur", - "change_url": "Modifier l’URL", + "change_url": "Change URL", "switch_network": "Changer de réseau", "dapp_browser": "NAVIGATEUR ÐAPPS", "dapp_browser_message": "MetaMask vous sert de portefeuille et de navigateur pour le web décentralisé. Jetez-y un œil !", @@ -3665,7 +3730,7 @@ "approve": { "title": "Approuver", "deeplink": "Lien profond", - "qr_code": "CODE QR" + "qr_code": "Code QR" }, "transactions": { "tx_review_confirm": "Confirmer", @@ -3677,30 +3742,30 @@ "tx_review_increase_allowance": "Increase allowance", "tx_review_set_approval_for_all": "Set approval for all", "tx_review_staking_claim": "Staking claim", - "tx_review_staking_deposit": "Staking deposit", + "tx_review_staking_deposit": "Dépôt de staking", "tx_review_staking_unstake": "Déstaker", - "tx_review_lending_deposit": "Lending deposit", + "tx_review_lending_deposit": "Dépôt de prêt", "tx_review_lending_withdraw": "Lending withdrawal", "tx_review_perps_deposit": "Contrats à terme perpétuels financés", "tx_review_predict_deposit": "Prédictions financées", "tx_review_predict_claim": "Gains réclamés", "tx_review_predict_withdraw": "Retrait des prédictions", - "tx_review_musd_conversion": "mUSD Conversion", - "sent_ether": "Ether envoyé(s)", - "self_sent_ether": "Sent yourself Ether", - "received_ether": "Ether reçu(s)", + "tx_review_musd_conversion": "Conversion en mUSD", + "sent_ether": "Sent ETH", + "self_sent_ether": "Sent yourself ETH", + "received_ether": "Received ETH", "sent_dai": "DAI envoyé(s)", "self_sent_dai": "DAI envoyé(s) à vous-même", "received_dai": "DAI reçu(s)", "sent_tokens": "Sent tokens", "received_tokens": "Received tokens", - "ether": "Ether", + "ether": "ETH", "sent_unit": "{{unit}} envoyé(s)", "self_sent_unit": "Sent yourself {{unit}}", "received_unit": "{{unit}} reçu(s)", "sent_collectible": "Sent collectible", "received_collectible": "Received collectible", - "send_ether": "Send Ether", + "send_ether": "Send ETH", "send_unit": "Send {{unit}}", "send_collectible": "Send collectible", "receive_collectible": "Receive collectible", @@ -3733,9 +3798,9 @@ }, "gas_used": "Gas used (units)", "gas_limit": "Gas limit (units)", - "gas_price": "Prix du gaz (GWEI)", - "base_fee": "Frais de base (GWEI)", - "priority_fee": "Frais de priorité (GWEI)", + "gas_price": "Gas price (GWEI)", + "base_fee": "Base fee (GWEI)", + "priority_fee": "Priority fee (GWEI)", "multichain_priority_fee": "Frais de priorité", "max_fee": "Max fee per gas", "total": "Total", @@ -3907,7 +3972,7 @@ "select_all": "Tout sélectionner", "deselect_all": "Désélectionner tout", "new_network": "Nouveau réseau ajouté", - "network_name": "Réseau {{networkName}}", + "network_name": "réseau {{networkName}}", "network_added": " est désormais disponible dans le sélecteur de réseau.", "provider": "Un fournisseur est censé mettre à jour le solde de votre portefeuille et diffuser fidèlement l’historique des transactions", "no_match": "Aucun résultat correspondant trouvé.", @@ -4005,8 +4070,8 @@ "biometrics": { "enable_touchid": "Déverrouiller avec Touch ID ?", "enable_faceid": "Déverrouiller avec Face ID ?", - "enable_fingerprint": "Déverrouiller avec l’empreinte digitale ?", - "enable_biometrics": "Déverrouiller grâce à la reconnaissance biométrique ?", + "enable_fingerprint": "Unlock with fingerprint?", + "enable_biometrics": "Unlock with biometrics?", "enable_device_passcode_ios": "Déverrouiller avec le code secret de l’appareil ?", "enable_device_passcode_android": "Déverrouiller avec le code PIN de l’appareil ?" }, @@ -4021,18 +4086,18 @@ "title": "DEMANDE DE CONNEXION", "walletconnect_title": "DEMANDE WALLETCONNECT", "action": "Se connecter à ce site ?", - "action_reconnect": "Pour reprendre la connexion, choisissez le numéro affiché sur la dApp", - "action_reconnect_deeplink": "Voulez-vous vous reconnecter à cette dApp ?", + "action_reconnect": "To resume connection, choose the number you see on the site", + "action_reconnect_deeplink": "Do you want to reconnect to this site?", "connect": "Connexion", "resume": "Reprendre", "cancel": "Annuler", - "donot_rememberme": "Ignorer la connexion à cette dApp", + "donot_rememberme": "Do not remember this site connection", "disconnect": "Déconnecter", "permission": "Voir votre", "address": "adresse publique", "sign_messages": "Signer les messages", "on_your_behalf": "en votre nom", - "warning": "En cliquant sur Connexion, vous autorisez cette Ðapp à voir votre adresse publique. Il s’agit d’une mesure de sécurité importante pour protéger vos données contre tout risque potentiel d’hameçonnage." + "warning": "By clicking connect, you allow this site to view your public address. This is an important security step to protect your data from potential phishing risks." }, "import_private_key": { "title": "Importer le compte", @@ -4048,7 +4113,7 @@ "error_title": "Quelque chose a mal tourné", "error_message": "Nous n’avons pas pu importer cette clé privée. Veuillez vous assurer de l’avoir saisie correctement.", "error_empty_message": "Vous devez saisir votre clé privée", - "or_scan_a_qr_code": "ou scannez un code QR" + "or_scan_a_qr_code": "or scan a QR code" }, "import_private_key_success": { "title": "Compte importé !", @@ -4065,12 +4130,12 @@ "paste": "Coller", "clear": "Tout effacer", "srp_number_of_words_option_title": "Nombre de mots", - "12_word_option": "J’ai une phrase de 12 mots", - "24_word_option": "J’ai une phrase de 24 mots", + "12_word_option": "I have a 12-word phrase", + "24_word_option": "I have a 24-word phrase", "error_title": "Quelque chose a mal tourné", "error_message": "We couldn't import that Secret Recovery Phrase. Please make sure you entered it correctly.", "error_empty_message": "You need to enter your Secret Recovery Phrase.", - "error_number_of_words_error_message": "Les phrases secrètes de récupération sont composées de 12 ou 24 mots", + "error_number_of_words_error_message": "Secret Recovery Phrases contain 12 or 24 words", "error_srp_is_case_sensitive": "Saisie non valide ! La phrase secrète de récupération est sensible à la casse.", "error_srp_word_error_1": "Les mots ", "error_srp_word_error_2": " est incorrect ou mal orthographié.", @@ -4080,7 +4145,7 @@ "error_invalid_srp": "phrase secrète de récupération non valide", "error_duplicate_srp": "Cette phrase secrète de récupération a déjà été importée.", "error_duplicate_account": "The account you are trying to import is a duplicate.", - "invalid_qr_code_title": "Code QR non valide", + "invalid_qr_code_title": "Invalid QR code", "invalid_qr_code_message": "The QR code does not contain a valid Secret Recovery Phrase", "success_1": "Portefeuille", "success_2": "importés" @@ -4152,7 +4217,7 @@ "why_secure_2": "C’est le seul et unique moyen de récupérer votre portefeuille si vous n’avez plus accès à l’application ou si vous changez d’appareil." }, "account_backup_step_2": { - "cancel_backup_title": "Cancel backup", + "cancel_backup_title": "Annuler la sauvegarde", "cancel_backup_message": "Nous vous recommandons vivement de mettre en lieu sûr votre phrase secrète de récupération afin de pouvoir restaurer votre portefeuille.", "cancel_backup_ok": "Oui, je vais prendre le risque", "cancel_backup_no": "Non, conserver la phrase secrète de récupération", @@ -4164,7 +4229,7 @@ "cta_text": "OK" }, "account_backup_step_3": { - "cancel_backup_title": "Cancel backup", + "cancel_backup_title": "Annuler la sauvegarde", "cancel_backup_message": "Nous vous recommandons vivement de mettre en lieu sûr votre phrase secrète de récupération afin de pouvoir restaurer votre portefeuille.", "cancel_backup_ok": "Oui, je vais prendre le risque", "cancel_backup_no": "Non, conserver la phrase secrète de récupération", @@ -4173,7 +4238,7 @@ "cta_text": "PERSONNE NE M’OBSERVE" }, "account_backup_step_4": { - "cancel_backup_title": "Cancel backup", + "cancel_backup_title": "Annuler la sauvegarde", "cancel_backup_message": "Nous vous recommandons vivement de mettre en lieu sûr votre phrase secrète de récupération afin de pouvoir restaurer votre portefeuille.", "cancel_backup_ok": "Oui, je vais prendre le risque", "cancel_backup_no": "Non, conserver la phrase secrète de récupération", @@ -4198,16 +4263,16 @@ "modal_button": "SUIVANT" }, "account_backup_step_6": { - "title": "Security tips", + "title": "Conseils de sécurité", "info_text": "MetaMask ne peut pas récupérer votre phrase secrète de récupération en cas de perte", "tip_1": "Conservez plusieurs copies de votre phrase secrète de récupération", "tip_2": "Vous pouvez la sauvegarder dans un gestionnaire de mots de passe fiable et en conserver des copies dans un ou plusieurs endroits sûrs.", "tip_3": "Ne partagez jamais cette phrase avec qui que ce soit", "disclaimer": "* Vous pouvez consulter votre phrase secrète de récupération en allant dans", "disclaimer_bold": "Paramètres > Sécurité et confidentialité", - "cta_text": "J’AI COMPRIS !", + "cta_text": "J’AI COMPRIS ", "modal_title": "Félicitations !", - "modal_text": "Vous êtes maintenant protégé(e) et opérationnel(le) !", + "modal_text": "Vous êtes maintenant protégé(e) et opérationnel(le) .", "modal_button": "TERMINÉ", "copy_seed_phrase": "COPIER la phrase secrète de récupération dans le PRESSE-PAPIERS" }, @@ -4239,7 +4304,7 @@ "steps": "Étape {{currentStep}} sur {{totalSteps}}", "action": "Confirmez votre phrase secrète de récupération", "info": "Sélectionnez les mots manquants dans le bon ordre.", - "complete": "Complete backup", + "complete": "Terminer la sauvegarde", "success": "Réussi", "error-title": "Pas tout à fait correct", "error-description": "Vérifiez votre phrase secrète de récupération et réessayez.", @@ -4418,7 +4483,7 @@ "metamask_swap_completed_title": "Swap terminé", "metamask_swap_completed_description": "Votre swap MetaMask a été effectué", "nft_sent_title": "NFT envoyé", - "nft_sent_description": "Vous avez envoyé avec succès un NFT", + "nft_sent_description": "You successfully sent an NFT", "nft_received_title": "NFT reçu", "nft_received_description": "Vous avez reçu de nouveaux NFT", "rocketpool_stake_completed_title": "Stake terminé", @@ -4518,16 +4583,16 @@ "description_1": "Votre lien de demande est prêt à être envoyé !", "description_2": "Envoyez ce lien à un(e) ami(e) pour lui demander d’envoyer", "copy_to_clipboard": "Copier dans le presse-papiers", - "qr_code": "CODE QR", + "qr_code": "Code QR", "send_link": "Send link", - "request_qr_code": "Code QR de demande de paiement", + "request_qr_code": "Payment request QR code", "balance": "Solde" }, "receive_request": { "title": "Recevoir", "share_title": "Share address", "share_description": "Envoyez votre adresse par e-mail ou par texto", - "qr_code_title": "CODE QR", + "qr_code_title": "Code QR", "qr_code_description": "Image scannable qui peut lire votre adresse", "request_title": "Demander", "request_description": "Demander des actifs à des amis", @@ -4562,12 +4627,12 @@ "close_current_session": "Fermez la session en cours avant d’en commencer une nouvelle." }, "paymentRequest": { - "title": "DEMANDE DE PAIEMENT", - "title_complete": "PAIEMENT TERMINÉ", - "confirm": "PAYER", - "cancel": "REFUSER", + "title": "Payment request", + "title_complete": "Payment complete", + "confirm": "Pay", + "cancel": "Decline", "is_requesting_you_to_pay": "vous demande de payer", - "total": "TOTAL :" + "total": "Total:" }, "webview_error": { "title": "Quelque chose a mal tourné", @@ -4590,6 +4655,10 @@ "fiat_on_ramp": { "buy_eth": "Acheter de l’ETH", "buy": "Acheter des {{ticker}}", + "on_network": "sur {{networkName}}", + "debit_card": "Carte de débit", + "continue": "Continuer", + "powered_by_provider": "Propulsé par {{provider}}", "purchased_currency": "{{currency}} acheté", "network_not_supported": "Le réseau actuel n’est pas pris en charge", "switch_network": "Veuillez passer à Mainnet", @@ -4610,7 +4679,7 @@ "second_line": "votre achat ?" }, "buy_ticker": "Acheter des {{ticker}}", - "buy_ticker_stablecoins": "Acheter {{ticker}} et des Stablecoins", + "buy_ticker_stablecoins": "Acheter des {{ticker}} et des stablecoins", "multiple_payment_methods": "Plusieurs modes de paiement", "debit_credit_bank_transfers_country": "Débit/crédit et virements bancaires en fonction du pays.", "debit_credit_bank_transfers_more_country": "Débit/crédit, virements bancaires et plus en fonction du pays.", @@ -4677,6 +4746,14 @@ "subtitle_5": "pour connaître le coût en question.", "cta": "Continuer d’acheter {{ticker}}" } + }, + "build_quote_settings_modal": { + "title": "Paramètres", + "view_order_history": "Consultez l’historique des ordres", + "contact_support": "Contacter le service d’assistance", + "log_out": "Déconnectez-vous de {{provider}}", + "logged_out_success": "Déconnexion réussie", + "logged_out_error": "Erreur lors de la déconnexion" } }, "fiat_on_ramp_aggregator": { @@ -4823,6 +4900,7 @@ "title": "Sélectionnez votre région", "description": "La disponibilité des modes de paiement et des jetons dépend de nos intégrations tierces et peut varier en fonction de votre pays de résidence.", "sell_description": "Le choix des points de retrait et des jetons peut varier en fonction de votre région.", + "region_variation_notice": "Les méthodes de paiement et les jetons disponibles peuvent varier en fonction de votre région et de nos prestataires de services.", "search_by_country": "Rechercher par pays", "search_by_state": "Recherche par État", "no_region_results": "Aucune région ne correspond", @@ -4850,7 +4928,7 @@ "continue_order_description": "Pour finaliser l’ordre, vous devez appuyer sur le bouton au bas de cette page.", "the_provider": "le fournisseur", "processing": "Ordre en cours de traitement", - "processing_card_description": "Les achats par carte de crédit/débit prennent généralement quelques minutes pour être finalisés.", + "processing_card_description": "Les achats par carte de crédit/débit prennent généralement quelques minutes pour être finalisés", "processing_bank_description": "Les virements bancaires prennent généralement quelques jours ouvrables pour être finalisés", "details": "Détails de la commande", "via": "via", @@ -4884,11 +4962,11 @@ "sent": "Envoyé !" }, "notifications": { - "purchase_failed_title": "L’achat de {{currency}} a échoué ! Veuillez réessayer. Nous vous prions de nous excuser pour ce désagrément.", + "purchase_failed_title": "L’achat de {{currency}} a échoué. Veuillez réessayer dans quelques instants.", "purchase_failed_description": "Vérifiez si votre méthode de paiement ou votre carte bancaire est prise en charge", "purchase_cancelled_title": "Votre achat a été annulé", "purchase_cancelled_description": "Vérifiez si votre méthode de paiement ou votre carte bancaire est prise en charge", - "purchase_completed_title": "Votre achat de {{amount}} {{currency}} est effectué !", + "purchase_completed_title": "L’achat de {{amount}} {{currency}} a été effectué avec succès .", "purchase_completed_description": "Vos {{currency}} sont maintenant disponibles", "purchase_pending_title": "Traitement de votre ordre d’achat de {{currency}}", "purchase_pending_description": "Cela ne devrait prendre que quelques minutes…", @@ -4897,7 +4975,7 @@ "sale_cancelled_title": "Commande annulée", "sale_cancelled_description": "Votre commande n’a pas pu être finalisée.", "sale_completed_title": "Commande finalisée", - "sale_completed_description": "Votre commande a été traitée avec succès !", + "sale_completed_description": "Votre commande a été traitée avec succès.", "sale_pending_title": "Traitement de l’ordre de vente de {{currency}}", "sale_pending_description": "Votre commande est en train d’être traitée.", "no_date": "Inconnu" @@ -4922,7 +5000,7 @@ "start_swapping": "Commencez à échanger" }, "feature_off_title": "Temporairement indisponible", - "feature_off_body": "MetaMask Swaps est en cours de maintenance. Nous vous invitons à revenir plus tard.", + "feature_off_body": "MetaMask Swaps are undergoing maintenance. Please check back later.", "wrong_network_title": "Swaps non disponibles", "wrong_network_body": "Vous ne pouvez échanger des jetons que sur le réseau principal d’Ethereum.", "unallowed_asset_title": "Impossible d’échanger ce jeton", @@ -5003,7 +5081,7 @@ "edit": "Modifier", "quotes_include_fee": "Les cotations comprennent une commission de {{fee}} % de MetaMask", "quotes_include_gas_and_metamask_fee": "Les cotations comprennent les frais de gaz et une commission de {{fee}} % de MetaMask", - "tap_to_swap": "Appuyez pour échanger", + "tap_to_swap": "Tap to swap", "swipe_to_swap": "Faites glisser pour échanger", "swipe_to": "Faites glisser pour", "swap": "Échanger", @@ -5303,7 +5381,7 @@ }, "network_information": { "things_to_keep_in_mind": "À garder à l’esprit", - "testnet_network": "{{type}} Testnet", + "testnet_network": "{{type}} testnet", "first_description": "Le jeton originaire de ce réseau est {{ticker}}. C’est le jeton utilisé pour les frais de gaz.", "second_description": "Si vous essayez d’envoyer des actifs directement d’un réseau à un autre, une perte permanente des actifs pourrait en résulter. Assurez-vous d’utiliser une passerelle.", "third_description": "Vos tokens n’apparaîtront peut-être pas automatiquement dans votre portefeuille.", @@ -5386,7 +5464,7 @@ "learn_more": "En savoir plus" }, "token_allowance": { - "verify_third_party_details": "Vérifier les coordonnées du tiers", + "verify_third_party_details": "Verify third-party details", "protect_from_scams": "Pour vous protéger des escrocs, prenez le temps de vérifier les coordonnées du tiers.", "learn_to_verify": "En savoir plus sur la vérification des coordonnées d'un tiers", "spending_cap": "plafond des dépenses", @@ -5400,7 +5478,7 @@ }, "restore_wallet": { "restore_needed_title": "Une restauration est nécessaire", - "restore_needed_description": "Quelque chose a mal tourné. Mais ne vous inquiétez pas, nous allons essayer de restaurer votre portefeuille.", + "restore_needed_description": "Something went wrong, but don’t worry! Let’s try to restore your wallet.", "restore_needed_action": "Restaurer le portefeuille" }, "wallet_restored": { @@ -5599,6 +5677,10 @@ "error_description": "L’installation de {{snap}} a échoué." }, "earn": { + "claimable_bonus_tooltip": "An annual bonus claimable daily from your wallet.", + "earn_a_percentage_bonus": "Earn a {{percentage}}% bonus", + "claimable_bonus": "Claimable bonus", + "claim_bonus": "Claim bonus", "empty_state_cta": { "heading": "Prêtez des {{tokenSymbol}} et gagnez", "body": "Prêtez vos {{tokenSymbol}} avec {{protocol}} et touchez un revenu", @@ -5682,21 +5764,36 @@ "fee": "Frais" }, "musd_conversion": { - "convert_to_musd": "Convert to mUSD", + "ok": "OK", + "continue": "Continue", + "convert_and_get_percentage_bonus": "Convertissez et obtenez {{percentage}} %", + "get_a_percentage_musd_bonus": "Obtenir {{percentage}} % de bonus en mUSD", + "convert": "Convertir", "toasts": { - "converting": "Converting {{token}} → mUSD", - "eta": "~{{time}}", - "delivered": "Your mUSD has been delivered!", - "failed": "mUSD conversion failed" + "converting": "Conversion de {{token}} → mUSD", + "eta": "Environ {{time}}", + "delivered": "Votre mUSD est arrivé !", + "failed": "Échec de la conversion en mUSD" }, "education": { - "heading": "Gagnez des récompenses avec mUSD", - "description": "Convert your USDC, USDT, or DAI for mUSD, MetaMask’s dollar-backed stablecoin.Earn points every time you convert or hold $100.", - "continue_button": "Commencer" + "heading": "OBTENEZ {{percentage}} % SUR LES\nSTABLECOINS", + "description": "Convert your stablecoins to mUSD, MetaMask’s US dollar-backed stablecoin, and receive up to a {{percentage}}% bonus.", + "terms_apply": "Terms apply.", + "primary_button": "Commencer", + "secondary_button": "Pas maintenant" }, - "earn_points_daily": "Earn points daily", - "buy_musd": "Buy mUSD", - "get_musd": "Get mUSD" + "buy_musd": "Acheter des mUSD", + "get_musd": "Obtenir des mUSD", + "boost_title": "Get {{percentage}}% on your stablecoins", + "boost_description": "Convert your stablecoins to mUSD and receive up to a {{percentage}}% bonus.", + "powered_by_relay": "Propulsé par Relay" + }, + "bonus_claim": { + "toasts": { + "claiming": "Your mUSD bonus is processing", + "delivered": "Your mUSD bonus is here!", + "failed": "Bonus claim failed" + } }, "rewards": { "rewards_tag_label": "Récompenses", @@ -5712,22 +5809,22 @@ "stake": "Stake", "earn": "Gagner", "tron": { - "stake_completed": "Staking completed", - "stake_completed_description": "Your staking transaction has been completed successfully.", - "stake_failed": "Staking failed", + "stake_completed": "Staking terminé", + "stake_completed_description": "Votre transaction de staking a été effectuée avec succès.", + "stake_failed": "Échec de l'opération de staking", "unstake_completed": "Annulation du staking terminée", - "unstake_completed_description": "Your unstaking transaction has been completed successfully.", - "unstake_failed": "Unstaking failed", + "unstake_completed_description": "Votre transaction de déstaking a été effectuée avec succès.", + "unstake_failed": "Échec de l'opération de déstaking", "bandwidth": "Bande passante", "energy": "Énergie", "estimated_annual_reward": "Estimation de la récompense annuelle", - "trx_locked_for": "TRX locked for", - "trx_locked_for_minimum_time": "~3 days", - "trx_released_in": "TRX released in", - "trx_released_in_minimum_time": "~14 days", + "trx_locked_for": "TRX bloqué pour", + "trx_locked_for_minimum_time": "environ 3 jours", + "trx_released_in": "TRX libéré dans", + "trx_released_in_minimum_time": "environ 14 jours", "fee": "Frais", "errors": { - "insufficient_balance": "You don't have enough resource balance to do this action." + "insufficient_balance": "Vous ne disposez pas d’un solde suffisant pour effectuer cette action." } }, "stake_eth": "Staker des ETH", @@ -5773,12 +5870,19 @@ "learn_more_with_period": "En savoir plus." }, "stake_your_trx_cta": { - "title": "Lend Tron and earn", - "description_start": "Stake your Tron and earn ", + "title": "Prêtez des Tron et gagnez des récompenses", + "description_start": "Stakez vos Tron et gagnez des récompenses ", "description_end": " par an.", "learn_more": "En savoir plus.", "earn_button": "Gagner" }, + "trx_learn_more": { + "title": "Stake TRX and earn", + "stake_any_amount": "Stake any amount of TRX.", + "earn_trx_rewards": "Obtenez des TRX en récompense.", + "earn_trx_rewards_description": "Commencez à dégager des bénéfices dès que vous stakez. Les récompenses s’accumulent automatiquement.", + "flexible_unstaking_description": "Unstake anytime. Unstaking takes 14 days to process." + }, "day": { "zero": "", "one": "jour", @@ -5982,7 +6086,7 @@ "switch_account_type": "Mise à jour du compte", "approve": "Approuver la demande", "perps_deposit": "Ajouter des fonds", - "predict_deposit": "Ajouter des fonds « Predict »", + "predict_deposit": "Ajouter des fonds de prédiction", "predict_withdraw": "Retirer" }, "sub_title": { @@ -6003,14 +6107,15 @@ "transaction_fee": "Nous échangerons vos jetons contre des USDC sur HyperCore, le réseau utilisé par les contrats à terme perpétuels. Les fournisseurs de services d’échange peuvent facturer des frais, mais MetaMask ne le fera pas." }, "predict_deposit": { - "transaction_fee": "Nous échangerons vos jetons contre des USDC.e sur Polygon, le réseau utilisé par Predict. Les fournisseurs de services d’échange peuvent facturer des frais, mais MetaMask ne le fera pas." + "transaction_fee": "Nous échangerons vos jetons contre des USDC.e sur Polygon, le réseau utilisé par « Prédictions ». Les fournisseurs de services d’échange peuvent facturer des frais, mais MetaMask ne le fera pas." }, "musd_conversion": { - "transaction_fee": "mUSD conversion fees include network costs and may include provider fees." + "transaction_fee": "Les frais de conversion en mUSD comprennent les coûts de réseau et peuvent inclure les frais du fournisseur." }, "title": { "transaction_fee": "Frais" - } + }, + "network_fee": "Les frais de réseau dépendent du trafic sur le réseau et de la complexité de votre transaction." }, "spending_cap": "Plafond de dépenses", "withdraw": "Retirer", @@ -6079,7 +6184,7 @@ }, "includes_transaction": "Inclut {{transactionCount}} transactions", "useSmartAccount": "Utiliser un compte intelligent", - "successful": "Opération effectuée avec succès !", + "successful": "Réussite", "success_message": "Votre compte sera mis à niveau vers un compte intelligent lors de votre prochaine transaction." }, "edit_spending_cap_modal": { @@ -6087,9 +6192,9 @@ "cancel": "Annuler", "description": "Saisissez le montant que vous autorisez à dépenser en votre nom.", "invalid_number_error": "Le plafond de dépenses doit être un nombre", - "no_empty_error": "Le champ « Plafond de dépenses » est obligatoire", - "no_extra_decimals_error": "Le plafond de dépenses ne peut pas comporter plus de décimales que le jeton", - "no_zero_error": "Le plafond de dépenses doit être supérieur à 0", + "no_empty_error": "Spending cap can't be empty", + "no_extra_decimals_error": "Spending cap can't have more decimals than the token", + "no_zero_error": "Spending cap can't be 0", "no_zero_error_decrease_allowance": "Un plafond de dépenses de 0 n’a aucun effet sur la méthode « decreaseAllowance »", "no_zero_error_increase_allowance": "Un plafond de dépenses de 0 n’a aucun effet sur la méthode « increaseAllowance »", "save": "Sauvegarder", @@ -6120,7 +6225,7 @@ "edit_amount_done": "Continuer", "deposit_edit_amount_done": "Ajouter des fonds", "deposit_edit_amount_predict_withdraw": "Retirer", - "deposit_edit_amount_musd_conversion": "Convert to mUSD" + "deposit_edit_amount_musd_conversion": "Convertir en mUSD" }, "change_in_simulation_modal": { "title": "Les résultats ont changé", @@ -6145,6 +6250,8 @@ "confirm_swap": "Échanger", "terms_and_conditions": "Conditions générales", "select_token": "Sélectionnez un jeton", + "no_tokens_found": "Aucun jeton trouvé", + "no_tokens_found_description": "We couldn't find any tokens with this name. Try a different search.", "select_network": "Sélectionnez le réseau", "all_networks": "Tous les réseaux", "num_networks": "{{numNetworks}} réseaux", @@ -6152,6 +6259,7 @@ "select_all_networks": "Tout sélectionner", "deselect_all_networks": "Désélectionner tout", "see_all": "Tout afficher", + "all": "Tous", "apply": "Appliquer", "slippage": "Slippage/effet de glissement", "slippage_info": "Si le prix fluctue entre le moment où vous passez un ordre et le moment où il est confirmé, on parle alors d’un « effet de glissement » (slippage). Votre swap sera automatiquement annulé si le slippage dépasse le seuil de tolérance que vous avez défini ici.", @@ -6192,9 +6300,9 @@ "title": "Passerelle", "submitting_transaction": "En train d’envoyer", "fetching_quote": "Récupération de la cotation", - "fee_disclaimer": "Comprend {{feePercentage}} % de frais MM.", + "fee_disclaimer": "Includes {{feePercentage}}% MetaMask fee.", "no_mm_fee": "Pas de frais MM", - "no_mm_fee_disclaimer": "Pas de frais MM pour les swaps en {{destTokenSymbol}}.", + "no_mm_fee_disclaimer": "No MetaMask fee swapping into {{destTokenSymbol}}.", "hardware_wallet_not_supported": "Les portefeuilles matériels ne sont pas encore pris en charge. Utilisez un portefeuille connecté pour continuer.", "hardware_wallet_not_supported_solana": "Les portefeuilles matériels ne sont pas encore pris en charge pour Solana. Utilisez un portefeuille connecté pour continuer.", "price_impact_info_title": "Impact sur les prix", @@ -6209,15 +6317,7 @@ "approval_tooltip_content": "Vous autorisez l’accès au montant spécifié ({{amount}} {{symbol}}). Le contrat n’accédera à aucun fonds supplémentaire.", "minimum_received": "Minimum received", "minimum_received_tooltip_title": "Minimum received", - "minimum_received_tooltip_content": "Le montant minimum que vous recevrez si le prix change pendant le traitement de votre transaction, en fonction de votre tolérance au slippage. Il s’agit d’une estimation fournie par nos fournisseurs de liquidité. Le montant final peut différer.", - "verified_token": "Jeton vérifié", - "price": "Prix", - "percent_change": "Variation en pourcentage", - "volume": "Volume", - "market_cap_fdv": "Capitalisation boursière (FDV)", - "listed_on": "Coté sur", - "centralized_exchanges": "Plateformes d’échange centralisées", - "contract_address": "Adresse du contrat" + "minimum_received_tooltip_content": "Le montant minimum que vous recevrez si le prix change pendant le traitement de votre transaction, en fonction de votre tolérance au slippage. Il s’agit d’une estimation fournie par nos fournisseurs de liquidité. Le montant final peut différer." }, "quote_expired_modal": { "title": "De nouvelles cotations sont disponibles", @@ -6291,7 +6391,7 @@ "title": "Récupération du portefeuille", "login_with_social": "Connectez-vous avec vos comptes sociaux", "setup": "Configurer", - "secret_recovery_phrase": "Phrase secrète de récupération {{num}}", + "secret_recovery_phrase": "Secret Recovery Phrase {{num}}", "back_up": "Sauvegarder", "reveal": "Révéler", "social_recovery_title": "RÉCUPÉRATION {{authConnection}}", @@ -6350,7 +6450,7 @@ "section_1_title": "Que sont les comptes multichaînes ?", "section_1_description": "Un seul compte, des adresses sur tous les réseaux pris en charge par MetaMask. Vous pouvez désormais utiliser Ethereum, Solana, etc., sans changer de compte.", "section_2_title": "Même adresse, plus de réseaux", - "section_2_description": "Nous avons regroupé vos comptes, vous pouvez donc continuer à utiliser MetaMask comme avant. Vos fonds sont en sécurité et restent inchangés", + "section_2_description": "Nous avons regroupé vos comptes, vous pouvez donc continuer à utiliser MetaMask comme avant. Vos fonds sont en sécurité et restent inchangés.", "view_accounts_button": "Afficher les comptes", "learn_more_button": "En savoir plus", "setting_up_accounts": "Configuration de vos comptes" @@ -6512,8 +6612,10 @@ }, "card_onboarding": { "title": "Dépensez\net\ngagnez", - "description": "MetaMask Card est un moyen de paiement rapide et facile à utiliser qui vous permet non seulement de dépenser vos cryptomonnaies en les convertissant instantanément en monnaie fiduciaire, mais aussi de gagner des récompenses.", + "description": "MetaMask Card est un moyen de paiement rapide et facile à utiliser qui vous permet non seulement de dépenser vos cryptomonnaies, mais aussi de gagner jusqu’à 3 % de cashback.", "apply_now_button": "Inscrivez-vous dès maintenant", + "login_button": "Se connecter", + "not_now_button": "Pas maintenant", "sign_up": { "title": "C’est parti", "description": "Créez votre compte MetaMask Card, fourni par Crypto Life. Celui-ci sera distinct de votre compte MetaMask.", @@ -6541,6 +6643,7 @@ "phone_number_label": "Saisissez le numéro de téléphone", "country_area_code_label": "Indicatif régional", "invalid_phone_number": "Numéro de téléphone non valide", + "invalid_us_phone_number": "Veuillez saisir un numéro de téléphone américain valide (10 chiffres) pour continuer.", "legal_terms": "En continuant, vous acceptez de recevoir un SMS pour vérifier votre numéro de téléphone." }, "confirm_phone_number": { @@ -6577,8 +6680,8 @@ "terms": "Les approbations prennent généralement 12 heures. Nous vous informerons dès qu’une décision aura été prise." }, "verifying_veriff_kyc": { - "title": "Vérification de votre identité", - "description": "Veuillez patienter pendant que nous vérifions votre identité.", + "title": "En attente d’approbation", + "description": "Notre partenaire doit vérifier votre identité afin d’approuver votre demande.", "helper_text": "Cela prend généralement quelques secondes. Veuillez ne pas fermer l’application." }, "verifying_registration": { @@ -6615,7 +6718,7 @@ }, "physical_address": { "title": "Ajoutez votre adresse", - "description": "Saisissez votre adresse personnelle. Si votre demande est approuvée, nous vous enverrons votre carte physique à cette adresse.", + "description": "Saisissez votre adresse personnelle actuelle. Nous l’utiliserons à des fins de vérification.", "address_line_1_label": "Ligne d’adresse 1", "address_line_2_label": "Ligne d’adresse 2", "city_label": "Ville", @@ -6623,7 +6726,7 @@ "zip_code_label": "Code postal", "country_label": "Pays", "electronic_consent_1": "J’accepte de me conformer à la loi E-Sign Act régissant la divulgation et le consentement des signatures électroniques et j’accepte de recevoir toutes les communications par voie électronique. ", - "electronic_consent_2": "View document(PDF)" + "electronic_consent_2": "Afficher le document (PDF)" }, "mailing_address": { "title": "Adresse postale", @@ -6669,22 +6772,24 @@ } }, "card_home": { + "title": "Card", + "available_balance": "Solde disponible", "error_title": "Impossible de récupérer les données", "error_description": "Le contenu de cette page ne s’affiche pas correctement. Veuillez vérifier votre connexion ou actualiser la page.", "try_again": "Réessayez", - "limited_spending_warning": "Votre capacité de dépense réelle pourrait être limitée. Pour ajuster votre limite, accédez à {{manageCard}}", + "limited_spending_warning": "Votre capacité de dépense réelle pourrait être limitée. Pour ajuster votre limite, accédez à ", "add_funds": "Ajouter des fonds", "change_asset": "Changer d’actif", "enable_card_button_label": "Activer la carte", "enable_assets_button_label": "Activer les actifs", "spending_limit_warning": "Vous avez presque atteint votre limite de dépenses. Modifiez votre limite de dépenses pour éviter tout refus de paiement.", "logout": "Déconnexion", - "logout_description": "Déconnectez-vous de votre compte MetaMask Card", "logout_confirmation_title": "Voulez-vous vous déconnecter de votre compte MetaMask Card ?", "logout_confirmation_message": "Êtes-vous sûr(e) de vouloir vous déconnecter de votre compte MetaMask Card ?", "logout_confirmation_cancel": "Annuler", "logout_confirmation_confirm": "Déconnexion", "enable_card_error": "Impossible d’activer la carte. Veuillez réessayer plus tard.", + "view_card_details_error": "Unable to load card details. Please try again.", "warnings": { "close_spending_limit": { "title": "Vous avez presque atteint votre limite de dépenses", @@ -6707,6 +6812,16 @@ "blocked": { "title": "Votre carte est bloquée", "description": "Veuillez contacter le service d’assistance pour débloquer votre carte" + }, + "kyc_pending": { + "title": "Vérification en cours", + "description": "Your identity verification is being reviewed. This typically takes less than 12 hours." + } + }, + "messages": { + "card_provisioning": { + "title": "Card being created", + "description": "Your card is being created. This may take a few moments." } }, "kyc_status": { @@ -6730,33 +6845,46 @@ "ok_button": "OK" }, "manage_card_options": { - "manage_spending_limit": "Gérer la limite de dépenses", + "view_card_details": "View card details", + "hide_card_details": "Hide card details", + "view_card_details_description": "Card number, expiration and CVV", + "manage_spending_limit": "Manage limit", "manage_spending_limit_description_restricted": "La limite de dépenses est activée", "manage_spending_limit_description_full": "L’accès complet est activé", "manage_card": "Gérer la carte", - "advanced_card_management_description": "Consultez les détails de la carte, les transactions et bien plus encore", + "advanced_card_management_description": "See activity, cashback, freeze card, and more", "travel_title": "MetaMask Travel", - "travel_description": "Réservez des hôtels à des prix jusqu’à 60 % moins chers que ceux proposés par Expedia", - "card_tos_title": "Conditions générales de MetaMask Card", - "card_tos_description": "Lisez les conditions générales du fournisseur de la carte" + "travel_description": "Book hotels with up to 70% discounts", + "card_tos_title": "Terms and conditions" } }, "card_spending_limit": { "title_change_token": "Modifier le jeton et le réseau", "title_enable_token": "Activer le jeton", + "title_onboarding": "Activer les dépenses", + "setup_title": "Set up your card", + "setup_description": "Select the token you'd like to use and set a limit for how much you can spend.", + "asset_label": "Actif", + "limit_label": "Limite", + "other_token": "Other", "full_access_title": "Accès complet", - "full_access_description": "Votre carte peut utiliser vos fonds automatiquement, sans demander votre autorisation pour chaque transaction.", - "restricted_limit_title": "Dépenses limitées", - "restricted_limit_description": "Vous devrez revenir et payer des frais de réseau chaque fois que vous souhaiterez augmenter la limite.", + "full_access_description": "Your card can use your funds automatically without asking for approval each time.", + "restricted_limit_title": "Limite de dépenses", + "restricted_limit_description": "Vous ne pouvez dépenser que jusqu’à cette limite. Vous paierez des frais de réseau chaque fois que cette limite sera mise à jour.", "edit_limit": "Modifier la limite", "confirm_new_limit": "Confirmer", "cancel": "Annuler", + "skip": "Ignorer pour l’instant", "set_new_limit": "Fixer une limite", "dismiss": "Ignorer", "update_success": "Limite de dépenses mise à jour avec succès", "update_error": "Échec de la mise à jour de la limite de dépenses", "solana_not_supported": "Activez les jetons Solana sur card.metamask.io", - "select_token": "Sélectionnez un jeton" + "select_token": "Sélectionnez un jeton", + "loading": "Chargement des jetons disponibles…", + "load_error": "Impossible de charger les jetons. Veuillez réessayer.", + "retry": "Réessayez", + "on_linea": "sur Linea" }, "change_asset": { "title": "Modifier le jeton et le réseau", @@ -6794,6 +6922,7 @@ "signup_button": "Inscription", "errors": { "invalid_credentials": "Identifiants de connexion non valides", + "invalid_otp_code": "Code incorrect, veuillez réessayer", "unknown_error": "Erreur inconnue, veuillez réessayer plus tard", "email_required": "L’adresse e-mail est requise", "password_required": "Le mot de passe est requis", @@ -6840,8 +6969,8 @@ }, "rewards": { "auth_fail_title": "Erreur inconnue.", - "auth_fail_description": "Une erreur inconnue s’est produite lors de l’authentification de ce compte auprès du programme de récompenses. Veuillez réessayer plus tard.", - "failed_to_authenticate": "Échec de l’authentification auprès du programme de récompenses", + "auth_fail_description": "Une erreur inconnue s’est produite lors de l’authentification de ce compte auprès de « Récompenses MetaMask ». Veuillez réessayer plus tard.", + "failed_to_authenticate": "Échec de l’authentification auprès de « Récompenses MetaMask »", "not_implemented": "Bientôt disponible", "not_implemented_season_summary": "Récapitulatif de la période des récompenses bientôt disponible", "optin_error": { @@ -6868,6 +6997,10 @@ "error_fetching_description": "Vérifiez votre connexion et réessayez.", "retry_button": "Réessayer" }, + "linea_tokens": { + "default_title": "$LINEA", + "title_earned": "Vous avez gagné {{amount}} $LINEA" + }, "upcoming_rewards_error": { "error_fetching_title": "Impossible de charger les récompenses", "error_fetching_description": "Vérifiez votre connexion et réessayez.", @@ -6899,6 +7032,15 @@ "claim_reward_error": { "title": "Impossible de réclamer la récompense" }, + "metal_card_claim": { + "title": "Échangez votre récompense", + "description": "La carte MetaMask Metal est soumise à des conditions d’admissibilité et n’est pas disponible dans toutes les régions. Si vous n’êtes pas admissible, vous recevrez à la place une récompense exclusive sous forme de produit dérivé haut de gamme.", + "contact_info": "Partagez vos coordonnées et vous recevrez une réponse dans les deux semaines de la part de @MidwitMilhouse sur Telegram ou de christian.montoya@consensys.net.", + "email_label": "Adresse e-mail", + "email_validation_error": "Veuillez saisir une adresse e-mail valide", + "telegram_label": "Identifiant Telegram", + "telegram_placeholder": "Facultatif" + }, "accounts_opt_in_state_error": { "error_fetching_title": "Impossible de charger les comptes", "error_fetching_description": "Vérifiez votre connexion et réessayez.", @@ -7053,12 +7195,12 @@ "dashboard_modal_info": { "active_account": { "title": "Ne manquez pas cette occasion", - "description": "Ajoutez votre compte pour commencer à gagner des points grâce à votre activité.", + "description": "Add your account to Rewards.", "confirm": "Ajouter un compte" }, "multiple_unlinked_accounts": { - "title": "Commencez à gagner des points", - "description": "Ajoutez vos comptes afin de pouvoir consulter vos récompenses en un coup d’œil.", + "title": "Ne manquez pas cette occasion", + "description": "Add your accounts to Rewards.", "confirm": "Ajouter les comptes" }, "account_not_supported": { @@ -7111,10 +7253,10 @@ } }, "predict": { - "title": "Marchés prédictifs", + "title": "Prédictions", "description": "20 points pour chaque 10 $ misé sur une prédiction", "sheet": { - "title": "Marchés prédictifs", + "title": "Prédictions", "points": "20 points par tranche de 10 $", "description": "Gagnez des points pour chaque tranche de 10 $ que vous tradez.", "cta_label": "Explorer les marchés" @@ -7192,6 +7334,19 @@ "time_left": "Il reste", "expired": "Expiré" }, + "end_of_season_rewards": { + "confirm_label_default": "Confirmer", + "confirm_label_access": "Accès", + "redeem_success_title": "Récompense échangée", + "metal_card_claim_success": "Coordonnées confirmées", + "linea_tokens_claim_success": "Adresse confirmée", + "arriving_soon": "Bientôt disponible", + "check_back_soon": "Revenez bientôt pour réclamer votre récompense", + "redeem_failure_title": "L’échange a échoué", + "redeem_failure_description": "Veuillez réessayer plus tard.", + "reward_details": "Détails de la récompense", + "select_account_description": "Sélectionnez le compte sur lequel vous souhaitez que cette récompense soit envoyée. Les jetons seront distribués dans un délai de deux semaines." + }, "animation": { "could_not_load": "Impossible de charger" } @@ -7258,13 +7413,13 @@ "still_connecting_network": "Connexion en cours à {{networkName}}…", "unable_to_connect_network": "Impossible de se connecter à {{networkName}}.", "update_rpc": "Mettre à jour le RPC", + "switch_to_metamask_default_rpc": "Switch to MetaMask default RPC", "check_network_connectivity": "Vérifiez votre connexion réseau.", - "check_network_connectivity_or": "Vérifiez votre connexion réseau ou" + "check_network_connectivity_or": "Vérifiez votre connexion réseau ou", + "updated_to_metamask_default": "Updated to MetaMask default" }, "trending": { "title": "Explore", - "view_all": "View all", - "tokens": "Jetons", "trending_tokens": "Trending tokens", "price_change": "Price change", "all_networks": "Tous les réseaux", @@ -7296,6 +7451,10 @@ "title": "Trending tokens is not available", "description": "We can't fetch this page right now", "try_again": "Réessayez" + }, + "empty_search_result_state": { + "title": "Aucun jeton trouvé", + "description": "We were not able to find this token" } }, "ota_update_modal": { diff --git a/locales/languages/hi.json b/locales/languages/hi.json index b261dd5a939f..15ec7fea7d4f 100644 --- a/locales/languages/hi.json +++ b/locales/languages/hi.json @@ -8,7 +8,7 @@ "increment": "रिडक्स काउंटर को बढ़ाना" }, "pet_name": { - "list_count_text": "Pet names on this network", + "list_count_text": "इस नेटवर्क पर पेट नेम", "add_pet_name_button": "Add pet name", "address": "पता", "address_placeholder": "ऑक्स...", @@ -193,11 +193,10 @@ "connector": "पर" }, "autocomplete": { - "placeholder": "टोकन, साइट या एड्रेस से ढूंढें", + "placeholder": "साइट या एड्रेस से ढूंढें", "recents": "हाल ही", "favorites": "पसंदीदा", - "sites": "साइट्स", - "tokens": "टोकन" + "sites": "साइट्स" }, "navigation": { "back": "वापस", @@ -306,7 +305,7 @@ "get_started": "शुरुआत करें" }, "onboarding_wizard": { - "skip_tutorial": "Skip tutorial", + "skip_tutorial": "ट्यूटोरियल को स्किप करें", "coachmark": { "action_back": "नहीं, धन्यवाद", "action_next": "टूर पर जाएं", @@ -330,12 +329,12 @@ "content3": "अब अकाउंट के नाम को संपादित करें।" }, "step4": { - "title": "Main menu", - "content1": "आप इस मेनू से लेन-देन इतिहास, सेटिंग्स और सपोर्ट तक पहुंच सकते हैं।", + "title": "मुख्य मेनू", + "content1": "आप इस मेनू से ट्रांसेक्शन हिस्ट्री, सेटिंग्स और सपोर्ट तक पहुंच सकते हैं।", "content2": "आप अपने अकाउंट के साथ ज्यादा कार्य ले सकते हैं और MetaMask की सेटिंग तक पहुंच सकते हैं।" }, "step5": { - "title": "ब्राउजर को एक्सप्लोर करें", + "title": "ब्राउज़र को एक्सप्लोर करें", "content1": "आप ब्राउजर का उपयोग करके web3 को एक्सप्लोर कर सकते हैं" }, "step6": { @@ -596,9 +595,9 @@ "transaction_activity": "गतिविधि", "request_feature": "एक फीचर का अनुरोध करें", "submit_feedback_message": "भेजने के लिए फीडबैक के प्रकार का चयन करें।", - "submit_bug": "Bug report", + "submit_bug": "बग रिपोर्ट", "submit_general_feedback": "सामान्य", - "share_address": "Share my public address", + "share_address": "मेरा पब्लिक एड्रेस साझा करें", "view_in_etherscan": "Etherscan पर देखें", "view_in": "देखें", "browser": "ब्राउजर", @@ -612,12 +611,13 @@ "lock_cancel": "नहीं", "feedback": "फीडबैक", "metamask_support": "MetaMask समर्थन", - "public_address": "Public address" + "public_address": "पब्लिक एड्रेस" }, "send": { "available": "उपलब्ध", "invalid_value": "मूल्य ग़लत है", "insufficient_funds": "अपर्याप्त फंड", + "insufficient_balance_to_cover_fee": "Insufficient balance to cover fees", "continue": "जारी रखें", "unit": "यूनिट", "units": "यूनिट्स", @@ -643,8 +643,8 @@ "no_tokens_available": "कोई टोकन उपलब्ध नहीं है", "sign": "हस्ताक्षर करें", "network_not_found_title": "नेटवर्क नहीं मिला", - "network_not_found_description": "आपके वॉलेट में {{chain_id}} चेन id के साथ नेटवर्क नहीं मिला। कृपया नेटवर्क को पहले जोड़ें।", - "network_missing_id": "चेन id अनुपस्थित है।", + "network_not_found_description": "Network with chain ID {{chain_id}} not found in your wallet. Please add the network first.", + "network_missing_id": "Missing chain ID.", "search_tokens": "टोकन ढूंढें", "search_tokens_and_nfts": "टोकन और NFTs ढूंढें", "tokens": "टोकन", @@ -675,13 +675,13 @@ "limitError": "आपकी डिपॉज़िट सीमा की जाँच नहीं हो पायी। कृपया बाद में फिर से प्रयास करें।" }, "token_modal": { - "select_a_token": "एक टोकन चुनें", + "select_a_token": "कोई टोकन चुनें", "select_token": "टोकन चुनें", "search_by_name_or_address": "नाम या एड्रेस से टोकन ढूंढें", "no_tokens_found": "कोई टोकन \"{{searchString}}\" से मेल नहीं खाता", "unsupported_token_title": "उपलब्ध नहीं है", - "unsupported_token_description": "This token may not be available in your region or supported by any local payment providers", - "error_loading_tokens": "Unable to load tokens. Please try again later." + "unsupported_token_description": "हो सकता है कि यह टोकन आपके इलाके में उपलब्ध न हो या किसी लोकल पेमेंट प्रोवाइडर द्वारा सपोर्टेड न हो", + "error_loading_tokens": "टोकन लोड नहीं हो पाए। कृपया बाद में फिर से प्रयास करें।" }, "networks_filter_bar": { "all_networks": "सभी नेटवर्क" @@ -696,12 +696,12 @@ "title": "सेटिंग्स", "view_order_history": "ऑर्डर इतिहास देखें", "contact_support": "सपोर्ट टीम से कॉन्टेक्ट करें", - "log_out": "Log out of Transak", + "log_out": "Transak से लॉग आउट करें", "logged_out_success": "सफलतापूर्वक लॉग आउट किया गया", "error_sdk_not_initialized": "SDK शुरू नहीं हुआ", "logged_out_error": "लॉग आउट करते समय गड़बड़ी", - "more_ways_to_buy": "More ways to buy", - "more_ways_to_buy_description": "Switch to the classic version" + "more_ways_to_buy": "खरीदने के और तरीके", + "more_ways_to_buy_description": "क्लासिक वर्शन पर स्विच करें" }, "region_modal": { "select_a_region": "एक क्षेत्र चुनें", @@ -714,7 +714,7 @@ "no_state_results": "कोई भी स्टेट \"{{searchString}}\" से मेल नहीं खाता" }, "payment_modal": { - "select_a_payment_method": "Select a payment method" + "select_a_payment_method": "कोई पेमेंट का तरीका चुनें" }, "payment_duration": { "instant": "तुरंत", @@ -805,7 +805,7 @@ "button": "सहमत हों और जारी रखें" }, "additional_verification": { - "title": "Additional verification", + "title": "अतिरिक्त सत्यापन", "paragraph_1": "बड़े डिपॉज़िट के लिए, आपको एक वैध ID (जैसे ड्राइविंग लाइसेंस) और एक रियल-टाइम सेल्फी की आवश्यकता होगी।", "paragraph_2": "अपना सत्यापन पूरा करने के लिए, आपको अपने कैमरे की ऐक्सेस चालू करनी होगी।", "button": "जारी रखें" @@ -832,7 +832,7 @@ "dob_invalid": "कृपया मान्य जन्म तिथि दर्ज करें", "ssn_required": "सामाजिक सुरक्षा संख्या आवश्यक है", "unexpected_error": "एक अनपेक्षित गड़बड़ी हुई। कृपया फिर से कोशिश करें।", - "phone_already_registered": "This phone number is already in use by {{email}}. Log in using this email to continue.", + "phone_already_registered": "यह फ़ोन नंबर पहले से ही {{email}} इस्तेमाल कर रहा है। जारी रखने के लिए इस ईमेल का इस्तेमाल करके लॉग इन करें।", "login_with_email": "ईमेल के ज़रिए लॉग इन करें" }, "enter_address": { @@ -844,7 +844,7 @@ "address_line_2": "एड्रेस लाइन 2 (वैकल्पिक)", "state": "राज्य/क्षेत्र", "city": "शहर", - "postal_code": "Postal/zip code", + "postal_code": "पोस्टल कोड", "country": "देश", "select_state": "स्टेट चुनें", "address_line_1_required": "एड्रेस लाइन 1 आवश्यक है", @@ -854,7 +854,7 @@ "city_invalid": "कृपया एक मान्य शहर दर्ज करें", "state_required": "स्टेट/क्षेत्र आवश्यक है", "state_invalid": "कृपया एक मान्य स्टेट दर्ज करें", - "postal_code_required": "Postal/zip code is required", + "postal_code_required": "पोस्टल कोड आवश्यक है", "postal_code_invalid": "कृपया एक मान्य पोस्टल कोड दर्ज करें", "unexpected_error": "अप्रत्याशित गड़बड़ी (एरर)।" }, @@ -903,7 +903,7 @@ "cancel_order_button": "ऑर्डर कैंसिल करें" }, "order_details": { - "title": "Deposit order", + "title": "ऑर्डर डिपॉज़िट करें", "error_title": "आपके डिपॉज़िट ऑर्डर में कोई गड़बड़ी हुई", "error_message": "एक अनपेक्षित गड़बड़ी हुई।" }, @@ -955,12 +955,12 @@ "fetch_payment_methods": "भुगतान विधियों को प्राप्त करने में समस्या हुई।", "fetch_user_details": "उपयोगकर्ता विवरण प्राप्त करने में समस्या हुई।", "try_again": "फिर से प्रयास करें", - "error_details_title": "Error details", + "error_details_title": "गड़बड़ी का विवरण", "see_more": "अधिक देखें" } }, "perps": { - "basic_functionality_disabled_title": "Perps is not available", + "basic_functionality_disabled_title": "पर्प्स उपलब्ध नहीं है", "title": "पर्प्स", "perps_trading": "पर्प्स ट्रेडिंग", "perp_account_balance": "पर्प अकाउंट बैलेंस", @@ -974,9 +974,13 @@ "not_now": "अभी नहीं", "try_now": "शुरू करें" }, + "discovery_banner": { + "title": "{{symbol}} पर्प ट्रेड करें", + "subtitle": "अपने P&L को {{leverage}} तक कई गुना बढ़ाएँ" + }, "today": "आज", "yesterday": "कल", - "unrealized_pnl": "अनरियलाइज्ड PnL", + "unrealized_pnl": "अनरियलाइज्ड P&L", "withdraw": "निकालें", "refresh_balance": "बैलेंस रीफ्रेश करें", "add_funds": "फंड जोड़ें", @@ -1306,8 +1310,8 @@ "cancel": "कैंसिल करें", "margin": "मार्जिन", "includes_pnl": "P&L शामिल है", - "pnl": "PnL", - "estimated_pnl": "अनुमानित PnL", + "pnl": "पी एंड एल", + "estimated_pnl": "अनुमानित P&L", "fees": "फीस", "receive": "आपको प्राप्त होगा", "you_receive": "आपको प्राप्त होगा", @@ -1414,6 +1418,7 @@ "failedToEstablishAllMids": "ग्लोबल allMids सब्सक्रिप्शन स्थापित नहीं हो पाया", "failedToEstablishMarketData": "{{symbol}} के लिए मार्केट डेटा सब्सक्रिप्शन स्थापित नहीं हो पाया", "failed_to_toggle_network": "नेटवर्क टॉगल करना नहीं हो पाया", + "failed_to_switch_provider": "प्रोवाइडर बदलना नहीं हो पाया", "noAccountSelected": "किसी अकाउंट को नहीं चुना गया", "unsupportedMethod": "असमर्थित विधि: {{method}}", "invalidAddressFormat": "एड्रेस फॉर्मेट ग़लत है: {{address}}", @@ -1452,6 +1457,24 @@ "orderLeverageReductionFailed": "आप अपनी लीवरेज को कम नहीं कर सकते", "insufficientLiquidity": "ऑर्डर निष्पादित करने के लिए पर्याप्त लिक्विडिटी नहीं है। लिमिट ऑर्डर का उपयोग करके देखें या थोड़ी देर बाद फिर से प्रयास करें।", "connectionTimeout": "कनेक्शन का समय समाप्त हो गया। कृपया अपना नेटवर्क जांचें और फिर से प्रयास करें।", + "clientReinitializing": "सर्विस फिर से शुरू हो रही है। कृपया थोड़ा इंतज़ार करें और फिर से कोशिश करें।", + "transferFailed": "फंड ट्रांसफर नहीं हो पाए। कृपया फिर से प्रयास करें।", + "swapFailed": "टोकन स्वैप नहीं हो पाए। कृपया फिर से प्रयास करें।", + "spotPairNotFound": "ट्रेडिंग पेयर इस समय उपलब्ध नहीं है।", + "priceUnavailable": "प्राइस डेटा उपलब्ध नहीं है। कृपया रिफ्रेश करें और फिर से कोशिश करें।", + "batchCancelFailed": "कुछ ऑर्डर कैंसिल नहीं किए जा सके। कृपया फिर से कोशिश करें।", + "batchCloseFailed": "कुछ पोजीशन बंद नहीं की जा सकीं। कृपया फिर से कोशिश करें।", + "insufficientMargin": "इस ट्रेड को पूरा करने के लिए मार्जिन काफ़ी नहीं है। ज़्यादा फंड जोड़ने या अपनी पोजीशन का साइज़ कम करने के बारे में सोचें।", + "reduceOnlyViolation": "यह ऑर्डर आपकी पोजीशन बढ़ाएगा। सिर्फ़ रिड्यूस ओनली ऑर्डर के लिए ही अनुमति है।", + "positionWouldFlip": "यह ऑर्डर आपकी पोजीशन की दिशा बदल देगा। कृपया पहले अपनी मौजूदा पोजीशन बंद करें।", + "marginAdjustmentFailed": "मार्जिन एडजस्ट नहीं हो पाया। कृपया फिर से प्रयास करें।", + "tpslUpdateFailed": "टेक प्रॉफ़िट/स्टॉप लॉस अपडेट नहीं किया जा सका। कृपया फिर से कोशिश करें।", + "orderRejected": "ऑर्डर रिजेक्ट हो गया। कृपया अपने पैरामीटर चेक करें और फिर से कोशिश करें।", + "slippageExceeded": "कीमत बहुत ज़्यादा बढ़ गई है। लिमिट ऑर्डर इस्तेमाल करके देखें या स्लिपेज टॉलरेंस बढ़ाएँ।", + "rateLimitExceeded": "बहुत ज़्यादा रिक्वेस्ट हैं। कृपया थोड़ा इंतज़ार करें और फिर से कोशिश करें।", + "serviceUnavailable": "सेवा अस्थायी रूप से अनुपलब्ध है। कृपया बाद में फिर से प्रयास करें।", + "networkErrorSimple": "नेटवर्क में गड़बड़ी हुई। कृपया अपना कनेक्शन जांचें और फिर से प्रयास करें।", + "insufficientBalance": "इस ऑपरेशन को पूरा करने के लिए बैलेंस काफ़ी नहीं है। कृपया अपने उपलब्ध फंड चेक करें।", "connectionFailed": { "title": "पर्प्स से कनेक्ट नहीं हो सका", "description": "हम इसे जल्द ही ऑनलाइन लाने के लिए काम कर रहे हैं।", @@ -1521,7 +1544,7 @@ "total_balance": "कुल बैलेंस", "available_balance": "उपलब्ध बैलेंस", "margin_used": "उपयोग किया गया मार्जिन", - "total_unrealized_pnl": "कुल अप्राप्त लाभ और हानि", + "total_unrealized_pnl": "कुल अप्राप्त P&L", "unrealized_pnl": "अनरियलाइज्ड P&L" }, "tpsl": { @@ -1697,7 +1720,14 @@ "retry_connection": "कनेक्शन के लिए फिर से कोशिश करें", "retrying_connection": "कनेक्ट हो रहा है...", "connecting_to_perps": "पर्प्स से कनेक्ट हो रहा है", - "timeout_title": "कनेक्शन में अपेक्षा से अधिक समय लग रहा है" + "timeout_title": "कनेक्शन में अपेक्षा से अधिक समय लग रहा है", + "websocket_disconnected": "आपका कनेक्शन ऑफ़लाइन है।", + "websocket_disconnected_message": "हो सकता है डेटा अप टू डेट न हो।", + "websocket_connecting": "पर्प्स से कनेक्ट हो रहा है...", + "websocket_connecting_message": "कनेक्शन रिस्टोर किया जा रहा है... कोशिश {{attempt}}", + "websocket_connected": "कनेक्ट किया गया", + "websocket_connected_message": "लाइव डेटा अपडेट फिर से चालू हो गए हैं", + "websocket_retry": "फिर से प्रयास करें" }, "chart": { "no_data": "कोई चार्ट डेटा उपलब्ध नहीं है", @@ -1746,7 +1776,7 @@ "markets": "मार्केट" }, "learn_more": { - "title": "पर्प्स के बारे में ज्यादा जानें", + "title": "पर्प्स के बारे में जानें", "description": "जानें कि परपेचुअल ट्रेडिंग कैसे काम करती है और इसे शुरू कैसे करें", "cta": "ज़्यादा जानें" }, @@ -1754,6 +1784,9 @@ "title": "सपोर्ट टीम से कॉन्टेक्ट करें", "description": "सहायता के लिए MetaMask सपोर्ट से कॉन्टेक्ट करें" }, + "feedback": { + "title": "हमें फीडबैक दें" + }, "close_all_modal": { "title": "सभी पोज़िशन बंद करें", "description": "हम आपकी सभी ओपन पोज़िशन को वर्तमान मार्केट प्राइस पर बंद कर देंगे।", @@ -1806,7 +1839,11 @@ "price_change_low_to_high": "प्राइस परिवर्तन: कम से ज़्यादा", "past_hour": "पिछले घंटे", "past_24_hours": "पिछले 24 घंटे", - "time": "समय" + "time": "समय", + "apply": "लागू करें" + }, + "market_type": { + "filter_by": "इसके द्वारा फिल्टर" }, "perps_markets": "पर्प्स मार्केट", "volume": "वॉल्यूम", @@ -1823,6 +1860,7 @@ "mainnet": "मेननेट", "developer_options": { "hyperliquid_network_toggle": "हाइपरलिक्विड नेटवर्क टॉगल", + "provider_mode_toggle": "प्रदाता मोड", "simulate_connection_error": "कनेक्शन में गड़बड़ी को सिमुलेट करें" }, "transactions": { @@ -1942,7 +1980,7 @@ } }, "predict": { - "title": "MetaMask प्रिडिक्ट", + "title": "MetaMask प्रिडिक्शन्स", "prediction_markets": "प्रेडिक्शन मार्केट", "market_list": "मार्केट लिस्ट", "loading": "लोड हो रहा है...", @@ -1981,7 +2019,8 @@ "fee_exemption": "हम इस मार्केट पर कोई शुल्क नहीं लेते।", "ended": "समाप्त हो गया", "resolved_early": "जल्दी समाधान किया गया", - "disclaimer": "यह जानकारी अधूरी हो सकती है। मार्केट के सभी नियम, रिज़ॉल्यूशन क्राइटेरिया और फ़ाइनल आउटकम सिर्फ़ पॉलीमार्केट द्वारा कंट्रोल किए जाते हैं। पॉलीमार्केट पर मौजूद पूरे नियमों के आधार पर ही सभी ट्रेड करने चाहिए।" + "disclaimer": "यह जानकारी अधूरी हो सकती है। मार्केट के सभी नियम, रिज़ॉल्यूशन क्राइटेरिया और फ़ाइनल आउटकम सिर्फ़ पॉलीमार्केट द्वारा कंट्रोल किए जाते हैं। पॉलीमार्केट पर मौजूद पूरे नियमों के आधार पर ही सभी ट्रेड करने चाहिए।", + "your_picks": "आपके चयन" }, "tab": { "no_predictions_description": "आपके प्रेडिक्शन यहां दिखाई देंगे, जो आपकी हिस्सेदारी और मार्केट की चाल को दिखाएंगे।", @@ -2001,6 +2040,8 @@ "cashout_info": "{{initialPrice}} पर {{outcome}} पर {{amount}}", "cashout_info_multiple": "{{outcomeGroupTitle}} पर {{amount}} • {{initialPrice}} पर {{outcome}}", "position_info": "{{shares}} जीतने के लिए {{outcome}} पर {{initialValue}}", + "position_pick_info": "{{outcome}} पर {{initialValue}}", + "position_pick_info_to_win": "जीतने के लिए {{outcome}} पर {{initialValue}}", "buy_yes": "हां", "buy_no": "नहीं", "outcomes": "परिणाम", @@ -2035,6 +2076,7 @@ "won_markets_text": "{{count}} मार्केट{{s}} जीते", "available_balance": "उपलब्ध बैलेंस", "claim_amount_text": "${{amount}} क्लेम करें", + "claim_winnings_text": "जीत का ईनाम क्लेम करें", "unrealized_pnl_label": "अनरियलाइज्ड P&L", "unrealized_pnl_value": "{{amount}} ({{percent}})", "unrealized_pnl_error": "लोड करने में असमर्थ", @@ -2173,6 +2215,15 @@ "order_not_fully_filled": "आपका ऑर्डर पूरा नहीं हो पाया", "buy_order_not_fully_filled": "मार्केट प्राइस पर अभी आपका ऑर्डर लगाने के लिए पर्याप्त शेयर उपलब्ध नहीं हैं।", "sell_order_not_fully_filled": "मार्केट प्राइस पर अभी कैश आउट करने के लिए पर्याप्त माँग नहीं है।" + }, + "game_details_footer": { + "pick_a_winner": "एक विजेता चुनें", + "volume_display": "${{volume}} वॉल्यूम", + "read_terms": "कॉन्ट्रैक्ट के सभी नियम और शर्तें पढ़ें" + }, + "sports": { + "halftime": "हाफटाइम", + "final": "फाइनल" } }, "receive": { @@ -2290,7 +2341,7 @@ "add_funds": "फंड जोड़ें", "next": "आगे", "buy_asset": "{{asset}} खरीदें", - "no_tokens": "आपके पास कोई टोकन नहीं है!", + "no_tokens": "You don't have any tokens", "show_tokens_without_balance": "बैलेंस के बिना टोकन दिखाएं", "nfts_autodetection_title": "NFT का पता लगाना", "nfts_autodetection_desc": "MetaMask को ऑटोमेटिक तरीके से NFTs का पता लगाने और आपके वॉलेट में दिखाने के लिए अनुमति दें।", @@ -2303,7 +2354,7 @@ "target_scam_network": "जिससे इसमें स्कैम किया जा सकता है। स्कैम करने वाले आपको बदले में ज़्यादा कीमती करेंसी भेजने का झांसा दे सकते हैं। आगे बढ़ने से पहले सब कुछ वेरीफाई करें।", "use_the_currency_symbol": "करेंसी सिंबल का उपयोग करता है", "use_correct_symbol": "आगे बढ़ने से पहले यह पक्का कर लें कि आप सही सिंबल का उपयोग कर रहे हैं", - "chain_id_currently_used": "यह चेन ID वर्तमान में के द्वारा इस्तेमाल की जाती है", + "chain_id_currently_used": "This chain ID is currently used by the", "incorrect_network_name_warning": "हमारे रिकॉर्ड के अनुसार, नेटवर्क का नाम इस चेन ID से ठीक से मेल नहीं खा सकता है।", "suggested_name": "सुझाया गया नाम:", "network_check_validation_desc": "किसी बुरी नीयत वाले या गलत नेटवर्क से जुड़ने की आपकी संभावना कम हो जाती है।", @@ -2314,7 +2365,7 @@ "nft_empty_description": "NFTs की दुनिया है। आज ही अपना कलेक्शन शुरू करें।", "tokens_empty_description": "Nothing to see yet. Why not browse tokens or make a trade?", "discover_nfts": "NFTs इंपोर्ट करें", - "no_transactions": "आपके पास कोई लेन-देन नहीं है!", + "no_transactions": "You have no transactions", "switch_network_to_view_transactions": "कृपया ट्रांसेक्शन देखने के लिए नेटवर्क बदलें", "send_button": "भेजें", "deposit_button": "जमा करें", @@ -2362,6 +2413,7 @@ "network_fee": "नेटवर्क फी", "lists": "Token lists", "hide_cta": "टोकन छुपाएं", + "perps_trading": "पर्प्स ट्रेडिंग", "options": { "title": "Token options", "view_on_portfolio": "Portfolio पर देखें", @@ -2409,8 +2461,8 @@ "add_token": "इम्पोर्ट" }, "collectibles": { - "cancel_add_collectible": "रद्द करें", - "add_collectible": "इम्पोर्ट" + "cancel_add_collectible": "कैंसिल करें", + "add_collectible": "इंपोर्ट करें" }, "banners": { "search_desc": "बेहतर टोकन डिटेक्शन वर्तमान में {{network}} नेटवर्क पर उपलब्ध है।", @@ -2521,18 +2573,20 @@ "billion_abbreviation": "B", "trillion_abbreviation": "T", "million_abbreviation": "M", + "thousand_abbreviation": "K", "token_details": "टोकन विवरण", "contract_address": "कॉन्ट्रैक्ट का एड्रेस", "token_list": "टोकन की सूची", "market_details": "मार्केट का ब्यौरा", "market_cap": "Market cap", "total_volume": "Total volume (24h)", - "volume_to_marketcap": "Volume / market cap", + "volume_to_marketcap": "Volume / Market cap", "circulating_supply": "सप्लाई सर्कुलेट किया जा रहा है", "all_time_high": "अब तक के सबसे ऊँचे स्तर पर", "all_time_low": "अब तक के सबसे निचले स्तर पर", "fully_diluted": "पूरी तरह से डाइल्यूट किया हुआ", - "unknown": "अज्ञात" + "unknown": "अज्ञात", + "stock": "Stock" }, "collectible": { "collectible_address": "पता", @@ -2583,7 +2637,7 @@ "remove_snap_account": "Snap अकाउंट हटाएं", "remove_snap_account_alert_description": "यह अकाउंट आपके वॉलेट से हटा दिया जाएगा। कृपया जारी रखने से पहले सुनिश्चित करें कि आपके पास इस इंपोर्ट किए गए अकाउंट के लिए मूल सीक्रेट रिकवरी फ्रेज़ या प्राइवेट की (key) है। आप अकाउंट ड्रॉप-डाउन से दोबारा अकाउंट इंपोर्ट कर या बना सकते हैं।", "remove_account_alert_remove_btn": "हटाएं", - "remove_account_alert_cancel_btn": "कोई बात नहीं", + "remove_account_alert_cancel_btn": "Never mind", "accounts_title": "एकाउंट्स", "connect_account_title": "खाता कनेक्ट करें", "connect_accounts_title": "खातों को कनेक्ट करें", @@ -2620,7 +2674,7 @@ "advisory_by": "Ethereum Phishing Detector और PhishFort द्वारा दी गई एडवाइज़री", "potential_threat": "बड़े ख़तरों में शामिल हैं", "fake_metamask": "MetaMask के नकली वर्जन", - "srp_theft": "सीक्रेट रिकवरी फ्रेज़ या पासवर्ड की चोरी", + "srp_theft": "Secret Recovery Phrase or password theft", "malicious_transactions": "बुरी नीयत वाले ट्रांसेक्शन जिनके कारण एसेट चोरी हो जाते हैं", "secret_recovery_phrase": "सीक्रेट रिकवरी फ्रेज़ है", "account_name": "अकाउंट का नाम", @@ -2675,8 +2729,8 @@ }, "connect_qr_hardware": { "title": "क्यूआर-आधारित हार्डवेयर वॉलेट के साथ कनेक्ट करें", - "description1": "ऐसे एयरग्रैप्ड हार्डवेयर वॉलेट के साथ कनेक्ट करें जोकि क्यूआर-कोड्स के जरिए कम्युनिकेट करता हो।", - "description2": "ये कैसे काम करता है?", + "description1": "Connect an airgapped hardware wallet that communicates through QR codes.", + "description2": "ये कैसे काम करता है", "description3": "आधिकारिक तौर पर सपोर्टेड एयरग्रैप्ड हार्डवेयर में शामिल हैं:", "keystone": "Keystone", "ngravezero": "Ngrave ज़ीरो", @@ -2690,7 +2744,7 @@ "hint_text": "अपने हार्डवेयर वॉलेट को स्कैन करें ", "purpose_connect": "कनेक्ट", "purpose_sign": "लेनदेन की पुष्टि करें", - "select_accounts": "किसी खाते का चयन करें" + "select_accounts": "किसी अकाउंट को चुनें" }, "data_collection_modal": { "accept": "ठीक है", @@ -2717,14 +2771,14 @@ "select_rpc_url": "RPC URL को चुनें", "title": "सेटिंग", "current_conversion": "बेस करेंसी", - "current_language": "Current language", + "current_language": "वर्तमान भाषा", "ipfs_gateway": "IPFS गेटवे", "ipfs_gateway_content": "IPFS पर स्टोर किए गए आपके NFT की इमेज दिखाने, आपके ब्राउज़र के एड्रेस बार में एंटर किए गए ENS एड्रेस से संबंधित जानकारी दिखाने और अलग-अलग टोकनों के लिए आइकन लाने के लिए MetaMask तृतीय-पक्ष के सेवाओं का इस्तेमाल करता है। जब आप इन सेवाओं का इस्तेमाल कर रहे हों तो आपका IP एड्रेस इन सेवाओं को भी दिख सकता है।", "ipfs_gateway_down": "आपका वर्तमान IPFS गेटवे बंद है", "ipfs_gateway_desc": "अपना पसंदीदा IPFS गेटवे चुनें।", - "search_engine": "Search engine", - "new_RPC_URL": "नया RPC नेटवर्क ", - "state_logs": "State logs", + "search_engine": "सर्च इंजन", + "new_RPC_URL": "नया RPC नेटवर्क", + "state_logs": "स्टेट लॉग्स", "add_network_title": "एक नेटवर्क जोड़ें", "auto_lock": "ऑटो-लॉक", "auto_lock_desc": "एप्लिकेशन के अपने आप लॉक होने में लगने वाले समय का चयन करें। ", @@ -2733,17 +2787,17 @@ "autolock_never": "कभी नहीं", "autolock_after": "{{time}} सेकंड के बाद", "autolock_after_minutes": "{{time}} मिनट के बाद", - "reveal_seed_words": "Reveal seed words", - "reset_account": "Reset account", - "state_logs_button": "Download state logs", + "reveal_seed_words": "सीड शब्दों को प्रकट करें", + "reset_account": "अकाउंट रीसेट करें", + "state_logs_button": "स्टेट लॉग्स डाउनलोड करें", "reveal_seed_words_button": "सीड शब्दों को प्रकट करें", - "reset_account_button": "Reset account", + "reset_account_button": "अकाउंट रीसेट करें", "reset_account_confirm_button": "हां, रिसेट करें", "reset_account_cancel_button": "रद्द करें", - "reset_account_modal_title": "Reset account?", - "clear_approvals_modal_title": "Clear approval data?", + "reset_account_modal_title": "अकाउंट रीसेट करें?", + "clear_approvals_modal_title": "अप्रूवल डेटा हटाएं?", "clear_approvals_modal_message": "सभी dapps को पहुंच के लिए अनुरोध की जरुरत पड़ेगी ताकि अकाउंट की जानकारी को फिर से देख सकें।", - "clear_browser_history_modal_title": "Clear browser history?", + "clear_browser_history_modal_title": "ब्राउज़र हिस्ट्री हटाएं?", "clear_browser_history_modal_message": "हम आपके ब्राउजर के पूरे इतिहास को हटाने ही वाले हैं। क्या आप आश्वस्त हैं?", "clear_cookies_modal_title": "ब्राउज़र कुकीज को हटाएं", "clear_cookies_modal_message": "हम आपके ब्राउजर कुकीज को हटाने ही वाले हैं। क्या आप आश्वस्त हैं?", @@ -2763,7 +2817,7 @@ "protect_title": "वॉलेट रिकवरी", "banner_social_login_enabled": "{{authConnection}} के साथ लॉग इन करें", "manage_recovery_method": "रिकवरी विधियों को प्रबंधित करें", - "video_failed": "Video failed to load.", + "video_failed": "वीडियो लोड नहीं हो पाया।", "protect_desc": "अपने सीक्रेट रिकवरी फ्रेज़ का बैकअप लें ताकि आप कभी भी अपने वॉलेट तक पहुँच खो न दें। इसे ऐसे सुरक्षित स्थान पर रखें जहाँ केवल आप ही पहुँच सकें और जिसे आप भूलें नहीं", "protect_desc_no_backup": "यह आपके वॉलेट का 12 शब्दों का फ्रेज है। इस फ्रेज का उपयोग आपके सभी वर्तमान और भविष्य के अकाउंट पर नियंत्रण रखने में किया जा सकता है, जिसमें वॉलेट में राशि भेजने की क्षमता भी शामिल है। कृपया इस फ्रेज को सुरक्षित स्टोर कर के रखें, किसी के साथ साझा ना करें। MetaMask इस की को रिकवर करने में मदद नहीं कर सकता।", "learn_more": "ज्यादा जानें।", @@ -2779,12 +2833,12 @@ "nft_autodetect_mode": "ऑटोडिटेक्ट NFT", "nft_autodetect_desc": " NFT मीडिया और डेटा के प्रदर्शन से आपका IP एड्रेस केन्द्रीकृत सर्वरों के सामने आ सकता है। तीसरे-पक्ष API (जैसे OpenSea) का उपयोग आपके वॉलेट में NFT का पता लगाने में किया जाता है। यह आपके अकाउंट के पते को उन सेवाओं के सामने उजागर करता है। इसे अक्षम ही छोड़ दें यदि आप नहीं चाहते कि ऐप उन सेवाओं में से डेटा बाहर निकालें।", "show_fiat_on_testnets": "टेस्ट नेटवर्क पर कन्वर्शन दिखाएं", - "show_fiat_on_testnets_desc": "Select this to show fiat conversion on test networks.", + "show_fiat_on_testnets_desc": "टेस्ट नेटवर्क पर फिएट कन्वर्शन दिखाने के लिए इसको चुनें।", "show_fiat_on_testnets_modal_title": "सावधान रहे", "show_fiat_on_testnets_modal_description": "यदि आपसे इस सुविधा को चालू करने के लिए कहा गया है, तो हो सकता है कि आपके साथ धोखाधड़ी हो रही हो। इन टोकन का कोई मौद्रिक मूल्य नहीं है और ये केवल परीक्षण उद्देश्यों के लिए हैं। यह सुविधा डेवलपर्स को यह सुनिश्चित करने में मदद करती है कि उनके ऐप्स काम करें।", - "show_fiat_on_testnets_modal_learn_more": "अधिक जानें।", + "show_fiat_on_testnets_modal_learn_more": "ज़्यादा जानें", "show_fiat_on_testnets_modal_button": "जारी रखें", - "show_hex_data": "Show hex data", + "show_hex_data": "हेक्स डेटा दिखाएं", "show_hex_data_desc": "भेजे गए स्क्रीन पर हेक्स डेटा फील्ड को दिखाने के लिए इसको चुनें।", "accounts_identicon_title": "अकाउंट आइकॉन", "accounts_identicon_desc": "तीन अलग-अलग शैली के अनोखे आइकॉन में से चुनें, जो आपको एकाउंट्स को एक नजर में पहचानने में मदद कर सकते हैं।", @@ -2793,7 +2847,7 @@ "general_title": "सामान्य", "general_desc": "करेंसी का रुपांतरण, प्राथमिक करेंसी, भाषा और सर्च इंजन.", "advanced_title": "एडवांस", - "advanced_desc": "Access developer features, reset account, setup testnets, state logs, IPFS gateway and custom RPC.", + "advanced_desc": "डेवलपर फीचर, अकाउंट रीसेट करें, टेस्टनेट सेटअप करें, स्टेट लॉग्स, IPFS गेटवे और कस्टम RPC तक एक्सेस पाएं।", "notifications_title": "अपने वॉलेट का उपयोग करना", "notifications_desc": "अपने नोटिफिकेशंस मैनेज करें", "allow_notifications": "नोटिफिकेशंस की अनुमति दें", @@ -2804,10 +2858,10 @@ "customize_session_desc": "आप जिस प्रकार के नोटिफिकेशंस प्राप्त करना चाहते हैं, उन्हें चालू करें:", "account_session_title": "अकाउंट एक्टिविटी", "account_session_desc": "वे अकाउंट चुनें जिनके बारे में आप सूचित होना चाहते हैं:", - "assets_sent_title": "Assets sent", - "assets_sent_desc": "फंड और NFT", - "assets_received_title": "Assets received", - "assets_received_desc": "फंड और NFT", + "assets_sent_title": "एसेट भेजे गए", + "assets_sent_desc": "फंड और NFTs", + "assets_received_title": "एसेट प्राप्त किए गए", + "assets_received_desc": "फंड और NFTs", "defi_title": "DeFi", "defi_desc": "स्टेक करना, स्वैप करना और ब्रिज करना", "snaps_title": "Snaps", @@ -2817,26 +2871,26 @@ "perps_title": "पर्प्स ट्रेडिंग" }, "contacts_title": "संपर्क", - "contacts_desc": "Add, edit, remove, and manage your accounts.", + "contacts_desc": "अपने अकाउंट को बदलें, हटाएं, और मैनेज करें।", "permissions_title": "अनुमतियां", - "permissions_desc": "Manage the permissions given to sites and apps.", + "permissions_desc": "साइटों और ऐप्स को दी गई अनुमतियां मैनेज करें।", "no_permissions": "कोई अनुमति नहीं", "no_permissions_desc": "यदि आप किसी अकाउंट को किसी साइट या ऐप से कनेक्ट करते हैं, तो वह आपको यहां दिखेगा।", "security_title": "सुरक्षा और गोपनीयता", "back": "वापस", "security_desc": "गोपनीयता सेटिंग्स, MetaMetrics, प्राइवेट की (key) और सीक्रेट रिकवरी फ्रेज़।", "networks_title": "नेटवर्क", - "networks_default_title": "Default network", + "networks_default_title": "डिफॉल्ट नेटवर्क", "network_delete": "अगर आप इस नेटवर्क को हटाते हैं, तो आपको इस नेटवर्क में अपने एसेट देखने के लिए इसे फिर से जोड़ना होगा", "networks_default_cta": "इस नेटवर्क का प्रयोग करें", "add_rpc_url": "RPC URL जोड़ें", "add_block_explorer_url": "ब्लॉक एक्सप्लोरर URL जोड़ें", "networks_desc": "कस्टम RPC नेटवर्क को जोड़ें और संपादित करें", - "network_name_label": "Network name", - "network_name_placeholder": "Network name (optional)", + "network_name_label": "नेटवर्क का नाम", + "network_name_placeholder": "नेटवर्क का नाम (वैकल्पिक)", "network_rpc_url_label": "RPC URL", - "network_rpc_name_label": "RPC नाम", - "network_rpc_placeholder": "नया RPC नेटवर्क ", + "network_rpc_name_label": "RPC का नाम", + "network_rpc_placeholder": "नया RPC नेटवर्क", "network_failover_rpc_url_label": "फेलओवर RPC URL", "failover": "फेलओवर", "network_chain_id_label": "चेन ID", @@ -2844,10 +2898,10 @@ "network_symbol_label": "प्रतीक", "network_block_explorer_label": "एक्सप्लोरर URL को ब्लॉक करें", "network_block_explorer_placeholder": "एक्सप्लोरर URL को ब्लॉक करें (वैकल्पिक)", - "network_chain_id_warning": "अमान्य चेन ID", - "network_other_networks": "Other networks", + "network_chain_id_warning": "चेन ID ग़लत है", + "network_other_networks": "अन्य नेटवर्क", "network_rpc_networks": "RPC नेटवर्क", - "network_add_network": "Add network", + "network_add_network": "नेटवर्क जोड़ें", "network_add_custom_network": "एक कस्टम नेटवर्क जोड़ें", "network_add": "जोड़ें", "network_save": "सहेजें", @@ -2858,11 +2912,11 @@ "info_title_beta": "MetaMask Beta के बारे में", "info_title_flask": "MetaMask Flask के बारे में", "experimental_title": "प्रायोगिक", - "experimental_desc": "वॉलेटकनेक्ट और अधिक...", + "experimental_desc": "WalletConnect और अन्य...", "legal_title": "कानूनी", "conversion_title": "करेंसी रुपांतरण", "conversion_desc": "पूरे एप्लिकेशन के दौरान एक विशिष्ट करेंसी के उपयोग में फिएट वैल्यू को प्रदर्शित करें। ", - "primary_currency_title": "Primary currency", + "primary_currency_title": "प्राथमिक करेंसी", "primary_currency_desc": "चेन (उदाहरण के लिए ETH) की मूल करेंसी प्रदर्शन के वैल्यू को प्राथमिकता देने के लिए मूल निवासी को चुनें। आपके द्वारा चुने गए फिएट करेंसी में प्रदर्शन वैल्यू को प्राथमिकता देने के लिए फिएट को चुनें।", "primary_currency_text_first": "मूल निवासी", "primary_currency_text_second": "फिएट ", @@ -2899,11 +2953,11 @@ "invalid_number": "अमान्य संख्या। एक दशमलव या '0x'-पूर्व नियत हेक्साडेसिमल संख्या दर्ज करें।", "invalid_number_leading_zeros": "अमान्य संख्या। किसी भी अग्रणी शून्य को हटाएं।", "invalid_number_range": "अमान्य संख्या। 1 और %{maxSafeChainId} के बीच एक संख्या दर्ज करें", - "hide_zero_balance_tokens_title": "Hide tokens without balance", + "hide_zero_balance_tokens_title": "बिना बैलेंस वाले टोकन छिपाएं", "hide_zero_balance_tokens_desc": "आपके टोकन की सूची में बिना बैलेंस वाले टोकन के प्रदर्शन को रोकें।", "token_detection_title": "टोकन ऑटो-डिटेक्ट करें", "token_detection_description": "हम तीसरे-पक्ष API का उपयोग आपके वॉलेट में भेजे गए नए टोकन का पता लगाने और प्रदर्शन में करते हैं। बंद कर दें यदि आप नहीं चाहते कि ऐप उन सेवाओं से डेटा अलग करें।", - "theme_button_text": "Change theme", + "theme_button_text": "थीम बदलें", "theme_title": "थीम({{theme}})", "theme_description": "थीम सेट करके अपने ऐप का स्वरूप बदलें।", "theme_os": "व्यवस्था", @@ -2935,18 +2989,18 @@ "delete_metrics_description_after_delete_part_two": "। इस प्रक्रिया में 30 दिन तक लग सकते हैं। हमारी", "delete_metrics_description_privacy_policy": "गोपनीयता नीति देखें।", "delete_metrics_button": "मेटामेट्रिक्स डेटा हटाएं", - "check_status_button": "Check status", + "check_status_button": "स्टेटस जांचें", "delete_metrics_confirm_modal_title": "मेटामेट्रिक्स डेटा हटाएं?", "delete_metrics_confirm_modal_description": "हम आपके सभी मेटामेट्रिक्स डेटा को निकालने वाले हैं। क्या आप वाकई ऐसा चाहते हैं?", "delete_wallet_data_title": "वॉलेट रीसेट करें", "delete_wallet_data_description": "यह आपके डिवाइस से वॉलेट से संबंधित सभी डेटा को हटा देगा। आपके खाते ब्लॉकचेन पर मौजूद हैं और मेटामास्क से संबंधित नहीं हैं। आप अपने गुप्त पुनर्प्राप्ति वाक्यांश का उपयोग करके हमेशा अपने खाते पुनर्प्राप्त कर सकते हैं।", "delete_wallet_data_button": "वॉलेट रीसेट करें", - "delete_data_status_title": "Deletion task status", + "delete_data_status_title": "टास्क स्टेटस हटाएं", "delete_data_status_description": "वर्तमान स्थिति है", "delete_metrics_error_title": "हम अभी इस डेटा को हटाने में असमर्थ हैं।", "delete_metrics_error_description": "एनालिटिक्स सिस्टम सर्वर की समस्या के कारण यह रिक्वेस्ट अभी पूरा नहीं किया जा सकता है, कृपया बाद में फिर से प्रयास करें।", "ok": "ठीक है", - "clear_sdk_connections_title": "सभी MetaMask SDK कनेक्शन को हटाएं", + "clear_sdk_connections_title": "सभी MetaMask SDK कनेक्शन हटाएं", "clear_sdk_connections_text": "सभी कनेक्शन हटा दिए जाएंगे और डैप को फिर से कनेक्शन के लिए रिक्वेस्ट करना होगा", "sdk_connections": "MetaMask SDK कनेक्शन", "manage_sdk_connections_title": "कनेक्शन्स प्रबंधित करें", @@ -2956,6 +3010,7 @@ "description": "क्षेत्र & और अधिक...", "current_region": "वर्तमान क्षेत्र", "reset_region": "क्षेत्र रीसेट करें", + "change_region": "क्षेत्र बदलें", "no_region_selected": "कोई क्षेत्र नहीं चुना गया", "sdk_activation_keys": "SDK सक्रियण कुंजियाँ", "activation_keys_description": "एक्टिवेशन कीज़ की मदद से खास फीचर्स या प्रोवाइडर्स को चालू किया जा सकता है।", @@ -3006,13 +3061,13 @@ }, "snap_details": { "install_date": "{{date}} को इंस्टॉल किया गया", - "install_origin": "Install origin", + "install_origin": "ओरिजिन इनस्टॉल करें", "enabled": "चालू किया गया", "version": "वर्शन" }, "keyring_account_list_item": { "account_name": "अकाउंट का नाम", - "public_address": "Public address" + "public_address": "पब्लिक एड्रेस" }, "snap_permissions": { "approved_date": "{{date}} को एप्रूव किया गया", @@ -3067,24 +3122,24 @@ "dismiss_smart_account_update_desc": "किसी भी अकाउंट पर \"स्मार्ट अकाउंट पर स्विच करें\" सुझाव न देखने के लिए इसे चालू करें। स्मार्ट अकाउंट से तेज़ ट्रांसेक्शन, कम नेटवर्क फ़ीस और आसानी से पेमेंट कर सकने का लाभ मिलता है।", "use_smart_account_heading": "स्मार्ट अकाउंट का उपयोग करें", "use_smart_account_desc": "जब भी प्रासंगिक सुविधाएं उपलब्ध हों, जैसे कि तेज ट्रांसेक्शन, कम नेटवर्क शुल्क और उनके लिए भुगतान पर लचीलापन, तो MetaMask के भीतर बनाए गए एकाउंट्स को स्वचालित रूप से स्मार्ट एकाउंट्स में बदलने के लिए इसे चालू रखें।", - "use_smart_account_learn_more": "अधिक जानें।", + "use_smart_account_learn_more": "ज़्यादा जानें", "smart_transactions_opt_in_heading": "स्मार्ट ट्रांसेक्शन", "smart_transactions_opt_in_desc_supported_networks": "समर्थित नेटवर्क पर अधिक विश्वसनीय और सुरक्षित ट्रांसेक्शन के लिए स्मार्ट ट्रांसेक्शन चालू करें।", - "smart_transactions_learn_more": "अधिक जानें।", + "smart_transactions_learn_more": "ज़्यादा जानें", "simulation_details": "बैलेंस अमाउंट में बदलावों का अनुमान लगाएं", "simulation_details_description": "ट्रांसेक्शन को कन्फर्म करने से पहले बैलेंस अमाउंट में बदलाव का अनुमान लगाने के लिए इसे चालू करें। यह आपके ट्रांसेक्शन के फाइनल आउटकम की गारंटी नहीं देता है। ", "simulation_details_learn_more": "अधिक जानें।", - "aes_crypto_test_form_title": "AES crypto - test form", + "aes_crypto_test_form_title": "AES क्रिप्टो - टैस्ट फॉर्म", "aes_crypto_test_form_description": "अनुभाग विशेष रूप से E2E परीक्षण के लिए विकसित किया गया है। यदि यह आपके ऐप में दिखाई दे रहा है, तो कृपया MetaMask सपोर्ट को इसकी रिपोर्ट करें।", "developer_options": { - "title": "Developer options", - "generate_trace_test": "Generate trace test", - "generate_trace_test_desc": "Generate a developer test Sentry trace.", - "navigate_to_sample_feature": "Navigate to sample feature", + "title": "डेवलपर विकल्प", + "generate_trace_test": "ट्रेस टैस्ट जनरेट करें", + "generate_trace_test_desc": "एक डेवलपर टैस्ट सेंट्री ट्रेस जनरेट करें।", + "navigate_to_sample_feature": "नमूना फीचर पर जाएं", "sample_feature_desc": "डेवलपर्स के लिए एक टेम्पलेट के रूप में दिया गया नमूना फीचर।" }, "feature_flag_override": { - "title": "Feature flag override", + "title": "फीचर फ़्लैग ओवरराइड", "description": "ऐप के लिए फीचर फ़्लैग्स को लोकली ओवरराइड करें।" } }, @@ -3107,7 +3162,7 @@ "disconnect_all_info": "यदि आप सभी साइटों के लिए अपने कनेक्शन्स हटाते हैं, तो फिर से कनेक्ट करने के लिए आपको अनुमति देनी होगी।", "disconnect": "डिसकनेक्ट करें", "disconnect_all": "सभी को डिस्कनेक्ट करें", - "disconnect_all_accounts": "सभी अकाउंट डिस्कनेक्ट करें", + "disconnect_all_accounts": "सभी खाते डिसकनेक्ट करें", "manage_connections": "कनेक्शन मैनेज करें", "manage": "मैनेज करें", "cancel": "कैंसिल करें", @@ -3124,7 +3179,7 @@ "disconnect_all": "सभी साइटों से डिसकनेक्ट करें?", "disconnect_all_desc": "यदि आप सभी साइटों से अपने एकाउंट्स को डिसकनेक्ट करते हैं, तो उन्हें फिर से कनेक्ट करने के लिए आपको अनुमति देनी होगी।", "disconnect_account": "अकाउंट डिस्कनेक्ट करें?", - "disconnect_all_accounts": "सभी अकाउंट डिस्कनेक्ट करें", + "disconnect_all_accounts": "सभी खाते डिसकनेक्ट करें", "disconnect_all_accounts_desc": "यदि आप {{dapp}} से सभी एकाउंट्स को डिसकनेक्ट करते हैं, तो उन्हें फिर से कनेक्ट करने के लिए आपको अनुमति देनी होगी।", "disconnect_account_desc": "यदि आप {{dapp}} से {{account}} को डिसकनेक्ट करते हैं, तो उसे फिर से कनेक्ट करने के लिए आपको अनुमति देनी होगी।", "disconnect_confirm": "डिसकनेक्ट करें", @@ -3137,7 +3192,7 @@ "sdk_feedback_modal": { "ok": "ठीक है", "title": "खाता कनेक्ट नहीं हो सका", - "info": "MetaMask से फिर से कनेक्ट करने के लिए कृपया dApp पर क्यूआर कोड स्कैन करें।" + "info": "Please scan the QR code on the site to reconnect to MetaMask" }, "app_information": { "title": "जानकारी", @@ -3145,8 +3200,8 @@ "privacy_policy": "गोपनीयता नीति", "terms_of_use": "उपयोग की शर्तें", "attributions": "विशेषताएं", - "support_center": "Visit our support center", - "web_site": "हमारी वेबसाइट पर जाएं", + "support_center": "हमारे सपोर्ट सेंटर पर जाएं", + "web_site": "Visit our website", "contact_us": "Contact us" }, "reveal_credential": { @@ -3203,7 +3258,7 @@ "keep_credential_safe": "अपना {{credentialName}} सुरक्षित रखें", "srp_abbreviation_text": "SRP", "srp_text": "सीक्रेट रिकवरी फ्रेज़ है", - "private_key_text": "निजी चाबी", + "private_key_text": "प्राइवेट की (key)", "got_it": "समझ गए", "learn_more": "ज़्यादा जानें" }, @@ -3211,12 +3266,12 @@ "title": "सुरक्षा चेतावनी", "description": "स्क्रीनशॉट आपके {{credentialName}} पर नज़र रखने का सुरक्षित तरीका नहीं है। अपने खाते को सुरक्षित रखने के लिए इसे कहीं स्टोर करें जिसका ऑनलाइन बैकअप नहीं लिया गया है।", "srp_text": "सीक्रेट रिकवरी फ्रेज़ है", - "priv_key_text": "निजी कुंजी" + "priv_key_text": "प्राइवेट की (key)" }, "password_reset": { "password_title": "पासवर्ड", "password_desc": "अपने डिवाइस पर MetaMask ऐप को अनलॉक करने के लिए एक मजबूत पासवर्ड को चुनें। अगर आप इस पासवर्ड को खो देते हैं, आपको अपने सीक्रेट रिकवरी फ्रेज की जरुरत होगी ताकि अपने वॉलेट को फिर से इम्पोर्ट कर सकें।", - "password_learn_more": "ज्यादा जानें।", + "password_learn_more": "ज़्यादा जानें", "change_password": "पासवर्ड बदलें", "password_hint": "पासवर्ड संकेत" }, @@ -3246,19 +3301,28 @@ "swap": "स्वैप", "bridge": "ब्रिज", "earn": "कमाएं", - "convert_to_musd": "Convert to mUSD", + "convert_to_musd": "mUSD में कन्वर्ट करें", + "merkl_rewards": { + "annual_bonus": "{{apy}}% बोनस", + "claimable_bonus": "क्लेम करने योग्य बोनस", + "claimable_bonus_tooltip_description": "mUSD bonuses are claimed on Linea.", + "terms_apply": "Terms apply.", + "ok": "ठीक है", + "claim": "क्लेम करें", + "processing_claim": "Processing claim..." + }, "tron": { - "daily_resource_new_energy": "New daily energy", - "sufficient_to_cover": "Sufficient to cover", + "daily_resource_new_energy": "नई दैनिक ऊर्जा", + "sufficient_to_cover": "कवर करने के लिए पर्याप्त", "transactions": "ट्रांसेक्शन", "daily_resource": "दैनिक संसाधन", "bandwidth": "बैंडविड्थ", "energy": "ऊर्जा", - "daily_resource_description": "This is your daily allowance based on your staked TRX. Hold TRX to get 600 bandwidth daily.", - "sufficient_to_cover_trx_transfers": "Covers ~{{amount}} TRX transfers", - "sufficient_to_cover_trx_transfer": "Covers 1 TRX transfer", - "sufficient_to_cover_usdt_transfers": "Covers ~{{amount}} USDT transfers", - "sufficient_to_cover_usdt_transfer": "Covers 1 USDT transfer" + "daily_resource_description": "यह आपके स्टेक किए गए TRX के आधार पर आपकी दैनिक अलाउंस है। प्रतिदिन 600 बैंडविड्थ मुफ़्त पाने के लिए TRX होल्ड करके रखें।", + "sufficient_to_cover_trx_transfers": "~{{amount}} TRX ट्रांसफ़र कवर करता है", + "sufficient_to_cover_trx_transfer": "1 TRX ट्रांसफ़र कवर करता है", + "sufficient_to_cover_usdt_transfers": "~{{amount}} USDT ट्रांसफ़र कवर करता है", + "sufficient_to_cover_usdt_transfer": "1 USDT ट्रांसफ़र कवर करता है" }, "disabled_button": { "buy": "इस अकाउंट के लिए खरीदारी सपोर्ट नहीं करती है", @@ -3311,9 +3375,11 @@ }, "no_chart_data": { "title": "कोई चार्ट डेटा नहीं", - "description": "इस टोकन के लिए कोई डेटा नहीं पाया जा सका" + "description": "इस टोकन के लिए कोई डेटा नहीं पाया जा सका", + "insufficient_data": "Data is not available for this time period" }, "your_balance": "आपका बैलेंस", + "perps_position": "पर्प्स पोज़िशन", "unable_to_load_balance": "आपका बैलेंस लोड करने में असमर्थ", "about": "बारे में", "about_content_display": { @@ -3363,7 +3429,7 @@ "address_copied_to_clipboard": "टोकन पता क्लिपबोर्ड पर कॉपी किया गया" }, "qr_scanner": { - "invalid_qr_code_title": "अमान्य QR कोड", + "invalid_qr_code_title": "Invalid QR code", "invalid_qr_code_message": "QR कोड जिसे आप स्कैन करने की कोशिश कर रहे हैं मान्य नहीं है।", "allow_camera_dialog_title": "कैमरे की पहुंच की अनुमति दें", "allow_camera_dialog_message": "QR कोड स्कैन करने के लिए हमें आपकी अनुमति की जरुरत है", @@ -3376,14 +3442,14 @@ "attempting_sync_from_wallet_error": "ऐसा लगता है जैसे कि एक्सटेंशन के साथ आप सिंक करने की कोशिश कर रहे हैं। ऐसा करने के लिए, आपको अपने वर्तमान वॉलेट को मिटाना होगा। \n\nएक बार जब आपने ऐप के नए प्रारुप को मिटा दिया या फिर से स्थापित कर दिया हो, तब \"MetaMask एक्सटेंशन के साथ सिंक करें\" विकल्प को चुनें। महत्वपूर्ण! अपने वॉलेट को मिटाने से पहले, ये सुनिश्चित कर लें कि आपने अपने सीक्रेट रिकवरी फ्रेज का बैकअप ले लिया है।", "not_allowed_error_title": "कैमरे की ऐक्सेस चालू करें", "not_allowed_error_desc": "QR कोड को स्कैन करने के लिए, आपको अपने डिवाइस के सेटिंग्स मेनू से MetaMask कैमरे की ऐक्सेस देनी होगी।", - "unrecognized_address_qr_code_title": "अपरिचित QR कोड", + "unrecognized_address_qr_code_title": "Unrecognized QR code", "unrecognized_address_qr_code_desc": "क्षमा करें, यह QR कोड किसी खाते के पते या अनुबंध के पते से संबद्ध नहीं है।", "url_redirection_alert_title": "आप किसी बाहरी लिंक पर जाने वाले हैं", "url_redirection_alert_desc": "लिंक का उपयोग लोगों को धोखा देने या फिश करने के लिए किया जा सकता है, इसलिए सुनिश्चित करें कि केवल उन्हीं वेबसाइटों पर जाएं जिन पर आप भरोसा करते हैं।", "label": "एक QR कोड स्कैन करें", "open_settings": "सेटिंग", "camera_not_available": "कैमरा उपलब्ध नहीं है", - "tron_address_not_supported": "Tron addresses are not currently supported" + "tron_address_not_supported": "ट्रॉन एड्रेस अभी सपोर्टेड नहीं हैं" }, "action_view": { "cancel": "रद्द करें", @@ -3471,10 +3537,10 @@ "cancel_tx_message": "इस प्रयास को सबमिट करने से इस बात की गारंटी नहीं मिलती कि आपका मूल लेन-देन रद्द कर दिया जाएगा। यदि रद्द करने का प्रयास सफल रहा, तो आपसे उपरोक्त लेन-देन शुल्क लिया जाएगा।", "speedup_tx_title": "गति बढ़ाने का प्रयास?", "speedup_tx_message": "इस प्रयास को सबमिट करने से इस बात की गारंटी नहीं मिलती कि आपका मूल लेन-देन तेजी से होगा। यदि गति बढ़ाने का प्रयास सफल रहा, तो आपसे उपरोक्त लेन-देन शुल्क लिया जाएगा।", - "nevermind": "कोई बात नहीं", + "nevermind": "Never mind", "edit_network_fee": "गैस शुल्क संपादित करें", "edit_priority": "प्राथमिकता को संपादित करें", - "gas_cancel_fee": "गैस रद्द करने का शुल्क", + "gas_cancel_fee": "Gas cancellation fee", "gas_speedup_fee": "गैस की गति बढ़ाने का शुल्क", "use_max": "अधिकतम उपयोग करें", "set_gas": "निर्धारित करें", @@ -3602,7 +3668,7 @@ "reload": "फिर से लोड करें", "share": "साझा करें", "bookmark": "बुकमार्क", - "add_to_favorites": "पसंदीदा में जोड़े", + "add_to_favorites": "Add to favorites", "error": "त्रुटि", "cancel": "रद्द करें", "go_back": "वापस जाएं", @@ -3610,7 +3676,7 @@ "home": "घर", "close": "बंद करें", "open_in_browser": "ब्राउजर में खोलें", - "change_url": "url बदलें", + "change_url": "Change URL", "switch_network": "नेटवर्क बदलें", "dapp_browser": "DAPP ब्राउजर", "dapp_browser_message": "विकेन्द्रीकृत वेब के लिए MetaMask आपका वॉलेट और ब्राउजर है। अपने आस - पास देखें!", @@ -3654,7 +3720,7 @@ "add_favorite": { "title": "Add favorite", "title_label": "नाम", - "url_label": "Url", + "url_label": "URL", "add_button": "जोड़ें", "cancel_button": "रद्द करें" }, @@ -3676,30 +3742,30 @@ "tx_review_increase_allowance": "Increase allowance", "tx_review_set_approval_for_all": "Set approval for all", "tx_review_staking_claim": "Staking claim", - "tx_review_staking_deposit": "Staking deposit", + "tx_review_staking_deposit": "डिपॉज़िट स्टेक करना", "tx_review_staking_unstake": "अनस्टेक करें", - "tx_review_lending_deposit": "Lending deposit", + "tx_review_lending_deposit": "डिपॉज़िट उधार दिया जा रहा है", "tx_review_lending_withdraw": "Lending withdrawal", "tx_review_perps_deposit": "फंडेड पर्प्स", "tx_review_predict_deposit": "फ़ंड किए गए प्रेडिक्शन", "tx_review_predict_claim": "क्लेम किया गया जीत का ईनाम", "tx_review_predict_withdraw": "प्रेडिक्शन विदड्रॉ", - "tx_review_musd_conversion": "mUSD Conversion", - "sent_ether": "Ether भेजे गए", - "self_sent_ether": "Sent yourself Ether", - "received_ether": "Ether प्राप्त किया", + "tx_review_musd_conversion": "mUSD कन्वर्शन", + "sent_ether": "Sent ETH", + "self_sent_ether": "Sent yourself ETH", + "received_ether": "Received ETH", "sent_dai": "DAI भेजे गए", "self_sent_dai": "खुद को DAI भेजें", "received_dai": "DAI प्राप्त किया", "sent_tokens": "Sent tokens", "received_tokens": "Received tokens", - "ether": "Ether", + "ether": "ETH", "sent_unit": "{{unit}} भेजे गए", "self_sent_unit": "Sent yourself {{unit}}", "received_unit": "{{unit}} प्राप्त किया", "sent_collectible": "Sent collectible", "received_collectible": "Received collectible", - "send_ether": "Send Ether", + "send_ether": "Send ETH", "send_unit": "Send {{unit}}", "send_collectible": "Send collectible", "receive_collectible": "Receive collectible", @@ -3732,9 +3798,9 @@ }, "gas_used": "Gas used (units)", "gas_limit": "Gas limit (units)", - "gas_price": "गैस की कीमत (GWEI)", - "base_fee": "बेस फी (GWEI)", - "priority_fee": "प्रायोरिटी फी (GWEI)", + "gas_price": "Gas price (GWEI)", + "base_fee": "Base fee (GWEI)", + "priority_fee": "Priority fee (GWEI)", "multichain_priority_fee": "प्रायोरिटी फी", "max_fee": "Max fee per gas", "total": "कुल", @@ -3767,7 +3833,7 @@ "confirm_gas_fee_token_tooltip": "यह आपके ट्रांसेक्शन को प्रोसेस करने के लिए नेटवर्क को भुगतान किया जाता है। इसमें गैर-ETH टोकन या पहले से फंड किए गए ETH के लिए {{metamaskFeeFiat}} MetaMask फीस शामिल है।", "paid_by_metamask": "MetaMask द्वारा भुगतान किया गया", "confirm_gas_fee_token_metamask_fee": "इसमें {{metamaskFeeFiat}} फीस शामिल है", - "smart_account_upgrade": "स्मार्ट अकाउंट में अपग्रेड करें", + "smart_account_upgrade": "स्मार्ट अकाउंट पर स्विच करें", "smart_account_downgrade": "मानक अकाउंट पर स्विच करें", "batched_transactions": "समूहित ट्रांसेक्शन", "gas_modal": { @@ -4004,8 +4070,8 @@ "biometrics": { "enable_touchid": "टच ID के साथ अनलॉक करें?", "enable_faceid": "फेस ID के साथ अनलॉक करें?", - "enable_fingerprint": "फिंगरप्रिंट के साथ अनलॉक करें?", - "enable_biometrics": "बायोमेट्रिक्स के साथ अनलॉक करें?", + "enable_fingerprint": "Unlock with fingerprint?", + "enable_biometrics": "Unlock with biometrics?", "enable_device_passcode_ios": "डिवाइस के पासकोड के साथ अनलॉक करें?", "enable_device_passcode_android": "डिवाइस के PIN के साथ अनलॉक करें?" }, @@ -4020,18 +4086,18 @@ "title": "कनेक्ट अनुरोध ", "walletconnect_title": "वॉलेटकनेक्ट अनुरोध", "action": "इस साइट से कनेक्ट करें?", - "action_reconnect": "कनेक्शन फिर से शुरू करने के लिए, वह नंबर चुनें जो आप dApp पर देखते हैं", - "action_reconnect_deeplink": "क्या आप इस dApp से फिर से कनेक्ट करना चाहते हैं?", + "action_reconnect": "To resume connection, choose the number you see on the site", + "action_reconnect_deeplink": "Do you want to reconnect to this site?", "connect": "कनेक्ट", "resume": "फिर से शुरू करें", "cancel": "रद्द करें", - "donot_rememberme": "इस dApp कनेक्शन को याद न रखें", + "donot_rememberme": "Do not remember this site connection", "disconnect": "डिसकनेक्ट करें", "permission": "देखें अपना ", "address": "पब्लिक एड्रेस", "sign_messages": "संदेशों पर हस्ताक्षर करें", "on_your_behalf": "आपकी ओर से", - "warning": "कनेक्ट पर क्लिक करके, आप इस dapp को अपना पब्लिक एड्रेस देखने की अनुमति देते हैं। सुरक्षा के लिए य़ह एक महत्वपूर्ण कदम है ताकि संभावित फिशिंग जोखिम से अपने डेटा को सुरक्षित रख सकें।" + "warning": "By clicking connect, you allow this site to view your public address. This is an important security step to protect your data from potential phishing risks." }, "import_private_key": { "title": "अकाउंट इंपोर्ट करें", @@ -4047,7 +4113,7 @@ "error_title": "कुछ गलत हो गया", "error_message": "हम उस निजी की को इम्पोर्ट नहीं कर सके। कृपया सुनिश्चित करें कि आपने इसे सही ढ़ंग से दर्ज किया है।", "error_empty_message": "आपको अपनी निजी की दर्ज करने की जरुरत है।", - "or_scan_a_qr_code": "या एक QR कोड स्कैन करें " + "or_scan_a_qr_code": "or scan a QR code" }, "import_private_key_success": { "title": "अकाउंट सफलतापूर्वक इम्पोर्ट किया गया!", @@ -4064,12 +4130,12 @@ "paste": "पेस्ट करें", "clear": "सभी हटाएं", "srp_number_of_words_option_title": "शब्दों की संख्या", - "12_word_option": "मेरे पास 12 शब्दों का एक वाक्यांश है", - "24_word_option": "मेरे पास 24 शब्दों का एक वाक्यांश है", + "12_word_option": "I have a 12-word phrase", + "24_word_option": "I have a 24-word phrase", "error_title": "कुछ गलत हो गया", "error_message": "We couldn't import that Secret Recovery Phrase. Please make sure you entered it correctly.", "error_empty_message": "You need to enter your Secret Recovery Phrase.", - "error_number_of_words_error_message": "सीक्रेट रिकवरी फ्रेज़ में 12, या 24 शब्द होते हैं", + "error_number_of_words_error_message": "Secret Recovery Phrases contain 12 or 24 words", "error_srp_is_case_sensitive": "ग़लत इनपुट! सीक्रेट रिकवरी फ्रेज़ केस सेंसिटिव है।", "error_srp_word_error_1": "शब्द ", "error_srp_word_error_2": " गलत है या इसकी स्पेलिंग गलत है।", @@ -4079,7 +4145,7 @@ "error_invalid_srp": "अमान्य सीक्रेट रिकवरी फ्रेज", "error_duplicate_srp": "यह सीक्रेट रिकवरी फ्रेज़ पहले ही इंपोर्ट किया जा चुका है।", "error_duplicate_account": "The account you are trying to import is a duplicate.", - "invalid_qr_code_title": "अमान्य QR कोड", + "invalid_qr_code_title": "Invalid QR code", "invalid_qr_code_message": "The QR code does not contain a valid Secret Recovery Phrase", "success_1": "वॉलेट", "success_2": "इम्पोर्ट किया गया" @@ -4151,7 +4217,7 @@ "why_secure_2": "केवल यही एक तरीका है आपके वॉलेट को रिकवर करने का यदि आप ऐप के बाहर लॉक हो जाते हैं या एक नया डिवाइस प्राप्त करते हैं।" }, "account_backup_step_2": { - "cancel_backup_title": "Cancel backup", + "cancel_backup_title": "बैकअप कैंसिल करें", "cancel_backup_message": "हम अत्यधिक अनुशंसा करते हैं कि आप अपने वॉलेट को बहाल करने के दौरान अपने सीक्रेट रिकवरी फ्रेज को सहेजें।", "cancel_backup_ok": "हां, मैं जोखिम लूंगा", "cancel_backup_no": "नहीं, सीक्रेट रिकवरी फ्रेज का बैकअप लें", @@ -4163,7 +4229,7 @@ "cta_text": "ठीक है" }, "account_backup_step_3": { - "cancel_backup_title": "Cancel backup", + "cancel_backup_title": "बैकअप कैंसिल करें", "cancel_backup_message": "हम अत्यधिक अनुशंसा करते हैं कि आप अपने वॉलेट को बहाल करने के दौरान अपने सीक्रेट रिकवरी फ्रेज को सहेजें।", "cancel_backup_ok": "हां, मैं जोखिम लूंगा", "cancel_backup_no": "नहीं, सीक्रेट रिकवरी फ्रेज का बैकअप लें", @@ -4172,7 +4238,7 @@ "cta_text": "मुझे कोई नहीं देख रहा है" }, "account_backup_step_4": { - "cancel_backup_title": "Cancel backup", + "cancel_backup_title": "बैकअप कैंसिल करें", "cancel_backup_message": "हम अत्यधिक अनुशंसा करते हैं कि आप अपने वॉलेट को बहाल करने के दौरान अपने सीक्रेट रिकवरी फ्रेज को सहेजें।", "cancel_backup_ok": "हां, मैं जोखिम लूंगा", "cancel_backup_no": "नहीं, सीक्रेट रिकवरी फ्रेज का बैकअप लें", @@ -4197,16 +4263,16 @@ "modal_button": "अगला" }, "account_backup_step_6": { - "title": "Security tips", + "title": "सुरक्षा के लिए सुझाव", "info_text": "यदि आप खो देते हैं तो MetaMask आपके सीक्रेट रिकवरी फ्रेज को रिकवर नहीं कर सकता है।", "tip_1": "अपने सीक्रेट रिकवरी फ्रेज के एक से ज्यादा बैकअप रखें", "tip_2": "इस फ्रेज को एक सुरक्षित स्थान पर भरोसेमंद पासवर्ड प्रबंधक और कागज बैकअप में स्टोर करें।", "tip_3": "इस फ्रेज को किसी के साथ कभी भी साझा नहीं करें ", "disclaimer": "*आपको अपना सीक्रेट रिकवरी फ्रेज मिल सकता है यदि आप जाते हैं", - "disclaimer_bold": "सेटिंग > सुरक्षा और गोपनीयता", - "cta_text": "मिल गया!", + "disclaimer_bold": "सेटिंग्स में > सुरक्षा और गोपनीयता", + "cta_text": "समझ गए", "modal_title": "बधाई!", - "modal_text": "आप सभी का बैकअप लिया जा चुका है और जाने के लिए तैयार हैं!", + "modal_text": "आपका बैकअप पूरा हो चुका है और आप शुरू करने के लिए तैयार हैं।", "modal_button": "सम्पन्न", "copy_seed_phrase": "सीक्रेट रिकवरी फ्रेज को क्लिपबोर्ड पर कॉपी करें" }, @@ -4238,7 +4304,7 @@ "steps": "{{totalSteps}} का स्टेप {{currentStep}}", "action": "अपना सीक्रेट रिकवरी फ्रेज़ कन्फर्म करें", "info": "अनुपस्थित शब्दों को सही क्रम में चुनें।", - "complete": "Complete backup", + "complete": "बैकअप पूरा करें", "success": "सफलता", "error-title": "पूरी तरह सही नहीं है", "error-description": "अपने सीक्रेट रिकवरी फ्रेज़ को दोबारा जांचें और फिर से कोशिश करें।", @@ -4253,7 +4319,7 @@ "congratulations": "बधाई", "success": "आपने अपने वॉलेट को सफलतापूर्वक सुरक्षित कर लिया है। अपने सीक्रेट रिकवरी फ्रेज को सुरक्षित रखना याद रखें, यह आपकी जिम्मेदारी है!", "hint": "अपने लिए एक संकेत छोड़ें?", - "recover": "यदि आप खो देते हैं तो MetaMask आपके वॉलेट को रिकवर नहीं कर सकता है। आपको अपना सीक्रेट रिकवरी फ्रेज सेटिंग > सुरक्षा और गोपनीयता में मिल सकता है।", + "recover": "यदि आप खो देते हैं तो MetaMask आपके वॉलेट को रिकवर नहीं कर सकता है। आपको अपना सीक्रेट रिकवरी फ्रेज़ सेटिंग्स > सुरक्षा और गोपनीयता में मिल सकता है।", "learn": "ज्यादा जानें।", "done": "सम्पन्न", "recovery_hint": "रिकवरी के लिए संकेत", @@ -4300,7 +4366,7 @@ "withdrawal_completed": "विदड्रॉवल पूरा हुआ", "unstake_completed": "अनस्टेक पूरा हुआ", "withdrawal_requested": "विदड्रॉवल का अनुरोध किया गया", - "stake_ready_to_be_withdrawn": "स्टेक विदड्रॉ करने के लिए तैयार है", + "stake_ready_to_be_withdrawn": "स्टेक विदड्रॉवल के लिए तैयार है", "swap_completed": "{{from}} को {{to}} के लिए स्वैप किया गया", "swap": "स्वैप किया गया", "sent": "{{address}} पर भेजा गया", @@ -4417,7 +4483,7 @@ "metamask_swap_completed_title": "स्वैप पूरा हुआ", "metamask_swap_completed_description": "आपका MetaMask स्वैप सफल रहा", "nft_sent_title": "NFT भेजा गया", - "nft_sent_description": "आपने सफलतापूर्वक NFT भेज दिया है", + "nft_sent_description": "You successfully sent an NFT", "nft_received_title": "NFT प्राप्त किया गया", "nft_received_description": "आपको नए NFTs प्राप्त हुए", "rocketpool_stake_completed_title": "स्टेक पूरा हुआ", @@ -4519,7 +4585,7 @@ "copy_to_clipboard": "क्लिपबोर्ड पर कॉपी करें", "qr_code": "QR कोड", "send_link": "Send link", - "request_qr_code": "भुगतान के लिए QR कोड का अनुरोध", + "request_qr_code": "Payment request QR code", "balance": "बैलेंस" }, "receive_request": { @@ -4541,8 +4607,8 @@ "copy_address": "एड्रेस कॉपी करें" }, "experimental_settings": { - "wallet_connect_dapps": "वॉलेटकनेक्ट सत्र", - "wallet_connect_dapps_desc": "View the list of active WalletConnect sessions.", + "wallet_connect_dapps": "WalletConnect सेशंस", + "wallet_connect_dapps_desc": "WalletConnect के एक्टिव सेशंस की लिस्ट देखें।", "wallet_connect_dapps_cta": "सेशन देखें", "network_not_supported": "वर्तमान नेटवर्क समर्थन नहीं करता", "select_provider": "अपना पसंदीदा प्रदाता चुनें", @@ -4561,10 +4627,10 @@ "close_current_session": "नया सत्र शुरू करने से पहले वर्तमान सत्र को बंद कर दें।" }, "paymentRequest": { - "title": "भुगतान का अनुरोध", - "title_complete": "भुगतान पूरा हुआ", - "confirm": "भुगतान करें", - "cancel": "इन्कार करना", + "title": "Payment request", + "title_complete": "Payment complete", + "confirm": "Pay", + "cancel": "Decline", "is_requesting_you_to_pay": "आपसे भुगतान करने का अनुरोध कर रहा है", "total": "कुल:" }, @@ -4589,6 +4655,10 @@ "fiat_on_ramp": { "buy_eth": "ETH खरीदें", "buy": "{{ticker}} खरीदें", + "on_network": "{{networkName}} पर", + "debit_card": "डेबिट कार्ड", + "continue": "जारी रखें", + "powered_by_provider": "{{provider}} द्वारा संचालित", "purchased_currency": "{{currency}} खरीदा गया", "network_not_supported": "वर्तमान नेटवर्क समर्थन नहीं करता", "switch_network": "कृपया Mainnet पर बदलें", @@ -4609,7 +4679,7 @@ "second_line": "अपनी खरीद?" }, "buy_ticker": "{{ticker}} खरीदें", - "buy_ticker_stablecoins": "स्टैबल कॉइन और {{ticker}} खरीदें ", + "buy_ticker_stablecoins": "{{ticker}} और स्टेबलकॉइन खरीदें", "multiple_payment_methods": "पेमेंट के कई तरीके", "debit_credit_bank_transfers_country": "देश के आधार पर डेबिट/क्रेडिट और बैंक हस्तांतरण।", "debit_credit_bank_transfers_more_country": "देश के आधार पर डेबिट/क्रेडिट, बैंक हस्तांतरण, और बहुत कुछ।", @@ -4676,6 +4746,14 @@ "subtitle_5": "और देखें गैस की लागत कितनी होती है।", "cta": "{{ticker}} कों खरीदना जारी रखें" } + }, + "build_quote_settings_modal": { + "title": "सेटिंग्स", + "view_order_history": "ऑर्डर इतिहास देखें", + "contact_support": "सपोर्ट टीम से कॉन्टेक्ट करें", + "log_out": "{{provider}} से लॉग आउट करें", + "logged_out_success": "सफलतापूर्वक लॉग आउट किया गया", + "logged_out_error": "लॉग आउट करते समय गड़बड़ी" } }, "fiat_on_ramp_aggregator": { @@ -4761,7 +4839,7 @@ "get_quotes": "उद्धरण पाएं", "done": "हो गया", "fetching_quotes": "उद्धरण ला रहे हैं", - "select_a_quote": "कोई उद्धरण चुनें", + "select_a_quote": "कोई कोटेशन चुनें", "recommended_quote": "अनुशंसित कोटेशन", "select_a_cryptocurrency": "क्रिप्टोक्यूरेंसी चुनें", "select_a_cryptocurrency_description": "उपलब्ध टोकन की सूची में से चुनें।", @@ -4822,6 +4900,7 @@ "title": "अपना क्षेत्र चुनें", "description": "आपके लिए उपलब्ध भुगतान विधियों और टोकन को हमारे तृतीय-पक्ष समेकित प्रदाताओं द्वारा निर्धारित किया जाता है और आपके क्षेत्र और हमारे समेकित प्रदाताओं द्वारा सहयोग के आधार पर भिन्न-भिन्न हो सकते हैं।", "sell_description": "आपके क्षेत्र के आधार पर कैश गंतव्य विकल्प और टोकन भिन्न हो सकते हैं।", + "region_variation_notice": "भुगतान के तरीके और उपलब्ध टोकन आपके क्षेत्र और हमारे प्रदाताओं के आधार पर भिन्न हो सकते हैं।", "search_by_country": "देश के अनुसार ढूंढें", "search_by_state": "स्टेट के अनुसार खोजें", "no_region_results": "किसी क्षेत्र से मिलान नहीं हुआ", @@ -4849,7 +4928,7 @@ "continue_order_description": "अपना ऑर्डर जारी रखने के लिए, आपको इस पृष्ठ के नीचे बटन का चयन करना होगा।", "the_provider": "प्रदाता", "processing": "ऑर्डर प्रोसेस किया जा रहा है", - "processing_card_description": "क्रेडिट/डेबिट खरीददारी में आम तौर पर कुछ मिनट लगते हैं", + "processing_card_description": "क्रेडिट/डेबिट खरीदारी में आमतौर पर कुछ मिनट लगते हैं", "processing_bank_description": "बैंक ट्रांसफर में आमतौर पर कुछ व्यावसायिक दिन लगते हैं", "details": "ऑर्डर का विवरण", "via": "के जरिए", @@ -4883,11 +4962,11 @@ "sent": "भेजा गया!" }, "notifications": { - "purchase_failed_title": "{{currency}} खरीदी नहीं जा सकी! कृपया फिर से कोशिश करें, असुविधा के लिए खेद है!", + "purchase_failed_title": "{{currency}} की खरीद नहीं हो पायी। कृपया थोड़ी देर बाद फिर से प्रयास करें।", "purchase_failed_description": "अपने पेमेंट के तरीके और कार्ड सपोर्ट को वेरीफाई करें", "purchase_cancelled_title": "आपकी खरीद रद्द कर दी गई थी", "purchase_cancelled_description": "अपने पेमेंट के तरीके और कार्ड सपोर्ट को वेरीफाई करें", - "purchase_completed_title": "{{amount}} {{currency}} की आपकी खरीद सफलतापूर्ण थी!", + "purchase_completed_title": "{{amount}} {{currency}} की आपकी खरीद सफल रही।", "purchase_completed_description": "आपकी {{currency}} अब उपलब्ध है", "purchase_pending_title": "{{currency}} की आपकी खरीद प्रोसेस की जा रही है", "purchase_pending_description": "इसमें केवल कुछ मिनटों का समय लगना चाहिए...", @@ -4896,7 +4975,7 @@ "sale_cancelled_title": "ऑर्डर कैंसिल किया गया", "sale_cancelled_description": "आपका ऑर्डर पूरा नहीं हो सका।", "sale_completed_title": "ऑर्डर पूरा हो गया", - "sale_completed_description": "आपका ऑर्डर सही से हो गया!", + "sale_completed_description": "आपका ऑर्डर सही से हो गया।", "sale_pending_title": "{{currency}} सेल प्रोसेस हो रही है", "sale_pending_description": "आपके ऑर्डर को अब प्रोसेस किया जा रहा है।", "no_date": "अज्ञात" @@ -4921,7 +5000,7 @@ "start_swapping": "स्वैप करना शुरु करें" }, "feature_off_title": "अस्थायी रुप से उपलब्ध नहीं", - "feature_off_body": "MetaMask स्वैप में रख-रखाव का काम चल रहा है। कृपया बाद में जांचें।", + "feature_off_body": "MetaMask Swaps are undergoing maintenance. Please check back later.", "wrong_network_title": "स्वैप उपलब्ध नहीं है", "wrong_network_body": "Ethereum मुख्य नेटवर्क पर ही केवल आप टोकन स्वैप करने में सक्षम हैं।", "unallowed_asset_title": "इस टोकन को स्वैप नहीं कर सकते", @@ -5002,7 +5081,7 @@ "edit": "संपादित करें", "quotes_include_fee": "उद्धरण में एक {{fee}}% MetaMask शुल्क शामिल है", "quotes_include_gas_and_metamask_fee": "कोटेशन में गैस और{{fee}}% MetaMask शुल्क शामिल है", - "tap_to_swap": "स्वैप करने के लिए टैप करें", + "tap_to_swap": "Tap to swap", "swipe_to_swap": "स्वैप करने के लिए स्वाइप करें", "swipe_to": "स्वाइप करें", "swap": "स्वैप करें", @@ -5385,7 +5464,7 @@ "learn_more": "ज़्यादा जानें" }, "token_allowance": { - "verify_third_party_details": "थर्ड पार्टी के विवरण को सत्यापित करें", + "verify_third_party_details": "Verify third-party details", "protect_from_scams": "स्कैमर्स से खुद को बचाने के लिए, कुछ समय निकालकर थर्ड पार्टी के विवरण को सत्यापित करें।", "learn_to_verify": "थर्ड पार्टी के विवरण को सत्यापित करने का तरीका जानें", "spending_cap": "खर्च करने की सीमा", @@ -5399,7 +5478,7 @@ }, "restore_wallet": { "restore_needed_title": "पुनर्स्थापित करने की आवश्यकता है", - "restore_needed_description": "कुछ गलत हुआ है लेकिन चिंता न करें! आइए आपके वॉलेट को पुनर्स्थापित करने का प्रयास करें।", + "restore_needed_description": "Something went wrong, but don’t worry! Let’s try to restore your wallet.", "restore_needed_action": "वॉलेट पुनर्स्थापित करें" }, "wallet_restored": { @@ -5598,6 +5677,10 @@ "error_description": "{{snap}} का इंस्टॉलेशन नहीं हो पाया।" }, "earn": { + "claimable_bonus_tooltip": "An annual bonus claimable daily from your wallet.", + "earn_a_percentage_bonus": "Earn a {{percentage}}% bonus", + "claimable_bonus": "Claimable bonus", + "claim_bonus": "Claim bonus", "empty_state_cta": { "heading": "{{tokenSymbol}} उधार दें और कमाएं", "body": "{{protocol}} के साथ अपना {{tokenSymbol}} उधार दें और सालाना", @@ -5681,21 +5764,36 @@ "fee": "फीस" }, "musd_conversion": { - "convert_to_musd": "Convert to mUSD", + "ok": "ठीक है", + "continue": "Continue", + "convert_and_get_percentage_bonus": "कन्वर्ट करें और {{percentage}}% पाएं", + "get_a_percentage_musd_bonus": "{{percentage}}% mUSD बोनस पाएं", + "convert": "कन्वर्ट करें", "toasts": { - "converting": "Converting {{token}} → mUSD", + "converting": "{{token}} → mUSD में कन्वर्ट किया जा रहा है", "eta": "~{{time}}", - "delivered": "Your mUSD has been delivered!", - "failed": "mUSD conversion failed" + "delivered": "आपका mUSD यहाँ है!", + "failed": "mUSD कन्वर्शन नहीं हो पाया" }, "education": { - "heading": "mUSD के साथ रिवॉर्ड्स अर्जित करें", - "description": "Convert your USDC, USDT, or DAI for mUSD, MetaMask’s dollar-backed stablecoin.Earn points every time you convert or hold $100.", - "continue_button": "शुरू करें" + "heading": "स्टेबलकॉइन्स पर {{percentage}}% पाएं", + "description": "Convert your stablecoins to mUSD, MetaMask’s US dollar-backed stablecoin, and receive up to a {{percentage}}% bonus.", + "terms_apply": "Terms apply.", + "primary_button": "शुरू करें", + "secondary_button": "अभी नहीं" }, - "earn_points_daily": "Earn points daily", - "buy_musd": "Buy mUSD", - "get_musd": "Get mUSD" + "buy_musd": "mUSD खरीदें", + "get_musd": "mUSD प्राप्त करें", + "boost_title": "Get {{percentage}}% on your stablecoins", + "boost_description": "Convert your stablecoins to mUSD and receive up to a {{percentage}}% bonus.", + "powered_by_relay": "Relay द्वारा संचालित" + }, + "bonus_claim": { + "toasts": { + "claiming": "Your mUSD bonus is processing", + "delivered": "Your mUSD bonus is here!", + "failed": "Bonus claim failed" + } }, "rewards": { "rewards_tag_label": "पुरस्कार", @@ -5711,22 +5809,22 @@ "stake": "Stake", "earn": "कमाएं", "tron": { - "stake_completed": "Staking completed", - "stake_completed_description": "Your staking transaction has been completed successfully.", - "stake_failed": "Staking failed", + "stake_completed": "स्टेकिंग पूरा हुआ", + "stake_completed_description": "आपका स्टेकिंग ट्रांसेक्शन सही से पूरा हो गया है।", + "stake_failed": "स्टेकिंग नहीं हो पाया", "unstake_completed": "अनस्टेकिंग पूरा हुआ", - "unstake_completed_description": "Your unstaking transaction has been completed successfully.", - "unstake_failed": "Unstaking failed", + "unstake_completed_description": "आपका अनस्टेकिंग ट्रांसेक्शन सही से पूरा हो गया है।", + "unstake_failed": "अनस्टेकिंग नहीं हो पाया", "bandwidth": "बैंडविड्थ", "energy": "ऊर्जा", "estimated_annual_reward": "अनुमानित वार्षिक रिवॉर्ड", - "trx_locked_for": "TRX locked for", - "trx_locked_for_minimum_time": "~3 days", - "trx_released_in": "TRX released in", - "trx_released_in_minimum_time": "~14 days", + "trx_locked_for": "के लिए TRX लॉक किया गया", + "trx_locked_for_minimum_time": "~3 दिन के लिए", + "trx_released_in": "TRX रिलीज़ किया गया", + "trx_released_in_minimum_time": "~14 दिनों में", "fee": "फीस", "errors": { - "insufficient_balance": "You don't have enough resource balance to do this action." + "insufficient_balance": "आपके पास यह काम करने के लिए पर्याप्त रिसोर्स बैलेंस नहीं है।" } }, "stake_eth": "ETH स्टेक करें", @@ -5772,12 +5870,19 @@ "learn_more_with_period": "अधिक जानें।" }, "stake_your_trx_cta": { - "title": "Lend Tron and earn", - "description_start": "Stake your Tron and earn ", + "title": "ट्रॉन उधार दें और कमाएं", + "description_start": "अपना ट्रॉन स्टेक पर लगाएं और कमाएं ", "description_end": " annually.", "learn_more": "अधिक जानें।", "earn_button": "कमाएं" }, + "trx_learn_more": { + "title": "Stake TRX and earn", + "stake_any_amount": "Stake any amount of TRX.", + "earn_trx_rewards": "TRX पुरस्कार अर्जित करें।", + "earn_trx_rewards_description": "स्टेक करते ही कमाई शुरू करें। पुरस्कार स्वचालित रूप से जुड़ते हैं।", + "flexible_unstaking_description": "Unstake anytime. Unstaking takes 14 days to process." + }, "day": { "zero": "", "one": "दिन", @@ -5855,7 +5960,7 @@ "one_year_average": "1 साल का औसत" }, "default_settings": { - "title": "Your wallet is ready", + "title": "आपका वॉलेट तैयार है", "description": "MetaMask सुरक्षा और उपयोग में आसानी को संतुलित करने के लिए डिफॉल्ट सेटिंग्स का उपयोग करता है। अपनी गोपनीयता को और बढ़ाने के लिए इन सेटिंग्स को बदलें।", "learn_more_about_privacy": "गोपनीयता की सर्वोत्तम प्रथाओं के बारे में और जानें।", "privacy_policy": "गोपनीयता नीति", @@ -5981,7 +6086,7 @@ "switch_account_type": "अकाउंट अपडेट", "approve": "अनुरोध एप्रूव करें", "perps_deposit": "फंड जोड़ें", - "predict_deposit": "प्रेडिक्ट फ़ंड जोड़ें", + "predict_deposit": "प्रिडिक्शन फ़ंड जोड़ें", "predict_withdraw": "निकालें" }, "sub_title": { @@ -6002,14 +6107,15 @@ "transaction_fee": "हम आपके टोकन को HyperCore पर USDC में स्वैप करेंगे, जो पर्प्स द्वारा इस्तेमाल होने वाला नेटवर्क है। स्वैप प्रदाता फीस ले सकते हैं, लेकिन MetaMask कोई फीस नहीं लेगा।" }, "predict_deposit": { - "transaction_fee": "हम आपके टोकन को Polygon पर USDC.e में स्वैप करेंगे, जो प्रेडिक्ट द्वारा इस्तेमाल होने वाला नेटवर्क है। स्वैप प्रदाता फीस ले सकते हैं, लेकिन MetaMask कोई फीस नहीं लेगा।" + "transaction_fee": "हम आपके टोकन को Polygon पर USDC.e में स्वैप करेंगे, जो प्रिडिक्शन्स द्वारा इस्तेमाल होने वाला नेटवर्क है। स्वैप प्रदाता फीस ले सकते हैं, लेकिन MetaMask कोई फीस नहीं लेगा।" }, "musd_conversion": { - "transaction_fee": "mUSD conversion fees include network costs and may include provider fees." + "transaction_fee": "mUSD कन्वर्शन फ़ीस में नेटवर्क कॉस्ट और प्रोवाइडर फ़ीस शामिल हो सकती है।" }, "title": { "transaction_fee": "फीस" - } + }, + "network_fee": "नेटवर्क फीस इस बात पर निर्भर करते हैं कि नेटवर्क कितना व्यस्त है और आपका ट्रांसेक्शन कितना जटिल है।" }, "spending_cap": "खर्च करने की सीमा", "withdraw": "निकालें", @@ -6078,7 +6184,7 @@ }, "includes_transaction": "{{transactionCount}} ट्रांसेक्शन शामिल हैं", "useSmartAccount": "स्मार्ट अकाउंट का उपयोग करें", - "successful": "सफल!", + "successful": "सफल", "success_message": "आपके अगले ट्रांसेक्शन के साथ आपका अकाउंट स्मार्ट अकाउंट में अपडेट हो जाएगा।" }, "edit_spending_cap_modal": { @@ -6086,9 +6192,9 @@ "cancel": "कैंसिल करें", "description": "वह अमाउंट जिसे आप अपनी ओर से खर्च किए जाने में सहज महसूस करते हैं।", "invalid_number_error": "खर्च की सीमा एक संख्या होनी चाहिए", - "no_empty_error": "खर्च की सीमा खाली नहीं हो सकती", - "no_extra_decimals_error": "खर्च की सीमा में टोकन से अधिक दशमलव नहीं हो सकते", - "no_zero_error": "खर्च की सीमा 0 नहीं हो सकती", + "no_empty_error": "Spending cap can't be empty", + "no_extra_decimals_error": "Spending cap can't have more decimals than the token", + "no_zero_error": "Spending cap can't be 0", "no_zero_error_decrease_allowance": "'decreaseAllowance' विधि पर 0 खर्च की सीमा का कोई प्रभाव नहीं पड़ता है", "no_zero_error_increase_allowance": "'increaseAllowance' विधि पर 0 खर्च की सीमा का कोई प्रभाव नहीं पड़ता है", "save": "सेव करें", @@ -6119,7 +6225,7 @@ "edit_amount_done": "जारी रखें", "deposit_edit_amount_done": "फंड जोड़ें", "deposit_edit_amount_predict_withdraw": "निकालें", - "deposit_edit_amount_musd_conversion": "Convert to mUSD" + "deposit_edit_amount_musd_conversion": "mUSD में कन्वर्ट करें" }, "change_in_simulation_modal": { "title": "परिणाम बदल गए हैं", @@ -6144,6 +6250,8 @@ "confirm_swap": "स्वैप करें", "terms_and_conditions": "नियम और शर्त", "select_token": "टोकन चुनें", + "no_tokens_found": "कोई टोकन नहीं मिला", + "no_tokens_found_description": "We couldn't find any tokens with this name. Try a different search.", "select_network": "नेटवर्क चुनें", "all_networks": "सभी नेटवर्क", "num_networks": "{{numNetworks}} नेटवर्क", @@ -6151,6 +6259,7 @@ "select_all_networks": "सभी को चुनें", "deselect_all_networks": "सभी को अचयनित करें", "see_all": "सभी को देखें", + "all": "सभी", "apply": "लागू करें", "slippage": "स्लिपेज (slippage)", "slippage_info": "यदि आपके ऑर्डर लगाए जाने और पुष्टि किए जाने के बीच कीमत में बदलाव होता है तो इसे \"स्लिपेज (slippage)\" कहा जाता है। यदि स्लिपेज (slippage) आपके द्वारा यहां निर्धारित सहनशीलता से अधिक हो जाता है तो आपका स्वैप स्वचालित रूप से कैंसिल हो जाएगा।", @@ -6191,9 +6300,9 @@ "title": "ब्रिज", "submitting_transaction": "सबमिट किया जा रहा है", "fetching_quote": "कोटेशन लाया जा रहा है", - "fee_disclaimer": "इसमें {{feePercentage}}% MM फीस शामिल है।", + "fee_disclaimer": "Includes {{feePercentage}}% MetaMask fee.", "no_mm_fee": "कोई MM फीस नहीं", - "no_mm_fee_disclaimer": "{{destTokenSymbol}} में स्वैप करने पर कोई MM फीस नहीं।", + "no_mm_fee_disclaimer": "No MetaMask fee swapping into {{destTokenSymbol}}.", "hardware_wallet_not_supported": "हार्डवेयर वॉलेट अभी तक सपोर्टेड नहीं हैं। जारी रखने के लिए हॉट वॉलेट का उपयोग करें।", "hardware_wallet_not_supported_solana": "Solana के लिए हार्डवेयर वॉलेट अभी तक सपोर्टेड नहीं हैं। जारी रखने के लिए हॉट वॉलेट का उपयोग करें।", "price_impact_info_title": "कीमत का प्रभाव", @@ -6208,15 +6317,7 @@ "approval_tooltip_content": "आप निर्दिष्ट राशि, {{amount}} {{symbol}} तक एक्सेस की अनुमति दे रहे हैं। कॉन्ट्रैक्ट किसी अतिरिक्त फंड को एक्सेस नहीं करेगा।", "minimum_received": "Minimum received", "minimum_received_tooltip_title": "Minimum received", - "minimum_received_tooltip_content": "आपके ट्रांसेक्शन के प्रोसेस होने के दौरान प्राइस बदलने पर जो न्यूनतम राशि आपको प्राप्त होगी, वह आपके स्लिपेज (slippage) टॉलरेंस पर आधारित है। यह हमारे लिक्विडिटी प्रदाताओं से एक अनुमान है। अंतिम राशि भिन्न हो सकती है।", - "verified_token": "सत्यापित टोकन", - "price": "प्राइस", - "percent_change": "प्रतिशत परिवर्तन", - "volume": "वॉल्यूम", - "market_cap_fdv": "मार्केट कैप (FDV)", - "listed_on": "पर लिस्ट किया गया", - "centralized_exchanges": "केंद्रीकृत एक्सचेंज", - "contract_address": "कॉन्ट्रैक्ट का एड्रेस" + "minimum_received_tooltip_content": "आपके ट्रांसेक्शन के प्रोसेस होने के दौरान प्राइस बदलने पर जो न्यूनतम राशि आपको प्राप्त होगी, वह आपके स्लिपेज (slippage) टॉलरेंस पर आधारित है। यह हमारे लिक्विडिटी प्रदाताओं से एक अनुमान है। अंतिम राशि भिन्न हो सकती है।" }, "quote_expired_modal": { "title": "नये कोटेशन उपलब्ध हैं", @@ -6290,7 +6391,7 @@ "title": "वॉलेट रिकवरी", "login_with_social": "सोशल अकाउंट्स से लॉग इन करें", "setup": "सेट अप करें", - "secret_recovery_phrase": "सीक्रेट रिकवरी फ्रेज़ {{num}}", + "secret_recovery_phrase": "Secret Recovery Phrase {{num}}", "back_up": "बैक अप लें", "reveal": "दिखाएं", "social_recovery_title": "{{authConnection}} रिकवरी", @@ -6349,7 +6450,7 @@ "section_1_title": "मल्टीचेन एकाउंट्स क्या हैं?", "section_1_description": "एक अकाउंट, सभी नेटवर्क पर एड्रेस जिन्हें MetaMask सपोर्ट करता है। अब आप Ethereum, Solana और अन्य का उपयोग बिना एकाउंट्स को बदले कर सकते हैं।", "section_2_title": "वही एड्रेस, अधिक नेटवर्क", - "section_2_description": "हमने आपके एकाउट्स को समूहित किया है, इसलिए MetaMask का उपयोग पहले की तरह जारी रखें। आपके फंड सुरक्षित और अपरिवर्तित हैं", + "section_2_description": "We’ve grouped your accounts, so keep using MetaMask the same as before. Your funds are safe and unchanged.", "view_accounts_button": "एकाउंट्स देखें", "learn_more_button": "ज़्यादा जानें", "setting_up_accounts": "आपके एकाउंट्स को सेटअप किया जा रहा है" @@ -6511,8 +6612,10 @@ }, "card_onboarding": { "title": "खर्च करें\nऔर\nकमाएँ", - "description": "MetaMask कार्ड आपके क्रिप्टो को कैश की तरह खर्च करने और रिवॉर्ड पाने का तेज़ और आसान तरीका है।", + "description": "MetaMask कार्ड आपके क्रिप्टो को खर्च करने और 3% तक कैशबैक पाने का तेज़ और आसान तरीका है।", "apply_now_button": "अभी अप्लाई करें", + "login_button": "लॉग इन करें", + "not_now_button": "अभी नहीं", "sign_up": { "title": "आइए शुरू करें", "description": "Crypto Life द्वारा दिया गया अपना MetaMask कार्ड अकाउंट बनाएँ। यह आपके MetaMask अकाउंट से अलग होगा।", @@ -6540,6 +6643,7 @@ "phone_number_label": "फ़ोन नंबर दर्ज करें", "country_area_code_label": "देश का क्षेत्र कोड", "invalid_phone_number": "फ़ोन नंबर ग़लत है", + "invalid_us_phone_number": "आगे बढ़ने के लिए कृपया एक मान्य अमरीकी फ़ोन नंबर (10 डिजिट का) डालें।", "legal_terms": "जारी रखने पर, आप अपने फ़ोन नंबर को सत्यापित करने के लिए SMS प्राप्त करने के लिए सहमति देते हैं।" }, "confirm_phone_number": { @@ -6576,8 +6680,8 @@ "terms": "एप्रूवल में आमतौर पर लगभग 12 घंटे लगते हैं। फ़ैसला होने पर हम आपको बता देंगे।" }, "verifying_veriff_kyc": { - "title": "आपकी पहचान वेरीफाई की जा रही है", - "description": "जब तक हम आपकी पहचान वेरिफाई करते हैं, तब तक कृपया इंतज़ार करें।", + "title": "एप्रूवल का इंतज़ार है", + "description": "आपके एप्लीकेशन को एप्रूव करने के लिए हमारे पार्टनर को आपकी पहचान वेरिफ़ाई करनी होगी।", "helper_text": "इसमें आमतौर पर कुछ सेकंड लगते हैं। कृपया ऐप बंद न करें।" }, "verifying_registration": { @@ -6614,15 +6718,15 @@ }, "physical_address": { "title": "अपना एड्रेस जोड़ें", - "description": "अपना घर का पता डालें। अगर एप्रूवल मिल गया, तो हम आपका फ़िज़िकल कार्ड यहाँ भेज देंगे।", + "description": "अपने घर का मौजूदा पता डालें। हम वेरिफ़िकेशन के लिए इसका इस्तेमाल करेंगे।", "address_line_1_label": "एड्रेस लाइन 1", "address_line_2_label": "एड्रेस लाइन 2", "city_label": "शहर", "state_label": "राज्य", "zip_code_label": "ज़िप कोड", "country_label": "देश", - "electronic_consent_1": "I agree to the E-Sign Act Consent and Disclosure and to receive all communications electronically. ", - "electronic_consent_2": "View document(PDF)" + "electronic_consent_1": "मैं ई-साइन एक्ट की सहमति और प्रकटीकरण एवं सभी संचार इलेक्ट्रॉनिक रूप से प्राप्त करने के लिए सहमत हूँ। ", + "electronic_consent_2": "डॉक्यूमेंट देखें (PDF)" }, "mailing_address": { "title": "डाक पता", @@ -6668,22 +6772,24 @@ } }, "card_home": { + "title": "Card", + "available_balance": "उपलब्ध बैलेंस", "error_title": "डेटा प्राप्त नहीं किया जा सकता", "error_description": "ऐसा लगता है कि कोई समस्या आपको इस पेज की सामग्री देखने से रोक रही है। कृपया अपना कनेक्शन जांचें या पेज को रीफ्रेश करके देखें।", "try_again": "फिर से कोशिश करें", - "limited_spending_warning": "आपकी वास्तविक खर्च करने की क्षमता सीमित हो सकती है। अपनी सीमा समायोजित करने के लिए, {{manageCard}} पर जाएँ", + "limited_spending_warning": "Your actual spending ability may be limited. To adjust your limit, go to ", "add_funds": "फंड जोड़ें", "change_asset": "एसेट बदलें", "enable_card_button_label": "कार्ड चालू करें", "enable_assets_button_label": "एसेट्स चालू करें", "spending_limit_warning": "आप अपनी खर्च सीमा के करीब हैं। अस्वीकृतियों से बचने के लिए अपडेट करें।", "logout": "लॉग आउट करें", - "logout_description": "अपने MetaMask कार्ड अकाउंट से लॉग आउट करें", "logout_confirmation_title": "कार्ड से लॉग आउट करें?", "logout_confirmation_message": "क्या आप वाकई अपने MetaMask कार्ड अकाउंट से लॉग आउट करना चाहते हैं?", "logout_confirmation_cancel": "कैंसिल करें", "logout_confirmation_confirm": "लॉग आउट करें", "enable_card_error": "कार्ड चालू नहीं हो पाया। कृपया बाद में फिर से कोशिश करें।", + "view_card_details_error": "Unable to load card details. Please try again.", "warnings": { "close_spending_limit": { "title": "आप अपनी खर्च सीमा के करीब पहुँच चुके हैं", @@ -6706,6 +6812,16 @@ "blocked": { "title": "आपका कार्ड ब्लॉक कर दिया गया है", "description": "कृपया अपने कार्ड को अनब्लॉक करने के लिए सपोर्ट से संपर्क करें" + }, + "kyc_pending": { + "title": "वेरिफिकेशन प्रोग्रेस में है", + "description": "Your identity verification is being reviewed. This typically takes less than 12 hours." + } + }, + "messages": { + "card_provisioning": { + "title": "Card being created", + "description": "Your card is being created. This may take a few moments." } }, "kyc_status": { @@ -6729,33 +6845,46 @@ "ok_button": "ठीक है" }, "manage_card_options": { - "manage_spending_limit": "खर्च की सीमा प्रबंधित करें", + "view_card_details": "View card details", + "hide_card_details": "Hide card details", + "view_card_details_description": "Card number, expiration and CVV", + "manage_spending_limit": "Manage limit", "manage_spending_limit_description_restricted": "सीमित खर्च की सेटिंग चालू है", "manage_spending_limit_description_full": "फुल एक्सेस चालू है", "manage_card": "कार्ड प्रबंधित करें", - "advanced_card_management_description": "कार्ड विवरण, ट्रांसेक्शन और अधिक देखें", + "advanced_card_management_description": "See activity, cashback, freeze card, and more", "travel_title": "MetaMask ट्रैवल", - "travel_description": "एक्सपीडिया के मुकाबले 60% तक की छूट के साथ होटल बुक करें", - "card_tos_title": "कार्ड के नियम और शर्त", - "card_tos_description": "कार्ड प्रोवाइडर की शर्तें पढ़ें" + "travel_description": "Book hotels with up to 70% discounts", + "card_tos_title": "Terms and conditions" } }, "card_spending_limit": { "title_change_token": "टोकन और नेटवर्क बदलें", "title_enable_token": "टोकन चालू करें", + "title_onboarding": "स्पेंडिंग चालू करें", + "setup_title": "Set up your card", + "setup_description": "Select the token you'd like to use and set a limit for how much you can spend.", + "asset_label": "एसेट", + "limit_label": "सीमित करें", + "other_token": "Other", "full_access_title": "पूर्ण पहुँच", - "full_access_description": "आपका कार्ड आपके फंड का स्वचालित रूप से उपयोग कर सकता है, हर बार एप्रूवल मांगे बिना।", - "restricted_limit_title": "सीमित खर्च", - "restricted_limit_description": "जब भी आप सीमा बढ़ाना चाहेंगे, आपको वापस आकर नेटवर्क शुल्क का भुगतान करना होगा।", + "full_access_description": "Your card can use your funds automatically without asking for approval each time.", + "restricted_limit_title": "खर्च करने की सीमा", + "restricted_limit_description": "आप केवल इसी सीमा तक खर्च कर सकते हैं। इस सीमा को हर बार अपडेट होने पर आपको नेटवर्क शुल्क देना होगा।", "edit_limit": "सीमा संपादित करें", "confirm_new_limit": "कन्फर्म करें", "cancel": "कैंसिल करें", + "skip": "अभी के लिए स्किप करें", "set_new_limit": "एक सीमा निर्धारित करें", "dismiss": "खारिज करें", "update_success": "खर्च सीमा सफलतापूर्वक अपडेट की गई", "update_error": "खर्च सीमा अपडेट करना नहीं हो पाया", "solana_not_supported": "card.metamask.io पर Solana टोकन चालू करें", - "select_token": "टोकन चुनें" + "select_token": "टोकन चुनें", + "loading": "उपलब्ध टोकन लोड हो रहे हैं…", + "load_error": "टोकन लोड नहीं हो पाए। कृपया फिर से प्रयास करें।", + "retry": "फिर से प्रयास करें", + "on_linea": "Linea पर" }, "change_asset": { "title": "टोकन और नेटवर्क बदलें", @@ -6793,6 +6922,7 @@ "signup_button": "साइन अप करें", "errors": { "invalid_credentials": "लॉगिन जानकारी ग़लत है", + "invalid_otp_code": "गलत कोड, कृपया फिर से प्रयास करें", "unknown_error": "अज्ञात गड़बड़ी, कृपया बाद में फिर से प्रयास करें", "email_required": "ईमेल की आवश्यकता है", "password_required": "पासवर्ड की आवश्यकता है", @@ -6839,8 +6969,8 @@ }, "rewards": { "auth_fail_title": "अज्ञात गड़बड़ी।", - "auth_fail_description": "इस अकाउंट को रिवॉर्ड्स प्रोग्राम के साथ प्रमाणित करते समय एक अज्ञात गड़बड़ी हुई। कृपया बाद में फिर से प्रयास करें।", - "failed_to_authenticate": "रिवॉर्ड्स प्रोग्राम के साथ प्रमाणीकरण नहीं हो पाया", + "auth_fail_description": "इस अकाउंट को MetaMask रिवॉर्ड्स के साथ प्रमाणित करते समय एक अज्ञात गड़बड़ी हुई। बाद में फिर से प्रयास करें।", + "failed_to_authenticate": "MetaMask रिवॉर्ड्स के साथ प्रमाणीकरण नहीं हो पाया", "not_implemented": "जल्द आ रहा है", "not_implemented_season_summary": "सीज़न सारांश जल्द ही आ रहा है", "optin_error": { @@ -6867,6 +6997,10 @@ "error_fetching_description": "अपना कनेक्शन जांचें और फिर से प्रयास करें।", "retry_button": "फिर से प्रयास करें" }, + "linea_tokens": { + "default_title": "$LINEA", + "title_earned": "आपने {{amount}} $LINEA कमाए" + }, "upcoming_rewards_error": { "error_fetching_title": "रिवॉर्ड्स लोड नहीं हो सके", "error_fetching_description": "अपना कनेक्शन जांचें और फिर से प्रयास करें।", @@ -6898,6 +7032,15 @@ "claim_reward_error": { "title": "रिवॉर्ड क्लेम नहीं हो पाया" }, + "metal_card_claim": { + "title": "अपना पुरस्कार रिडीम करें", + "description": "MetaMask मेटल कार्ड पात्रता पर निर्भर करता है और सभी क्षेत्रों में उपलब्ध नहीं है। यदि आप पात्र नहीं हैं, तो इसके बजाय आपको एक विशेष प्रीमियम मर्च पुरस्कार प्राप्त होगा।", + "contact_info": "अपनी संपर्क जानकारी साझा करें और आपको 2 सप्ताह के भीतर Telegram पर @MidwitMilhouse या christian.montoya@consensys.net से जवाब मिलेगा।", + "email_label": "ईमेल", + "email_validation_error": "कृपया एक मान्य ईमेल एड्रेस दर्ज करें", + "telegram_label": "Telegram हैंडल", + "telegram_placeholder": "वैकल्पिक" + }, "accounts_opt_in_state_error": { "error_fetching_title": "एकाउंट्स को लोड नहीं किया जा सका", "error_fetching_description": "अपना कनेक्शन जांचें और फिर से प्रयास करें।", @@ -7052,12 +7195,12 @@ "dashboard_modal_info": { "active_account": { "title": "चूकें नहीं", - "description": "अपना अकाउंट जोड़ें ताकि आप अपनी गतिविधियों से पॉइंट्स कमाना शुरू कर सकें।", + "description": "Add your account to Rewards.", "confirm": "अकाउंट जोड़ें" }, "multiple_unlinked_accounts": { - "title": "पॉइंट्स कमाना शुरू करें", - "description": "अपने एकाउंट्स जोड़ें ताकि आप अपनी रिवॉर्ड्स को एक नजर में ट्रैक कर सकें।", + "title": "चूकें नहीं", + "description": "Add your accounts to Rewards.", "confirm": "एकाउंट्स जोड़ें" }, "account_not_supported": { @@ -7110,10 +7253,10 @@ } }, "predict": { - "title": "प्रेडिक्शन मार्केट", + "title": "प्रेडिक्शंस", "description": "प्रति $10 प्रेडिक्शन पर 20 पॉइंट्स", "sheet": { - "title": "प्रेडिक्शन मार्केट", + "title": "प्रेडिक्शंस", "points": "प्रति $10 पर 20 पॉइंट्स", "description": "प्रत्येक $10 के ट्रेड पर पॉइंट्स कमाएं।", "cta_label": "मार्केट ब्राउज़ करें" @@ -7191,6 +7334,19 @@ "time_left": "बचा है", "expired": "एक्सपायर हो गया" }, + "end_of_season_rewards": { + "confirm_label_default": "कन्फर्म करें", + "confirm_label_access": "पहुंच", + "redeem_success_title": "पुरस्कार रिडीम किया गया", + "metal_card_claim_success": "कॉन्टेक्ट जानकारी कन्फर्म हो गई", + "linea_tokens_claim_success": "एड्रेस कन्फर्म हो गया", + "arriving_soon": "जल्द ही आ रहा है", + "check_back_soon": "क्लेम करने के लिए थोड़ी देर बाद फिर से देखें", + "redeem_failure_title": "रिडीम नहीं हो पाया", + "redeem_failure_description": "कृपया बाद में फिर से प्रयास करें।", + "reward_details": "पुरस्कार विवरण", + "select_account_description": "उस अकाउंट का चयन करें जिसमें आप यह पुरस्कार प्राप्त करना चाहते हैं। टोकन दो सप्ताह के भीतर वितरित किए जाएंगे।" + }, "animation": { "could_not_load": "लोड नहीं हो सका" } @@ -7257,13 +7413,13 @@ "still_connecting_network": "अब भी {{networkName}} से कनेक्ट किया जा रहा है...", "unable_to_connect_network": "{{networkName}} से कनेक्ट करने में असमर्थ।", "update_rpc": "RPC अपडेट करें", + "switch_to_metamask_default_rpc": "Switch to MetaMask default RPC", "check_network_connectivity": "अपनी नेटवर्क कनेक्टिविटी जाँचें।", - "check_network_connectivity_or": "अपनी नेटवर्क कनेक्टिविटी जाँचें या" + "check_network_connectivity_or": "अपनी नेटवर्क कनेक्टिविटी जाँचें या", + "updated_to_metamask_default": "Updated to MetaMask default" }, "trending": { "title": "Explore", - "view_all": "View all", - "tokens": "टोकन", "trending_tokens": "Trending tokens", "price_change": "Price change", "all_networks": "सभी नेटवर्क", @@ -7295,6 +7451,10 @@ "title": "Trending tokens is not available", "description": "We can't fetch this page right now", "try_again": "फिर से प्रयास करें" + }, + "empty_search_result_state": { + "title": "कोई टोकन नहीं मिला", + "description": "We were not able to find this token" } }, "ota_update_modal": { diff --git a/locales/languages/id.json b/locales/languages/id.json index 636a3da2fbc4..c4dca16a03bc 100644 --- a/locales/languages/id.json +++ b/locales/languages/id.json @@ -8,7 +8,7 @@ "increment": "Counter Redux Penambahan" }, "pet_name": { - "list_count_text": "Pet names on this network", + "list_count_text": "Nama Peliharaan di jaringan ini", "add_pet_name_button": "Add pet name", "address": "Alamat", "address_placeholder": "0x...", @@ -193,11 +193,10 @@ "connector": "pada" }, "autocomplete": { - "placeholder": "Cari berdasarkan token, situs, atau alamat", + "placeholder": "Cari berdasarkan situs atau alamat", "recents": "Terbaru", "favorites": "Favorit", - "sites": "Situs", - "tokens": "Token" + "sites": "Situs" }, "navigation": { "back": "Kembali", @@ -306,7 +305,7 @@ "get_started": "Mulai" }, "onboarding_wizard": { - "skip_tutorial": "Skip tutorial", + "skip_tutorial": "Lewati tutorial", "coachmark": { "action_back": "Tidak, terima kasih", "action_next": "Ikuti tur", @@ -330,12 +329,12 @@ "content3": "sekarang saatnya mengedit nama akun." }, "step4": { - "title": "Main menu", - "content1": "Anda dapat mengakses riwayat Transaksi, Pengaturan, dan Dukungan dari menu ini.", + "title": "Menu utama", + "content1": "Anda dapat mengakses riwayat transaksi, pengaturan, dan dukungan dari menu ini.", "content2": "Anda dapat melakukan berbagai tindakan dengan akun Anda & mengakses pengaturan MetaMask." }, "step5": { - "title": "Jelajahi Browser", + "title": "Jelajahi browser", "content1": "Anda dapat menjelajahi web3 menggunakan browser" }, "step6": { @@ -596,9 +595,9 @@ "transaction_activity": "Aktivitas", "request_feature": "Minta Fitur", "submit_feedback_message": "Pilih jenis umpan balik yang akan dikirim.", - "submit_bug": "Bug report", + "submit_bug": "Laporan bug", "submit_general_feedback": "Umum", - "share_address": "Share my public address", + "share_address": "Bagikan alamat publik saya", "view_in_etherscan": "Lihat di Etherscan", "view_in": "Lihat di", "browser": "Browser", @@ -612,12 +611,13 @@ "lock_cancel": "TIDAK", "feedback": "Umpan balik", "metamask_support": "Dukungan MetaMask", - "public_address": "Public address" + "public_address": "Alamat publik" }, "send": { "available": "tersedia", "invalid_value": "Nilai tidak valid", "insufficient_funds": "Dana tidak cukup", + "insufficient_balance_to_cover_fee": "Insufficient balance to cover fees", "continue": "Lanjutkan", "unit": "unit", "units": "unit", @@ -643,8 +643,8 @@ "no_tokens_available": "Token tidak tersedia", "sign": "Tanda tangan", "network_not_found_title": "Jaringan tidak ditemukan", - "network_not_found_description": "Jaringan dengan id chain {{chain_id}} tidak ditemukan di dompet Anda. Tambahkan jaringan terlebih dulu.", - "network_missing_id": "ID rantai tidak ada.", + "network_not_found_description": "Network with chain ID {{chain_id}} not found in your wallet. Please add the network first.", + "network_missing_id": "Missing chain ID.", "search_tokens": "Cari token", "search_tokens_and_nfts": "Cari token dan NFT", "tokens": "Token", @@ -675,13 +675,13 @@ "limitError": "Gagal memeriksa batas deposit Anda. Coba lagi nanti." }, "token_modal": { - "select_a_token": "Pilih Token", + "select_a_token": "Pilih token", "select_token": "Pilih token", "search_by_name_or_address": "Cari token berdasarkan nama atau alamat", "no_tokens_found": "Tidak ada token yang cocok dengan \"{{searchString}}\"", "unsupported_token_title": "Tidak tersedia", - "unsupported_token_description": "This token may not be available in your region or supported by any local payment providers", - "error_loading_tokens": "Unable to load tokens. Please try again later." + "unsupported_token_description": "Token ini mungkin tidak tersedia di wilayah Anda atau tidak didukung oleh penyedia pembayaran lokal mana pun", + "error_loading_tokens": "Tidak dapat memuat token. Coba lagi nanti." }, "networks_filter_bar": { "all_networks": "Semua jaringan" @@ -696,12 +696,12 @@ "title": "Pengaturan", "view_order_history": "Lihat riwayat order", "contact_support": "Hubungi dukungan", - "log_out": "Log out of Transak", + "log_out": "Keluar dari Transak", "logged_out_success": "Berhasil keluar", "error_sdk_not_initialized": "SDK tidak diinisialisasi", "logged_out_error": "Kesalahan saat keluar", - "more_ways_to_buy": "More ways to buy", - "more_ways_to_buy_description": "Switch to the classic version" + "more_ways_to_buy": "Cara lain untuk membeli", + "more_ways_to_buy_description": "Beralih ke versi klasik" }, "region_modal": { "select_a_region": "Pilih wilayah", @@ -714,7 +714,7 @@ "no_state_results": "Tidak ada state yang cocok dengan \"{{searchString}}\"" }, "payment_modal": { - "select_a_payment_method": "Select a payment method" + "select_a_payment_method": "Pilih metode pembayaran" }, "payment_duration": { "instant": "Instan", @@ -805,7 +805,7 @@ "button": "Setuju dan lanjutkan" }, "additional_verification": { - "title": "Additional verification", + "title": "Verifikasi tambahan", "paragraph_1": "Untuk deposit yang lebih besar, Anda memerlukan identitas yang valid (seperti SIM) dan swafoto waktu nyata.", "paragraph_2": "Untuk menyelesaikan verifikasi, Anda perlu mengaktifkan akses ke kamera.", "button": "Lanjutkan" @@ -832,7 +832,7 @@ "dob_invalid": "Masukkan tanggal lahir yang valid", "ssn_required": "Nomor jaminan sosial diperlukan", "unexpected_error": "Terjadi kesalahan tidak terduga. Coba lagi.", - "phone_already_registered": "This phone number is already in use by {{email}}. Log in using this email to continue.", + "phone_already_registered": "Nomor telepon ini sudah digunakan oleh {{email}}. Masuk menggunakan email ini untuk melanjutkan.", "login_with_email": "Masuk dengan email" }, "enter_address": { @@ -844,7 +844,7 @@ "address_line_2": "Baris alamat 2 (opsional)", "state": "Negara Bagian/Wilayah", "city": "Kota", - "postal_code": "Postal/zip code", + "postal_code": "Kode pos", "country": "Negara", "select_state": "Pilih state", "address_line_1_required": "Baris alamat 1 diperlukan", @@ -854,7 +854,7 @@ "city_invalid": "Masukkan kota yang valid", "state_required": "Negara Bagian/Wilayah diperlukan", "state_invalid": "Masukkan negara bagian yang valid", - "postal_code_required": "Postal/zip code is required", + "postal_code_required": "Kode pos wajib diisi", "postal_code_invalid": "Masukkan kode pos yang valid", "unexpected_error": "Kesalahan tak terduga." }, @@ -903,7 +903,7 @@ "cancel_order_button": "Batalkan order" }, "order_details": { - "title": "Deposit order", + "title": "Order deposit", "error_title": "Terjadi kesalahan pada order deposit", "error_message": "Terjadi kesalahan tidak terduga." }, @@ -946,7 +946,7 @@ }, "error_view": { "title": "Terjadi kesalahan", - "description": "Terjadi kesalahan saat memproses deposit. Hubungi dukungan jika masalah berlanjut.", + "description": "Terjadi kesalahan saat memproses deposit Anda. Hubungi dukungan jika masalah berlanjut.", "try_again": "Coba lagi" }, "errors": { @@ -955,30 +955,34 @@ "fetch_payment_methods": "Terjadi masalah saat mengambil metode pembayaran.", "fetch_user_details": "Terjadi masalah saat mengambil detail pengguna.", "try_again": "Coba lagi", - "error_details_title": "Error details", + "error_details_title": "Detail kesalahan", "see_more": "Lihat selengkapnya" } }, "perps": { - "basic_functionality_disabled_title": "Perps is not available", + "basic_functionality_disabled_title": "Perp tidak tersedia", "title": "Perps", - "perps_trading": "Perdagangan Abadi", + "perps_trading": "Perdagangan Perp", "perp_account_balance": "Saldo akun perp", - "manage_balance": "Kelola Saldo", - "total_balance": "Total Saldo", + "manage_balance": "Kelola saldo", + "total_balance": "Total saldo", "available_balance": "Saldo tersedia", - "margin_used": "Margin yang Digunakan", + "margin_used": "Margin yang digunakan", "gtm_content": { "title": "PERP TELAH HADIR", "title_description": "Posisi long atau short dengan leverage hingga 40x. Danai akun Anda dalam satu klik.", "not_now": "Tidak sekarang", "try_now": "Mulai" }, + "discovery_banner": { + "title": "Perdagangkan {{symbol}} perp", + "subtitle": "Gandakan P&L Anda hingga {{leverage}}" + }, "today": "Hari ini", "yesterday": "Kemarin", - "unrealized_pnl": "PnL Belum Terealisasi", + "unrealized_pnl": "P&L Belum Terealisasi", "withdraw": "Tarik", - "refresh_balance": "Segarkan Saldo", + "refresh_balance": "Segarkan saldo", "add_funds": "Tambahkan dana", "trade_perps": "Perdagangkan perp", "trade_perps_description": "Gunakan perp untuk berdagang berdasarkan harga aset di masa mendatang. Tambahkan dana ke akun perp Anda untuk memulai", @@ -1047,7 +1051,7 @@ "preparing": "Mempersiapkan deposit...", "swapping": "Menukar {{token}} ke USDC", "bridging": "Bridge ke Hyperliquid", - "depositing": "Mendeposit ke akun perp", + "depositing": "Mendeposit ke akun Pelaku", "depositing_direct": "Mentransfer USDC langsung ke akun HyperLiquid Anda..." }, "step_descriptions": { @@ -1138,7 +1142,7 @@ "trigger_price": "Harga pemicu", "liquidation_price": "Harga likuidasi", "fees": "Biaya", - "estimated_points": "Estimasi Poin", + "estimated_points": "Estimasi poin", "market": "Pasar", "limit": "Limit", "open_orders": "Order", @@ -1199,7 +1203,7 @@ "short": "Pendek {{asset}}" }, "tpsl_modal": { - "title": "Take profit & Stop loss", + "title": "Take profit & stop loss", "save": "Simpan", "current_price": "Harga saat ini: {{price}}", "on": "AKTIF", @@ -1306,8 +1310,8 @@ "cancel": "Batalkan", "margin": "Margin", "includes_pnl": "termasuk P&L", - "pnl": "PnL", - "estimated_pnl": "Estimasi PnL", + "pnl": "P&L", + "estimated_pnl": "Estimasi P&L", "fees": "Biaya", "receive": "Anda akan menerima", "you_receive": "Anda akan menerima", @@ -1414,6 +1418,7 @@ "failedToEstablishAllMids": "Gagal membuat langganan allMids global", "failedToEstablishMarketData": "Gagal membuat langganan data pasar untuk {{symbol}}", "failed_to_toggle_network": "Gagal mengganti jaringan", + "failed_to_switch_provider": "Gagal beralih penyedia", "noAccountSelected": "Tidak ada akun yang dipilih", "unsupportedMethod": "Metode tidak didukung: {{method}}", "invalidAddressFormat": "Format alamat tidak valid: {{address}}", @@ -1452,6 +1457,24 @@ "orderLeverageReductionFailed": "Anda tidak dapat mengurangi leverage", "insufficientLiquidity": "Likuiditas tidak cukup untuk mengeksekusi order. Coba gunakan order limit atau coba lagi nanti.", "connectionTimeout": "Koneksi terputus. Periksa jaringan Anda dan coba lagi.", + "clientReinitializing": "Layanan sedang diinisialisasi ulang. Mohon tunggu sebentar dan coba lagi.", + "transferFailed": "Tidak dapat mentransfer dana. Coba lagi.", + "swapFailed": "Tidak dapat menukar token. Coba lagi.", + "spotPairNotFound": "Pasangan perdagangan tidak tersedia untuk saat ini.", + "priceUnavailable": "Data harga tidak tersedia. Segarkan dan coba lagi.", + "batchCancelFailed": "Beberapa order tidak dapat dibatalkan. Coba lagi.", + "batchCloseFailed": "Beberapa posisi tidak dapat ditutup. Coba lagi.", + "insufficientMargin": "Margin tidak cukup untuk mengeksekusi transaksi ini. Pertimbangkan untuk menambah dana atau mengurangi ukuran posisi Anda.", + "reduceOnlyViolation": "Order ini akan meningkatkan posisi Anda. Hanya order pengurangan saja yang diperbolehkan.", + "positionWouldFlip": "Order ini akan membalik arah posisi Anda. Tutup posisi yang ada terlebih dahulu.", + "marginAdjustmentFailed": "Tidak dapat menyesuaikan margin. Coba lagi.", + "tpslUpdateFailed": "Tidak dapat memperbarui take profit/stop loss. Coba lagi.", + "orderRejected": "Order ditolak. Periksa parameter Anda dan coba lagi.", + "slippageExceeded": "Harga bergerak terlalu jauh. Coba gunakan order limit atau tingkatkan toleransi selip.", + "rateLimitExceeded": "Terlalu banyak permintaan. Mohon tunggu sebentar dan coba lagi.", + "serviceUnavailable": "Layanan tidak tersedia untuk sementara waktu. Coba lagi nanti.", + "networkErrorSimple": "Terjadi kesalahan jaringan. Periksa koneksi Anda dan coba lagi.", + "insufficientBalance": "Saldo tidak cukup untuk menyelesaikan operasi ini. Periksa dana yang tersedia.", "connectionFailed": { "title": "Tidak dapat terhubung ke perp", "description": "Kami sedang berupaya agar dapat segera kembali online.", @@ -1489,7 +1512,7 @@ "details_title": "Detail", "entry_price": "Harga masuk", "funding_cost": "Pendanaan", - "liquidation_price": "Harga Likuidasi", + "liquidation_price": "Harga likuidasi", "take_profit": "Take profit", "stop_loss": "Stop loss", "margin": "Margin", @@ -1521,7 +1544,7 @@ "total_balance": "Total saldo", "available_balance": "Saldo tersedia", "margin_used": "Margin yang digunakan", - "total_unrealized_pnl": "Total Laba Rugi yang Belum Terealisasi", + "total_unrealized_pnl": "Total P&L yang belum terealisasi", "unrealized_pnl": "P&L Belum Terealisasi" }, "tpsl": { @@ -1654,7 +1677,7 @@ }, "tp_sl": { "title": "Take profit & stop loss", - "content": "Take Profit (TP) menutup posisi Anda secara otomatis saat mencapai target profit. Stop Loss (SL) membatasi loss dengan menutup posisi jika harga bergerak melawan Anda." + "content": "Take profit (TP) menutup posisi Anda secara otomatis saat mencapai target profit. Stop loss (SL) membatasi loss dengan menutup posisi jika harga bergerak melawan Anda." }, "close_position_you_receive": { "title": "Jumlah yang diterima", @@ -1684,7 +1707,7 @@ "after_hours_trading": { "title": "Perdagangan setelah jam kerja", "reopens_in": "Buka kembali dalam {{time}}", - "content": "Anda berdagang di luar jam pasar reguler (09:30-16:00 ET). Saat pasar tutup, terdapat risiko sebaran yang lebih besar, pergerakan harga, dan suku bunga pendanaan yang lebih tinggi." + "content": "Anda berdagang di luar jam pasar reguler (09:30-16:00 ET). Saat pasar tutup, terdapat risiko spread yang lebih besar, pergerakan harga, dan suku bunga pendanaan yang lebih tinggi." }, "spread": { "title": "Spread", @@ -1697,7 +1720,14 @@ "retry_connection": "Coba hubungkan kembali", "retrying_connection": "Menghubungkan...", "connecting_to_perps": "Menghubungkan ke Perps", - "timeout_title": "Koneksi membutuhkan waktu lebih lama dari yang diharapkan" + "timeout_title": "Koneksi membutuhkan waktu lebih lama dari yang diharapkan", + "websocket_disconnected": "Koneksi Anda sedang offline.", + "websocket_disconnected_message": "Data mungkin belum diperbarui.", + "websocket_connecting": "Menghubungkan ke perp...", + "websocket_connecting_message": "Memulihkan koneksi... Percobaan {{attempt}}", + "websocket_connected": "Terhubung", + "websocket_connected_message": "Pembaruan data langsung dilanjutkan", + "websocket_retry": "Coba lagi" }, "chart": { "no_data": "Data grafik tidak tersedia", @@ -1746,7 +1776,7 @@ "markets": "Pasar" }, "learn_more": { - "title": "Pelajari lebih lanjut seputar Perp", + "title": "Pelajari tentang Perp", "description": "Temukan cara kerja perdagangan abadi dan cara memulainya", "cta": "Pelajari selengkapnya" }, @@ -1754,6 +1784,9 @@ "title": "Hubungi dukungan", "description": "Hubungi Dukungan MetaMask untuk bantuan" }, + "feedback": { + "title": "Berikan masukan kepada kami" + }, "close_all_modal": { "title": "Tutup semua posisi", "description": "Kami akan menutup semua posisi terbuka pada harga pasar saat ini.", @@ -1795,8 +1828,8 @@ "funding_rate_short": "Pendanaan", "open_interest": "Kontrak terbuka", "open_interest_short": "OI", - "high_to_low": "Tinggi ke Rendah", - "low_to_high": "Rendah ke Tinggi", + "high_to_low": "Tinggi ke rendah", + "low_to_high": "Rendah ke tinggi", "high": "Tinggi", "low": "Rendah", "sort_by": "Urutkan sesuai", @@ -1806,7 +1839,11 @@ "price_change_low_to_high": "Perubahan harga: rendah ke tinggi", "past_hour": "Jam terakhir", "past_24_hours": "24 jam terakhir", - "time": "Waktu" + "time": "Waktu", + "apply": "Terapkan" + }, + "market_type": { + "filter_by": "Filter berdasarkan" }, "perps_markets": "Pasar perp", "volume": "Volume", @@ -1823,6 +1860,7 @@ "mainnet": "Mainnet", "developer_options": { "hyperliquid_network_toggle": "Alih Jaringan Hyperliquid", + "provider_mode_toggle": "Mode Penyedia", "simulate_connection_error": "Simulasikan kesalahan koneksi" }, "transactions": { @@ -1857,7 +1895,7 @@ "liquidated": "Dilikuidasi", "take_profit": "Take profit", "stop_loss": "Stop loss", - "auto_deleveraging": "Deleverage Otomatis" + "auto_deleveraging": "Deleverage otomatis" }, "funding": { "date": "Tanggal", @@ -1925,7 +1963,7 @@ } }, "points": "Poin", - "estimated_points": "Estimasi Poin", + "estimated_points": "Estimasi poin", "points_error": "Kami tidak dapat memuat poin saat ini", "points_error_content": "Jangan khawatir, Anda tetap mendapatkan poin. Poin akan segera muncul di akun Anda atau periksa tab Reward nanti.", "tp_on_chart": "TP pada Bagan", @@ -1942,7 +1980,7 @@ } }, "predict": { - "title": "MetaMask Predict", + "title": "MetaMask Predictions", "prediction_markets": "Pasar prediksi", "market_list": "Daftar pasar", "loading": "Memuat...", @@ -1981,7 +2019,8 @@ "fee_exemption": "Kami tidak mengenakan biaya apa pun di pasar ini.", "ended": "Berakhir", "resolved_early": "Diselesaikan lebih awal", - "disclaimer": "Informasi ini mungkin tidak lengkap. Semua aturan pasar, kriteria penyelesaian, dan hasil akhir diatur sepenuhnya oleh Polymarket. Transaksi harus dilakukan berdasarkan aturan lengkap yang tersedia di Polymarket." + "disclaimer": "Informasi ini mungkin tidak lengkap. Semua aturan pasar, kriteria penyelesaian, dan hasil akhir diatur sepenuhnya oleh Polymarket. Transaksi harus dilakukan berdasarkan aturan lengkap yang tersedia di Polymarket.", + "your_picks": "Pilihan Anda" }, "tab": { "no_predictions_description": "Prediksi Anda akan muncul di sini, menunjukkan stake dan pergerakan pasar.", @@ -2001,6 +2040,8 @@ "cashout_info": "{{amount}} pada {{outcome}} dengan harga {{initialPrice}}", "cashout_info_multiple": "{{amount}} pada {{outcomeGroupTitle}} • {{outcome}} di harga {{initialPrice}}", "position_info": "{{initialValue}} pada {{outcome}} untuk memenangkan {{shares}}", + "position_pick_info": "{{initialValue}} pada {{outcome}}", + "position_pick_info_to_win": "{{initialValue}} pada {{outcome}} untuk memenangkan", "buy_yes": "Ya", "buy_no": "Tidak", "outcomes": "hasil", @@ -2035,6 +2076,7 @@ "won_markets_text": "Memenangkan {{count}} pasar{{s}}", "available_balance": "Saldo tersedia", "claim_amount_text": "Klaim ${{amount}}", + "claim_winnings_text": "Klaim kemenangan", "unrealized_pnl_label": "P&L Belum Terealisasi", "unrealized_pnl_value": "{{amount}} ({{percent}})", "unrealized_pnl_error": "Tidak dapat memuat", @@ -2093,7 +2135,7 @@ "price_per_share": "Harga per saham", "price_impact": "Dampak harga", "net_pnl": "P&L Bersih", - "total_net_pnl": "Total P&L Bersih", + "total_net_pnl": "Total P&L bersih", "market_net_pnl": "P&L Bersih Pasar", "activity_details": "Detail aktivitas", "today": "Hari ini", @@ -2173,6 +2215,15 @@ "order_not_fully_filled": "Gagal memenuhi order Anda", "buy_order_not_fully_filled": "Saham yang tersedia pada harga pasar tidak cukup untuk membuat order sekarang.", "sell_order_not_fully_filled": "Permintaan pada harga pasar tidak cukup untuk mencairkannya saat ini." + }, + "game_details_footer": { + "pick_a_winner": "Pilih pemenang", + "volume_display": "${{volume}} Vol", + "read_terms": "Baca syarat dan ketentuan kontrak secara lengkap" + }, + "sports": { + "halftime": "Babak pertama", + "final": "Final" } }, "receive": { @@ -2290,7 +2341,7 @@ "add_funds": "Tambahkan dana", "next": "Berikutnya", "buy_asset": "Beli {{asset}}", - "no_tokens": "Anda tidak memiliki token!", + "no_tokens": "Anda tidak memiliki token", "show_tokens_without_balance": "Tampilkan token tanpa saldo", "nfts_autodetection_title": "Deteksi NFT", "nfts_autodetection_desc": "Izinkan MetaMask mendeteksi dan menampilkan NFT di dompet Anda secara otomatis.", @@ -2303,7 +2354,7 @@ "target_scam_network": "menjadikannya sebagai target penipuan. Penipu dapat mengelabui Anda agar mengirimkan mata uang yang lebih berharga sebagai gantinya. Pastikan untuk memverifikasi semuanya sebelum melanjutkan.", "use_the_currency_symbol": "menggunakan simbol mata uang", "use_correct_symbol": "Pastikan Anda menggunakan simbol yang benar sebelum melanjutkan", - "chain_id_currently_used": "ID chain ini saat ini digunakan oleh", + "chain_id_currently_used": "This chain ID is currently used by the", "incorrect_network_name_warning": "Berdasarkan catatan kami, nama jaringan mungkin tidak cocok dengan ID chain ini.", "suggested_name": "Nama yang disarankan:", "network_check_validation_desc": "mengurangi peluang Anda untuk terhubung ke jaringan berbahaya atau salah.", @@ -2314,7 +2365,7 @@ "nft_empty_description": "Ada banyak sekali NFT di luar sana. Mulai koleksi Anda hari ini.", "tokens_empty_description": "Nothing to see yet. Why not browse tokens or make a trade?", "discover_nfts": "Impor NFT", - "no_transactions": "Belum ada transaksi!", + "no_transactions": "Belum ada transaksi", "switch_network_to_view_transactions": "Alihkan jaringan untuk melihat transaksi", "send_button": "Kirim", "deposit_button": "Deposit", @@ -2362,6 +2413,7 @@ "network_fee": "Biaya jaringan", "lists": "Token lists", "hide_cta": "Sembunyikan token", + "perps_trading": "Perdagangan Perp", "options": { "title": "Token options", "view_on_portfolio": "Lihat di Portfolio", @@ -2409,8 +2461,8 @@ "add_token": "IMPOR" }, "collectibles": { - "cancel_add_collectible": "BATAL", - "add_collectible": "IMPOR" + "cancel_add_collectible": "Batalkan", + "add_collectible": "Impor" }, "banners": { "search_desc": "Deteksi token yang ditingkatkan saat ini tersedia di jaringan {{network}}. ", @@ -2521,18 +2573,20 @@ "billion_abbreviation": "M", "trillion_abbreviation": "T", "million_abbreviation": "Jt", + "thousand_abbreviation": "K", "token_details": "Detail token", "contract_address": "Alamat kontrak", "token_list": "Daftar token", "market_details": "Detail pasar", "market_cap": "Market cap", "total_volume": "Total volume (24h)", - "volume_to_marketcap": "Volume / market cap", + "volume_to_marketcap": "Volume / Market cap", "circulating_supply": "Suplai yang beredar", "all_time_high": "Tertinggi sepanjang waktu", "all_time_low": "Terendah sepanjang waktu", "fully_diluted": "Dicairkan sepenuhnya", - "unknown": "Tidak dikenal" + "unknown": "Tidak dikenal", + "stock": "Stock" }, "collectible": { "collectible_address": "Alamat", @@ -2583,7 +2637,7 @@ "remove_snap_account": "Hapus akun snap", "remove_snap_account_alert_description": "Akun ini akan dihapus dari dompet Anda. Pastikan Anda memiliki Frasa Pemulihan Rahasia atau kunci pribadi asli untuk akun yang diimpor ini sebelum melanjutkan. Anda dapat mengimpor atau membuat akun lagi dari menu tarik-turun akun.", "remove_account_alert_remove_btn": "Hapus", - "remove_account_alert_cancel_btn": "Abaikan", + "remove_account_alert_cancel_btn": "Never mind", "accounts_title": "Akun", "connect_account_title": "Hubungkan akun", "connect_accounts_title": "Hubungkan akun", @@ -2620,7 +2674,7 @@ "advisory_by": "Penasihat disediakan oleh Ethereum Phishing Detector dan PhishFort", "potential_threat": "Potensi ancaman meliputi", "fake_metamask": "Versi palsu MetaMask", - "srp_theft": "Pencurian frasa pemulihan rahasia atau kata sandi", + "srp_theft": "Secret Recovery Phrase or password theft", "malicious_transactions": "Transaksi berbahaya yang mengakibatkan aset dicuri", "secret_recovery_phrase": "Frasa Pemulihan Rahasia", "account_name": "Nama akun", @@ -2675,8 +2729,8 @@ }, "connect_qr_hardware": { "title": "Hubungkan dompet perangkat keras berbasis QR", - "description1": "Hubungkan dompet perangkat keras bercelah udara yang berkomunikasi melalui kode QR.", - "description2": "Cara kerjanya?", + "description1": "Connect an airgapped hardware wallet that communicates through QR codes.", + "description2": "Cara kerjanya", "description3": "Dompet perangkat keras bercelah udara yang didukung secara resmi meliputi:", "keystone": "Keystone", "ngravezero": "Ngrave Nol", @@ -2690,7 +2744,7 @@ "hint_text": "Pindai dompet perangkat keras ke ", "purpose_connect": "hubungkan", "purpose_sign": "konfirmasikan transaksi", - "select_accounts": "Pilih Akun" + "select_accounts": "Pilih akun" }, "data_collection_modal": { "accept": "Oke", @@ -2716,15 +2770,15 @@ "notifications_dismiss_modal": "Lewatkan", "select_rpc_url": "Pilih URL RPC", "title": "Pengaturan", - "current_conversion": "Mata Uang Dasar", - "current_language": "Current language", - "ipfs_gateway": "Gateway IPFS", + "current_conversion": "Mata uang dasar", + "current_language": "Bahasa saat ini", + "ipfs_gateway": "gateway IPFS", "ipfs_gateway_content": "MetaMask menggunakan layanan pihak ketiga untuk menampilkan gambar NFT Anda yang disimpan di IPFS, menampilkan informasi terkait alamat ENS yang dimasukkan di bilah alamat browser Anda, serta mengambil ikon untuk token yang berbeda. Alamat IP Anda mungkin tidak memberikan perlindungan terhadap layanan ini saat Anda menggunakannya.", "ipfs_gateway_down": "Gateway IPFS Anda saat ini mati", "ipfs_gateway_desc": "Pilih gateway IPFS pilihan Anda.", - "search_engine": "Search engine", - "new_RPC_URL": "Jaringan RPC Baru", - "state_logs": "State logs", + "search_engine": "Mesin pencari", + "new_RPC_URL": "Jaringan RPC baru", + "state_logs": "Log state", "add_network_title": "Tambahkan jaringan", "auto_lock": "Kunci otomatis", "auto_lock_desc": "Pilih jumlah waktu sebelum aplikasi terkunci secara otomatis.", @@ -2733,15 +2787,15 @@ "autolock_never": "Tidak pernah", "autolock_after": "Setelah {{time}} detik", "autolock_after_minutes": "Setelah {{time}} menit", - "reveal_seed_words": "Reveal seed words", - "reset_account": "Reset account", - "state_logs_button": "Download state logs", + "reveal_seed_words": "Ungkap Frasa Seed", + "reset_account": "Reset akun", + "state_logs_button": "Unduh log state", "reveal_seed_words_button": "UNGKAP FRASA SEED", - "reset_account_button": "Reset account", + "reset_account_button": "Reset akun", "reset_account_confirm_button": "Ya, reset", "reset_account_cancel_button": "Batal", - "reset_account_modal_title": "Reset account?", - "clear_approvals_modal_title": "Clear approval data?", + "reset_account_modal_title": "Reset akun?", + "clear_approvals_modal_title": "Hapus data persetujuan?", "clear_approvals_modal_message": "Semua aplikasi perlu meminta akses untuk melihat informasi akun lagi.", "clear_browser_history_modal_title": "Hapus riwayat browser?", "clear_browser_history_modal_message": "Kami akan menghapus semua riwayat browser Anda. Lanjutkan?", @@ -2763,7 +2817,7 @@ "protect_title": "Pemulihan dompet", "banner_social_login_enabled": "Masuk dengan {{authConnection}}", "manage_recovery_method": "Kelola metode pemulihan", - "video_failed": "Video failed to load.", + "video_failed": "Gagal memuat video.", "protect_desc": "Cadangkan Frasa Pemulihan Rahasia agar tidak kehilangan akses ke dompet. Pastikan untuk menyimpannya di tempat aman yang hanya dapat diakses oleh Anda dan tidak akan terlupakan", "protect_desc_no_backup": "Ini merupakan frasa 12 kata dompet Anda. Frasa ini dapat digunakan untuk mengontrol semua akun saat ini dan di masa mendatang, termasuk kemampuan untuk mengirim dana di dompet Anda. Simpan frasa ini dengan aman, JANGAN bagikan kepada siapa pun. MetaMask tidak dapat membantu Anda memulihkan kunci ini.", "learn_more": "Pelajari selengkapnya.", @@ -2782,9 +2836,9 @@ "show_fiat_on_testnets_desc": "Pilih ini untuk menampilkan konversi fiat di jaringan uji.", "show_fiat_on_testnets_modal_title": "Berhati-hatilah", "show_fiat_on_testnets_modal_description": "Jika diminta untuk mengaktifkan fitur ini, Anda mungkin ditipu. Token ini tidak memiliki nilai uang dan hanya untuk tujuan pengujian. Fitur ini membantu pengembang memastikan aplikasinya berfungsi.", - "show_fiat_on_testnets_modal_learn_more": "Selengkapnya.", + "show_fiat_on_testnets_modal_learn_more": "Pelajari selengkapnya", "show_fiat_on_testnets_modal_button": "Lanjutkan", - "show_hex_data": "Show hex data", + "show_hex_data": "Tampilkan data hex", "show_hex_data_desc": "Pilih ini untuk menampilkan bidang data hex pada layar kirim.", "accounts_identicon_title": "Ikon akun", "accounts_identicon_desc": "Pilih dari tiga gaya ikon unik berbeda yang dapat membantu Anda mengidentifikasi akun secara sekilas.", @@ -2793,7 +2847,7 @@ "general_title": "Umum", "general_desc": "Konversi mata uang, mata uang utama, bahasa, dan mesin pencari.", "advanced_title": "Lanjutan", - "advanced_desc": "Akses fitur pengembang, reset akun, reset testnet, log status, gateway IPFS, dan RPC khusus.", + "advanced_desc": "Akses fitur pengembang, reset akun, atur testnet, log state, gateway IPFS, dan RPC khusus.", "notifications_title": "Notifikasi", "notifications_desc": "Kelola notifikasi", "allow_notifications": "Izinkan notifikasi", @@ -2804,9 +2858,9 @@ "customize_session_desc": "Aktifkan jenis notifikasi yang ingin diterima:", "account_session_title": "Aktivitas akun", "account_session_desc": "Pilih akun yang ingin mendapatkan notifikasi:", - "assets_sent_title": "Assets sent", + "assets_sent_title": "Aset terkirim", "assets_sent_desc": "Dana dan NFT", - "assets_received_title": "Assets received", + "assets_received_title": "Aset diterima", "assets_received_desc": "Dana dan NFT", "defi_title": "DeFi", "defi_desc": "Stake, swap, dan bridge", @@ -2822,32 +2876,32 @@ "permissions_desc": "Kelola izin yang diberikan ke situs dan aplikasi.", "no_permissions": "Tidak ada izin", "no_permissions_desc": "Jika Anda menghubungkan akun ke situs atau aplikasi, Anda akan melihatnya di sini.", - "security_title": "Keamanan dan Privasi", + "security_title": "Keamanan dan privasi", "back": "Kembali", "security_desc": "Pengaturan privasi, MetaMetrics, kunci pribadi, dan Frasa Pemulihan Rahasia.", "networks_title": "Jaringan", - "networks_default_title": "Default network", + "networks_default_title": "Jaringan default", "network_delete": "Jika menghapus jaringan ini, Anda harus menambahkannya lagi untuk melihat aset di jaringan ini", "networks_default_cta": "Gunakan jaringan ini", "add_rpc_url": "Tambahkan URL RPC", - "add_block_explorer_url": "Tambahkan URL Block Explorer", + "add_block_explorer_url": "Tambahkan URL block explorer", "networks_desc": "Tambahkan dan edit jaringan RPC khusus", - "network_name_label": "Network name", - "network_name_placeholder": "Network name (optional)", + "network_name_label": "Nama jaringan", + "network_name_placeholder": "Nama jaringan (opsional)", "network_rpc_url_label": "URL RPC", "network_rpc_name_label": "Nama RPC", - "network_rpc_placeholder": "Jaringan RPC Baru", + "network_rpc_placeholder": "Jaringan RPC baru", "network_failover_rpc_url_label": "Pengalihan URL RPC", "failover": "Pengalihan", "network_chain_id_label": "ID Chain", "network_chain_id_placeholder": "ID Chain", "network_symbol_label": "Simbol", - "network_block_explorer_label": "URL Block Explorer", - "network_block_explorer_placeholder": "URL Block Explorer (opsional)", - "network_chain_id_warning": "ID Chain Tidak Valid", - "network_other_networks": "Other networks", + "network_block_explorer_label": "URL block explorer", + "network_block_explorer_placeholder": "URL block explorer (opsional)", + "network_chain_id_warning": "ID chain tidak valid", + "network_other_networks": "Jaringan lainnya", "network_rpc_networks": "Jaringan RPC", - "network_add_network": "Add network", + "network_add_network": "Tambahkan jaringan", "network_add_custom_network": "Tambahkan jaringan khusus", "network_add": "Tambahkan", "network_save": "Simpan", @@ -2862,7 +2916,7 @@ "legal_title": "Hukum", "conversion_title": "Konversi mata uang", "conversion_desc": "Tampilkan nilai fiat dalam menggunakan mata uang tertentu di seluruh aplikasi.", - "primary_currency_title": "Primary currency", + "primary_currency_title": "Mata uang utama", "primary_currency_desc": "Pilih Asli untuk memprioritaskan tampilan nilai dalam mata uang asli chain (mis. ETH). Pilih Fiat untuk memprioritaskan tampilan nilai dalam mata uang fiat yang Anda pilih.", "primary_currency_text_first": "Asli", "primary_currency_text_second": "Fiat", @@ -2883,7 +2937,7 @@ "batch_balance_requests_description": "Dapatkan informasi saldo terbaru untuk seluruh akun Anda sekaligus. Menonaktifkan fitur ini berarti yang lainnya cenderung tidak menghubungkan satu akun dengan akun lainnya.", "third_party_title": "Dapatkan transaksi masuk", "third_party_description": "API pihak ketiga (Etherscan) digunakan untuk menampilkan transaksi masuk dalam riwayat. Nonaktifkan jika Anda tidak ingin kami mengambil data dari layanan tersebut.", - "metametrics_opt_out": "Pilih keluar dari MetaMetrics", + "metametrics_opt_out": "pilih keluar dari MetaMetrics", "metametrics_restart_required": "Anda harus memulai ulang aplikasi untuk menerapkan perubahan.", "create_password": "Buat kata sandi", "invalid_password": "Kata sandi tidak valid", @@ -2899,11 +2953,11 @@ "invalid_number": "Nomor tidak valid. Masukkan angka heksadesimal dengan awalan desimal atau '0x'.", "invalid_number_leading_zeros": "Nomor tidak valid. Hapus semua nol di depan.", "invalid_number_range": "Nomor tidak valid. Masukkan angka antara 1 dan %{maxSafeChainId}", - "hide_zero_balance_tokens_title": "Hide tokens without balance", + "hide_zero_balance_tokens_title": "Sembunyikan token tanpa saldo", "hide_zero_balance_tokens_desc": "Mencegah token tanpa saldo ditampilkan di daftar token Anda.", "token_detection_title": "Autodeteksi token", "token_detection_description": "Kami menggunakan API pihak ketiga untuk mendeteksi dan menampilkan token baru yang dikirim ke dompet Anda. Nonaktifkan jika Anda tidak ingin aplikasi menarik data dari layanan tersebut.", - "theme_button_text": "Change theme", + "theme_button_text": "Ubah tema", "theme_title": "Tema ({{theme}})", "theme_description": "Ubah tampilan aplikasi Anda dengan mengatur tema.", "theme_os": "Sistem", @@ -2935,18 +2989,18 @@ "delete_metrics_description_after_delete_part_two": ". Proses ini bisa memerlukan waktu hingga 30 hari. Lihat", "delete_metrics_description_privacy_policy": "Kebijakan Privasi.", "delete_metrics_button": "Hapus data MetaMetrics", - "check_status_button": "Check status", + "check_status_button": "Periksa status", "delete_metrics_confirm_modal_title": "Hapus data MetaMetrics?", "delete_metrics_confirm_modal_description": "Kami akan menghapus semua data MetaMetrics Anda. Lanjutkan?", "delete_wallet_data_title": "Reset dompet", "delete_wallet_data_description": "Tindakan ini akan menghapus semua data terkait dompet dari perangkat Anda. Akun Anda terdapat di blockchain dan tidak terkait dengan MetaMask. Akun Anda dapat dipulihkan kapan saja menggunakan Frasa Pemulihan Rahasia.", "delete_wallet_data_button": "Reset dompet", - "delete_data_status_title": "Deletion task status", + "delete_data_status_title": "Penghapusan status tugas", "delete_data_status_description": "Status saat ini adalah", "delete_metrics_error_title": "Kami tidak dapat menghapus data ini sekarang.", "delete_metrics_error_description": "Permintaan ini tidak dapat diselesaikan sekarang karena masalah server sistem analitis, coba lagi nanti.", "ok": "Oke", - "clear_sdk_connections_title": "Hapus semua Koneksi SDK MetaMask", + "clear_sdk_connections_title": "Hapus semua koneksi SDK MetaMask", "clear_sdk_connections_text": "Semua koneksi akan dihapus dan aplikasi terdesentralisasi (dapps) perlu meminta koneksi lagi", "sdk_connections": "Koneksi SDK MetaMask", "manage_sdk_connections_title": "Kelola koneksi", @@ -2956,8 +3010,9 @@ "description": "Wilayah dan lainnya...", "current_region": "Wilayah saat ini", "reset_region": "Reset wilayah", + "change_region": "Ubah wilayah", "no_region_selected": "Tidak ada wilayah yang dipilih", - "sdk_activation_keys": "Kunci Aktivasi SDK", + "sdk_activation_keys": "Kunci aktivasi SDK", "activation_keys_description": "Kunci aktivasi akan mengaktifkan fitur atau penyedia tertentu.", "add_activation_key": "Tambahkan kunci aktivasi", "edit_activation_key": "Edit kunci aktivasi", @@ -3006,13 +3061,13 @@ }, "snap_details": { "install_date": "Diinstal pada {{date}}", - "install_origin": "Install origin", + "install_origin": "Instal asal", "enabled": "Diaktifkan", "version": "Versi" }, "keyring_account_list_item": { "account_name": "Nama akun", - "public_address": "Public address" + "public_address": "Alamat publik" }, "snap_permissions": { "approved_date": "Disetujui pada {{date}}", @@ -3063,28 +3118,28 @@ "blockaid_desc": "Fitur ini memperingatkan Anda tentang aktivitas jahat dengan meninjau permintaan transaksi dan tanda tangan secara aktif.", "security_alerts": "Peringatan keamanan", "security_alerts_desc": "Fitur ini memperingatkan Anda tentang aktivitas berbahaya dengan meninjau permintaan transaksi dan tanda tangan secara lokal. Selalu lakukan uji tuntas sendiri sebelum menyetujui permintaan apa pun. Tidak ada jaminan bahwa fitur ini akan mendeteksi semua aktivitas berbahaya. Dengan mengaktifkan fitur ini, Anda menyetujui persyaratan penggunaan penyedia.", - "dismiss_smart_account_update_heading": "Tolak saran \"Beralih ke Akun Cerdas\"", - "dismiss_smart_account_update_desc": "Aktifkan ini agar saran \"Beralih ke Akun Cerdas\" tidak muncul lagi di akun mana pun. Akun cerdas memungkinkan transaksi yang lebih cepat, biaya jaringan yang lebih rendah, serta pembayaran yang lebih fleksibel untuk akun tersebut.", + "dismiss_smart_account_update_heading": "Tolak saran \"Beralih ke akun cerdas\"", + "dismiss_smart_account_update_desc": "Aktifkan ini agar saran \"Beralih ke akun cerdas\" tidak muncul lagi di akun mana pun. Akun cerdas memungkinkan transaksi yang lebih cepat, biaya jaringan yang lebih rendah, serta pembayaran yang lebih fleksibel untuk akun tersebut.", "use_smart_account_heading": "Gunakan akun cerdas", "use_smart_account_desc": "Aktifkan ini untuk mengalihkan akun yang dibuat dalam MetaMask ke akun cerdas secara otomatis setiap saat fitur relevan tersedia, seperti transaksi yang lebih cepat, biaya jaringan yang lebih rendah, dan fleksibilitas pembayaran untuk transaksi tersebut.", - "use_smart_account_learn_more": "Selengkapnya.", + "use_smart_account_learn_more": "Pelajari selengkapnya", "smart_transactions_opt_in_heading": "Transaksi Pintar", "smart_transactions_opt_in_desc_supported_networks": "Aktifkan Transaksi Pintar untuk transaksi yang lebih andal dan aman pada jaringan yang didukung.", - "smart_transactions_learn_more": "Selengkapnya.", + "smart_transactions_learn_more": "Pelajari selengkapnya", "simulation_details": "Estimasikan perubahan saldo", "simulation_details_description": "Aktifkan ini untuk mengestimasikan perubahan saldo transaksi sebelum Anda mengonfirmasikannya. Ini tidak menjamin hasil akhir transaksi Anda. ", "simulation_details_learn_more": "Selengkapnya.", - "aes_crypto_test_form_title": "AES crypto - test form", + "aes_crypto_test_form_title": "Kripto AES - formulir pengujian", "aes_crypto_test_form_description": "Bagian khusus dikembangkan untuk pengujian E2E. Apabila terlihat di aplikasi, laporkan ke dukungan MetaMask.", "developer_options": { - "title": "Developer options", - "generate_trace_test": "Generate trace test", - "generate_trace_test_desc": "Generate a developer test Sentry trace.", - "navigate_to_sample_feature": "Navigate to sample feature", + "title": "Opsi pengembang", + "generate_trace_test": "Buat uji jejak", + "generate_trace_test_desc": "Buat uji jejak Sentry dari pengembang.", + "navigate_to_sample_feature": "Navigasikan ke fitur sampel", "sample_feature_desc": "Fitur sampel sebagai template untuk pengembang." }, "feature_flag_override": { - "title": "Feature flag override", + "title": "Penggantian tanda fitur", "description": "Mengganti tanda fitur untuk aplikasi secara lokal." } }, @@ -3107,7 +3162,7 @@ "disconnect_all_info": "Jika koneksi ke semua situs dihapus, Anda harus memberikan izin untuk menghubungkannya kembali.", "disconnect": "Putuskan koneksi", "disconnect_all": "Putuskan semua koneksi", - "disconnect_all_accounts": "Putuskan koneksi semua Akun", + "disconnect_all_accounts": "Memutus koneksi semua akun", "manage_connections": "Kelola koneksi", "manage": "Kelola", "cancel": "Batal", @@ -3124,7 +3179,7 @@ "disconnect_all": "Putuskan koneksi dari semua situs?", "disconnect_all_desc": "Jika Anda memutuskan koneksi akun dari semua situs, Anda harus memberikan izin untuk menghubungkannya kembali.", "disconnect_account": "Putuskan koneksi akun?", - "disconnect_all_accounts": "Putuskan koneksi semua Akun", + "disconnect_all_accounts": "Memutus koneksi semua akun", "disconnect_all_accounts_desc": "Jika Anda memutuskan koneksi semua akun dari {{dapp}}, Anda harus memberikan izin untuk menghubungkannya kembali.", "disconnect_account_desc": "Jika Anda memutuskan koneksi {{account}} dari {{dapp}}, Anda harus memberikan izin untuk menghubungkannya kembali.", "disconnect_confirm": "Memutus koneksi", @@ -3137,7 +3192,7 @@ "sdk_feedback_modal": { "ok": "Oke", "title": "Akun tidak dapat terhubung", - "info": "Pindai kode QR di aplikasi terdesentralisasi (dAPP) untuk terhubung kembali ke MetaMask" + "info": "Please scan the QR code on the site to reconnect to MetaMask" }, "app_information": { "title": "Informasi", @@ -3145,8 +3200,8 @@ "privacy_policy": "Kebijakan Privasi", "terms_of_use": "Ketentuan penggunaan", "attributions": "Atribusi", - "support_center": "Visit our support center", - "web_site": "Kunjungi situs web kami", + "support_center": "Kunjungi pusat dukungan kami", + "web_site": "Visit our website", "contact_us": "Contact us" }, "reveal_credential": { @@ -3203,7 +3258,7 @@ "keep_credential_safe": "Jaga keamanan {{credentialName}} Anda", "srp_abbreviation_text": "SRP", "srp_text": "Frasa Pemulihan Rahasia", - "private_key_text": "Kunci Privat", + "private_key_text": "Kunci pribadi", "got_it": "Mengerti", "learn_more": "Selengkapnya" }, @@ -3211,12 +3266,12 @@ "title": "Peringatan keamanan", "description": "Tangkapan layar bukan cara yang aman untuk melacak {{credentialName}}. Simpan di tempat yang tidak dicadangkan secara online untuk menjaga keamanan akun Anda.", "srp_text": "Frasa Pemulihan Rahasia", - "priv_key_text": "Kunci Pribadi" + "priv_key_text": "Kunci pribadi" }, "password_reset": { "password_title": "Kata sandi", "password_desc": "Pilih kata sandi yang kuat untuk membuka aplikasi MetaMask di perangkat Anda. Jika kata sandi hilang, Anda memerlukan Frasa Pemulihan Rahasia untuk mengimpor kembali dompet Anda.", - "password_learn_more": "Pelajari selengkapnya.", + "password_learn_more": "Pelajari selengkapnya", "change_password": "Ubah kata sandi", "password_hint": "Petunjuk kata sandi" }, @@ -3246,19 +3301,28 @@ "swap": "Tukar", "bridge": "Bridge", "earn": "Dapatkan", - "convert_to_musd": "Convert to mUSD", + "convert_to_musd": "Konversikan ke mUSD", + "merkl_rewards": { + "annual_bonus": "Bonus {{apy}}%", + "claimable_bonus": "Bonus yang dapat diklaim", + "claimable_bonus_tooltip_description": "mUSD bonuses are claimed on Linea.", + "terms_apply": "Terms apply.", + "ok": "Oke", + "claim": "Klaim", + "processing_claim": "Processing claim..." + }, "tron": { - "daily_resource_new_energy": "New daily energy", - "sufficient_to_cover": "Sufficient to cover", + "daily_resource_new_energy": "Energi harian baru", + "sufficient_to_cover": "Cukup untuk menutupi", "transactions": "transaksi", "daily_resource": "Sumber daya harian", "bandwidth": "Bandwidth", "energy": "Energi", - "daily_resource_description": "This is your daily allowance based on your staked TRX. Hold TRX to get 600 bandwidth daily.", - "sufficient_to_cover_trx_transfers": "Covers ~{{amount}} TRX transfers", - "sufficient_to_cover_trx_transfer": "Covers 1 TRX transfer", - "sufficient_to_cover_usdt_transfers": "Covers ~{{amount}} USDT transfers", - "sufficient_to_cover_usdt_transfer": "Covers 1 USDT transfer" + "daily_resource_description": "Ini adalah jatah harian Anda berdasarkan TRX yang Anda stake. Tahan TRX untuk mendapatkan bandwidth 600 setiap hari.", + "sufficient_to_cover_trx_transfers": "Menutupi ~{{amount}} transfer TRX", + "sufficient_to_cover_trx_transfer": "Menutupi 1 transfer TRX", + "sufficient_to_cover_usdt_transfers": "Menutupi ~{{amount}} transfer USDT", + "sufficient_to_cover_usdt_transfer": "Menutupi 1 transfer USDT" }, "disabled_button": { "buy": "Pembelian tidak didukung untuk akun ini", @@ -3311,9 +3375,11 @@ }, "no_chart_data": { "title": "Tidak ada data grafik", - "description": "Kami tidak dapat mengambil data untuk token ini" + "description": "Kami tidak dapat mengambil data untuk token ini", + "insufficient_data": "Data is not available for this time period" }, "your_balance": "Saldo Anda", + "perps_position": "Posisi perp", "unable_to_load_balance": "Tidak dapat memuat saldo Anda", "about": "Tentang", "about_content_display": { @@ -3363,11 +3429,11 @@ "address_copied_to_clipboard": "Alamat token disalin ke papan klip" }, "qr_scanner": { - "invalid_qr_code_title": "Kode QR Tidak Valid", + "invalid_qr_code_title": "Invalid QR code", "invalid_qr_code_message": "Kode QR yang Anda coba pindai tidak valid.", "allow_camera_dialog_title": "Izinkan akses kamera", "allow_camera_dialog_message": "Kami memerlukan izin Anda untuk memindai kode QR", - "scanning": "memindai...", + "scanning": "Memindai...", "ok": "Oke", "continue": "Lanjutkan", "cancel": "Batal", @@ -3376,14 +3442,14 @@ "attempting_sync_from_wallet_error": "Tampaknya Anda mencoba menyinkronkan dengan ekstensi. Untuk melakukannya, Anda harus menghapus dompet saat ini. \n\nSetelah Anda menghapus atau menginstal ulang versi baru aplikasi, pilih opsi untuk \"Menyinkronkan dengan Ekstensi MetaMask\". Penting! Sebelum menghapus dompet Anda, pastikan Anda telah mencadangkan Frasa Pemulihan Rahasia.", "not_allowed_error_title": "Aktifkan akses kamera", "not_allowed_error_desc": "Untuk memindai kode QR, berikan MetaMask akses ke kamera dari menu pengaturan perangkat Anda.", - "unrecognized_address_qr_code_title": "Kode QR tak dikenal", + "unrecognized_address_qr_code_title": "Unrecognized QR code", "unrecognized_address_qr_code_desc": "Maaf, kode QR ini tidak terkait dengan alamat akun atau alamat kontrak.", "url_redirection_alert_title": "Anda akan mengunjungi tautan eksternal", "url_redirection_alert_desc": "Tautan dapat digunakan untuk mencoba menipu atau mengelabui orang, jadi pastikan untuk mengunjungi situs web yang aman saja.", "label": "Pindai kode QR", "open_settings": "Pengaturan", "camera_not_available": "Kamera tidak tersedia", - "tron_address_not_supported": "Tron addresses are not currently supported" + "tron_address_not_supported": "Alamat Tron saat ini tidak didukung" }, "action_view": { "cancel": "Batal", @@ -3471,10 +3537,10 @@ "cancel_tx_message": "Mengirimkan upaya ini tidak menjamin percepatan transaksi awal Anda. Jika upaya pembatalan berhasil, Anda akan dikenakan biaya transaksi di atas.", "speedup_tx_title": "Mencoba mempercepat?", "speedup_tx_message": "Mengirimkan upaya ini tidak menjamin percepatan transaksi awal Anda. Jika upaya percepatan berhasil, Anda akan dikenakan biaya transaksi di atas.", - "nevermind": "Abaikan", + "nevermind": "Never mind", "edit_network_fee": "Edit biaya gas", "edit_priority": "Edit prioritas", - "gas_cancel_fee": "Biaya pembatalan Gas", + "gas_cancel_fee": "Gas cancellation fee", "gas_speedup_fee": "Biaya percepatan Gas", "use_max": "Gunakan maks", "set_gas": "Atur", @@ -3602,7 +3668,7 @@ "reload": "Muat ulang", "share": "Bagikan", "bookmark": "Bookmark", - "add_to_favorites": "Tambahkan ke Favorit", + "add_to_favorites": "Add to favorites", "error": "Kesalahan", "cancel": "Batal", "go_back": "Kembali", @@ -3610,7 +3676,7 @@ "home": "Beranda", "close": "Tutup", "open_in_browser": "Buka di browser", - "change_url": "Ubah url", + "change_url": "Change URL", "switch_network": "Alihkan jaringan", "dapp_browser": "BROWSER DAPP", "dapp_browser_message": "MetaMask merupakan dompet dan browser untuk web terdesentralisasi. Ayo lihat!", @@ -3654,7 +3720,7 @@ "add_favorite": { "title": "Add favorite", "title_label": "Nama", - "url_label": "Url", + "url_label": "URL", "add_button": "Tambahkan", "cancel_button": "Batal" }, @@ -3664,7 +3730,7 @@ "approve": { "title": "Setujui", "deeplink": "Pranala", - "qr_code": "KODE QR" + "qr_code": "Kode QR" }, "transactions": { "tx_review_confirm": "Konfirmasikan", @@ -3676,30 +3742,30 @@ "tx_review_increase_allowance": "Increase allowance", "tx_review_set_approval_for_all": "Set approval for all", "tx_review_staking_claim": "Staking claim", - "tx_review_staking_deposit": "Staking deposit", + "tx_review_staking_deposit": "Deposit stake", "tx_review_staking_unstake": "Batalkan stake", - "tx_review_lending_deposit": "Lending deposit", + "tx_review_lending_deposit": "Deposit pinjaman", "tx_review_lending_withdraw": "Lending withdrawal", - "tx_review_perps_deposit": "Perp yang Didanai", + "tx_review_perps_deposit": "Perp yang didanai", "tx_review_predict_deposit": "Dana prediksi", "tx_review_predict_claim": "Klaim kemenangan", "tx_review_predict_withdraw": "Prediksi penarikan", - "tx_review_musd_conversion": "mUSD Conversion", - "sent_ether": "Mengirim Ether", - "self_sent_ether": "Sent yourself Ether", - "received_ether": "Menerima Ether", + "tx_review_musd_conversion": "Konversi mUSD", + "sent_ether": "Sent ETH", + "self_sent_ether": "Sent yourself ETH", + "received_ether": "Received ETH", "sent_dai": "Mengirim DAI", "self_sent_dai": "Mengirim DAI ke Diri Sendiri", "received_dai": "Menerima DAI", "sent_tokens": "Sent tokens", "received_tokens": "Received tokens", - "ether": "Ether", + "ether": "ETH", "sent_unit": "Mengirim {{unit}}", "self_sent_unit": "Sent yourself {{unit}}", "received_unit": "Menerima {{unit}}", "sent_collectible": "Sent collectible", "received_collectible": "Received collectible", - "send_ether": "Send Ether", + "send_ether": "Send ETH", "send_unit": "Send {{unit}}", "send_collectible": "Send collectible", "receive_collectible": "Receive collectible", @@ -3732,9 +3798,9 @@ }, "gas_used": "Gas used (units)", "gas_limit": "Gas limit (units)", - "gas_price": "Harga Gas (GWEI)", - "base_fee": "Biaya Dasar (GWEI)", - "priority_fee": "Biaya Prioritas (GWEI)", + "gas_price": "Gas price (GWEI)", + "base_fee": "Base fee (GWEI)", + "priority_fee": "Priority fee (GWEI)", "multichain_priority_fee": "Biaya prioritas", "max_fee": "Max fee per gas", "total": "Total", @@ -3767,7 +3833,7 @@ "confirm_gas_fee_token_tooltip": "Ini dibayarkan ke jaringan untuk memproses transaksi Anda. Termasuk biaya MetaMask sebesar {{metamaskFeeFiat}} untuk token non-ETH atau ETH yang telah didanai sebelumnya.", "paid_by_metamask": "Dibayar oleh MetaMask", "confirm_gas_fee_token_metamask_fee": "Termasuk biaya {{metamaskFeeFiat}}", - "smart_account_upgrade": "Tingkatkan ke akun cerdas", + "smart_account_upgrade": "Beralih ke akun cerdas", "smart_account_downgrade": "Beralih ke akun standar", "batched_transactions": "Transaksi batch", "gas_modal": { @@ -3883,7 +3949,7 @@ "network_select_confirm_use_safe_check": "Selecting confirm turns on network details check. You can turn off network details check in ", "network_settings_security_privacy": "Pengaturan > Keamanan dan privasi", "network_currency_symbol": "Simbol mata uang", - "network_block_explorer_url": "URL Block Explorer", + "network_block_explorer_url": "URL block explorer", "search": "Cari jaringan yang ditambahkan sebelumnya", "search-short": "Search", "add": "Tambah", @@ -3906,7 +3972,7 @@ "select_all": "Pilih semua", "deselect_all": "Batal pilih semua", "new_network": "Jaringan baru ditambahkan", - "network_name": "Jaringan {{networkName}}", + "network_name": "jaringan {{networkName}}", "network_added": " kini tersedia di pemilih jaringan.", "provider": "Penyedia dipercaya untuk memberi tahu saldo dompet Anda dan menyiarkan transaksinya dengan penuh tanggung jawab", "no_match": "Tidak menemukan hasil yang cocok.", @@ -4004,8 +4070,8 @@ "biometrics": { "enable_touchid": "Buka dengan ID Sentuh?", "enable_faceid": "Buka dengan ID Wajah?", - "enable_fingerprint": "Buka dengan Sidik Jari?", - "enable_biometrics": "Buka dengan Biometrik?", + "enable_fingerprint": "Unlock with fingerprint?", + "enable_biometrics": "Unlock with biometrics?", "enable_device_passcode_ios": "Buka dengan kode sandi perangkat?", "enable_device_passcode_android": "Buka dengan PIN perangkat?" }, @@ -4020,18 +4086,18 @@ "title": "PERMINTAAN CONNECT", "walletconnect_title": "PERMINTAAN WALLETCONNECT", "action": "Hubungkan ke situs ini?", - "action_reconnect": "Untuk melanjutkan koneksi, pilih nomor yang Anda lihat di aplikasi terdesentralisasi (dApp)", - "action_reconnect_deeplink": "Hubungkan kembali ke aplikasi terdesentralisasi (dApp) ini?", + "action_reconnect": "To resume connection, choose the number you see on the site", + "action_reconnect_deeplink": "Do you want to reconnect to this site?", "connect": "Hubungkan", "resume": "Lanjutkan", "cancel": "Batal", - "donot_rememberme": "Lupa koneksi aplikasi terdesentralisasi (dApp) ini?", + "donot_rememberme": "Do not remember this site connection", "disconnect": "Putuskan koneksi", "permission": "Lihat", "address": "alamat publik", "sign_messages": "Tanda tangani pesan", "on_your_behalf": "atas nama Anda", - "warning": "Dengan mengeklik hubungkan, Anda mengizinkan aplikasi ini untuk melihat alamat publik Anda. Ini merupakan langkah keamanan penting untuk melindungi data Anda dari potensi risiko phishing." + "warning": "By clicking connect, you allow this site to view your public address. This is an important security step to protect your data from potential phishing risks." }, "import_private_key": { "title": "Impor akun", @@ -4047,7 +4113,7 @@ "error_title": "Terjadi kesalahan", "error_message": "Kami tidak dapat mengimpor kunci pribadi tersebut. Pastikan Anda memasukkannya dengan benar.", "error_empty_message": "Masukkan kunci pribadi Anda.", - "or_scan_a_qr_code": "atau Pindai Kode QR" + "or_scan_a_qr_code": "or scan a QR code" }, "import_private_key_success": { "title": "Akun berhasil diimpor!", @@ -4064,12 +4130,12 @@ "paste": "Tempel", "clear": "Hapus semua", "srp_number_of_words_option_title": "Jumlah kata", - "12_word_option": "Saya memiliki frasa 12 kata", - "24_word_option": "Saya memiliki frasa 24 kata", + "12_word_option": "I have a 12-word phrase", + "24_word_option": "I have a 24-word phrase", "error_title": "Terjadi kesalahan", "error_message": "We couldn't import that Secret Recovery Phrase. Please make sure you entered it correctly.", "error_empty_message": "You need to enter your Secret Recovery Phrase.", - "error_number_of_words_error_message": "Frasa Pemulihan Rahasia terdiri dari 12 atau 24 kata", + "error_number_of_words_error_message": "Secret Recovery Phrases contain 12 or 24 words", "error_srp_is_case_sensitive": "Masukan tidak valid! Frasa Pemulihan Rahasia peka kapital.", "error_srp_word_error_1": "Kata ", "error_srp_word_error_2": " salah atau salah eja.", @@ -4079,7 +4145,7 @@ "error_invalid_srp": "Frasa Pemulihan Rahasia Tidak Valid", "error_duplicate_srp": "Frasa Pemulihan Rahasia ini telah diimpor.", "error_duplicate_account": "The account you are trying to import is a duplicate.", - "invalid_qr_code_title": "Kode QR Tidak Valid", + "invalid_qr_code_title": "Invalid QR code", "invalid_qr_code_message": "The QR code does not contain a valid Secret Recovery Phrase", "success_1": "Dompet", "success_2": "diimpor" @@ -4151,7 +4217,7 @@ "why_secure_2": "Ini merupakan satu-satunya cara untuk memulihkan dompet Anda jika aplikasi terkunci atau Anda memiliki perangkat baru." }, "account_backup_step_2": { - "cancel_backup_title": "Cancel backup", + "cancel_backup_title": "Batalkan pencadangan", "cancel_backup_message": "Kami sarankan agar Anda menyimpan Frasa Pemulihan Rahasia untuk memulihkan dompet Anda.", "cancel_backup_ok": "Ya, saya akan menanggung risikonya", "cancel_backup_no": "Tidak, cadangkan Frasa Pemulihan Rahasia", @@ -4163,7 +4229,7 @@ "cta_text": "Oke" }, "account_backup_step_3": { - "cancel_backup_title": "Cancel backup", + "cancel_backup_title": "Batalkan pencadangan", "cancel_backup_message": "Kami sarankan agar Anda menyimpan Frasa Pemulihan Rahasia untuk memulihkan dompet Anda.", "cancel_backup_ok": "Ya, saya akan menanggung risikonya", "cancel_backup_no": "Tidak, cadangkan Frasa Pemulihan Rahasia", @@ -4172,7 +4238,7 @@ "cta_text": "TIDAK ADA YANG MELIHAT SAYA" }, "account_backup_step_4": { - "cancel_backup_title": "Cancel backup", + "cancel_backup_title": "Batalkan pencadangan", "cancel_backup_message": "Kami sarankan agar Anda menyimpan Frasa Pemulihan Rahasia untuk memulihkan dompet Anda.", "cancel_backup_ok": "Ya, saya akan menanggung risikonya", "cancel_backup_no": "Tidak, cadangkan Frasa Pemulihan Rahasia", @@ -4197,16 +4263,16 @@ "modal_button": "SELANJUTNYA" }, "account_backup_step_6": { - "title": "Security tips", + "title": "Kiat keamanan", "info_text": "MetaMask tidak dapat memulihkan Frasa Pemulihan Rahasia yang hilang", "tip_1": "Simpan beberapa cadangan Frasa Pemulihan Rahasia", "tip_2": "Simpan frasa pada pengelola kata sandi tepercaya dan cadangan kertas di tempat yang aman", "tip_3": "Jangan pernah membagikan frasa ini kepada siapa pun", "disclaimer": "* Anda dapat menemukan Frasa Pemulihan Rahasia dengan membuka", - "disclaimer_bold": "Pengaturan > Keamanan dan Privasi", - "cta_text": "MENGERTI!", + "disclaimer_bold": "Pengaturan > Keamanan dan privasi", + "cta_text": "MENGERTI", "modal_title": "Selamat!", - "modal_text": "Frasa telah dicadangkan dan semua siap!", + "modal_text": "Frasa telah dicadangkan dan semua siap.", "modal_button": "SELESAI", "copy_seed_phrase": "SALIN Frasa Pemulihan Rahasia KE PAPAN KLIP" }, @@ -4238,7 +4304,7 @@ "steps": "Langkah {{currentStep}} dari {{totalSteps}}", "action": "Konfirmasikan Frasa Pemulihan Rahasia", "info": "Pilih kata-kata yang hilang dalam urutan yang benar.", - "complete": "Complete backup", + "complete": "Selesaikan pencadangan", "success": "Berhasil", "error-title": "Kurang tepat", "error-description": "Periksa kembali Frasa Pemulihan Rahasia dan coba lagi.", @@ -4253,7 +4319,7 @@ "congratulations": "Selamat", "success": "Dompet Anda telah terlindungi. Ingatlah untuk menjaga Frasa Pemulihan Rahasia agar tetap aman, ini merupakan tanggung jawab Anda!", "hint": "Tinggalkan petunjuk?", - "recover": "MetaMask tidak dapat memulihkan dompet Anda jika hilang. Anda dapat menemukan Frasa Pemulihan Rahasia di Pengaturan > Keamanan dan Privasi.", + "recover": "MetaMask tidak dapat memulihkan dompet Anda jika hilang. Anda dapat menemukan Frasa Pemulihan Rahasia di Pengaturan > Keamanan dan privasi.", "learn": "Pelajari selengkapnya", "done": "Selesai", "recovery_hint": "Petunjuk pemulihan", @@ -4300,7 +4366,7 @@ "withdrawal_completed": "Penarikan selesai", "unstake_completed": "Pembatalan stake selesai", "withdrawal_requested": "Permintaan penarikan", - "stake_ready_to_be_withdrawn": "Stake siap untuk ditarik", + "stake_ready_to_be_withdrawn": "Stake siap untuk penarikan", "swap_completed": "Swap {{from}} dengan {{to}}", "swap": "Ditukar", "sent": "Dikirim ke {{address}}", @@ -4417,7 +4483,7 @@ "metamask_swap_completed_title": "Swap selesai", "metamask_swap_completed_description": "Swap MetaMask berhasil", "nft_sent_title": "NFT terkirim", - "nft_sent_description": "Anda telah berhasil mengirim NFT", + "nft_sent_description": "You successfully sent an NFT", "nft_received_title": "NFT diterima", "nft_received_description": "Anda menerima NFT baru", "rocketpool_stake_completed_title": "Stake selesai", @@ -4517,16 +4583,16 @@ "description_1": "Tautan permintaan Anda siap dikirim!", "description_2": "Kirimkan tautan ini kepada teman, dan ini akan meminta mereka untuk mengirim", "copy_to_clipboard": "Salin ke papan klip", - "qr_code": "KODE QR", + "qr_code": "Kode QR", "send_link": "Send link", - "request_qr_code": "Kode QR Permintaan Pembayaran", + "request_qr_code": "Payment request QR code", "balance": "Saldo" }, "receive_request": { "title": "Terima", "share_title": "Share address", "share_description": "Kirim alamat Anda melalui email atau pesan teks", - "qr_code_title": "KODE QR", + "qr_code_title": "Kode QR", "qr_code_description": "Gambar yang dapat dipindai yang bisa membaca alamat Anda", "request_title": "Minta", "request_description": "Minta aset dari teman", @@ -4561,12 +4627,12 @@ "close_current_session": "Tutup sesi saat ini sebelum memulai yang baru." }, "paymentRequest": { - "title": "PERMINTAAN PEMBAYARAN", - "title_complete": "PEMBAYARAN SELESAI", - "confirm": "BAYAR", - "cancel": "TOLAK", + "title": "Payment request", + "title_complete": "Payment complete", + "confirm": "Pay", + "cancel": "Decline", "is_requesting_you_to_pay": "meminta Anda untuk membayar", - "total": "TOTAL:" + "total": "Total:" }, "webview_error": { "title": "Terjadi kesalahan", @@ -4589,6 +4655,10 @@ "fiat_on_ramp": { "buy_eth": "Beli ETH", "buy": "Beli {{ticker}}", + "on_network": "pada {{networkName}}", + "debit_card": "Kartu debit", + "continue": "Lanjutkan", + "powered_by_provider": "Didukung oleh {{provider}}", "purchased_currency": "Membeli {{currency}}", "network_not_supported": "Tidak mendukung jaringan saat ini", "switch_network": "Beralih ke Mainnet", @@ -4609,7 +4679,7 @@ "second_line": "pembelian ini?" }, "buy_ticker": "Beli {{ticker}}", - "buy_ticker_stablecoins": "Beli {{ticker}} dan Stablecoin", + "buy_ticker_stablecoins": "Beli {{ticker}} dan stablecoin", "multiple_payment_methods": "Berbagai metode pembayaran", "debit_credit_bank_transfers_country": "Debit/kredit dan transfer bank berdasarkan negara.", "debit_credit_bank_transfers_more_country": "Debit/kredit, transfer bank, dan metode lainnya berdasarkan negara.", @@ -4676,6 +4746,14 @@ "subtitle_5": "dan lihat berapa biaya gas yang diperlukan.", "cta": "Lanjutkan untuk membeli {{ticker}}" } + }, + "build_quote_settings_modal": { + "title": "Pengaturan", + "view_order_history": "Lihat riwayat order", + "contact_support": "Hubungi dukungan", + "log_out": "Keluar dari {{provider}}", + "logged_out_success": "Berhasil keluar", + "logged_out_error": "Kesalahan saat keluar" } }, "fiat_on_ramp_aggregator": { @@ -4706,7 +4784,7 @@ "use_new_buy_experience_description": "Beralih ke versi baru" }, "onboarding": { - "what_to_expect": "Yang Diharapkan", + "what_to_expect": "Yang dapat diharapkan", "quotes": "Fitur beli kripto kami mengumpulkan kuotasi dari vendor terintegrasi, menawarkan kuotasi dari sumber tersebut agar bisa mendapatkan kripto langsung ke dompet Anda tanpa masa tunggu.", "quotes_sell": "Kini Anda dapat langsung mencairkan uang tunai di MetaMask! Dapatkan penawaran terkini dari penyedia tepercaya selagi kami memberikan panduan langkah demi langkah.", "benefits": "Biaya gas yang harus dibayar semakin sedikit, dan ada banyak jaringan, token, serta metode pembayaran yang didukung", @@ -4761,7 +4839,7 @@ "get_quotes": "Dapatkan kuotasi", "done": "Selesai", "fetching_quotes": "Mengambil kuotasi", - "select_a_quote": "Pilih Kuotasi", + "select_a_quote": "Pilih kuotasi", "recommended_quote": "Kuotasi yang direkomendasikan", "select_a_cryptocurrency": "Pilih mata uang kripto", "select_a_cryptocurrency_description": "Pilih dari daftar token yang tersedia.", @@ -4819,15 +4897,16 @@ "region": { "buy_crypto_tokens": "Beli token kripto", "sell_crypto_tokens": "Jual token kripto", - "title": "Pilih Wilayah Anda", + "title": "Pilih wilayah Anda", "description": "Metode pembayaran dan token yang tersedia untuk Anda ditentukan oleh integrasi pihak ketiga kami dan dapat bervariasi bergantung wilayah Anda serta dukungan integrasi kami.", "sell_description": "Opsi destinasi tunai dan token dapat berbeda tergantung wilayah Anda.", + "region_variation_notice": "Metode pembayaran dan token yang tersedia dapat berbeda-beda tergantung wilayah Anda dan penyedia layanan kami.", "search_by_country": "Cari berdasarkan negara", "search_by_state": "Cari berdasarkan state", "no_region_results": "Wilayah tidak cocok", "your_region": "Wilayah Anda", "select_region": "Pilih wilayah Anda", - "select_region_title": "Pilih Wilayah Anda", + "select_region_title": "Pilih wilayah Anda", "select_country_registered": "Pilih negara tempat kartu Anda terdaftar (terlepas dari lokasi Anda saat ini).", "unsupported": "Wilayah tidak didukung", "unsupported_description": "Kami bekerja keras untuk memperluas cakupan ke wilayah Anda sesegera mungkin. Sembari menunggu, lihat artikel dukungan kami untuk mengetahui cara lain yang dapat Anda lakukan untuk {{rampType}} kripto.", @@ -4849,7 +4928,7 @@ "continue_order_description": "Untuk melanjutkan pesanan, pilih tombol di bagian bawah halaman ini.", "the_provider": "penyedia", "processing": "Memproses order", - "processing_card_description": "Pembelian Kredit/Debit umumnya memerlukan waktu beberapa menit", + "processing_card_description": "Pembelian menggunakan kartu kredit/debit umumnya memerlukan waktu beberapa menit", "processing_bank_description": "Transfer bank umumnya memerlukan waktu beberapa hari kerja", "details": "Detail pesanan", "via": "melalui", @@ -4863,7 +4942,7 @@ "support": "Dukungan", "view_order_status": "Lihat status pesanan di {{provider}}", "id": "ID Order", - "date_and_time": "Tanggal dan Waktu", + "date_and_time": "Tanggal dan waktu", "payment_method": "Metode pembayaran", "destination": "Destinasi", "token_amount": "Jumlah token", @@ -4883,11 +4962,11 @@ "sent": "Mengirim!" }, "notifications": { - "purchase_failed_title": "Pembelian {{currency}} gagal! Silakan coba lagi. Mohon maaf atas ketidaknyamanan yang timbul!", + "purchase_failed_title": "Pembelian {{currency}} gagal. Coba lagi setelah beberapa saat.", "purchase_failed_description": "Verifikasikan metode pembayaran dan dukungan kartu", "purchase_cancelled_title": "Pembelian Anda dibatalkan", "purchase_cancelled_description": "Verifikasikan metode pembayaran dan dukungan kartu", - "purchase_completed_title": "Pembelian {{amount}} {{currency}} berhasil!", + "purchase_completed_title": "Pembelian senilai {{amount}} {{currency}} berhasil.", "purchase_completed_description": "{{currency}} Anda kini telah tersedia", "purchase_pending_title": "Memproses pembelian {{currency}} Anda", "purchase_pending_description": "Hanya perlu beberapa menit...", @@ -4896,7 +4975,7 @@ "sale_cancelled_title": "Pesanan dibatalkan", "sale_cancelled_description": "Pesanan tidak dapat diselesaikan.", "sale_completed_title": "Pesanan selesai", - "sale_completed_description": "Pesanan berhasil!.", + "sale_completed_description": "Pesanan berhasil.", "sale_pending_title": "Pemrosesan penjualan {{currency}}", "sale_pending_description": "Pesanan sedang diproses.", "no_date": "Tidak dikenal" @@ -4921,7 +5000,7 @@ "start_swapping": "Mulai menukar" }, "feature_off_title": "Sementara tidak tersedia", - "feature_off_body": "MetaMask Swaps sedang menjalani pemeliharaan. Silakan kembali lagi nanti.", + "feature_off_body": "MetaMask Swaps are undergoing maintenance. Please check back later.", "wrong_network_title": "Pertukaran tidak tersedia", "wrong_network_body": "Anda hanya dapat menukar token di Jaringan Utama Ethereum.", "unallowed_asset_title": "Tidak dapat menukar token ini", @@ -5002,7 +5081,7 @@ "edit": "Edit", "quotes_include_fee": "Kuotasi mencakup {{fee}}% biaya MetaMask", "quotes_include_gas_and_metamask_fee": "Kuotasi mencakup biaya gas dan biaya MetaMask sebesar {{fee}}%", - "tap_to_swap": "Ketuk untuk Menukar", + "tap_to_swap": "Tap to swap", "swipe_to_swap": "Usap untuk menukar", "swipe_to": "Usap untuk", "swap": "Tukar", @@ -5130,7 +5209,7 @@ "contact_support": "Hubungi dukungan" }, "whats_new": { - "title": "Yang Baru", + "title": "Yang baru", "remove_gns_new_ui_update": { "title": "Pembaruan UI baru", "introduction": "Kami telah membuat pembaruan untuk meningkatkan pengalaman menggunakan aplikasi.", @@ -5302,7 +5381,7 @@ }, "network_information": { "things_to_keep_in_mind": "Hal-hal yang perlu diingat", - "testnet_network": "Testnet {{type}}", + "testnet_network": "testnet {{type}}", "first_description": "Token asli di jaringan ini adalah {{ticker}}. Ini merupakan token yang digunakan untuk biaya gas.", "second_description": "Jika Anda mencoba mengirim aset secara langsung dari satu jaringan ke jaringan lain, ini dapat mengakibatkan aset Anda hilang secara permanen. Pastikan untuk menggunakan bridge.", "third_description": "Token Anda mungkin tidak secara otomatis muncul di dompet Anda.", @@ -5385,7 +5464,7 @@ "learn_more": "Pelajari selengkapnya" }, "token_allowance": { - "verify_third_party_details": "Verifikasikan detail pihak ketiga", + "verify_third_party_details": "Verify third-party details", "protect_from_scams": "Untuk melindungi diri Anda dari penipu, luangkan waktu sejenak untuk memverifikasi detail pihak ketiga.", "learn_to_verify": "Pelajari cara memverifikasi detail pihak ketiga", "spending_cap": "batas penggunaan", @@ -5399,7 +5478,7 @@ }, "restore_wallet": { "restore_needed_title": "Pemulihan diperlukan", - "restore_needed_description": "Terjadi kesalahan, tetapi jangan khawatir! Mari coba pulihkan dompet Anda.", + "restore_needed_description": "Something went wrong, but don’t worry! Let’s try to restore your wallet.", "restore_needed_action": "Pulihkan dompet" }, "wallet_restored": { @@ -5545,7 +5624,7 @@ "add_bitcoin_account": "Akun Bitcoin", "add_solana_account": "Akun Solana", "add_tron_account": "Akun Tron", - "switch_to_smart_account": "Beralih ke Akun Cerdas", + "switch_to_smart_account": "Beralih ke akun cerdas", "rename_account": "Ganti nama akun", "addresses": "Alamat", "headers": { @@ -5598,6 +5677,10 @@ "error_description": "Instalasi {{snap}} gagal." }, "earn": { + "claimable_bonus_tooltip": "An annual bonus claimable daily from your wallet.", + "earn_a_percentage_bonus": "Earn a {{percentage}}% bonus", + "claimable_bonus": "Claimable bonus", + "claim_bonus": "Claim bonus", "empty_state_cta": { "heading": "Pinjamkan {{tokenSymbol}} dan hasilkan", "body": "Pinjamkan {{tokenSymbol}} Anda dengan {{protocol}} dan dapatkan", @@ -5681,21 +5764,36 @@ "fee": "Biaya" }, "musd_conversion": { - "convert_to_musd": "Convert to mUSD", + "ok": "Oke", + "continue": "Continue", + "convert_and_get_percentage_bonus": "Konversi dan dapatkan {{percentage}}%", + "get_a_percentage_musd_bonus": "Dapatkan bonus {{percentage}}% mUSD", + "convert": "Konversikan", "toasts": { - "converting": "Converting {{token}} → mUSD", + "converting": "Mengonversi {{token}} → mUSD", "eta": "~{{time}}", - "delivered": "Your mUSD has been delivered!", - "failed": "mUSD conversion failed" + "delivered": "mUSD telah tiba!", + "failed": "Konversi mUSD gagal" }, "education": { - "heading": "Dapatkan reward dengan mUSD", - "description": "Convert your USDC, USDT, or DAI for mUSD, MetaMask’s dollar-backed stablecoin.Earn points every time you convert or hold $100.", - "continue_button": "Mulai" + "heading": "DAPATKAN {{percentage}}% PADA\nSTABLECOIN", + "description": "Convert your stablecoins to mUSD, MetaMask’s US dollar-backed stablecoin, and receive up to a {{percentage}}% bonus.", + "terms_apply": "Terms apply.", + "primary_button": "Mulai", + "secondary_button": "Tidak sekarang" }, - "earn_points_daily": "Earn points daily", - "buy_musd": "Buy mUSD", - "get_musd": "Get mUSD" + "buy_musd": "Beli mUSD", + "get_musd": "Dapatkan mUSD", + "boost_title": "Get {{percentage}}% on your stablecoins", + "boost_description": "Convert your stablecoins to mUSD and receive up to a {{percentage}}% bonus.", + "powered_by_relay": "Didukung oleh Relay" + }, + "bonus_claim": { + "toasts": { + "claiming": "Your mUSD bonus is processing", + "delivered": "Your mUSD bonus is here!", + "failed": "Bonus claim failed" + } }, "rewards": { "rewards_tag_label": "Reward", @@ -5711,22 +5809,22 @@ "stake": "Stake", "earn": "Dapatkan", "tron": { - "stake_completed": "Staking completed", - "stake_completed_description": "Your staking transaction has been completed successfully.", - "stake_failed": "Staking failed", + "stake_completed": "Stake selesai", + "stake_completed_description": "Transaksi stake telah berhasil diselesaikan.", + "stake_failed": "Stake gagal", "unstake_completed": "Pembatalan stake selesai", - "unstake_completed_description": "Your unstaking transaction has been completed successfully.", - "unstake_failed": "Unstaking failed", + "unstake_completed_description": "Transaksi pembatalan stake telah berhasil diselesaikan.", + "unstake_failed": "Pelepasan staking gagal", "bandwidth": "Bandwidth", "energy": "Energi", "estimated_annual_reward": "Estimasi reward tahunan", - "trx_locked_for": "TRX locked for", - "trx_locked_for_minimum_time": "~3 days", - "trx_released_in": "TRX released in", - "trx_released_in_minimum_time": "~14 days", + "trx_locked_for": "TRX dikunci selama", + "trx_locked_for_minimum_time": "~3 hari", + "trx_released_in": "TRX dirilis dalam", + "trx_released_in_minimum_time": "~14 hari", "fee": "Biaya", "errors": { - "insufficient_balance": "You don't have enough resource balance to do this action." + "insufficient_balance": "Anda tidak memiliki cukup saldo sumber daya untuk melakukan tindakan ini." } }, "stake_eth": "Stake ETH", @@ -5772,12 +5870,19 @@ "learn_more_with_period": "Selengkapnya." }, "stake_your_trx_cta": { - "title": "Lend Tron and earn", - "description_start": "Stake your Tron and earn ", + "title": "Pinjamkan Tron dan hasilkan", + "description_start": "Stake Tron dan hasilkan ", "description_end": " setiap tahun.", "learn_more": "Selengkapnya.", "earn_button": "Dapatkan" }, + "trx_learn_more": { + "title": "Stake TRX and earn", + "stake_any_amount": "Stake any amount of TRX.", + "earn_trx_rewards": "Dapatkan reward TRX.", + "earn_trx_rewards_description": "Mulailah menghasilkan segera setelah Anda melakukan stake. Reward akan terakumulasi secara otomatis.", + "flexible_unstaking_description": "Unstake anytime. Unstaking takes 14 days to process." + }, "day": { "zero": "", "one": "hari", @@ -5981,7 +6086,7 @@ "switch_account_type": "Pembaruan akun", "approve": "Setujui permintaan", "perps_deposit": "Tambahkan dana", - "predict_deposit": "Tambahkan dana predict", + "predict_deposit": "Tambahkan dana Prediction", "predict_withdraw": "Tarik" }, "sub_title": { @@ -6002,14 +6107,15 @@ "transaction_fee": "Kami akan menukar token Anda dengan USDC di HyperCore, jaringan yang digunakan oleh Perp. Penyedia swap mungkin akan mengenakan biaya, tetapi MetaMask tidak." }, "predict_deposit": { - "transaction_fee": "Kami akan menukar token Anda dengan USDC.e di Polygon, jaringan yang digunakan oleh Predict. Penyedia swap mungkin akan mengenakan biaya, tetapi MetaMask tidak." + "transaction_fee": "Kami akan menukar token Anda dengan USDC.e di Polygon, jaringan yang digunakan oleh Predictions. Penyedia swap mungkin akan mengenakan biaya, tetapi MetaMask tidak." }, "musd_conversion": { - "transaction_fee": "mUSD conversion fees include network costs and may include provider fees." + "transaction_fee": "Biaya konversi mUSD mencakup biaya jaringan dan mungkin termasuk biaya penyedia layanan." }, "title": { "transaction_fee": "Biaya" - } + }, + "network_fee": "Biaya jaringan bergantung pada seberapa sibuk jaringan dan seberapa rumit transaksi Anda." }, "spending_cap": "Batas penggunaan", "withdraw": "Tarik", @@ -6026,7 +6132,7 @@ "qr_get_sign": "Get signature", "qr_scan_text": "Pindai dengan dompet perangkat keras", "sign_with_ledger": "Tandatangani dengan Ledger", - "smart_account": "Akun Cerdas", + "smart_account": "Akun cerdas", "smart_contract": "Kontrak cerdas", "standard_account": "Standard account", "siwe_message": { @@ -6061,7 +6167,7 @@ "unavailable": "Tidak tersedia" }, "7702_functionality": { - "smartAccountLabel": "Akun Cerdas", + "smartAccountLabel": "Akun cerdas", "standardAccountLabel": "Standard account", "switch": "Alihkan", "switchBack": "Alihkan kembali", @@ -6078,7 +6184,7 @@ }, "includes_transaction": "Mencakup {{transactionCount}} transaksi", "useSmartAccount": "Gunakan akun cerdas", - "successful": "Berhasil!", + "successful": "Berhasil", "success_message": "Akun Anda akan diperbarui ke akun cerdas pada transaksi berikutnya." }, "edit_spending_cap_modal": { @@ -6086,9 +6192,9 @@ "cancel": "Batalkan", "description": "Masukkan jumlah yang paling sesuai untuk digunakan atas nama Anda.", "invalid_number_error": "Batas penggunaan harus berupa angka", - "no_empty_error": "Batas penggunaan tidak boleh kosong", - "no_extra_decimals_error": "Batas penggunaan tidak boleh memiliki desimal lebih banyak dari token", - "no_zero_error": "Batas penggunaan tidak boleh 0", + "no_empty_error": "Spending cap can't be empty", + "no_extra_decimals_error": "Spending cap can't have more decimals than the token", + "no_zero_error": "Spending cap can't be 0", "no_zero_error_decrease_allowance": "Batas penggunaan 0 tidak berpengaruh pada metode 'decreaseAllowance'", "no_zero_error_increase_allowance": "Batas penggunaan 0 tidak berpengaruh pada metode 'increaseAllowance'", "save": "Simpan", @@ -6119,7 +6225,7 @@ "edit_amount_done": "Lanjutkan", "deposit_edit_amount_done": "Tambahkan dana", "deposit_edit_amount_predict_withdraw": "Tarik", - "deposit_edit_amount_musd_conversion": "Convert to mUSD" + "deposit_edit_amount_musd_conversion": "Konversikan ke mUSD" }, "change_in_simulation_modal": { "title": "Hasil telah berubah", @@ -6144,6 +6250,8 @@ "confirm_swap": "Swap", "terms_and_conditions": "Syarat & Ketentuan", "select_token": "Pilih token", + "no_tokens_found": "Tidak ada token yang ditemukan", + "no_tokens_found_description": "We couldn't find any tokens with this name. Try a different search.", "select_network": "Pilih jaringan", "all_networks": "Semua jaringan", "num_networks": "{{numNetworks}} jaringan", @@ -6151,6 +6259,7 @@ "select_all_networks": "Pilih semua", "deselect_all_networks": "Batal pilih semua", "see_all": "Lihat semua", + "all": "Semua", "apply": "Terapkan", "slippage": "Selip", "slippage_info": "Jika harga berubah antara waktu penempatan dan konfirmasi order Anda, ini disebut “selip”. Pertukaran akan otomatis dibatalkan jika selip melebihi toleransi yang Anda tetapkan di sini.", @@ -6191,9 +6300,9 @@ "title": "Bridge", "submitting_transaction": "Mengirim", "fetching_quote": "Mengambil kuotasi", - "fee_disclaimer": "Termasuk biaya MM {{feePercentage}}%.", + "fee_disclaimer": "Includes {{feePercentage}}% MetaMask fee.", "no_mm_fee": "Tidak ada biaya MM", - "no_mm_fee_disclaimer": "Tidak ada biaya MM saat menukar ke {{destTokenSymbol}}.", + "no_mm_fee_disclaimer": "No MetaMask fee swapping into {{destTokenSymbol}}.", "hardware_wallet_not_supported": "Dompet perangkat keras belum didukung. Gunakan hot wallet untuk melanjutkan.", "hardware_wallet_not_supported_solana": "Dompet perangkat keras belum didukung untuk Solana. Gunakan hot wallet untuk melanjutkan.", "price_impact_info_title": "Dampak harga", @@ -6208,15 +6317,7 @@ "approval_tooltip_content": "Anda mengizinkan akses ke jumlah yang ditentukan, {{amount}} {{symbol}}. Kontrak tidak akan mengakses dana tambahan apa pun.", "minimum_received": "Minimum received", "minimum_received_tooltip_title": "Minimum received", - "minimum_received_tooltip_content": "Jumlah minimum yang akan Anda terima jika harga berubah selama transaksi diproses, berdasarkan toleransi selip. Ini merupakan estimasi dari penyedia likuiditas kami. Jumlah akhir dapat berbeda.", - "verified_token": "Token terverifikasi", - "price": "Harga", - "percent_change": "Perubahan persentase", - "volume": "Volume", - "market_cap_fdv": "Kap pasar (FDV)", - "listed_on": "Terdaftar di", - "centralized_exchanges": "Bursa tersentralisasi", - "contract_address": "Alamat kontrak" + "minimum_received_tooltip_content": "Jumlah minimum yang akan Anda terima jika harga berubah selama transaksi diproses, berdasarkan toleransi selip. Ini merupakan estimasi dari penyedia likuiditas kami. Jumlah akhir dapat berbeda." }, "quote_expired_modal": { "title": "Kuotasi baru tersedia", @@ -6290,12 +6391,12 @@ "title": "Pemulihan dompet", "login_with_social": "Masuk dengan akun sosial", "setup": "Atur", - "secret_recovery_phrase": "Frasa pemulihan rahasia {{num}}", + "secret_recovery_phrase": "Secret Recovery Phrase {{num}}", "back_up": "Cadangkan", "reveal": "Tampilkan", "social_recovery_title": "PEMULIHAN {{authConnection}}", "social_recovery_enable": "Diaktifkan", - "social_login_description": "Gunakan login {{authConnection}} dan kata sandi MetaMask untuk memulihkan akun dan frasa pemulihan rahasia.", + "social_login_description": "Gunakan login {{authConnection}} dan kata sandi MetaMask untuk memulihkan akun dan Frasa Pemulihan Rahasia.", "srps_title": "FRASA PEMULIHAN RAHASIA", "srps_description": "Dompet Anda akan sangat terlindungi jika kedua metode pemulihan diaktifkan. Jika salah satu gagal, metode lainnya akan membantu Anda memulihkan dompet." }, @@ -6349,7 +6450,7 @@ "section_1_title": "Apa itu akun multichain?", "section_1_description": "Satu akun, alamat di semua jaringan yang didukung MetaMask. Jadi, sekarang Anda bisa menggunakan Ethereum, Solana, dan lainnya tanpa perlu berganti akun.", "section_2_title": "Alamat sama, lebih banyak jaringan", - "section_2_description": "Kami telah mengelompokkan akun Anda, jadi, tetap gunakan MetaMask seperti sebelumnya. Dana Anda aman dan tidak berubah", + "section_2_description": "Kami telah mengelompokkan akun Anda, jadi, tetap gunakan MetaMask seperti sebelumnya. Dana Anda aman dan tidak berubah.", "view_accounts_button": "Lihat akun", "learn_more_button": "Pelajari selengkapnya", "setting_up_accounts": "Mengatur akun Anda" @@ -6511,8 +6612,10 @@ }, "card_onboarding": { "title": "Gunakan\ndan\nDapatkan", - "description": "Kartu MetaMask merupakan cara cepat dan mudah untuk menggunakan kripto seperti uang tunai dan dapatkan reward.", + "description": "Kartu MetaMask merupakan cara cepat dan mudah untuk menggunakan kripto dan mendapatkan cashback hingga 3%.", "apply_now_button": "Daftar sekarang", + "login_button": "Masuk", + "not_now_button": "Tidak sekarang", "sign_up": { "title": "Ayo mulai", "description": "Buat akun Kartu MetaMask, yang disediakan oleh Crypto Life. Ini akan terpisah dari akun MetaMask Anda.", @@ -6540,6 +6643,7 @@ "phone_number_label": "Masukkan nomor telepon", "country_area_code_label": "Kode area negara", "invalid_phone_number": "Nomor telepon tidak valid", + "invalid_us_phone_number": "Masukkan nomor telepon AS yang valid (10 digit) untuk melanjutkan.", "legal_terms": "Dengan melanjutkan, Anda setuju menerima SMS untuk memverifikasi nomor telepon." }, "confirm_phone_number": { @@ -6576,8 +6680,8 @@ "terms": "Persetujuan umumnya memerlukan waktu sekitar 12 jam. Kami akan memberi tahu Anda setelah keputusan dibuat." }, "verifying_veriff_kyc": { - "title": "Memverifikasi identitas Anda", - "description": "Harap tunggu selagi kami memverifikasi identitas Anda.", + "title": "Menunggu persetujuan", + "description": "Mitra kami perlu memverifikasi identitas Anda untuk menyetujui permohonan Anda.", "helper_text": "Proses ini biasanya hanya membutuhkan beberapa detik. Mohon jangan tutup aplikasinya." }, "verifying_registration": { @@ -6614,7 +6718,7 @@ }, "physical_address": { "title": "Tambahkan alamat Anda", - "description": "Masukkan alamat rumah Anda. Jika disetujui, kami akan mengirimkan kartu fisik Anda ke sini.", + "description": "Masukkan alamat rumah Anda saat ini. Kami akan menggunakan ini untuk keperluan verifikasi.", "address_line_1_label": "Baris alamat 1", "address_line_2_label": "Baris alamat 2", "city_label": "Kota", @@ -6622,7 +6726,7 @@ "zip_code_label": "Kode zip", "country_label": "Negara", "electronic_consent_1": "Saya menyetujui Persetujuan dan Pengungkapan Undang-Undang E-Sign, dan menerima semua komunikasi secara elektronik. ", - "electronic_consent_2": "View document(PDF)" + "electronic_consent_2": "Lihat dokumen (PDF)" }, "mailing_address": { "title": "Alamat surat", @@ -6668,22 +6772,24 @@ } }, "card_home": { + "title": "Card", + "available_balance": "Saldo tersedia", "error_title": "Tidak dapat mengambil data", "error_description": "Tampaknya ada masalah yang mencegah Anda melihat konten di halaman ini. Periksa koneksi Anda atau coba segarkan halaman.", "try_again": "Coba lagi", - "limited_spending_warning": "Kemampuan pemakaian Anda mungkin terbatas. Untuk menyesuaikan limit, buka {{manageCard}}", + "limited_spending_warning": "Kemampuan pemakaian Anda mungkin terbatas. Untuk menyesuaikan limit, buka ", "add_funds": "Tambahkan dana", "change_asset": "Ubah aset", "enable_card_button_label": "Aktifkan kartu", "enable_assets_button_label": "Aktifkan aset", "spending_limit_warning": "Batas penggunaan hampir tercapai. Perbarui untuk menghindari penolakan.", "logout": "Keluar", - "logout_description": "Keluar dari akun Kartu MetaMask", "logout_confirmation_title": "Keluar dari Kartu?", "logout_confirmation_message": "Yakin ingin keluar dari akun Kartu MetaMask?", "logout_confirmation_cancel": "Batal", "logout_confirmation_confirm": "Keluar", "enable_card_error": "Gagal mengaktifkan kartu. Coba lagi nanti.", + "view_card_details_error": "Unable to load card details. Please try again.", "warnings": { "close_spending_limit": { "title": "Batas penggunaan hampir tercapai", @@ -6706,11 +6812,21 @@ "blocked": { "title": "Kartu Anda diblokir", "description": "Hubungi dukungan untuk membuka blokir kartu Anda" + }, + "kyc_pending": { + "title": "Verifikasi sedang berlangsung", + "description": "Your identity verification is being reviewed. This typically takes less than 12 hours." + } + }, + "messages": { + "card_provisioning": { + "title": "Card being created", + "description": "Your card is being created. This may take a few moments." } }, "kyc_status": { "pending": { - "title": "Verifikasi sedang Berlangsung", + "title": "Verifikasi sedang berlangsung", "description": "Verifikasi identitas Anda sedang diproses. Proses ini umumnya memerlukan waktu beberapa menit. Periksa kembali sebentar lagi untuk mengaktifkan kartu Anda." }, "rejected": { @@ -6729,33 +6845,46 @@ "ok_button": "Oke" }, "manage_card_options": { - "manage_spending_limit": "Kelola batas penggunaan", + "view_card_details": "View card details", + "hide_card_details": "Hide card details", + "view_card_details_description": "Card number, expiration and CVV", + "manage_spending_limit": "Manage limit", "manage_spending_limit_description_restricted": "Penggunaan terbatas aktif", "manage_spending_limit_description_full": "Akses penuh aktif", "manage_card": "Kelola kartu", - "advanced_card_management_description": "Lihat detail kartu, transaksi, dan lainnya", + "advanced_card_management_description": "See activity, cashback, freeze card, and more", "travel_title": "MetaMask Travel", - "travel_description": "Pesan hotel dengan diskon hingga 60% dibandingkan Expedia", - "card_tos_title": "Syarat dan Ketentuan Kartu", - "card_tos_description": "Bacalah syarat penyedia kartu" + "travel_description": "Book hotels with up to 70% discounts", + "card_tos_title": "Terms and conditions" } }, "card_spending_limit": { "title_change_token": "Ubah token dan jaringan", "title_enable_token": "Aktifkan token", + "title_onboarding": "Aktifkan penggunaan", + "setup_title": "Set up your card", + "setup_description": "Select the token you'd like to use and set a limit for how much you can spend.", + "asset_label": "Aset", + "limit_label": "Limit", + "other_token": "Other", "full_access_title": "Akses penuh", - "full_access_description": "Kartu Anda dapat menggunakan dana Anda secara otomatis, tanpa meminta persetujuan setiap saat.", - "restricted_limit_title": "Penggunaan terbatas", - "restricted_limit_description": "Anda harus kembali dan membayar biaya jaringan setiap kali ingin meningkatkan batas.", + "full_access_description": "Your card can use your funds automatically without asking for approval each time.", + "restricted_limit_title": "Batas penggunaan", + "restricted_limit_description": "Anda hanya dapat menggunakan hingga batas ini. Anda akan dikenakan biaya jaringan setiap kali batas ini diperbarui.", "edit_limit": "Edit batas", "confirm_new_limit": "Konfirmasikan", "cancel": "Batalkan", + "skip": "Lewati untuk saat ini", "set_new_limit": "Atur batas", "dismiss": "Lewatkan", "update_success": "Batas penggunaan berhasil diperbarui", "update_error": "Gagal memperbarui batas penggunaan", "solana_not_supported": "Aktifkan token Solana di card.metamask.io", - "select_token": "Pilih token" + "select_token": "Pilih token", + "loading": "Memuat token yang tersedia...", + "load_error": "Tidak dapat memuat token. coba lagi.", + "retry": "Coba lagi", + "on_linea": "di Linea" }, "change_asset": { "title": "Ubah token dan jaringan", @@ -6793,6 +6922,7 @@ "signup_button": "Daftar", "errors": { "invalid_credentials": "Detail login tidak valid", + "invalid_otp_code": "Kode salah, coba lagi", "unknown_error": "Kesalahan tidak dikenal, coba lagi nanti", "email_required": "Email diperlukan", "password_required": "Kata sandi diperlukan", @@ -6811,7 +6941,7 @@ "description_without_phone_number": "Kami telah mengirimkan kode konfirmasi ke nomor telepon Anda. Masukkan kode untuk melanjutkan.", "confirm_code_label": "Kode konfirmasi", "confirm_button": "Konfirmasikan", - "back_to_login_button": "Kembali ke Login", + "back_to_login_button": "Kembali ke login", "didnt_receive_code": "Belum menerima kode? ", "resend_verification": "Kirim ulang", "resend_cooldown": "Kirim ulang tersedia dalam {{seconds}} detik" @@ -6839,8 +6969,8 @@ }, "rewards": { "auth_fail_title": "Kesalahan tidak dikenal.", - "auth_fail_description": "Terjadi kesalahan tidak dikenal saat mengautentikasi akun ini dengan program reward. Coba lagi nanti.", - "failed_to_authenticate": "Gagal mengautentikasi dengan program reward", + "auth_fail_description": "Terjadi kesalahan tidak dikenal saat mengautentikasi akun ini dengan MetaMask Rewards. Coba lagi nanti.", + "failed_to_authenticate": "Gagal melakukan autentikasi dengan MetaMask Rewards", "not_implemented": "Segera hadir", "not_implemented_season_summary": "Ringkasan musim akan segera hadir", "optin_error": { @@ -6867,6 +6997,10 @@ "error_fetching_description": "Periksa koneksi Anda dan coba lagi.", "retry_button": "Coba lagi" }, + "linea_tokens": { + "default_title": "$LINEA", + "title_earned": "Anda memperoleh {{amount}} $LINEA" + }, "upcoming_rewards_error": { "error_fetching_title": "Reward tidak dapat dimuat", "error_fetching_description": "Periksa koneksi Anda dan coba lagi.", @@ -6898,6 +7032,15 @@ "claim_reward_error": { "title": "Gagal mengklaim reward" }, + "metal_card_claim": { + "title": "Tukarkan reward Anda", + "description": "MetaMask Metal Card bergantung pada kelayakan dan tidak tersedia di semua wilayah. Jika Anda tidak memenuhi syarat, Anda akan menerima reward merchandise premium eksklusif sebagai gantinya.", + "contact_info": "Bagikan informasi kontak Anda dan Anda akan mendapatkan balasan dalam waktu 2 minggu dari @MidwitMilhouse di Telegram atau christian.montoya@consensys.net.", + "email_label": "Email", + "email_validation_error": "Masukkan alamat email yang valid", + "telegram_label": "Nama pengguna Telegram", + "telegram_placeholder": "Opsional" + }, "accounts_opt_in_state_error": { "error_fetching_title": "Akun tidak dapat dimuat", "error_fetching_description": "Periksa koneksi Anda dan coba lagi.", @@ -6979,7 +7122,7 @@ "gtm_title": "Reward ada di sini", "gtm_description": "Dapatkan poin untuk aktivitas Anda. \nLewati level untuk membuka reward.", "gtm_confirm": "Mulai", - "intro_title": "Musim 1 \nTayang", + "intro_title": "Musim 1 \ntayang", "intro_description": "Dapatkan poin untuk aktivitas Anda. \nLewati level untuk membuka reward.", "intro_confirm": "Klaim 250 poin", "intro_confirm_geo_loading": "Memeriksa wilayah...", @@ -7052,12 +7195,12 @@ "dashboard_modal_info": { "active_account": { "title": "Jangan lewatkan", - "description": "Tambahkan akun untuk mulai memperoleh poin dari aktivitas Anda.", + "description": "Add your account to Rewards.", "confirm": "Tambah akun" }, "multiple_unlinked_accounts": { - "title": "Mulai memperoleh poin", - "description": "Tambahkan akun Anda untuk melacak reward dengan cepat.", + "title": "Jangan lewatkan", + "description": "Add your accounts to Rewards.", "confirm": "Tambah akun" }, "account_not_supported": { @@ -7110,10 +7253,10 @@ } }, "predict": { - "title": "Pasar prediksi", + "title": "Prediksi", "description": "20 poin per prediksi $10", "sheet": { - "title": "Pasar prediksi", + "title": "Prediksi", "points": "20 poin per $10", "description": "Dapatkan poin pada setiap $10 yang Anda perdagangkan.", "cta_label": "Jelajahi pasar" @@ -7191,6 +7334,19 @@ "time_left": "tersisa", "expired": "Kedaluwarsa" }, + "end_of_season_rewards": { + "confirm_label_default": "Konfirmasikan", + "confirm_label_access": "Akses", + "redeem_success_title": "Reward telah ditukar", + "metal_card_claim_success": "Informasi kontak telah dikonfirmasi", + "linea_tokens_claim_success": "Alamat telah dikonfirmasi", + "arriving_soon": "Segera tiba", + "check_back_soon": "Periksa kembali secepatnya untuk mengklaimnya", + "redeem_failure_title": "Penukaran gagal", + "redeem_failure_description": "Coba lagi nanti.", + "reward_details": "Detail Reward", + "select_account_description": "Pilih akun tempat Anda ingin reward ini dikirimkan. Token akan didistribusikan dalam waktu dua minggu." + }, "animation": { "could_not_load": "Tidak dapat memuat" } @@ -7257,13 +7413,13 @@ "still_connecting_network": "Masih terhubung ke {{networkName}}...", "unable_to_connect_network": "Tidak dapat terhubung ke {{networkName}}.", "update_rpc": "Perbarui RPC", + "switch_to_metamask_default_rpc": "Switch to MetaMask default RPC", "check_network_connectivity": "Periksa konektivitas jaringan Anda.", - "check_network_connectivity_or": "Periksa konektivitas jaringan Anda atau" + "check_network_connectivity_or": "Periksa konektivitas jaringan Anda atau", + "updated_to_metamask_default": "Updated to MetaMask default" }, "trending": { "title": "Explore", - "view_all": "View all", - "tokens": "Token", "trending_tokens": "Trending tokens", "price_change": "Price change", "all_networks": "Semua jaringan", @@ -7295,6 +7451,10 @@ "title": "Trending tokens is not available", "description": "We can't fetch this page right now", "try_again": "Coba lagi" + }, + "empty_search_result_state": { + "title": "Tidak ada token yang ditemukan", + "description": "We were not able to find this token" } }, "ota_update_modal": { diff --git a/locales/languages/ja.json b/locales/languages/ja.json index 880a5e3e38c2..fff76730f671 100644 --- a/locales/languages/ja.json +++ b/locales/languages/ja.json @@ -8,7 +8,7 @@ "increment": "Increment Reduxカウンター" }, "pet_name": { - "list_count_text": "Pet names on this network", + "list_count_text": "このネットワークのペット名", "add_pet_name_button": "Add pet name", "address": "アドレス", "address_placeholder": "0x...", @@ -193,11 +193,10 @@ "connector": "at" }, "autocomplete": { - "placeholder": "トークン、サイト、またはアドレスで検索", + "placeholder": "サイトまたはアドレスで検索", "recents": "最近", "favorites": "お気に入り", - "sites": "サイト", - "tokens": "トークン" + "sites": "サイト" }, "navigation": { "back": "戻る", @@ -306,7 +305,7 @@ "get_started": "開始" }, "onboarding_wizard": { - "skip_tutorial": "Skip tutorial", + "skip_tutorial": "チュートリアルをスキップ", "coachmark": { "action_back": "いいえ、結構です", "action_next": "ツアーを見る", @@ -330,7 +329,7 @@ "content3": "アカウント名を編集します。" }, "step4": { - "title": "Main menu", + "title": "メインメニュー", "content1": "このメニューからトランザクション履歴、設定、サポートにアクセスできます。", "content2": "アカウントで他の操作を行ったり、MetaMaskの設定にアクセスすることもできます。" }, @@ -596,9 +595,9 @@ "transaction_activity": "アクティビティ", "request_feature": "機能をリクエスト", "submit_feedback_message": "送信するフィードバックのタイプを選択してください。", - "submit_bug": "Bug report", + "submit_bug": "バグの報告", "submit_general_feedback": "一般", - "share_address": "Share my public address", + "share_address": "パブリックアドレスを共有", "view_in_etherscan": "Etherscanで表示", "view_in": "表示方法:", "browser": "ブラウザ", @@ -612,12 +611,13 @@ "lock_cancel": "いいえ", "feedback": "フィードバック", "metamask_support": "MetaMaskサポート", - "public_address": "Public address" + "public_address": "パブリックアドレス" }, "send": { "available": "使用可能", "invalid_value": "無効な値", "insufficient_funds": "資金不足", + "insufficient_balance_to_cover_fee": "Insufficient balance to cover fees", "continue": "続行", "unit": "単位", "units": "単位", @@ -643,8 +643,8 @@ "no_tokens_available": "使用可能なトークンがありません", "sign": "署名", "network_not_found_title": "ネットワークが見つかりません", - "network_not_found_description": "ウォレットにチェーンID {{chain_id}} のネットワークが見つかりません。はじめにネットワークを追加してください。", - "network_missing_id": "チェーンIDがありません。", + "network_not_found_description": "Network with chain ID {{chain_id}} not found in your wallet. Please add the network first.", + "network_missing_id": "Missing chain ID.", "search_tokens": "トークンを検索", "search_tokens_and_nfts": "トークンとNFTを検索", "tokens": "トークン", @@ -675,13 +675,13 @@ "limitError": "デポジット上限の確認に失敗しました。後程もう一度お試しください。" }, "token_modal": { - "select_a_token": "トークンを選択", + "select_a_token": "トークンの選択", "select_token": "トークンを選択", "search_by_name_or_address": "トークンを名前またはアドレスで検索", "no_tokens_found": "「{{searchString}}」に一致するトークンがありません", "unsupported_token_title": "利用できません", - "unsupported_token_description": "This token may not be available in your region or supported by any local payment providers", - "error_loading_tokens": "Unable to load tokens. Please try again later." + "unsupported_token_description": "このトークンはお住まいの地域では利用できないか、現地の決済サービス業者が対応していない可能性があります。", + "error_loading_tokens": "トークンを読み込めません。後でもう一度お試しください。" }, "networks_filter_bar": { "all_networks": "すべてのネットワーク" @@ -696,12 +696,12 @@ "title": "設定", "view_order_history": "注文履歴を表示", "contact_support": "サポートへのお問い合わせ", - "log_out": "Log out of Transak", + "log_out": "Transakからログアウト", "logged_out_success": "ログアウトしました", "error_sdk_not_initialized": "SDKが初期化されていません", "logged_out_error": "ログアウト中にエラーが発生しました", - "more_ways_to_buy": "More ways to buy", - "more_ways_to_buy_description": "Switch to the classic version" + "more_ways_to_buy": "その他の購入方法", + "more_ways_to_buy_description": "クラシックバージョンに切り替える" }, "region_modal": { "select_a_region": "地域を選択", @@ -714,7 +714,7 @@ "no_state_results": "{{searchString}}に一致する州がありません" }, "payment_modal": { - "select_a_payment_method": "Select a payment method" + "select_a_payment_method": "支払方法を選択" }, "payment_duration": { "instant": "即時", @@ -805,7 +805,7 @@ "button": "同意して続行" }, "additional_verification": { - "title": "Additional verification", + "title": "追加の認証", "paragraph_1": "入金額が大きい場合、有効な身分証明書 (運転免許証など) とリアルタイムの自撮り写真が必要になります。", "paragraph_2": "認証を完了するには、カメラへのアクセスを有効にする必要があります。", "button": "続行" @@ -832,7 +832,7 @@ "dob_invalid": "有効な生年月日を入力してください", "ssn_required": "社会保障番号は必須項目です", "unexpected_error": "予期せぬエラーが発生しました。もう一度お試しください。", - "phone_already_registered": "This phone number is already in use by {{email}}. Log in using this email to continue.", + "phone_already_registered": "この電話番号はすでに{{email}}により使用されています。続行するには、このメールを使用してログインしてください。", "login_with_email": "メールアドレスでログイン" }, "enter_address": { @@ -844,7 +844,7 @@ "address_line_2": "住所2(任意)", "state": "州/地域", "city": "市", - "postal_code": "Postal/zip code", + "postal_code": "郵便番号", "country": "国", "select_state": "州を選択", "address_line_1_required": "住所1は必須項目です", @@ -854,7 +854,7 @@ "city_invalid": "有効な市を入力してください", "state_required": "州/地域は必須項目です", "state_invalid": "有効な州を入力してください", - "postal_code_required": "Postal/zip code is required", + "postal_code_required": "郵便番号は必須項目です", "postal_code_invalid": "有効な郵便番号を入力してください", "unexpected_error": "予期しないエラーが発生しました。" }, @@ -903,7 +903,7 @@ "cancel_order_button": "注文をキャンセル" }, "order_details": { - "title": "Deposit order", + "title": "デポジットの注文", "error_title": "入金の注文でエラーが発生しました", "error_message": "予期せぬエラーが発生しました。" }, @@ -955,25 +955,29 @@ "fetch_payment_methods": "支払い方法の取得中に問題が発生しました。", "fetch_user_details": "ユーザー情報の取得中に問題が発生しました。", "try_again": "再試行してください", - "error_details_title": "Error details", + "error_details_title": "エラーの詳細", "see_more": "もっと見る" } }, "perps": { - "basic_functionality_disabled_title": "Perps is not available", + "basic_functionality_disabled_title": "パーペチュアルは利用できません", "title": "パーペチュアル", "perps_trading": "パーペチュアル取引", "perp_account_balance": "パーペチュアルアカウント残高", "manage_balance": "残高の管理", "total_balance": "合計残高", "available_balance": "利用可能残高", - "margin_used": "利用中証拠金", + "margin_used": "利用中の証拠金", "gtm_content": { "title": "パーペチュアルが登場", "title_description": "最大40倍のレバレッジでロングまたはショートが可能。ワンクリックでアカウントに入金できます。", "not_now": "後で", "try_now": "開始" }, + "discovery_banner": { + "title": "{{symbol}}のパーペチュアルを取引", + "subtitle": "損益を最大{{leverage}}増加" + }, "today": "今日", "yesterday": "昨日", "unrealized_pnl": "含み損益", @@ -1199,7 +1203,7 @@ "short": "{{asset}}をショート" }, "tpsl_modal": { - "title": "利益確定 & ストップロス", + "title": "利益確定・ストップロス", "save": "保存", "current_price": "現在の価格: {{price}}", "on": "オン", @@ -1306,7 +1310,7 @@ "cancel": "キャンセル", "margin": "証拠金", "includes_pnl": "損益込み", - "pnl": "損益", + "pnl": "損益額", "estimated_pnl": "予想損益", "fees": "手数料", "receive": "受取額", @@ -1414,6 +1418,7 @@ "failedToEstablishAllMids": "グローバルallMidsの配信登録を設定できませんでした", "failedToEstablishMarketData": "{{symbol}}の市場データ配信登録を設定できませんでした", "failed_to_toggle_network": "ネットワークを切り替えられませんでした", + "failed_to_switch_provider": "プロバイダーの切り替えに失敗しました", "noAccountSelected": "アカウントが選択されていません", "unsupportedMethod": "サポートされていない方法: {{method}}", "invalidAddressFormat": "無効なアドレス形式: {{address}}", @@ -1452,6 +1457,24 @@ "orderLeverageReductionFailed": "レバレッジを下げることはできません", "insufficientLiquidity": "流動性不足のため注文を執行できません。リミット注文を利用するか、少し時間をおいて再試行してください。", "connectionTimeout": "接続がタイムアウトしました。ネットワークを確認して再試行してください。", + "clientReinitializing": "サービスを再初期化しています。少し時間をおいて、もう一度お試しください。", + "transferFailed": "トークンを送金できませんでした。もう一度お試しください。", + "swapFailed": "トークンを交換できませんでした。もう一度お試しください。", + "spotPairNotFound": "取引ペアは現在利用できません", + "priceUnavailable": "価格データが利用できません。再読み込みして、もう一度お試しください。", + "batchCancelFailed": "一部の注文をキャンセルできませんでした。もう一度お試しください。", + "batchCloseFailed": "一部のポジションをクローズできませんでした。もう一度お試しください。", + "insufficientMargin": "この取引を実行するには証拠金が不足しています。資金を追加するか、ポジションサイズを縮小することを検討してください。", + "reduceOnlyViolation": "この注文をするとポジションが拡大します。ポジション縮小の注文のみが許可されています。", + "positionWouldFlip": "この注文をするとポジションの方向が逆になります。まずは既存のポジションをクローズしてください。", + "marginAdjustmentFailed": "証拠金を調整できませんでした。もう一度お試しください。", + "tpslUpdateFailed": "利益確定/ストップロスを更新できませんでした。もう一度お試しください。", + "orderRejected": "注文が拒否されました。パラメーターを確認して、もう一度お試しください。", + "slippageExceeded": "価格が許容幅を超えて変動しました。リミット注文を利用してみるか、スリッページ許容幅を拡大してください。", + "rateLimitExceeded": "リクエストが多すぎます。少し時間をおいて、もう一度お試しください。", + "serviceUnavailable": "現在サービスをご利用いただけません。後ほど再試行してください。", + "networkErrorSimple": "ネットワークエラーが発生しました。接続を確認して再試行してください。", + "insufficientBalance": "この操作を完了するには残高が不足しています。利用可能な資金を確認してください。", "connectionFailed": { "title": "パーペチュアルに接続できませんでした", "description": "すぐにオンラインに戻せるように対応しています", @@ -1521,7 +1544,7 @@ "total_balance": "合計残高", "available_balance": "利用可能残高", "margin_used": "利用中の証拠金", - "total_unrealized_pnl": "未実現損益合計", + "total_unrealized_pnl": "未実現損益総額", "unrealized_pnl": "含み損益" }, "tpsl": { @@ -1697,7 +1720,14 @@ "retry_connection": "接続を再試行", "retrying_connection": "接続中...", "connecting_to_perps": "パーペチュアルに接続中", - "timeout_title": "接続に想定よりも時間がかかっています" + "timeout_title": "接続に想定よりも時間がかかっています", + "websocket_disconnected": "接続がオフラインです。", + "websocket_disconnected_message": "データが最新でない可能性があります。", + "websocket_connecting": "パーペチュアルに接続中...", + "websocket_connecting_message": "接続を回復中... 試行回数 {{attempt}}", + "websocket_connected": "接続済み", + "websocket_connected_message": "ライブデータの更新が再開されました", + "websocket_retry": "再試行" }, "chart": { "no_data": "利用可能なチャートデータがありません", @@ -1754,6 +1784,9 @@ "title": "サポートへのお問い合わせ", "description": "MetaMaskサポートにお問い合わせください" }, + "feedback": { + "title": "ご意見をお聞かせください" + }, "close_all_modal": { "title": "すべてのポジションをクローズ", "description": "すべての未決済のポジションを現在の市場価格でクローズします。", @@ -1806,7 +1839,11 @@ "price_change_low_to_high": "価格変動: 小さい順", "past_hour": "過去1時間", "past_24_hours": "過去24時間", - "time": "時間" + "time": "時間", + "apply": "適用" + }, + "market_type": { + "filter_by": "絞り込み条件:" }, "perps_markets": "パーペチュアル市場", "volume": "取引量", @@ -1823,6 +1860,7 @@ "mainnet": "メインネット", "developer_options": { "hyperliquid_network_toggle": "Hyperliquidネットワークの切り替え", + "provider_mode_toggle": "プロバイダーモード", "simulate_connection_error": "接続エラーのシミュレーション" }, "transactions": { @@ -1942,7 +1980,7 @@ } }, "predict": { - "title": "MetaMask Predict", + "title": "MetaMask 予測", "prediction_markets": "予測市場", "market_list": "市場リスト", "loading": "読み込み中...", @@ -1981,7 +2019,8 @@ "fee_exemption": "この市場に関して当社は手数料を一切いただきません。", "ended": "終了", "resolved_early": "早期確定", - "disclaimer": "この情報は不完全である可能性があります。すべての市場ルール、解決基準、最終結果は、Polymarketのみが管理します。取引は、Polymarketで入手可能な完全なルールに基づいて行う必要があります。" + "disclaimer": "この情報は不完全である可能性があります。すべての市場ルール、解決基準、最終結果は、Polymarketのみが管理します。取引は、Polymarketで入手可能な完全なルールに基づいて行う必要があります。", + "your_picks": "選択項目" }, "tab": { "no_predictions_description": "ここにお客様の予測、保有額、およびマーケットの動きが表示されます。", @@ -2001,6 +2040,8 @@ "cashout_info": "{{outcome}}を{{initialPrice}}で{{amount}}", "cashout_info_multiple": "{{outcomeGroupTitle}} • {{outcome}}を{{initialPrice}}で{{amount}}", "position_info": "{{outcome}}を{{initialValue}}で購入して{{shares}}を獲得", + "position_pick_info": "{{outcome}}に{{initialValue}}", + "position_pick_info_to_win": "{{initialValue}}を{{outcome}}で購入して獲得", "buy_yes": "はい", "buy_no": "いいえ", "outcomes": "結果", @@ -2035,6 +2076,7 @@ "won_markets_text": "{{count}}件の市場{{s}}で的中", "available_balance": "利用可能残高", "claim_amount_text": "請求額 ${{amount}}", + "claim_winnings_text": "報酬を請求", "unrealized_pnl_label": "含み損益", "unrealized_pnl_value": "{{amount}} ({{percent}})", "unrealized_pnl_error": "読み込めません", @@ -2093,7 +2135,7 @@ "price_per_share": "シェア単価", "price_impact": "プライスインパクト", "net_pnl": "純損益", - "total_net_pnl": "純損益額合計", + "total_net_pnl": "純損益総額", "market_net_pnl": "マーケットの純損益額", "activity_details": "アクティビティ詳細", "today": "今日", @@ -2173,6 +2215,15 @@ "order_not_fully_filled": "注文に失敗しました", "buy_order_not_fully_filled": "現在、市場価格で発注するのに十分な株がありません。", "sell_order_not_fully_filled": "現在、市場価格で出金するのに十分な需要がありません。" + }, + "game_details_footer": { + "pick_a_winner": "勝者を選択", + "volume_display": "${{volume}}の出来高", + "read_terms": "コントラクトの全条項をお読みください" + }, + "sports": { + "halftime": "ハーフタイム", + "final": "決勝" } }, "receive": { @@ -2290,7 +2341,7 @@ "add_funds": "資金を追加", "next": "次へ", "buy_asset": "{{asset}}を購入", - "no_tokens": "トークンがありません!", + "no_tokens": "You don't have any tokens", "show_tokens_without_balance": "残高なしでトークンを表示", "nfts_autodetection_title": "NFTの検出", "nfts_autodetection_desc": "MetaMaskによるウォレット内のNFTの自動検出と表示を許可します。", @@ -2303,7 +2354,7 @@ "target_scam_network": "」という名前を使用しているため、詐欺の標的となっています。詐欺師は、より価値の高い通貨を送り返すように仕向ける可能性があります。続ける前にすべてを確認してください。", "use_the_currency_symbol": "通貨シンボルを使用", "use_correct_symbol": "続ける前に、正しいシンボルを使用していることを確認してください", - "chain_id_currently_used": "このチェーンIDは現在次のネットワークで使用されています:", + "chain_id_currently_used": "This chain ID is currently used by the", "incorrect_network_name_warning": "当社の記録によると、ネットワーク名がこのチェーンIDと正しく一致していない可能性があります。", "suggested_name": "提案された名前:", "network_check_validation_desc": "悪質なネットワークや正しくないネットワークに接続してしまう可能性が減ります。", @@ -2314,7 +2365,7 @@ "nft_empty_description": "NFTの世界が無限に広がっています。さっそくコレクションを始めましょう。", "tokens_empty_description": "Nothing to see yet. Why not browse tokens or make a trade?", "discover_nfts": "NFTをインポート", - "no_transactions": "トランザクションがありません!", + "no_transactions": "You have no transactions", "switch_network_to_view_transactions": "トランザクションを表示するにはネットワークを切り替えてください", "send_button": "送信", "deposit_button": "入金", @@ -2362,6 +2413,7 @@ "network_fee": "ネットワーク手数料", "lists": "Token lists", "hide_cta": "トークンを非表示", + "perps_trading": "パーペチュアル取引", "options": { "title": "Token options", "view_on_portfolio": "Portfolioで表示", @@ -2521,18 +2573,20 @@ "billion_abbreviation": "B", "trillion_abbreviation": "T", "million_abbreviation": "M", + "thousand_abbreviation": "K", "token_details": "トークンの詳細", "contract_address": "コントラクトアドレス", "token_list": "トークンリスト", "market_details": "マーケットの詳細", "market_cap": "Market cap", "total_volume": "Total volume (24h)", - "volume_to_marketcap": "Volume / market cap", + "volume_to_marketcap": "Volume / Market cap", "circulating_supply": "循環供給量", "all_time_high": "最高記録", "all_time_low": "最低記録", "fully_diluted": "完全希釈化後", - "unknown": "不明" + "unknown": "不明", + "stock": "Stock" }, "collectible": { "collectible_address": "アドレス", @@ -2583,7 +2637,7 @@ "remove_snap_account": "Snapアカウントを削除", "remove_snap_account_alert_description": "このアカウントはウォレットから削除されます。続ける前に、このインポートされたアカウントの元のシークレットリカバリーフレーズまたは秘密鍵があることを確認してください。アカウントはアカウントドロップダウンから再びインポートまたは作成できます。", "remove_account_alert_remove_btn": "削除", - "remove_account_alert_cancel_btn": "取り消し", + "remove_account_alert_cancel_btn": "Never mind", "accounts_title": "アカウント", "connect_account_title": "アカウントの接続", "connect_accounts_title": "アカウントの接続", @@ -2620,7 +2674,7 @@ "advisory_by": "イーサリアムフィッシング検知システムとPhishFortからの忠告", "potential_threat": "潜在的な脅威には次のものが含まれます", "fake_metamask": "MetaMaskの偽バージョン", - "srp_theft": "シークレットリカバリーフレーズまたはパスワードの窃取", + "srp_theft": "Secret Recovery Phrase or password theft", "malicious_transactions": "資産の窃取に繋がる悪質なトランザクション", "secret_recovery_phrase": "シークレットリカバリーフレーズです。", "account_name": "アカウント名", @@ -2675,8 +2729,8 @@ }, "connect_qr_hardware": { "title": "QRベースのハードウェアウォレットを接続", - "description1": "QRコードを通じてやり取りするエアギャップハードウェアウォレットを接続します。", - "description2": "報酬獲得の仕組み?", + "description1": "Connect an airgapped hardware wallet that communicates through QR codes.", + "description2": "報酬獲得の仕組み", "description3": "公式にサポートされているエアギャップハードウェアウォレットには次のものが含まれます:", "keystone": "Keystone", "ngravezero": "Ngrave Zero", @@ -2690,7 +2744,7 @@ "hint_text": "ハードウェアウォレットをスキャンして", "purpose_connect": "接続", "purpose_sign": "トランザクションを確定", - "select_accounts": "アカウントを選択してください" + "select_accounts": "アカウントを選択します" }, "data_collection_modal": { "accept": "OK", @@ -2717,14 +2771,14 @@ "select_rpc_url": "RPC URLを選択", "title": "設定", "current_conversion": "ベース通貨", - "current_language": "Current language", - "ipfs_gateway": "IPFSゲートウェイ", + "current_language": "現在の言語", + "ipfs_gateway": "「設定」で", "ipfs_gateway_content": "MetaMaskは、サードパーティサービスを使用して、IPFSに保管されているNFTの画像の表示、ブラウザのアドレスバーに入力されたENSアドレスに関する情報の表示、様々なトークンのアイコンの取得を行います。これらのサービスの使用時には、IPアドレスが当該サービスに公開される可能性があります。", "ipfs_gateway_down": "現在のIPFSゲートウェイがダウンしています", "ipfs_gateway_desc": "優先IPFSゲートウェイを選択してください。", - "search_engine": "Search engine", + "search_engine": "検索エンジン", "new_RPC_URL": "新しいRPCネットワーク", - "state_logs": "State logs", + "state_logs": "ステートログ", "add_network_title": "ネットワークを追加", "auto_lock": "自動ロック", "auto_lock_desc": "アプリケーションが自動的にロックされるまでの時間を選択してください。", @@ -2733,15 +2787,15 @@ "autolock_never": "しない", "autolock_after": "{{time}}秒後", "autolock_after_minutes": "{{time}}分後", - "reveal_seed_words": "Reveal seed words", - "reset_account": "Reset account", - "state_logs_button": "Download state logs", + "reveal_seed_words": "シードワードを確認", + "reset_account": "アカウントをリセット", + "state_logs_button": "ステートログをダウンロード", "reveal_seed_words_button": "シードワードを確認", - "reset_account_button": "Reset account", + "reset_account_button": "アカウントをリセット", "reset_account_confirm_button": "はい、リセットします", "reset_account_cancel_button": "キャンセル", - "reset_account_modal_title": "Reset account?", - "clear_approvals_modal_title": "Clear approval data?", + "reset_account_modal_title": "アカウントをリセットしますか?", + "clear_approvals_modal_title": "承認データを消去しますか?", "clear_approvals_modal_message": "すべてのDAppが、アカウント情報を表示するために再度アクセス許可をリクエストする必要があります。", "clear_browser_history_modal_title": "ブラウザの履歴を消去しますか?", "clear_browser_history_modal_message": "ブラウザの履歴をすべて削除しようとしています。よろしいですか?", @@ -2763,7 +2817,7 @@ "protect_title": "ウォレットの復元", "banner_social_login_enabled": "{{authConnection}}でログイン", "manage_recovery_method": "復元方法を管理", - "video_failed": "Video failed to load.", + "video_failed": "動画を読み込めませんでした。", "protect_desc": "ウォレットへのアクセスを失わないよう、シークレットリカバリーフレーズをバックアップしましょう。自分だけがアクセスできて、絶対に忘れないような安全な場所に保管してください。", "protect_desc_no_backup": "これは12の単語からなるウォレット専用のフレーズです。このフレーズはウォレットの資金の送金を含む、現在と未来のすべてのアカウントのコントロールに使用できます。このフレーズを安全に保管し、他人に絶対に教えないでください。MetaMaskはこのキーの復元をお手伝いできません。", "learn_more": "詳細。", @@ -2782,9 +2836,9 @@ "show_fiat_on_testnets_desc": "これを選択すると、テストネット上に法定通貨の換算レートが表示されます.", "show_fiat_on_testnets_modal_title": "ご注意ください", "show_fiat_on_testnets_modal_description": "この機能をオンにするよう求められた場合、詐欺の可能性があります。これらのトークンはテスト専用で、金銭的価値を一切持ちません。この機能は開発者がアプリの動作を確認するのに役立ちます。", - "show_fiat_on_testnets_modal_learn_more": "詳細を見る。", + "show_fiat_on_testnets_modal_learn_more": "詳細", "show_fiat_on_testnets_modal_button": "続行", - "show_hex_data": "Show hex data", + "show_hex_data": "16進データを表示", "show_hex_data_desc": "送信画面に16進データフィールドを表示するにはこれを選択します。", "accounts_identicon_title": "アカウントアイコン", "accounts_identicon_desc": "アカウントを一目で見分けられるよう、3種類の異なるスタイルのアイコンからお選びください。", @@ -2793,7 +2847,7 @@ "general_title": "一般", "general_desc": "通貨換算、主要通貨、言語、検索エンジン.", "advanced_title": "高度な設定", - "advanced_desc": "開発者機能、アカウントのリセット、テストネットのセットアップ、ステータスログ、IPFSゲートウェイ、カスタムRPC.", + "advanced_desc": "開発者機能へのアクセス、アカウントのリセットのほか、テストネット、ステートログ、IPFSゲートウェイ、カスタムRPCのセットアップが可能です。", "notifications_title": "通知", "notifications_desc": "通知の管理", "allow_notifications": "通知を許可する", @@ -2804,9 +2858,9 @@ "customize_session_desc": "受け取る通知の種類をオンにします", "account_session_title": "アカウントのアクティビティ", "account_session_desc": "通知を受けたいアカウントを選択してください:", - "assets_sent_title": "Assets sent", + "assets_sent_title": "資産が送金されました", "assets_sent_desc": "資金とNFT", - "assets_received_title": "Assets received", + "assets_received_title": "資産を受け取りました", "assets_received_desc": "資金とNFT", "defi_title": "DeFi", "defi_desc": "ステーキング、スワップ、ブリッジ", @@ -2826,14 +2880,14 @@ "back": "戻る", "security_desc": "プライバシー設定、MetaMetrics、秘密鍵、シークレットリカバリーフレーズ。", "networks_title": "ネットワーク", - "networks_default_title": "Default network", + "networks_default_title": "デフォルトのネットワーク", "network_delete": "このネットワークを削除した場合、このネットワーク内の資産を見るには、再度ネットワークの追加が必要になります。", "networks_default_cta": "このネットワークを使用", "add_rpc_url": "RPC URLを追加", "add_block_explorer_url": "ブロックエクスプローラーURLを追加", "networks_desc": "カスタムRPCネットワークの追加と編集", - "network_name_label": "Network name", - "network_name_placeholder": "Network name (optional)", + "network_name_label": "ネットワーク名", + "network_name_placeholder": "ネットワーク名 (オプション)", "network_rpc_url_label": "RPC URL", "network_rpc_name_label": "RPC名", "network_rpc_placeholder": "新しいRPCネットワーク", @@ -2845,9 +2899,9 @@ "network_block_explorer_label": "ブロックエクスプローラーURL", "network_block_explorer_placeholder": "ブロックエクスプローラーURL (オプション)", "network_chain_id_warning": "無効なチェーンID", - "network_other_networks": "Other networks", + "network_other_networks": "他のネットワーク", "network_rpc_networks": "RPCネットワーク", - "network_add_network": "Add network", + "network_add_network": "ネットワークを追加", "network_add_custom_network": "カスタムネットワークを追加", "network_add": "追加", "network_save": "保存", @@ -2862,7 +2916,7 @@ "legal_title": "法的情報", "conversion_title": "通貨換算", "conversion_desc": "アプリケーション全体で特定の通貨を使って法定通貨の金額を表示します。", - "primary_currency_title": "Primary currency", + "primary_currency_title": "主要通貨", "primary_currency_desc": "「ネイティブ」を選択すると、チェーンのネイティブ通貨 (ETHなど) での値が優先的に表示されます。「法定通貨」を選択すると、選択した法定通貨での値が優先的に表示されます。", "primary_currency_text_first": "ネイティブ", "primary_currency_text_second": "フィアット", @@ -2899,11 +2953,11 @@ "invalid_number": "無効な数字です。10進数または「0x」で始まる16進数を入力してください。", "invalid_number_leading_zeros": "無効な数字です。先頭の0を削除してください。", "invalid_number_range": "無効な数字です。1と%{maxSafeChainId}の間に数字を入力してください。", - "hide_zero_balance_tokens_title": "Hide tokens without balance", + "hide_zero_balance_tokens_title": "残高のないトークンを非表示", "hide_zero_balance_tokens_desc": "トークンリストに残高がないトークンが表示されないようにします。", "token_detection_title": "トークンの自動検出", "token_detection_description": "サードパーティーAPIを使用して、ウォレットに送られた新しいトークンを検出・表示します。アプリがこれらのサービスからデータを取得しないようにするには、オフにしてください。", - "theme_button_text": "Change theme", + "theme_button_text": "テーマを変更", "theme_title": "テーマ ({{theme}})", "theme_description": "テーマを設定することで、アプリの外観を変更できます。", "theme_os": "システム", @@ -2935,13 +2989,13 @@ "delete_metrics_description_after_delete_part_two": "。このプロセスには最長30日かかる場合があります。", "delete_metrics_description_privacy_policy": "プライバシー ポリシーをご覧ください。", "delete_metrics_button": "MetaMetricsデータを削除", - "check_status_button": "Check status", + "check_status_button": "ステータスを確認", "delete_metrics_confirm_modal_title": "MetaMetricsデータを削除?", "delete_metrics_confirm_modal_description": "すべてのMetaMetricsデータを削除しようとしています。よろしいですか?", "delete_wallet_data_title": "ウォレットをリセット", "delete_wallet_data_description": "これにより、デバイスからウォレット関連のデータがすべて削除されます。アカウントはブロックチェーン上に存在し、MetaMaskとは関係ありません。シークレットリカバリーフレーズを使用すればいつでもアカウントを復元できます。", "delete_wallet_data_button": "ウォレットをリセット", - "delete_data_status_title": "Deletion task status", + "delete_data_status_title": "削除タスクのステータス", "delete_data_status_description": "現在のステータス:", "delete_metrics_error_title": "現在このデータを削除できません。", "delete_metrics_error_description": "アナリティクスシステムサーバーの問題により、現在このリクエストを完了させることができません。後ほど再度お試しください。", @@ -2956,6 +3010,7 @@ "description": "地域、その他...", "current_region": "現在の地域", "reset_region": "地域をリセット", + "change_region": "地域を変更", "no_region_selected": "地域が選択されていません", "sdk_activation_keys": "SDKのアクティベーションキー", "activation_keys_description": "アクティベーションキーを使うと、特定の機能やプロバイダーが使用できるようになります。", @@ -3006,13 +3061,13 @@ }, "snap_details": { "install_date": "{{date}}にインストール", - "install_origin": "Install origin", + "install_origin": "インストール元", "enabled": "有効にしました", "version": "バージョン" }, "keyring_account_list_item": { "account_name": "アカウント名", - "public_address": "Public address" + "public_address": "パブリックアドレス" }, "snap_permissions": { "approved_date": "{{date}}に承認", @@ -3067,24 +3122,24 @@ "dismiss_smart_account_update_desc": "これをオンにすると、どのアカウントでも「スマートアカウントに切り替える」の提案が表示されなくなります。スマートアカウントにより、トランザクションのスピードアップ、ネットワーク手数料の節約、より柔軟な支払いが可能になります。", "use_smart_account_heading": "スマートアカウントを使用する", "use_smart_account_desc": "これを有効にしておくと、MetaMask内で作成されたアカウントは、高速なトランザクション、ネットワーク手数料の削減、柔軟な支払い方法などの機能が利用可能な場合に、自動的にスマートアカウントに切り替わります。", - "use_smart_account_learn_more": "報酬を獲得しましょう。詳しくはこちら。", + "use_smart_account_learn_more": "詳細", "smart_transactions_opt_in_heading": "スマートトランザクション", "smart_transactions_opt_in_desc_supported_networks": "スマートトランザクションをオンにして、サポートされているネットワーク上でのトランザクションの信頼性と安全性を高めましょう。", - "smart_transactions_learn_more": "詳細を見る。", + "smart_transactions_learn_more": "詳細", "simulation_details": "予測される残高の増減", "simulation_details_description": "トランザクションを確定する前に残高の増減を予測するには、この機能をオンにします。これはトランザクションの最終的な結果を保証するものではありません。", "simulation_details_learn_more": "詳細を見る。", - "aes_crypto_test_form_title": "AES crypto - test form", + "aes_crypto_test_form_title": "AES暗号化 - テストフォーム", "aes_crypto_test_form_description": "E2Eテスト専用に開発されたセクションです。このセクションがアプリに表示される場合は、MetaMaskサポートに報告してください。", "developer_options": { - "title": "Developer options", - "generate_trace_test": "Generate trace test", - "generate_trace_test_desc": "Generate a developer test Sentry trace.", - "navigate_to_sample_feature": "Navigate to sample feature", + "title": "開発者向けオプション", + "generate_trace_test": "トレーステストを生成", + "generate_trace_test_desc": "開発者テスト用のSentryトレースを生成。", + "navigate_to_sample_feature": "サンプル機能に移動", "sample_feature_desc": "サンプル機能は、開発者用のテンプレートです。" }, "feature_flag_override": { - "title": "Feature flag override", + "title": "機能フラグのオーバーライド", "description": "アプリの機能のフラグをローカルでオーバーライドします。" } }, @@ -3137,7 +3192,7 @@ "sdk_feedback_modal": { "ok": "OK", "title": "アカウントを接続できませんでした", - "info": "MetaMaskに再接続するDAppのQRコードをスキャンしてください" + "info": "Please scan the QR code on the site to reconnect to MetaMask" }, "app_information": { "title": "情報", @@ -3145,8 +3200,8 @@ "privacy_policy": "プライバシーポリシー", "terms_of_use": "利用規約", "attributions": "属性", - "support_center": "Visit our support center", - "web_site": "Webサイトにアクセス", + "support_center": "サポートセンターをご利用ください", + "web_site": "Visit our website", "contact_us": "Contact us" }, "reveal_credential": { @@ -3216,7 +3271,7 @@ "password_reset": { "password_title": "パスワード", "password_desc": "デバイスでMetaMaskアプリのロックを解除するための強いパスワードを選択してください。このパスワードを紛失した場合、ウォレットを再インポートするのに秘密のリカバリーフレーズが必要になります。", - "password_learn_more": "詳細。", + "password_learn_more": "詳細", "change_password": "パスワードを変更", "password_hint": "パスワードのヒント" }, @@ -3246,19 +3301,28 @@ "swap": "スワップ", "bridge": "ブリッジ", "earn": "獲得", - "convert_to_musd": "Convert to mUSD", + "convert_to_musd": "mUSDに変換", + "merkl_rewards": { + "annual_bonus": "{{apy}}%のボーナス", + "claimable_bonus": "獲得できるボーナス", + "claimable_bonus_tooltip_description": "mUSD bonuses are claimed on Linea.", + "terms_apply": "Terms apply.", + "ok": "OK", + "claim": "請求", + "processing_claim": "Processing claim..." + }, "tron": { - "daily_resource_new_energy": "New daily energy", - "sufficient_to_cover": "Sufficient to cover", + "daily_resource_new_energy": "1日の新規エネルギー量", + "sufficient_to_cover": "カバーできる取引量:", "transactions": "トランザクション", "daily_resource": "1日のリソース", "bandwidth": "帯域幅", "energy": "エネルギー", - "daily_resource_description": "This is your daily allowance based on your staked TRX. Hold TRX to get 600 bandwidth daily.", - "sufficient_to_cover_trx_transfers": "Covers ~{{amount}} TRX transfers", - "sufficient_to_cover_trx_transfer": "Covers 1 TRX transfer", - "sufficient_to_cover_usdt_transfers": "Covers ~{{amount}} USDT transfers", - "sufficient_to_cover_usdt_transfer": "Covers 1 USDT transfer" + "daily_resource_description": "これは、ステーキングされたTRXに基づく1日の利用可能量です。TRXを保有することで、1日600ポイントの帯域幅を無料で取得できます。", + "sufficient_to_cover_trx_transfers": "{{amount}} TRXまでの送金をカバー", + "sufficient_to_cover_trx_transfer": "1 TRXの送金をカバー", + "sufficient_to_cover_usdt_transfers": "{{amount}} USDTまでの送金をカバー", + "sufficient_to_cover_usdt_transfer": "1 USDTの送金をカバー" }, "disabled_button": { "buy": "このアカウントでは購入はサポートされていません", @@ -3311,9 +3375,11 @@ }, "no_chart_data": { "title": "チャートデータがありません", - "description": "このトークンのデータを取得できませんでした" + "description": "このトークンのデータを取得できませんでした", + "insufficient_data": "Data is not available for this time period" }, "your_balance": "残高", + "perps_position": "パーペチュアルポジション", "unable_to_load_balance": "残高を読み込めません", "about": "情報", "about_content_display": { @@ -3363,7 +3429,7 @@ "address_copied_to_clipboard": "トークンアドレスがクリップボードにコピーされました" }, "qr_scanner": { - "invalid_qr_code_title": "無効なQRコード", + "invalid_qr_code_title": "Invalid QR code", "invalid_qr_code_message": "スキャンしようとしているQRコードが有効ではありません。", "allow_camera_dialog_title": "カメラへのアクセスを許可してください。", "allow_camera_dialog_message": "QRコードのスキャンにはアクセス許可が必要です", @@ -3376,14 +3442,14 @@ "attempting_sync_from_wallet_error": "拡張機能と同期しようとしているようですが、これを行うには現在のウォレットを消去する必要があります。\n\n消去してアプリの新しいバージョンを再インストールしたら、「MetaMask拡張機能と同期」オプションを選択してください。ウォレットを消去する前に、必ず秘密のリカバリーフレーズがバックアップされていることを確認してください。", "not_allowed_error_title": "カメラへのアクセスをオンにしてください", "not_allowed_error_desc": "QRコードをスキャンするには、デバイスの設定メニューでMetaMaskにカメラへのアクセスを許可する必要があります。", - "unrecognized_address_qr_code_title": "認識されないQRコード", + "unrecognized_address_qr_code_title": "Unrecognized QR code", "unrecognized_address_qr_code_desc": "申し訳ございませんが、このQRコードはアカウントアドレスまたはコントラクトアドレスに関連付けられていません。", "url_redirection_alert_title": "外部リンクにアクセスしようとしています", "url_redirection_alert_desc": "リンクは詐欺やフィッシングに利用される場合があるため、信頼できるWebサイトにのみアクセスするようにしてください。", "label": "QRコードをスキャン", "open_settings": "設定", "camera_not_available": "カメラを利用できません", - "tron_address_not_supported": "Tron addresses are not currently supported" + "tron_address_not_supported": "TRONアドレスは現在サポートされていません" }, "action_view": { "cancel": "キャンセル", @@ -3471,10 +3537,10 @@ "cancel_tx_message": "このリクエストを実行しても、元のトランザクションがキャンセルされる保証はありません。キャンセルできた場合、上記のトランザクション手数料が発生します。", "speedup_tx_title": "スピードアップを試みますか?", "speedup_tx_message": "このリクエストを実行しても、元のトランザクションが速くなる保証はありません。スピードアップできた場合、上記のトランザクション手数料が発生します。", - "nevermind": "取り消し", + "nevermind": "Never mind", "edit_network_fee": "ガス代を編集", "edit_priority": "優先度を編集", - "gas_cancel_fee": "キャンセルのガス代", + "gas_cancel_fee": "Gas cancellation fee", "gas_speedup_fee": "スピードアップのガス代", "use_max": "最大額を使用", "set_gas": "設定", @@ -3602,7 +3668,7 @@ "reload": "再読み込み", "share": "共有", "bookmark": "ブックマーク", - "add_to_favorites": "お気に入りに追加", + "add_to_favorites": "Add to favorites", "error": "エラー", "cancel": "キャンセル", "go_back": "戻る", @@ -3610,7 +3676,7 @@ "home": "ホーム", "close": "閉じる", "open_in_browser": "ブラウザで開く", - "change_url": "URLを変更", + "change_url": "Change URL", "switch_network": "ネットワークを切り替える", "dapp_browser": "DAppブラウザ", "dapp_browser_message": "MetaMaskは分散型インターネット用のブラウザであり、ウォレットです。ぜひ一度ご覧ください!", @@ -3676,30 +3742,30 @@ "tx_review_increase_allowance": "Increase allowance", "tx_review_set_approval_for_all": "Set approval for all", "tx_review_staking_claim": "Staking claim", - "tx_review_staking_deposit": "Staking deposit", + "tx_review_staking_deposit": "ステーキング用デポジット", "tx_review_staking_unstake": "ステーキングを解除", - "tx_review_lending_deposit": "Lending deposit", + "tx_review_lending_deposit": "レンディング用デポジット", "tx_review_lending_withdraw": "Lending withdrawal", "tx_review_perps_deposit": "パーペチュアルに入金しました", "tx_review_predict_deposit": "入金済みの予測", "tx_review_predict_claim": "請求済みの報酬", "tx_review_predict_withdraw": "予測の出金", - "tx_review_musd_conversion": "mUSD Conversion", - "sent_ether": "送信されたイーサ", - "self_sent_ether": "Sent yourself Ether", - "received_ether": "受け取ったイーサ", + "tx_review_musd_conversion": "mUSDへの変換", + "sent_ether": "Sent ETH", + "self_sent_ether": "Sent yourself ETH", + "received_ether": "Received ETH", "sent_dai": "送信されたDAI", "self_sent_dai": "自分に送信されたDAI", "received_dai": "受け取ったDAI", "sent_tokens": "Sent tokens", "received_tokens": "Received tokens", - "ether": "イーサ", + "ether": "ETH", "sent_unit": "送信された{{unit}}", "self_sent_unit": "Sent yourself {{unit}}", "received_unit": "受け取った{{unit}}", "sent_collectible": "Sent collectible", "received_collectible": "Received collectible", - "send_ether": "Send Ether", + "send_ether": "Send ETH", "send_unit": "Send {{unit}}", "send_collectible": "Send collectible", "receive_collectible": "Receive collectible", @@ -3732,9 +3798,9 @@ }, "gas_used": "Gas used (units)", "gas_limit": "Gas limit (units)", - "gas_price": "ガス価格 (gwei)", - "base_fee": "基本料金 (gwei)", - "priority_fee": "優先手数料 (gwei)", + "gas_price": "Gas price (GWEI)", + "base_fee": "Base fee (GWEI)", + "priority_fee": "Priority fee (GWEI)", "multichain_priority_fee": "優先手数料", "max_fee": "Max fee per gas", "total": "合計", @@ -3767,7 +3833,7 @@ "confirm_gas_fee_token_tooltip": "これは、トランザクションを処理するためにネットワークに支払われるもので、ETH以外のトークンまたは事前に資金提供されたETHの場合は、{{metamaskFeeFiat}}のMetaMask手数料が含まれます。", "paid_by_metamask": "MetaMaskが負担", "confirm_gas_fee_token_metamask_fee": "{{metamaskFeeFiat}}の手数料込み", - "smart_account_upgrade": "スマートアカウントにアップグレード", + "smart_account_upgrade": "スマートアカウントへの切り替え", "smart_account_downgrade": "スタンダードアカウントに切り替える", "batched_transactions": "一括トランザクション", "gas_modal": { @@ -4004,8 +4070,8 @@ "biometrics": { "enable_touchid": "Touch IDでロックを解除しますか?", "enable_faceid": "Face IDでロックを解除しますか?", - "enable_fingerprint": "指紋でロックを解除しますか?", - "enable_biometrics": "生体認証でロックを解除しますか?", + "enable_fingerprint": "Unlock with fingerprint?", + "enable_biometrics": "Unlock with biometrics?", "enable_device_passcode_ios": "デバイスのパスコードでロックを解除しますか?", "enable_device_passcode_android": "デバイスの暗証番号でロックを解除しますか?" }, @@ -4020,18 +4086,18 @@ "title": "接続リクエスト", "walletconnect_title": "WalletConnectリクエスト", "action": "このサイトに接続しますか?", - "action_reconnect": "接続を再開するには、DAppに表示されている数字を選択してください", - "action_reconnect_deeplink": "このDAppを再び接続しますか?", + "action_reconnect": "To resume connection, choose the number you see on the site", + "action_reconnect_deeplink": "Do you want to reconnect to this site?", "connect": "接続", "resume": "再開", "cancel": "キャンセル", - "donot_rememberme": "このDAppの接続を記憶しない", + "donot_rememberme": "Do not remember this site connection", "disconnect": "接続解除", "permission": "次を表示:", "address": "パブリックアドレス", "sign_messages": "メッセージに署名", "on_your_behalf": "ユーザーに代わり", - "warning": "接続をクリックすると、このDAppにパブリックアドレスの閲覧を許可することになります。これはデータをフィッシングのリスクから守るための、セキュリティ上の重要なステップです。" + "warning": "By clicking connect, you allow this site to view your public address. This is an important security step to protect your data from potential phishing risks." }, "import_private_key": { "title": "アカウントをインポート", @@ -4047,7 +4113,7 @@ "error_title": "問題が発生しました", "error_message": "秘密鍵をインポートできませんでした。正しく入力されていることを確認してください。", "error_empty_message": "秘密鍵の入力が必要です。", - "or_scan_a_qr_code": "またはQRコードをスキャンしてください" + "or_scan_a_qr_code": "or scan a QR code" }, "import_private_key_success": { "title": "アカウントがインポートされました!", @@ -4064,12 +4130,12 @@ "paste": "貼り付け", "clear": "すべて消去", "srp_number_of_words_option_title": "単語数", - "12_word_option": "12単語のフレーズがあります", - "24_word_option": "24単語のフレーズがあります", + "12_word_option": "I have a 12-word phrase", + "24_word_option": "I have a 24-word phrase", "error_title": "問題が発生しました", "error_message": "We couldn't import that Secret Recovery Phrase. Please make sure you entered it correctly.", "error_empty_message": "You need to enter your Secret Recovery Phrase.", - "error_number_of_words_error_message": "シークレットリカバリーフレーズは12単語または24単語のいずれかで構成されています", + "error_number_of_words_error_message": "Secret Recovery Phrases contain 12 or 24 words", "error_srp_is_case_sensitive": "無効な入力です!シークレットリカバリーフレーズは大文字・小文字を区別します。", "error_srp_word_error_1": "単語", "error_srp_word_error_2": "が正しくないか、スペルが間違っています。", @@ -4079,7 +4145,7 @@ "error_invalid_srp": "無効なシークレットリカバリーフレーズ", "error_duplicate_srp": "このシークレットリカバリーフレーズはすでにインポートされています。", "error_duplicate_account": "The account you are trying to import is a duplicate.", - "invalid_qr_code_title": "無効なQRコード", + "invalid_qr_code_title": "Invalid QR code", "invalid_qr_code_message": "The QR code does not contain a valid Secret Recovery Phrase", "success_1": "ウォレット", "success_2": "インポートされました" @@ -4151,7 +4217,7 @@ "why_secure_2": "アプリにログインできなくなったり、新しいデバイスに変えたりした場合に、ウォレットを復元できる唯一の方法です。" }, "account_backup_step_2": { - "cancel_backup_title": "Cancel backup", + "cancel_backup_title": "バックアップをキャンセル", "cancel_backup_message": "ウォレットを復元できるよう、秘密のリカバリーフレーズを保管することを強くお勧めします。", "cancel_backup_ok": "はい、リスクを受け入れます", "cancel_backup_no": "いいえ、秘密のリカバリーフレーズをバックアップします", @@ -4163,7 +4229,7 @@ "cta_text": "OK" }, "account_backup_step_3": { - "cancel_backup_title": "Cancel backup", + "cancel_backup_title": "バックアップをキャンセル", "cancel_backup_message": "ウォレットを復元できるよう、秘密のリカバリーフレーズを保管することを強くお勧めします。", "cancel_backup_ok": "はい、リスクを受け入れます", "cancel_backup_no": "いいえ、秘密のリカバリーフレーズをバックアップします", @@ -4172,7 +4238,7 @@ "cta_text": "誰にも見られていません" }, "account_backup_step_4": { - "cancel_backup_title": "Cancel backup", + "cancel_backup_title": "バックアップをキャンセル", "cancel_backup_message": "ウォレットを復元できるよう、秘密のリカバリーフレーズを保管することを強くお勧めします。", "cancel_backup_ok": "はい、リスクを受け入れます", "cancel_backup_no": "いいえ、秘密のリカバリーフレーズをバックアップします", @@ -4197,16 +4263,16 @@ "modal_button": "次へ" }, "account_backup_step_6": { - "title": "Security tips", + "title": "セキュリティに関するアドバイス", "info_text": "秘密のリカバリーフレーズを紛失すると、MetaMaskでは復元できません", "tip_1": "秘密のリカバリーフレーズは複数のバックアップをとっておいてください", "tip_2": "フレーズは信頼できるパスワードマネージャーに保管したり、紙に書いて安全な場所に保管してください", "tip_3": "フレーズは誰にも教えないでください", "disclaimer": "* 秘密のリカバリーフレーズは次の場所で確認できます:", - "disclaimer_bold": "「設定」>「セキュリティとプライバシー」", - "cta_text": "了解!", + "disclaimer_bold": "「設定」>「セキュリティとプライバシー」でオフにできます。", + "cta_text": "了解", "modal_title": "おめでとうございます!", - "modal_text": "バックアップが完了し、準備が整いました!", + "modal_text": "バックアップが完了し、準備が整いました。", "modal_button": "完了", "copy_seed_phrase": "秘密のリカバリーフレーズをクリップボードにコピー" }, @@ -4238,7 +4304,7 @@ "steps": "ステップ{{currentStep}}/{{totalSteps}}", "action": "シークレットリカバリーフレーズを確認します", "info": "欠けている単語を正しい順番で選択してください。", - "complete": "Complete backup", + "complete": "バックアップを完了", "success": "成功", "error-title": "間違っている部分があります", "error-description": "シークレットリカバリフレーズを再確認して、もう一度お試しください。", @@ -4253,7 +4319,7 @@ "congratulations": "おめでとうございます", "success": "ウォレットが保護されました。秘密のリカバリーフレーズを安全に保管するのは、ユーザーの責任であることをお忘れなく。", "hint": "ヒントを残しますか?", - "recover": "秘密のリカバリーフレーズを紛失すると、MetaMaskでは復元できません。秘密のリカバリーフレーズは「設定」 > 「セキュリティとプライバシー」で確認できます。", + "recover": "シークレットリカバリーフレーズを紛失すると、MetaMaskでは復元できません。シークレットリカバリーフレーズは「設定」>「セキュリティとプライバシー」で確認できます。", "learn": "詳細", "done": "完了", "recovery_hint": "復元のヒント", @@ -4417,7 +4483,7 @@ "metamask_swap_completed_title": "スワップが完了しました", "metamask_swap_completed_description": "MetaMaskスワップに成功しました", "nft_sent_title": "NFTが送られました", - "nft_sent_description": "NFTが送られました", + "nft_sent_description": "You successfully sent an NFT", "nft_received_title": "NFTを受け取りました", "nft_received_description": "新しいNFTを受け取りました", "rocketpool_stake_completed_title": "ステーキングが完了しました", @@ -4519,7 +4585,7 @@ "copy_to_clipboard": "クリップボードにコピー", "qr_code": "QRコード", "send_link": "Send link", - "request_qr_code": "支払いリクエストQRコード", + "request_qr_code": "Payment request QR code", "balance": "残高" }, "receive_request": { @@ -4561,10 +4627,10 @@ "close_current_session": "新しいセッションを開始する前に、現在のセッションを閉じてください。" }, "paymentRequest": { - "title": "支払いリクエスト", - "title_complete": "支払い完了", - "confirm": "支払う", - "cancel": "拒否", + "title": "Payment request", + "title_complete": "Payment complete", + "confirm": "Pay", + "cancel": "Decline", "is_requesting_you_to_pay": "が支払いを求めています", "total": "合計:" }, @@ -4589,6 +4655,10 @@ "fiat_on_ramp": { "buy_eth": "ETHを購入", "buy": "{{ticker}}を購入", + "on_network": "{{networkName}}を利用", + "debit_card": "デビットカード", + "continue": "続行", + "powered_by_provider": "Powered by {{provider}}", "purchased_currency": "{{currency}}を購入しました", "network_not_supported": "現在のネットワークはサポートされていません", "switch_network": "メインネットに切り替えてください", @@ -4676,6 +4746,14 @@ "subtitle_5": "いくらガス代がかかるか確認することです。", "cta": "{{ticker}}の購入に進む" } + }, + "build_quote_settings_modal": { + "title": "設定", + "view_order_history": "注文履歴を表示", + "contact_support": "サポートへのお問い合わせ", + "log_out": "{{provider}}からログアウトする", + "logged_out_success": "ログアウトしました", + "logged_out_error": "ログアウト中にエラーが発生しました" } }, "fiat_on_ramp_aggregator": { @@ -4822,6 +4900,7 @@ "title": "地域を選択してください", "description": "支払方法と利用可能なトークンは、サードパーティ提携プロバイダーにより決定され、地域や提携プロバイダーのサポート状況により異なる可能性があります。", "sell_description": "現金の送金先オプションとトークンは、地域によって異なる場合があります。", + "region_variation_notice": "お支払い方法およびご利用可能なトークンは、お住まいの地域と当社のプロバイダーによって異なる場合があります。", "search_by_country": "国で検索", "search_by_state": "州で検索", "no_region_results": "一致する地域がありません", @@ -4883,7 +4962,7 @@ "sent": "送信済み!" }, "notifications": { - "purchase_failed_title": "{{currency}}の購入に失敗しました。もう一度お試しください。ご不便をおかけし申し訳ございません。", + "purchase_failed_title": "{{currency}}の購入に失敗しました。しばらくしてからもう一度お試しください。", "purchase_failed_description": "支払方法とカードの対応状況を確認してください", "purchase_cancelled_title": "購入がキャンセルされました", "purchase_cancelled_description": "支払方法とカードの対応状況を確認してください", @@ -4896,7 +4975,7 @@ "sale_cancelled_title": "注文がキャンセルされました", "sale_cancelled_description": "注文を完了できませんでした。", "sale_completed_title": "注文が完了しました", - "sale_completed_description": "注文に成功しました。", + "sale_completed_description": "ご注文が完了しました。", "sale_pending_title": "{{currency}}の売却を処理しています", "sale_pending_description": "ただ今注文を処理しています。", "no_date": "不明" @@ -4921,7 +5000,7 @@ "start_swapping": "スワップを開始" }, "feature_off_title": "一時的に利用できません", - "feature_off_body": "MetaMask Swapsはメンテナンス中です。後ほどご確認ください。", + "feature_off_body": "MetaMask Swaps are undergoing maintenance. Please check back later.", "wrong_network_title": "Swapsが利用できません", "wrong_network_body": "トークンのスワップはイーサリアムメインネットでのみ可能です。", "unallowed_asset_title": "このトークンはスワップできません", @@ -5002,7 +5081,7 @@ "edit": "編集", "quotes_include_fee": "クォートには{{fee}}%のMetaMask手数料が含まれています", "quotes_include_gas_and_metamask_fee": "クォートにはガス代と、{{fee}}%のMetaMask手数料が含まれています", - "tap_to_swap": "タップしてスワップ", + "tap_to_swap": "Tap to swap", "swipe_to_swap": "スワイプしてスワップ", "swipe_to": "スワイプして", "swap": "スワップ", @@ -5130,7 +5209,7 @@ "contact_support": "サポートへのお問い合わせ" }, "whats_new": { - "title": "最新情報", + "title": "新機能", "remove_gns_new_ui_update": { "title": "UIの最新アップデート", "introduction": "アプリのエクスペリエンス向上のため、アップデートを行いました。", @@ -5385,7 +5464,7 @@ "learn_more": "詳細" }, "token_allowance": { - "verify_third_party_details": "サードパーティの詳細の確認", + "verify_third_party_details": "Verify third-party details", "protect_from_scams": "詐欺から身を守るため、サードパーティの詳細を確認してください。", "learn_to_verify": "サードパーティの詳細の確認方法", "spending_cap": "使用上限", @@ -5399,7 +5478,7 @@ }, "restore_wallet": { "restore_needed_title": "復元が必要です", - "restore_needed_description": "問題が発生しましたが、ご心配なく!ウォレットを復元してみましょう。", + "restore_needed_description": "Something went wrong, but don’t worry! Let’s try to restore your wallet.", "restore_needed_action": "ウォレットを復元" }, "wallet_restored": { @@ -5545,7 +5624,7 @@ "add_bitcoin_account": "ビットコインアカウント", "add_solana_account": "Solanaアカウント", "add_tron_account": "Tronアカウント", - "switch_to_smart_account": "スマートアカウントに切り替える", + "switch_to_smart_account": "スマートアカウントへの切り替え", "rename_account": "アカウント名を変更", "addresses": "アドレス", "headers": { @@ -5598,6 +5677,10 @@ "error_description": "{{snap}}のインストールに失敗しました。" }, "earn": { + "claimable_bonus_tooltip": "An annual bonus claimable daily from your wallet.", + "earn_a_percentage_bonus": "Earn a {{percentage}}% bonus", + "claimable_bonus": "Claimable bonus", + "claim_bonus": "Claim bonus", "empty_state_cta": { "heading": "{{tokenSymbol}}を貸して収益化", "body": "{{protocol}}で{{tokenSymbol}}を貸し付けて、", @@ -5681,21 +5764,36 @@ "fee": "手数料" }, "musd_conversion": { - "convert_to_musd": "Convert to mUSD", + "ok": "OK", + "continue": "Continue", + "convert_and_get_percentage_bonus": "変換して{{percentage}}%をゲット", + "get_a_percentage_musd_bonus": "{{percentage}}%のmUSDボーナスを獲得", + "convert": "変換", "toasts": { - "converting": "Converting {{token}} → mUSD", + "converting": "{{token}} → mUSDに変換中", "eta": "~{{time}}", - "delivered": "Your mUSD has been delivered!", - "failed": "mUSD conversion failed" + "delivered": "mUSDへの変換が完了しました!", + "failed": "mUSDへの変換に失敗しました" }, "education": { - "heading": "mUSDで報酬を獲得", - "description": "Convert your USDC, USDT, or DAI for mUSD, MetaMask’s dollar-backed stablecoin.Earn points every time you convert or hold $100.", - "continue_button": "開始" + "heading": "ステーブルコインで\n{{percentage}}%をゲット", + "description": "Convert your stablecoins to mUSD, MetaMask’s US dollar-backed stablecoin, and receive up to a {{percentage}}% bonus.", + "terms_apply": "Terms apply.", + "primary_button": "開始", + "secondary_button": "後で" }, - "earn_points_daily": "Earn points daily", - "buy_musd": "Buy mUSD", - "get_musd": "Get mUSD" + "buy_musd": "mUSDを購入", + "get_musd": "mUSDを入手", + "boost_title": "Get {{percentage}}% on your stablecoins", + "boost_description": "Convert your stablecoins to mUSD and receive up to a {{percentage}}% bonus.", + "powered_by_relay": "Powered by Relay" + }, + "bonus_claim": { + "toasts": { + "claiming": "Your mUSD bonus is processing", + "delivered": "Your mUSD bonus is here!", + "failed": "Bonus claim failed" + } }, "rewards": { "rewards_tag_label": "報酬", @@ -5711,22 +5809,22 @@ "stake": "Stake", "earn": "獲得", "tron": { - "stake_completed": "Staking completed", - "stake_completed_description": "Your staking transaction has been completed successfully.", - "stake_failed": "Staking failed", + "stake_completed": "ステーキング完了", + "stake_completed_description": "ステーキングのトランザクションが完了しました。", + "stake_failed": "ステーキング失敗", "unstake_completed": "ステーキングの解除が完了しました", - "unstake_completed_description": "Your unstaking transaction has been completed successfully.", - "unstake_failed": "Unstaking failed", + "unstake_completed_description": "ステーキング解除のトランザクションが完了しました。", + "unstake_failed": "ステーキングの解除失敗", "bandwidth": "帯域幅", "energy": "エネルギー", "estimated_annual_reward": "予想年間報酬", - "trx_locked_for": "TRX locked for", - "trx_locked_for_minimum_time": "~3 days", - "trx_released_in": "TRX released in", - "trx_released_in_minimum_time": "~14 days", + "trx_locked_for": "TRXのロック期間", + "trx_locked_for_minimum_time": "最大3日", + "trx_released_in": "TRXのロック解除までの待機期間", + "trx_released_in_minimum_time": "最大14日", "fee": "手数料", "errors": { - "insufficient_balance": "You don't have enough resource balance to do this action." + "insufficient_balance": "この操作を行うのに十分なリソース残高がありません。" } }, "stake_eth": "ETHをステーキング", @@ -5772,12 +5870,19 @@ "learn_more_with_period": "詳細を見る。" }, "stake_your_trx_cta": { - "title": "Lend Tron and earn", - "description_start": "Stake your Tron and earn ", + "title": "TRONを貸して収益化", + "description_start": "TRONをステーキングして収益化", "description_end": " annually.", "learn_more": "詳細を見る。", "earn_button": "獲得" }, + "trx_learn_more": { + "title": "Stake TRX and earn", + "stake_any_amount": "Stake any amount of TRX.", + "earn_trx_rewards": "TRXの報酬を獲得しましょう。", + "earn_trx_rewards_description": "ステーキングすればすぐに収益が得られます。報酬は自動的に発生します。", + "flexible_unstaking_description": "Unstake anytime. Unstaking takes 14 days to process." + }, "day": { "zero": "", "one": "日", @@ -5855,7 +5960,7 @@ "one_year_average": "1年の平均" }, "default_settings": { - "title": "Your wallet is ready", + "title": "ウォレットの準備ができました", "description": "MetaMaskは、デフォルト設定を使用して安全と使いやすさのバランスを最適化しています。プライバシーをさらに強化したい場合は、これらの設定を変更してください。", "learn_more_about_privacy": "プライバシーのベストプラクティスに関する詳細をご覧ください。", "privacy_policy": "プライバシーポリシー", @@ -5981,7 +6086,7 @@ "switch_account_type": "アカウントのアップデート", "approve": "要求の承認", "perps_deposit": "資金を追加", - "predict_deposit": "予測に資金を追加", + "predict_deposit": "予測資金を追加", "predict_withdraw": "出金" }, "sub_title": { @@ -6002,14 +6107,15 @@ "transaction_fee": "HyperCore (パーペチュアル取引で使用されるネットワーク) 上でトークンをUSDCにスワップします。スワッププロバイダーは手数料を請求する場合がありますが、MetaMaskは無料です。" }, "predict_deposit": { - "transaction_fee": "Polygon (Predictで使用されるネットワーク) 上でトークンをUSDCにスワップします。スワッププロバイダーは手数料を請求する場合がありますが、MetaMaskは無料です。" + "transaction_fee": "Polygon (予測で使用されるネットワーク) 上でトークンをUSDCにスワップします。スワッププロバイダーは手数料を請求する場合がありますが、MetaMaskは無料です。" }, "musd_conversion": { - "transaction_fee": "mUSD conversion fees include network costs and may include provider fees." + "transaction_fee": "mUSD換算手数料にはネットワーク費用が含まれ、プロバイダー手数料も含まれる場合があります。" }, "title": { "transaction_fee": "手数料" - } + }, + "network_fee": "ネットワーク手数料は、ネットワークの混雑状況とトランザクションの複雑さによって異なります。" }, "spending_cap": "使用上限", "withdraw": "出金", @@ -6078,7 +6184,7 @@ }, "includes_transaction": "{{transactionCount}}件のトランザクションを含む", "useSmartAccount": "スマートアカウントを使用する", - "successful": "成功!", + "successful": "成功", "success_message": "次回のトランザクションで、アカウントはスマートアカウントに更新されます。" }, "edit_spending_cap_modal": { @@ -6086,9 +6192,9 @@ "cancel": "キャンセル", "description": "ご自身に代わって使われても良いと思う金額を入力してください。", "invalid_number_error": "支出上限は数字である必要があります", - "no_empty_error": "支出上限は空欄にできません", - "no_extra_decimals_error": "支出上限の小数は、トークンの小数桁数を超えることはできません", - "no_zero_error": "支出上限は0にできません", + "no_empty_error": "Spending cap can't be empty", + "no_extra_decimals_error": "Spending cap can't have more decimals than the token", + "no_zero_error": "Spending cap can't be 0", "no_zero_error_decrease_allowance": "支出上限を0にした場合、'decreaseAllowance'メソッドの効果はありません", "no_zero_error_increase_allowance": "支出上限を0にした場合、'increaseAllowance'メソッドの効果はありません", "save": "保存", @@ -6119,7 +6225,7 @@ "edit_amount_done": "続行", "deposit_edit_amount_done": "資金を追加", "deposit_edit_amount_predict_withdraw": "出金", - "deposit_edit_amount_musd_conversion": "Convert to mUSD" + "deposit_edit_amount_musd_conversion": "mUSDに変換" }, "change_in_simulation_modal": { "title": "結果が変更になりました", @@ -6144,6 +6250,8 @@ "confirm_swap": "スワップ", "terms_and_conditions": "利用規約", "select_token": "トークンを選択", + "no_tokens_found": "トークンが見つかりませんでした", + "no_tokens_found_description": "We couldn't find any tokens with this name. Try a different search.", "select_network": "ネットワークを選択", "all_networks": "すべてのネットワーク", "num_networks": "{{numNetworks}}個のネットワーク", @@ -6151,6 +6259,7 @@ "select_all_networks": "すべて選択", "deselect_all_networks": "すべて選択解除", "see_all": "すべて表示", + "all": "すべて", "apply": "適用", "slippage": "スリッページ", "slippage_info": "発注から確定までの間に価格が変わることを「スリッページ」といいます。スリッページがここで設定された許容範囲を超えた場合、スワップは自動的にキャンセルされます。", @@ -6191,9 +6300,9 @@ "title": "ブリッジ", "submitting_transaction": "送信中", "fetching_quote": "クォートを取得中", - "fee_disclaimer": "{{feePercentage}}%のMM手数料込み.", + "fee_disclaimer": "Includes {{feePercentage}}% MetaMask fee.", "no_mm_fee": "MM手数料なし", - "no_mm_fee_disclaimer": "{{destTokenSymbol}}へのスワップにMM手数料はかかりません.", + "no_mm_fee_disclaimer": "No MetaMask fee swapping into {{destTokenSymbol}}.", "hardware_wallet_not_supported": "まだハードウェアウォレットに対応していません。続行するにはホットウォレットをご使用ください。", "hardware_wallet_not_supported_solana": "Solanaはまだハードウェアウォレットに対応していません。続行するにはホットウォレットをご使用ください。", "price_impact_info_title": "プライスインパクト", @@ -6208,15 +6317,7 @@ "approval_tooltip_content": "指定された金額({{amount}} {{symbol}})へのアクセスを許可します。コントラクトは追加の資金にアクセスしません。", "minimum_received": "Minimum received", "minimum_received_tooltip_title": "Minimum received", - "minimum_received_tooltip_content": "トランザクションの処理中に価格が変動した場合に、お客様のスリッページ許容値に基づいて受け取る最低額です。これは流動性プロバイダーからの見積もりであり、最終的な金額は異なる場合があります。", - "verified_token": "確認済みのトークン", - "price": "価格", - "percent_change": "変動率", - "volume": "取引量", - "market_cap_fdv": "時価総額 (FDV)", - "listed_on": "取り扱い市場:", - "centralized_exchanges": "中央集権型取引所", - "contract_address": "コントラクトアドレス" + "minimum_received_tooltip_content": "トランザクションの処理中に価格が変動した場合に、お客様のスリッページ許容値に基づいて受け取る最低額です。これは流動性プロバイダーからの見積もりであり、最終的な金額は異なる場合があります。" }, "quote_expired_modal": { "title": "新しい価格が利用可能です", @@ -6290,7 +6391,7 @@ "title": "ウォレットの復元", "login_with_social": "ソーシャルアカウントでログイン", "setup": "設定", - "secret_recovery_phrase": "シークレットリカバリーフレーズ{{num}}", + "secret_recovery_phrase": "Secret Recovery Phrase {{num}}", "back_up": "バックアップ", "reveal": "確認", "social_recovery_title": "{{authConnection}}での復元", @@ -6349,7 +6450,7 @@ "section_1_title": "マルチチェーンアカウントとは", "section_1_description": "1つのアカウントで、MetaMaskがサポートするすべてのネットワークのアドレスを利用できます。そのため、アカウントを切り替えることなく、イーサリアムやSolanaなどをご利用いただけます。", "section_2_title": "同じアドレスで複数のネットワーク", - "section_2_description": "アカウントをグループ化しましたので、これまでどおりMetaMaskをご利用ください。資金は安全に保護され、変更はありません", + "section_2_description": "アカウントをグループ化しましたので、これまでどおりMetaMaskをご利用ください。資金は安全に保護され、変更はありません.", "view_accounts_button": "アカウントを表示", "learn_more_button": "詳細", "setting_up_accounts": "アカウントの設定" @@ -6511,8 +6612,10 @@ }, "card_onboarding": { "title": "使えば\n貯まる", - "description": "MetaMaskカードなら、仮想通貨決済を現金のように素早く簡単に行え、リワードも獲得できます。", + "description": "MetaMaskカードなら、仮想通貨決済を素早く簡単に行え、3%のキャッシュバックも獲得できます。", "apply_now_button": "今すぐお申し込み", + "login_button": "ログイン", + "not_now_button": "後で", "sign_up": { "title": "さあ、始めましょう", "description": "Crypto Lifeが提供するMetaMaskカードアカウントを作成しましょう。なお、これはMetaMaskアカウントとは別のアカウントになります。", @@ -6540,6 +6643,7 @@ "phone_number_label": "電話番号を入力してください", "country_area_code_label": "国番号", "invalid_phone_number": "無効な電話番号です", + "invalid_us_phone_number": "続行するには、米国の有効な電話番号 (10桁) を入力してください。", "legal_terms": "続行すると、電話番号確認のためにSMSを受信することに同意したものとみなされます。" }, "confirm_phone_number": { @@ -6576,9 +6680,9 @@ "terms": "承認には通常12時間程度かかります。決定次第、お知らせいたします。" }, "verifying_veriff_kyc": { - "title": "本人確認を行っています", - "description": "ご本人確認が完了するまでお待ちください。", - "helper_text": "通常、数秒かかります。その間、アプリを閉じないでください。" + "title": "承認待ち", + "description": "当社パートナーは、お申込みを承認するためにお客様のご本人確認を行う必要があります。", + "helper_text": "これには通常、数秒かかります。その間、アプリを閉じないでください。" }, "verifying_registration": { "title": "本人確認を行っています", @@ -6614,15 +6718,15 @@ }, "physical_address": { "title": "住所を追加", - "description": "ご自宅の住所を入力してください。承認された場合は、物理カードをこちらにお送りします。", + "description": "現在の自宅住所を入力してください。これはご本人確認のために使用されます。", "address_line_1_label": "住所行1", "address_line_2_label": "住所行2", "city_label": "市区町村", "state_label": "州・都道府県", "zip_code_label": "郵便番号", "country_label": "国", - "electronic_consent_1": "I agree to the E-Sign Act Consent and Disclosure and to receive all communications electronically. ", - "electronic_consent_2": "View document(PDF)" + "electronic_consent_1": "電子署名法に基づく同意および開示事項に同意し、すべての通知を電子的に受け取ることに同意します。 ", + "electronic_consent_2": "ドキュメントを表示 (PDF)" }, "mailing_address": { "title": "郵送先住所", @@ -6668,22 +6772,24 @@ } }, "card_home": { + "title": "Card", + "available_balance": "利用可能残高", "error_title": "データを取得できません", "error_description": "問題が発生し、このページのコンテンツを表示できないようです。接続を確認するか、ページを更新してみてください。", "try_again": "再試行してください", - "limited_spending_warning": "実際の利用可能額は制限されている可能性があります。制限を調整するには、{{manageCard}}に移動してください。", + "limited_spending_warning": "Your actual spending ability may be limited. To adjust your limit, go to ", "add_funds": "資金を追加", "change_asset": "アセットを変更", "enable_card_button_label": "カードを有効にする", "enable_assets_button_label": "アセットを有効にする", "spending_limit_warning": "使用上限に近づいています。拒否されないように更新してください。", "logout": "ログアウト", - "logout_description": "MetaMaskカードアカウントからログアウト", "logout_confirmation_title": "カードからログアウトしますか?", "logout_confirmation_message": "MetaMaskカードアカウントからログアウトしてよろしいですか?", "logout_confirmation_cancel": "キャンセル", "logout_confirmation_confirm": "ログアウト", "enable_card_error": "カードを有効化できませんでした。後ほどもう一度お試しください。", + "view_card_details_error": "Unable to load card details. Please try again.", "warnings": { "close_spending_limit": { "title": "利用限度額に近づいています", @@ -6706,6 +6812,16 @@ "blocked": { "title": "カードがロックされています", "description": "カードのロックを解除するにはサポートにお問い合わせください" + }, + "kyc_pending": { + "title": "確認中", + "description": "Your identity verification is being reviewed. This typically takes less than 12 hours." + } + }, + "messages": { + "card_provisioning": { + "title": "Card being created", + "description": "Your card is being created. This may take a few moments." } }, "kyc_status": { @@ -6729,33 +6845,46 @@ "ok_button": "OK" }, "manage_card_options": { - "manage_spending_limit": "利用限度額を管理", + "view_card_details": "View card details", + "hide_card_details": "Hide card details", + "view_card_details_description": "Card number, expiration and CVV", + "manage_spending_limit": "Manage limit", "manage_spending_limit_description_restricted": "利用制限がオンになっています", "manage_spending_limit_description_full": "フルアクセスがオンになっています", "manage_card": "カードの管理", - "advanced_card_management_description": "カードの詳細やトランザクションなどを確認", + "advanced_card_management_description": "See activity, cashback, freeze card, and more", "travel_title": "MetaMask Travel", - "travel_description": "エクスペディアと比べて最大60%割引でホテルを予約", - "card_tos_title": "カード利用規約", - "card_tos_description": "カード発行会社の利用規約をお読みください" + "travel_description": "Book hotels with up to 70% discounts", + "card_tos_title": "Terms and conditions" } }, "card_spending_limit": { "title_change_token": "トークンとネットワークの変更", "title_enable_token": "トークンを有効にする", + "title_onboarding": "支出を有効にする", + "setup_title": "Set up your card", + "setup_description": "Select the token you'd like to use and set a limit for how much you can spend.", + "asset_label": "アセット", + "limit_label": "リミット", + "other_token": "Other", "full_access_title": "完全アクセス", - "full_access_description": "カードは毎回承認を求めることなく、資金を自動的に使用できます。", - "restricted_limit_title": "使用の制限", - "restricted_limit_description": "上限を増やすには、毎回戻ってネットワーク手数料を支払う必要があります。", + "full_access_description": "Your card can use your funds automatically without asking for approval each time.", + "restricted_limit_title": "ご利用限度額", + "restricted_limit_description": "ご利用いただけるのはこの限度額までです。限度額が更新されるたびにネットワーク手数料が発生します。", "edit_limit": "限度額を編集", "confirm_new_limit": "選択すると、", "cancel": "キャンセル", + "skip": "今はスキップ", "set_new_limit": "上限を設定", "dismiss": "閉じる", "update_success": "使用上限が更新されました", "update_error": "使用上限の更新に失敗しました", "solana_not_supported": "card.metamask.ioでSolanaトークンを有効にする", - "select_token": "トークンを選択" + "select_token": "トークンを選択", + "loading": "ご利用可能なトークンを読み込み中...", + "load_error": "トークンを読み込めません。もう一度お試しください。", + "retry": "再試行してください", + "on_linea": "Lineaで" }, "change_asset": { "title": "トークンとネットワークの変更", @@ -6793,6 +6922,7 @@ "signup_button": "サインアップ", "errors": { "invalid_credentials": "ログイン情報が無効です", + "invalid_otp_code": "コードが正しくありません。もう一度お試しください", "unknown_error": "サーバーエラーが発生しました。後ほど再試行してください", "email_required": "メールアドレスは必須です", "password_required": "パスワードは必須です", @@ -6839,8 +6969,8 @@ }, "rewards": { "auth_fail_title": "不明なエラーです。", - "auth_fail_description": "このアカウントをリワードプログラムで認証中に不明なエラーが発生しました。後でもう一度お試しください。", - "failed_to_authenticate": "リワードプログラムの認証に失敗しました", + "auth_fail_description": "このアカウントをMetaMaskリワードで認証中に不明なエラーが発生しました。後でもう一度お試しください。", + "failed_to_authenticate": "MetaMaskリワードの認証に失敗しました", "not_implemented": "近日追加予定", "not_implemented_season_summary": "シーズンの概要が近日ご利用可能になります", "optin_error": { @@ -6867,6 +6997,10 @@ "error_fetching_description": "接続を確認して、もう一度お試しください。", "retry_button": "再試行" }, + "linea_tokens": { + "default_title": "$LINEA", + "title_earned": "{{amount}} $LINEAを獲得しました" + }, "upcoming_rewards_error": { "error_fetching_title": "リワードを読み込めませんでした", "error_fetching_description": "接続を確認して、もう一度お試しください。", @@ -6898,6 +7032,15 @@ "claim_reward_error": { "title": "リワードの請求に失敗しました" }, + "metal_card_claim": { + "title": "報酬を引き換える", + "description": "MetaMaskメタルカードは対象者限定であり、一部の地域ではご利用いただけません。対象外の場合は、代わりに限定プレミアムグッズ特典をお受け取りいただけます。", + "contact_info": "連絡先情報を共有すると、Telegramで@MidwitMilhouseから、または christian.montoya@consensys.netから2週間以内にご連絡いたします。", + "email_label": "メールアドレス", + "email_validation_error": "有効なメールアドレスを入力してください", + "telegram_label": "Telegramのハンドルネーム", + "telegram_placeholder": "オプション" + }, "accounts_opt_in_state_error": { "error_fetching_title": "アカウントを読み込めませんでした", "error_fetching_description": "接続を確認して、もう一度お試しください。", @@ -6979,7 +7122,7 @@ "gtm_title": "リワードのご紹介", "gtm_description": "アクティビティに対してポイントを獲得できます。\nレベルを上げてリワードのロックを解除しましょう。", "gtm_confirm": "開始", - "intro_title": "シーズン1\n開催中", + "intro_title": "シーズン1 \n開催中", "intro_description": "アクティビティに対してポイントを獲得できます。\nレベルを上げてリワードのロックを解除しましょう。", "intro_confirm": "250ポイントを請求する", "intro_confirm_geo_loading": "地域を確認中…", @@ -7052,12 +7195,12 @@ "dashboard_modal_info": { "active_account": { "title": "お見逃しなく", - "description": "アクティビティからポイントを獲得するには、アカウントを追加してください。", + "description": "Add your account to Rewards.", "confirm": "アカウントを追加" }, "multiple_unlinked_accounts": { - "title": "ポイントの獲得を開始しましょう", - "description": "アカウントを追加すると、リワードを一目で確認できるようになります。", + "title": "お見逃しなく", + "description": "Add your accounts to Rewards.", "confirm": "アカウントを追加する" }, "account_not_supported": { @@ -7110,10 +7253,10 @@ } }, "predict": { - "title": "予測市場", + "title": "予測", "description": "$10の予測ごとに20ポイント", "sheet": { - "title": "予測市場", + "title": "予測", "points": "$10ごとに20ポイント", "description": "$10取引するごとにポイントを獲得できます。", "cta_label": "マーケットを閲覧" @@ -7191,6 +7334,19 @@ "time_left": "残り", "expired": "期限切れ" }, + "end_of_season_rewards": { + "confirm_label_default": "確定", + "confirm_label_access": "アクセス", + "redeem_success_title": "報酬が引き換えられました", + "metal_card_claim_success": "連絡先情報が確認されました", + "linea_tokens_claim_success": "アドレスが確認されました", + "arriving_soon": "まもなく届きます", + "check_back_soon": "近日中に再度ご確認ください", + "redeem_failure_title": "引き換えに失敗しました", + "redeem_failure_description": "後ほどもう一度お試しください。", + "reward_details": "報酬の詳細", + "select_account_description": "この報酬の送付先となるアカウントを選択してください。トークンは2週間以内に配布されます。" + }, "animation": { "could_not_load": "読み込ませんでした" } @@ -7257,13 +7413,13 @@ "still_connecting_network": "{{networkName}}に引き続き接続中です...", "unable_to_connect_network": "{{networkName}}に接続できません。", "update_rpc": "RPCを更新", + "switch_to_metamask_default_rpc": "Switch to MetaMask default RPC", "check_network_connectivity": "ネットワーク接続を確認してください。", - "check_network_connectivity_or": "ネットワーク接続を確認するか、" + "check_network_connectivity_or": "ネットワーク接続を確認するか、", + "updated_to_metamask_default": "Updated to MetaMask default" }, "trending": { "title": "Explore", - "view_all": "View all", - "tokens": "トークン", "trending_tokens": "Trending tokens", "price_change": "Price change", "all_networks": "すべてのネットワーク", @@ -7295,6 +7451,10 @@ "title": "Trending tokens is not available", "description": "We can't fetch this page right now", "try_again": "再試行してください" + }, + "empty_search_result_state": { + "title": "トークンが見つかりませんでした", + "description": "We were not able to find this token" } }, "ota_update_modal": { diff --git a/locales/languages/ko.json b/locales/languages/ko.json index 52767131fed0..05df6de112d5 100644 --- a/locales/languages/ko.json +++ b/locales/languages/ko.json @@ -8,7 +8,7 @@ "increment": "Redux 카운터 증가" }, "pet_name": { - "list_count_text": "Pet names on this network", + "list_count_text": "이 네트워크에 등록된 사용자 지정 이름", "add_pet_name_button": "Add pet name", "address": "주소", "address_placeholder": "0x...", @@ -193,11 +193,10 @@ "connector": ":" }, "autocomplete": { - "placeholder": "토큰이나 사이트, 주소로 검색", + "placeholder": "사이트 또는 주소로 검색", "recents": "최근", "favorites": "즐겨찾기", - "sites": "사이트", - "tokens": "토큰" + "sites": "사이트" }, "navigation": { "back": "뒤로", @@ -306,7 +305,7 @@ "get_started": "시작하기" }, "onboarding_wizard": { - "skip_tutorial": "Skip tutorial", + "skip_tutorial": "튜토리얼 건너뛰기", "coachmark": { "action_back": "아니요, 괜찮습니다", "action_next": "전체 둘러보기", @@ -330,7 +329,7 @@ "content3": "계정 이름을 수정하세요." }, "step4": { - "title": "Main menu", + "title": "메인 메뉴", "content1": "이 메뉴에서 트랜잭션 기록, 설정 및 지원 등을 이용하실 수 있습니다.", "content2": "계정 및 MetaMask 설정에 접속하시면 추가적인 작업을 수행할 수 있습니다." }, @@ -596,9 +595,9 @@ "transaction_activity": "활동", "request_feature": "기능 요청", "submit_feedback_message": "보낼 피드백 유형을 선택합니다.", - "submit_bug": "Bug report", + "submit_bug": "버그 리포트", "submit_general_feedback": "일반", - "share_address": "Share my public address", + "share_address": "내 공개 주소 공유", "view_in_etherscan": "이더스캔에서 보기", "view_in": "다음에서 보기:", "browser": "브라우저", @@ -612,12 +611,13 @@ "lock_cancel": "아니오", "feedback": "피드백", "metamask_support": "MetaMask 지원", - "public_address": "Public address" + "public_address": "공개 주소" }, "send": { "available": "사용 가능", "invalid_value": "잘못된 값", "insufficient_funds": "자금 부족", + "insufficient_balance_to_cover_fee": "Insufficient balance to cover fees", "continue": "계속", "unit": "단위", "units": "단위", @@ -643,8 +643,8 @@ "no_tokens_available": "사용 가능한 토큰이 없습니다", "sign": "서명", "network_not_found_title": "네트워크를 찾을 수 없습니다", - "network_not_found_description": "체인 id {{chain_id}}의 네트워크를 지갑에서 찾을 수 없습니다. 네트워크를 먼저 추가하세요.", - "network_missing_id": "체인 id가 없습니다.", + "network_not_found_description": "Network with chain ID {{chain_id}} not found in your wallet. Please add the network first.", + "network_missing_id": "Missing chain ID.", "search_tokens": "토큰 검색", "search_tokens_and_nfts": "토큰 및 NFT 검색", "tokens": "토큰", @@ -680,8 +680,8 @@ "search_by_name_or_address": "이름 또는 주소로 토큰 검색", "no_tokens_found": "\"{{searchString}}\"(와)과 일치하는 토큰이 없습니다", "unsupported_token_title": "이용할 수 없음", - "unsupported_token_description": "This token may not be available in your region or supported by any local payment providers", - "error_loading_tokens": "Unable to load tokens. Please try again later." + "unsupported_token_description": "이 토큰은 지역 제한 또는 현지 결제 수단 미지원으로 인해 사용할 수 없습니다", + "error_loading_tokens": "토큰을 불러올 수 없습니다. 나중에 다시 시도하세요." }, "networks_filter_bar": { "all_networks": "모든 네트워크" @@ -696,12 +696,12 @@ "title": "설정", "view_order_history": "주문 내역 보기", "contact_support": "지원팀에 문의", - "log_out": "Log out of Transak", + "log_out": "Transak 로그아웃", "logged_out_success": "로그아웃했습니다", "error_sdk_not_initialized": "SDK가 초기화되지 않았습니다", "logged_out_error": "로그아웃 오류", - "more_ways_to_buy": "More ways to buy", - "more_ways_to_buy_description": "Switch to the classic version" + "more_ways_to_buy": "다른 구매 방법", + "more_ways_to_buy_description": "클래식 버전으로 전환" }, "region_modal": { "select_a_region": "지역 선택", @@ -714,7 +714,7 @@ "no_state_results": "'{{searchString}}'(와)과 일치하는 주가 없습니다" }, "payment_modal": { - "select_a_payment_method": "Select a payment method" + "select_a_payment_method": "결제 수단 선택" }, "payment_duration": { "instant": "즉시", @@ -805,7 +805,7 @@ "button": "동의하고 계속하기" }, "additional_verification": { - "title": "Additional verification", + "title": "추가 인증", "paragraph_1": "더 큰 금액을 입금하려면 유효한 신분증(운전면허증 등)과 실시간 셀카가 필요합니다.", "paragraph_2": "인증을 완료하려면 카메라 접근 권한을 허용해야 합니다.", "button": "계속" @@ -832,7 +832,7 @@ "dob_invalid": "유효한 생년월일을 입력해 주세요", "ssn_required": "사회보장번호는 필수입니다", "unexpected_error": "예기치 못한 오류가 발생했습니다. 다시 시도하세요.", - "phone_already_registered": "This phone number is already in use by {{email}}. Log in using this email to continue.", + "phone_already_registered": "이 전화번호는 이미 {{email}} 계정에서 사용 중입니다. 계속하려면 해당 이메일로 로그인하세요.", "login_with_email": "이메일로 로그인" }, "enter_address": { @@ -844,7 +844,7 @@ "address_line_2": "상세 주소(선택사항)", "state": "주/지역", "city": "도시", - "postal_code": "Postal/zip code", + "postal_code": "우편번호", "country": "국가", "select_state": "주 선택", "address_line_1_required": "도로명 주소는 필수입니다", @@ -854,7 +854,7 @@ "city_invalid": "유효한 도시를 입력해 주세요", "state_required": "주/지역은 필수입니다", "state_invalid": "유효한 주를 입력해 주세요", - "postal_code_required": "Postal/zip code is required", + "postal_code_required": "우편번호는 필수입니다", "postal_code_invalid": "유효한 우편번호를 입력해 주세요", "unexpected_error": "예기치 않은 오류입니다." }, @@ -903,7 +903,7 @@ "cancel_order_button": "주문 취소" }, "order_details": { - "title": "Deposit order", + "title": "예치 주문", "error_title": "입금 주문에 오류가 발생했습니다", "error_message": "예기치 않은 오류가 발생했습니다." }, @@ -946,7 +946,7 @@ }, "error_view": { "title": "오류가 발생했습니다", - "description": "입금 처리 중 오류가 발생했습니다. 문제가 지속되면 지원팀에 문의하세요.", + "description": "입금 처리 중 오류가 발생했습니다. 문제가 계속되면 지원팀에 문의하세요.", "try_again": "다시 시도" }, "errors": { @@ -955,14 +955,14 @@ "fetch_payment_methods": "결제 수단을 불러오는 동안 문제가 발생했습니다.", "fetch_user_details": "사용자 정보를 불러오는 동안 문제가 발생했습니다.", "try_again": "다시 시도", - "error_details_title": "Error details", + "error_details_title": "오류 세부 정보", "see_more": "자세히 보기" } }, "perps": { - "basic_functionality_disabled_title": "Perps is not available", + "basic_functionality_disabled_title": "무기한 선물을 사용할 수 없습니다", "title": "무기한 선물", - "perps_trading": "영구계약 거래", + "perps_trading": "무기한 선물 거래", "perp_account_balance": "무기한 선물 계정 잔액", "manage_balance": "잔액 관리", "total_balance": "총 잔액", @@ -974,11 +974,15 @@ "not_now": "나중에", "try_now": "시작하기" }, + "discovery_banner": { + "title": "{{symbol}} 무기한 선물 거래", + "subtitle": "최대 {{leverage}}까지 손익 확대" + }, "today": "오늘", "yesterday": "어제", "unrealized_pnl": "미실현 손익", "withdraw": "출금", - "refresh_balance": "잔액 새로고침", + "refresh_balance": "잔액 새로 고침", "add_funds": "자금 추가", "trade_perps": "무기한 선물 거래하기", "trade_perps_description": "무기한 선물로 자산을 향후 가격으로 거래하세요. 시작하려면 무기한 선물 계정에 자금을 추가하세요", @@ -1047,7 +1051,7 @@ "preparing": "예치 준비 중...", "swapping": "{{token}} 토큰을 USDC로 스왑 중", "bridging": "Hyperliquid로 브릿지", - "depositing": "무기한 선물 거래 계정에 예치 중", + "depositing": "무기한 선물 계정으로 입금 중", "depositing_direct": "USDC를 HyperLiquid 계정으로 직접 전송 중..." }, "step_descriptions": { @@ -1414,6 +1418,7 @@ "failedToEstablishAllMids": "글로벌 allMids 구독 시작에 실패했습니다", "failedToEstablishMarketData": "{{symbol}}의 시장 데이터 구독 시작에 실패했습니다", "failed_to_toggle_network": "네트워크 전환에 실패했습니다", + "failed_to_switch_provider": "제공업체 전환 실패", "noAccountSelected": "선택한 계정이 없습니다", "unsupportedMethod": "지원되지 않는 방법: {{method}}", "invalidAddressFormat": "잘못된 주소 형식: {{address}}", @@ -1452,6 +1457,24 @@ "orderLeverageReductionFailed": "레버리지를 줄일 수 없습니다", "insufficientLiquidity": "유동성이 부족해 주문을 체결할 수 없습니다. 지정가 주문을 사용하거나 잠시 후 다시 시도해 주세요.", "connectionTimeout": "연결 시간이 초과되었습니다. 네트워크를 확인하고 다시 시도하세요.", + "clientReinitializing": "서비스를 재초기화하는 중입니다. 잠시 기다린 후 다시 시도하세요.", + "transferFailed": "자금을 이전할 수 없습니다. 다시 시도해 주세요.", + "swapFailed": "토큰을 스왑할 수 없습니다. 다시 시도해 주세요.", + "spotPairNotFound": "현재 이 거래 조합은 이용할 수 없습니다.", + "priceUnavailable": "가격 데이터를 불러올 수 없습니다. 새로고침 후 다시 시도하세요.", + "batchCancelFailed": "일부 주문을 취소하지 못했습니다. 다시 시도해 주세요.", + "batchCloseFailed": "일부 포지션을 종료하지 못했습니다. 다시 시도해 주세요.", + "insufficientMargin": "마진이 부족해 이 거래를 실행할 수 없습니다. 자금을 추가하거나 포지션 규모를 줄여 보세요.", + "reduceOnlyViolation": "이 주문은 포지션을 증가시킵니다. 감소 주문만 허용됩니다.", + "positionWouldFlip": "이 주문으로 인해 포지션 방향이 반대로 바뀝니다. 먼저 기존 포지션을 종료하세요.", + "marginAdjustmentFailed": "마진을 조정할 수 없습니다. 다시 시도하세요.", + "tpslUpdateFailed": "익절/손절 설정을 업데이트할 수 없습니다. 다시 시도하세요.", + "orderRejected": "주문이 거부되었습니다. 파라미터를 확인한 후 다시 시도하세요.", + "slippageExceeded": "가격 변동이 너무 큽니다. 지정가 주문을 이용하거나 슬리피지 허용치를 늘려 보세요.", + "rateLimitExceeded": "요청이 너무 많습니다. 잠시 기다린 후 다시 시도하세요.", + "serviceUnavailable": "서비스를 일시적으로 사용할 수 없습니다. 나중에 다시 시도하세요.", + "networkErrorSimple": "네트워크 오류입니다. 연결을 확인하고 다시 시도하세요.", + "insufficientBalance": "잔액이 부족해 이 작업을 완료할 수 없습니다. 사용 가능한 자금을 확인하세요.", "connectionFailed": { "title": "무기한 선물에 연결할 수 없습니다", "description": "곧 다시 온라인으로 이용할 수 있도록 작업 중입니다.", @@ -1654,7 +1677,7 @@ }, "tp_sl": { "title": "익절 및 손절", - "content": "익절(TP)은 목표 수익에 도달했을 때 포지션을 자동으로 종료하는 기능입니다. 손절(SL)은 가격이 사용자에게 불리하게 움직일 경우 포지션을 종료하여 손실을 제한하는 기능입니다." + "content": "익절(TP)은 목표 수익에 도달하면 자동으로 포지션을 종료합니다. 손절(SL)은 가격이 불리하게 움직일 경우 포지션을 종료하여 손실을 제한합니다." }, "close_position_you_receive": { "title": "받는 금액", @@ -1697,7 +1720,14 @@ "retry_connection": "연결 재시도", "retrying_connection": "연결 중...", "connecting_to_perps": "무기한 선물에 연결 중", - "timeout_title": "예상보다 연결 시간이 오래 걸립니다" + "timeout_title": "예상보다 연결 시간이 오래 걸립니다", + "websocket_disconnected": "연결이 오프라인 상태입니다.", + "websocket_disconnected_message": "데이터가 최신이 아닐 수 있습니다.", + "websocket_connecting": "무기한 선물에 연결 중...", + "websocket_connecting_message": "연결 복구 중... {{attempt}}회 시도", + "websocket_connected": "연결 완료", + "websocket_connected_message": "실시간 데이터 업데이트 재개", + "websocket_retry": "다시 시도" }, "chart": { "no_data": "사용 가능한 차트 데이터가 없습니다", @@ -1746,7 +1776,7 @@ "markets": "시장" }, "learn_more": { - "title": "무기한 선물에 대해 자세히 알아보기", + "title": "무기한 선물에 대해 알아보기", "description": "무기한 선물 거래가 작동하는 방식과 거래를 시작하는 방법을 알아보세요", "cta": "더 보기" }, @@ -1754,6 +1784,9 @@ "title": "지원팀에 문의", "description": "도움이 필요하면 MetaMask 지원팀에 문의하세요" }, + "feedback": { + "title": "피드백 보내기" + }, "close_all_modal": { "title": "모든 포지션 종료", "description": "회원님의 모든 포지션을 현재 시장가에 종료합니다.", @@ -1795,8 +1828,8 @@ "funding_rate_short": "펀딩", "open_interest": "미결제 약정", "open_interest_short": "미결제 약정", - "high_to_low": "내림차순", - "low_to_high": "올림차순", + "high_to_low": "높은 순", + "low_to_high": "낮은 순", "high": "높음", "low": "낮음", "sort_by": "정렬 기준", @@ -1806,7 +1839,11 @@ "price_change_low_to_high": "가격 변동: 올림차순", "past_hour": "지난 1시간", "past_24_hours": "지난 24시간", - "time": "시간" + "time": "시간", + "apply": "적용" + }, + "market_type": { + "filter_by": "필터링 기준:" }, "perps_markets": "무기한 선물 시장", "volume": "거래량", @@ -1823,6 +1860,7 @@ "mainnet": "메인넷", "developer_options": { "hyperliquid_network_toggle": "Hyperliquid 네트워크 전환", + "provider_mode_toggle": "공급자 모드", "simulate_connection_error": "연결 오류 시뮬레이션" }, "transactions": { @@ -1981,7 +2019,8 @@ "fee_exemption": "이 시장에서는 수수료를 부과하지 않습니다.", "ended": "종료됨", "resolved_early": "조기 정산됨", - "disclaimer": "이 정보는 불완전할 수 있습니다. 모든 시장 규칙, 판정 기준 및 최종 결과는 전적으로 Polymarket의 규정에 따릅니다. 거래는 Polymarket에서 제공되는 전체 규칙을 확인한 후 진행해야 합니다." + "disclaimer": "이 정보는 불완전할 수 있습니다. 모든 시장 규칙, 판정 기준 및 최종 결과는 전적으로 Polymarket의 규정에 따릅니다. 거래는 Polymarket에서 제공되는 전체 규칙을 확인한 후 진행해야 합니다.", + "your_picks": "내 선택" }, "tab": { "no_predictions_description": "여기에 귀하의 예측 내용이 표시되며, 참여 금액과 시장의 변동 사항도 함께 보여집니다.", @@ -2001,6 +2040,8 @@ "cashout_info": "{{outcome}}에 {{amount}}(단가: {{initialPrice}})", "cashout_info_multiple": "{{outcomeGroupTitle}} - {{outcome}}에 {{amount}}(단가:{{initialPrice}}", "position_info": "{{outcome}}에 {{initialValue}} 베팅하여 {{shares}} 획득", + "position_pick_info": "{{outcome}}에 {{initialValue}}", + "position_pick_info_to_win": "{{outcome}} 승리에 {{initialValue}}", "buy_yes": "예", "buy_no": "아니요", "outcomes": "결과", @@ -2035,6 +2076,7 @@ "won_markets_text": "{{count}}개 시장{{s}} 승리", "available_balance": "사용 가능한 잔액", "claim_amount_text": "${{amount}} 수령", + "claim_winnings_text": "수익금 수령", "unrealized_pnl_label": "미실현 손익", "unrealized_pnl_value": "{{amount}}({{percent}})", "unrealized_pnl_error": "불러올 수 없습니다", @@ -2173,6 +2215,15 @@ "order_not_fully_filled": "주문을 완료하지 못했습니다", "buy_order_not_fully_filled": "시장가로 거래할 수 있는 주식이 충분하지 않아 주문을 넣을 수 없습니다.", "sell_order_not_fully_filled": "현금화하기에 시장가 수요가 충분하지 않습니다." + }, + "game_details_footer": { + "pick_a_winner": "승자 선택", + "volume_display": "$ {{volume}} 거래량", + "read_terms": "전체 계약 이용 약관 읽기" + }, + "sports": { + "halftime": "하프타임", + "final": "종료" } }, "receive": { @@ -2290,7 +2341,7 @@ "add_funds": "자금 추가", "next": "다음", "buy_asset": "{{asset}} 구매", - "no_tokens": "토큰이 없습니다!", + "no_tokens": "토큰이 없습니다", "show_tokens_without_balance": "잔액 없는 토큰 표시", "nfts_autodetection_title": "NFT 감지", "nfts_autodetection_desc": "MetaMask를 통해 자동으로 NFT를 감지하여 지갑에 표시할 수 있습니다.", @@ -2303,7 +2354,7 @@ "target_scam_network": "사기의 표적이 되고 있습니다. 사기꾼은 더 가격이 높은 암호화폐를 주겠다고 속일 수 있습니다. 계속하기 전에 모든 사항을 확인하세요.", "use_the_currency_symbol": "통화 심볼 사용", "use_correct_symbol": "계속하기 전에 올바른 심볼을 사용하고 있는지 확인하세요", - "chain_id_currently_used": "이 체인 ID는 현재 다음에서 사용됩니다:", + "chain_id_currently_used": "This chain ID is currently used by the", "incorrect_network_name_warning": "기록에 따르면 네트워크 이름이 이 체인 ID와 일치하지 않습니다.", "suggested_name": "추천 이름:", "network_check_validation_desc": "악성 또는 잘못된 네트워크에 연결될 가능성이 줄어듭니다.", @@ -2314,7 +2365,7 @@ "nft_empty_description": "끝없이 펼쳐지는 NFT의 세계. 나만의 컬렉션을 만들어 보세요.", "tokens_empty_description": "Nothing to see yet. Why not browse tokens or make a trade?", "discover_nfts": "NFT 가져오기", - "no_transactions": "거래가 없습니다!", + "no_transactions": "트랜잭션이 없습니다", "switch_network_to_view_transactions": "트랜잭션을 보려면 네트워크를 전환하세요", "send_button": "보내기", "deposit_button": "예금", @@ -2362,6 +2413,7 @@ "network_fee": "네트워크 수수료", "lists": "Token lists", "hide_cta": "토큰 숨기기", + "perps_trading": "무기한 선물 거래", "options": { "title": "Token options", "view_on_portfolio": "Portfolio에서 보기", @@ -2410,7 +2462,7 @@ }, "collectibles": { "cancel_add_collectible": "취소", - "add_collectible": "불러오기" + "add_collectible": "가져오기" }, "banners": { "search_desc": "개선된 토큰 감지 기능은 현재 {{network}} 네트워크에서 사용할 수 있습니다. ", @@ -2521,18 +2573,20 @@ "billion_abbreviation": "B", "trillion_abbreviation": "T", "million_abbreviation": "M", + "thousand_abbreviation": "K", "token_details": "토큰 상세 정보", "contract_address": "계약 주소", "token_list": "토큰 목록", "market_details": "시장 상세 정보", "market_cap": "Market cap", "total_volume": "Total volume (24h)", - "volume_to_marketcap": "Volume / market cap", + "volume_to_marketcap": "Volume / Market cap", "circulating_supply": "순환 공급", "all_time_high": "역대 최고", "all_time_low": "역대 최저", "fully_diluted": "완전히 희석됨", - "unknown": "알 수 없음" + "unknown": "알 수 없음", + "stock": "Stock" }, "collectible": { "collectible_address": "주소", @@ -2583,7 +2637,7 @@ "remove_snap_account": "Snap 계정 제거", "remove_snap_account_alert_description": "이 계정이 지갑에서 제거됩니다. 계속하기 전에 가져온 계정의 원래 비밀복구구문이나 개인 키를 가지고 있는지 확인하세요. 계정 드롭다운에서 계정을 다시 가져오거나 생성할 수 있습니다.", "remove_account_alert_remove_btn": "제거", - "remove_account_alert_cancel_btn": "알겠습니다", + "remove_account_alert_cancel_btn": "Never mind", "accounts_title": "계정", "connect_account_title": "계정 연결", "connect_accounts_title": "계정 연결", @@ -2620,7 +2674,7 @@ "advisory_by": "Ethereum Phishing Detector와 PhishFort에서 자문 제공", "potential_threat": "다음과 같은 잠재적 위협이 있습니다.", "fake_metamask": "MetaMask 위조 버전", - "srp_theft": "비밀복구구문 또는 비밀번호 도용", + "srp_theft": "Secret Recovery Phrase or password theft", "malicious_transactions": "자산 도난으로 이어지는 악성 거래", "secret_recovery_phrase": "비밀복구구문입니다", "account_name": "계정 이름", @@ -2675,8 +2729,8 @@ }, "connect_qr_hardware": { "title": "QR 코드 기반 하드웨어 지갑 연결", - "description1": "QR 코드를 통해 통신하는 에어갭 하드웨어 지갑을 연결합니다.", - "description2": "작동 방식?", + "description1": "Connect an airgapped hardware wallet that communicates through QR codes.", + "description2": "작동 방식", "description3": "공식적으로 지원되는 에어갭 하드웨어 지갑은 다음과 같습니다.", "keystone": "키스톤", "ngravezero": "N그레이브 제로", @@ -2717,14 +2771,14 @@ "select_rpc_url": "RPC URL을 선택하세요", "title": "설정", "current_conversion": "기준 통화", - "current_language": "Current language", - "ipfs_gateway": "IPFS 게이트웨이", + "current_language": "현재 언어", + "ipfs_gateway": "설정 내 IPFS", "ipfs_gateway_content": "MetaMask는 타사 서비스를 이용하여 IPFS에 저장된 NFT 이미지를 표시하고, 브라우저 주소창에 입력한 ENS 주소 관련 정보를 표시하며 다양한 토큰의 아이콘도 가져옵니다. 이러한 서비스를 이용하면 회원님의 IP 주소가 해당 서비스에 노출될 수 있습니다.", "ipfs_gateway_down": "현재 IPFS 게이트웨이가 닫혀 있습니다", "ipfs_gateway_desc": "선호하는 IPFS 게이트웨이를 선택하세요.", - "search_engine": "Search engine", + "search_engine": "검색 엔진", "new_RPC_URL": "신규 RPC 네트워크", - "state_logs": "State logs", + "state_logs": "상태 로그", "add_network_title": "네트워크 추가", "auto_lock": "자동 잠금", "auto_lock_desc": "앱이 자동으로 잠기기 전까지 걸리는 시간을 선택하세요.", @@ -2733,15 +2787,15 @@ "autolock_never": "절대", "autolock_after": " {{time}}초 후", "autolock_after_minutes": "{{time}}분 후", - "reveal_seed_words": "Reveal seed words", - "reset_account": "Reset account", - "state_logs_button": "Download state logs", + "reveal_seed_words": "시드 단어 공개", + "reset_account": "계정 초기화", + "state_logs_button": "상태 로그 다운로드", "reveal_seed_words_button": "시드 단어 공개", - "reset_account_button": "Reset account", + "reset_account_button": "계정 초기화", "reset_account_confirm_button": "네. 초기화합니다", "reset_account_cancel_button": "취소", - "reset_account_modal_title": "Reset account?", - "clear_approvals_modal_title": "Clear approval data?", + "reset_account_modal_title": "계정을 초기화할까요?", + "clear_approvals_modal_title": "승인 데이터를 지울까요?", "clear_approvals_modal_message": "계정 정보를 다시 보려면 모든 디앱에서 액세스를 요청해야 합니다.", "clear_browser_history_modal_title": "브라우저 기록을 지울까요?", "clear_browser_history_modal_message": "브라우저 기록을 제거할 예정입니다. 확실합니까?", @@ -2763,7 +2817,7 @@ "protect_title": "지갑 복구", "banner_social_login_enabled": "{{authConnection}}(으)로 로그인", "manage_recovery_method": "복구 방법 관리", - "video_failed": "Video failed to load.", + "video_failed": "영상을 가져올 수 없습니다.", "protect_desc": "비밀복구구문을 백업해 두면 지갑 접근 권한을 잃지 않을 수 있습니다. 본인만 접근할 수 있는 안전한 장소에 보관하고 반드시 기억하세요", "protect_desc_no_backup": "이것은 지갑의 12단어 구문입니다. 이 구문은 지갑에 있는 자금을 보내는 기능을 포함하여 현재와 미래의 모든 계정을 통제하기 위해 사용할 수 있습니다. 이 구문은 안전하게 보관하고 다른 사람과 공유하지 마세요. MetaMask는 이 키를 복구해 드릴 수 없습니다.", "learn_more": "더 알아보기.", @@ -2782,9 +2836,9 @@ "show_fiat_on_testnets_desc": "이 항목을 선택하면 테스트 네트워크에 법정 화폐 전환이 표시됩니다.", "show_fiat_on_testnets_modal_title": "주의하세요", "show_fiat_on_testnets_modal_description": "이 기능을 활성화할 것을 요청받았다면 사기일 가능성이 있습니다. 이 토큰은 금전적 가치가 없으며 테스트 목적으로만 사용됩니다. 이 기능은 개발자들이 자신의 앱이 작동하는지 확인하는 데 도움이 되는 기능입니다.", - "show_fiat_on_testnets_modal_learn_more": "자세히 알아보세요.", + "show_fiat_on_testnets_modal_learn_more": "더 보기", "show_fiat_on_testnets_modal_button": "계속", - "show_hex_data": "Show hex data", + "show_hex_data": "헥스 데이터 표시", "show_hex_data_desc": "보내기 화면에 헥스 데이터를 표시하려면 이것을 선택하세요.", "accounts_identicon_title": "계정 아이콘", "accounts_identicon_desc": "세 가지 고유한 아이콘 스타일 중 하나를 선택하면 계정을 한눈에 식별할 수 있습니다.", @@ -2793,7 +2847,7 @@ "general_title": "일반", "general_desc": "통화 변환, 기본 통화, 언어 및 검색 엔진.", "advanced_title": "고급", - "advanced_desc": "개발자 기능 액세스, 계정 초기화, 테스트넷 설정, 상태 로그, IPFS 게이트웨이 및 맞춤 RPC.", + "advanced_desc": "개발자 기능을 이용하고 계정을 초기화하며, 테스트넷, 상태 기록, IPFS 게이트웨이 및 사용자 지정 RPC를 설정하세요.", "notifications_title": "지갑 사용", "notifications_desc": "알림 관리", "allow_notifications": "알림 허용", @@ -2804,9 +2858,9 @@ "customize_session_desc": "수신하려는 알림 유형 켜기:", "account_session_title": "계정 활동", "account_session_desc": "알림을 수신할 계정을 선택하세요:", - "assets_sent_title": "Assets sent", + "assets_sent_title": "보낸 자산", "assets_sent_desc": "자금 및 NFT", - "assets_received_title": "Assets received", + "assets_received_title": "받은 자산", "assets_received_desc": "자금 및 NFT", "defi_title": "디파이", "defi_desc": "스테이킹, 스와핑, 브리징", @@ -2822,18 +2876,18 @@ "permissions_desc": "사이트 및 앱에 부여된 권한 관리.", "no_permissions": "권한 없음", "no_permissions_desc": "계정을 사이트나 앱에 연결하면 여기에 표시됩니다.", - "security_title": "보안 & 개인정보 보호", + "security_title": "보안 및 개인정보 보호", "back": "뒤로", "security_desc": "개인정보 설정, MetaMetrics, 개인 키, 비밀복구구문.", "networks_title": "네트워크", - "networks_default_title": "Default network", + "networks_default_title": "기본 네트워크", "network_delete": "이 네트워크를 삭제하시면, 이 네트워크에 있는 자산을 볼 때 네트워크를 다시 추가해야 합니다", "networks_default_cta": "이 네트워크 사용", "add_rpc_url": "RPC URL 추가", "add_block_explorer_url": "블록 탐색기 URL 추가", "networks_desc": "맞춤 RPC 네트워크 추가 및 수정", - "network_name_label": "Network name", - "network_name_placeholder": "Network name (optional)", + "network_name_label": "네트워크 이름", + "network_name_placeholder": "네트워크 이름(옵션)", "network_rpc_url_label": "RPC URL", "network_rpc_name_label": "RPC 이름", "network_rpc_placeholder": "신규 RPC 네트워크", @@ -2842,12 +2896,12 @@ "network_chain_id_label": "체인 ID", "network_chain_id_placeholder": "체인 ID", "network_symbol_label": "기호", - "network_block_explorer_label": "블록 익스플로러 URL", - "network_block_explorer_placeholder": "블록 익스플로러 URL (선택 사항)", + "network_block_explorer_label": "블록 탐색기 URL", + "network_block_explorer_placeholder": "블록 탐색기 URL(옵션)", "network_chain_id_warning": "잘못된 체인 ID", - "network_other_networks": "Other networks", + "network_other_networks": "다른 네트워크", "network_rpc_networks": "RPC 네트워크", - "network_add_network": "Add network", + "network_add_network": "네트워크 추가", "network_add_custom_network": "사용자 지정 네트워크 추가", "network_add": "추가", "network_save": "저장", @@ -2862,7 +2916,7 @@ "legal_title": "법률", "conversion_title": "통화 전환", "conversion_desc": "특정 통화를 어플리케이션 전체에서 피아트 값으로 표시.", - "primary_currency_title": "Primary currency", + "primary_currency_title": "기본 통화", "primary_currency_desc": "네이티브를 선택하면 체인의 본래 통화(예: ETH)로 값을 우선적으로 보여줍니다. 피아트를 선택하면 피아트 통화로 값을 우선적으로 보여줍니다.", "primary_currency_text_first": "네이티브", "primary_currency_text_second": "피아트", @@ -2883,7 +2937,7 @@ "batch_balance_requests_description": "한 번에 모든 계정의 잔액을 업데이트하세요. 이 기능을 끄면 다른 사람이 계정을 서로 연관 짓기 어려워집니다.", "third_party_title": "들어오는 거래 가져오기", "third_party_description": "타사 API(이더스캔)는 과거의 들어오는 거래를 보여주는 데 사용됩니다. 해당 서비스에서 데이터를 가져오는 것을 원하지 않으시면 기능을 끄세요.", - "metametrics_opt_out": "메타매트릭스 수신 거부", + "metametrics_opt_out": "MetaMetrics 수신 거부", "metametrics_restart_required": "변경 내용을 적용하려면 앱을 다시 시작해야 합니다.", "create_password": "비밀번호 생성", "invalid_password": "잘못된 비밀번호", @@ -2899,11 +2953,11 @@ "invalid_number": "잘못된 숫자입니다. 십진수나 '0x'로 시작하는 16진수를 입력하세요.", "invalid_number_leading_zeros": "잘못된 숫자입니다. 문자열 앞에 0이 있으면 이를 제거하세요.", "invalid_number_range": "잘못된 숫자입니다. 1과 %{maxSafeChainId} 사이에 숫자를 입력하세요", - "hide_zero_balance_tokens_title": "Hide tokens without balance", + "hide_zero_balance_tokens_title": "잔고 없는 토큰 숨기기", "hide_zero_balance_tokens_desc": "토큰 목록에서 잔고가 없는 토큰을 보이지 않게 합니다.", "token_detection_title": "토큰 자동 감지", "token_detection_description": "MetaMask는 지갑에 보내진 새로운 토큰을 감지해 표시하기 위해 타사 API를 사용합니다. 이 서비스로부터 데이터를 가져오기를 원치 않으시면 해당 기능을 끄세요.", - "theme_button_text": "Change theme", + "theme_button_text": "테마 변경", "theme_title": "({{theme}}) 테마", "theme_description": "테마를 설정해 앱 외관을 변경하세요.", "theme_os": "시스템", @@ -2935,13 +2989,13 @@ "delete_metrics_description_after_delete_part_two": ". 이 과정에는 약 30일 정도 소요됩니다. 다음을 참고하세요:", "delete_metrics_description_privacy_policy": "개인정보 처리방침.", "delete_metrics_button": "MetaMetrics 데이터 삭제", - "check_status_button": "Check status", + "check_status_button": "상태 확인", "delete_metrics_confirm_modal_title": "MetaMetrics 데이터 삭제?", "delete_metrics_confirm_modal_description": "모든 MetaMetrics 데이터를 삭제하려고 합니다. 확실합니까?", "delete_wallet_data_title": "지갑 초기화", "delete_wallet_data_description": "장치에서 모든 지갑 관련 데이터가 삭제됩니다. 계정은 블록체인에 존재하므로 MetaMask와는 관련이 없습니다. 비밀복구구문을 사용하면 언제든지 계정을 복구할 수 있습니다.", "delete_wallet_data_button": "지갑 초기화", - "delete_data_status_title": "Deletion task status", + "delete_data_status_title": "작업 상태 삭제", "delete_data_status_description": "현재 상태:", "delete_metrics_error_title": "지금 데이터를 가져올 수 없습니다.", "delete_metrics_error_description": "분석 시스템 서버 문제로 지금 요청을 처리할 수 없습니다. 나중에 다시 시도하세요.", @@ -2956,6 +3010,7 @@ "description": "지역 & 더 보기...", "current_region": "현재 지역", "reset_region": "지역 재설정", + "change_region": "지역 변경", "no_region_selected": "선택한 지역이 없습니다", "sdk_activation_keys": "SDK 활성화 키", "activation_keys_description": "활성화 키는 특별한 기능이나 제공업체를 활성화합니다.", @@ -3006,13 +3061,13 @@ }, "snap_details": { "install_date": "{{date}}에 설치됨", - "install_origin": "Install origin", + "install_origin": "Origin 설치", "enabled": "활성화됨", "version": "버전" }, "keyring_account_list_item": { "account_name": "계정 이름", - "public_address": "Public address" + "public_address": "공개 주소" }, "snap_permissions": { "approved_date": "{{date}}에 승인됨", @@ -3067,24 +3122,24 @@ "dismiss_smart_account_update_desc": "이 기능을 켜면 모든 계정에서 '스마트 계정으로 전환' 제안이 더 이상 표시되지 않습니다. 스마트 계정을 사용하면 트랜잭션이 빨라지고 네트워크 수수료가 낮아지며 결제가 유연해집니다.", "use_smart_account_heading": "스마트 계정 사용", "use_smart_account_desc": "이 옵션을 켜면 트랜잭션 속도 향상, 네트워크 수수료 감소, 유연한 결제 등 관련 기능을 사용할 수 있을 때마다 MetaMask에서 생성한 계정이 자동으로 스마트 계정으로 전환됩니다.", - "use_smart_account_learn_more": "자세히 알아보세요.", + "use_smart_account_learn_more": "더 보기", "smart_transactions_opt_in_heading": "스마트 트랜잭션", "smart_transactions_opt_in_desc_supported_networks": "지원되는 네트워크에서 더 안정적이고 안전하게 트랜잭션을 진행하려면 스마트 트랜잭션을 활성화하세요.", - "smart_transactions_learn_more": "자세히 알아보세요.", + "smart_transactions_learn_more": "더 보기", "simulation_details": "예상 잔액 변동", "simulation_details_description": "이 기능을 켜면 트랜잭션을 확정하기 전에 트랜잭션의 잔액 변동을 추정할 수 있습니다. 이 기능이 트랜잭션의 최종 결과를 보장하지는 않습니다. ", "simulation_details_learn_more": "자세히 알아보세요.", - "aes_crypto_test_form_title": "AES crypto - test form", + "aes_crypto_test_form_title": "AES 암호화 - 테스트 양식", "aes_crypto_test_form_description": "E2E 테스트 전용으로 개발된 섹션입니다. 앱에서 이 섹션이 표시되면 MetaMask 지원팀에 보고하세요.", "developer_options": { - "title": "Developer options", - "generate_trace_test": "Generate trace test", - "generate_trace_test_desc": "Generate a developer test Sentry trace.", - "navigate_to_sample_feature": "Navigate to sample feature", + "title": "개발자 옵션", + "generate_trace_test": "트레이스 테스트 생성", + "generate_trace_test_desc": "Sentry 트레이스 개발자 테스트를 생성합니다.", + "navigate_to_sample_feature": "샘플 기능으로 이동", "sample_feature_desc": "개발자를 위한 템플릿용 샘플 기능." }, "feature_flag_override": { - "title": "Feature flag override", + "title": "기능 플래그 무시", "description": "로컬에서 앱의 기능 플래그 동작을 수동으로 재정의하세요." } }, @@ -3137,7 +3192,7 @@ "sdk_feedback_modal": { "ok": "확인", "title": "계정에 연결할 수 없습니다", - "info": "MetaMask에 다시 연결하려면 디앱의 QR 코드를 스캔하세요" + "info": "Please scan the QR code on the site to reconnect to MetaMask" }, "app_information": { "title": "정보", @@ -3145,8 +3200,8 @@ "privacy_policy": "개인정보 보호 정책", "terms_of_use": "이용 약관", "attributions": "권한", - "support_center": "Visit our support center", - "web_site": "웹사이트 방문", + "support_center": "지원 센터 방문", + "web_site": "Visit our website", "contact_us": "Contact us" }, "reveal_credential": { @@ -3203,7 +3258,7 @@ "keep_credential_safe": "{{credentialName}} 정보를 안전하게 보관하세요", "srp_abbreviation_text": "SRP", "srp_text": "비밀복구구문입니다", - "private_key_text": "비공개 키", + "private_key_text": "개인 키", "got_it": "확인", "learn_more": "더 보기" }, @@ -3211,12 +3266,12 @@ "title": "안전성 알림", "description": "스크린숏은 {{credentialName}}(을)를 보관하기에 안전한 방법이 아닙니다. 계정을 안전하게 유지하려면 온라인으로 백업이 되지 않는 곳에 보관하세요.", "srp_text": "비밀복구구문입니다", - "priv_key_text": "비공개 키" + "priv_key_text": "개인 키" }, "password_reset": { "password_title": "비밀번호", "password_desc": "기기에 설치된 MetaMask 앱을 잠금 해제하는 비밀번호는 보안 강도가 높아야 합니다. 비밀번호를 잃어버렸을 때는 지갑을 다시 불러오기 위해 비밀 복구 구문이 필요합니다.", - "password_learn_more": "더 알아보기.", + "password_learn_more": "더 보기", "change_password": "비밀번호 변경", "password_hint": "비밀번호 힌트" }, @@ -3246,19 +3301,28 @@ "swap": "스왑", "bridge": "브릿지", "earn": "수익 창출", - "convert_to_musd": "Convert to mUSD", + "convert_to_musd": "mUSD로 전환", + "merkl_rewards": { + "annual_bonus": "{{apy}}% 보너스", + "claimable_bonus": "청구 가능한 보너스", + "claimable_bonus_tooltip_description": "mUSD bonuses are claimed on Linea.", + "terms_apply": "Terms apply.", + "ok": "확인", + "claim": "청구", + "processing_claim": "Processing claim..." + }, "tron": { - "daily_resource_new_energy": "New daily energy", - "sufficient_to_cover": "Sufficient to cover", + "daily_resource_new_energy": "신규 일일 에너지", + "sufficient_to_cover": "잔액 충분", "transactions": "트랜잭션", "daily_resource": "일일 자원", "bandwidth": "대역폭 포인트", "energy": "에너지", - "daily_resource_description": "This is your daily allowance based on your staked TRX. Hold TRX to get 600 bandwidth daily.", - "sufficient_to_cover_trx_transfers": "Covers ~{{amount}} TRX transfers", - "sufficient_to_cover_trx_transfer": "Covers 1 TRX transfer", - "sufficient_to_cover_usdt_transfers": "Covers ~{{amount}} USDT transfers", - "sufficient_to_cover_usdt_transfer": "Covers 1 USDT transfer" + "daily_resource_description": "이는 TRX를 스테이킹한 양에 따라 매일 지급되는 양입니다. TRX를 보유하면 매일 600의 대역폭을 받을 수 있습니다.", + "sufficient_to_cover_trx_transfers": "약 {{amount}} TRX를 전송할 수 있습니다", + "sufficient_to_cover_trx_transfer": "약 1 TRX를 전송할 수 있습니다", + "sufficient_to_cover_usdt_transfers": "약 {{amount}} USDT를 전송할 수 있습니다", + "sufficient_to_cover_usdt_transfer": "약 1 USDT를 전송할 수 있습니다" }, "disabled_button": { "buy": "이 계정에서는 매수가 지원되지 않음", @@ -3311,9 +3375,11 @@ }, "no_chart_data": { "title": "차트 데이터 없음", - "description": "이 토큰에 관한 데이터를 가져오지 못했습니다" + "description": "이 토큰에 관한 데이터를 가져오지 못했습니다", + "insufficient_data": "Data is not available for this time period" }, "your_balance": "내 잔액", + "perps_position": "무기한 선물 포지션", "unable_to_load_balance": "잔액을 가져올 수 없습니다", "about": "정보", "about_content_display": { @@ -3363,7 +3429,7 @@ "address_copied_to_clipboard": "토큰 주소가 클립보드에 복사됨" }, "qr_scanner": { - "invalid_qr_code_title": "잘못된 QR 코드", + "invalid_qr_code_title": "Invalid QR code", "invalid_qr_code_message": "스캔하려 하는 QR 코드가 유효하지 않습니다.", "allow_camera_dialog_title": "카메라 접근 허용", "allow_camera_dialog_message": "QR 코드를 스캔하기 위해서는 권한이 필요합니다", @@ -3376,14 +3442,14 @@ "attempting_sync_from_wallet_error": "확장 프로그램과의 동기화를 시도하시는 것 같습니다. 이를 위해서는 현재 지갑을 지워야 합니다. \n\n 신규 버전 앱을 지우거나 재설치하고 나면 \"MetaMask 확장 프로그램과 동기화\" 옵션을 선택하세요. 중요!: 지갑을 지우기 전에 비밀 복구 구문을 반드시 백업하세요.", "not_allowed_error_title": "카메라 접근 권한 허용", "not_allowed_error_desc": "QR 코드를 스캔하려면 기기 설정 메뉴에서 MetaMask에 카메라 접근 권한을 허용해야 합니다.", - "unrecognized_address_qr_code_title": "읽을 수 없는 QR 코드", + "unrecognized_address_qr_code_title": "Unrecognized QR code", "unrecognized_address_qr_code_desc": "죄송합니다. 이 QR 코드는 계정 주소나 연락처 주소와 연계되어 있지 않습니다.", "url_redirection_alert_title": "이제 외부 링크로 이동합니다", "url_redirection_alert_desc": "링크는 피싱이나 사기에 도용될 수 있습니다. 신뢰할 수 있는 웹사이트만 방문하시기 바랍니다.", "label": "QR 코드 스캔", "open_settings": "설정", "camera_not_available": "카메라를 사용할 수 없습니다", - "tron_address_not_supported": "Tron addresses are not currently supported" + "tron_address_not_supported": "Tron 주소는 현재 지원되지 않습니다" }, "action_view": { "cancel": "취소", @@ -3471,10 +3537,10 @@ "cancel_tx_message": "이 시도를 제출한다고 해서 기존의 거래가 취소될 것이라는 보장은 없습니다. 취소 시도가 성공적으로 진행되면 위에 공지된 거래 수수료가 부과됩니다.", "speedup_tx_title": "속도 향상을 원하시나요?", "speedup_tx_message": "이 시도를 제출한다고 해서 기존의 거래의 속도가 향상될 것이라는 보장은 없습니다. 속도 향상 시도가 성공적으로 진행되면 위에 공지된 거래 수수료가 부과됩니다.", - "nevermind": "알겠습니다", + "nevermind": "Never mind", "edit_network_fee": "가스요금 수정", "edit_priority": "우선 순위 편집", - "gas_cancel_fee": "가스 취소 수수료", + "gas_cancel_fee": "Gas cancellation fee", "gas_speedup_fee": "가스 속도 향상 비용", "use_max": "최대 사용", "set_gas": "설정", @@ -3602,7 +3668,7 @@ "reload": "새로 고침", "share": "공유", "bookmark": "북마크", - "add_to_favorites": "즐겨찾기에 추가", + "add_to_favorites": "Add to favorites", "error": "오류", "cancel": "취소", "go_back": "뒤로 돌아가기", @@ -3610,7 +3676,7 @@ "home": "홈", "close": "종료", "open_in_browser": "브라우저에서 열기", - "change_url": "url 변경", + "change_url": "Change URL", "switch_network": "네트워크 변경", "dapp_browser": "디앱 브라우저", "dapp_browser_message": "MetaMask는 탈중앙화 웹을 위한 여러분의 지갑과 브라우저입니다. 전체를 둘러보세요!", @@ -3654,7 +3720,7 @@ "add_favorite": { "title": "Add favorite", "title_label": "이름", - "url_label": "Url", + "url_label": "URL", "add_button": "추가", "cancel_button": "취소" }, @@ -3676,30 +3742,30 @@ "tx_review_increase_allowance": "Increase allowance", "tx_review_set_approval_for_all": "Set approval for all", "tx_review_staking_claim": "Staking claim", - "tx_review_staking_deposit": "Staking deposit", + "tx_review_staking_deposit": "스테이킹 예치", "tx_review_staking_unstake": "언스테이크", - "tx_review_lending_deposit": "Lending deposit", + "tx_review_lending_deposit": "대출 예치", "tx_review_lending_withdraw": "Lending withdrawal", "tx_review_perps_deposit": "무기한 선물 입금 완료", "tx_review_predict_deposit": "예측 자금 충전 완료", "tx_review_predict_claim": "수익금 수령 완료", "tx_review_predict_withdraw": "예측 자금 출금", - "tx_review_musd_conversion": "mUSD Conversion", - "sent_ether": "보낸 이더", - "self_sent_ether": "Sent yourself Ether", - "received_ether": "받은 이더", + "tx_review_musd_conversion": "mUSD 전환", + "sent_ether": "Sent ETH", + "self_sent_ether": "Sent yourself ETH", + "received_ether": "Received ETH", "sent_dai": "보낸 DAI", "self_sent_dai": "나에게 보낸 DAI", "received_dai": "받은 DAI", "sent_tokens": "Sent tokens", "received_tokens": "Received tokens", - "ether": "이더", + "ether": "ETH", "sent_unit": "보낸 {{unit}}", "self_sent_unit": "Sent yourself {{unit}}", "received_unit": "받은 {{unit}}", "sent_collectible": "Sent collectible", "received_collectible": "Received collectible", - "send_ether": "Send Ether", + "send_ether": "Send ETH", "send_unit": "Send {{unit}}", "send_collectible": "Send collectible", "receive_collectible": "Receive collectible", @@ -3732,9 +3798,9 @@ }, "gas_used": "Gas used (units)", "gas_limit": "Gas limit (units)", - "gas_price": "가스 가격 (GWEI)", - "base_fee": "기본 요금(GWEI)", - "priority_fee": "우선 요금(GWEI)", + "gas_price": "Gas price (GWEI)", + "base_fee": "Base fee (GWEI)", + "priority_fee": "Priority fee (GWEI)", "multichain_priority_fee": "우선 요금", "max_fee": "Max fee per gas", "total": "총", @@ -3767,7 +3833,7 @@ "confirm_gas_fee_token_tooltip": "이 비용은 사용자 트랜잭션을 처리하는 대가로 네트워크에 지불됩니다. 여기에는 ETH 계열이 아닌 토큰이나 사전 충전된 ETH에 대한 {{metamaskFeeFiat}} MetaMask 수수료가 포함됩니다.", "paid_by_metamask": "MetaMask가 지불함", "confirm_gas_fee_token_metamask_fee": "{{metamaskFeeFiat}} 수수료 포함", - "smart_account_upgrade": "스마트 계정으로 업그레이드", + "smart_account_upgrade": "스마트 계정으로 전환", "smart_account_downgrade": "일반 계정으로 전환", "batched_transactions": "일괄 트랜잭션", "gas_modal": { @@ -4004,8 +4070,8 @@ "biometrics": { "enable_touchid": "터치 ID로 잠금 해제하시겠습니까?", "enable_faceid": "페이스 ID로 잠금 해제하시겠습니까?", - "enable_fingerprint": "지문으로 잠금 해제하시겠습니까?", - "enable_biometrics": "생체 인식으로 잠금 해제하시겠습니까?", + "enable_fingerprint": "Unlock with fingerprint?", + "enable_biometrics": "Unlock with biometrics?", "enable_device_passcode_ios": "기기 비밀번호로 잠금 해제하시겠습니까?", "enable_device_passcode_android": "기기 PIN으로 잠금 해제하시겠습니까?" }, @@ -4020,18 +4086,18 @@ "title": "연결 요청", "walletconnect_title": "지갑 연결 요청", "action": "이 사이트로 연결하시겠습니까?", - "action_reconnect": "연결을 회복하려면 디앱에 나타난 숫자를 선택하세요", - "action_reconnect_deeplink": "이 디앱에 다시 연결하시겠습니까?", + "action_reconnect": "To resume connection, choose the number you see on the site", + "action_reconnect_deeplink": "Do you want to reconnect to this site?", "connect": "연결", "resume": "다시 시작", "cancel": "취소", - "donot_rememberme": "이 디앱 연결을 기억하지 않기", + "donot_rememberme": "Do not remember this site connection", "disconnect": "연결 해제", "permission": "귀하의", "address": "공개 주소", "sign_messages": "귀하 대신", "on_your_behalf": "메시지에 서명하기", - "warning": "연결을 클릭하면 귀하는 본 디앱이 귀하의 공개 주소를 확인하는 것을 승인하는 것입니다. 이것은 데이터를 각종 피싱 공격으로부터 지키는 매우 중요한 보안적 절차입니다." + "warning": "By clicking connect, you allow this site to view your public address. This is an important security step to protect your data from potential phishing risks." }, "import_private_key": { "title": "계정 가져오기", @@ -4047,7 +4113,7 @@ "error_title": "문제가 발생했습니다", "error_message": "개인 키를 불러올 수 없었습니다. 키를 정확히 입력했는지 확인하세요.", "error_empty_message": "개인 키를 입력해야 합니다.", - "or_scan_a_qr_code": "또는 QR 코드를 스캔하세요" + "or_scan_a_qr_code": "or scan a QR code" }, "import_private_key_success": { "title": "계정을 성공적으로 불러왔습니다!", @@ -4064,12 +4130,12 @@ "paste": "붙여넣기", "clear": "모두 지우기", "srp_number_of_words_option_title": "단어 수", - "12_word_option": "12단어 구문이 있습니다", - "24_word_option": "24단어 구문이 있습니다", + "12_word_option": "I have a 12-word phrase", + "24_word_option": "I have a 24-word phrase", "error_title": "문제가 발생했습니다", "error_message": "We couldn't import that Secret Recovery Phrase. Please make sure you entered it correctly.", "error_empty_message": "You need to enter your Secret Recovery Phrase.", - "error_number_of_words_error_message": "비밀복구구문은 12개 또는 24개의 단어로 구성됩니다", + "error_number_of_words_error_message": "Secret Recovery Phrases contain 12 or 24 words", "error_srp_is_case_sensitive": "잘못된 입력입니다! 비밀복구구문은 대소문자가 구별되어야 합니다.", "error_srp_word_error_1": "단어 ", "error_srp_word_error_2": " 이(가) 잘못되었거나 철자가 틀렸습니다.", @@ -4079,7 +4145,7 @@ "error_invalid_srp": "잘못된 비밀복구구문", "error_duplicate_srp": "이 비밀복구구문은 이미 가져왔습니다.", "error_duplicate_account": "The account you are trying to import is a duplicate.", - "invalid_qr_code_title": "잘못된 QR 코드", + "invalid_qr_code_title": "Invalid QR code", "invalid_qr_code_message": "The QR code does not contain a valid Secret Recovery Phrase", "success_1": "지갑", "success_2": "가져옴" @@ -4151,7 +4217,7 @@ "why_secure_2": " 이 구문은 앱이 잠겨 있거나 새 기기를 사용할 때 지갑을 복구하는 유일한 방법입니다." }, "account_backup_step_2": { - "cancel_backup_title": "Cancel backup", + "cancel_backup_title": "백업 취소", "cancel_backup_message": "지갑을 복원하기 위해서 비밀 복구 구문을 저장할 것을 강력 추천합니다.", "cancel_backup_ok": "네, 위험을 감수하겠습니다", "cancel_backup_no": "아니요, 비밀 복구 구문을 백업하겠습니다", @@ -4163,7 +4229,7 @@ "cta_text": "확인" }, "account_backup_step_3": { - "cancel_backup_title": "Cancel backup", + "cancel_backup_title": "백업 취소", "cancel_backup_message": "지갑을 복원하기 위해서 비밀 복구 구문을 저장할 것을 강력 추천합니다.", "cancel_backup_ok": "네, 위험을 감수하겠습니다", "cancel_backup_no": "아니요, 비밀 복구 구문을 백업하겠습니다", @@ -4172,7 +4238,7 @@ "cta_text": "아무도 보고 있지 않습니다" }, "account_backup_step_4": { - "cancel_backup_title": "Cancel backup", + "cancel_backup_title": "백업 취소", "cancel_backup_message": "지갑을 복원하기 위해서 비밀 복구 구문을 저장할 것을 강력 추천합니다.", "cancel_backup_ok": "네, 위험을 감수하겠습니다", "cancel_backup_no": "아니요, 비밀 복구 구문을 백업하겠습니다", @@ -4197,16 +4263,16 @@ "modal_button": "다음" }, "account_backup_step_6": { - "title": "Security tips", + "title": "보안 팁", "info_text": "비밀 복구 구문 분실시 MetaMask는 구문을 복구해드릴 수 없습니다", "tip_1": "자신의 비밀 복구 구문을 여러 군데 백업해 놓으세요", "tip_2": "구문을 신뢰할 수 있는 비밀번호 매니저에 저장하고 종이에 적어 안전한 곳에 두세요", "tip_3": "다른 사람과 절대 구문을 공유하지 마세요", "disclaimer": "*비밀 복구 구문은 다음에서 찾을 수 있습니다:", - "disclaimer_bold": "설정 > 보안 & 개인정보 보호", - "cta_text": "확인했습니다!", + "disclaimer_bold": "IPFS 레졸루션을", + "cta_text": "확인했습니다", "modal_title": "축하합니다!", - "modal_text": "백업이 완료되었으며 준비가 되었습니다!", + "modal_text": "백업이 완료되었으며 준비가 되었습니다.", "modal_button": "완료", "copy_seed_phrase": "비밀 복구 구문을 클립보드에 복사하세요" }, @@ -4238,7 +4304,7 @@ "steps": "{{currentStep}} 단계/{{totalSteps}} 단계", "action": "비밀복구구문 컨펌", "info": "빠진 단어를 올바른 순서로 선택하세요.", - "complete": "Complete backup", + "complete": "백업 완료", "success": "성공", "error-title": "올바르지 않습니다", "error-description": "비밀복구구문을 다시 확인하고 시도하세요.", @@ -4253,7 +4319,7 @@ "congratulations": "축하합니다", "success": "지갑을 성공적으로 보호했습니다. 비밀 복구 구문을 꼭 안전하게 보관하세요. 이 구문의 보안 책임을 본인에게 있습니다!", "hint": "힌트를 남기고 싶으신가요?", - "recover": "지갑을 잃어버릴 경우 MetaMask는 이를 복구해드릴 수 없습니다. 비밀 복구 구문은 설정 > 보안 & 개인정보 보호에서 확인할 수 있습니다.", + "recover": "지갑을 분실할 경우 MetaMask는 지갑을 복구해 드릴 수 없습니다. '설정 > 보안 및 개인정보 보호'에서 비밀복구구문을 찾을 수 있습니다.", "learn": "더 알아보기", "done": "완료", "recovery_hint": "복구 힌트", @@ -4300,7 +4366,7 @@ "withdrawal_completed": "출금 완료", "unstake_completed": "언스테이킹 완료", "withdrawal_requested": "출금 요청됨", - "stake_ready_to_be_withdrawn": "스테이킹이 인출 준비됨", + "stake_ready_to_be_withdrawn": "스테이킹이 출금 준비됨", "swap_completed": "{{from}}(을)를 {{to}}(으)로 스왑함", "swap": "스왑됨", "sent": "{{address}}(으)로 전송됨", @@ -4417,7 +4483,7 @@ "metamask_swap_completed_title": "스왑 완료", "metamask_swap_completed_description": "MetaMask 스왑이 완료되었습니다", "nft_sent_title": "NFT 전송됨", - "nft_sent_description": "NFT를 보냈습니다", + "nft_sent_description": "You successfully sent an NFT", "nft_received_title": "NFT 받음", "nft_received_description": "새로운 NFT를 받았습니다", "rocketpool_stake_completed_title": "스테이킹 완료", @@ -4519,7 +4585,7 @@ "copy_to_clipboard": "클립보드로 복사", "qr_code": "QR 코드", "send_link": "Send link", - "request_qr_code": "결제 요청 QR 코드", + "request_qr_code": "Payment request QR code", "balance": "잔고" }, "receive_request": { @@ -4561,12 +4627,12 @@ "close_current_session": "새 세션을 시작하기 전에 현재 세션을 닫아야 합니다." }, "paymentRequest": { - "title": "결제 요청", - "title_complete": "결제 완료", - "confirm": "지불", - "cancel": "거절", + "title": "Payment request", + "title_complete": "Payment complete", + "confirm": "Pay", + "cancel": "Decline", "is_requesting_you_to_pay": "이(가) 결제를 요청했습니다", - "total": "총:" + "total": "총액:" }, "webview_error": { "title": "문제가 발생했습니다", @@ -4589,6 +4655,10 @@ "fiat_on_ramp": { "buy_eth": "ETH 구매", "buy": "{{ticker}} 구매", + "on_network": "{{networkName}} 네트워크", + "debit_card": "직불 카드", + "continue": "계속", + "powered_by_provider": "제공자: {{provider}}", "purchased_currency": "구매한 {{currency}}", "network_not_supported": "현재 네트워크는 지원하지 않음", "switch_network": "메인넷으로 전환하세요", @@ -4609,7 +4679,7 @@ "second_line": "진행하시겠습니까?" }, "buy_ticker": "{{ticker}} 구매", - "buy_ticker_stablecoins": "{{ticker}} 및 스테이블 코인 구매", + "buy_ticker_stablecoins": "{{ticker}} 및 스테이블코인 구매", "multiple_payment_methods": "다중 결제 방법", "debit_credit_bank_transfers_country": "국가에 따라 직불카드, 신용카드, 은행 송금을 통한 결제 가능", "debit_credit_bank_transfers_more_country": "국가에 따라 직불카드, 신용카드, 은행 송금 등을 통한 결제 가능", @@ -4676,6 +4746,14 @@ "subtitle_5": "가스비가 얼마나 드는지 보는 것입니다.", "cta": "{{ticker}} 구매 계속" } + }, + "build_quote_settings_modal": { + "title": "설정", + "view_order_history": "주문 내역 보기", + "contact_support": "지원팀에 문의", + "log_out": "{{provider}}에서 로그아웃", + "logged_out_success": "로그아웃했습니다", + "logged_out_error": "로그아웃 오류" } }, "fiat_on_ramp_aggregator": { @@ -4706,7 +4784,7 @@ "use_new_buy_experience_description": "최신 버전으로 전환" }, "onboarding": { - "what_to_expect": "소개", + "what_to_expect": "예상되는 내용", "quotes": "MetaMask의 암호화폐 구매 기능은 통합된 공급업체로부터 견적을 집계하여 견적을 제공하므로 대기 기간 없이 암호화폐를 소스에서 지갑으로 직접 가져올 수 있습니다.", "quotes_sell": "이제 MetaMask에서 직접 현금을 인출할 수 있습니다! MetaMask의 안내에 따라 한 단계씩 진행하며 신뢰하는 제공업체의 최신 견적을 받으세요.", "benefits": "가스비가 저렴하면서 수많은 네트워크, 토큰, 결제 수단이 지원됩니다.", @@ -4822,6 +4900,7 @@ "title": "지역을 선택하세요", "description": "이용 가능 지불 방법과 토큰은 타사 통합업체가 결정하므로 현재 거주지의 지역 및 통합업체에 따라 달라질 수 있습니다.", "sell_description": "현금 송금처 옵션과 토큰은 지역별로 다를 수 있습니다.", + "region_variation_notice": "결제 수단 및 사용 가능한 토큰은 거주 지역 및 제공업체에 따라 다를 수 있습니다.", "search_by_country": "국가별 검색", "search_by_state": "주로 검색", "no_region_results": "일치하는 지역이 없습니다", @@ -4849,7 +4928,7 @@ "continue_order_description": "주문을 계속하려면 이 페이지의 하단에 있는 버튼을 선택해야 합니다.", "the_provider": "공급업체", "processing": "주문 처리 중", - "processing_card_description": "신용카드/직불카드 구매는 보통 몇 분가량 소요됩니다", + "processing_card_description": "신용/체크카드 결제는 일반적으로 몇 분 정도 소요됩니다", "processing_bank_description": "은행 송금은 일반적으로 영업일 기준 2-3일이 소요됩니다", "details": "주문 세부 정보", "via": "방법:", @@ -4883,11 +4962,11 @@ "sent": "보낸!" }, "notifications": { - "purchase_failed_title": "{{currency}} 구매에 실패했습니다! 다시 시도하세요. 불편을 드려 죄송합니다!", + "purchase_failed_title": "{{currency}} 구매에 실패했습니다. 잠시 후 다시 시도해 주세요.", "purchase_failed_description": "결제 수단 및 카드의 지원 여부를 확인하세요", "purchase_cancelled_title": "구매가 취소되었습니다", "purchase_cancelled_description": "결제 수단 및 카드의 지원 여부를 확인하세요", - "purchase_completed_title": "{{amount}} {{currency}} 구매에 실패했습니다!", + "purchase_completed_title": "{{amount}} {{currency}} 매수에 성공했습니다.", "purchase_completed_description": "{{currency}} 이용이 불가능합니다", "purchase_pending_title": "{{currency}} 구매 처리 중", "purchase_pending_description": "몇 분 정도 소요됩니다...", @@ -4896,7 +4975,7 @@ "sale_cancelled_title": "주문 취소됨", "sale_cancelled_description": "주문을 완료할 수 없습니다.", "sale_completed_title": "주문 완료", - "sale_completed_description": "주문에 성공했습니다!", + "sale_completed_description": "주문이 완료되었습니다.", "sale_pending_title": "{{currency}} 매도 처리 중", "sale_pending_description": "주문이 처리 중입니다.", "no_date": "알 수 없음" @@ -4921,7 +5000,7 @@ "start_swapping": "스와프 시작" }, "feature_off_title": "일시적으로 이용이 불가합니다", - "feature_off_body": "MetaMask 스와프는 현재 유지 보수 작업을 진행하고 있습니다. 향후에 다시 확인해 주세요.", + "feature_off_body": "MetaMask Swaps are undergoing maintenance. Please check back later.", "wrong_network_title": "스와프 이용 불가", "wrong_network_body": "이더리움 메인 네트워크에서만 토큰 스와프가 가능합니다.", "unallowed_asset_title": "이 토큰은 스와프할 수 없습니다.", @@ -5002,7 +5081,7 @@ "edit": "수정", "quotes_include_fee": "견적에는 {{fee}}%의 MetaMask 수수료가 포함됩니다", "quotes_include_gas_and_metamask_fee": "견적에는 가스비와 {{fee}}%의 MetaMask 수수료가 포함됩니다", - "tap_to_swap": "탭하여 스와프하세요", + "tap_to_swap": "Tap to swap", "swipe_to_swap": "밀어서 스와프하세요", "swipe_to": "밀어서", "swap": "스왑", @@ -5385,7 +5464,7 @@ "learn_more": "더 보기" }, "token_allowance": { - "verify_third_party_details": "타사 세부 정보 검증", + "verify_third_party_details": "Verify third-party details", "protect_from_scams": "사기를 방지하려면 잠시 시간을 내어 타사에 대한 세부 정보를 확인하세요.", "learn_to_verify": "타사 세부 정보 검증 방법", "spending_cap": "지출 한도", @@ -5399,7 +5478,7 @@ }, "restore_wallet": { "restore_needed_title": "복원 필요", - "restore_needed_description": "문제가 발생했지만 걱정하지 마세요! 지갑 복원을 시도해 보겠습니다.", + "restore_needed_description": "Something went wrong, but don’t worry! Let’s try to restore your wallet.", "restore_needed_action": "지갑 복원" }, "wallet_restored": { @@ -5598,6 +5677,10 @@ "error_description": "{{snap}} 설치에 실패했습니다." }, "earn": { + "claimable_bonus_tooltip": "An annual bonus claimable daily from your wallet.", + "earn_a_percentage_bonus": "Earn a {{percentage}}% bonus", + "claimable_bonus": "Claimable bonus", + "claim_bonus": "Claim bonus", "empty_state_cta": { "heading": "{{tokenSymbol}} 토큰을 빌려주고 수익을 올리세요", "body": "{{protocol}}에서 {{tokenSymbol}}을 예치하고 연간 이자를", @@ -5681,21 +5764,36 @@ "fee": "수수료" }, "musd_conversion": { - "convert_to_musd": "Convert to mUSD", + "ok": "확인", + "continue": "Continue", + "convert_and_get_percentage_bonus": "전환 후 {{percentage}}% 받기", + "get_a_percentage_musd_bonus": "{{percentage}}%의 mUSD 보너스 혜택", + "convert": "전환", "toasts": { - "converting": "Converting {{token}} → mUSD", + "converting": "{{token}} → mUSD로 전환 중", "eta": "~{{time}}", - "delivered": "Your mUSD has been delivered!", - "failed": "mUSD conversion failed" + "delivered": "mUSD 전환 완료!", + "failed": "mUSD 전환 실패" }, "education": { - "heading": "mUSD로 보상 받기", - "description": "Convert your USDC, USDT, or DAI for mUSD, MetaMask’s dollar-backed stablecoin.Earn points every time you convert or hold $100.", - "continue_button": "지금 시작하세요" + "heading": "스테이블 코인\n{{percentage}}% 혜택", + "description": "Convert your stablecoins to mUSD, MetaMask’s US dollar-backed stablecoin, and receive up to a {{percentage}}% bonus.", + "terms_apply": "Terms apply.", + "primary_button": "시작하기", + "secondary_button": "나중에" }, - "earn_points_daily": "Earn points daily", - "buy_musd": "Buy mUSD", - "get_musd": "Get mUSD" + "buy_musd": "mUSD 구매", + "get_musd": "mUSD 받기", + "boost_title": "Get {{percentage}}% on your stablecoins", + "boost_description": "Convert your stablecoins to mUSD and receive up to a {{percentage}}% bonus.", + "powered_by_relay": "제공자: Relay" + }, + "bonus_claim": { + "toasts": { + "claiming": "Your mUSD bonus is processing", + "delivered": "Your mUSD bonus is here!", + "failed": "Bonus claim failed" + } }, "rewards": { "rewards_tag_label": "보상", @@ -5711,22 +5809,22 @@ "stake": "Stake", "earn": "수익 창출", "tron": { - "stake_completed": "Staking completed", - "stake_completed_description": "Your staking transaction has been completed successfully.", - "stake_failed": "Staking failed", + "stake_completed": "스테이킹 완료", + "stake_completed_description": "스테이킹 트랜잭션이 성공적으로 완료되었습니다.", + "stake_failed": "스테이킹 실패", "unstake_completed": "언스테이킹 완료됨", - "unstake_completed_description": "Your unstaking transaction has been completed successfully.", - "unstake_failed": "Unstaking failed", + "unstake_completed_description": "언스테이킹 트랜잭션이 성공적으로 완료되었습니다.", + "unstake_failed": "언스테이킹 실패", "bandwidth": "대역폭 포인트", "energy": "에너지", "estimated_annual_reward": "예상 연간 보상", - "trx_locked_for": "TRX locked for", - "trx_locked_for_minimum_time": "~3 days", - "trx_released_in": "TRX released in", - "trx_released_in_minimum_time": "~14 days", + "trx_locked_for": "TRX 잠김:", + "trx_locked_for_minimum_time": "~3일", + "trx_released_in": "TRX 해제 예정일:", + "trx_released_in_minimum_time": "~14일", "fee": "수수료", "errors": { - "insufficient_balance": "You don't have enough resource balance to do this action." + "insufficient_balance": "이 작업을 수행하기에 리소스 잔액이 부족합니다." } }, "stake_eth": "ETH 스테이크", @@ -5772,12 +5870,19 @@ "learn_more_with_period": "자세히 알아보세요." }, "stake_your_trx_cta": { - "title": "Lend Tron and earn", - "description_start": "Stake your Tron and earn ", + "title": "Tron을 빌려주고 수익을 올리세요", + "description_start": "Tron을 스테이킹하고 수익을 올리세요 ", "description_end": " 매년.", "learn_more": "자세히 알아보세요.", "earn_button": "수익 창출" }, + "trx_learn_more": { + "title": "Stake TRX and earn", + "stake_any_amount": "Stake any amount of TRX.", + "earn_trx_rewards": "TRX 보상을 획득하세요.", + "earn_trx_rewards_description": "스테이킹 즉시 수익 창출이 시작됩니다. 보상은 자동으로 누적됩니다.", + "flexible_unstaking_description": "Unstake anytime. Unstaking takes 14 days to process." + }, "day": { "zero": "", "one": "일", @@ -6002,14 +6107,15 @@ "transaction_fee": "무기한 선물 거래 시 사용되는 네트워크인 HyperCore에서 토큰을 USDC로 스왑합니다. 스왑 제공업체가 수수료를 부과할 수 있지만 MetaMask에서 부과하는 수수료는 없습니다." }, "predict_deposit": { - "transaction_fee": "예측을 위해 사용하는 Polygon 네트워크를 통해 귀하의 토큰을 USDC.e로 스왑합니다. 스왑 제공업체는 수수료를 부과할 수 있으나 MetaMask는 수수료가 없습니다." + "transaction_fee": "예측에서 사용하는 네트워크인 Polygon에서 토큰을 USDC.e로 스왑합니다. 스왑 제공업체가 수수료를 부과할 수 있지만 MetaMask에서 부과하는 수수료는 없습니다." }, "musd_conversion": { - "transaction_fee": "mUSD conversion fees include network costs and may include provider fees." + "transaction_fee": "mUSD 전환 수수료에는 네트워크 비용이 포함되며, 공급자 수수료가 추가될 수 있습니다." }, "title": { "transaction_fee": "수수료" - } + }, + "network_fee": "네트워크 수수료는 네트워크의 혼잡도와 트랜잭션의 복잡성에 따라 달라집니다." }, "spending_cap": "지출 한도", "withdraw": "출금", @@ -6078,7 +6184,7 @@ }, "includes_transaction": "트랜잭션 {{transactionCount}}건 포함", "useSmartAccount": "스마트 계정 사용", - "successful": "성공!", + "successful": "성공", "success_message": "다음 트랜잭션부터 계정이 스마트 계정으로 업데이트됩니다." }, "edit_spending_cap_modal": { @@ -6086,9 +6192,9 @@ "cancel": "취소", "description": "회원님을 대신해 금액이 지출될 경우 허용할 수 있는 액수를 입력하세요.", "invalid_number_error": "지출 한도는 숫자여야 합니다", - "no_empty_error": "지출 한도는 비워둘 수 없습니다", - "no_extra_decimals_error": "지출 한도의 소수 자릿수는 토큰의 소수 자릿수보다 많을 수 없습니다", - "no_zero_error": "지출 한도는 0이 될 수 없습니다", + "no_empty_error": "Spending cap can't be empty", + "no_extra_decimals_error": "Spending cap can't have more decimals than the token", + "no_zero_error": "Spending cap can't be 0", "no_zero_error_decrease_allowance": "지출 한도를 0으로 설정해도 'decreaseAllowance' 메서드에 영향이 생기지 않습니다", "no_zero_error_increase_allowance": "지출 한도를 0으로 설정해도 'increaseAllowance' 메서드에 영향이 생기지 않습니다", "save": "저장", @@ -6119,7 +6225,7 @@ "edit_amount_done": "계속", "deposit_edit_amount_done": "자금 추가", "deposit_edit_amount_predict_withdraw": "출금", - "deposit_edit_amount_musd_conversion": "Convert to mUSD" + "deposit_edit_amount_musd_conversion": "mUSD로 전환" }, "change_in_simulation_modal": { "title": "결과가 변경되었습니다", @@ -6144,6 +6250,8 @@ "confirm_swap": "스왑", "terms_and_conditions": "이용약관", "select_token": "토큰 선택", + "no_tokens_found": "토큰을 찾을 수 없습니다", + "no_tokens_found_description": "We couldn't find any tokens with this name. Try a different search.", "select_network": "네트워크 선택", "all_networks": "모든 네트워크", "num_networks": "{{numNetworks}}개 네트워크", @@ -6151,6 +6259,7 @@ "select_all_networks": "모두 선택", "deselect_all_networks": "전체 선택 해제", "see_all": "모두 보기", + "all": "모두", "apply": "적용", "slippage": "슬리피지", "slippage_info": "주문이 제출되고 확정되는 시점 사이에 가격이 변동되는 것을 '슬리피지'라고 합니다. 슬리피지가 여기 설정한 허용치를 초과하면 스왑이 자동으로 취소됩니다.", @@ -6191,9 +6300,9 @@ "title": "브릿지", "submitting_transaction": "제출 중", "fetching_quote": "견적 가져오기", - "fee_disclaimer": "{{feePercentage}}% MM 수수료 포함.", + "fee_disclaimer": "Includes {{feePercentage}}% MetaMask fee.", "no_mm_fee": "MM 수수료 없음", - "no_mm_fee_disclaimer": "{{destTokenSymbol}}(으)로 스왑 시 MM 수수료 없음.", + "no_mm_fee_disclaimer": "No MetaMask fee swapping into {{destTokenSymbol}}.", "hardware_wallet_not_supported": "하드웨어 지갑은 아직 지원되지 않습니다. 핫월렛을 사용하여 계속하세요.", "hardware_wallet_not_supported_solana": "솔라나는 아직 하드웨어 지갑이 지원하지 않습니다. 계속하려면 핫월렛을 사용하세요.", "price_impact_info_title": "가격 영향", @@ -6208,15 +6317,7 @@ "approval_tooltip_content": "지정된 금액, {{amount}} {{symbol}}에만 접근을 허용합니다. 계약은 추가 자금에 접근하지 않습니다.", "minimum_received": "Minimum received", "minimum_received_tooltip_title": "Minimum received", - "minimum_received_tooltip_content": "이는 트랜잭션 처리 중 가격이 변동될 경우, 사용자의 슬리피지 허용 범위에 따라 최소한으로 수령할 수 있는 금액입니다. 이는 유동성 공급자들의 추정치이며, 최종 금액은 달라질 수 있습니다.", - "verified_token": "검증된 토큰", - "price": "가격", - "percent_change": "퍼센트 변동", - "volume": "거래량", - "market_cap_fdv": "시가 총액(FDV)", - "listed_on": "다음에 등록됨:", - "centralized_exchanges": "중앙화 거래소", - "contract_address": "계약 주소" + "minimum_received_tooltip_content": "이는 트랜잭션 처리 중 가격이 변동될 경우, 사용자의 슬리피지 허용 범위에 따라 최소한으로 수령할 수 있는 금액입니다. 이는 유동성 공급자들의 추정치이며, 최종 금액은 달라질 수 있습니다." }, "quote_expired_modal": { "title": "새로운 견적이 있습니다", @@ -6290,12 +6391,12 @@ "title": "지갑 복구", "login_with_social": "소셜 계정으로 로그인", "setup": "설정", - "secret_recovery_phrase": "비밀복구구문 {{num}}", + "secret_recovery_phrase": "Secret Recovery Phrase {{num}}", "back_up": "백업", "reveal": "공개", "social_recovery_title": "{{authConnection}} 복구", "social_recovery_enable": "활성화됨", - "social_login_description": "{{authConnection}} 로그인 정보와 MetaMask 비밀번호를 사용하여 계정과 비밀복구구문을 복구하세요.", + "social_login_description": "계정 및 비밀복구구문을 복구하려면 {{authConnection}} 로그인과 MetaMask 비밀번호를 사용하세요.", "srps_title": "비밀복구구문", "srps_description": "두 가지 복구 방법을 모두 설정하면 지갑을 가장 안전하게 보호할 수 있습니다. 하나의 방법에 실패해도 다른 방법으로 지갑을 복구할 수 있습니다." }, @@ -6349,7 +6450,7 @@ "section_1_title": "멀티체인 계정이란?", "section_1_description": "하나의 계정으로 MetaMask가 지원하는 모든 네트워크의 주소를 사용할 수 있습니다. 이제 계정을 전환하지 않고도 이더리움, 솔라나 등 다양한 네트워크를 이용할 수 있습니다.", "section_2_title": "같은 주소, 더 많은 네트워크", - "section_2_description": "계정을 그룹화했습니다. 이전과 동일하게 MetaMask를 계속 사용하세요. 회원님의 자금은 안전하며 변경되지 않았습니다", + "section_2_description": "계정을 그룹화했습니다. 이전과 동일하게 MetaMask를 계속 사용하세요. 회원님의 자금은 안전하며 변경되지 않았습니다.", "view_accounts_button": "계정 보기", "learn_more_button": "더 보기", "setting_up_accounts": "계정 설정 중" @@ -6511,8 +6612,10 @@ }, "card_onboarding": { "title": "결제와\n동시에\n수익 창출", - "description": "MetaMask 카드는 빠르고 간편하게 암호화폐를 현금처럼 결제에 사용하고 보상받을 수 있는 수단입니다.", + "description": "MetaMask 카드를 이용하면 암호화폐를 쉽고 빠르게 결제하며 최대 3%의 캐시백을 받을 수 있습니다.", "apply_now_button": "지금 신청", + "login_button": "로그인", + "not_now_button": "나중에", "sign_up": { "title": "지금 시작하세요", "description": "Crypto Life에서 제공하는 MetaMask 카드 계정을 만드하세요. 이 계정은 기존 MetaMask 계정과는 별도로 생성됩니다.", @@ -6540,6 +6643,7 @@ "phone_number_label": "전화번호 입력", "country_area_code_label": "국가 지역 코드", "invalid_phone_number": "잘못된 휴대폰 번호입니다", + "invalid_us_phone_number": "계속하려면 유효한 미국 전화번호(10자리)를 입력하세요.", "legal_terms": "계속 진행하면 휴대폰 번호 인증을 위한 SMS 수신에 동의하는 것입니다." }, "confirm_phone_number": { @@ -6576,9 +6680,9 @@ "terms": "승인은 일반적으로 약 12시간 정도 소요됩니다. 결정이 내려지면 안내해 드리겠습니다." }, "verifying_veriff_kyc": { - "title": "본인 인증 중", - "description": "신원을 인증하는 동안 기다려주세요.", - "helper_text": "일반적으로 몇 초 정도 소요됩니다. 앱을 종료하지 마세요." + "title": "승인 대기 중", + "description": "신청을 승인하려면 파트너사가 신원 확인을 진행해야 합니다.", + "helper_text": "보통 몇 초 정도 소요됩니다. 앱을 종료하지 마세요." }, "verifying_registration": { "title": "본인 인증 중", @@ -6614,7 +6718,7 @@ }, "physical_address": { "title": "주소 추가", - "description": "자택 주소를 입력하세요. 승인될 경우 해당 주소로 실물 카드를 발송합니다.", + "description": "현재 거주 중인 주소를 입력하세요. 이는 확인 목적으로 사용됩니다.", "address_line_1_label": "기본 주소", "address_line_2_label": "상세 주소", "city_label": "도시", @@ -6622,7 +6726,7 @@ "zip_code_label": "우편번호", "country_label": "국가", "electronic_consent_1": "전자서명법 동의서 및 고지를 수락하며, 모든 안내를 전자적으로 수신하는 데 동의합니다. ", - "electronic_consent_2": "View document(PDF)" + "electronic_consent_2": "문서 보기(PDF)" }, "mailing_address": { "title": "우편 주소", @@ -6668,22 +6772,24 @@ } }, "card_home": { + "title": "Card", + "available_balance": "사용 가능한 잔액", "error_title": "데이터를 가져올 수 없습니다", "error_description": "이 페이지의 콘텐츠를 표시하는 데 문제가 발생했습니다. 연결 상태를 확인하거나 페이지를 새로 고침해 보세요.", "try_again": "다시 시도", - "limited_spending_warning": "실제 사용 가능 금액이 제한될 수 있습니다. 한도를 조정하려면 {{manageCard}}(으)로 이동하세요", + "limited_spending_warning": "Your actual spending ability may be limited. To adjust your limit, go to ", "add_funds": "자금 추가", "change_asset": "자산 변경", "enable_card_button_label": "카드 활성화", "enable_assets_button_label": "자산 활성화", "spending_limit_warning": "지출 한도가 거의 찼습니다. 결제가 거부되지 않도록 정보를 업데이트하세요.", "logout": "로그아웃", - "logout_description": "MetaMask 카드 계정에서 로그아웃하기", "logout_confirmation_title": "카드에서 로그아웃하시겠습니까?", "logout_confirmation_message": "MetaMask 카드 계정에서 로그아웃하시겠습니까?", "logout_confirmation_cancel": "취소", "logout_confirmation_confirm": "로그아웃", "enable_card_error": "카드를 활성화할 수 없습니다. 나중에 다시 시도하세요.", + "view_card_details_error": "Unable to load card details. Please try again.", "warnings": { "close_spending_limit": { "title": "이용한도가 얼마 남지 않았습니다", @@ -6706,11 +6812,21 @@ "blocked": { "title": "차단된 카드입니다", "description": "카드 차단을 해제하려면 고객 지원팀에 문의해 주세요" + }, + "kyc_pending": { + "title": "신원 인증 진행 중", + "description": "Your identity verification is being reviewed. This typically takes less than 12 hours." + } + }, + "messages": { + "card_provisioning": { + "title": "Card being created", + "description": "Your card is being created. This may take a few moments." } }, "kyc_status": { "pending": { - "title": "인증 진행 중", + "title": "신원 인증 진행 중", "description": "신원 인증이 처리 중입니다. 일반적으로 몇 분 정도 소요됩니다. 카드 사용을 활성화하려면 잠시 후 다시 확인해 주세요." }, "rejected": { @@ -6729,33 +6845,46 @@ "ok_button": "확인" }, "manage_card_options": { - "manage_spending_limit": "이용한도 관리", + "view_card_details": "View card details", + "hide_card_details": "Hide card details", + "view_card_details_description": "Card number, expiration and CVV", + "manage_spending_limit": "Manage limit", "manage_spending_limit_description_restricted": "사용 한도가 설정되어 있습니다", "manage_spending_limit_description_full": "제한 없이 사용할 수 있습니다", "manage_card": "카드 관리", - "advanced_card_management_description": "카드 세부 정보, 거래 내역 등 보기", + "advanced_card_management_description": "See activity, cashback, freeze card, and more", "travel_title": "MetaMask Travel", - "travel_description": "Expedia 대비 최대 60% 할인된 가격으로 호텔을 예약하세요", - "card_tos_title": "카드 이용약관", - "card_tos_description": "카드 제공업체 약관 읽기" + "travel_description": "Book hotels with up to 70% discounts", + "card_tos_title": "Terms and conditions" } }, "card_spending_limit": { "title_change_token": "토큰 및 네트워크 변경", "title_enable_token": "토큰 활성화", + "title_onboarding": "지출 활성화", + "setup_title": "Set up your card", + "setup_description": "Select the token you'd like to use and set a limit for how much you can spend.", + "asset_label": "자산", + "limit_label": "한도", + "other_token": "Other", "full_access_title": "전체 접근", - "full_access_description": "이 카드는 매번 사용자의 승인을 받을 필요 없이 자동으로 자금을 사용할 수 있습니다.", - "restricted_limit_title": "지출이 제한됨", - "restricted_limit_description": "한도를 늘리려면 매번 다시 방문해서 네트워크 수수료를 지불해야 합니다.", + "full_access_description": "Your card can use your funds automatically without asking for approval each time.", + "restricted_limit_title": "지출 한도", + "restricted_limit_description": "이 한도까지만 지출할 수 있습니다. 한도가 업데이트될 때마다 네트워크 수수료가 부과됩니다.", "edit_limit": "한도 편집", "confirm_new_limit": "컨펌", "cancel": "취소", + "skip": "지금은 건너뛰기", "set_new_limit": "한도 설정", "dismiss": "닫기", "update_success": "지출 한도 변경됨", "update_error": "지출 한도 변경 실패", "solana_not_supported": "card.metamask.io에서 솔라나 토큰 활성화", - "select_token": "토큰 선택" + "select_token": "토큰 선택", + "loading": "사용 가능한 토큰 불러오는 중...", + "load_error": "토큰을 불러올 수 없습니다. 다시 시도해 주세요.", + "retry": "다시 시도", + "on_linea": "Linea 네트워크에서" }, "change_asset": { "title": "토큰 및 네트워크 변경", @@ -6793,6 +6922,7 @@ "signup_button": "가입", "errors": { "invalid_credentials": "잘못된 로그인 정보입니다", + "invalid_otp_code": "잘못된 코드입니다. 다시 시도해 주세요", "unknown_error": "알 수 없는 오류가 발생했습니다. 나중에 다시 시도해 주세요", "email_required": "이메일 주소를 입력해야 합니다", "password_required": "비밀번호를 입력해야 합니다", @@ -6839,8 +6969,8 @@ }, "rewards": { "auth_fail_title": "알 수 없는 오류입니다.", - "auth_fail_description": "보상 프로그램에 대한 계정 인증 중 알 수 없는 오류가 발생했습니다. 잠시 후 다시 시도해 주세요.", - "failed_to_authenticate": "보상 프로그램 인증에 실패했습니다", + "auth_fail_description": "MetaMask Rewards로 계정을 인증하는 중 알 수 없는 오류가 발생했습니다. 나중에 다시 시도해 주세요.", + "failed_to_authenticate": "MetaMask Rewards 인증에 실패했습니다", "not_implemented": "곧 추가 예정", "not_implemented_season_summary": "시즌 요약이 곧 추가됩니다", "optin_error": { @@ -6867,6 +6997,10 @@ "error_fetching_description": "연결 상태를 확인하고 다시 시도하세요.", "retry_button": "다시 시도" }, + "linea_tokens": { + "default_title": "$LINEA", + "title_earned": "{{amount}} $LINEA를 획득했습니다" + }, "upcoming_rewards_error": { "error_fetching_title": "보상을 불러올 수 없습니다", "error_fetching_description": "연결 상태를 확인하고 다시 시도하세요.", @@ -6898,6 +7032,15 @@ "claim_reward_error": { "title": "보상을 수령할 수 없습니다" }, + "metal_card_claim": { + "title": "보상 수령하기", + "description": "MetaMask 메탈 카드는 자격 요건에 따라 발급되며 모든 지역에서 사용할 수 있는 것은 아닙니다. 자격이 되지 않는 경우, 대신 독점 프리미엄 굿즈 보상을 받게 됩니다.", + "contact_info": "연락처를 공유해 주시면 2주 이내에 텔레그램(@MidwitMilhouse) 또는 이메일(christian.montoya@consensys.net)로 연락드리겠습니다.", + "email_label": "이메일", + "email_validation_error": "올바른 이메일 주소를 입력하세요", + "telegram_label": "Telegram 아이디", + "telegram_placeholder": "선택 사항" + }, "accounts_opt_in_state_error": { "error_fetching_title": "계정을 불러올 수 없습니다", "error_fetching_description": "연결 상태를 확인하고 다시 시도하세요.", @@ -6979,7 +7122,7 @@ "gtm_title": "리워드를 받으세요", "gtm_description": "활동에 대한 포인트를 획득하세요. \n레벨을 올려 리워드를 잠금 해제하세요.", "gtm_confirm": "시작하기", - "intro_title": "시즌 1이 \n시작되었습니다", + "intro_title": "시즌 1 \n진행 중", "intro_description": "활동에 대한 포인트를 획득하세요. \n레벨을 올려 리워드를 잠금 해제하세요.", "intro_confirm": "250포인트 수령", "intro_confirm_geo_loading": "지역 확인 중...", @@ -7052,12 +7195,12 @@ "dashboard_modal_info": { "active_account": { "title": "기회를 놓치지 마세요", - "description": "계정을 추가하면 활동 포인트를 획득할 수 있습니다.", + "description": "Add your account to Rewards.", "confirm": "계정 추가" }, "multiple_unlinked_accounts": { - "title": "포인트 획득 시작하기", - "description": "계정을 추가하면 한눈에 보상 상황을 추적할 수 있습니다.", + "title": "기회를 놓치지 마세요", + "description": "Add your accounts to Rewards.", "confirm": "계정 추가" }, "account_not_supported": { @@ -7110,10 +7253,10 @@ } }, "predict": { - "title": "예측 시장", + "title": "예측", "description": "$10 예측당 20포인트", "sheet": { - "title": "예측 시장", + "title": "예측", "points": "$10당 20포인트", "description": "거래 금액 $10당 포인트를 적립하세요.", "cta_label": "시장 둘러보기" @@ -7191,6 +7334,19 @@ "time_left": "남음", "expired": "만료됨" }, + "end_of_season_rewards": { + "confirm_label_default": "컨펌", + "confirm_label_access": "액세스", + "redeem_success_title": "보상 수령 완료", + "metal_card_claim_success": "연락처 정보 확인됨", + "linea_tokens_claim_success": "주소 확인됨", + "arriving_soon": "곧 도착 예정", + "check_back_soon": "곧 돌아와서 청구하세요", + "redeem_failure_title": "수령 실패", + "redeem_failure_description": "나중에 다시 시도해 주세요.", + "reward_details": "보상 상세 정보", + "select_account_description": "이 보상을 받을 계정을 선택하세요. 토큰은 2주 이내에 배포됩니다." + }, "animation": { "could_not_load": "불러올 수 없음" } @@ -7257,13 +7413,13 @@ "still_connecting_network": "아직 {{networkName}}에 연결 중입니다...", "unable_to_connect_network": "{{networkName}}에 연결할 수 없습니다.", "update_rpc": "RPC 업데이트", + "switch_to_metamask_default_rpc": "Switch to MetaMask default RPC", "check_network_connectivity": "네트워크 연결을 확인하세요.", - "check_network_connectivity_or": "네트워크 연결을 확인하거나" + "check_network_connectivity_or": "네트워크 연결을 확인하거나", + "updated_to_metamask_default": "Updated to MetaMask default" }, "trending": { "title": "Explore", - "view_all": "View all", - "tokens": "토큰", "trending_tokens": "Trending tokens", "price_change": "Price change", "all_networks": "모든 네트워크", @@ -7295,6 +7451,10 @@ "title": "Trending tokens is not available", "description": "We can't fetch this page right now", "try_again": "다시 시도" + }, + "empty_search_result_state": { + "title": "토큰을 찾을 수 없습니다", + "description": "We were not able to find this token" } }, "ota_update_modal": { diff --git a/locales/languages/pt.json b/locales/languages/pt.json index 0277c37f6643..4f733bfa002f 100644 --- a/locales/languages/pt.json +++ b/locales/languages/pt.json @@ -8,7 +8,7 @@ "increment": "Incrementar contador do Redux" }, "pet_name": { - "list_count_text": "Pet names on this network", + "list_count_text": "Nomes afetuosos nesta rede", "add_pet_name_button": "Add pet name", "address": "Endereço", "address_placeholder": "0x...", @@ -193,11 +193,10 @@ "connector": "em" }, "autocomplete": { - "placeholder": "Pesquisar por token, site ou endereço", + "placeholder": "Pesquisar por site ou por endereço", "recents": "Recentes", "favorites": "Favoritos", - "sites": "Sites", - "tokens": "Tokens" + "sites": "Sites" }, "navigation": { "back": "Voltar", @@ -306,7 +305,7 @@ "get_started": "Primeiros passos" }, "onboarding_wizard": { - "skip_tutorial": "Skip tutorial", + "skip_tutorial": "Pular tutorial", "coachmark": { "action_back": "Não, obrigado", "action_next": "Fazer o tour", @@ -330,8 +329,8 @@ "content3": "agora para editar o nome da conta." }, "step4": { - "title": "Main menu", - "content1": "Você pode acessar o histórico de Transações, Configurações e Suporte nesse menu.", + "title": "Menu principal", + "content1": "Você pode acessar o histórico de transações, as configurações e o suporte a partir deste menu.", "content2": "Você pode realizar mais ações com as suas contas e acessar as configurações da MetaMask." }, "step5": { @@ -596,9 +595,9 @@ "transaction_activity": "Atividade", "request_feature": "Solicitar um recurso", "submit_feedback_message": "Selecione o tipo de comentário a enviar.", - "submit_bug": "Bug report", + "submit_bug": "Relatório de bug", "submit_general_feedback": "Geral", - "share_address": "Share my public address", + "share_address": "Compartilhar meu endereço público", "view_in_etherscan": "Ver no Etherscan", "view_in": "Ver em", "browser": "Navegador", @@ -612,12 +611,13 @@ "lock_cancel": "NÃO", "feedback": "Comentário", "metamask_support": "Suporte da MetaMask", - "public_address": "Public address" + "public_address": "Endereço público" }, "send": { "available": "disponível", "invalid_value": "Valor inválido", "insufficient_funds": "Fundos insuficientes", + "insufficient_balance_to_cover_fee": "Insufficient balance to cover fees", "continue": "Continuar", "unit": "unidade", "units": "unidades", @@ -643,8 +643,8 @@ "no_tokens_available": "Nenhum token disponível", "sign": "Assinar", "network_not_found_title": "Rede não encontrada", - "network_not_found_description": "A rede com ID de cadeia {{chain_id}} não foi encontrada na sua carteira. Adicione a rede primeiro.", - "network_missing_id": "ID de cadeia ausente.", + "network_not_found_description": "Network with chain ID {{chain_id}} not found in your wallet. Please add the network first.", + "network_missing_id": "Missing chain ID.", "search_tokens": "Pesquisar tokens", "search_tokens_and_nfts": "Pesquisar tokens e NFTs", "tokens": "Tokens", @@ -680,8 +680,8 @@ "search_by_name_or_address": "Pesquisar pelo nome ou endereço do token", "no_tokens_found": "Nenhum token corresponde a \"{{searchString}}\"", "unsupported_token_title": "Não disponível", - "unsupported_token_description": "This token may not be available in your region or supported by any local payment providers", - "error_loading_tokens": "Unable to load tokens. Please try again later." + "unsupported_token_description": "Este token pode não estar disponível em sua região ou não ser compatível com nenhum provedor de pagamento local", + "error_loading_tokens": "Não foi possível carregar os tokens. Tente novamente mais tarde." }, "networks_filter_bar": { "all_networks": "Todas as redes" @@ -696,12 +696,12 @@ "title": "Configurações", "view_order_history": "Ver histórico de ordens", "contact_support": "Falar com o suporte", - "log_out": "Log out of Transak", + "log_out": "Sair do Transak", "logged_out_success": "Desconectado com sucesso", "error_sdk_not_initialized": "SDK não inicializado", "logged_out_error": "Erro ao desconectar", - "more_ways_to_buy": "More ways to buy", - "more_ways_to_buy_description": "Switch to the classic version" + "more_ways_to_buy": "Mais formas de comprar", + "more_ways_to_buy_description": "Mudar para a versão clássica" }, "region_modal": { "select_a_region": "Selecione uma região", @@ -714,7 +714,7 @@ "no_state_results": "Nenhum estado corresponde a \"{{searchString}}\"" }, "payment_modal": { - "select_a_payment_method": "Select a payment method" + "select_a_payment_method": "Selecionar uma forma de pagamento" }, "payment_duration": { "instant": "Instantâneo", @@ -805,7 +805,7 @@ "button": "Concordar e continuar" }, "additional_verification": { - "title": "Additional verification", + "title": "Verificação adicional", "paragraph_1": "Para depósitos de maior valor, você precisará de uma identificação válida (p. ex., carteira de motorista) e uma selfie em tempo real.", "paragraph_2": "Para completar a verificação, você precisará ativar o acesso à sua câmera.", "button": "Continuar" @@ -832,7 +832,7 @@ "dob_invalid": "Insira uma data de nascimento válida", "ssn_required": "O número do seguro social é obrigatório", "unexpected_error": "Ocorreu um erro inesperado. Tente novamente.", - "phone_already_registered": "This phone number is already in use by {{email}}. Log in using this email to continue.", + "phone_already_registered": "Este número de telefone já está em uso por {{email}}. Faça login com este e-mail para continuar.", "login_with_email": "Faça login com seu e-mail" }, "enter_address": { @@ -844,7 +844,7 @@ "address_line_2": "Linha de endereço 2 (opcional)", "state": "Estado/Região", "city": "Cidade", - "postal_code": "Postal/zip code", + "postal_code": "Código postal", "country": "País", "select_state": "Selecionar estado", "address_line_1_required": "A linha de endereço 1 é obrigatória", @@ -854,7 +854,7 @@ "city_invalid": "Insira uma cidade válida", "state_required": "Campo estado/região é obrigatório", "state_invalid": "Insira um estado válido", - "postal_code_required": "Postal/zip code is required", + "postal_code_required": "Código postal obrigatório", "postal_code_invalid": "Insira um código postal válido", "unexpected_error": "Erro inesperado." }, @@ -903,7 +903,7 @@ "cancel_order_button": "Cancelar pedido" }, "order_details": { - "title": "Deposit order", + "title": "Ordem de depósito", "error_title": "Houve um erro com o seu pedido de depósito", "error_message": "Ocorreu um erro inesperado." }, @@ -946,7 +946,7 @@ }, "error_view": { "title": "Houve um erro", - "description": "Houve um erro ao processar seu depósito. Fale com o suporte se o problema persistir.", + "description": "Houve um erro ao processar seu depósito. Entre em contato com o suporte se o problema persistir.", "try_again": "Tentar novamente" }, "errors": { @@ -955,12 +955,12 @@ "fetch_payment_methods": "Ocorreu um problema ao obter os métodos de pagamento.", "fetch_user_details": "Ocorreu um problema ao obter os dados do usuário.", "try_again": "Tentar novamente", - "error_details_title": "Error details", + "error_details_title": "Detalhes do erro", "see_more": "Ver mais" } }, "perps": { - "basic_functionality_disabled_title": "Perps is not available", + "basic_functionality_disabled_title": "Perps (futuros perpétuos) não disponíveis", "title": "Perps", "perps_trading": "Negociação de perps", "perp_account_balance": "Saldo da conta de perps", @@ -974,9 +974,13 @@ "not_now": "Agora não", "try_now": "Comece já" }, + "discovery_banner": { + "title": "Negociar perp de {{symbol}}", + "subtitle": "Multiplique seu P&L até {{leverage}}" + }, "today": "Hoje", "yesterday": "Ontem", - "unrealized_pnl": "P&L não realizado", + "unrealized_pnl": "P&L não realizados", "withdraw": "Sacar", "refresh_balance": "Atualizar saldo", "add_funds": "Adicionar fundos", @@ -1138,7 +1142,7 @@ "trigger_price": "Preço de disparo", "liquidation_price": "Preço de liquidação", "fees": "Taxas", - "estimated_points": "Pts. estimados", + "estimated_points": "Est. de pontos", "market": "Mercado", "limit": "Limite", "open_orders": "Ordens", @@ -1199,7 +1203,7 @@ "short": "{{asset}} curto" }, "tpsl_modal": { - "title": "Take profit e Stop loss", + "title": "Take profit e stop loss", "save": "Salvar", "current_price": "Preço atual: {{price}}", "on": "ATIVADO", @@ -1306,8 +1310,8 @@ "cancel": "Cancelar", "margin": "Margem", "includes_pnl": "inclui P&L", - "pnl": "PnL", - "estimated_pnl": "PnL estimado", + "pnl": "P&L", + "estimated_pnl": "P&L estimado", "fees": "Taxas", "receive": "Você receberá", "you_receive": "Você receberá", @@ -1414,6 +1418,7 @@ "failedToEstablishAllMids": "Falha ao estabelecer assinatura global de allMids", "failedToEstablishMarketData": "Falha ao estabelecer assinatura de dados de mercado para {{symbol}}", "failed_to_toggle_network": "Falha ao alternar rede", + "failed_to_switch_provider": "Falha ao trocar de provedor", "noAccountSelected": "Nenhuma conta selecionada", "unsupportedMethod": "Método não suportado: {{method}}", "invalidAddressFormat": "Formato de endereço inválido: {{address}}", @@ -1452,6 +1457,24 @@ "orderLeverageReductionFailed": "Você não pode reduzir sua alavancagem", "insufficientLiquidity": "Liquidez insuficiente para executar a ordem. Experimente usar uma ordem limitada ou tente novamente em alguns instantes.", "connectionTimeout": "Tempo de conexão esgotado. Verifique sua rede e tente novamente.", + "clientReinitializing": "O serviço está reinicializando. Aguarde um momento e tente novamente.", + "transferFailed": "Não foi possível transferir os fundos. Tente novamente.", + "swapFailed": "Não foi possível trocar tokens. Tente novamente.", + "spotPairNotFound": "O par de negociação não está disponível no momento.", + "priceUnavailable": "Dados de preço indisponíveis. Atualize a página e tente novamente.", + "batchCancelFailed": "Não foi possível cancelar alguns pedidos. Tente novamente.", + "batchCloseFailed": "Não foi possível fechar algumas posições. Tente novamente.", + "insufficientMargin": "Margem insuficiente para executar esta negociação. Considere adicionar mais fundos ou reduzir o tamanho da sua posição.", + "reduceOnlyViolation": "Esta ordem aumentaria sua posição. Somente ordens de redução são permitidas.", + "positionWouldFlip": "Esta ordem inverteria a direção da sua posição. Feche sua posição atual primeiro.", + "marginAdjustmentFailed": "Não foi possível ajustar a margem. Tente novamente.", + "tpslUpdateFailed": "Não foi possível atualizar o take profit/stop loss. Tente novamente.", + "orderRejected": "Ordem rejeitada. Verifique seus parâmetros e tente novamente.", + "slippageExceeded": "O preço oscilou demais. Tente usar uma ordem limitada ou aumente a tolerância à slippage.", + "rateLimitExceeded": "Excesso de solicitações. Aguarde um momento e tente novamente.", + "serviceUnavailable": "O serviço está temporariamente indisponível. Tente novamente mais tarde.", + "networkErrorSimple": "Ocorreu um erro de rede. Verifique sua conexão e tente novamente.", + "insufficientBalance": "Saldo insuficiente para completar esta operação. Verifique seus fundos disponíveis.", "connectionFailed": { "title": "Não foi possível conectar-se aos perps", "description": "Estamos trabalhando para colocá-lo on-line novamente em breve.", @@ -1521,7 +1544,7 @@ "total_balance": "Saldo total", "available_balance": "Saldo disponível", "margin_used": "Margem usada", - "total_unrealized_pnl": "Total P/L não realizado", + "total_unrealized_pnl": "P&L total não realizado", "unrealized_pnl": "P&L não realizados" }, "tpsl": { @@ -1654,7 +1677,7 @@ }, "tp_sl": { "title": "Take profit e stop loss", - "content": "Take Profit (TP) encerra automaticamente sua posição quando você atinge seu lucro-alvo. Stop Loss (SL) limita suas perdas encerrando sua posição se o preço variar contra você." + "content": "O Take Profit (TP) encerra automaticamente sua posição quando seu lucro desejado é alcançado. O Stop Loss (SL) limita suas perdas encerrando sua posição se o preço oscilar contra você." }, "close_position_you_receive": { "title": "Receber quantia", @@ -1679,12 +1702,12 @@ "market_hours": { "title": "Horário de funcionamento do mercado", "closes_in": "Fecha em {{time}}", - "content": "Você está negociando no horário normal de funcionamento do mercado (de 9h30 às 16h, horário do leste dos EUA). Quando os mercados estão fechados, há risco de maiores spreads, oscilações de preços e taxas de funding mais altas." + "content": "Você está negociando no horário normal de funcionamento do mercado (de 9h30 às 16h, horário do leste dos EUA). Quando os mercados estão fechados, há risco de spreads maiores, oscilações de preços e taxas de funding mais altas." }, "after_hours_trading": { "title": "Negociação fora do horário comercial", "reopens_in": "Reabre em {{time}}", - "content": "Você está negociando fora do horário normal de funcionamento do mercado (de 9h30 às 16h, horário do leste dos EUA). Quando os mercados estão fechados, há risco de maiores spreads, oscilações de preços e taxas de funding mais altas." + "content": "Você está negociando fora do horário normal de funcionamento do mercado (das 9h30 às 16h, horário do leste dos EUA). Quando os mercados estão fechados, há risco de spreads maiores, oscilações de preços e taxas de funding mais altas." }, "spread": { "title": "Spread", @@ -1697,7 +1720,14 @@ "retry_connection": "Tentar novamente a conexão", "retrying_connection": "Conectando...", "connecting_to_perps": "Conectando-se aos perps", - "timeout_title": "A conexão está demorando mais do que o previsto" + "timeout_title": "A conexão está demorando mais do que o previsto", + "websocket_disconnected": "Sua conexão está off-line.", + "websocket_disconnected_message": "Dados podem não estar atualizados.", + "websocket_connecting": "Conectando-se aos perps...", + "websocket_connecting_message": "Restaurando conexão... Tentativa {{attempt}}", + "websocket_connected": "Conectado", + "websocket_connected_message": "Atualizações de dados em tempo real retomadas", + "websocket_retry": "Tentar novamente" }, "chart": { "no_data": "Nenhum dado de gráfico disponível", @@ -1746,7 +1776,7 @@ "markets": "Mercados" }, "learn_more": { - "title": "Saiba mais sobre Perps", + "title": "Saiba mais sobre perps (futuros perpétuos)", "description": "Entenda como funciona o trading perpétuo e como começar", "cta": "Saiba mais" }, @@ -1754,6 +1784,9 @@ "title": "Falar com o suporte", "description": "Contate o suporte da MetaMask para solicitar assistência" }, + "feedback": { + "title": "Deixe seus comentários" + }, "close_all_modal": { "title": "Encerrar todas as posições", "description": "Encerraremos todas as suas posições em aberto pelo preço de mercado atual.", @@ -1795,8 +1828,8 @@ "funding_rate_short": "Captação", "open_interest": "Contrato em aberto", "open_interest_short": "OI", - "high_to_low": "Maior para menor", - "low_to_high": "Menor para maior", + "high_to_low": "Alta para baixa", + "low_to_high": "Baixa para alta", "high": "Alta", "low": "Baixa", "sort_by": "Classificar por", @@ -1806,7 +1839,11 @@ "price_change_low_to_high": "Variação de preço: menor para maior", "past_hour": "Última hora", "past_24_hours": "Últimas 24 horas", - "time": "Horário" + "time": "Horário", + "apply": "Aplicar" + }, + "market_type": { + "filter_by": "Filtrar por" }, "perps_markets": "Mercados de perps", "volume": "Volume", @@ -1823,6 +1860,7 @@ "mainnet": "Mainnet", "developer_options": { "hyperliquid_network_toggle": "Alternância de rede Hyperliquid", + "provider_mode_toggle": "Modo de Provedor", "simulate_connection_error": "Simular erro de conexão" }, "transactions": { @@ -1925,7 +1963,7 @@ } }, "points": "Pontos", - "estimated_points": "Pts. estimados", + "estimated_points": "Est. de pontos", "points_error": "Não é possível carregar pontos neste momento", "points_error_content": "Não se preocupe, você ainda está ganhando pontos. Eles aparecerão na sua conta em breve, ou você pode conferir a guia Recompensas mais tarde.", "tp_on_chart": "TP no gráfico", @@ -1942,7 +1980,7 @@ } }, "predict": { - "title": "MetaMask Predict", + "title": "Previsões da MetaMask", "prediction_markets": "Mercados de previsão", "market_list": "Lista de mercado", "loading": "Carregando...", @@ -1981,7 +2019,8 @@ "fee_exemption": "Não cobramos nenhuma taxa neste mercado.", "ended": "Terminou", "resolved_early": "Resolvido antecipadamente", - "disclaimer": "Esta informação pode estar incompleta. Todas as regras de mercado, critérios de resolução e resultados finais são regidos exclusivamente pela Polymarket. Negociações devem ser realizadas com base nas regras completas disponíveis na Polymarket." + "disclaimer": "Esta informação pode estar incompleta. Todas as regras de mercado, critérios de resolução e resultados finais são regidos exclusivamente pela Polymarket. Negociações devem ser realizadas com base nas regras completas disponíveis na Polymarket.", + "your_picks": "Suas escolhas" }, "tab": { "no_predictions_description": "Suas previsões serão exibidas aqui, mostrando seu staking e movimento de mercado.", @@ -2001,6 +2040,8 @@ "cashout_info": "{{amount}} em {{outcome}} a {{initialPrice}}", "cashout_info_multiple": "{{amount}} em {{outcomeGroupTitle}} • {{outcome}} a {{initialPrice}}", "position_info": "{{initialValue}} em {{outcome}} para ganhar {{shares}}", + "position_pick_info": "{{initialValue}} em {{outcome}}", + "position_pick_info_to_win": "{{initialValue}} em {{outcome}} para ganhar", "buy_yes": "Sim", "buy_no": "Não", "outcomes": "resultados", @@ -2035,6 +2076,7 @@ "won_markets_text": "Ganhou {{count}} mercado{{s}}", "available_balance": "Saldo disponível", "claim_amount_text": "Resgatar $ {{amount}}", + "claim_winnings_text": "Resgatar ganhos", "unrealized_pnl_label": "P&L não realizados", "unrealized_pnl_value": "{{amount}} ({{percent}})", "unrealized_pnl_error": "Não foi possível carregar", @@ -2173,6 +2215,15 @@ "order_not_fully_filled": "Não foi possível executar sua ordem", "buy_order_not_fully_filled": "Não há ações suficientes disponíveis ao preço de mercado para executar sua ordem neste momento.", "sell_order_not_fully_filled": "Demanda ao preço de mercado insuficiente para resgatar neste momento." + }, + "game_details_footer": { + "pick_a_winner": "Escolha um ganhador", + "volume_display": "${{volume}} vol", + "read_terms": "Leia os termos e condições completos do contrato" + }, + "sports": { + "halftime": "Intervalo", + "final": "Final" } }, "receive": { @@ -2290,7 +2341,7 @@ "add_funds": "Adicionar fundos", "next": "Avançar", "buy_asset": "Comprar {{asset}}", - "no_tokens": "Você não tem nenhum token!", + "no_tokens": "Você não tem nenhum token", "show_tokens_without_balance": "Mostrar tokens sem saldo", "nfts_autodetection_title": "Detecção de NFTs", "nfts_autodetection_desc": "Permita que a MetaMask detecte e exiba automaticamente os NFTs em sua carteira.", @@ -2303,7 +2354,7 @@ "target_scam_network": "o que o torna alvo de golpes. Os golpistas podem tentar enganar você para que envie a eles moedas mais valiosas em troca. Verifique tudo antes de continuar.", "use_the_currency_symbol": "usa o símbolo de moeda", "use_correct_symbol": "Certifique-se de usar o símbolo correto antes de continuar", - "chain_id_currently_used": "Esta ID de cadeia está sendo usada pela", + "chain_id_currently_used": "This chain ID is currently used by the", "incorrect_network_name_warning": "De acordo com os nossos registros, o nome da rede pode não corresponder a este ID de cadeia.", "suggested_name": "Nome sugerido:", "network_check_validation_desc": "reduz suas chances de se conectar a uma rede mal-intencionada ou incorreta.", @@ -2314,7 +2365,7 @@ "nft_empty_description": "Existe um mundo de NFTs por aí. Comece sua coleção hoje mesmo.", "tokens_empty_description": "Nothing to see yet. Why not browse tokens or make a trade?", "discover_nfts": "Importar NFTs", - "no_transactions": "Você não tem nenhuma transação!", + "no_transactions": "Você não tem nenhuma transação", "switch_network_to_view_transactions": "Mude de rede para ver as transações", "send_button": "Enviar", "deposit_button": "Depositar", @@ -2362,6 +2413,7 @@ "network_fee": "Taxa de rede", "lists": "Token lists", "hide_cta": "Ocultar token", + "perps_trading": "Negociação de perps", "options": { "title": "Token options", "view_on_portfolio": "Ver no Portfolio", @@ -2409,8 +2461,8 @@ "add_token": "IMPORTAR" }, "collectibles": { - "cancel_add_collectible": "CANCELAR", - "add_collectible": "IMPORTAR" + "cancel_add_collectible": "Cancelar", + "add_collectible": "Importar" }, "banners": { "search_desc": "A detecção aprimorada de tokens está disponível na rede {{network}}. ", @@ -2521,18 +2573,20 @@ "billion_abbreviation": "B", "trillion_abbreviation": "T", "million_abbreviation": "M", + "thousand_abbreviation": "K", "token_details": "Detalhes do token", "contract_address": "Endereço do contrato", "token_list": "Lista de tokens", "market_details": "Detalhes do mercado", "market_cap": "Market cap", "total_volume": "Total volume (24h)", - "volume_to_marketcap": "Volume / market cap", + "volume_to_marketcap": "Volume / Market cap", "circulating_supply": "Suprimento em circulação", "all_time_high": "Alta histórica", "all_time_low": "Baixa histórica", "fully_diluted": "Totalmente diluído", - "unknown": "Desconhecida" + "unknown": "Desconhecida", + "stock": "Stock" }, "collectible": { "collectible_address": "Endereço", @@ -2583,7 +2637,7 @@ "remove_snap_account": "Remover conta de Snaps", "remove_snap_account_alert_description": "Esta conta será removida da sua carteira. Certifique-se de ter a Frase de Recuperação Secreta original ou a chave privada desta conta importada antes de continuar. Você pode importar ou criar contas novamente no menu suspenso de contas.", "remove_account_alert_remove_btn": "Remover", - "remove_account_alert_cancel_btn": "Desistir", + "remove_account_alert_cancel_btn": "Never mind", "accounts_title": "Contas", "connect_account_title": "Conectar conta", "connect_accounts_title": "Conectar contas", @@ -2620,7 +2674,7 @@ "advisory_by": "Aconselhamento fornecido por Ethereum Phishing Detector e PhishFort", "potential_threat": "Ameaças potenciais incluem", "fake_metamask": "Versões falsas da MetaMask", - "srp_theft": "Roubo da Frase de Recuperação Secreta ou senha", + "srp_theft": "Secret Recovery Phrase or password theft", "malicious_transactions": "Transações mal-intencionadas que resultam no roubo de ativos", "secret_recovery_phrase": "Frase de recuperação secreta", "account_name": "Nome da conta", @@ -2675,8 +2729,8 @@ }, "connect_qr_hardware": { "title": "Conecte uma carteira de hardware baseada em QR", - "description1": "Conecte uma carteira de hardware com lacuna de ar, que se comunica por meio de códigos QR.", - "description2": "Como funciona?", + "description1": "Connect an airgapped hardware wallet that communicates through QR codes.", + "description2": "Como funciona", "description3": "Carteiras de hardware com lacuna de ar oficialmente aceitas incluem:", "keystone": "Keystone", "ngravezero": "Ngrave Zero", @@ -2690,7 +2744,7 @@ "hint_text": "Escaneie sua carteira de hardware para", "purpose_connect": "conectar", "purpose_sign": "confirmar a transação", - "select_accounts": "Selecione uma conta" + "select_accounts": "Selecionar uma conta" }, "data_collection_modal": { "accept": "OK", @@ -2717,14 +2771,14 @@ "select_rpc_url": "Selecionar URL da RPC", "title": "Configurações", "current_conversion": "Moeda base", - "current_language": "Current language", - "ipfs_gateway": "Gateway IPFS", + "current_language": "Idioma atual", + "ipfs_gateway": "gateway de IPFS", "ipfs_gateway_content": "A MetaMask usa serviços terceirizados para exibir imagens de seus NFTs armazenados no IPFS, exibir informações relacionadas a endereços ENS inseridos na barra de endereço do seu navegador e buscar ícones para diferentes tokens. Seu endereço IP pode ser exposto a esses serviços ao usá-los.", "ipfs_gateway_down": "Seu gateway IPFS atual está fora do ar", "ipfs_gateway_desc": "Selecione seu gateway IPFS preferencial.", - "search_engine": "Search engine", + "search_engine": "Motor de busca", "new_RPC_URL": "Nova rede RPC", - "state_logs": "State logs", + "state_logs": "Logs de estado", "add_network_title": "Adicionar uma rede", "auto_lock": "Bloqueio automático", "auto_lock_desc": "Selecione o tempo para bloquear o aplicativo automaticamente.", @@ -2733,15 +2787,15 @@ "autolock_never": "Nunca", "autolock_after": "Depois de {{time}} segundos", "autolock_after_minutes": "Depois de {{time}} minutos", - "reveal_seed_words": "Reveal seed words", - "reset_account": "Reset account", - "state_logs_button": "Download state logs", + "reveal_seed_words": "Revelar palavras-semente", + "reset_account": "Redefinir conta", + "state_logs_button": "Baixar logs de estado", "reveal_seed_words_button": "REVELAR PALAVRAS-SEMENTE", - "reset_account_button": "Reset account", + "reset_account_button": "Redefinir conta", "reset_account_confirm_button": "Sim, redefinir", "reset_account_cancel_button": "Cancelar", - "reset_account_modal_title": "Reset account?", - "clear_approvals_modal_title": "Clear approval data?", + "reset_account_modal_title": "Redefinir conta?", + "clear_approvals_modal_title": "Limpar dados de aprovação?", "clear_approvals_modal_message": "Todos os dapps precisarão solicitar acesso para ver as informações da conta novamente.", "clear_browser_history_modal_title": "Limpar histórico do navegador?", "clear_browser_history_modal_message": "Vamos remover agora todo o histórico do seu navegador. Tem certeza disso?", @@ -2763,7 +2817,7 @@ "protect_title": "Recuperação da carteira", "banner_social_login_enabled": "Fazer login com {{authConnection}}", "manage_recovery_method": "Gerenciar métodos de recuperação", - "video_failed": "Video failed to load.", + "video_failed": "Falha ao carregar vídeo.", "protect_desc": "Faça backup da sua Frase de Recuperação Secreta para nunca perder acesso à sua carteira. Certifique-se de guardá-la em um lugar seguro ao qual só você tenha acesso e do qual não se esqueça", "protect_desc_no_backup": "Esta é a frase de 12 palavras da sua carteira. Ela pode ser usada para assumir o controle de todas as suas contas atuais e futuras, incluindo a possibilidade de retirar valores da sua carteira. Guarde esta frase em segurança e NÃO a compartilhe com ninguém. A MetaMask não poderá ajudar a recuperar esta chave.", "learn_more": "Saiba mais.", @@ -2782,9 +2836,9 @@ "show_fiat_on_testnets_desc": "Selecione essa opção para exibir a conversão de moeda fiduciária nas redes de teste.", "show_fiat_on_testnets_modal_title": "Tenha cuidado", "show_fiat_on_testnets_modal_description": "Se pedirem para você ativar esse recurso, pode ser um golpe. Esses tokens não têm valor monetário e se destinam exclusivamente a testes. Esse recurso ajuda os desenvolvedores a garantirem que os apps deles funcionam.", - "show_fiat_on_testnets_modal_learn_more": "Saiba mais.", + "show_fiat_on_testnets_modal_learn_more": "Saiba mais", "show_fiat_on_testnets_modal_button": "Continuar", - "show_hex_data": "Show hex data", + "show_hex_data": "Exibir dados hexa", "show_hex_data_desc": "Selecione essa opção para exibir o campo de dados hexa na tela de envio.", "accounts_identicon_title": "Ícone da conta", "accounts_identicon_desc": "Escolha entre três diferentes estilos de ícones exclusivos que podem ajudar você a identificar contas rapidamente.", @@ -2793,7 +2847,7 @@ "general_title": "Geral", "general_desc": "Conversão de moedas, moeda principal, idioma e motor de busca.", "advanced_title": "Avançado", - "advanced_desc": "Acesse recursos do desenvolvedor, redefina a conta, configure testnets, acesse logs de estado, gateway IPFS e RPC personalizada.", + "advanced_desc": "Acesse recursos do desenvolvedor, redefina a conta, configure testnets, logs de estado, gateway IPFS e RPC personalizada.", "notifications_title": "Notificações", "notifications_desc": "Gerencie suas notificações", "allow_notifications": "Permitir notificações", @@ -2804,9 +2858,9 @@ "customize_session_desc": "Ative os tipos de notificações que você deseja receber:", "account_session_title": "Atividade da conta", "account_session_desc": "Selecione as contas sobre as quais deseja receber notificações:", - "assets_sent_title": "Assets sent", + "assets_sent_title": "Ativos enviados", "assets_sent_desc": "Fundos e NFTs", - "assets_received_title": "Assets received", + "assets_received_title": "Ativos recebidos", "assets_received_desc": "Fundos e NFTs", "defi_title": "DeFi", "defi_desc": "Staking, trocas e pontes", @@ -2822,18 +2876,18 @@ "permissions_desc": "Gerencie as permissões dadas aos sites e apps.", "no_permissions": "Nenhuma permissão", "no_permissions_desc": "Se você conectar uma conta a um site ou app, poderá vê-los aqui.", - "security_title": "Segurança e Privacidade", + "security_title": "Segurança e privacidade", "back": "Voltar", "security_desc": "Configurações de privacidade, MetaMetrics, chave privada e Frase de Recuperação Secreta.", "networks_title": "Redes", - "networks_default_title": "Default network", + "networks_default_title": "Rede padrão", "network_delete": "Se você excluir esta rede, precisará adicioná-la de novo para visualizar seus ativos nela", "networks_default_cta": "Usar essa rede", "add_rpc_url": "Adicionar URL da RPC", "add_block_explorer_url": "Adicionar URL do explorador de blocos", "networks_desc": "Adicione e edite redes RPC personalizadas", - "network_name_label": "Network name", - "network_name_placeholder": "Network name (optional)", + "network_name_label": "Nome da rede", + "network_name_placeholder": "Nome da rede (opcional)", "network_rpc_url_label": "URL da RPC", "network_rpc_name_label": "Nome da RPC", "network_rpc_placeholder": "Nova rede RPC", @@ -2844,10 +2898,10 @@ "network_symbol_label": "Símbolo", "network_block_explorer_label": "URL do explorador de blocos", "network_block_explorer_placeholder": "URL do explorador de blocos (opcional)", - "network_chain_id_warning": "ID de cadeia inválido", - "network_other_networks": "Other networks", + "network_chain_id_warning": "ID da cadeia inválido", + "network_other_networks": "Outras redes", "network_rpc_networks": "Redes RPC", - "network_add_network": "Add network", + "network_add_network": "Adicionar rede", "network_add_custom_network": "Adicionar uma rede personalizada", "network_add": "Adicionar", "network_save": "Salvar", @@ -2858,11 +2912,11 @@ "info_title_beta": "Sobre o beta da MetaMask", "info_title_flask": "Sobre o MetaMask Flask", "experimental_title": "Experimental", - "experimental_desc": "WalletConnect e mais...", + "experimental_desc": "WalletConnect e muito mais...", "legal_title": "Jurídico", "conversion_title": "Conversão de moedas", "conversion_desc": "Exibir valores em moeda fiduciária usando uma moeda específica em todo o aplicativo.", - "primary_currency_title": "Primary currency", + "primary_currency_title": "Moeda principal", "primary_currency_desc": "Selecione Nativa para priorizar a exibição de valores na moeda nativa da cadeia (ETH, por exemplo). Selecione Fiduciária para priorizar a exibição dos valores na sua moeda fiduciária selecionada.", "primary_currency_text_first": "Nativa", "primary_currency_text_second": "Fiduciária", @@ -2883,7 +2937,7 @@ "batch_balance_requests_description": "Receba atualizações de saldo para todas as suas contas de uma só vez. Desativar esse recurso significa que outras pessoas terão menos probabilidade de associar uma conta a outra.", "third_party_title": "Receba transações de entrada", "third_party_description": "APIs de terceiros (Etherscan) são usadas para exibir suas transações de entrada no histórico. Desative essa opção caso não queira que extraiamos dados desses serviços.", - "metametrics_opt_out": "Sair da MetaMetrics", + "metametrics_opt_out": "sair da MetaMetrics", "metametrics_restart_required": "Você precisa reiniciar o app para que as alterações entrem em vigor.", "create_password": "Criar senha", "invalid_password": "Senha inválida", @@ -2899,11 +2953,11 @@ "invalid_number": "Número inválido. Insira um número decimal ou um hexadecimal com o prefixo '0x'.", "invalid_number_leading_zeros": "Número inválido. Remova os zeros à esquerda.", "invalid_number_range": "Número inválido. Insira um número entre 1 e %{maxSafeChainId}", - "hide_zero_balance_tokens_title": "Hide tokens without balance", + "hide_zero_balance_tokens_title": "Ocultar tokens sem saldo", "hide_zero_balance_tokens_desc": "Evita que tokens sem saldo sejam exibidos na sua listagem de tokens.", "token_detection_title": "Detectar tokens automaticamente", "token_detection_description": "Usamos APIs de terceiros para detectar e exibir novos tokens enviados à sua carteira. Desative essa opção caso não queira que o app extraia dados desses serviços.", - "theme_button_text": "Change theme", + "theme_button_text": "Mudar tema", "theme_title": "Tema ({{theme}})", "theme_description": "Altere a aparência do seu aplicativo definindo o tema.", "theme_os": "Sistema", @@ -2935,20 +2989,20 @@ "delete_metrics_description_after_delete_part_two": ". Este processo pode levar até 30 dias. Veja nossa", "delete_metrics_description_privacy_policy": "Política de Privacidade.", "delete_metrics_button": "Excluir dados do MetaMetrics", - "check_status_button": "Check status", + "check_status_button": "Verificar status", "delete_metrics_confirm_modal_title": "Excluir dados do MetaMetrics?", "delete_metrics_confirm_modal_description": "Estamos prestes a remover todos os seus dados do MetaMetrics. Tem certeza?", "delete_wallet_data_title": "Redefinir carteira", "delete_wallet_data_description": "Isso removerá do seu dispositivo todos os dados relacionados à carteira. Suas contas existem na blockchain e não são relacionadas à MetaMask. Você pode recuperar suas contas a qualquer momento usando sua Frase de Recuperação Secreta.", "delete_wallet_data_button": "Redefinir carteira", - "delete_data_status_title": "Deletion task status", + "delete_data_status_title": "Status da tarefa de exclusão", "delete_data_status_description": "O status atual é", "delete_metrics_error_title": "Não podemos excluir esses dados no momento.", "delete_metrics_error_description": "Essa solicitação não pode ser concluída no momento devido a um problema no servidor do sistema de análise. Por favor, tente novamente mais tarde.", "ok": "OK", - "clear_sdk_connections_title": "Limpar todas as conexões SDK da MetaMask", + "clear_sdk_connections_title": "Limpar todas as conexões do MetaMask SDK", "clear_sdk_connections_text": "Todas as conexões serão limpas e os dapps precisarão solicitar conexão novamente", - "sdk_connections": "Conexões SDK da MetaMask", + "sdk_connections": "Conexões do MetaMask SDK", "manage_sdk_connections_title": "Gerenciar conexões", "manage_sdk_connections_text": "Remover as conexões com os sites e/ou SDK da MetaMask.", "fiat_on_ramp": { @@ -2956,6 +3010,7 @@ "description": "Região e mais...", "current_region": "Região atual", "reset_region": "Redefinir região", + "change_region": "Alterar região", "no_region_selected": "Nenhuma região selecionada", "sdk_activation_keys": "Chaves de ativação do SDK", "activation_keys_description": "As chaves de ativação habilitam recursos ou provedores específicos.", @@ -3006,13 +3061,13 @@ }, "snap_details": { "install_date": "Instalado em {{date}}", - "install_origin": "Install origin", + "install_origin": "Origem da Instalação", "enabled": "Ativada", "version": "Versão" }, "keyring_account_list_item": { "account_name": "Nome da conta", - "public_address": "Public address" + "public_address": "Endereço público" }, "snap_permissions": { "approved_date": "Aprovada em {{date}}", @@ -3063,28 +3118,28 @@ "blockaid_desc": "Esse recurso alerta você sobre atividades mal-intencionadas analisando ativamente as solicitações de transações e assinaturas.", "security_alerts": "Alertas de segurança", "security_alerts_desc": "Esse recurso alerta sobre atividades mal-intencionadas por meio da análise local de solicitações de transações e assinaturas. Sempre realize sua própria devida diligência antes de aprovar solicitações. Não há garantia de que esse recurso detectará toda e qualquer atividade mal-intencionada. Ao ativar esse recurso, você concorda com os termos de uso do provedor.", - "dismiss_smart_account_update_heading": "Ignorar sugestão de \"Mudar para conta inteligente\"", + "dismiss_smart_account_update_heading": "Ignorar sugestão \"Mudar para conta inteligente\"", "dismiss_smart_account_update_desc": "Ative esta opção para não ver mais a sugestão \"Mudar para conta inteligente\" em nenhuma conta. Contas inteligentes permitem transações mais rápidas, menos taxas de rede e mais flexibilidade para pagá-las.", "use_smart_account_heading": "Usar conta inteligente", "use_smart_account_desc": "Mantenha essa opção ativada para alternar automaticamente as contas criadas dentro da MetaMask para contas inteligentes sempre que recursos relevantes estiverem disponíveis, tais como transações mais rápidas, taxas de rede menores e flexibilidade no pagamento delas.", - "use_smart_account_learn_more": "Saiba mais.", + "use_smart_account_learn_more": "Saiba mais", "smart_transactions_opt_in_heading": "Transações inteligentes", "smart_transactions_opt_in_desc_supported_networks": "Ative as transações inteligentes para fazer transações mais confiáveis e seguras nas redes suportadas.", - "smart_transactions_learn_more": "Saiba mais.", + "smart_transactions_learn_more": "Saiba mais", "simulation_details": "Estimar alterações de saldo", "simulation_details_description": "Ative esta opção para estimar as alterações de saldo pelas transações antes de confirmá-las. Isso não garante o resultado de suas transações. ", "simulation_details_learn_more": "Saiba mais.", - "aes_crypto_test_form_title": "AES crypto - test form", + "aes_crypto_test_form_title": "Criptomoedas AES - formulário de teste", "aes_crypto_test_form_description": "Seção desenvolvida exclusivamente para testes E2E. Se isso for exibido em seu aplicativo, informe ao suporte da MetaMask.", "developer_options": { - "title": "Developer options", - "generate_trace_test": "Generate trace test", - "generate_trace_test_desc": "Generate a developer test Sentry trace.", - "navigate_to_sample_feature": "Navigate to sample feature", + "title": "Opções para desenvolvedores", + "generate_trace_test": "Gerar teste de rastreamento", + "generate_trace_test_desc": "Gerar rastreamento Sentry de teste de desenvolvedores.", + "navigate_to_sample_feature": "Navegue até o recurso de exemplo", "sample_feature_desc": "Um recurso de exemplo como modelo para desenvolvedores." }, "feature_flag_override": { - "title": "Feature flag override", + "title": "Suprimir sinalizador de recurso", "description": "Sobrescrever os feature flags (alternância de recursos) do app localmente." } }, @@ -3137,7 +3192,7 @@ "sdk_feedback_modal": { "ok": "OK", "title": "Não foi possível conectar a conta", - "info": "Leia o código QR no dapp para se reconectar à MetaMask" + "info": "Please scan the QR code on the site to reconnect to MetaMask" }, "app_information": { "title": "Informações", @@ -3145,8 +3200,8 @@ "privacy_policy": "Política de privacidade", "terms_of_use": "Termos de uso", "attributions": "Créditos", - "support_center": "Visit our support center", - "web_site": "Acesse nosso site", + "support_center": "Acesse nossa central de suporte", + "web_site": "Visit our website", "contact_us": "Contact us" }, "reveal_credential": { @@ -3203,7 +3258,7 @@ "keep_credential_safe": "Mantenha sua {{credentialName}} protegida", "srp_abbreviation_text": "FRS", "srp_text": "Frase de recuperação secreta", - "private_key_text": "Chave Privada", + "private_key_text": "Chave privada", "got_it": "Entendi", "learn_more": "Saiba mais" }, @@ -3211,12 +3266,12 @@ "title": "Alerta de segurança", "description": "Capturas de tela não são uma maneira segura de guardar seu {{credentialName}}. Armazene-o em algum lugar que não tenha backup online para manter sua conta em segurança.", "srp_text": "Frase de recuperação secreta", - "priv_key_text": "Chave Privada" + "priv_key_text": "Chave privada" }, "password_reset": { "password_title": "Senha", "password_desc": "Escolha uma senha forte para desbloquear o app da MetaMask no seu dispositivo. Caso perca essa senha, você precisará da sua Frase de Recuperação Secreta para reimportar a carteira.", - "password_learn_more": "Saiba mais.", + "password_learn_more": "Saiba mais", "change_password": "Alterar senha", "password_hint": "Dica de senha" }, @@ -3246,19 +3301,28 @@ "swap": "Troca", "bridge": "Ponte", "earn": "Ganhe", - "convert_to_musd": "Convert to mUSD", + "convert_to_musd": "Converter para mUSD", + "merkl_rewards": { + "annual_bonus": "{{apy}}% de bônus", + "claimable_bonus": "Bônus resgatável", + "claimable_bonus_tooltip_description": "mUSD bonuses are claimed on Linea.", + "terms_apply": "Terms apply.", + "ok": "OK", + "claim": "Resgatar", + "processing_claim": "Processing claim..." + }, "tron": { - "daily_resource_new_energy": "New daily energy", - "sufficient_to_cover": "Sufficient to cover", + "daily_resource_new_energy": "Nova energia diária", + "sufficient_to_cover": "Suficiente para abranger", "transactions": "em transações", "daily_resource": "Recurso diário", "bandwidth": "Largura de banda", "energy": "Energia", - "daily_resource_description": "This is your daily allowance based on your staked TRX. Hold TRX to get 600 bandwidth daily.", - "sufficient_to_cover_trx_transfers": "Covers ~{{amount}} TRX transfers", - "sufficient_to_cover_trx_transfer": "Covers 1 TRX transfer", - "sufficient_to_cover_usdt_transfers": "Covers ~{{amount}} USDT transfers", - "sufficient_to_cover_usdt_transfer": "Covers 1 USDT transfer" + "daily_resource_description": "Esta é a sua cota diária com base nos seus TRX em staking. Mantenha seu TRX para receber 600 de largura de banda por dia.", + "sufficient_to_cover_trx_transfers": "Abrange transferências de TRX no valor aproximado de {{amount}}", + "sufficient_to_cover_trx_transfer": "Abrange transferência de 1 TRX", + "sufficient_to_cover_usdt_transfers": "Abrange transferências de USDT no valor aproximado de {{amount}}", + "sufficient_to_cover_usdt_transfer": "Abrange transferência de 1 TRX" }, "disabled_button": { "buy": "Não há suporte para compras nesta conta", @@ -3311,9 +3375,11 @@ }, "no_chart_data": { "title": "Nenhum dado de gráfico", - "description": "Não foi possível obter dados para esse token" + "description": "Não foi possível obter dados para esse token", + "insufficient_data": "Data is not available for this time period" }, "your_balance": "Seu saldo", + "perps_position": "Posição de perps", "unable_to_load_balance": "Não foi possível carregar seu saldo", "about": "Sobre", "about_content_display": { @@ -3363,11 +3429,11 @@ "address_copied_to_clipboard": "Endereço do token copiado para a área de transferência" }, "qr_scanner": { - "invalid_qr_code_title": "Código QR inválido", + "invalid_qr_code_title": "Invalid QR code", "invalid_qr_code_message": "O código QR que você está tentando ler não é válido.", "allow_camera_dialog_title": "Permitir acesso à câmera", "allow_camera_dialog_message": "Precisamos da sua permissão para ler códigos QR", - "scanning": "lendo...", + "scanning": "Lendo...", "ok": "Ok", "continue": "Continuar", "cancel": "Cancelar", @@ -3376,14 +3442,14 @@ "attempting_sync_from_wallet_error": "Parece que você está tentando sincronizar com a extensão. Para isso, você precisará apagar sua carteira atual. \n\nDepois de apagar ou reinstalar uma nova versão do app, selecione a opção \"Sincronizar com a extensão da MetaMask\". Importante: antes de apagar sua carteira, certifique-se de ter guardado sua Frase de Recuperação Secreta.", "not_allowed_error_title": "Ativar acesso à câmera", "not_allowed_error_desc": "Para escanear um código QR, a MetaMask precisa ter acesso à câmera. Ative essa permissão através do menu de configurações do seu dispositivo.", - "unrecognized_address_qr_code_title": "Código QR não reconhecido", + "unrecognized_address_qr_code_title": "Unrecognized QR code", "unrecognized_address_qr_code_desc": "Desculpe, esse código QR não está associado a um endereço de conta ou de contrato.", "url_redirection_alert_title": "Você está sendo direcionado a um link externo", "url_redirection_alert_desc": "Links podem ser usados para tentar aplicar golpes ou phishing nas pessoas. Portanto, certifique-se de só visitar sites em que você confia.", "label": "Ler um código QR", "open_settings": "Configurações", "camera_not_available": "Câmera indisponível", - "tron_address_not_supported": "Tron addresses are not currently supported" + "tron_address_not_supported": "Endereços Tron ainda não são suportados" }, "action_view": { "cancel": "Cancelar", @@ -3471,10 +3537,10 @@ "cancel_tx_message": "Enviar essa tentativa não garante que sua transação original será cancelada. Caso a tentativa de cancelamento seja bem-sucedida, será cobrada a taxa de transação acima.", "speedup_tx_title": "Tentar acelerar?", "speedup_tx_message": "Enviar essa tentativa não garante que sua transação original será acelerada. Caso a tentativa de acelerar seja bem-sucedida, será cobrada a taxa de transação acima.", - "nevermind": "Desistir", + "nevermind": "Never mind", "edit_network_fee": "Editar taxa de gás", "edit_priority": "Editar prioridade", - "gas_cancel_fee": "Taxa de gás para cancelar", + "gas_cancel_fee": "Gas cancellation fee", "gas_speedup_fee": "Taxa de gás para acelerar", "use_max": "Usar o máximo", "set_gas": "Definir", @@ -3602,7 +3668,7 @@ "reload": "Recarregar", "share": "Compartilhar", "bookmark": "Favoritos", - "add_to_favorites": "Adicionar aos favoritos", + "add_to_favorites": "Add to favorites", "error": "Erro", "cancel": "Cancelar", "go_back": "Voltar", @@ -3610,7 +3676,7 @@ "home": "Início", "close": "Fechar", "open_in_browser": "Abrir no navegador", - "change_url": "Alterar URL", + "change_url": "Change URL", "switch_network": "Alternar rede", "dapp_browser": "NAVEGADOR PARA DAPPS", "dapp_browser_message": "A MetaMask é a sua carteira e seu navegador para a web descentralizada. Explore um pouco a plataforma!", @@ -3664,7 +3730,7 @@ "approve": { "title": "Aprovar", "deeplink": "Deeplink", - "qr_code": "Código QR" + "qr_code": "QR code" }, "transactions": { "tx_review_confirm": "Confirmar", @@ -3676,30 +3742,30 @@ "tx_review_increase_allowance": "Increase allowance", "tx_review_set_approval_for_all": "Set approval for all", "tx_review_staking_claim": "Staking claim", - "tx_review_staking_deposit": "Staking deposit", + "tx_review_staking_deposit": "Depósito de staking", "tx_review_staking_unstake": "Retirar do staking", - "tx_review_lending_deposit": "Lending deposit", + "tx_review_lending_deposit": "Depósito de empréstimo", "tx_review_lending_withdraw": "Lending withdrawal", - "tx_review_perps_deposit": "Perps creditados", + "tx_review_perps_deposit": "Perps financiados", "tx_review_predict_deposit": "Previsões creditadas", "tx_review_predict_claim": "Ganhos resgatados", "tx_review_predict_withdraw": "Previsões retiradas", - "tx_review_musd_conversion": "mUSD Conversion", - "sent_ether": "Ethers enviados", - "self_sent_ether": "Sent yourself Ether", - "received_ether": "Ethers recebidos", + "tx_review_musd_conversion": "Conversão de mUSD", + "sent_ether": "Sent ETH", + "self_sent_ether": "Sent yourself ETH", + "received_ether": "Received ETH", "sent_dai": "DAI enviados", "self_sent_dai": "DAI enviados a si mesmo", "received_dai": "DAI recebidos", "sent_tokens": "Sent tokens", "received_tokens": "Received tokens", - "ether": "Ether", + "ether": "ETH", "sent_unit": "{{unit}} enviados", "self_sent_unit": "Sent yourself {{unit}}", "received_unit": "{{unit}} recebidos", "sent_collectible": "Sent collectible", "received_collectible": "Received collectible", - "send_ether": "Send Ether", + "send_ether": "Send ETH", "send_unit": "Send {{unit}}", "send_collectible": "Send collectible", "receive_collectible": "Receive collectible", @@ -3732,9 +3798,9 @@ }, "gas_used": "Gas used (units)", "gas_limit": "Gas limit (units)", - "gas_price": "Preço do gás (GWEI)", - "base_fee": "Taxa-base (GWEI)", - "priority_fee": "Taxa de prioridade (GWEI)", + "gas_price": "Gas price (GWEI)", + "base_fee": "Base fee (GWEI)", + "priority_fee": "Priority fee (GWEI)", "multichain_priority_fee": "Taxa de prioridade", "max_fee": "Max fee per gas", "total": "Total", @@ -3767,7 +3833,7 @@ "confirm_gas_fee_token_tooltip": "Este valor é pago à rede para processar sua transação. Inclui uma taxa da MetaMask de {{metamaskFeeFiat}} para tokens não ETH ou ETH pré-financiado.", "paid_by_metamask": "Pago pela MetaMask", "confirm_gas_fee_token_metamask_fee": "Inclui taxa de {{metamaskFeeFiat}}", - "smart_account_upgrade": "Atualizar para conta inteligente", + "smart_account_upgrade": "Mudar para conta inteligente", "smart_account_downgrade": "Mudar para a conta padrão", "batched_transactions": "Transações em lotes", "gas_modal": { @@ -3906,7 +3972,7 @@ "select_all": "Selecionar tudo", "deselect_all": "Desmarcar tudo", "new_network": "Nova rede adicionada", - "network_name": "Rede {{networkName}}", + "network_name": "rede {{networkName}}", "network_added": " está disponível agora no seletor de redes.", "provider": "Confia-se no provedor para informar os saldos e transmitir as transações de sua carteira com fidelidade", "no_match": "Nenhum resultado correspondente foi encontrado.", @@ -4004,8 +4070,8 @@ "biometrics": { "enable_touchid": "Desbloquear com Touch ID?", "enable_faceid": "Desbloquear com Face ID?", - "enable_fingerprint": "Desbloquear com impressão digital?", - "enable_biometrics": "Desbloquear com biometria?", + "enable_fingerprint": "Unlock with fingerprint?", + "enable_biometrics": "Unlock with biometrics?", "enable_device_passcode_ios": "Desbloquear com o código de acesso do dispositivo?", "enable_device_passcode_android": "Desbloquear com o PIN do dispositivo?" }, @@ -4020,18 +4086,18 @@ "title": "SOLICITAÇÃO DE CONEXÃO", "walletconnect_title": "SOLICITAÇÃO DE WALLETCONNECT", "action": "Conectar a este site?", - "action_reconnect": "Para prosseguir com a conexão, selecione o número exibido no dapp", - "action_reconnect_deeplink": "Deseja se reconectar a este dapp?", + "action_reconnect": "To resume connection, choose the number you see on the site", + "action_reconnect_deeplink": "Do you want to reconnect to this site?", "connect": "Conectar", "resume": "Continuar", "cancel": "Cancelar", - "donot_rememberme": "Não me lembro da conexão com este dapp", + "donot_rememberme": "Do not remember this site connection", "disconnect": "Desconectar", "permission": "Ver o seu", "address": "endereço público", "sign_messages": "Assinar mensagens", "on_your_behalf": "em seu nome", - "warning": "Ao clicar em conectar, você permite que este dapp veja seu endereço público. Esta é uma etapa de segurança importante para proteger seus dados contra possíveis riscos de phishing." + "warning": "By clicking connect, you allow this site to view your public address. This is an important security step to protect your data from potential phishing risks." }, "import_private_key": { "title": "Importar conta", @@ -4047,7 +4113,7 @@ "error_title": "Ocorreu algum erro", "error_message": "Não foi possível importar a chave privada. Certifique-se de que você a inseriu corretamente.", "error_empty_message": "Você precisa inserir sua chave privada.", - "or_scan_a_qr_code": "ou leia um código QR" + "or_scan_a_qr_code": "or scan a QR code" }, "import_private_key_success": { "title": "Conta importada com sucesso!", @@ -4064,12 +4130,12 @@ "paste": "Colar", "clear": "Limpar tudo", "srp_number_of_words_option_title": "Número de palavras", - "12_word_option": "Tenho uma frase de 12 palavras", - "24_word_option": "Tenho uma frase de 24 palavras", + "12_word_option": "I have a 12-word phrase", + "24_word_option": "I have a 24-word phrase", "error_title": "Ocorreu algum erro", "error_message": "We couldn't import that Secret Recovery Phrase. Please make sure you entered it correctly.", "error_empty_message": "You need to enter your Secret Recovery Phrase.", - "error_number_of_words_error_message": "As frases de recuperação secretas contêm 12 ou 24 palavras", + "error_number_of_words_error_message": "Secret Recovery Phrases contain 12 or 24 words", "error_srp_is_case_sensitive": "Entrada inválida! A frase de recuperação secreta diferencia maiúsculas e minúsculas.", "error_srp_word_error_1": "As palavras ", "error_srp_word_error_2": " está incorreta ou contém erros de ortografia.", @@ -4079,7 +4145,7 @@ "error_invalid_srp": "Frase de recuperação secreta inválida", "error_duplicate_srp": "Essa Frase de Recuperação Secreta já foi importada.", "error_duplicate_account": "The account you are trying to import is a duplicate.", - "invalid_qr_code_title": "Código QR inválido", + "invalid_qr_code_title": "Invalid QR code", "invalid_qr_code_message": "The QR code does not contain a valid Secret Recovery Phrase", "success_1": "Carteira", "success_2": "importadas" @@ -4151,7 +4217,7 @@ "why_secure_2": " Essa é a única maneira de recuperar sua carteira se você não conseguir desbloquear o app ou se trocar de dispositivo." }, "account_backup_step_2": { - "cancel_backup_title": "Cancel backup", + "cancel_backup_title": "Cancelar backup", "cancel_backup_message": "Recomendamos enfaticamente que você guarde a Frase de Recuperação Secreta para restaurar sua carteira.", "cancel_backup_ok": "Sim, vou assumir o risco", "cancel_backup_no": "Não, fazer backup da Frase de Recuperação Secreta", @@ -4163,7 +4229,7 @@ "cta_text": "OK" }, "account_backup_step_3": { - "cancel_backup_title": "Cancel backup", + "cancel_backup_title": "Cancelar backup", "cancel_backup_message": "Recomendamos enfaticamente que você guarde a Frase de Recuperação Secreta para restaurar sua carteira.", "cancel_backup_ok": "Sim, vou assumir o risco", "cancel_backup_no": "Não, fazer backup da Frase de Recuperação Secreta", @@ -4172,7 +4238,7 @@ "cta_text": "NINGUÉM ESTÁ ME OBSERVANDO" }, "account_backup_step_4": { - "cancel_backup_title": "Cancel backup", + "cancel_backup_title": "Cancelar backup", "cancel_backup_message": "Recomendamos enfaticamente que você guarde a Frase de Recuperação Secreta para restaurar sua carteira.", "cancel_backup_ok": "Sim, vou assumir o risco", "cancel_backup_no": "Não, fazer backup da Frase de Recuperação Secreta", @@ -4197,16 +4263,16 @@ "modal_button": "AVANÇAR" }, "account_backup_step_6": { - "title": "Security tips", + "title": "Dicas de segurança", "info_text": "A MetaMask não poderá recuperar sua Frase de Recuperação Secreta caso você a perca", "tip_1": "Guarde várias cópias da sua Frase de Recuperação Secreta", "tip_2": "Guarde a frase em um gerenciador de senhas de confiança, além de cópias em papel em um lugar seguro", "tip_3": "Nunca compartilhe essa frase com ninguém", "disclaimer": "* Você poderá encontrar sua Frase de Recuperação Secreta acessando ", "disclaimer_bold": "Configurações > Segurança e Privacidade", - "cta_text": "ENTENDI!", + "cta_text": "ENTENDI", "modal_title": "Parabéns!", - "modal_text": "Suas informações estão salvas, e você está pronto para continuar!", + "modal_text": "Suas informações estão salvas, e você está pronto para continuar.", "modal_button": "CONCLUÍDO", "copy_seed_phrase": "COPIAR Frase de Recuperação Secreta PARA A ÁREA DE TRANSFERÊNCIA" }, @@ -4238,7 +4304,7 @@ "steps": "Etapa {{currentStep}} de {{totalSteps}}", "action": "Confirme sua Frase de Recuperação Secreta", "info": "Selecione as palavras faltantes na ordem correta.", - "complete": "Complete backup", + "complete": "Concluir backup", "success": "Sucesso", "error-title": "Quase tudo certo", "error-description": "Confira sua Frase de Recuperação Secreta e tente novamente.", @@ -4253,7 +4319,7 @@ "congratulations": "Parabéns", "success": "Você protegeu sua carteira com sucesso. Lembre-se de guardar sua Frase de Recuperação Secreta em segurança. É sua responsabilidade!", "hint": "Deseja criar uma dica para você?", - "recover": "A MetaMask não poderá recuperar sua carteira caso você a perca. Você pode encontrar sua Frase de Recuperação Secreta em Configurações > Segurança e Privacidade.", + "recover": "A MetaMask não poderá recuperar sua carteira caso você a perca. Você pode encontrar sua Frase de Recuperação Secreta em Configurações > Segurança e privacidade.", "learn": "Saiba mais", "done": "Concluído", "recovery_hint": "Dica de recuperação", @@ -4300,7 +4366,7 @@ "withdrawal_completed": "Saque concluído", "unstake_completed": "Retirada de staking concluída", "withdrawal_requested": "Saque solicitado", - "stake_ready_to_be_withdrawn": "Staking pronto para ser sacado", + "stake_ready_to_be_withdrawn": "Staking pronto para saque", "swap_completed": "Realizado swap de {{from}} por {{to}}", "swap": "Trocado", "sent": "Enviou para {{address}}", @@ -4417,7 +4483,7 @@ "metamask_swap_completed_title": "Troca concluída", "metamask_swap_completed_description": "Sua troca na MetaMask foi bem-sucedida", "nft_sent_title": "NFT enviado", - "nft_sent_description": "Você enviou um NFT com sucesso", + "nft_sent_description": "You successfully sent an NFT", "nft_received_title": "NFT recebido", "nft_received_description": "Você recebeu novos NFTs", "rocketpool_stake_completed_title": "Staking concluído", @@ -4517,16 +4583,16 @@ "description_1": "Seu link de solicitação está pronto para envio!", "description_2": "Envie este link a um amigo, e o link pedirá que ele envie", "copy_to_clipboard": "Copiar para a área de transferência", - "qr_code": "Código QR", + "qr_code": "QR code", "send_link": "Send link", - "request_qr_code": "Código QR da solicitação de pagamento", + "request_qr_code": "Payment request QR code", "balance": "Saldo" }, "receive_request": { "title": "Receber", "share_title": "Share address", "share_description": "Envie seu endereço por e-mail ou mensagem de texto", - "qr_code_title": "Código QR", + "qr_code_title": "QR code", "qr_code_description": "Imagem escaneável que pode ler seu endereço", "request_title": "Solicitar", "request_description": "Solicitar ativos a amigos", @@ -4541,7 +4607,7 @@ "copy_address": "Copiar endereço" }, "experimental_settings": { - "wallet_connect_dapps": "Sessões WalletConnect", + "wallet_connect_dapps": "Sessões do WalletConnect", "wallet_connect_dapps_desc": "Veja a lista de sessões WalletConnect ativas.", "wallet_connect_dapps_cta": "Ver sessões", "network_not_supported": "Rede atual não compatível", @@ -4561,12 +4627,12 @@ "close_current_session": "Encerre a sessão atual antes de iniciar outra." }, "paymentRequest": { - "title": "SOLICITAÇÃO DE PAGAMENTO", - "title_complete": "PAGAMENTO CONCLUÍDO", - "confirm": "PAGAR", - "cancel": "RECUSAR", + "title": "Payment request", + "title_complete": "Payment complete", + "confirm": "Pay", + "cancel": "Decline", "is_requesting_you_to_pay": "está solicitando que você pague", - "total": "TOTAL:" + "total": "Total:" }, "webview_error": { "title": "Ocorreu algum erro", @@ -4589,6 +4655,10 @@ "fiat_on_ramp": { "buy_eth": "Comprar ETH", "buy": "Comprar {{ticker}}", + "on_network": "em {{networkName}}", + "debit_card": "Cartão de débito", + "continue": "Continuar", + "powered_by_provider": "Desenvolvido por {{provider}}", "purchased_currency": "{{currency}} comprado", "network_not_supported": "Rede atual não compatível", "switch_network": "Alterne para a Mainnet", @@ -4676,6 +4746,14 @@ "subtitle_5": "e ver quanto o gás está custando.", "cta": "Continuar para comprar {{ticker}}" } + }, + "build_quote_settings_modal": { + "title": "Configurações", + "view_order_history": "Ver histórico de ordens", + "contact_support": "Falar com o suporte", + "log_out": "Sair de {{provider}}", + "logged_out_success": "Desconectado com sucesso", + "logged_out_error": "Erro ao desconectar" } }, "fiat_on_ramp_aggregator": { @@ -4761,7 +4839,7 @@ "get_quotes": "Obter cotações", "done": "Feito", "fetching_quotes": "Buscando cotações", - "select_a_quote": "Selecione uma cotação", + "select_a_quote": "Selecionar uma cotação", "recommended_quote": "Cotação recomendada", "select_a_cryptocurrency": "Selecione uma criptomoeda", "select_a_cryptocurrency_description": "Selecione na lista de tokens disponíveis.", @@ -4822,6 +4900,7 @@ "title": "Selecione sua região", "description": "Os métodos de pagamento e tokens disponibilizados a você são determinados pelas nossas integrações terceirizadas e podem variar dependendo de sua região e do suporte das nossas integrações.", "sell_description": "Opções de destino de saque e tokens podem variar dependendo da sua região.", + "region_variation_notice": "Métodos de pagamento e tokens disponíveis podem variar dependendo da sua região e de nossos fornecedores.", "search_by_country": "Pesquisar por país", "search_by_state": "Pesquisar por estado", "no_region_results": "Nenhuma correspondência de região", @@ -4849,7 +4928,7 @@ "continue_order_description": "Para continuar sua ordem, você precisará selecionar o botão na parte inferior desta página.", "the_provider": "o provedor", "processing": "Processando ordem", - "processing_card_description": "Compras no crédito/débito normalmente levam alguns minutos", + "processing_card_description": "Compras com cartão de crédito/débito geralmente levam alguns minutos", "processing_bank_description": "Transferências bancárias normalmente levam alguns dias úteis", "details": "Detalhes da ordem", "via": "via", @@ -4883,11 +4962,11 @@ "sent": "Enviados!" }, "notifications": { - "purchase_failed_title": "Falha na compra de {{currency}}! Por favor, tente novamente. Pedimos desculpas pela inconveniência.", + "purchase_failed_title": "A compra de {{currency}} falhou. Tente novamente em instantes.", "purchase_failed_description": "Verifique seu método de pagamento e cartões aceitos", "purchase_cancelled_title": "Sua compra foi cancelada", "purchase_cancelled_description": "Verifique seu método de pagamento e cartões aceitos", - "purchase_completed_title": "Sua compra de {{amount}} {{currency}} foi realizada com sucesso!", + "purchase_completed_title": "Sua compra de {{amount}} {{currency}} foi bem-sucedida.", "purchase_completed_description": "Sua {{currency}} está disponível agora", "purchase_pending_title": "Processando sua compra de {{currency}}", "purchase_pending_description": "Isso deve levar apenas alguns minutos...", @@ -4896,7 +4975,7 @@ "sale_cancelled_title": "Ordem cancelada", "sale_cancelled_description": "Sua ordem não pôde ser concluída.", "sale_completed_title": "Ordem concluída", - "sale_completed_description": "Sua ordem foi bem-sucedida!", + "sale_completed_description": "Sua ordem foi bem-sucedida.", "sale_pending_title": "Processando venda de {{currency}}", "sale_pending_description": "Sua ordem está sendo processada.", "no_date": "Desconhecido" @@ -4921,7 +5000,7 @@ "start_swapping": "Comece a trocar" }, "feature_off_title": "Temporariamente indisponível", - "feature_off_body": "O recurso de Trocas da MetaMask está em manutenção. Verifique novamente mais tarde.", + "feature_off_body": "MetaMask Swaps are undergoing maintenance. Please check back later.", "wrong_network_title": "As trocas estão indisponíveis", "wrong_network_body": "Você só pode trocar tokens na rede principal do Ethereum.", "unallowed_asset_title": "Não é possível trocar esse token", @@ -5002,7 +5081,7 @@ "edit": "Editar", "quotes_include_fee": "As cotações incluem uma taxa de {{fee}}% da MetaMask", "quotes_include_gas_and_metamask_fee": "A cotação inclui a taxa de gás e uma taxa de {{fee}}% da MetaMask", - "tap_to_swap": "Toque para trocar", + "tap_to_swap": "Tap to swap", "swipe_to_swap": "Deslize para trocar", "swipe_to": "Deslize para", "swap": "Trocar", @@ -5302,7 +5381,7 @@ }, "network_information": { "things_to_keep_in_mind": "Coisas para manter em mente", - "testnet_network": "{{type}} Testnet", + "testnet_network": "{{type}} testnet", "first_description": "O token nativo nessa rede é {{ticker}}. É o token usado para as taxas de gás.", "second_description": "Se você tentar enviar ativos diretamente de uma rede para outra, isso poderá resultar em perda permanente de ativos. Certifique-se de usar uma ponte.", "third_description": "Seus tokens podem não ser automaticamente exibidos em sua carteira.", @@ -5385,7 +5464,7 @@ "learn_more": "Saiba mais" }, "token_allowance": { - "verify_third_party_details": "Confirmar dados de terceiros", + "verify_third_party_details": "Verify third-party details", "protect_from_scams": "Para se proteger contra golpistas, reserve um momento para confirmar os dados de terceiros.", "learn_to_verify": "Aprenda como confirmar os dados de terceiros", "spending_cap": "limite de gastos", @@ -5399,7 +5478,7 @@ }, "restore_wallet": { "restore_needed_title": "Restauração necessária", - "restore_needed_description": "Algo deu errado, mas não se preocupe! Vamos tentar restaurar sua carteira.", + "restore_needed_description": "Something went wrong, but don’t worry! Let’s try to restore your wallet.", "restore_needed_action": "Restaurar carteira" }, "wallet_restored": { @@ -5545,7 +5624,7 @@ "add_bitcoin_account": "Conta Bitcoin", "add_solana_account": "Conta Solana", "add_tron_account": "Conta Tron", - "switch_to_smart_account": "Mudar para a conta inteligente", + "switch_to_smart_account": "Mudar para conta inteligente", "rename_account": "Renomear conta", "addresses": "Endereços", "headers": { @@ -5598,6 +5677,10 @@ "error_description": "Ocorreu uma falha na instalação de {{snap}}." }, "earn": { + "claimable_bonus_tooltip": "An annual bonus claimable daily from your wallet.", + "earn_a_percentage_bonus": "Earn a {{percentage}}% bonus", + "claimable_bonus": "Claimable bonus", + "claim_bonus": "Claim bonus", "empty_state_cta": { "heading": "Empreste {{tokenSymbol}} e ganhe", "body": "Empreste seus {{tokenSymbol}} com {{protocol}} e ganhe", @@ -5681,21 +5764,36 @@ "fee": "Taxa" }, "musd_conversion": { - "convert_to_musd": "Convert to mUSD", + "ok": "OK", + "continue": "Continue", + "convert_and_get_percentage_bonus": "Converta e ganhe {{percentage}}%", + "get_a_percentage_musd_bonus": "Ganhe {{percentage}}% de bônus em mUSD", + "convert": "Converter", "toasts": { - "converting": "Converting {{token}} → mUSD", + "converting": "Convertendo {{token}} → mUSD", "eta": "~{{time}}", - "delivered": "Your mUSD has been delivered!", - "failed": "mUSD conversion failed" + "delivered": "Seu mUSD está aqui!", + "failed": "Falha ao converter mUSD" }, "education": { - "heading": "Ganhe recompensas com mUSD", - "description": "Convert your USDC, USDT, or DAI for mUSD, MetaMask’s dollar-backed stablecoin.Earn points every time you convert or hold $100.", - "continue_button": "Comece já" + "heading": "RECEBA {{percentage}}% EM \nSTABLECOINS", + "description": "Convert your stablecoins to mUSD, MetaMask’s US dollar-backed stablecoin, and receive up to a {{percentage}}% bonus.", + "terms_apply": "Terms apply.", + "primary_button": "Comece já", + "secondary_button": "Agora não" }, - "earn_points_daily": "Earn points daily", - "buy_musd": "Buy mUSD", - "get_musd": "Get mUSD" + "buy_musd": "Comprar mUSD", + "get_musd": "Obter mUSD", + "boost_title": "Get {{percentage}}% on your stablecoins", + "boost_description": "Convert your stablecoins to mUSD and receive up to a {{percentage}}% bonus.", + "powered_by_relay": "Desenvolvido por Relay" + }, + "bonus_claim": { + "toasts": { + "claiming": "Your mUSD bonus is processing", + "delivered": "Your mUSD bonus is here!", + "failed": "Bonus claim failed" + } }, "rewards": { "rewards_tag_label": "Recompensas", @@ -5711,22 +5809,22 @@ "stake": "Stake", "earn": "Ganhe", "tron": { - "stake_completed": "Staking completed", - "stake_completed_description": "Your staking transaction has been completed successfully.", - "stake_failed": "Staking failed", + "stake_completed": "Staking concluído", + "stake_completed_description": "Sua transação de staking foi concluída com sucesso.", + "stake_failed": "Falha ao realizar staking", "unstake_completed": "Retirada de staking concluída", - "unstake_completed_description": "Your unstaking transaction has been completed successfully.", - "unstake_failed": "Unstaking failed", + "unstake_completed_description": "Sua transação de retirada de staking foi concluída com sucesso.", + "unstake_failed": "Falha ao retirar staking", "bandwidth": "Largura de banda", "energy": "Energia", "estimated_annual_reward": "Recompensa anual estimada", - "trx_locked_for": "TRX locked for", - "trx_locked_for_minimum_time": "~3 days", - "trx_released_in": "TRX released in", - "trx_released_in_minimum_time": "~14 days", + "trx_locked_for": "TRX bloqueado por", + "trx_locked_for_minimum_time": "cerca de 3 dias", + "trx_released_in": "TRX lançado em", + "trx_released_in_minimum_time": "cerca de 14 dias", "fee": "Taxa", "errors": { - "insufficient_balance": "You don't have enough resource balance to do this action." + "insufficient_balance": "Você não possui saldo de recursos suficiente para realizar esta ação." } }, "stake_eth": "Fazer staking de ETH", @@ -5772,12 +5870,19 @@ "learn_more_with_period": "Saiba mais." }, "stake_your_trx_cta": { - "title": "Lend Tron and earn", - "description_start": "Stake your Tron and earn ", + "title": "Empreste Tron e ganhe", + "description_start": "Faça staking de seus Tron e ganhe ", "description_end": " anualmente.", "learn_more": "Saiba mais.", "earn_button": "Ganhe" }, + "trx_learn_more": { + "title": "Stake TRX and earn", + "stake_any_amount": "Stake any amount of TRX.", + "earn_trx_rewards": "Ganhe recompensas em TRX.", + "earn_trx_rewards_description": "Comece a ganhar assim que fizer stake. As recompensas acumulam progressivamente de forma automática.", + "flexible_unstaking_description": "Unstake anytime. Unstaking takes 14 days to process." + }, "day": { "zero": "", "one": "dia", @@ -6002,14 +6107,15 @@ "transaction_fee": "Trocaremos seus tokens por USDC na HyperCore, a rede usada pelos perps. Os provedores de troca podem cobrar uma taxa, mas a MetaMask não cobra." }, "predict_deposit": { - "transaction_fee": "Trocaremos seus tokens por USDC.e na Polygon, a rede usada pela Predict. Provedores de Swaps talvez cobrem taxas, mas a MetaMask não cobra." + "transaction_fee": "Trocaremos seus tokens por USDC.e na Polygon, a rede usada pela Predictions. Provedores de swaps talvez cobrem taxas, mas a MetaMask não cobra." }, "musd_conversion": { - "transaction_fee": "mUSD conversion fees include network costs and may include provider fees." + "transaction_fee": "As taxas de conversão de mUSD incluem custos de rede e podem incluir taxas do provedor." }, "title": { "transaction_fee": "Taxas" - } + }, + "network_fee": "As taxas de rede dependem do nível de atividade da rede e da complexidade da sua transação." }, "spending_cap": "Limite de gastos", "withdraw": "Sacar", @@ -6078,7 +6184,7 @@ }, "includes_transaction": "Inclui {{transactionCount}} transações", "useSmartAccount": "Usar conta inteligente", - "successful": "Sucesso!", + "successful": "Sucesso", "success_message": "Sua conta será atualizada para uma conta inteligente com sua próxima transação." }, "edit_spending_cap_modal": { @@ -6086,9 +6192,9 @@ "cancel": "Cancelar", "description": "Digite o valor que você considera adequado que seja gasto em seu nome.", "invalid_number_error": "O limite de gastos deve ser um número", - "no_empty_error": "O limite de gastos não pode estar vazio", - "no_extra_decimals_error": "O limite de gastos não pode ter mais decimais do que o token", - "no_zero_error": "O limite de gastos não pode ser 0", + "no_empty_error": "Spending cap can't be empty", + "no_extra_decimals_error": "Spending cap can't have more decimals than the token", + "no_zero_error": "Spending cap can't be 0", "no_zero_error_decrease_allowance": "O limite de gastos de 0 não tem efeito sobre o método \"decreaseAllowance\"", "no_zero_error_increase_allowance": "O limite de gastos de 0 não tem efeito sobre o método \"increaseAllowance\"", "save": "Salvar", @@ -6119,7 +6225,7 @@ "edit_amount_done": "Continuar", "deposit_edit_amount_done": "Adicionar fundos", "deposit_edit_amount_predict_withdraw": "Sacar", - "deposit_edit_amount_musd_conversion": "Convert to mUSD" + "deposit_edit_amount_musd_conversion": "Converter para mUSD" }, "change_in_simulation_modal": { "title": "Os resultados mudaram", @@ -6144,6 +6250,8 @@ "confirm_swap": "Swap", "terms_and_conditions": "Termos e condições", "select_token": "Selecionar token", + "no_tokens_found": "Nenhum token encontrado", + "no_tokens_found_description": "We couldn't find any tokens with this name. Try a different search.", "select_network": "Selecionar rede", "all_networks": "Todas as redes", "num_networks": "{{numNetworks}} redes", @@ -6151,6 +6259,7 @@ "select_all_networks": "Selecionar tudo", "deselect_all_networks": "Desmarcar tudo", "see_all": "Ver tudo", + "all": "Tudo", "apply": "Aplicar", "slippage": "Slippage", "slippage_info": "Se entre a realização e a confirmação de sua ordem o preço mudar, teremos o que se chama de “slippage”. Sua troca será automaticamente cancelada se o slippage exceder a tolerância que você definir aqui.", @@ -6191,9 +6300,9 @@ "title": "Ponte", "submitting_transaction": "Enviando", "fetching_quote": "Buscando cotação", - "fee_disclaimer": "Inclui {{feePercentage}}% de taxa de MM.", + "fee_disclaimer": "Includes {{feePercentage}}% MetaMask fee.", "no_mm_fee": "Sem taxa da MM", - "no_mm_fee_disclaimer": "Sem taxa da MM ao trocar por {{destTokenSymbol}}.", + "no_mm_fee_disclaimer": "No MetaMask fee swapping into {{destTokenSymbol}}.", "hardware_wallet_not_supported": "Ainda não oferecemos suporte a carteiras de hardware. Use uma hot wallet para continuar.", "hardware_wallet_not_supported_solana": "Carteiras de hardware ainda não são compatíveis com Solana. Use uma hot wallet para continuar.", "price_impact_info_title": "Impacto do preço", @@ -6208,15 +6317,7 @@ "approval_tooltip_content": "Você está permitindo o acesso ao valor especificado, {{amount}} {{symbol}}. O contrato não acessará nenhum fundo adicional.", "minimum_received": "Minimum received", "minimum_received_tooltip_title": "Minimum received", - "minimum_received_tooltip_content": "O valor mínimo que você receberá em caso de mudança do preço durante o processamento da sua transação, com base em sua tolerância ao slippage. Essa é uma estimativa dos nossos provedores de liquidez. Os valores finais podem ser diferentes.", - "verified_token": "Token verificado", - "price": "Preço", - "percent_change": "Variação percentual", - "volume": "Volume", - "market_cap_fdv": "Capitalização de mercado (FDV)", - "listed_on": "Listado em", - "centralized_exchanges": "Corretora centralizada", - "contract_address": "Endereço do contrato" + "minimum_received_tooltip_content": "O valor mínimo que você receberá em caso de mudança do preço durante o processamento da sua transação, com base em sua tolerância ao slippage. Essa é uma estimativa dos nossos provedores de liquidez. Os valores finais podem ser diferentes." }, "quote_expired_modal": { "title": "Novas cotações estão disponíveis", @@ -6290,12 +6391,12 @@ "title": "Recuperação da carteira", "login_with_social": "Faça login com suas contas de redes sociais", "setup": "Configurar", - "secret_recovery_phrase": "Frase de Recuperação Secreta {{num}}", + "secret_recovery_phrase": "Secret Recovery Phrase {{num}}", "back_up": "Fazer backup", "reveal": "Revelar", "social_recovery_title": "RECUPERAÇÃO DO {{authConnection}}", "social_recovery_enable": "Ativado", - "social_login_description": "Use seu login do {{authConnection}} e a senha da MetaMask para recuperar sua conta e frases de recuperação secretas.", + "social_login_description": "Use seu login do {{authConnection}} e a senha da MetaMask para recuperar sua conta e suas Frases de Recuperação Secretas.", "srps_title": "FRASES DE RECUPERAÇÃO SECRETAS", "srps_description": "Sua carteira fica mais protegida quando ambos os métodos de recuperação estão configurados. Se um falhar, o outro ajuda você a recuperar sua carteira." }, @@ -6349,7 +6450,7 @@ "section_1_title": "O que são contas multicadeia?", "section_1_description": "Uma conta, endereços em todas as redes compatíveis com a MetaMask. Agora você pode usar Ethereum, Solana e muito mais sem precisar trocar de conta.", "section_2_title": "Mesmo endereço, mais redes", - "section_2_description": "Unificamos suas contas, mas continue usando a MetaMask normalmente. Seus fundos permanecem seguros e inalterados", + "section_2_description": "Unificamos suas contas, mas continue usando a MetaMask normalmente. Seus fundos permanecem seguros e inalterados.", "view_accounts_button": "Ver contas", "learn_more_button": "Saiba mais", "setting_up_accounts": "Configurando suas contas" @@ -6511,8 +6612,10 @@ }, "card_onboarding": { "title": "Gaste\ne\nGanhe", - "description": "O cartão MetaMask é a maneira rápida e simples de gastar suas criptomoedas como se fossem dinheiro e ganhar recompensas.", + "description": "O Cartão MetaMask é a maneira rápida e fácil de gastar suas criptomoedas e ganhar até 3% de cashback.", "apply_now_button": "Inscreva-se já", + "login_button": "Fazer login", + "not_now_button": "Agora não", "sign_up": { "title": "Vamos começar", "description": "Crie sua conta do Cartão MetaMask, fornecida pela Crypto Life. Esta será uma conta separada da sua conta MetaMask.", @@ -6540,6 +6643,7 @@ "phone_number_label": "Insira o telefone", "country_area_code_label": "Código de área do país", "invalid_phone_number": "Número de telefone inválido", + "invalid_us_phone_number": "Insira um número de telefone válido dos EUA (10 dígitos) para continuar.", "legal_terms": "Ao continuar, você concorda em receber um SMS para verificar seu número de telefone." }, "confirm_phone_number": { @@ -6576,8 +6680,8 @@ "terms": "As aprovações geralmente levam cerca de 12 horas. Notificaremos você assim que uma decisão for tomada." }, "verifying_veriff_kyc": { - "title": "Verificando sua identidade", - "description": "Aguarde enquanto verificamos sua identidade.", + "title": "Aguardando aprovação", + "description": "Nosso parceiro precisa verificar sua identidade para aprovar sua solicitação.", "helper_text": "Isso geralmente leva alguns segundos. Não feche o aplicativo." }, "verifying_registration": { @@ -6614,7 +6718,7 @@ }, "physical_address": { "title": "Insira seu endereço", - "description": "Insira seu endereço residencial. Se aprovado, enviaremos seu cartão físico para este endereço.", + "description": "Digite seu endereço residencial atual. Ele será usado para fins de verificação.", "address_line_1_label": "Endereço linha 1", "address_line_2_label": "Endereço linha 2", "city_label": "Cidade", @@ -6622,7 +6726,7 @@ "zip_code_label": "Código postal", "country_label": "País", "electronic_consent_1": "Concordo com o consentimento e divulgação conforme a Lei E-Sign (lei americana de assinaturas eletrônicas no comércio mundial e nacional) e em receber todas as comunicações por via eletrônica. ", - "electronic_consent_2": "View document(PDF)" + "electronic_consent_2": "Visualizar documento (PDF)" }, "mailing_address": { "title": "Endereço postal", @@ -6668,22 +6772,24 @@ } }, "card_home": { + "title": "Card", + "available_balance": "Saldo disponível", "error_title": "Não é possível buscar dados", "error_description": "Parece haver um problema impedindo que você visualize o conteúdo desta página. Verifique sua conexão ou tente atualizar a página.", "try_again": "Tentar novamente", - "limited_spending_warning": "Sua capacidade real de gastos pode estar limitada. Para ajustar seu limite, acesse {{manageCard}}", + "limited_spending_warning": "Sua capacidade real de gastos pode estar limitada. Para ajustar seu limite, acesse ", "add_funds": "Adicionar fundos", "change_asset": "Mudar ativo", "enable_card_button_label": "Habilitar cartão", "enable_assets_button_label": "Habilitar ativos", "spending_limit_warning": "Você está perto de atingir seu limite de gastos. Atualize sua conta para evitar recusas.", "logout": "Sair", - "logout_description": "Saia da sua conta do cartão MetaMask", "logout_confirmation_title": "Sair do cartão?", "logout_confirmation_message": "Tem certeza de que deseja sair da sua conta do cartão MetaMask?", "logout_confirmation_cancel": "Cancelar", "logout_confirmation_confirm": "Sair", "enable_card_error": "Falha ao ativar o cartão. Tente novamente mais tarde.", + "view_card_details_error": "Unable to load card details. Please try again.", "warnings": { "close_spending_limit": { "title": "Você está próximo do seu limite de gastos", @@ -6706,6 +6812,16 @@ "blocked": { "title": "Seu cartão está bloqueado", "description": "Entre em contato com o suporte para desbloquear seu cartão" + }, + "kyc_pending": { + "title": "Verificação em andamento", + "description": "Your identity verification is being reviewed. This typically takes less than 12 hours." + } + }, + "messages": { + "card_provisioning": { + "title": "Card being created", + "description": "Your card is being created. This may take a few moments." } }, "kyc_status": { @@ -6729,33 +6845,46 @@ "ok_button": "OK" }, "manage_card_options": { - "manage_spending_limit": "Gerenciar limite de gastos", + "view_card_details": "View card details", + "hide_card_details": "Hide card details", + "view_card_details_description": "Card number, expiration and CVV", + "manage_spending_limit": "Manage limit", "manage_spending_limit_description_restricted": "Limitação de gastos ativada", "manage_spending_limit_description_full": "Acesso total está ativado", "manage_card": "Gerenciar cartão", - "advanced_card_management_description": "Veja detalhes do cartão, transações e muito mais", + "advanced_card_management_description": "See activity, cashback, freeze card, and more", "travel_title": "MetaMask Viagem", - "travel_description": "Reserve hotéis com descontos de até 60% em comparação com a Expedia", - "card_tos_title": "Termos e condições do Cartão", - "card_tos_description": "Leia os termos do emissor do cartão" + "travel_description": "Book hotels with up to 70% discounts", + "card_tos_title": "Terms and conditions" } }, "card_spending_limit": { "title_change_token": "Alterar token e rede", "title_enable_token": "Habilitar token", + "title_onboarding": "Habilitar gastos", + "setup_title": "Set up your card", + "setup_description": "Select the token you'd like to use and set a limit for how much you can spend.", + "asset_label": "Ativo", + "limit_label": "Limite", + "other_token": "Other", "full_access_title": "Acesso total", - "full_access_description": "Seu cartão pode usar seus fundos automaticamente, sem precisar solicitar aprovação a cada vez.", - "restricted_limit_title": "Limitação de gastos", - "restricted_limit_description": "Sempre que quiser aumentar o limite, você precisará retornar e pagar uma taxa de rede.", + "full_access_description": "Your card can use your funds automatically without asking for approval each time.", + "restricted_limit_title": "Limite de gastos", + "restricted_limit_description": "Você só pode gastar até este limite. Uma taxa de rede será cobrada sempre que este limite for atualizado.", "edit_limit": "Editar limite", "confirm_new_limit": "Confirmar", "cancel": "Cancelar", + "skip": "Ignorar por enquanto", "set_new_limit": "Definir limite", "dismiss": "Ignorar", "update_success": "Limite de gastos atualizado com sucesso", "update_error": "Falha ao atualizar limite de gastos", "solana_not_supported": "Habilite tokens Solana em card.metamask.io", - "select_token": "Selecionar token" + "select_token": "Selecionar token", + "loading": "Carregando tokens disponíveis...", + "load_error": "Não foi possível carregar os tokens. Tente novamente.", + "retry": "Tentar novamente", + "on_linea": "na Linea" }, "change_asset": { "title": "Alterar token e rede", @@ -6793,6 +6922,7 @@ "signup_button": "Inscrever-me", "errors": { "invalid_credentials": "Dados de login inválidos", + "invalid_otp_code": "Código incorreto, tente novamente", "unknown_error": "Erro desconhecido. Tente novamente mais tarde", "email_required": "O e-mail é obrigatório", "password_required": "A senha é obrigatória", @@ -6839,8 +6969,8 @@ }, "rewards": { "auth_fail_title": "Erro desconhecido.", - "auth_fail_description": "Ocorreu um erro desconhecido ao autenticar esta conta no programa de recompensas. Tente novamente mais tarde.", - "failed_to_authenticate": "Falha em autenticar no programa de recompensas", + "auth_fail_description": "Ocorreu um erro desconhecido ao autenticar esta conta com MetaMask Rewards. Tente novamente mais tarde.", + "failed_to_authenticate": "Falha ao autenticar com o MetaMask Rewards", "not_implemented": "Em breve", "not_implemented_season_summary": "O resumo da temporada será publicado em breve", "optin_error": { @@ -6867,6 +6997,10 @@ "error_fetching_description": "Verifique sua conexão e tente novamente.", "retry_button": "Tentar novamente" }, + "linea_tokens": { + "default_title": "$LINEA", + "title_earned": "Você ganhou {{amount}} $LINEA" + }, "upcoming_rewards_error": { "error_fetching_title": "Não foi possível carregar as recompensas", "error_fetching_description": "Verifique sua conexão e tente novamente.", @@ -6898,6 +7032,15 @@ "claim_reward_error": { "title": "Falha ao resgatar a recompensa" }, + "metal_card_claim": { + "title": "Resgate sua recompensa", + "description": "O cartão MetaMask Metal está sujeito a critérios de elegibilidade e não está disponível em todas as regiões. Caso você não se qualifique, receberá uma recompensa exclusiva de produtos premium em lugar dele.", + "contact_info": "Compartilhe suas informações de contato e você receberá uma resposta em até 2 semanas de @MidwitMilhouse pelo Telegram ou pelo e-mail christian.montoya@consensys.net.", + "email_label": "E-mail", + "email_validation_error": "Insira um endereço de e-mail válido", + "telegram_label": "Nome de usuário do Telegram", + "telegram_placeholder": "Opcional" + }, "accounts_opt_in_state_error": { "error_fetching_title": "Não foi possível carregar as contas", "error_fetching_description": "Verifique sua conexão e tente novamente.", @@ -6979,7 +7122,7 @@ "gtm_title": "As recompensas chegaram", "gtm_description": "Ganhe pontos por sua atividade. \nSuba de nível para desbloquear recompensas.", "gtm_confirm": "Comece já", - "intro_title": "A Temporada 1 \nestá ativa", + "intro_title": "Temporada 1 \njá disponível", "intro_description": "Ganhe pontos por sua atividade. \nSuba de nível para desbloquear recompensas.", "intro_confirm": "Resgatar 250 pontos", "intro_confirm_geo_loading": "Verificando região...", @@ -7052,12 +7195,12 @@ "dashboard_modal_info": { "active_account": { "title": "Não perca", - "description": "Adicione sua conta para começar a ganhar pontos com sua atividade.", + "description": "Add your account to Rewards.", "confirm": "Adicionar conta" }, "multiple_unlinked_accounts": { - "title": "Comece a ganhar pontos", - "description": "Adicione suas contas para acompanhar suas recompensas de forma rápida e fácil.", + "title": "Não perca", + "description": "Add your accounts to Rewards.", "confirm": "Adicionar contas" }, "account_not_supported": { @@ -7110,10 +7253,10 @@ } }, "predict": { - "title": "Mercados de previsão", + "title": "Previsões", "description": "20 pontos a cada US$ 10 em previsões", "sheet": { - "title": "Mercados de previsão", + "title": "Previsões", "points": "20 pontos por US$ 10", "description": "Ganhe pontos a cada US$ 10 negociados.", "cta_label": "Pesquisar mercados" @@ -7191,6 +7334,19 @@ "time_left": "restante", "expired": "Expirada" }, + "end_of_season_rewards": { + "confirm_label_default": "Confirmar", + "confirm_label_access": "Acessar", + "redeem_success_title": "Recompensa resgatada", + "metal_card_claim_success": "Informações de contato confirmadas", + "linea_tokens_claim_success": "Endereço confirmado", + "arriving_soon": "Chegada em breve", + "check_back_soon": "Volte em breve para resgatar", + "redeem_failure_title": "Falha ao resgatar", + "redeem_failure_description": "Tente novamente mais tarde.", + "reward_details": "Detalhes da recompensa", + "select_account_description": "Selecione a conta para onde deseja que a recompensa seja enviada. Os tokens serão distribuídos em até duas semanas." + }, "animation": { "could_not_load": "Não foi possível carregar" } @@ -7257,13 +7413,13 @@ "still_connecting_network": "Ainda conectando-se à {{networkName}}...", "unable_to_connect_network": "Não é possível conectar-se à {{networkName}}.", "update_rpc": "Atualizar RPC", + "switch_to_metamask_default_rpc": "Switch to MetaMask default RPC", "check_network_connectivity": "Verifique a conexão de sua rede.", - "check_network_connectivity_or": "Verifique a conexão de sua rede ou" + "check_network_connectivity_or": "Verifique a conexão de sua rede ou", + "updated_to_metamask_default": "Updated to MetaMask default" }, "trending": { "title": "Explore", - "view_all": "View all", - "tokens": "Tokens", "trending_tokens": "Trending tokens", "price_change": "Price change", "all_networks": "Todas as redes", @@ -7295,6 +7451,10 @@ "title": "Trending tokens is not available", "description": "We can't fetch this page right now", "try_again": "Tentar novamente" + }, + "empty_search_result_state": { + "title": "Nenhum token encontrado", + "description": "We were not able to find this token" } }, "ota_update_modal": { diff --git a/locales/languages/ru.json b/locales/languages/ru.json index 7b31bc853d8b..3f0fd50e86b4 100644 --- a/locales/languages/ru.json +++ b/locales/languages/ru.json @@ -8,7 +8,7 @@ "increment": "Увеличить счетчик Redux" }, "pet_name": { - "list_count_text": "Pet names on this network", + "list_count_text": "Имена питомцев в этой сети", "add_pet_name_button": "Add pet name", "address": "Адрес", "address_placeholder": "0x...", @@ -193,11 +193,10 @@ "connector": "в" }, "autocomplete": { - "placeholder": "Поиск по токену, сайту или адресу", + "placeholder": "Поиск по сайту или адресу", "recents": "Недавние", "favorites": "Избранное", - "sites": "Сайты", - "tokens": "ТОКЕНЫ" + "sites": "Сайты" }, "navigation": { "back": "Назад", @@ -306,7 +305,7 @@ "get_started": "Начало работы" }, "onboarding_wizard": { - "skip_tutorial": "Skip tutorial", + "skip_tutorial": "Пропустить руководство", "coachmark": { "action_back": "Нет, спасибо", "action_next": "Посмотреть введение", @@ -330,12 +329,12 @@ "content3": "чтобы изменить имя счета." }, "step4": { - "title": "Main menu", + "title": "Главное меню", "content1": "Из этого меню вы можете получить доступ к истории транзакций, настройкам и поддержке.", "content2": "Вы можете выполнять другие действия со счетами и получать доступ к настройкам MetaMask." }, "step5": { - "title": "Ознакомиться с браузером", + "title": "Обзор в браузере", "content1": "Вы можете исследовать web3 с помощью браузера" }, "step6": { @@ -596,9 +595,9 @@ "transaction_activity": "Активность", "request_feature": "Запрос функции", "submit_feedback_message": "Выберите тип отзыва для отправки.", - "submit_bug": "Bug report", + "submit_bug": "Отчет об ошибке", "submit_general_feedback": "Общие", - "share_address": "Share my public address", + "share_address": "Поделиться моим публичным адресом", "view_in_etherscan": "Посмотреть на Etherscan", "view_in": "Посмотреть на", "browser": "Браузер", @@ -612,12 +611,13 @@ "lock_cancel": "НЕТ", "feedback": "Отзыв", "metamask_support": "Поддержка MetaMask", - "public_address": "Public address" + "public_address": "Публичный адрес" }, "send": { "available": "доступные", "invalid_value": "Неверная сумма", "insufficient_funds": "Недостаточно средств", + "insufficient_balance_to_cover_fee": "Insufficient balance to cover fees", "continue": "Продолжить", "unit": "единица", "units": "единицы", @@ -643,8 +643,8 @@ "no_tokens_available": "Нет доступных токенов", "sign": "Подписать", "network_not_found_title": "Сеть не найдена", - "network_not_found_description": "Сеть с идентификатором блокчейна {{chain_id}} не найдена в кошельке. Сначала добавьте сеть.", - "network_missing_id": "Отсутствует ID блокчейна.", + "network_not_found_description": "Network with chain ID {{chain_id}} not found in your wallet. Please add the network first.", + "network_missing_id": "Missing chain ID.", "search_tokens": "Поиск токенов", "search_tokens_and_nfts": "Искать токены и NFT", "tokens": "Токены", @@ -675,13 +675,13 @@ "limitError": "Не удалось проверить лимиты депозита. Повторите попытку позже." }, "token_modal": { - "select_a_token": "Выбрать токен", + "select_a_token": "Выберите токен", "select_token": "Выбрать токен", "search_by_name_or_address": "Поиск токена по имени или адресу", "no_tokens_found": "Нет токенов, соответствующих «{{searchString}}»", "unsupported_token_title": "Недоступен", - "unsupported_token_description": "This token may not be available in your region or supported by any local payment providers", - "error_loading_tokens": "Unable to load tokens. Please try again later." + "unsupported_token_description": "Этот токен может быть недоступен в вашем регионе или не поддерживаться местными платежными системами.", + "error_loading_tokens": "Не удалось загрузить токены. Повторите попытку позже." }, "networks_filter_bar": { "all_networks": "Все сети" @@ -696,12 +696,12 @@ "title": "Настройки", "view_order_history": "Посмотреть историю ордеров", "contact_support": "Связаться со службой поддержки", - "log_out": "Log out of Transak", + "log_out": "Выйти из Transak", "logged_out_success": "Выполнен выход", "error_sdk_not_initialized": "SDK не инициирован", "logged_out_error": "Ошибка выхода", - "more_ways_to_buy": "More ways to buy", - "more_ways_to_buy_description": "Switch to the classic version" + "more_ways_to_buy": "Больше способов покупки", + "more_ways_to_buy_description": "Переключиться на классическую версию" }, "region_modal": { "select_a_region": "Выберите регион", @@ -714,7 +714,7 @@ "no_state_results": "Нет штатов, соответствующих «{{searchString}}»" }, "payment_modal": { - "select_a_payment_method": "Select a payment method" + "select_a_payment_method": "Выберите способ оплаты" }, "payment_duration": { "instant": "Мгновенный", @@ -805,7 +805,7 @@ "button": "Согласиться и продолжить" }, "additional_verification": { - "title": "Additional verification", + "title": "Дополнительная проверка", "paragraph_1": "Для крупных депозитов вам потребуется действительный документ, удостоверяющий личность (например, водительские права), и селфи в реальном времени.", "paragraph_2": "Чтобы пройти проверку, вам нужно разрешить доступ к вашей камере.", "button": "Продолжить" @@ -832,7 +832,7 @@ "dob_invalid": "Введите действительную дату рождения", "ssn_required": "Нужно указать номер соцстрахования", "unexpected_error": "Произошла непредвиденная ошибка. Повторите попытку.", - "phone_already_registered": "This phone number is already in use by {{email}}. Log in using this email to continue.", + "phone_already_registered": "Этот номер телефона уже используется пользователем {{email}}. Войдите, используя этот адрес электронной почты, чтобы продолжить.", "login_with_email": "Войти с помощью эл. почты" }, "enter_address": { @@ -844,7 +844,7 @@ "address_line_2": "Строка адреса 2 (необязательно)", "state": "Штат/регион", "city": "Город", - "postal_code": "Postal/zip code", + "postal_code": "Почтовый индекс", "country": "Страна", "select_state": "Выбрать штат", "address_line_1_required": "Необходимо заполнить строку адреса 1", @@ -854,7 +854,7 @@ "city_invalid": "Введите действительный город", "state_required": "Нужно указать штат/регион", "state_invalid": "Введите действительный штат", - "postal_code_required": "Postal/zip code is required", + "postal_code_required": "Нужно указать почтовый индекс", "postal_code_invalid": "Укажите действительный почтовый индекс", "unexpected_error": "Неожиданная ошибка." }, @@ -903,7 +903,7 @@ "cancel_order_button": "Отменить поручение" }, "order_details": { - "title": "Deposit order", + "title": "Депозитный ордер", "error_title": "Ошибка поручения о внесении депозита", "error_message": "Произошла неожиданная ошибка." }, @@ -946,7 +946,7 @@ }, "error_view": { "title": "Возникла ошибка", - "description": "При обработке вашего депозита возникла ошибка. Если проблема не устранена, обратитесь в службу поддержки.", + "description": "При обработке вашего депозита возникла ошибка. Если проблема сохраняется, свяжитесь со службой поддержки.", "try_again": "Повторить попытку" }, "errors": { @@ -955,14 +955,14 @@ "fetch_payment_methods": "Возникла проблема при получении способов оплаты.", "fetch_user_details": "Возникла проблема при получении данных пользователя.", "try_again": "Повторить попытку", - "error_details_title": "Error details", + "error_details_title": "Сведения об ошибке", "see_more": "Подробнее" } }, "perps": { - "basic_functionality_disabled_title": "Perps is not available", + "basic_functionality_disabled_title": "Перпы недоступны", "title": "Перпы", - "perps_trading": "Торговля бессрочными контрактами", + "perps_trading": "Торговля бессрочными фьючерсами", "perp_account_balance": "Баланс счета бессрочных фьючерсов", "manage_balance": "Управление балансом", "total_balance": "Общий баланс", @@ -974,6 +974,10 @@ "not_now": "Не сейчас", "try_now": "С чего начать" }, + "discovery_banner": { + "title": "Торгуйте перами на {{symbol}}", + "subtitle": "Умножьте свои П/У на {{leverage}}" + }, "today": "Сегодня", "yesterday": "Вчера", "unrealized_pnl": "Нереализованные П/У", @@ -1047,7 +1051,7 @@ "preparing": "Подготовка депозита...", "swapping": "Обмен {{token}} на USDC", "bridging": "Переход к Hyperliquid", - "depositing": "Внесение депозита на счет бессрочных фьючерсов", + "depositing": "Внесение депозита на счет перпов", "depositing_direct": "Перевод USDC напрямую на ваш счет HyperLiquid..." }, "step_descriptions": { @@ -1199,7 +1203,7 @@ "short": "Короткий(-ая/ое) {{asset}}" }, "tpsl_modal": { - "title": "Тейк-профит/Стоп-лосс", + "title": "Тейк-профит/стоп-лосс", "save": "Сохранить", "current_price": "Текущая цена: {{price}}", "on": "ВКЛ.", @@ -1307,7 +1311,7 @@ "margin": "Маржа", "includes_pnl": "включает П/У", "pnl": "П/У", - "estimated_pnl": "Примерные П/У", + "estimated_pnl": "Предполагаемые П/У", "fees": "Комиссии", "receive": "Вы получите", "you_receive": "Вы получите", @@ -1414,6 +1418,7 @@ "failedToEstablishAllMids": "Не удалось установить глобальную подписку allMids", "failedToEstablishMarketData": "Не удалось установить подписку на рыночные данные для {{symbol}}", "failed_to_toggle_network": "Не удалось сменить сеть", + "failed_to_switch_provider": "Не удалось сменить поставщика", "noAccountSelected": "Счет не выбран", "unsupportedMethod": "Неподдерживаемый метод: {{method}}", "invalidAddressFormat": "Неверный формат адреса: {{address}}", @@ -1452,6 +1457,24 @@ "orderLeverageReductionFailed": "Вы не можете уменьшить свое кредитное плечо", "insufficientLiquidity": "Недостаточно ликвидности для исполнения ордера. Попробуйте использовать лимитный ордер или повторите попытку через короткое время.", "connectionTimeout": "Время ожидания соединения истекло. Проверьте сеть и повторите попытку.", + "clientReinitializing": "Выполняется переинициализация сервиса. Подождите немного и повторите попытку.", + "transferFailed": "Невозможно перевести средства. Повторите попытку.", + "swapFailed": "Не удалось обменять токены. Повторите попытку.", + "spotPairNotFound": "В настоящий момент торговые пары недоступны.", + "priceUnavailable": "Данные о ценах недоступны. Обновите страницу и попробуйте снова.", + "batchCancelFailed": "Некоторые заказы не удалось отменить. Повторите попытку.", + "batchCloseFailed": "Некоторые позиции не удалось закрыть. Повторите попытку.", + "insufficientMargin": "Недостаточно маржи для исполнения этой сделки. Рассмотрите возможность пополнения счета или уменьшения размера позиции.", + "reduceOnlyViolation": "Этот ордер увеличит вашу позицию. Разрешены только ордера на снижение позиции.", + "positionWouldFlip": "Этот ордер изменит направление вашей позиции. Сначала закройте существующую позицию.", + "marginAdjustmentFailed": "Не удалось скорректировать маржу. Повторите попытку.", + "tpslUpdateFailed": "Не удалось обновить тейк-профит/стоп-лосс. Попробуйте еще раз.", + "orderRejected": "Заказ отклонен. Проверьте его и повторите попытку.", + "slippageExceeded": "Цена слишком сильно изменилась. Попробуйте использовать лимитный ордер или увеличить допустимое проскальзывание.", + "rateLimitExceeded": "Слишком много запросов. Подождите немного и повторите попытку.", + "serviceUnavailable": "Сервис временно недоступен. Повторите попытку позже.", + "networkErrorSimple": "Произошла ошибка сети. Проверьте подключение и повторите попытку.", + "insufficientBalance": "Недостаточно средств для завершения операции. Проверьте наличие средств на вашем счете.", "connectionFailed": { "title": "Не удалось подключиться к перпам", "description": "Мы работаем над тем, чтобы скоро снова предоставить доступ к ним.", @@ -1489,7 +1512,7 @@ "details_title": "Подробности", "entry_price": "Начальная цена", "funding_cost": "Финансирование", - "liquidation_price": "Цена ликвидности", + "liquidation_price": "Цена ликв.", "take_profit": "Тейк-профит", "stop_loss": "Стоп-лосс", "margin": "Маржа", @@ -1697,7 +1720,14 @@ "retry_connection": "Повторить подключение", "retrying_connection": "Подключение...", "connecting_to_perps": "Подключение к торговле бессрочными контрактами", - "timeout_title": "Подключение занимает больше времени, чем ожидалось" + "timeout_title": "Подключение занимает больше времени, чем ожидалось", + "websocket_disconnected": "Ваше подключение прервано.", + "websocket_disconnected_message": "Ваш браузер может быть неактуальным.", + "websocket_connecting": "Подключение к перпам...", + "websocket_connecting_message": "Восстановление соединения... Попытка {{attempt}}", + "websocket_connected": "Подключено", + "websocket_connected_message": "Обновление данных в реальном времени возобновилось", + "websocket_retry": "Повтор" }, "chart": { "no_data": "Нет данных графиков", @@ -1754,6 +1784,9 @@ "title": "Связаться со службой поддержки", "description": "Обратитесь в службу поддержки MetaMask за помощью" }, + "feedback": { + "title": "Оставьте нам отзыв" + }, "close_all_modal": { "title": "Закрыть все позиции", "description": "Мы закроем все ваши открытые позиции по текущей рыночной цене.", @@ -1806,7 +1839,11 @@ "price_change_low_to_high": "Изменение цены: от низкой к высокой", "past_hour": "Последний час", "past_24_hours": "Последние 24 часа", - "time": "Время" + "time": "Время", + "apply": "Применить" + }, + "market_type": { + "filter_by": "Фильтровать по" }, "perps_markets": "Рынки бессрочных фьючерсов", "volume": "Объем", @@ -1823,6 +1860,7 @@ "mainnet": "Мейн-нет", "developer_options": { "hyperliquid_network_toggle": "Переключение сети Hyperliquid", + "provider_mode_toggle": "Режим поставщика", "simulate_connection_error": "Имитировать ошибку подключения" }, "transactions": { @@ -1942,7 +1980,7 @@ } }, "predict": { - "title": "Прогноз MetaMask", + "title": "Прогнозы MetaMask", "prediction_markets": "Рынки прогнозов", "market_list": "Список рынков", "loading": "Загрузка...", @@ -1981,7 +2019,8 @@ "fee_exemption": "Мы не взимаем никаких комиссий на этом рынке.", "ended": "Завершено", "resolved_early": "Решено досрочно", - "disclaimer": "Данная информация может быть неполной. Все рыночные правила, критерии разрешения споров и окончательные результаты регулируются исключительно Polymarket. Сделки следует совершать в соответствии с полными правилами, доступными на Polymarket." + "disclaimer": "Данная информация может быть неполной. Все рыночные правила, критерии разрешения споров и окончательные результаты регулируются исключительно Polymarket. Сделки следует совершать в соответствии с полными правилами, доступными на Polymarket.", + "your_picks": "Ваша подборка" }, "tab": { "no_predictions_description": "Ваши прогнозы будут отображаться здесь, показывая вашу ставку и движение рынка.", @@ -2001,6 +2040,8 @@ "cashout_info": "{{amount}} при {{outcome}} за {{initialPrice}}", "cashout_info_multiple": "{{amount}} при {{outcomeGroupTitle}} • {{outcome}} по цене {{initialPrice}}", "position_info": "{{initialValue}} при {{outcome}} для получения {{shares}}", + "position_pick_info": "{{initialValue}} на {{outcome}}", + "position_pick_info_to_win": "{{initialValue}} при {{outcome}} для получения", "buy_yes": "Да", "buy_no": "Нет", "outcomes": "итоги", @@ -2035,6 +2076,7 @@ "won_markets_text": "Выигран {{count}} рынок{{s}}", "available_balance": "Доступный баланс", "claim_amount_text": "Получить {{amount}} $", + "claim_winnings_text": "Получить выигрыши", "unrealized_pnl_label": "Нереализованные П/У", "unrealized_pnl_value": "{{amount}} ({{percent}})", "unrealized_pnl_error": "Не удалось загрузить", @@ -2173,6 +2215,15 @@ "order_not_fully_filled": "Не удалось выполнить ваш ордер", "buy_order_not_fully_filled": "Недостаточно акций, доступных по рыночной цене, чтобы разместить ваш ордер прямо сейчас.", "sell_order_not_fully_filled": "На данный момент нет достаточного спроса по рыночной цене, чтобы обналичить." + }, + "game_details_footer": { + "pick_a_winner": "Выберите победителя", + "volume_display": "Об. ${{volume}}", + "read_terms": "Ознакомьтесь с полными условиями контракта" + }, + "sports": { + "halftime": "Перерыв между таймами", + "final": "Финал" } }, "receive": { @@ -2290,7 +2341,7 @@ "add_funds": "Внести средства", "next": "Далее", "buy_asset": "Купить {{asset}}", - "no_tokens": "У вас нет токенов!", + "no_tokens": "У вас нет токенов", "show_tokens_without_balance": "Показать токены без баланса", "nfts_autodetection_title": "Определение NFT", "nfts_autodetection_desc": "Разрешите MetaMask автоматически определять и отображать NFT в вашем кошельке.", @@ -2303,7 +2354,7 @@ "target_scam_network": "что делает его мишенью для мошенников. Мошенники могут обманом заставить вас отправить им взамен более ценную валюту. Проверьте все, прежде чем продолжить.", "use_the_currency_symbol": "использует символ валюты", "use_correct_symbol": "Прежде чем продолжить, убедитесь, что вы используете правильный символ", - "chain_id_currently_used": "Этот ID блокчейна в настоящее время используется", + "chain_id_currently_used": "This chain ID is currently used by the", "incorrect_network_name_warning": "Согласно нашим записям, имя сети может не соответствовать этому ID блокчейна.", "suggested_name": "Предлагаемое имя:", "network_check_validation_desc": "снижает ваши шансы подключиться к вредоносной или неправильной сети.", @@ -2314,7 +2365,7 @@ "nft_empty_description": "Существует целый мир NFT. Начните собирать свою коллекцию уже сегодня.", "tokens_empty_description": "Nothing to see yet. Why not browse tokens or make a trade?", "discover_nfts": "Импорт NFT", - "no_transactions": "У вас нет транзакций!", + "no_transactions": "У вас нет транзакций", "switch_network_to_view_transactions": "Смените сеть для просмотра транзакций", "send_button": "Отправить", "deposit_button": "Депозит", @@ -2362,6 +2413,7 @@ "network_fee": "Комиссия сети", "lists": "Token lists", "hide_cta": "Скрыть токен", + "perps_trading": "Торговля бессрочными фьючерсами", "options": { "title": "Token options", "view_on_portfolio": "Посмотреть в Portfolio", @@ -2409,8 +2461,8 @@ "add_token": "ИМПОРТ" }, "collectibles": { - "cancel_add_collectible": "ОТМЕНА", - "add_collectible": "ИМПОРТ" + "cancel_add_collectible": "Отмена", + "add_collectible": "Импорт" }, "banners": { "search_desc": "Улучшенное определение токенов в настоящее время доступно в сети {{network}}. ", @@ -2521,18 +2573,20 @@ "billion_abbreviation": "Б", "trillion_abbreviation": "Трлн", "million_abbreviation": "Млн", + "thousand_abbreviation": "K", "token_details": "Описание токена", "contract_address": "Адрес контракта", "token_list": "Список токенов", "market_details": "Сведения о рынке", "market_cap": "Market cap", "total_volume": "Total volume (24h)", - "volume_to_marketcap": "Volume / market cap", + "volume_to_marketcap": "Volume / Market cap", "circulating_supply": "Циркулирующее предложение", "all_time_high": "Максимум за все время", "all_time_low": "Минимум за все время", "fully_diluted": "Полностью разбавленные", - "unknown": "Неизвестно" + "unknown": "Неизвестно", + "stock": "Stock" }, "collectible": { "collectible_address": "Адрес", @@ -2583,7 +2637,7 @@ "remove_snap_account": "Удалить счет snap", "remove_snap_account_alert_description": "Этот счет будет удален из вашего кошелька. Прежде чем продолжить, убедитесь, что у вас есть исходная секретная фраза для восстановления или закрытый ключ для этого импортированного счета. Вы можете импортировать или создать счета снова из раскрывающегося списка счетов.", "remove_account_alert_remove_btn": "Удалить", - "remove_account_alert_cancel_btn": "Не обращайте внимание", + "remove_account_alert_cancel_btn": "Never mind", "accounts_title": "Счета", "connect_account_title": "Подключить счет", "connect_accounts_title": "Подключить счета", @@ -2620,7 +2674,7 @@ "advisory_by": "Консультации предоставлены Ethereum Phishing Detector и PhishFort", "potential_threat": "Потенциальные угрозы включают", "fake_metamask": "Поддельные версии MetaMask", - "srp_theft": "Секретная фраза для восстановления или кража пароля", + "srp_theft": "Secret Recovery Phrase or password theft", "malicious_transactions": "Вредоносные транзакции, приводящие к краже активов", "secret_recovery_phrase": "секретная фраза для восстановления", "account_name": "Имя счета", @@ -2675,8 +2729,8 @@ }, "connect_qr_hardware": { "title": "Подключите аппаратный кошелек на основе QR-кодов", - "description1": "Подключите аппаратный кошелек с физически разделённым оборудованием, который общается через QR-коды.", - "description2": "Как это работает?", + "description1": "Connect an airgapped hardware wallet that communicates through QR codes.", + "description2": "Как это работает", "description3": "Вот официально поддерживаемые аппаратные кошельки с физически разделённым оборудованием:", "keystone": "Keystone", "ngravezero": "Ngrave Zero", @@ -2690,10 +2744,10 @@ "hint_text": "Отсканируйте свой аппаратный кошелек, чтобы ", "purpose_connect": "подключиться", "purpose_sign": "подтвердить транзакцию", - "select_accounts": "Выберите счет" + "select_accounts": "Выбрать счет" }, "data_collection_modal": { - "accept": "Хорошо", + "accept": "ОК", "content": "Вы отключили сбор данных для наших маркетинговых целей. Это касается только этого устройства. Если вы используете MetaMask на других устройствах, обязательно отключите его и там." }, "account_selector": { @@ -2717,14 +2771,14 @@ "select_rpc_url": "Выберите URL-адрес RPC", "title": "Настройки", "current_conversion": "Базовая валюта", - "current_language": "Current language", - "ipfs_gateway": "IPFS-шлюз", + "current_language": "Текущий язык", + "ipfs_gateway": "шлюз IPFS", "ipfs_gateway_content": "MetaMask использует сторонние службы для показа изображений ваших NFT, хранящихся в IPFS, отображения информации, связанной с адресами ENS, введенными в адресную строку вашего браузера, и получения значков для различных токенов. Ваш IP-адрес может быть открыт для этих служб, когда вы их используете.", "ipfs_gateway_down": "Ваш текущий IPFS-шлюз не работает", "ipfs_gateway_desc": "Выберите предпочтительный IPFS-шлюз.", - "search_engine": "Search engine", + "search_engine": "Поисковая система", "new_RPC_URL": "Новая сеть RPC", - "state_logs": "State logs", + "state_logs": "Журналы состояния", "add_network_title": "Добавить сеть", "auto_lock": "Автоблокировка", "auto_lock_desc": "Выберите временной интервал до автоблокировки приложения.", @@ -2733,15 +2787,15 @@ "autolock_never": "Никогда", "autolock_after": "Через {{time}} секунд(-ы)", "autolock_after_minutes": "Через {{time}} минут(-ы)", - "reveal_seed_words": "Reveal seed words", - "reset_account": "Reset account", - "state_logs_button": "Download state logs", + "reveal_seed_words": "Показать сид-слова", + "reset_account": "Сбросить счет", + "state_logs_button": "Скачать журналы состояния", "reveal_seed_words_button": "ПОКАЗАТЬ СИД-СЛОВА", - "reset_account_button": "Reset account", + "reset_account_button": "Сбросить счет", "reset_account_confirm_button": "Да, сбросить", "reset_account_cancel_button": "Отмена", - "reset_account_modal_title": "Reset account?", - "clear_approvals_modal_title": "Clear approval data?", + "reset_account_modal_title": "Сбросить счет?", + "clear_approvals_modal_title": "Удалить сведения об одобрении?", "clear_approvals_modal_message": "Всем децентрализованным приложениям потребуется снова запросить доступ для просмотра информации о счете.", "clear_browser_history_modal_title": "Очистить историю браузера?", "clear_browser_history_modal_message": "Мы собираемся очистить всю историю вашего браузера. Вы уверены?", @@ -2763,7 +2817,7 @@ "protect_title": "Восстановление кошелька", "banner_social_login_enabled": "Войти с помощью {{authConnection}}", "manage_recovery_method": "Управление способами восстановления", - "video_failed": "Video failed to load.", + "video_failed": "Не удалось загрузить видео.", "protect_desc": "Сохраните свою секретную фразу для восстановления, чтобы никогда не терять доступ к своему кошельку. Обязательно сохраните ее в безопасном месте, к которому сможете получить доступ только вы и которое вы не забудете", "protect_desc_no_backup": "Это фраза из 12 слов для защиты вашего кошелька. Ее можно использовать для управления всеми вашими текущими и будущими счетами, включая возможность отправлять средства в ваш кошелек. Храните эту фразу в надежном месте, НЕ ПЕРЕДАВАЙТЕ ее никому. MetaMask не сможет помочь вам восстановить этот ключ.", "learn_more": "Подробнее.", @@ -2782,9 +2836,9 @@ "show_fiat_on_testnets_desc": "Выберите это, чтобы показывать обмен на фиатную валюту в тестовых сетях.", "show_fiat_on_testnets_modal_title": "Будьте осторожны", "show_fiat_on_testnets_modal_description": "Если вас попросили включить эту функцию, возможно, вас обманули. Эти токены не имеют денежной стоимости и предназначены только для тестирования. Эта функция помогает разработчикам убедиться, что их приложения работают.", - "show_fiat_on_testnets_modal_learn_more": "Узнайте подробней.", + "show_fiat_on_testnets_modal_learn_more": "Подробнее", "show_fiat_on_testnets_modal_button": "Продолжить", - "show_hex_data": "Show hex data", + "show_hex_data": "Показать шестнадцатеричные данные", "show_hex_data_desc": "Выберите это, чтобы отобразить поле шестнадцатеричных данных на экране отправки.", "accounts_identicon_title": "Значок счета", "accounts_identicon_desc": "Выбирайте из трех различных стилей уникальных значков, которые помогут вам быстро находить счета.", @@ -2793,7 +2847,7 @@ "general_title": "Общие", "general_desc": "Конвертация валюты, основная валюта, язык и поисковая система.", "advanced_title": "Дополнительно", - "advanced_desc": "Доступ к функциям разработчика, сброс счета, настройка тестнетов, журналы состояния, IPFS-шлюз и настраиваемый RPC.", + "advanced_desc": "Получите доступ к функциям для разработчиков, сбрасывайте счет, настраивайте тестовые сети, журналы состояния, шлюз IPFS и пользовательский RPC.", "notifications_title": "Уведомления", "notifications_desc": "Управляйте своими уведомлениями", "allow_notifications": "Разрешить уведомления", @@ -2804,10 +2858,10 @@ "customize_session_desc": "Включите типы уведомлений, которые хотите получать:", "account_session_title": "Активность счета", "account_session_desc": "Выберите счета, о которых хотите получать уведомления:", - "assets_sent_title": "Assets sent", - "assets_sent_desc": "Средства и NFT", - "assets_received_title": "Assets received", - "assets_received_desc": "Средства и NFT", + "assets_sent_title": "Отправленные активы", + "assets_sent_desc": "Средства и NFT-токены", + "assets_received_title": "Полученные активы", + "assets_received_desc": "Средства и NFT-токены", "defi_title": "DeFi", "defi_desc": "Стейкинг, обмен и создание моста", "snaps_title": "Snaps", @@ -2826,28 +2880,28 @@ "back": "Назад", "security_desc": "Настройки конфиденциальности, MetaMetrics, закрытый ключ и секретная фраза для восстановления.", "networks_title": "Сети", - "networks_default_title": "Default network", + "networks_default_title": "Сеть по умолчанию", "network_delete": "Если вы удалите эту сеть, вам нужно будет добавить ее снова, чтобы просмотреть свои активы в этой сети", "networks_default_cta": "Использовать эту сеть", "add_rpc_url": "Добавить URL-адрес RPC", - "add_block_explorer_url": "Добавить URL-адрес обозревателя блоков", + "add_block_explorer_url": "Добавить URL обозревателя блоков", "networks_desc": "Добавляйте и редактируйте пользовательские сети RPC", - "network_name_label": "Network name", - "network_name_placeholder": "Network name (optional)", + "network_name_label": "Имя сети", + "network_name_placeholder": "Имя сети (необязательно)", "network_rpc_url_label": "URL-адрес RPC", - "network_rpc_name_label": "Имя RPC", + "network_rpc_name_label": "Название RPC", "network_rpc_placeholder": "Новая сеть RPC", "network_failover_rpc_url_label": "URL-адрес отказоустойчивого RPC", "failover": "Отказоустойчивость", "network_chain_id_label": "Ид. блокчейна", "network_chain_id_placeholder": "Ид. блокчейна", "network_symbol_label": "Символ", - "network_block_explorer_label": "URL-адрес обозревателя блоков", + "network_block_explorer_label": "URL обозревателя блоков", "network_block_explorer_placeholder": "URL-адрес обозревателя блоков (необязательно)", "network_chain_id_warning": "Неверный ид. блокчейна", - "network_other_networks": "Other networks", + "network_other_networks": "Другие сети", "network_rpc_networks": "RPC-сети", - "network_add_network": "Add network", + "network_add_network": "Добавить сеть", "network_add_custom_network": "Добавить пользовательскую сеть", "network_add": "Добавить", "network_save": "Сохранить", @@ -2862,7 +2916,7 @@ "legal_title": "Юридическая информация", "conversion_title": "Обмен валюты", "conversion_desc": "Отображение фиатных значений при использовании определенной валюты во всем приложении.", - "primary_currency_title": "Primary currency", + "primary_currency_title": "Основная валюта", "primary_currency_desc": "Выберите «Собственная», чтобы отдать приоритет отображению значений в собственной валюте сети (например, ETH). Выберите «Фиатная», чтобы отдать приоритет отображению значений в выбранной фиатной валюте.", "primary_currency_text_first": "Собственная", "primary_currency_text_second": "Фиатная", @@ -2883,7 +2937,7 @@ "batch_balance_requests_description": "Получайте обновления баланса всех ваших счетов одновременно. Отключение этой функции приведет к тому, что другие с меньшей вероятностью будут связывать один счет с другим.", "third_party_title": "Получить входящие транзакции", "third_party_description": "Сторонние API (Etherscan) используются для отображения входящих транзакций в истории. Отключите, если не хотите, чтобы мы извлекали данные из этих служб.", - "metametrics_opt_out": "Отказ от MetaMetrics", + "metametrics_opt_out": "отказ от MetaMetrics", "metametrics_restart_required": "Вам нужно перезапустить приложение, чтобы изменения вступили в силу.", "create_password": "Создать пароль", "invalid_password": "Неверный пароль", @@ -2899,11 +2953,11 @@ "invalid_number": "Неверное число. Введите десятичное или шестнадцатеричное число с префиксом 0x.", "invalid_number_leading_zeros": "Неверное число. Удалите все нули в начале.", "invalid_number_range": "Неверное число. Введите число между 1 и %{maxSafeChainId}", - "hide_zero_balance_tokens_title": "Hide tokens without balance", + "hide_zero_balance_tokens_title": "Скрыть токены без баланса", "hide_zero_balance_tokens_desc": "Предотвращает отображение токенов без баланса в вашем списке токенов.", "token_detection_title": "Автоопределение токенов", "token_detection_description": "Мы используем сторонние API для обнаружения и отображения новых токенов, отправленных в ваш кошелек. Отключите, если не хотите, чтобы приложение извлекало данные из этих служб.", - "theme_button_text": "Change theme", + "theme_button_text": "Изменить тему", "theme_title": "Тема ({{theme}})", "theme_description": "Установите тему, изменяя внешний вид приложения.", "theme_os": "Система", @@ -2935,18 +2989,18 @@ "delete_metrics_description_after_delete_part_two": ". Этот процесс может занять до 30 дней. Ознакомьтесь с нашей", "delete_metrics_description_privacy_policy": "Политикой конфиденциальности.", "delete_metrics_button": "Удалить данные MetaMetrics", - "check_status_button": "Check status", + "check_status_button": "Проверить статус", "delete_metrics_confirm_modal_title": "Удалить данные MetaMetrics?", "delete_metrics_confirm_modal_description": "Мы собираемся удалить всю все данные MetaMetrics. Вы уверены?", "delete_wallet_data_title": "Сброс кошелька", "delete_wallet_data_description": "Это удалит все данные, связанные с кошельком, с вашего устройства. Ваши счета существуют в блокчейне и не связаны с MetaMask. Вы всегда можете восстановить свои счета, используя секретную фразу для восстановления.", "delete_wallet_data_button": "Сброс кошелька", - "delete_data_status_title": "Deletion task status", + "delete_data_status_title": "Удален статус на задания", "delete_data_status_description": "Текущий статус —", "delete_metrics_error_title": "Мы не можем удалить эти данные прямо сейчас.", "delete_metrics_error_description": "Этот запрос нельзя выполнить сейчас из-за проблемы с сервером аналитической системы. Повторите попытку позже.", "ok": "ОК", - "clear_sdk_connections_title": "Очистить все соединения MetaMask SDK", + "clear_sdk_connections_title": "Удалить все соединения MetaMask SDK", "clear_sdk_connections_text": "Все соединения будут очищены, и dapps нужно будет снова запросить соединение", "sdk_connections": "Соединения MetaMask SDK", "manage_sdk_connections_title": "Управление подключениями", @@ -2956,6 +3010,7 @@ "description": "Регион и прочее...", "current_region": "Текущий регион", "reset_region": "Сбросить регион", + "change_region": "Изменить регион", "no_region_selected": "Регион не выбран", "sdk_activation_keys": "Ключи активации SDK", "activation_keys_description": "Ключи активации позволят включить определенные функции или услуги определенных поставщиков.", @@ -3006,13 +3061,13 @@ }, "snap_details": { "install_date": "Установлен {{date}}", - "install_origin": "Install origin", + "install_origin": "Установить origin", "enabled": "Включено", "version": "Версия" }, "keyring_account_list_item": { "account_name": "Имя счета", - "public_address": "Public address" + "public_address": "Публичный адрес" }, "snap_permissions": { "approved_date": "Одобрен {{date}}", @@ -3063,28 +3118,28 @@ "blockaid_desc": "Эта функция предупреждает вас о вредоносной активности, активно проверяя транзакции и запросы на подпись.", "security_alerts": "Оповещения безопасности", "security_alerts_desc": "Эта функция предупреждает вас о вредоносной активности, проверяя запросы транзакций и подписей локально. Всегда проводите комплексную проверку перед утверждением каких-либо запросов. Нет никакой гарантии, что эта функция обнаружит всю вредоносную активность. Включая эту функцию, вы соглашаетесь с условиями использования поставщика.", - "dismiss_smart_account_update_heading": "Отклонить предложение «Перейти на смарт-счет»", - "dismiss_smart_account_update_desc": "Включите этот параметр, чтобы больше не видеть предложение «Перейти на смарт-счет» ни в одном из счетов. Смарт-счета дают доступ к более быстрым транзакциям, более низким комиссиям сети и большей гибкости при оплате на них.", + "dismiss_smart_account_update_heading": "Отклонить предложение «Переключиться на смарт-счет»", + "dismiss_smart_account_update_desc": "Включите эту функцию, чтобы больше не видеть предложение «Переключиться на смарт-счет» ни для одного из счетов. Смарт-счета обеспечивают более быстрые транзакции, более низкие комиссии сети и большую гибкость в оплате.", "use_smart_account_heading": "Использовать смарт-счет", "use_smart_account_desc": "Включите этот параметр, чтобы автоматически менять счета, созданные в MetaMask, на смарт-счета, когда для них доступны соответствующие функции, такие как более быстрые транзакции, более низкие комиссии сети и гибкость при оплате.", - "use_smart_account_learn_more": "Узнайте подробней.", + "use_smart_account_learn_more": "Подробнее", "smart_transactions_opt_in_heading": "Умные транзакции", "smart_transactions_opt_in_desc_supported_networks": "Включите функцию «Умные транзакции» для более надежных и безопасных транзакций в поддерживаемых сетях.", - "smart_transactions_learn_more": "Узнайте подробней.", + "smart_transactions_learn_more": "Подробнее", "simulation_details": "Спрогнозировать изменения баланса", "simulation_details_description": "Включите эту опцию, чтобы спрогнозировать изменения баланса транзакций перед их подтверждением. Это не гарантирует окончательный результат ваших транзакций. ", "simulation_details_learn_more": "Узнайте подробнее.", - "aes_crypto_test_form_title": "AES crypto - test form", + "aes_crypto_test_form_title": "Криптографический AES — тестовая форма", "aes_crypto_test_form_description": "Раздел разработан исключительно для тестирования E2E. Если его видно в вашем приложении, сообщите об этом в службу поддержки MetaMask.", "developer_options": { - "title": "Developer options", - "generate_trace_test": "Generate trace test", - "generate_trace_test_desc": "Generate a developer test Sentry trace.", - "navigate_to_sample_feature": "Navigate to sample feature", + "title": "Параметры разработчика", + "generate_trace_test": "Сгенерировать трассировочный тест", + "generate_trace_test_desc": "Сгенерируйте трассировку Sentry для тестирования разработчика.", + "navigate_to_sample_feature": "Перейдите к примеру функции", "sample_feature_desc": "Образец функции в качестве шаблона для разработчиков." }, "feature_flag_override": { - "title": "Feature flag override", + "title": "Переопределение флага функции", "description": "Переопределите флаги функций для приложения локально." } }, @@ -3137,7 +3192,7 @@ "sdk_feedback_modal": { "ok": "ОК", "title": "Счету не удалось подключиться", - "info": "Отсканируйте QR-код в dApp, чтобы повторно подключиться к MetaMask." + "info": "Please scan the QR code on the site to reconnect to MetaMask" }, "app_information": { "title": "Информация", @@ -3145,8 +3200,8 @@ "privacy_policy": "Политика конфиденциальности", "terms_of_use": "Условия использования", "attributions": "Атрибуции", - "support_center": "Visit our support center", - "web_site": "Посетите наш сайт", + "support_center": "Посетите наш центр поддержки", + "web_site": "Visit our website", "contact_us": "Contact us" }, "reveal_credential": { @@ -3216,7 +3271,7 @@ "password_reset": { "password_title": "Пароль", "password_desc": "Выберите надежный пароль, чтобы разблокировать приложение MetaMask на устройстве. Если вы потеряете этот пароль, вам потребуется секретная фраза для восстановления для повторного импорта кошелька.", - "password_learn_more": "Подробнее.", + "password_learn_more": "Подробнее", "change_password": "Изменить пароль", "password_hint": "Подсказка пароля" }, @@ -3246,19 +3301,28 @@ "swap": "Обменять", "bridge": "Мост", "earn": "Заработать", - "convert_to_musd": "Convert to mUSD", + "convert_to_musd": "Конвертировать в mUSD", + "merkl_rewards": { + "annual_bonus": "Бонус {{apy}}%", + "claimable_bonus": "Встребуемый бонус", + "claimable_bonus_tooltip_description": "mUSD bonuses are claimed on Linea.", + "terms_apply": "Terms apply.", + "ok": "ОК", + "claim": "Получить", + "processing_claim": "Processing claim..." + }, "tron": { - "daily_resource_new_energy": "New daily energy", - "sufficient_to_cover": "Sufficient to cover", + "daily_resource_new_energy": "Новаяя дневная энергия", + "sufficient_to_cover": "Достаточно для покрытия", "transactions": "транзакций", "daily_resource": "Ежедневный ресурс", "bandwidth": "Пропускная способность", "energy": "Энергия", - "daily_resource_description": "This is your daily allowance based on your staked TRX. Hold TRX to get 600 bandwidth daily.", - "sufficient_to_cover_trx_transfers": "Covers ~{{amount}} TRX transfers", - "sufficient_to_cover_trx_transfer": "Covers 1 TRX transfer", - "sufficient_to_cover_usdt_transfers": "Covers ~{{amount}} USDT transfers", - "sufficient_to_cover_usdt_transfer": "Covers 1 USDT transfer" + "daily_resource_description": "Это ваш ежедневный лимит, рассчитанный на основе вашего стейкинга TRX. Вы каждый день бесплатно получаете 600 единиц пропускной способности.", + "sufficient_to_cover_trx_transfers": "Покрывает ~{{amount}} перевода(-ов) TRX", + "sufficient_to_cover_trx_transfer": "Покрывает 1 перевод TRX", + "sufficient_to_cover_usdt_transfers": "Покрывает ~{{amount}} перевода(-ов) USDT", + "sufficient_to_cover_usdt_transfer": "Покрывает 1 перевод USDT" }, "disabled_button": { "buy": "Этот счет не поддерживает покупку", @@ -3311,9 +3375,11 @@ }, "no_chart_data": { "title": "Нет данных графика", - "description": "Нам не удалось получить данные для этого токена" + "description": "Нам не удалось получить данные для этого токена", + "insufficient_data": "Data is not available for this time period" }, "your_balance": "Ваш баланс", + "perps_position": "Позиция по перпам", "unable_to_load_balance": "Не удалось загрузить ваш баланс", "about": "О MetaMask", "about_content_display": { @@ -3363,11 +3429,11 @@ "address_copied_to_clipboard": "Адрес токена скопирован в буфер обмена" }, "qr_scanner": { - "invalid_qr_code_title": "Неверный QR-код", + "invalid_qr_code_title": "Invalid QR code", "invalid_qr_code_message": "QR-код, который вы пытаетесь отсканировать, недействителен.", "allow_camera_dialog_title": "Предоставьте доступ к камере", "allow_camera_dialog_message": "Нам нужно ваше разрешение для сканирования QR-кодов", - "scanning": "сканирование...", + "scanning": "Сканирование...", "ok": "ОК", "continue": "Продолжить", "cancel": "Отмена", @@ -3376,14 +3442,14 @@ "attempting_sync_from_wallet_error": "Похоже, вы пытаетесь выполнить синхронизацию с расширением. Для этого вам нужно удалить текущий кошелек. \n\nПосле того как вы удалите или переустановите новую версию приложения, выберите параметр «Синхронизировать с расширением MetaMask». Важно! Прежде чем удалять кошелек, обязательно сделайте резервную копию секретной фразы для восстановления.", "not_allowed_error_title": "Предоставьте доступ к камере", "not_allowed_error_desc": "Чтобы отсканировать QR-код, вам необходимо предоставить доступ к камере MetaMask в меню настроек вашего устройства.", - "unrecognized_address_qr_code_title": "Нераспознанный QR-код", + "unrecognized_address_qr_code_title": "Unrecognized QR code", "unrecognized_address_qr_code_desc": "Извините, этот QR-код не связан с адресом счета или адресом контракта.", "url_redirection_alert_title": "Вы собираетесь перейти по внешней ссылке", "url_redirection_alert_desc": "Ссылки могут быть использованы для обмана или фишинга, поэтому обязательно посещайте только те сайты, которым доверяете.", "label": "Сканировать QR-код", "open_settings": "Настройки", "camera_not_available": "Камера недоступна", - "tron_address_not_supported": "Tron addresses are not currently supported" + "tron_address_not_supported": "В настоящее время адреса Tron не поддерживаются" }, "action_view": { "cancel": "Отмена", @@ -3471,10 +3537,10 @@ "cancel_tx_message": "Эта попытка не гарантирует, что ваша первоначальная транзакция будет отменена. Если попытка отмены окажется успешной, с вас будет удержана вышеуказанная комиссия за транзакцию.", "speedup_tx_title": "Попытаться ускорить?", "speedup_tx_message": "Эта попытка не гарантирует, что ваша первоначальная транзакция будет ускорена. Если попытка ускорения окажется успешной, с вас будет удержана вышеуказанная комиссия за транзакцию.", - "nevermind": "Не обращайте внимание", + "nevermind": "Never mind", "edit_network_fee": "Изменить плату за газ", "edit_priority": "Изменить приоритет", - "gas_cancel_fee": "Плата за газ при отмене", + "gas_cancel_fee": "Gas cancellation fee", "gas_speedup_fee": "Плата за газ при ускорении", "use_max": "Использовать макс.", "set_gas": "Установить", @@ -3602,7 +3668,7 @@ "reload": "Перезагрузить", "share": "Поделиться", "bookmark": "Закладка", - "add_to_favorites": "Добавить в Избранное", + "add_to_favorites": "Add to favorites", "error": "Ошибка", "cancel": "Отмена", "go_back": "Назад", @@ -3610,7 +3676,7 @@ "home": "Главная", "close": "Закрыть", "open_in_browser": "Открыть в браузере", - "change_url": "Изменить URL", + "change_url": "Change URL", "switch_network": "Сменить сеть", "dapp_browser": "БРАУЗЕР DAPP", "dapp_browser_message": "MetaMask — это ваш кошелек и браузер для децентрализованной сети. Осмотритесь!", @@ -3676,30 +3742,30 @@ "tx_review_increase_allowance": "Increase allowance", "tx_review_set_approval_for_all": "Set approval for all", "tx_review_staking_claim": "Staking claim", - "tx_review_staking_deposit": "Staking deposit", + "tx_review_staking_deposit": "Депозит в стейкинг", "tx_review_staking_unstake": "Отменить стейкинг", - "tx_review_lending_deposit": "Lending deposit", + "tx_review_lending_deposit": "Кредитный депозит", "tx_review_lending_withdraw": "Lending withdrawal", - "tx_review_perps_deposit": "Оплаченные перпы", + "tx_review_perps_deposit": "Пополненные перпы", "tx_review_predict_deposit": "Прогнозы с финансированием", "tx_review_predict_claim": "Востребованные доходы", "tx_review_predict_withdraw": "Отмена прогнозов", - "tx_review_musd_conversion": "mUSD Conversion", - "sent_ether": "Отправлен эфир", - "self_sent_ether": "Sent yourself Ether", - "received_ether": "Получен эфир", + "tx_review_musd_conversion": "Конвертация mUSD", + "sent_ether": "Sent ETH", + "self_sent_ether": "Sent yourself ETH", + "received_ether": "Received ETH", "sent_dai": "Отправлен DAI", "self_sent_dai": "Отправил(-а) себе DAI", "received_dai": "Получен DAI", "sent_tokens": "Sent tokens", "received_tokens": "Received tokens", - "ether": "Эфир", + "ether": "ETH", "sent_unit": "Отправлен {{unit}}", "self_sent_unit": "Sent yourself {{unit}}", "received_unit": "Получен {{unit}}", "sent_collectible": "Sent collectible", "received_collectible": "Received collectible", - "send_ether": "Send Ether", + "send_ether": "Send ETH", "send_unit": "Send {{unit}}", "send_collectible": "Send collectible", "receive_collectible": "Receive collectible", @@ -3732,9 +3798,9 @@ }, "gas_used": "Gas used (units)", "gas_limit": "Gas limit (units)", - "gas_price": "Цена газа (Гвей)", - "base_fee": "Базовая комиссия (GWEI)", - "priority_fee": "Плата за приоритет (GWEI)", + "gas_price": "Gas price (GWEI)", + "base_fee": "Base fee (GWEI)", + "priority_fee": "Priority fee (GWEI)", "multichain_priority_fee": "Плата за приоритет", "max_fee": "Max fee per gas", "total": "Итого", @@ -3767,7 +3833,7 @@ "confirm_gas_fee_token_tooltip": "Эта сумма выплачивается сети за обработку вашей транзакции. Она включает в себя комиссию MetaMask в размере {{metamaskFeeFiat}} для токенов, отличных от ETH, или для предоплаченных ETH.", "paid_by_metamask": "Оплачено MetaMask", "confirm_gas_fee_token_metamask_fee": "Включает комиссию {{metamaskFeeFiat}}", - "smart_account_upgrade": "Повысить уровень до смарт-счета", + "smart_account_upgrade": "Перейти на смарт-счет", "smart_account_downgrade": "Перейти на стандартный счет", "batched_transactions": "Пакетные транзакции", "gas_modal": { @@ -3906,7 +3972,7 @@ "select_all": "Выбрать все", "deselect_all": "Отменить выбор всего", "new_network": "Добавлена новая сеть", - "network_name": "Сеть {{networkName}}", + "network_name": "сеть {{networkName}}", "network_added": " теперь доступно в селекторе сети.", "provider": "Поставщику доверяют сообщать баланс вашего кошелька и достоверно транслировать транзакции", "no_match": "Совпадений не найдено.", @@ -4004,8 +4070,8 @@ "biometrics": { "enable_touchid": "Разблокировать с помощью Touch ID?", "enable_faceid": "Разблокировать с помощью Face ID?", - "enable_fingerprint": "Разблокировать по отпечатку пальца?", - "enable_biometrics": "Разблокировать с помощью биометрии?", + "enable_fingerprint": "Unlock with fingerprint?", + "enable_biometrics": "Unlock with biometrics?", "enable_device_passcode_ios": "Разблокировать с помощью пароля устройства?", "enable_device_passcode_android": "Разблокировать с помощью PIN-кода устройства?" }, @@ -4020,18 +4086,18 @@ "title": "ЗАПРОС НА УСТАНОВЛЕНИЯ СВЯЗИ", "walletconnect_title": "ЗАПРОС WALLETCONNECT", "action": "Подключиться к этому сайту?", - "action_reconnect": "Чтобы восстановить соединение, выберите номер, который вы видите в dApp", - "action_reconnect_deeplink": "Хотите снова подключиться к этому dApp?", + "action_reconnect": "To resume connection, choose the number you see on the site", + "action_reconnect_deeplink": "Do you want to reconnect to this site?", "connect": "Подключиться", "resume": "Возобновить", "cancel": "Отмена", - "donot_rememberme": "Не запоминать это подключение dApp", + "donot_rememberme": "Do not remember this site connection", "disconnect": "Отключить", "permission": "Просмотр вашего", "address": "публичный адрес", "sign_messages": "Подписать сообщения", "on_your_behalf": "от вашего имени", - "warning": "Нажимая «Подключиться», вы разрешаете этому децентрализованному приложению просматривать ваш публичный адрес. Это важный шаг в области безопасности для защиты ваших данных от потенциальных рисков фишинга." + "warning": "By clicking connect, you allow this site to view your public address. This is an important security step to protect your data from potential phishing risks." }, "import_private_key": { "title": "Импорт счета", @@ -4047,7 +4113,7 @@ "error_title": "Что-то пошло не так", "error_message": "Мы не смогли импортировать этот закрытый ключ. Убедитесь, что вы ввели его правильно.", "error_empty_message": "Вам нужно ввести свой закрытый ключ.", - "or_scan_a_qr_code": "или отсканировать QR-код" + "or_scan_a_qr_code": "or scan a QR code" }, "import_private_key_success": { "title": "Счет успешно импортирован!", @@ -4064,12 +4130,12 @@ "paste": "Вставить", "clear": "Очистить все", "srp_number_of_words_option_title": "Количество слов", - "12_word_option": "У меня есть фраза из 12 слов", - "24_word_option": "У меня есть фраза из 24 слов", + "12_word_option": "I have a 12-word phrase", + "24_word_option": "I have a 24-word phrase", "error_title": "Что-то пошло не так", "error_message": "We couldn't import that Secret Recovery Phrase. Please make sure you entered it correctly.", "error_empty_message": "You need to enter your Secret Recovery Phrase.", - "error_number_of_words_error_message": "Секретные фразы для восстановления содержат 12 слов и 24 слова", + "error_number_of_words_error_message": "Secret Recovery Phrases contain 12 or 24 words", "error_srp_is_case_sensitive": "Введены неверные данные! Секретная фраза для восстановления чувствительна к регистру.", "error_srp_word_error_1": "Слово ", "error_srp_word_error_2": " неверное или содержит орфографические ошибки.", @@ -4079,7 +4145,7 @@ "error_invalid_srp": "Недействительная секретная фраза для восстановления", "error_duplicate_srp": "Эта секретная фраза для восстановления уже импортирована.", "error_duplicate_account": "The account you are trying to import is a duplicate.", - "invalid_qr_code_title": "Недействительный QR-код", + "invalid_qr_code_title": "Invalid QR code", "invalid_qr_code_message": "The QR code does not contain a valid Secret Recovery Phrase", "success_1": "Кошелек", "success_2": "импортирован" @@ -4151,7 +4217,7 @@ "why_secure_2": "Это единственный способ восстановить кошелек, если вы заблокируете доступ к приложению или приобретете новое устройство." }, "account_backup_step_2": { - "cancel_backup_title": "Cancel backup", + "cancel_backup_title": "Отменить создание резервной копии", "cancel_backup_message": "Настоятельно рекомендуем сохранить секретную фразу для восстановления, чтобы при необходимости восстановить кошелек.", "cancel_backup_ok": "Да, я рискну", "cancel_backup_no": "Нет, создать резервную копию секретной фразы для восстановления", @@ -4163,7 +4229,7 @@ "cta_text": "ОК" }, "account_backup_step_3": { - "cancel_backup_title": "Cancel backup", + "cancel_backup_title": "Отменить создание резервной копии", "cancel_backup_message": "Настоятельно рекомендуем сохранить секретную фразу для восстановления, чтобы при необходимости восстановить кошелек.", "cancel_backup_ok": "Да, я рискну", "cancel_backup_no": "Нет, создать резервную копию секретной фразы для восстановления", @@ -4172,7 +4238,7 @@ "cta_text": "ЗА МНОЙ НИКТО НЕ НАБЛЮДАЕТ" }, "account_backup_step_4": { - "cancel_backup_title": "Cancel backup", + "cancel_backup_title": "Отменить создание резервной копии", "cancel_backup_message": "Настоятельно рекомендуем сохранить секретную фразу для восстановления, чтобы при необходимости восстановить кошелек.", "cancel_backup_ok": "Да, я рискну", "cancel_backup_no": "Нет, создать резервную копию секретной фразы для восстановления", @@ -4197,16 +4263,16 @@ "modal_button": "ДАЛЕЕ" }, "account_backup_step_6": { - "title": "Security tips", + "title": "Советы по безопасности", "info_text": "MetaMask не сможет восстановить вашу секретную фразу для восстановления, если вы ее потеряете", "tip_1": "Сохраните несколько резервных копий вашей секретной фразы для восстановления", "tip_2": "Сохраните фразу в надежном менеджере паролей, а бумажные резервные копии в надежном месте.", "tip_3": "Никогда не сообщайте никому эту фразу", "disclaimer": "* Секретную фразу для восстановления можно просмотреть в", - "disclaimer_bold": "разделе «Настройки» > «Безопасность и конфиденциальность»", - "cta_text": "ПОНЯТНО!", + "disclaimer_bold": "Настройки > Безопасность и конфиденциальность", + "cta_text": "ПОНЯТНО", "modal_title": "Поздравляем!", - "modal_text": "Вы полностью готовы приступить к делу!", + "modal_text": "Вы полностью готовы приступить к делу.", "modal_button": "ГОТОВО", "copy_seed_phrase": "СКОПИРОВАТЬ секретную фразу для восстановления в БУФЕР ОБМЕНА" }, @@ -4238,7 +4304,7 @@ "steps": "Шаг {{currentStep}} из {{totalSteps}}", "action": "Подтвердите секретную фразу для восстановления", "info": "Выберите пропущенные слова в правильном порядке.", - "complete": "Complete backup", + "complete": "Завершить резервное копирование", "success": "Успех", "error-title": "Не совсем верно", "error-description": "Перепроверьте свою секретную фразу восстановления и повторите попытку.", @@ -4300,7 +4366,7 @@ "withdrawal_completed": "Вывод средств завершен", "unstake_completed": "Отмена стейкинга завершена", "withdrawal_requested": "Запрошен вывод средств", - "stake_ready_to_be_withdrawn": "Доля готова к выводу", + "stake_ready_to_be_withdrawn": "Стейкинг готов к выводу", "swap_completed": "Выполнен своп {{from}} на {{to}}", "swap": "Обмен выполнен", "sent": "Отправлено на {{address}}", @@ -4417,7 +4483,7 @@ "metamask_swap_completed_title": "Обмен выполнен", "metamask_swap_completed_description": "Ваш своп MetaMask успешно выполнен", "nft_sent_title": "NFT отправлен", - "nft_sent_description": "Вы успешно отправили NFT", + "nft_sent_description": "You successfully sent an NFT", "nft_received_title": "NFT получен", "nft_received_description": "Вы получили новый NFT", "rocketpool_stake_completed_title": "Стейкинг завершен", @@ -4517,16 +4583,16 @@ "description_1": "Ссылка запроса готова к отправке!", "description_2": "Отправьте эту ссылку другу, и она попросит его отправить", "copy_to_clipboard": "Копировать в буфер обмена", - "qr_code": "QR-КОД", + "qr_code": "QR-код", "send_link": "Send link", - "request_qr_code": "QR-код запроса платежа", + "request_qr_code": "Payment request QR code", "balance": "Баланс" }, "receive_request": { "title": "Получить", "share_title": "Share address", "share_description": "Отправьте свой адрес по эл. почте или в СМС", - "qr_code_title": "QR-КОД", + "qr_code_title": "QR-код", "qr_code_description": "Сканируемое изображение, позволяющее считать ваш адрес", "request_title": "Запрос", "request_description": "Запросить активы у друзей", @@ -4561,12 +4627,12 @@ "close_current_session": "Закройте текущий сеанс перед началом нового." }, "paymentRequest": { - "title": "ЗАПРОС ПЛАТЕЖА", - "title_complete": "ОПЛАЧЕНО", - "confirm": "ОПЛАТИТЬ", - "cancel": "ОТКЛОНИТЬ", + "title": "Payment request", + "title_complete": "Payment complete", + "confirm": "Pay", + "cancel": "Decline", "is_requesting_you_to_pay": "просит вас заплатить", - "total": "ИТОГО:" + "total": "Итого:" }, "webview_error": { "title": "Что-то пошло не так", @@ -4589,6 +4655,10 @@ "fiat_on_ramp": { "buy_eth": "Купить ETH", "buy": "Купить {{ticker}}", + "on_network": "на {{networkName}}", + "debit_card": "Дебетовая карта", + "continue": "Продолжить", + "powered_by_provider": "Работает на платформе {{provider}}", "purchased_currency": "Куплено {{currency}}", "network_not_supported": "Текущая сеть не поддерживается", "switch_network": "Переключитесь на Мейн-нет", @@ -4676,6 +4746,14 @@ "subtitle_5": "и посмотреть размер платы за газ.", "cta": "Перейти к покупке {{ticker}}." } + }, + "build_quote_settings_modal": { + "title": "Настройки", + "view_order_history": "Посмотреть историю ордеров", + "contact_support": "Связаться с поддержкой", + "log_out": "Выйти из {{provider}}", + "logged_out_success": "Выполнен выход", + "logged_out_error": "Ошибка выхода" } }, "fiat_on_ramp_aggregator": { @@ -4822,6 +4900,7 @@ "title": "Выберите свой регион", "description": "Доступные вам способы оплаты и токены определяются нашими сторонними интеграциями и могут варьироваться в зависимости от вашего региона и поддержки со стороны наших интеграций.", "sell_description": "Способы вывода денег и токены могут быть различными в зависимости от вашего региона.", + "region_variation_notice": "Способы оплаты и доступные токены могут различаться в зависимости от вашего региона и наших поставщиков.", "search_by_country": "Поиск по стране", "search_by_state": "Поиск по стейту", "no_region_results": "Нет подходящих регионов", @@ -4883,11 +4962,11 @@ "sent": "Отправлено!" }, "notifications": { - "purchase_failed_title": "Не удалось купить {{currency}}! Попробуйте еще раз, извините за неудобства!", + "purchase_failed_title": "Не удалось купить {{currency}}. Попробуйте еще раз через мгновение.", "purchase_failed_description": "Проверьте ваш способ оплаты и поддержку карты", "purchase_cancelled_title": "Ваша покупка отменена", "purchase_cancelled_description": "Проверьте ваш способ оплаты и поддержку карты", - "purchase_completed_title": "Ваша покупка {{amount}} {{currency}} успешно выполнена!", + "purchase_completed_title": "Ваша покупка {{amount}} {{currency}} успешно выполнена.", "purchase_completed_description": "Ваши {{currency}} уже доступны", "purchase_pending_title": "Обработка вашей покупки {{currency}}", "purchase_pending_description": "Это должно занять всего несколько минут...", @@ -4896,7 +4975,7 @@ "sale_cancelled_title": "Ордер отменен", "sale_cancelled_description": "Не удалось выполнить ваш ордер.", "sale_completed_title": "Ордер выполнен", - "sale_completed_description": "Ваш ордер успешно выполнен!", + "sale_completed_description": "Ваш ордер успешно выполнен.", "sale_pending_title": "Купля-продажа {{currency}} обрабатывается", "sale_pending_description": "Ваш ордер обрабатывается.", "no_date": "Неизвестно" @@ -4921,7 +5000,7 @@ "start_swapping": "Начать обмен" }, "feature_off_title": "Временно недоступен", - "feature_off_body": "Проводится техобслуживание службы обмена MetaMask. Зайдите позже.", + "feature_off_body": "MetaMask Swaps are undergoing maintenance. Please check back later.", "wrong_network_title": "Обмен недоступен", "wrong_network_body": "Вы можете обменивать токены только в главной сети Ethereum.", "unallowed_asset_title": "Невозможно обменять этот токен", @@ -5002,7 +5081,7 @@ "edit": "Изменить", "quotes_include_fee": "Котировки включают комиссию MetaMask в размере {{fee}}%", "quotes_include_gas_and_metamask_fee": "В стоимость включен газ и комиссия MetaMask {{fee}}%", - "tap_to_swap": "Нажмите для обмена", + "tap_to_swap": "Tap to swap", "swipe_to_swap": "Проведите для обмена", "swipe_to": "Проведите, чтобы", "swap": "Своп", @@ -5302,7 +5381,7 @@ }, "network_information": { "things_to_keep_in_mind": "Что нужно помнить", - "testnet_network": "Тестнет {{type}}", + "testnet_network": "тестнет {{type}}", "first_description": "Нативный токен этой сети — {{ticker}}. Этот токен используется для оплаты газа.", "second_description": "Попытка отправки активов напрямую из одной сети в другую может привести к необратимой потере активов. Следует использовать мост.", "third_description": "Ваши токены могут не отображаться автоматически в вашем кошельке.", @@ -5385,7 +5464,7 @@ "learn_more": "Подробнее" }, "token_allowance": { - "verify_third_party_details": "Подтвердите данные третьей стороны", + "verify_third_party_details": "Verify third-party details", "protect_from_scams": "Чтобы защитить себя от мошенников, найдите минутку, чтобы проверить данные третьей стороны.", "learn_to_verify": "Узнайте, как проверять данные третьей стороны", "spending_cap": "лимит расходования", @@ -5399,7 +5478,7 @@ }, "restore_wallet": { "restore_needed_title": "Требуется восстановление", - "restore_needed_description": "Что-то пошло не так, но не волнуйтесь! Попробуем восстановить ваш кошелек.", + "restore_needed_description": "Something went wrong, but don’t worry! Let’s try to restore your wallet.", "restore_needed_action": "Восстановить кошелек" }, "wallet_restored": { @@ -5598,6 +5677,10 @@ "error_description": "Не удалось установить {{snap}}." }, "earn": { + "claimable_bonus_tooltip": "An annual bonus claimable daily from your wallet.", + "earn_a_percentage_bonus": "Earn a {{percentage}}% bonus", + "claimable_bonus": "Claimable bonus", + "claim_bonus": "Claim bonus", "empty_state_cta": { "heading": "Давайте взаймы {{tokenSymbol}} и зарабатывайте", "body": "Одолжите свой {{tokenSymbol}} с помощью {{protocol}} и зарабатывайте", @@ -5681,21 +5764,36 @@ "fee": "Комиссия" }, "musd_conversion": { - "convert_to_musd": "Convert to mUSD", + "ok": "ОК", + "continue": "Continue", + "convert_and_get_percentage_bonus": "Конвертируйте и получите {{percentage}}%", + "get_a_percentage_musd_bonus": "Получите бонус в размере {{percentage}}% в mUSD", + "convert": "Конвертировать", "toasts": { - "converting": "Converting {{token}} → mUSD", + "converting": "Конвертация {{token}} → mUSD", "eta": "~{{time}}", - "delivered": "Your mUSD has been delivered!", - "failed": "mUSD conversion failed" + "delivered": "Ваши mUSD здесь!", + "failed": "Конвертация mUSD не удалась." }, "education": { - "heading": "Зарабатывайте бонусы с mUSD", - "description": "Convert your USDC, USDT, or DAI for mUSD, MetaMask’s dollar-backed stablecoin.Earn points every time you convert or hold $100.", - "continue_button": "С чего начать" + "heading": "ПОЛУЧИТЕ {{percentage}}% НА\nСТЕЙБЛКОИНЫ", + "description": "Convert your stablecoins to mUSD, MetaMask’s US dollar-backed stablecoin, and receive up to a {{percentage}}% bonus.", + "terms_apply": "Terms apply.", + "primary_button": "Начало работы", + "secondary_button": "Не сейчас" }, - "earn_points_daily": "Earn points daily", - "buy_musd": "Buy mUSD", - "get_musd": "Get mUSD" + "buy_musd": "Купить mUSD", + "get_musd": "Получить mUSD", + "boost_title": "Get {{percentage}}% on your stablecoins", + "boost_description": "Convert your stablecoins to mUSD and receive up to a {{percentage}}% bonus.", + "powered_by_relay": "При поддержке Relay" + }, + "bonus_claim": { + "toasts": { + "claiming": "Your mUSD bonus is processing", + "delivered": "Your mUSD bonus is here!", + "failed": "Bonus claim failed" + } }, "rewards": { "rewards_tag_label": "Награды", @@ -5711,22 +5809,22 @@ "stake": "Stake", "earn": "Заработать", "tron": { - "stake_completed": "Staking completed", - "stake_completed_description": "Your staking transaction has been completed successfully.", - "stake_failed": "Staking failed", + "stake_completed": "Стейкинг завершен", + "stake_completed_description": "Ваша транзакция по стейкингу успешно завершена.", + "stake_failed": "Ошибка стейкинга", "unstake_completed": "Отмена стейкинга завершена", - "unstake_completed_description": "Your unstaking transaction has been completed successfully.", - "unstake_failed": "Unstaking failed", + "unstake_completed_description": "Ваша транзакция по отмене стейкинга успешно завершена.", + "unstake_failed": "Ошибка отмены стейкинга", "bandwidth": "Пропускная способность", "energy": "Энергия", "estimated_annual_reward": "Прим. вознаграждение за год", - "trx_locked_for": "TRX locked for", - "trx_locked_for_minimum_time": "~3 days", - "trx_released_in": "TRX released in", - "trx_released_in_minimum_time": "~14 days", + "trx_locked_for": "TRX заблокированы на", + "trx_locked_for_minimum_time": "~3 дня", + "trx_released_in": "TRX разблокируются через", + "trx_released_in_minimum_time": "~14 дней", "fee": "Комиссия", "errors": { - "insufficient_balance": "You don't have enough resource balance to do this action." + "insufficient_balance": "У вас недостаточно ресурсов для выполнения этого действия." } }, "stake_eth": "Выполнить стейкинг ETH", @@ -5772,12 +5870,19 @@ "learn_more_with_period": "Узнайте подробней." }, "stake_your_trx_cta": { - "title": "Lend Tron and earn", - "description_start": "Stake your Tron and earn ", + "title": "Давайте взаймы Tron и зарабатывайте", + "description_start": "Выполняйте стейкинг Tron и зарабатывайте ", "description_end": " каждый год.", "learn_more": "Узнайте подробней.", "earn_button": "Заработать" }, + "trx_learn_more": { + "title": "Stake TRX and earn", + "stake_any_amount": "Stake any amount of TRX.", + "earn_trx_rewards": "Зарабатывайте вознаграждения в TRX.", + "earn_trx_rewards_description": "Начните зарабатывать сразу после начала стейкинга. Вознаграждения начисляются автоматически.", + "flexible_unstaking_description": "Unstake anytime. Unstaking takes 14 days to process." + }, "day": { "zero": "", "one": "день", @@ -5981,7 +6086,7 @@ "switch_account_type": "Обновление счета", "approve": "Одобрить запрос", "perps_deposit": "Внести средства", - "predict_deposit": "Добавить средства в прогноз", + "predict_deposit": "Внести средства для прогнозирования", "predict_withdraw": "Вывести средства" }, "sub_title": { @@ -6002,14 +6107,15 @@ "transaction_fee": "Мы обменяем ваши токены на USDC в HyperCore, сети, используемой перпами. Поставщики услуг свопов могут взимать комиссию, но MetaMask не взимает ее." }, "predict_deposit": { - "transaction_fee": "Мы обменяем ваши токены на USDC.e в Polygon, сети, используемой функцией «Прогнозирование». Поставщики услуг свопов могут взимать комиссию, но MetaMask не взимает ее." + "transaction_fee": "Мы обменяем ваши токены на USDC.e в Polygon, сети, используемой функцией «Прогнозы». Поставщики услуг свопов могут взимать комиссию, но MetaMask не взимает ее." }, "musd_conversion": { - "transaction_fee": "mUSD conversion fees include network costs and may include provider fees." + "transaction_fee": "В стоимость конвертации mUSD входят расходы сети, а также могут входить сборы поставщика." }, "title": { "transaction_fee": "Комиссии" - } + }, + "network_fee": "Комиссии сети зависят от загруженности сети и сложности транзакции." }, "spending_cap": "Лимит расходов", "withdraw": "Вывести", @@ -6078,7 +6184,7 @@ }, "includes_transaction": "Включает {{transactionCount}} транзакции(-ий)", "useSmartAccount": "Использовать смарт-счет", - "successful": "Успех!", + "successful": "Успех", "success_message": "Ваш счет будет обновлен до смарт-счета при следующей транзакции." }, "edit_spending_cap_modal": { @@ -6086,9 +6192,9 @@ "cancel": "Отмена", "description": "Введите сумму, которую вы считаете приемлемой для расходов от вашего имени.", "invalid_number_error": "Лимит расходов должен быть числом", - "no_empty_error": "Лимит расходов не может быть пустым", - "no_extra_decimals_error": "Лимит расходов не может содержать больше знаков после запятой, чем токен", - "no_zero_error": "Лимит расходов не может быть равен 0", + "no_empty_error": "Spending cap can't be empty", + "no_extra_decimals_error": "Spending cap can't have more decimals than the token", + "no_zero_error": "Spending cap can't be 0", "no_zero_error_decrease_allowance": "Лимит расходов 0 не влияет на метод «decreaseAllowance»", "no_zero_error_increase_allowance": "Лимит расходов 0 не влияет на метод «increaseAllowance»", "save": "Сохранить", @@ -6119,7 +6225,7 @@ "edit_amount_done": "Продолжить", "deposit_edit_amount_done": "Внести средства", "deposit_edit_amount_predict_withdraw": "Вывести средства", - "deposit_edit_amount_musd_conversion": "Convert to mUSD" + "deposit_edit_amount_musd_conversion": "Конвертировать в mUSD" }, "change_in_simulation_modal": { "title": "Результаты изменились", @@ -6144,6 +6250,8 @@ "confirm_swap": "Обменять", "terms_and_conditions": "Положения и условия", "select_token": "Выберите токен", + "no_tokens_found": "Токены не найдены", + "no_tokens_found_description": "We couldn't find any tokens with this name. Try a different search.", "select_network": "Выбрать сеть", "all_networks": "Все сети", "num_networks": "{{numNetworks}} сети(-ей)", @@ -6151,6 +6259,7 @@ "select_all_networks": "Выбрать все", "deselect_all_networks": "Выбрать все", "see_all": "Смотреть все", + "all": "Все", "apply": "Применить", "slippage": "Проскальзывание", "slippage_info": "Если цена меняется между моментом размещения и подтверждения вашего ордера, это называется «проскальзывание». Ваш своп будет автоматически отменен, если проскальзывание превысит значение, которое вы установили здесь .", @@ -6191,9 +6300,9 @@ "title": "Мост", "submitting_transaction": "Выполняется отправка", "fetching_quote": "Получение котировки", - "fee_disclaimer": "Включает {{feePercentage}}% комиссии MM.", + "fee_disclaimer": "Includes {{feePercentage}}% MetaMask fee.", "no_mm_fee": "Без комиссии MM", - "no_mm_fee_disclaimer": "Без комиссии MM за обмен на {{destTokenSymbol}}.", + "no_mm_fee_disclaimer": "No MetaMask fee swapping into {{destTokenSymbol}}.", "hardware_wallet_not_supported": "Аппаратные кошельки пока не поддерживаются. Используйте горячий кошелек, чтобы продолжить.", "hardware_wallet_not_supported_solana": "Аппаратные кошельки пока не поддерживаются для Solana. Используйте горячий кошелек, чтобы продолжить.", "price_impact_info_title": "Влияние на цену", @@ -6208,15 +6317,7 @@ "approval_tooltip_content": "Вы разрешаете доступ к указанной сумме: {{amount}} {{symbol}}. Контракт не будет использовать дополнительные средства.", "minimum_received": "Minimum received", "minimum_received_tooltip_title": "Minimum received", - "minimum_received_tooltip_content": "Минимальная сумма, которую вы получите, если цена изменится во время обработки вашей транзакции, рассчитывается исходя из вашей допустимой задержки. Это оценка, предоставленная нашими поставщиками ликвидности. Окончательные суммы могут отличаться.", - "verified_token": "Проверенный токен", - "price": "Цена", - "percent_change": "Процентное изменение", - "volume": "Объем", - "market_cap_fdv": "Рыночная капитализация (FDV)", - "listed_on": "Размещено на", - "centralized_exchanges": "Централизованные биржи", - "contract_address": "Адрес контракта" + "minimum_received_tooltip_content": "Минимальная сумма, которую вы получите, если цена изменится во время обработки вашей транзакции, рассчитывается исходя из вашей допустимой задержки. Это оценка, предоставленная нашими поставщиками ликвидности. Окончательные суммы могут отличаться." }, "quote_expired_modal": { "title": "Доступны новые котировки", @@ -6290,7 +6391,7 @@ "title": "Восстановление кошелька", "login_with_social": "Войти через социальные сети", "setup": "Настроить", - "secret_recovery_phrase": "Секретная фраза для восстановления {{num}}", + "secret_recovery_phrase": "Secret Recovery Phrase {{num}}", "back_up": "Создать резервную копию", "reveal": "Показать", "social_recovery_title": "ВОССТАНОВЛЕНИЕ {{authConnection}}", @@ -6349,7 +6450,7 @@ "section_1_title": "Что такое мультичейновые счета?", "section_1_description": "Один счет, адреса во всех сетях, поддерживаемых MetaMask. Теперь вы можете использовать Ethereum, Solana и другие криптовалюты, не переключая счета.", "section_2_title": "Тот же адрес, больше сетей", - "section_2_description": "Мы сгруппировали ваши счета, так что продолжайте использовать MetaMask, как и раньше. Ваши средства в безопасности, и их сумма не изменилась", + "section_2_description": "Мы сгруппировали ваши счета, так что продолжайте использовать MetaMask, как и раньше. Ваши средства в безопасности, и их сумма не изменилась.", "view_accounts_button": "Просмотр счетов", "learn_more_button": "Подробнее", "setting_up_accounts": "Настройка ваших счетов" @@ -6511,8 +6612,10 @@ }, "card_onboarding": { "title": "Тратьте\nи\nзарабатывайте", - "description": "Карта MetaMask — это быстрый и простой способ тратить криптовалюту как наличные и получать бонусы.", + "description": "Карта MetaMask — это быстрый и простой способ тратить криптовалюту и зарабатывать кэшбек до 3%.", "apply_now_button": "Подать заявку сейчас", + "login_button": "Войти", + "not_now_button": "Не сейчас", "sign_up": { "title": "Давайте начнём", "description": "Создайте счет своей карты MetaMask, предоставленной компанией Crypto Life. Это будет другой счет, отдельный от вашего счета MetaMask.", @@ -6540,6 +6643,7 @@ "phone_number_label": "Укажите номер телефона", "country_area_code_label": "Телефонный код страны", "invalid_phone_number": "Неверный номер телефона", + "invalid_us_phone_number": "Укажите действительный телефонный номер США (10 цифр), чтобы продолжить,", "legal_terms": "Продолжая, вы соглашаетесь на получение SMS для подтверждения вашего номера телефона." }, "confirm_phone_number": { @@ -6576,8 +6680,8 @@ "terms": "Одобрение обычно занимает около 12 часов. Мы уведомим вас, когда будет принято решение." }, "verifying_veriff_kyc": { - "title": "Проверка вашей личности...", - "description": "Подождите, пока мы проверяем вашу личность.", + "title": "Ожидается одобрение", + "description": "Наш партнер должен подтвердить вашу личность, чтобы одобрить вашу заявку.", "helper_text": "Обычно это занимает несколько секунд. Не закрывайте приложение." }, "verifying_registration": { @@ -6614,7 +6718,7 @@ }, "physical_address": { "title": "Введите свой адрес", - "description": "Введите свой домашний адрес. В случае одобрения мы вышлем вам физическую карту по этому адресу.", + "description": "Введите ваш текущий домашний адрес. Мы будем использовать его для проверки.", "address_line_1_label": "Строка адреса 1", "address_line_2_label": "Строка адреса 2", "city_label": "Город", @@ -6622,7 +6726,7 @@ "zip_code_label": "Почтовый индекс", "country_label": "Страна", "electronic_consent_1": "Я даю согласие согласно Закону об электронной подписи и раскрытии информации на получение всех сообщений в электронном виде. ", - "electronic_consent_2": "View document(PDF)" + "electronic_consent_2": "Смотреть документ (PDF)" }, "mailing_address": { "title": "Почтовый адрес", @@ -6668,22 +6772,24 @@ } }, "card_home": { + "title": "Card", + "available_balance": "Доступный баланс", "error_title": "Невозможно получить данные", "error_description": "Похоже, возникла проблема, препятствующая просмотру содержимого этой страницы. Проверьте подключение к Интернету или попробуйте обновить страницу.", "try_again": "Повторить попытку", - "limited_spending_warning": "Ваши фактические расходы могут быть ограничены. Чтобы изменить лимит, перейдите в раздел «{{manageCard}}»", + "limited_spending_warning": "Your actual spending ability may be limited. To adjust your limit, go to ", "add_funds": "Внести средства", "change_asset": "Изменить актив", "enable_card_button_label": "Включить карту", "enable_assets_button_label": "Активировать активы", "spending_limit_warning": "Вы почти достигли лимита расходов. Обновите, чтобы избежать отказов.", "logout": "Выйти", - "logout_description": "Выйдите из своего счета Карты MetaMask", "logout_confirmation_title": "Выйти из карты?", "logout_confirmation_message": "Вы уверены, что хотите выйти из своего счета Карты MetaMask?", "logout_confirmation_cancel": "Отмена", "logout_confirmation_confirm": "Выйти", "enable_card_error": "Не удалось активировать карту. Попробуйте позже.", + "view_card_details_error": "Unable to load card details. Please try again.", "warnings": { "close_spending_limit": { "title": "Вы приближаетесь к своему лимиту расходов", @@ -6706,6 +6812,16 @@ "blocked": { "title": "Ваша карта заблокирована", "description": "Свяжитесь со службой поддержки для ее разблокировки" + }, + "kyc_pending": { + "title": "Выполняется проверка", + "description": "Your identity verification is being reviewed. This typically takes less than 12 hours." + } + }, + "messages": { + "card_provisioning": { + "title": "Card being created", + "description": "Your card is being created. This may take a few moments." } }, "kyc_status": { @@ -6729,33 +6845,46 @@ "ok_button": "ОК" }, "manage_card_options": { - "manage_spending_limit": "Управление лимитом расходов", + "view_card_details": "View card details", + "hide_card_details": "Hide card details", + "view_card_details_description": "Card number, expiration and CVV", + "manage_spending_limit": "Manage limit", "manage_spending_limit_description_restricted": "Активирован лимит расходов", "manage_spending_limit_description_full": "Активирован полный доступ", "manage_card": "Управление картой", - "advanced_card_management_description": "Просматривайте реквизиты карты, транзакции и многое другое", + "advanced_card_management_description": "See activity, cashback, freeze card, and more", "travel_title": "Путешествия MetaMask", - "travel_description": "Бронируйте отели со скидками до 60% по сравнению с Expedia", - "card_tos_title": "Условия использования карты", - "card_tos_description": "Ознакомьтесь с условиями эмитента карты" + "travel_description": "Book hotels with up to 70% discounts", + "card_tos_title": "Terms and conditions" } }, "card_spending_limit": { "title_change_token": "Измените токен и сеть", "title_enable_token": "Включить токен", + "title_onboarding": "Включить расходование", + "setup_title": "Set up your card", + "setup_description": "Select the token you'd like to use and set a limit for how much you can spend.", + "asset_label": "Актив", + "limit_label": "Лимит", + "other_token": "Other", "full_access_title": "Полный доступ", - "full_access_description": "Ваша карта может использовать ваши средства автоматически, без необходимости каждый раз запрашивать подтверждение.", - "restricted_limit_title": "Ограниченные расходы", - "restricted_limit_description": "Всякий раз, когда вы захотите увеличить лимит, вам придется возвращаться и платить комиссию сети.", + "full_access_description": "Your card can use your funds automatically without asking for approval each time.", + "restricted_limit_title": "Лимит расходов", + "restricted_limit_description": "Вы можете тратить средства только в пределах этого лимита. За каждое обновление лимита будет взиматься комиссия сети.", "edit_limit": "Изменить лимит", "confirm_new_limit": "Подтвердить", "cancel": "Отмена", + "skip": "Пока пропустить", "set_new_limit": "Установить лимит", "dismiss": "Отклонить", "update_success": "Лимит расходов успешно обновлен", "update_error": "Не удалось обновить лимит расходов", "solana_not_supported": "Включить токены Solana на card.metamask.io", - "select_token": "Выбрать токен" + "select_token": "Выбрать токен", + "loading": "Загрузка доступных токенов…", + "load_error": "Не удалось загрузить токены. Попробуйте еще раз.", + "retry": "Повторить попытку", + "on_linea": "на Linea" }, "change_asset": { "title": "Измените токен и сеть", @@ -6793,6 +6922,7 @@ "signup_button": "Зарегистрироваться", "errors": { "invalid_credentials": "Неверные данные для входа", + "invalid_otp_code": "Неверный код, повторите попытку", "unknown_error": "Неизвестная ошибка, попробуйте еще раз", "email_required": "Нужно указать адрес эл. почты", "password_required": "Нужно ввести пароль", @@ -6839,8 +6969,8 @@ }, "rewards": { "auth_fail_title": "Неизвестная ошибка.", - "auth_fail_description": "При аутентификации этого счета в программе вознаграждений произошла неизвестная ошибка. Повторите попытку позже.", - "failed_to_authenticate": "Не удалось аутентифицироваться в программе вознаграждений", + "auth_fail_description": "При аутентификации этого счета в Бонусной программе MetaMask произошла неизвестная ошибка. Повторите попытку позже.", + "failed_to_authenticate": "Не удалось аутентифицироваться в Бонусной программе MetaMask", "not_implemented": "Скоро появятся", "not_implemented_season_summary": "Краткий обзор сезона будет опубликован в ближайшее время", "optin_error": { @@ -6867,6 +6997,10 @@ "error_fetching_description": "Проверьте соединение и повторите попытку.", "retry_button": "Повтор" }, + "linea_tokens": { + "default_title": "$LINEA", + "title_earned": "Вы заработали {{amount}} $LINEA" + }, "upcoming_rewards_error": { "error_fetching_title": "Не удалось загрузить вознаграждения", "error_fetching_description": "Проверьте соединение и повторите попытку.", @@ -6898,6 +7032,15 @@ "claim_reward_error": { "title": "Не удалось получить вознаграждение" }, + "metal_card_claim": { + "title": "Используйте свой бонус", + "description": "Карта MetaMask Metal Card предоставляется при соблюдении определенных условий и доступна не во всех регионах. Если вы не соответствуете условиям, вместо карты вы получите эксклюзивный премиальный сувенир.", + "contact_info": "Оставьте свои контактные данные, и вы получите ответ в течение 2 недель от @MidwitMilhouse в Telegram или по адресу christian.montoya@consensys.net.", + "email_label": "Эл. почта", + "email_validation_error": "Введите действительный адрес эл. почты", + "telegram_label": "Ник в Telegram", + "telegram_placeholder": "Необязательно" + }, "accounts_opt_in_state_error": { "error_fetching_title": "Не удалось загрузить счета", "error_fetching_description": "Проверьте соединение и повторите попытку.", @@ -6979,7 +7122,7 @@ "gtm_title": "Награды здесь", "gtm_description": "Зарабатывайте баллы за активность.\nПроходите уровни, чтобы разблокировать награды.", "gtm_confirm": "С чего начать", - "intro_title": "Сезон 1\nуже идет", + "intro_title": "Сезон 1 \nуже идет", "intro_description": "Зарабатывайте баллы за активность.\nПроходите уровни, чтобы разблокировать награды.", "intro_confirm": "Получите 250 баллов", "intro_confirm_geo_loading": "Проверка региона...", @@ -7052,12 +7195,12 @@ "dashboard_modal_info": { "active_account": { "title": "Не пропустите", - "description": "Добавьте свой счет, чтобы начать зарабатывать баллы за свою активность.", + "description": "Add your account to Rewards.", "confirm": "Добавить аккаунт" }, "multiple_unlinked_accounts": { - "title": "Начните зарабатывать баллы", - "description": "Добавьте свои счета, чтобы вы могли мгновенно отслеживать вознаграждения.", + "title": "Не пропустите", + "description": "Add your accounts to Rewards.", "confirm": "Добавить счета" }, "account_not_supported": { @@ -7110,10 +7253,10 @@ } }, "predict": { - "title": "Рынки прогнозов", + "title": "Прогнозы", "description": "20 баллов за прогноз 10 $", "sheet": { - "title": "Рынки прогнозов", + "title": "Прогнозы", "points": "20 баллов за 10 $", "description": "Зарабатывайте баллы за каждые 10 $, потраченные на торговлю.", "cta_label": "Обзор рынков" @@ -7191,6 +7334,19 @@ "time_left": "осталось", "expired": "Просрочено" }, + "end_of_season_rewards": { + "confirm_label_default": "Подтвердить", + "confirm_label_access": "Доступ", + "redeem_success_title": "Бонус использован", + "metal_card_claim_success": "Контактная информация подтверждена", + "linea_tokens_claim_success": "Адрес подтвержден", + "arriving_soon": "Скоро появятся", + "check_back_soon": "Зайдите снова в ближайшее время, чтобы получить", + "redeem_failure_title": "Не удалось использовать", + "redeem_failure_description": "Повторите попытку позже.", + "reward_details": "Сведения о бонусе", + "select_account_description": "Выберите счет, на который вы хотите получить этот бонус. Токены будут начислены в течение двух недель." + }, "animation": { "could_not_load": "Ошибка загрузки" } @@ -7257,13 +7413,13 @@ "still_connecting_network": "Все еще выполняется подключение к {{networkName}}...", "unable_to_connect_network": "Не удалось подключиться к {{networkName}}.", "update_rpc": "Обновить RPC", + "switch_to_metamask_default_rpc": "Switch to MetaMask default RPC", "check_network_connectivity": "Проверьте подключение к сети.", - "check_network_connectivity_or": "Проверьте подключение к сети или" + "check_network_connectivity_or": "Проверьте подключение к сети или", + "updated_to_metamask_default": "Updated to MetaMask default" }, "trending": { "title": "Explore", - "view_all": "View all", - "tokens": "Токены", "trending_tokens": "Trending tokens", "price_change": "Price change", "all_networks": "Все сети", @@ -7295,6 +7451,10 @@ "title": "Trending tokens is not available", "description": "We can't fetch this page right now", "try_again": "Повторить попытку" + }, + "empty_search_result_state": { + "title": "Токены не найдены", + "description": "We were not able to find this token" } }, "ota_update_modal": { diff --git a/locales/languages/tl.json b/locales/languages/tl.json index 171aeb64bc89..367827f4d8e3 100644 --- a/locales/languages/tl.json +++ b/locales/languages/tl.json @@ -193,11 +193,10 @@ "connector": "sa" }, "autocomplete": { - "placeholder": "Maghanap ayon sa token, site o address", + "placeholder": "Maghanap ayon sa site o address", "recents": "Mga Kamakailan", "favorites": "Mga Paborito", - "sites": "Mga Site", - "tokens": "Mga Token" + "sites": "Mga Site" }, "navigation": { "back": "Bumalik", @@ -306,7 +305,7 @@ "get_started": "Magsimula" }, "onboarding_wizard": { - "skip_tutorial": "Skip tutorial", + "skip_tutorial": "Laktawan ang pagtuturo", "coachmark": { "action_back": "Huwag na lang", "action_next": "Mag-tour", @@ -330,12 +329,12 @@ "content3": "ngayon para i-edit ang pangalan ng account." }, "step4": { - "title": "Main menu", - "content1": "Maa-access mo ang kasaysayan ng Transaksyon, Mga Setting, at Suporta mula sa menu na ito.", + "title": "Pangunahing menu", + "content1": "Maa-access mo ang history ng transaction, mga setting, at suporta mula sa menu na ito.", "content2": "Marami kang magagawa sa iyong mga account at maa-access mo ang mga setting ng MetaMask." }, "step5": { - "title": "I-explore ang Browser", + "title": "Tuklasin ang browser", "content1": "Puwede mong i-explore ang web3 gamit ang browser" }, "step6": { @@ -596,9 +595,9 @@ "transaction_activity": "Aktibidad", "request_feature": "Humiling ng Feature", "submit_feedback_message": "Piliin ang uri ng feedback na ipapadala.", - "submit_bug": "Bug report", + "submit_bug": "Ulat ng bug", "submit_general_feedback": "Pangkalahatan", - "share_address": "Share my public address", + "share_address": "Ibahagi sa aking pampublikong address", "view_in_etherscan": "Tingnan sa Etherscan", "view_in": "Tingnan sa", "browser": "Browser", @@ -612,12 +611,13 @@ "lock_cancel": "HINDI", "feedback": "Feedback", "metamask_support": "Suporta ng MetaMask", - "public_address": "Public address" + "public_address": "Pampublikong address" }, "send": { "available": "available", "invalid_value": "Di-wastong value", "insufficient_funds": "Hindi sapat ang pondo", + "insufficient_balance_to_cover_fee": "Insufficient balance to cover fees", "continue": "Magpatuloy", "unit": "unit", "units": "(na) unit", @@ -643,8 +643,8 @@ "no_tokens_available": "Walang available na token", "sign": "Lumagda", "network_not_found_title": "Hindi nahanap ang network", - "network_not_found_description": "Hindi nahanap ang network na may id ng chain na {{chain_id}} sa iyong wallet. Pakidagdag muna ang network.", - "network_missing_id": "Nawawala ang id ng chain.", + "network_not_found_description": "Network with chain ID {{chain_id}} not found in your wallet. Please add the network first.", + "network_missing_id": "Missing chain ID.", "search_tokens": "Maghanap ng mga token", "search_tokens_and_nfts": "Maghanap ng mga token at NFT", "tokens": "Mga Token", @@ -675,13 +675,13 @@ "limitError": "Nabigong makita ang limit ng deposito mo. Pakisubukan ulit mamaya." }, "token_modal": { - "select_a_token": "Pumili ng Token", + "select_a_token": "Pumili ng token", "select_token": "Pumili ng token", "search_by_name_or_address": "Maghanap ng token ayon sa pangalan o address", "no_tokens_found": "Walang katugmang mga token \"{{searchString}}\"", "unsupported_token_title": "Hindi available", - "unsupported_token_description": "This token may not be available in your region or supported by any local payment providers", - "error_loading_tokens": "Unable to load tokens. Please try again later." + "unsupported_token_description": "Maaaring hindi available ang token na ito sa iyong rehiyon o hindi sinusuportahan ng anumang provider sa lokal na pagbabayad", + "error_loading_tokens": "Hindi makapag-load ng mga token. Pakisubukan muli mamaya." }, "networks_filter_bar": { "all_networks": "Lahat ng network" @@ -696,12 +696,12 @@ "title": "Mga Setting", "view_order_history": "Tingnan ang history ng order", "contact_support": "Kontakin ang suporta", - "log_out": "Log out of Transak", + "log_out": "Mag-log out sa Transak", "logged_out_success": "Matagumpay na na-log out", "error_sdk_not_initialized": "Hindi nasimulan ang SDK", "logged_out_error": "Error sa pag-log out", - "more_ways_to_buy": "More ways to buy", - "more_ways_to_buy_description": "Switch to the classic version" + "more_ways_to_buy": "Mas maraming paraan para bumili", + "more_ways_to_buy_description": "Lumipat sa klasikong bersyon" }, "region_modal": { "select_a_region": "Pumili ng rehiyon", @@ -714,7 +714,7 @@ "no_state_results": "Walang tumugmang estado sa \"{{searchString}}\"" }, "payment_modal": { - "select_a_payment_method": "Select a payment method" + "select_a_payment_method": "Pumili ng paraan ng pagbabayad" }, "payment_duration": { "instant": "Instant", @@ -805,7 +805,7 @@ "button": "Sumang-ayon at magpatuloy" }, "additional_verification": { - "title": "Additional verification", + "title": "Karagdagang pag-verify", "paragraph_1": "Para sa mas malalaking deposito, kakailanganin mo ng wastong ID (gaya ng lisensya sa pagmamaneho) at real-time na selfie.", "paragraph_2": "Para makumpleto ang pag-verify mo, kakailanganin mong pahintulutan ang access sa camera mo.", "button": "Magpatuloy" @@ -832,7 +832,7 @@ "dob_invalid": "Maglagay ng wastong petsa ng kapanganakan", "ssn_required": "Kailangan ang numero ng social security", "unexpected_error": "Nagkaroon ng hindi inaasahang error. Subukang muli.", - "phone_already_registered": "This phone number is already in use by {{email}}. Log in using this email to continue.", + "phone_already_registered": "Ang numero ng telepono na ito ay ginagamit na ng {{email}}. Mag-log in gamit ang email na ito para magpatuloy.", "login_with_email": "Mag-login gamit ang email" }, "enter_address": { @@ -844,7 +844,7 @@ "address_line_2": "Linya ng adres 2 (opsyonal)", "state": "Estado/Rehiyon", "city": "Lungsod", - "postal_code": "Postal/zip code", + "postal_code": "Postal code", "country": "Bansa", "select_state": "Pumili ng estado", "address_line_1_required": "Kinakailangan ang linya 1 ng address", @@ -854,7 +854,7 @@ "city_invalid": "Maglagay ng wastong lungsod", "state_required": "Kinakailangan ang Estado/Rehiyon", "state_invalid": "Maglagay ng wastong estado", - "postal_code_required": "Postal/zip code is required", + "postal_code_required": "Kinakailangan ang postal code", "postal_code_invalid": "Maglagay ng wastong postal code", "unexpected_error": "Hindi inaasahang error." }, @@ -903,7 +903,7 @@ "cancel_order_button": "Kanselahin ang order" }, "order_details": { - "title": "Deposit order", + "title": "Order na deposito", "error_title": "Nagkaroon ng error sa iyong order ng pagdeposito", "error_message": "Nagkaroon ng hindi inaasahang error." }, @@ -946,7 +946,7 @@ }, "error_view": { "title": "Nagkaroon ng error", - "description": "Nagkaroon ng error sa pagproseso ng iyong deposito. Makipag-ugnayan sa suporta kung magpapatuloy ang problema.", + "description": "Nagkaroon ng error sa pagproseso ng iyong deposito. Makipag-ugnayan sa suporta kung magpatuloy ang problema.", "try_again": "Subukang muli" }, "errors": { @@ -955,30 +955,34 @@ "fetch_payment_methods": "Nagkaproblema sa pagkuha ng mga paraan ng pagbabayad.", "fetch_user_details": "Nagkaproblema sa pagkuha ng mga detalye ng user.", "try_again": "Subukang muli", - "error_details_title": "Error details", + "error_details_title": "Mga detalye ng error", "see_more": "Tingnan pa" } }, "perps": { - "basic_functionality_disabled_title": "Perps is not available", + "basic_functionality_disabled_title": "Hindi available ang mga perp", "title": "Perps", - "perps_trading": "Perps Trading", + "perps_trading": "Perps trading", "perp_account_balance": "Balanse ng Perp account", - "manage_balance": "Pamahalaan ang Balanse", - "total_balance": "Kabuuang Balanse", + "manage_balance": "Pamahalaan ang balanse", + "total_balance": "Kabuuang balanse", "available_balance": "Available na balanse", - "margin_used": "Nagamit na Margin", + "margin_used": "Nagamit na margin", "gtm_content": { "title": "NARITO NA ANG PERPS", "title_description": "Long o short na may hanggang 40x leverage. Pondohan ang iyong account sa isang click.", "not_now": "Hindi sa ngayon", "try_now": "Magsimula" }, + "discovery_banner": { + "title": "Mag-trade ng {{symbol}} perp", + "subtitle": "I-multiply ang iyong P&L na hanggang {{leverage}}" + }, "today": "Ngayong araw", "yesterday": "Kahapon", - "unrealized_pnl": "Unrealized PnL", + "unrealized_pnl": "Unrealized P&L", "withdraw": "Mag-withdraw", - "refresh_balance": "I-refresh ang Balanse", + "refresh_balance": "I-refresh ang balanse", "add_funds": "Magdagdag ng pondo", "trade_perps": "Mag-trade ng perps", "trade_perps_description": "Gumamit ng perps para mag-trade sa future price ng asset. Magdagdag ng mga pondo sa iyong perps account para makapagsimula", @@ -1047,7 +1051,7 @@ "preparing": "Inihahanda ang deposito...", "swapping": "Isina-swap ang {{token}} sa USDC", "bridging": "Pag-bridge sa Hyperliquid", - "depositing": "Pagdeposito sa perps account", + "depositing": "Pagdeposito sa Perps account", "depositing_direct": "Inililipat ang USDC nang direkta sa iyong HyperLiquid account..." }, "step_descriptions": { @@ -1138,7 +1142,7 @@ "trigger_price": "Trigger price", "liquidation_price": "Liquidation price", "fees": "Mga Bayarin", - "estimated_points": "Tinatayang mga Point", + "estimated_points": "Tinatayang mga point", "market": "Market", "limit": "Limit", "open_orders": "Mga Order", @@ -1199,7 +1203,7 @@ "short": "I-short ang {{asset}}" }, "tpsl_modal": { - "title": "Take profit & Stop loss", + "title": "Take profit at stop loss", "save": "I-save", "current_price": "Kasalukuyang presyo: {{price}}", "on": "I-ON", @@ -1306,8 +1310,8 @@ "cancel": "Kanselahin", "margin": "Margin", "includes_pnl": "kasama na ang P&L", - "pnl": "PnL", - "estimated_pnl": "Tinatayang PnL", + "pnl": "P&L", + "estimated_pnl": "Tinatayang P&L", "fees": "Mga Bayarin", "receive": "Makakatanggap ka ng", "you_receive": "Makakatanggap ka ng", @@ -1414,6 +1418,7 @@ "failedToEstablishAllMids": "Hindi nakapag-subscribe sa global allMids", "failedToEstablishMarketData": "Hindi nakapag-subscribe sa market data para sa {{symbol}}", "failed_to_toggle_network": "Hindi na-toggle ang network", + "failed_to_switch_provider": "Nabigong lumipat ng provider", "noAccountSelected": "Walang piniling account", "unsupportedMethod": "Hindi sinusuportahang paraan: {{method}}", "invalidAddressFormat": "Di-wastong format ng address: {{address}}", @@ -1452,6 +1457,24 @@ "orderLeverageReductionFailed": "Hindi mo mababawasan ang iyong leverage", "insufficientLiquidity": "Hindi sapat ang liquidity para ipatupad ang order. Subukang gamitin ang limit order o subukang muli sa ilang sandali.", "connectionTimeout": "Nag-time out ang koneksyon. Suriin ang network mo at subukan ulit.", + "clientReinitializing": "Muling sinisimulan ang serbisyo. Maghintay sandali at subukang muli.", + "transferFailed": "Hindi makapag-transfer ng mga pondo. Pakisubukan muli.", + "swapFailed": "Hindi makapag-swap ng mga token. Pakisubukan muli.", + "spotPairNotFound": "Hindi available ang trading pair sa pagkakataong ito.", + "priceUnavailable": "Hindi available ang data ng presyo. Paki-refresh at subukang muli.", + "batchCancelFailed": "Hindi maaaring kanselahin ang ilan sa mga order. Pakisubukan muli.", + "batchCloseFailed": "Hindi maaaring isara ang ilan sa mga posisyon. Pakisubukan muli.", + "insufficientMargin": "Hindi sapat ang margin para ipatupad ang trade na ito. Isaalang-alang ang pagdadagdag ng mas maraming pondo o bawasan ang laki ng posisyon mo.", + "reduceOnlyViolation": "Dadagdagan ng order na ito ang posisyon mo. Tanging mga order na reduce-only ang pinapayagan.", + "positionWouldFlip": "Ipi-flip ng order na ito ang direksyon ng posisyon mo. Isara muna ang umiiral mo na posisyon.", + "marginAdjustmentFailed": "Hindi maisaayos ang margin. Pakisubukan muli.", + "tpslUpdateFailed": "Hindi ma-update ang take profit/stop loss. Pakisubukan muli.", + "orderRejected": "Tinanggihan ang order. Suriin ang mga parameter mo at subukang muli.", + "slippageExceeded": "Masyadong gumalaw ang presyo. Subukang gamitin ang limit order o dagdagan ang slippage tolerance.", + "rateLimitExceeded": "Masyado nang maraming kahilingan. Maghintay sandali at subukang muli.", + "serviceUnavailable": "Pansamantalang hindi available ang serbisyo. Subukan ulit sa ibang pagkakataon.", + "networkErrorSimple": "Nagkaroon ng error sa network. Suriin ang koneksyon mo at subukang muli.", + "insufficientBalance": "Hindi sapat ang balanse para kumpletuhin ang operasyon ito. Suriin ang mga available mo na pondo.", "connectionFailed": { "title": "Hindi makakonekta sa perps", "description": "Nagsisikap kaming maibalik ito online sa lalong madaling panahon.", @@ -1489,7 +1512,7 @@ "details_title": "Mga detalye", "entry_price": "Entry price", "funding_cost": "Pagpopondo", - "liquidation_price": "Liq. Price", + "liquidation_price": "Liq. price", "take_profit": "Take profit", "stop_loss": "Stop loss", "margin": "Margin", @@ -1521,7 +1544,7 @@ "total_balance": "Kabuuang balanse", "available_balance": "Available na balanse", "margin_used": "Nagamit na margin", - "total_unrealized_pnl": "Kabuuang Unrealized na P&L", + "total_unrealized_pnl": "Kabuuang unrealized P&L", "unrealized_pnl": "Unrealized P&L" }, "tpsl": { @@ -1654,7 +1677,7 @@ }, "tp_sl": { "title": "Take profit at stop loss", - "content": "Awtomatikong isasara ng Take Profit (TP) ang iyong posisyon kapag naabot mo na ang iyong target na kita. Nililimitahan ng Stop Loss (SL) ang iyong mga pagkalugi sa pamamagitan ng pagsasara ng iyong posisyon kapag gumalaw ang presyo laban sa iyo." + "content": "Awtomatikong isasara ng Take profit (TP) ang iyong posisyon kapag naabot mo na ang iyong target na kita. Nililimitahan ng Stop loss (SL) ang iyong mga pagkalugi sa pamamagitan ng pagsasara ng iyong posisyon kapag gumalaw ang presyo laban sa iyo." }, "close_position_you_receive": { "title": "Natanggap na halaga", @@ -1679,12 +1702,12 @@ "market_hours": { "title": "Mga oras ng market", "closes_in": "Magsasara pagkalipas ng {{time}}", - "content": "Nagti-trade ka sa regular na mga oras ng market (9:30 am hanggang 4:00 pm ET). Kapag sarado ang mga market, may panganib para sa mas malalawak na spread, mga paggalaw ng presyo, at mas matataas na rate sa pagpopondo." + "content": "Nagti-trade ka sa regular na mga oras ng market (9:30 am hanggang 4 pm ET). Kapag sarado ang mga market, may panganib para sa mas malalawak na spread, mga paggalaw ng presyo, at mas matataas na rate sa pagpopondo." }, "after_hours_trading": { "title": "Pag-trade pagkatapos ng mga oras ng market", "reopens_in": "Muling magbubukas pagkalipas ng {{time}}", - "content": "Nagti-trade ka sa labas ng regular na mga oras ng market (9:30 am hanggang 4:00 pm ET). Kapag sarado ang mga market, may panganib para sa mas malalawak na spread, mga paggalaw ng presyo, at mas matataas na rate sa pagpopondo." + "content": "Nagti-trade ka sa labas ng regular na mga oras ng market (9:30 am hanggang 4 pm ET). Kapag sarado ang mga market, may panganib para sa mas malalawak na spread, mga paggalaw ng presyo, at mas matataas na rate sa pagpopondo." }, "spread": { "title": "Spread", @@ -1697,7 +1720,14 @@ "retry_connection": "Subukang muli ang pagkonekta", "retrying_connection": "Kumonekta...", "connecting_to_perps": "Kumokonekta sa Perps", - "timeout_title": "Tumatagal ang pagkonekta kaysa sa inaasahan" + "timeout_title": "Tumatagal ang pagkonekta kaysa sa inaasahan", + "websocket_disconnected": "Naka-offline ang koneksyon mo.", + "websocket_disconnected_message": "Maaaring hindi napapanahon ang data.", + "websocket_connecting": "Kumokonekta sa perps...", + "websocket_connecting_message": "Ibinabalik ang koneksyon... Pagtatangka {{attempt}}", + "websocket_connected": "Nakakonekta", + "websocket_connected_message": "Ipinagpatuloy ang mga update ng live data", + "websocket_retry": "Subukang muli" }, "chart": { "no_data": "Walang available na data ng chart", @@ -1746,7 +1776,7 @@ "markets": "Market" }, "learn_more": { - "title": "Matuto pa tungkol sa Perps", + "title": "Alamin ang tungkol sa Perps", "description": "Alamin kung paano gumagana ang perpetual trading at kung paano magsisimula", "cta": "Matuto pa" }, @@ -1754,6 +1784,9 @@ "title": "Kontakin ang suporta", "description": "Kontakin ang Suporta ng MetaMask para humingi ng tulong" }, + "feedback": { + "title": "Bigyan kami ng feedback" + }, "close_all_modal": { "title": "Isara ang lahat ng posisyon", "description": "Isasara namin ang lahat ng bukas na posisyon mo sa kasalukuyang presyo sa merkado.", @@ -1806,7 +1839,11 @@ "price_change_low_to_high": "Pagbabago ng presyo: mababa pataas", "past_hour": "Nakalipas na oras", "past_24_hours": "Nakalipas na 24 oras", - "time": "Oras" + "time": "Oras", + "apply": "Ilapat" + }, + "market_type": { + "filter_by": "I-filter ayon sa" }, "perps_markets": "Mga perps market", "volume": "Dami", @@ -1823,6 +1860,7 @@ "mainnet": "Mainnet", "developer_options": { "hyperliquid_network_toggle": "Toggle ng Network ng Hyperliquid", + "provider_mode_toggle": "Provider Mode", "simulate_connection_error": "I-simulate ang error sa koneksyon" }, "transactions": { @@ -1857,7 +1895,7 @@ "liquidated": "Na-liquidate", "take_profit": "Take profit", "stop_loss": "Stop loss", - "auto_deleveraging": "Awtomatikong Pag-deleverage" + "auto_deleveraging": "Awtomatikong pag-deleverage" }, "funding": { "date": "Petsa", @@ -1925,7 +1963,7 @@ } }, "points": "Mga Point", - "estimated_points": "Tinatayang mga Point", + "estimated_points": "Tinatayang mga point", "points_error": "Hindi namin mai-load ang mga point sa ngayon", "points_error_content": "Huwag mag-alala, nakakakuha ka parin ng mga point. Lalabas ang mga iyon sa iyong account mayamaya, o pwede mong tingnan ang tab ng mga Reward mamaya.", "tp_on_chart": "TP sa Chart", @@ -1942,7 +1980,7 @@ } }, "predict": { - "title": "Hula ng MetaMask", + "title": "Mga Predisksyon ng MetaMask", "prediction_markets": "Mga market ng prediksyon", "market_list": "Listahan ng market", "loading": "Nilo-load...", @@ -1981,7 +2019,8 @@ "fee_exemption": "Hindi kami naniningil ng anumang bayarin sa market na ito.", "ended": "Natapos na", "resolved_early": "Naresolba nang maaga", - "disclaimer": "Posibleng hindi kumpleto ang impormasyong ito. Mag-isang pinamamahalaan ng Polymarket ang lahat ng panuntunan ng market, pamantayan ng resolusyon, at mga panghuling resulta. Dapat na gawin ang mga trade batay sa kumpletong panuntunan na nasa Polymarket." + "disclaimer": "Posibleng hindi kumpleto ang impormasyong ito. Mag-isang pinamamahalaan ng Polymarket ang lahat ng panuntunan ng market, pamantayan ng resolusyon, at mga panghuling resulta. Dapat na gawin ang mga trade batay sa kumpletong panuntunan na nasa Polymarket.", + "your_picks": "Mga pinipili mo" }, "tab": { "no_predictions_description": "Lilitaw ang mga prediksyon mo dito, na ipinakikita ang taya at pagkilos ng market mo.", @@ -2001,6 +2040,8 @@ "cashout_info": "{{amount}} para sa {{outcome}} sa presyong {{initialPrice}}", "cashout_info_multiple": "{{amount}} sa {{outcomeGroupTitle}} • {{outcome}} sa {{initialPrice}}", "position_info": "{{initialValue}} sa {{outcome}} para manalo ng {{shares}}", + "position_pick_info": "{{initialValue}} sa {{outcome}}", + "position_pick_info_to_win": "{{initialValue}} sa {{outcome}} para manalo ng", "buy_yes": "Oo", "buy_no": "Hindi", "outcomes": "mga resulta", @@ -2035,6 +2076,7 @@ "won_markets_text": "Nanalo ang {{count}} market{{s}}", "available_balance": "Available na balanse", "claim_amount_text": "I-claim ang ${{amount}}", + "claim_winnings_text": "I-claim ang mga panalo", "unrealized_pnl_label": "Unrealized P&L", "unrealized_pnl_value": "{{amount}} ({{percent}})", "unrealized_pnl_error": "Hindi mai-load", @@ -2093,8 +2135,8 @@ "price_per_share": "Presyo kada share", "price_impact": "Epekto ng presyo", "net_pnl": "Net P&L", - "total_net_pnl": "Kabuuang Net P&L", - "market_net_pnl": "Market Net P&L", + "total_net_pnl": "Kabuuang net P&L", + "market_net_pnl": "Market na net P&L", "activity_details": "Mga detalye ng aktibidad", "today": "Ngayong araw", "yesterday": "Kahapon" @@ -2173,6 +2215,15 @@ "order_not_fully_filled": "Hindi na-fill ang order mo", "buy_order_not_fully_filled": "Hindi sapat ang mga share na available sa market price para mailagay ang order mo sa ngayon.", "sell_order_not_fully_filled": "Walang sapat na demand sa market price para mag-cash out sa ngayon." + }, + "game_details_footer": { + "pick_a_winner": "Pumili ng nanalo", + "volume_display": "${{volume}} Vol", + "read_terms": "Basahin ang buong termino at kondisyon ng kontrata" + }, + "sports": { + "halftime": "Halftime", + "final": "Final" } }, "receive": { @@ -2290,7 +2341,7 @@ "add_funds": "Magdagdag ng pondo", "next": "Susunod", "buy_asset": "Bumili ng {{asset}}", - "no_tokens": "Wala kang anumang token!", + "no_tokens": "Wala kang anumang token", "show_tokens_without_balance": "Ipakita ang mga token na walang balanse", "nfts_autodetection_title": "Pagtuklas ng NFT", "nfts_autodetection_desc": "Hayaan ang MetaMask na awtomatikong i-detect at ipakita ang mga NFT sa iyong wallet.", @@ -2303,7 +2354,7 @@ "target_scam_network": "kaya ito ay isang target para sa mga scam. Maaari kang lokohin ng mga scammer na magpadala ka ng mas mahalagang salapi bilang kapalit. Beripikahin ang lahat bago magpatuloy.", "use_the_currency_symbol": "ginagamit ang simbolo ng salapi", "use_correct_symbol": "Tiyakin na ginagamit mo ang tamang simbolo bago magpatuloy", - "chain_id_currently_used": "Ang ID ng Chain na ito ay kasalukuyang ginagamit ng", + "chain_id_currently_used": "This chain ID is currently used by the", "incorrect_network_name_warning": "Ayon sa aming mga rekord, maaaring hindi tumugma ang pangalan ng network sa ID ng chain na ito.", "suggested_name": "Iminumungkahing pangalan:", "network_check_validation_desc": "binabawasan ang iyong tiyansa na kumonekta sa isang malicious o maling network.", @@ -2314,7 +2365,7 @@ "nft_empty_description": "Malawak ang mundo ng mga NFT. Simulan mo na ang iyong koleksyon ngayon.", "tokens_empty_description": "Nothing to see yet. Why not browse tokens or make a trade?", "discover_nfts": "Mag-import ng mga NFT", - "no_transactions": "Wala kang transaksyon!", + "no_transactions": "Wala kang transaksyon", "switch_network_to_view_transactions": "Pakisuyong lumipat ng network para tingnan ang mga transaksyon", "send_button": "Ipadala", "deposit_button": "Magdeposito", @@ -2362,6 +2413,7 @@ "network_fee": "Bayad sa network", "lists": "Token lists", "hide_cta": "Itago ang token", + "perps_trading": "Perps trading", "options": { "title": "Token options", "view_on_portfolio": "Tingnan sa Portfolio", @@ -2409,8 +2461,8 @@ "add_token": "MAG-IMPORT" }, "collectibles": { - "cancel_add_collectible": "KANSELAHIN", - "add_collectible": "MAG-IMPORT" + "cancel_add_collectible": "Kanselahin", + "add_collectible": "I-import" }, "banners": { "search_desc": "Ang pinahusay na pagtukoy ng token ay kasalukuyang available sa network ng {{network}}. ", @@ -2521,18 +2573,20 @@ "billion_abbreviation": "B", "trillion_abbreviation": "T", "million_abbreviation": "M", + "thousand_abbreviation": "K", "token_details": "Mga detalye ng token", "contract_address": "Address ng kontrata", "token_list": "Listahan ng token", "market_details": "Mga detalye ng market", "market_cap": "Market cap", "total_volume": "Total volume (24h)", - "volume_to_marketcap": "Volume / market cap", + "volume_to_marketcap": "Volume / Market cap", "circulating_supply": "Umiikot na supply", "all_time_high": "All time high", "all_time_low": "All time low", "fully_diluted": "Fully diluted", - "unknown": "Hindi Kilala" + "unknown": "Hindi Kilala", + "stock": "Stock" }, "collectible": { "collectible_address": "Address", @@ -2583,7 +2637,7 @@ "remove_snap_account": "Alisin ang snap account", "remove_snap_account_alert_description": "Aalisin ang account na ito sa wallet mo. Tiyakin na mayroon ka ng orihinal na Lihim na Parirala sa Pagbawi o pribadong key para sa in-import na account na ito bago magpatuloy. Maaari kang mag-import o gumawa muli ng mga account mula sa account drop-down.", "remove_account_alert_remove_btn": "Alisin", - "remove_account_alert_cancel_btn": "Huwag na", + "remove_account_alert_cancel_btn": "Never mind", "accounts_title": "Mga Account", "connect_account_title": "Ikonekta ang account", "connect_accounts_title": "Ikonekta ang mga account", @@ -2620,7 +2674,7 @@ "advisory_by": "Payo na ibinigay ng Ethereum Phishing Detector at PhishFort", "potential_threat": "Kabilang sa potensyal na panganib ay", "fake_metamask": "Pekeng bersyon ng MetaMask", - "srp_theft": "Pagnanakaw ng password o Secret Recovery Phrase", + "srp_theft": "Secret Recovery Phrase or password theft", "malicious_transactions": "Mga mapanganib na transaskyon na magreresulta sa ninakaw na pag-aari", "secret_recovery_phrase": "Lihim na Parirala sa Pagbawi (Secret Recovery Phrase)", "account_name": "Pangalan ng account", @@ -2675,8 +2729,8 @@ }, "connect_qr_hardware": { "title": "Ikonekta ang QR-based na wallet na hardware", - "description1": "Ikonekta ang isang airgapped na wallet na hardware na nakikipag-ugnayan sa pamamagitan ng mga QR code.", - "description2": "Paano ito gumagana?", + "description1": "Connect an airgapped hardware wallet that communicates through QR codes.", + "description2": "Paano ito gumagana", "description3": "Ang mga opisyal na sinusuportahang airgapped na wallet na hardware ay kinabibilangan ng:", "keystone": "Keystone", "ngravezero": "Ngrave Zero", @@ -2690,10 +2744,10 @@ "hint_text": "I-scan ang iyong wallet na hardware sa ", "purpose_connect": "kumonekta", "purpose_sign": "kumpirmahin ang transaksyon", - "select_accounts": "Pumili ng Account" + "select_accounts": "Pumili ng account" }, "data_collection_modal": { - "accept": "Okay", + "accept": "OK", "content": "In-off mo ang koleksyon ng data para sa layunin sa marketing. Ito ay inilalapat lamang sa device na ito. Kung gumagamit ka ng MetaMask sa ibang mga device, siguraduhing mag-opt out din doon." }, "account_selector": { @@ -2716,15 +2770,15 @@ "notifications_dismiss_modal": "I-dismiss", "select_rpc_url": "Pumili ng RPC URL", "title": "Mga Setting", - "current_conversion": "Batayang Currency", - "current_language": "Current language", - "ipfs_gateway": "Gateway na IPFS", + "current_conversion": "Batayang currency", + "current_language": "Kasalukuyang wika", + "ipfs_gateway": "IPFS gateway", "ipfs_gateway_content": "Ang MetaMask ay gumagamit ng mga serbisyo ng third-party para ipakita ang mga imahe sa iyong mga NFT na nakaimbak sa IPFS, nagpapakita ng impormasyong nauugnay sa mga ENS address na ipinakita sa address bar ng iyong browser, at kinukuha ang mga icon para sa iba't ibang token. Ang iyong IP address ay maaaring ipakita sa mga serbisyong ito kapag ginagamit mo ang mga iyon.", "ipfs_gateway_down": "Down ang kasalukuyan mong IPFS gateway", "ipfs_gateway_desc": "Pumili ng gusto mong IPFS gateway.", "search_engine": "Search engine", - "new_RPC_URL": "Bagong RPC Network", - "state_logs": "State logs", + "new_RPC_URL": "Bagong RPC network", + "state_logs": "Mga log ng estado", "add_network_title": "Magdagdag ng network", "auto_lock": "Awtomatikong i-lock", "auto_lock_desc": "Piliin kung gaano katagal bago awtomatikong mala-lock ang application.", @@ -2733,15 +2787,15 @@ "autolock_never": "Hindi kailanman", "autolock_after": "Makalipas ang {{time}} (na) segundo", "autolock_after_minutes": "Makalipas ang {{time}} (na) minuto", - "reveal_seed_words": "Reveal seed words", - "reset_account": "Reset account", - "state_logs_button": "Download state logs", + "reveal_seed_words": "Ibunyag ang Mga Seed Word", + "reset_account": "I-reset ang account", + "state_logs_button": "I-download ang mga log ng estado", "reveal_seed_words_button": "IBUNYAG ANG MGA SEED WORD", - "reset_account_button": "Reset account", + "reset_account_button": "I-reset ang account", "reset_account_confirm_button": "Oo, i-reset ito", "reset_account_cancel_button": "Kanselahin", - "reset_account_modal_title": "Reset account?", - "clear_approvals_modal_title": "Clear approval data?", + "reset_account_modal_title": "I-reset ang account?", + "clear_approvals_modal_title": "I-clear ang data ng pag-apruba?", "clear_approvals_modal_message": "Ang lahat ng dapp ay kakailanganing humiling ng access para makita ulit ang impormasyon ng account.", "clear_browser_history_modal_title": "I-clear ang history ng browser?", "clear_browser_history_modal_message": "Aalisin na namin ang lahat ng history ng iyong browser. Sigurado ka ba?", @@ -2763,7 +2817,7 @@ "protect_title": "Pagbawi sa wallet", "banner_social_login_enabled": "Mag-log in gamit ang {{authConnection}}", "manage_recovery_method": "Pamahalaan ang mga paraan ng pagbawi", - "video_failed": "Video failed to load.", + "video_failed": "Nabiong mag-load ang video.", "protect_desc": "I-back up ang iyong Lihim na Parirala sa Pagbawi nang sa gayon ay hindi ka mawalan ng access sa iyong wallet. Tiyaking iimbak ito sa isang ligtas na lugar na ikaw lamang ang may access at hindi makakalimutan", "protect_desc_no_backup": "Ito ang pariralang may 12 salita ng wallet mo. Magagamit ang pariralang ito para makontrol ang lahat ng iyong account sa kasalukuyan at hinaharap, pati na ang kakayahang magpadala ng mga pondo sa iyong wallet. Panatilihing ligtas ang pagkakatago ng pariralang ito, HUWAG itong ibahagi sa kahit sino. Hindi ka matutulungan ng MetaMask na mabawi ang key na ito.", "learn_more": "Matuto pa.", @@ -2782,9 +2836,9 @@ "show_fiat_on_testnets_desc": "Piliin ito para ipakita ang palitan ng fiat sa mga test network.", "show_fiat_on_testnets_modal_title": "Maging maingat", "show_fiat_on_testnets_modal_description": "Kung hiniling sa iyo na i-on ang tampok na ito, maaari kang ma-scam. Ang mga token na ito ay walang halagang pera at para sa layunin ng pagsubok lamang. Tinutulungan ng tampok na ito ang mga developer na matiyak na gumagana ang kanilang mga app.", - "show_fiat_on_testnets_modal_learn_more": "Matuto pa.", + "show_fiat_on_testnets_modal_learn_more": "Matuto pa", "show_fiat_on_testnets_modal_button": "Magpatuloy", - "show_hex_data": "Show hex data", + "show_hex_data": "Ipakita ang hex na data", "show_hex_data_desc": "Piliin ito para ipakita ang field ng hex na data sa screen ng pagpapadala.", "accounts_identicon_title": "Icon ng account", "accounts_identicon_desc": "Pumili mula sa tatlong iba’t ibang estilo ng kakaibang mga icon na makakatulong para madaling makilala ang mga account sa isang tingin.", @@ -2804,10 +2858,10 @@ "customize_session_desc": "I-on ang mga uri ng notipikasyon na nais mong matanggap:", "account_session_title": "Aktibidad ng account", "account_session_desc": "Piliin ang mga account na nais mong makakuha ng abiso:", - "assets_sent_title": "Assets sent", - "assets_sent_desc": "Mga Pondo at NFT", - "assets_received_title": "Assets received", - "assets_received_desc": "Mga Pondo at NFT", + "assets_sent_title": "Ipinadala ang mga asset", + "assets_sent_desc": "Mga Pondo at mga NFT", + "assets_received_title": "Natanggap ang mga asset", + "assets_received_desc": "Mga Pondo at mga NFT", "defi_title": "DeFi", "defi_desc": "Staking, swapping, at bridging", "snaps_title": "Mga Snap", @@ -2822,32 +2876,32 @@ "permissions_desc": "Pamahalaan ang mga pahintulot na ibinigay sa mga site at app.", "no_permissions": "Walang pahintulot", "no_permissions_desc": "Kapag ikinonekta mo ang isang account sa isang site o app, makikita mo ito dito.", - "security_title": "Seguridad at Pagkapribado", + "security_title": "Seguridad at pagkapribado", "back": "Bumalik", "security_desc": "Mga setting ng pagkapribado, MetaMetrics, pribadong key at Lihim na Parirala sa Pagbawi.", "networks_title": "Mga Network", - "networks_default_title": "Default network", + "networks_default_title": "Default na network", "network_delete": "Kapag tinanggal mo ang network na ito, kakailanganin mo itong idagdag muli para makita ang mga asset mo sa network na ito", "networks_default_cta": "Gamitin ang network na ito", "add_rpc_url": "Magdagdag ng RPC URL", - "add_block_explorer_url": "Magdagdag ng URL ng Block Explorer", + "add_block_explorer_url": "Magdagdag ng URL ng block explorer", "networks_desc": "Magdagdag at mag-edit ng mga custom na RPC network", - "network_name_label": "Network name", - "network_name_placeholder": "Network name (optional)", + "network_name_label": "Pangalan ng network", + "network_name_placeholder": "Pangalan ng network (opsyonal)", "network_rpc_url_label": "RPC URL", "network_rpc_name_label": "Pangalan ng RPC", - "network_rpc_placeholder": "Bagong RPC Network", + "network_rpc_placeholder": "Bagong RPC network", "network_failover_rpc_url_label": "Failover na RPC URL", "failover": "Failover", "network_chain_id_label": "ID ng Chain", "network_chain_id_placeholder": "ID ng Chain", "network_symbol_label": "Simbolo", - "network_block_explorer_label": "URL ng Block Explorer", - "network_block_explorer_placeholder": "URL ng Block Explorer (opsyonal)", - "network_chain_id_warning": "Di-wastong ID ng Chain", - "network_other_networks": "Other networks", - "network_rpc_networks": "Mga RPC Network", - "network_add_network": "Add network", + "network_block_explorer_label": "URL ng block explorer", + "network_block_explorer_placeholder": "URL ng Block explorer (opsyonal)", + "network_chain_id_warning": "Di-wastong ID ng chain", + "network_other_networks": "Iba pang mga network", + "network_rpc_networks": "Mga RPC network", + "network_add_network": "Magdagdag ng network", "network_add_custom_network": "Magdagdag ng custom na network", "network_add": "Idagdag", "network_save": "I-save", @@ -2858,11 +2912,11 @@ "info_title_beta": "Tungkol sa MetaMask Beta", "info_title_flask": "Tungkol sa MetaMask Flask", "experimental_title": "Eksperimental", - "experimental_desc": "WalletConnect at higit pa...", + "experimental_desc": "WalletConnect and at iba pa...", "legal_title": "Ligal", "conversion_title": "Palitan ng currency", "conversion_desc": "Magpakita ng mga fiat value sa paggamit ng partikular na currency sa buong application.", - "primary_currency_title": "Primary currency", + "primary_currency_title": "Pangunahing currency", "primary_currency_desc": "Piliin ang Native para maisapriyoridad ang pagpapakita ng mga value sa native na currency ng chain (hal. ETH). Piliin ang Fiat para maisapriyoridad ang pagpapakita ng mga value sa napili mong fiat na salapi.", "primary_currency_text_first": "Likas", "primary_currency_text_second": "Fiat", @@ -2883,7 +2937,7 @@ "batch_balance_requests_description": "Makakuha ng mga update sa balanse ng lahat ng iyong account nang minsanan. Ang pag-off sa feature na ito ay nangangahulugan na ang iba ay mas malamang na hindi maiugnay ang isang account sa iba.", "third_party_title": "Makuha ang mga papasok na transaksyon", "third_party_description": "Ang mga third party AP (Etherscan) ay ginagamit para ipakita ang iyong mga papasok na transakyon sa history. I-off kung ayaw mong i-pull namin ang data mula sa mga serbisyong iyon.", - "metametrics_opt_out": "Pag-opt out sa MetaMetrics", + "metametrics_opt_out": "pag-opt out sa MetaMetrics", "metametrics_restart_required": "Kailangan mong i-restart ang app para mailapat ang mga pagbabago.", "create_password": "Gumawa ng password", "invalid_password": "Di-wastong password", @@ -2899,11 +2953,11 @@ "invalid_number": "Di-wastong numero. Maglagay ng decimal o '0x'-prefixed hexadecimal number.", "invalid_number_leading_zeros": "Di-wastong numero. Alisin ang anumang zero sa unahan.", "invalid_number_range": "Di-wastong numero. Maglagay ng numero sa pagitan ng 1 at %{maxSafeChainId}", - "hide_zero_balance_tokens_title": "Hide tokens without balance", + "hide_zero_balance_tokens_title": "Itago ang mga token na walang balanse", "hide_zero_balance_tokens_desc": "Pigilan ang mga token na walang balanse na lumabas sa iyong listahan ng token.", "token_detection_title": "I-autodetect ang mga token", "token_detection_description": "Gumagamit kami ng mga third-party na API para tumuklas at magpakita ng mga bagong token na ipinadala sa iyong wallet. I-off kung ayaw mong kunin ng app ang datos mula sa mga serbisyong iyon.", - "theme_button_text": "Change theme", + "theme_button_text": "Baguhin ang tema", "theme_title": "Tema ({{theme}})", "theme_description": "Baguhin ang hitsura ng iyong app sa pagtatakda ng tema.", "theme_os": "Sistema", @@ -2935,20 +2989,20 @@ "delete_metrics_description_after_delete_part_two": ". Maaaring tumagal nang hanggang 30 araw ang prosesong ito. Tingnan ang aming", "delete_metrics_description_privacy_policy": "Patakaran sa Pagkapribado.", "delete_metrics_button": "Tanggalin ang data ng MetaMetrics", - "check_status_button": "Check status", + "check_status_button": "Suriin ang katayuan", "delete_metrics_confirm_modal_title": "Tanggalin ang data ng MetaMetrics?", "delete_metrics_confirm_modal_description": "Aalisin na namin ang lahat ng iyong data ng MetaMetrics. Sigurado ka ba?", "delete_wallet_data_title": "I-reset ang wallet", "delete_wallet_data_description": "Aalisin nito ang lahat ng data na nauugnay sa wallet mula sa iyong device. Ang iyong mga account ay umiiral sa blockchain at hindi nauugnay sa MetaMask. Maaari mong bawiin anumang oras ang iyong mga account gamit ang iyong Lihim na Parirala sa Pagbawi.", "delete_wallet_data_button": "I-reset ang wallet", - "delete_data_status_title": "Deletion task status", + "delete_data_status_title": "Katayuan ng ginawang pagtatanggal", "delete_data_status_description": "Ang kasalukuyang katayuan ay", "delete_metrics_error_title": "Hindi namin matanggal ang data na ito sa ngayon.", "delete_metrics_error_description": "Hindi makumpleto ang kahilingang ito sa ngayon dahil sa isang isyu sa server ng analytics system, pakisubukang muli mamaya.", "ok": "OK", - "clear_sdk_connections_title": "I-clear ang lahat ng MetaMask SDK Connection", + "clear_sdk_connections_title": "I-clear ang lahat ng MetaMask SDK connection", "clear_sdk_connections_text": "Iki-clear ang lahat ng koneksyon at ang dapps ay kailangang humiling muli ng koneksyon", - "sdk_connections": "MetaMask SDK Connections", + "sdk_connections": "Mga MetaMask SDK connection", "manage_sdk_connections_title": "Pamahalaan ang mga koneksyon", "manage_sdk_connections_text": "Alisin ang mga koneksyon sa mga site at/o MetaMask SDK.", "fiat_on_ramp": { @@ -2956,8 +3010,9 @@ "description": "Rehiyon at higit pa...", "current_region": "Kasalukuyang rehiyon", "reset_region": "I-reset ang rehiyon", + "change_region": "Baguhin ang rehiyon", "no_region_selected": "Walang napiling rehiyon", - "sdk_activation_keys": "Mga Activation Key ng SDK", + "sdk_activation_keys": "Mga activation key ng SDK", "activation_keys_description": "Gagana ang partikular na mga feature o provider sa mga activation key.", "add_activation_key": "Magdagdag ng activation key", "edit_activation_key": "I-edit ang activation key", @@ -3006,13 +3061,13 @@ }, "snap_details": { "install_date": "Na-install noong {{date}}", - "install_origin": "Install origin", + "install_origin": "I-install ang pinagmulan", "enabled": "Pinagana", "version": "Bersyon" }, "keyring_account_list_item": { "account_name": "Pangalan ng account", - "public_address": "Public address" + "public_address": "Pampublikong address" }, "snap_permissions": { "approved_date": "Inaprubahan noong {{date}}", @@ -3063,28 +3118,28 @@ "blockaid_desc": "Ang tampok na ito ay nag-aalerto sa iyo ng masamang aktibidad sa pamamagitan ng aktibong pagsusuri sa mga transaksyon at paghiling ng pirma.", "security_alerts": "Mga alerto sa seguridad", "security_alerts_desc": "Inaalertuhan ka ng tampok na ito sa mga aktibidad na may masamang hangarin sa pamamagitan ng lokal na pagsusuri sa iyong mga transaksyon at kahilingan sa paglagda. Palaging gumawa ng sarili mong pag-iingat bago aprubahan ang anumang mga kahilingan. Walang garantiya na made-detect ng tampok na ito ang lahat ng aktibidad na may masamang hangarin. Sa pagpapagana sa tampok na ito, sumasang-ayon ka sa mga tuntunin ng paggamit ng provider.", - "dismiss_smart_account_update_heading": "Balewalain ang mungkahing \"Ilipat sa Smart Account\"", - "dismiss_smart_account_update_desc": "I-on ito para hindi na makita ang mungkahing \"Ilipat sa Smart Account\" sa alinmang account. Ang mga Smart account ay nagbubukas sa mas mabilis na mga transaksyon, nagpapababa sa bayarin sa network at mas flexible sa pagbabayad para sa mga ito.", + "dismiss_smart_account_update_heading": "Balewalain ang mungkahing \"Ilipat sa smart account\"", + "dismiss_smart_account_update_desc": "I-on ito para hindi na makita ang mungkahing \"Ilipat sa smart account\" sa alinmang account. Ang mga Smart account ay nagbubukas sa mas mabilis na mga transaksyon, nagpapababa sa bayarin sa network at mas flexible sa pagbabayad para sa mga ito.", "use_smart_account_heading": "Gumamit ng smart account", "use_smart_account_desc": "Panatilihin itong naka-on para awtomatikong gawing mga smart account ang mga account na ginawa sa loob ng MetaMask sa tuwing available ang mga naaangkop na feature, gaya ng mas mabibilis na transaksyon, mas mabababang bayad sa network at flexible na bayad para sa pagbabayad sa mga ito.", - "use_smart_account_learn_more": "Matuto pa.", + "use_smart_account_learn_more": "Matuto pa", "smart_transactions_opt_in_heading": "Mga Smart Transaction", "smart_transactions_opt_in_desc_supported_networks": "I-on ang mga Smart na Transaksyon para sa mas maaasahan at ligtas na mga transaksyon sa mga suportadong network.", - "smart_transactions_learn_more": "Matuto pa.", + "smart_transactions_learn_more": "Matuto pa", "simulation_details": "Tinatayang mga pagbabago sa balanse", "simulation_details_description": "I-on ito para gumawa ng pagtataya sa mga pagbabago sa balanse ng mga transaksyon bago mo kumpirmahin ang mga ito. Hindi nito iginagarantiya ang panghuling resulta ng iyong mga transaksyon. ", "simulation_details_learn_more": "Matuto pa.", "aes_crypto_test_form_title": "AES crypto - test form", "aes_crypto_test_form_description": "Bahagi na ekslusibong binuo para sa E2E testing. Kung ito ay nakikita sa iyong app, mangyaring i-ulat ito sa MetaMask support.", "developer_options": { - "title": "Developer options", - "generate_trace_test": "Generate trace test", - "generate_trace_test_desc": "Generate a developer test Sentry trace.", - "navigate_to_sample_feature": "Navigate to sample feature", + "title": "Mga opsyon ng developer", + "generate_trace_test": "Lumikha ng trace test", + "generate_trace_test_desc": "Lumikha ng pagsubaybay sa developer test Sentry.", + "navigate_to_sample_feature": "Mag-navigate ng sampol na feature", "sample_feature_desc": "Isang sampol na feature bilang template para sa mga developer." }, "feature_flag_override": { - "title": "Feature flag override", + "title": "Pag-override ng feature na flag", "description": "I-override ang mga feature flag ng app sa lokal na setting." } }, @@ -3107,7 +3162,7 @@ "disconnect_all_info": "Kung aalisin mo ang iyong mga koneksyon sa lahat ng site, kakailanganin mong magbigay ng pahintulot na kumonekta muli.", "disconnect": "Idiskonekta", "disconnect_all": "Idiskonekta ang lahat", - "disconnect_all_accounts": "Idiskonekta ang lahat ng Account", + "disconnect_all_accounts": "Idiskonekta ang lahat ng account", "manage_connections": "Pamahalaan ang mga koneksyon", "manage": "Pamahalaan", "cancel": "Kanselahin", @@ -3124,7 +3179,7 @@ "disconnect_all": "Idiskonekta sa lahat ng site?", "disconnect_all_desc": "Kapag inalis mo ang iyong mga koneksyon sa lahat ng site, kakailanganin mong magbigay ng pahintulot na kumonekta muli.", "disconnect_account": "Idiskonekta ang account?", - "disconnect_all_accounts": "Idiskonekta ang lahat ng Account", + "disconnect_all_accounts": "Idiskonekta ang lahat ng account", "disconnect_all_accounts_desc": "Kapag inalis mo ang koneksyon ng lahat ng account mula sa {{dapp}}, kakailanganin mong magbigay ng pahintulot na ikonekta muli ang mga iyon.", "disconnect_account_desc": "Kapag inalis mo ang koneksyon ng {{account}} mula sa {{dapp}}, kailangan mong magbigay ng pahintulot na kumonekta muli.", "disconnect_confirm": "Idiskonekta", @@ -3137,7 +3192,7 @@ "sdk_feedback_modal": { "ok": "OK", "title": "Hindi makakonekta ang account", - "info": "Mangyaring i-scan ang QR code sa dApp upang muling kumonekta sa MetaMask" + "info": "Please scan the QR code on the site to reconnect to MetaMask" }, "app_information": { "title": "Impormasyon", @@ -3145,8 +3200,8 @@ "privacy_policy": "Patakaran sa Pagkapribado", "terms_of_use": "Mga tuntunin ng paggamit", "attributions": "Mga Attribution", - "support_center": "Visit our support center", - "web_site": "Bisitahin ang aming Website", + "support_center": "Bisitahin ang aming sentro ng suporta", + "web_site": "Visit our website", "contact_us": "Contact us" }, "reveal_credential": { @@ -3203,7 +3258,7 @@ "keep_credential_safe": "Panatilihing ligtas ang iyong {{credentialName}}", "srp_abbreviation_text": "SRP", "srp_text": "Lihim na Parirala sa Pagbawi (Secret Recovery Phrase)", - "private_key_text": "Pribadong Key", + "private_key_text": "Pribadong key", "got_it": "Nakuha ko", "learn_more": "Matuto pa" }, @@ -3211,12 +3266,12 @@ "title": "Alertong pangkaligtasan", "description": "Ang mga screenshot ay hindi ligtas na paraan para subaybayan ang iyong {{credentialName}}. Ilagay ito sa isang lugar na hindi naka-back up online para mapanatiling ligtas ang iyong account.", "srp_text": "Lihim na Parirala sa Pagbawi (Secret Recovery Phrase)", - "priv_key_text": "Pribadong Key" + "priv_key_text": "Pribadong key" }, "password_reset": { "password_title": "Password", "password_desc": "Pumili ng mahirap hulaang password para ma-unlock ang MetaMask app sa iyong device. Kung makakalimutan mo ang password na ito, kakailanganin mo ang iyong Lihim na Parirala sa Pagbawi para ma-import ulit ang iyong wallet.", - "password_learn_more": "Matuto pa.", + "password_learn_more": "Matuto pa", "change_password": "Palitan ang password", "password_hint": "Hint sa password" }, @@ -3246,19 +3301,28 @@ "swap": "Mag-swap", "bridge": "Mag-bridge", "earn": "Kumita", - "convert_to_musd": "Convert to mUSD", + "convert_to_musd": "I-convert sa mUSD", + "merkl_rewards": { + "annual_bonus": "{{apy}}% bonus", + "claimable_bonus": "Naki-claim na bonus", + "claimable_bonus_tooltip_description": "mUSD bonuses are claimed on Linea.", + "terms_apply": "Terms apply.", + "ok": "OK", + "claim": "I-claim", + "processing_claim": "Processing claim..." + }, "tron": { - "daily_resource_new_energy": "New daily energy", - "sufficient_to_cover": "Sufficient to cover", + "daily_resource_new_energy": "Bagong enerhiya araw-araw", + "sufficient_to_cover": "Sapat para matugunan", "transactions": "mga transaksyon", "daily_resource": "Araw-araw na mapagkukunan", "bandwidth": "Bandwidth", "energy": "Enerhiya", - "daily_resource_description": "This is your daily allowance based on your staked TRX. Hold TRX to get 600 bandwidth daily.", - "sufficient_to_cover_trx_transfers": "Covers ~{{amount}} TRX transfers", - "sufficient_to_cover_trx_transfer": "Covers 1 TRX transfer", - "sufficient_to_cover_usdt_transfers": "Covers ~{{amount}} USDT transfers", - "sufficient_to_cover_usdt_transfer": "Covers 1 USDT transfer" + "daily_resource_description": "Ito ang iyong araw-araw na allowance batay sa na-stake mo na TRX. I-hold ang TRX para makakuha ng 600 bandwidth araw-araw.", + "sufficient_to_cover_trx_transfers": "Tinutugunan ang paglilipat ng ~{{amount}} (na) TRX", + "sufficient_to_cover_trx_transfer": "Tinutugunan ang paglilipat ng 1 TRX", + "sufficient_to_cover_usdt_transfers": "Tinutugunan ang paglilipat ng ~{{amount}} (na) USDT", + "sufficient_to_cover_usdt_transfer": "Tinutugunan ang paglilipat ng 1 USDT" }, "disabled_button": { "buy": "Hindi sinusuportahan ang pagbili para sa account na ito", @@ -3311,9 +3375,11 @@ }, "no_chart_data": { "title": "Walang datos ng tsart", - "description": "Wala kaming makuhang anumang datos para sa token na ito" + "description": "Wala kaming makuhang anumang datos para sa token na ito", + "insufficient_data": "Data is not available for this time period" }, "your_balance": "Iyong balanse", + "perps_position": "Posisyon ng perps", "unable_to_load_balance": "Hindi ma-load ang iyong balanse", "about": "Tungkol Dito", "about_content_display": { @@ -3363,11 +3429,11 @@ "address_copied_to_clipboard": "Nakopya sa clipboard ang address ng token" }, "qr_scanner": { - "invalid_qr_code_title": "Di-wastong QR Code", + "invalid_qr_code_title": "Invalid QR code", "invalid_qr_code_message": "Hindi wasto ang QR code na sinusubukan mong i-scan.", "allow_camera_dialog_title": "Payagan ang access sa camera", "allow_camera_dialog_message": "Kailangan namin ang iyong pahintulot na mag-scan ng mga QR code", - "scanning": "nagsa-scan...", + "scanning": "Nagsa-scan...", "ok": "Ok", "continue": "Magpatuloy", "cancel": "Kanselahin", @@ -3376,14 +3442,14 @@ "attempting_sync_from_wallet_error": "Mukhang sinusubukan mong mag-sync sa extension. Para magawa ito, kakailanganin mong burahin ang iyong kasalukuyang wallet. \n\nSa oras na magbura o mag-install ka ng bagong bersyon ng app, piliin ang opsyong \"I-sync gamit ang MetaMask Extension\". Mahalaga! Bago burahin ang iyong wallet, tiyaking na-back up mo ang iyong Lihim na Parirala sa Pagbawi.", "not_allowed_error_title": "I-on ang access sa camera", "not_allowed_error_desc": "Para mag-scan ng QR code, kailangan mong bigyan ang MetaMask ng access sa camera mula sa menu ng mga setting ng iyong device.", - "unrecognized_address_qr_code_title": "Hindi nakikilalang QR Code", + "unrecognized_address_qr_code_title": "Unrecognized QR code", "unrecognized_address_qr_code_desc": "Paumanhin, ang QR code na ito ay hindi nauugnay sa isang address ng account o isang address ng kontrata.", "url_redirection_alert_title": "Bibisitahin mo ang isang panlabas na link", "url_redirection_alert_desc": "Maaaring gamitin ang mga link upang subukang manlinlang o mag-phish ng mga tao, kaya siguraduhing bisitahin lamang ang mga website na pinagkakatiwalaan mo.", "label": "Mag-scan ng QR code", "open_settings": "Mga Setting", "camera_not_available": "Hindi available ang camera", - "tron_address_not_supported": "Tron addresses are not currently supported" + "tron_address_not_supported": "Hindi suportado ang mga Tron address sa kasalukuyan" }, "action_view": { "cancel": "Kanselahin", @@ -3471,10 +3537,10 @@ "cancel_tx_message": "Kapag isinumite ang pagsubok na ito, hindi nito magagarantiyang makakansela ang iyong orihinal na transaksyon. Kung magiging matagumpay ang pagsubok na magkansela, sisingilin ka para sa bayad sa transaksyon sa itaas.", "speedup_tx_title": "Subukang pabilisin?", "speedup_tx_message": "Kapag isinumite ang pagsubok na ito, hindi magagarantiya na maa-accelerate ang iyong orihinal na transaksyon. Kung matagumpay ang pagpapabilis, sisingilin ka para sa bayad sa transaksyon sa itaas.", - "nevermind": "Huwag na", + "nevermind": "Never mind", "edit_network_fee": "I-edit ang bayad sa gas", "edit_priority": "I-edit ang priyoridad", - "gas_cancel_fee": "Bayad sa pagkansela ng gas", + "gas_cancel_fee": "Gas cancellation fee", "gas_speedup_fee": "Bayarin sa Pagpapabilis ng Gas", "use_max": "Gamitin ang max", "set_gas": "Itakda", @@ -3602,7 +3668,7 @@ "reload": "I-reload", "share": "Ibahagi", "bookmark": "Bookmark", - "add_to_favorites": "Idagdag sa Mga Paborito", + "add_to_favorites": "Add to favorites", "error": "Error", "cancel": "Kanselahin", "go_back": "Bumalik", @@ -3610,7 +3676,7 @@ "home": "Home", "close": "Isara", "open_in_browser": "Buksan sa browser", - "change_url": "Baguhin ang URL", + "change_url": "Change URL", "switch_network": "Lumipat ng network", "dapp_browser": "DAPP BROWSER", "dapp_browser_message": "Ang MetaMask ay ang iyong wallet at browser para sa desentralisadong web. Mag-explore!", @@ -3664,7 +3730,7 @@ "approve": { "title": "Aprubahan", "deeplink": "Deeplink", - "qr_code": "QR CODE" + "qr_code": "QR code" }, "transactions": { "tx_review_confirm": "Kumpirmahin", @@ -3676,30 +3742,30 @@ "tx_review_increase_allowance": "Increase allowance", "tx_review_set_approval_for_all": "Set approval for all", "tx_review_staking_claim": "Staking claim", - "tx_review_staking_deposit": "Staking deposit", + "tx_review_staking_deposit": "Deposito sa pag-stake", "tx_review_staking_unstake": "I-unstake", - "tx_review_lending_deposit": "Lending deposit", + "tx_review_lending_deposit": "Deposito sa pagpapautang", "tx_review_lending_withdraw": "Lending withdrawal", - "tx_review_perps_deposit": "Mga Pinondohang Perp", + "tx_review_perps_deposit": "Mga pinondohang perp", "tx_review_predict_deposit": "Mga pinondohang prediksyon", "tx_review_predict_claim": "Mga na-claim na panalo", "tx_review_predict_withdraw": "Pagbawi ng mga prediksyon", - "tx_review_musd_conversion": "mUSD Conversion", - "sent_ether": "Nagpadala ng Ether", - "self_sent_ether": "Sent yourself Ether", - "received_ether": "Nakatanggap ng Ether", + "tx_review_musd_conversion": "Palitan ng mUSD", + "sent_ether": "Sent ETH", + "self_sent_ether": "Sent yourself ETH", + "received_ether": "Received ETH", "sent_dai": "Nagpadala ng DAI", "self_sent_dai": "Nagpadala ka sa sarili mo ng DAI", "received_dai": "Nakatanggap ng DAI", "sent_tokens": "Sent tokens", "received_tokens": "Received tokens", - "ether": "Ether", + "ether": "ETH", "sent_unit": "Nagpadala ng {{unit}}", "self_sent_unit": "Sent yourself {{unit}}", "received_unit": "Nakatanggap ng {{unit}}", "sent_collectible": "Sent collectible", "received_collectible": "Received collectible", - "send_ether": "Send Ether", + "send_ether": "Send ETH", "send_unit": "Send {{unit}}", "send_collectible": "Send collectible", "receive_collectible": "Receive collectible", @@ -3732,9 +3798,9 @@ }, "gas_used": "Gas used (units)", "gas_limit": "Gas limit (units)", - "gas_price": "Presyo ng Gas (GWEI)", - "base_fee": "Base Fee (GWEI)", - "priority_fee": "Priority Fee (GWEI)", + "gas_price": "Gas price (GWEI)", + "base_fee": "Base fee (GWEI)", + "priority_fee": "Priority fee (GWEI)", "multichain_priority_fee": "Bayad sa priyoridad", "max_fee": "Max fee per gas", "total": "Kabuuan", @@ -3767,7 +3833,7 @@ "confirm_gas_fee_token_tooltip": "Binabayaran ito sa network para iproseso ang iyong transaksyon. Kabilang dito ang {{metamaskFeeFiat}} na bayad sa MetaMask para sa mga token na hindi ETH o ETH na may paunang pondo.", "paid_by_metamask": "Binayaran ng MetaMask", "confirm_gas_fee_token_metamask_fee": "Kabilang ang bayad na {{metamaskFeeFiat}}", - "smart_account_upgrade": "I-upgrade sa smart account", + "smart_account_upgrade": "Lumipat sa smart account", "smart_account_downgrade": "Lumipat sa standard account", "batched_transactions": "Mga naka-batch na transaksyon", "gas_modal": { @@ -3883,7 +3949,7 @@ "network_select_confirm_use_safe_check": "Selecting confirm turns on network details check. You can turn off network details check in ", "network_settings_security_privacy": "Settings > Seguridad at pagkapribado", "network_currency_symbol": "Simbolo ng currency", - "network_block_explorer_url": "URL ng Block Explorer", + "network_block_explorer_url": "URL ng block explorer", "search": "Maghanap ng mga dati nang idinagdag na network", "search-short": "Search", "add": "Idagdag", @@ -3906,7 +3972,7 @@ "select_all": "Piliin lahat", "deselect_all": "Alisin ang pagkakapili sa lahat", "new_network": "Nagdagdag ng bagong network", - "network_name": "Ang {{networkName}} Network", + "network_name": "ang {{networkName}} Network", "network_added": " ay available na ngayon sa network selector.", "provider": "Ang isang provider ay pinagkakatiwalaang sabihin sa iyong wallet ang mga balanse nito at i-broadcast ang mga transaksyon nito sa matapat na paraan", "no_match": "Walang nakitang katugmang resulta.", @@ -4004,8 +4070,8 @@ "biometrics": { "enable_touchid": "I-unlock gamit ang Touch ID?", "enable_faceid": "I-unlock gamit ang Face ID?", - "enable_fingerprint": "I-unlock gamit ang Fingerprint?", - "enable_biometrics": "Mag-sign in gamit ang Biometrics?", + "enable_fingerprint": "Unlock with fingerprint?", + "enable_biometrics": "Unlock with biometrics?", "enable_device_passcode_ios": "I-unlock gamit ang passcode ng device?", "enable_device_passcode_android": "I-unlock gamit ang PIN ng device?" }, @@ -4020,18 +4086,18 @@ "title": "KAHILINGANG KUMONEKTA", "walletconnect_title": "KAHILINGANG WALLETCONNECT", "action": "Kumonekta sa site na ito?", - "action_reconnect": "Para ipagpatuloy ang koneksyon, piliin ang numerong makikita mo sa dApp", - "action_reconnect_deeplink": "Gusto mo bang kumonekta muli sa dApp na ito?", + "action_reconnect": "To resume connection, choose the number you see on the site", + "action_reconnect_deeplink": "Do you want to reconnect to this site?", "connect": "Kumonekta", "resume": "Ipagpatuloy", "cancel": "Kanselahin", - "donot_rememberme": "Huwag tandaan ang koneksyong ito ng dApp", + "donot_rememberme": "Do not remember this site connection", "disconnect": "Idiskonekta", "permission": "Tingnan ang iyong", "address": "pampublikong address", "sign_messages": "Lagdaan ang mga mensahe", "on_your_behalf": "sa ngalan mo", - "warning": "Sa pamamagitan ng pag-click sa kumonekta, pinapayagan mo ang dapp na ito na tingnan ang iyong pampublikong address. Isa itong mahalagang hakbang sa seguridad para maprotektahan ang iyong data mula sa mga potensyal na panganib ng phishing." + "warning": "By clicking connect, you allow this site to view your public address. This is an important security step to protect your data from potential phishing risks." }, "import_private_key": { "title": "Mag-import ng account", @@ -4047,7 +4113,7 @@ "error_title": "Mayroong nang mali", "error_message": "Hindi namin ma-import ang pribadong key na iyan. Pakitiyak na inilagay mo ito nang tama.", "error_empty_message": "Kailangan mong ilagay ang iyong pribadong key.", - "or_scan_a_qr_code": "o Mag-scan ng QR Code" + "or_scan_a_qr_code": "or scan a QR code" }, "import_private_key_success": { "title": "Matagumpay na na-import ang account!", @@ -4064,12 +4130,12 @@ "paste": "I-paste", "clear": "I-clear lahat", "srp_number_of_words_option_title": "Bilang ng mga salita", - "12_word_option": "Mayroon akong pariralang may 12 na salita", - "24_word_option": "Mayroon akong pariralang may 24 salita", + "12_word_option": "I have a 12-word phrase", + "24_word_option": "I have a 24-word phrase", "error_title": "Mayroong nang mali", "error_message": "We couldn't import that Secret Recovery Phrase. Please make sure you entered it correctly.", "error_empty_message": "You need to enter your Secret Recovery Phrase.", - "error_number_of_words_error_message": "Naglalaman ang mga Lihim na Parirala sa Pagbawi ng 12 o 24 na salita", + "error_number_of_words_error_message": "Secret Recovery Phrases contain 12 or 24 words", "error_srp_is_case_sensitive": "Di-wastong input! Case sensitive ang Lihim na Parirala sa Pagbawi.", "error_srp_word_error_1": "Ang salita ", "error_srp_word_error_2": " ay hindi tama o mali ang baybay nito.", @@ -4079,7 +4145,7 @@ "error_invalid_srp": "Di-wastong Lihim na Parirala sa Pagbawi", "error_duplicate_srp": "Na-import na ang Lihim na Parirala sa Pagbawi na ito.", "error_duplicate_account": "The account you are trying to import is a duplicate.", - "invalid_qr_code_title": "Di-wastong QR Code", + "invalid_qr_code_title": "Invalid QR code", "invalid_qr_code_message": "The QR code does not contain a valid Secret Recovery Phrase", "success_1": "Wallet", "success_2": "na-import" @@ -4151,7 +4217,7 @@ "why_secure_2": " Ito lang ang paraan para ma-recover ang iyong wallet sakaling ma-lock out ka sa app o makakuha ka ng bagong device." }, "account_backup_step_2": { - "cancel_backup_title": "Cancel backup", + "cancel_backup_title": "Kanselahin ang pag-backup", "cancel_backup_message": "Lubos naming inirerekomendang i-save mo ang iyong Lihim na Parirala sa Pagbawi para maibalik ang iyong wallet.", "cancel_backup_ok": "Oo, alam ko ang panganib", "cancel_backup_no": "Huwag, i-back up ang Lihim na Parirala sa Pagbawi", @@ -4163,7 +4229,7 @@ "cta_text": "OK" }, "account_backup_step_3": { - "cancel_backup_title": "Cancel backup", + "cancel_backup_title": "Kanselahin ang pag-backup", "cancel_backup_message": "Lubos naming inirerekomendang i-save mo ang iyong Lihim na Parirala sa Pagbawi para maibalik ang iyong wallet.", "cancel_backup_ok": "Oo, alam ko ang panganib", "cancel_backup_no": "Huwag, i-back up ang Lihim na Parirala sa Pagbawi", @@ -4172,7 +4238,7 @@ "cta_text": "WALANG IBANG NAKAKAKITA" }, "account_backup_step_4": { - "cancel_backup_title": "Cancel backup", + "cancel_backup_title": "Kanselahin ang pag-backup", "cancel_backup_message": "Lubos naming inirerekomendang i-save mo ang iyong Lihim na Parirala sa Pagbawi para maibalik ang iyong wallet.", "cancel_backup_ok": "Oo, alam ko ang panganib", "cancel_backup_no": "Huwag, i-back up ang Lihim na Parirala sa Pagbawi", @@ -4197,16 +4263,16 @@ "modal_button": "SUSUNOD" }, "account_backup_step_6": { - "title": "Security tips", + "title": "Mga tip sa seguridad", "info_text": "Hindi mare-recover ng MetaMask ang iyong Lihim na Parirala sa Pagbawi sakaling maiwala mo ito", "tip_1": "Magtabi ng maraming backup ng iyong Lihim na Parirala sa Pagbawi", "tip_2": "Itabi ang phrase sa pinagkakatiwalaang password manager at papel na backup sa isang ligtas na lugar", "tip_3": "Huwag ibahagi ang phrase na ito sa sinuman", "disclaimer": "* Makikita mo ang iyong Lihim na Parirala sa Pagbawi kung pupunta ka sa ", - "disclaimer_bold": "Mga Setting > Seguridad at Pagkapribado", - "cta_text": "OK!", + "disclaimer_bold": "Settings > Seguridad at pagkapribado", + "cta_text": "OK", "modal_title": "Pagbati!", - "modal_text": "Na-back up mo na lahat at handa ka na!", + "modal_text": "Na-back up mo na lahat at handa ka na.", "modal_button": "TAPOS NA", "copy_seed_phrase": "KOPYAHIN SA CLIPBOARD ANG Lihim na Parirala sa Pagbawi" }, @@ -4238,7 +4304,7 @@ "steps": "Hakbang {{currentStep}} ng {{totalSteps}}", "action": "Kumpirmahin ang iyong Lihim na Parirala sa Pagbawi", "info": "Piliin ang mga nawawalang salita sa tamang pagkakaayos.", - "complete": "Complete backup", + "complete": "Kumpletuhin ang pag-backup", "success": "Tagumpay", "error-title": "Parang may mali", "error-description": "Suriing mabuti ang iyong Lihim na Parirala sa Pagbawi at subukan muli.", @@ -4253,7 +4319,7 @@ "congratulations": "Pagbati", "success": "Matagumpay mong naprotektahan ang iyong wallet. Tiyaking panatilihing ligtas ang iyong Lihim na Parirala sa Pagbawi, responsibilidad mo ito!", "hint": "Mag-iwan ng hint para sa sarili mo?", - "recover": "Hindi mare-recover ng MetaMask ang iyong wallet sakaling maiwala mo ito. Makikita mo ang iyong Lihim na Parirala sa Pagbawi sa Mga Setting > Seguridad at Pagkapribado.", + "recover": "Hindi mare-recover ng MetaMask ang iyong wallet sakaling maiwala mo ito. Makikita mo ang iyong Lihim na Parirala sa Pagbawi (Secret Recovery Phrase) sa Mga Setting > Seguridad at pagkapribado.", "learn": "Matuto pa", "done": "Tapos na", "recovery_hint": "Hint sa pag-recovery", @@ -4300,7 +4366,7 @@ "withdrawal_completed": "Nakumpleto ang pag-withdraw", "unstake_completed": "Nakumpleto ang pag-unstake", "withdrawal_requested": "Hiniling ang pag-withdraw", - "stake_ready_to_be_withdrawn": "Handa ng i-withdraw ang stake", + "stake_ready_to_be_withdrawn": "Handa nang i-withdraw ang stake", "swap_completed": "Nag-swap ng {{from}} para sa {{to}}", "swap": "Nai-swap", "sent": "Ipinadala sa {{address}}", @@ -4417,7 +4483,7 @@ "metamask_swap_completed_title": "Nakumpleto ang pag-swap", "metamask_swap_completed_description": "Matagumpay ang Pag-swap mo sa MetaMask", "nft_sent_title": "Naipadala ang NFT", - "nft_sent_description": "Matagumpay mong naipadala ang NFT", + "nft_sent_description": "You successfully sent an NFT", "nft_received_title": "Natanggap ang NFT", "nft_received_description": "Nakatanggap ka ng mga bagong NFT", "rocketpool_stake_completed_title": "Nakumpleto ang pag-stake", @@ -4516,17 +4582,17 @@ "send_link_title": "Send link", "description_1": "Handa nang ipadala ang link ng iyong kahilingan!", "description_2": "Ipadala ang link na ito sa isang kaibigan, at hihilingin nitong ipadala nila", - "copy_to_clipboard": "Kopyahin sa Clipboard", - "qr_code": "QR CODE", + "copy_to_clipboard": "Kopyahin sa clipboard", + "qr_code": "QR code", "send_link": "Send link", - "request_qr_code": "QR Code ng Kahilingan sa Pagbabayad", + "request_qr_code": "Payment request QR code", "balance": "Balanse" }, "receive_request": { "title": "Tumanggap", "share_title": "Share address", "share_description": "I-email o i-text ang iyong address", - "qr_code_title": "QR CODE", + "qr_code_title": "QR code", "qr_code_description": "Masa-scan na larawan kung saan mababasa ang iyong address", "request_title": "Humiling", "request_description": "Humiling ng mga asset mula sa mga kaibigan", @@ -4541,7 +4607,7 @@ "copy_address": "Kopyahin ang address" }, "experimental_settings": { - "wallet_connect_dapps": "Mga Session ng WalletConnect", + "wallet_connect_dapps": "Mga session ng WalletConnect", "wallet_connect_dapps_desc": "Tingnan ang listahan ng mga aktibong session ng WalletConnect.", "wallet_connect_dapps_cta": "Tingnan ang mga sesyon", "network_not_supported": "Hindi sinusuportahan ang kasalukuyang network", @@ -4561,12 +4627,12 @@ "close_current_session": "Isara ang kasalukuyang sesyon bago magsimula ng bago." }, "paymentRequest": { - "title": "KAHILINGAN SA PAGBABAYAD", - "title_complete": "KUMPLETO NA ANG PAGBABAYAD", - "confirm": "MAGBAYAD", - "cancel": "TANGGIHAN", + "title": "Payment request", + "title_complete": "Payment complete", + "confirm": "Pay", + "cancel": "Decline", "is_requesting_you_to_pay": "ay humihiling sa iyong bayaran ang", - "total": "KABUUAN:" + "total": "Kabuuan:" }, "webview_error": { "title": "Mayroong nang mali", @@ -4589,6 +4655,10 @@ "fiat_on_ramp": { "buy_eth": "Bumili ng ETH", "buy": "Bumili ng {{ticker}}", + "on_network": "sa {{networkName}}", + "debit_card": "Debit card", + "continue": "Magpatuloy", + "powered_by_provider": "Pinapagana ng {{provider}}", "purchased_currency": "Bumili ng {{currency}}", "network_not_supported": "Hindi sinusuportahan ang kasalukuyang network", "switch_network": "Lumipat sa Mainnet", @@ -4609,7 +4679,7 @@ "second_line": "bumili?" }, "buy_ticker": "Bumili ng {{ticker}}", - "buy_ticker_stablecoins": "Bumili ng {{ticker}} at mga Stablecoin", + "buy_ticker_stablecoins": "Bumili ng mga {{ticker}} at stablecoin", "multiple_payment_methods": "Maraming paraan ng pagbabayad", "debit_credit_bank_transfers_country": "Debit/credit at mga bank transfer batay sa bansa.", "debit_credit_bank_transfers_more_country": "Debit/credit, mga bank transfer, at iba pa batay sa bansa.", @@ -4676,6 +4746,14 @@ "subtitle_5": "at tingnan kung magkano ang halaga ng gas.", "cta": "Magpatuloy sa pagbili ng {{ticker}}" } + }, + "build_quote_settings_modal": { + "title": "Mga Setting", + "view_order_history": "Tingnan ang history ng order", + "contact_support": "Kontakin ang suporta", + "log_out": "Mag-log out sa {{provider}}", + "logged_out_success": "Matagumpay na na-log out", + "logged_out_error": "Error sa pag-log out" } }, "fiat_on_ramp_aggregator": { @@ -4706,7 +4784,7 @@ "use_new_buy_experience_description": "Lumipat sa bagong bersyon" }, "onboarding": { - "what_to_expect": "Ano ang Aasahan", + "what_to_expect": "Ano ang aasahan", "quotes": "Pinagsasama-sama ng aming tampok sa pagbili ng crypto ang mga quote mula sa mga pinagsama-samang vendor, na nagbibigay sa iyo ng pinakamahusay na quote mula sa mga pinagmulan na iyon para direktang maipasok mo ang crypto sa iyong wallet nang walang panahon ng paghihintay.", "quotes_sell": "Ngayon, makakapag-cash out ka na nang direkta sa MetaMask! Makakuha ng mga pinakabagong quote mula sa mga mapagkakatiwalaang provider habang ginagabayan ka namin sa kabuuan ng proseso.", "benefits": "Mas mababa ang gas fee, at mas maraming network, token at paraan ng pagbabayad na sinusuportahan", @@ -4761,7 +4839,7 @@ "get_quotes": "Humingi ng quote", "done": "Tapos na", "fetching_quotes": "Kumukuha ng quotes", - "select_a_quote": "Pumili ng Quote", + "select_a_quote": "Piliin ang quote", "recommended_quote": "Inirerekomendang quote", "select_a_cryptocurrency": "Pumili ng cryptocurrency", "select_a_cryptocurrency_description": "Pumili mula sa listahan ng mga token na available.", @@ -4819,15 +4897,16 @@ "region": { "buy_crypto_tokens": "Bumili ng mga crypto token", "sell_crypto_tokens": "Magbenta ng mga crypto token", - "title": "Piliin ang iyong Rehiyon", + "title": "Piliin ang iyong rehiyon", "description": "Ang mga paraan ng pagbabayad at mga token na magagamit mo ay tinutukoy ng aming mga integrasyon ng third-party at maaaring magbago depende sa iyong rehiyon at suporta ng aming mga integrasyon.", "sell_description": "Maaaring mag-iba-iba ang mga opsyon sa destinasyon ng pera at mga token depende sa iyong rehiyon.", + "region_variation_notice": "Ang mga paraan ng pagbabayad at mga available na token ay maaaring naiiba batay sa iyong rehiyon at aming mga tagapaglaan.", "search_by_country": "Maghanap ayon sa bansa", "search_by_state": "Maghanap ayon sa estado", "no_region_results": "Walang mga tugmang rehiyon", "your_region": "Rehiyon mo", "select_region": "Piliin ang iyong rehiyon", - "select_region_title": "Piliin ang iyong Rehiyon", + "select_region_title": "Piliin ang iyong rehiyon", "select_country_registered": "Piliin ang bansa kung saan nakarehistro ang iyong card (saan ka man nakatira).", "unsupported": "Hindi sinusuportahan ang rehiyon", "unsupported_description": "Nagsusumikap kaming palawigin ang saklaw sa iyong rehiyon sa lalong madaling panahon. Pansamantala, tingnan ang aming artikulo ng suporta para sa iba pang mga paraan na maaari kang {{rampType}} ng crypto.", @@ -4849,7 +4928,7 @@ "continue_order_description": "Para ipagpatuloy ang iyong order, kailangan mong piliin ang button sa ibaba ng page na ito.", "the_provider": "ang provider", "processing": "Pinoproseso ang order", - "processing_card_description": "Ang pagbili gamit ang Credit/Debit ay karaniwang tumatagal ng ilang minuto", + "processing_card_description": "Karaniwang tumatagal nang ilang minuto ang mga pagbili gamit ang Credit/debit card", "processing_bank_description": "Karaniwang tumatagal nang ilang araw ng negosyo ang mga bank transfer", "details": "Mga detalye ng order", "via": "sa pamamagitan ng", @@ -4863,7 +4942,7 @@ "support": "Suporta", "view_order_status": "Tingnan ang katayuan ng order sa {{provider}}", "id": "Order ID", - "date_and_time": "Petsa at Oras", + "date_and_time": "Petsa at oras", "payment_method": "Paraan ng pagbabayad", "destination": "Destinasyon", "token_amount": "Halaga ng token", @@ -4883,11 +4962,11 @@ "sent": "Nagpadala!" }, "notifications": { - "purchase_failed_title": "Nabigo ang pagbili ng {{currency}}! Pakisubukan ulit, pasensya na sa abala!", + "purchase_failed_title": "Nabigo ang pagbili ng {{currency}}. Pansamantala ay hintaying muli.", "purchase_failed_description": "I-verify ang iyong paraan ng pagbabayad at suporta sa card", "purchase_cancelled_title": "Kinansela ang iyong pagbili", "purchase_cancelled_description": "I-verify ang iyong paraan ng pagbabayad at suporta sa card", - "purchase_completed_title": "Matagumpay ang pagbili mo ng {{amount}} {{currency}}!", + "purchase_completed_title": "Matagumpay ang pagbili mo ng {{amount}} {{currency}}.", "purchase_completed_description": "Available na ang iyong {{currency}}", "purchase_pending_title": "Pinoproseso ang pagbili mo ng {{currency}}", "purchase_pending_description": "Tatagal lang ito nang ilang minuto...", @@ -4896,7 +4975,7 @@ "sale_cancelled_title": "Kinansela ang order", "sale_cancelled_description": "Hindi makumpleto ang iyong order.", "sale_completed_title": "Nakumpleto ang order", - "sale_completed_description": "Matagumpay ang iyong order!.", + "sale_completed_description": "Matagumpay ang iyong order.", "sale_pending_title": "Pinoproseso ang pagbenta ng {{currency}}", "sale_pending_description": "Pinoproseso na ang iyong order.", "no_date": "Hindi Kilala" @@ -4921,7 +5000,7 @@ "start_swapping": "Simulang mag-swap" }, "feature_off_title": "Pansamantalang hindi available", - "feature_off_body": "Kasalukuyang minementina ang MetaMask Swaps. Bumalik sa ibang pagkakataon.", + "feature_off_body": "MetaMask Swaps are undergoing maintenance. Please check back later.", "wrong_network_title": "Hindi available ang mga swap", "wrong_network_body": "Makakapag-swap ka lang ng mga token sa Ethereum Main Network.", "unallowed_asset_title": "Hindi masa-swap ang token na ito", @@ -5002,7 +5081,7 @@ "edit": "I-edit", "quotes_include_fee": "Kasama sa quote ang {{fee}}% na bayarin sa MetaMask", "quotes_include_gas_and_metamask_fee": "Kasama na sa quote ang bayad sa gas at {{fee}}% bayad sa MetaMask", - "tap_to_swap": "I-tap para I-swap", + "tap_to_swap": "Tap to swap", "swipe_to_swap": "I-swipe para i-swap", "swipe_to": "I-swipe para", "swap": "Mag-swap", @@ -5130,7 +5209,7 @@ "contact_support": "Kontakin ang suporta" }, "whats_new": { - "title": "Ano'ng Bago", + "title": "Ano'ng bago", "remove_gns_new_ui_update": { "title": "Bagong update ng UI", "introduction": "Gumawa kami ng mga update upang pagbutihin ang karanasan sa app.", @@ -5302,7 +5381,7 @@ }, "network_information": { "things_to_keep_in_mind": "Mga bagay na dapat tandaan", - "testnet_network": "{{type}} Testnet", + "testnet_network": "{{type}} testnet", "first_description": "Ang native token sa network na ito ay {{ticker}}. Ito ang token na ginagamit pambayad sa gas.", "second_description": "Kapag sinubukan mong ipadala ang mga asset nang direkta mula sa isang network patungo sa iba, maaari itong magresulta sa permanenteng pagkawala ng asset. Tiyaking gumamit ng tulay.", "third_description": "Maaaring hindi awtomatikong lumabas ang iyong mga token sa iyong wallet.", @@ -5385,7 +5464,7 @@ "learn_more": "Matuto pa" }, "token_allowance": { - "verify_third_party_details": "Beripikahin ang mga detalye ng third party", + "verify_third_party_details": "Verify third-party details", "protect_from_scams": "Para protektahan ang iyong sarili laban sa mga manloloko, maglaan ng ilang sandali upang beripikahin ang mga detalye ng third party.", "learn_to_verify": "Matutunan kung paano beripikahin ang mga detalye ng third party", "spending_cap": "limitasyon sa paggastos", @@ -5399,7 +5478,7 @@ }, "restore_wallet": { "restore_needed_title": "Kinailangang ibalik", - "restore_needed_description": "Nagkaproblema pero huwag mag-alala! Subukan natin muli na ibalik ang iyong wallet.", + "restore_needed_description": "Something went wrong, but don’t worry! Let’s try to restore your wallet.", "restore_needed_action": "Ibalik ang wallet" }, "wallet_restored": { @@ -5545,7 +5624,7 @@ "add_bitcoin_account": "Bitcoin account", "add_solana_account": "Solana account", "add_tron_account": "Account sa Tron", - "switch_to_smart_account": "Lumipat sa Smart account", + "switch_to_smart_account": "Lumipat sa smart account", "rename_account": "Palitan ang pangalan ng account", "addresses": "Mga Address", "headers": { @@ -5598,6 +5677,10 @@ "error_description": "Nabigo ang pag-install ng {{snap}}." }, "earn": { + "claimable_bonus_tooltip": "An annual bonus claimable daily from your wallet.", + "earn_a_percentage_bonus": "Earn a {{percentage}}% bonus", + "claimable_bonus": "Claimable bonus", + "claim_bonus": "Claim bonus", "empty_state_cta": { "heading": "Magpahiram ng {{tokenSymbol}} at kumita ng", "body": "Ipahiram ang iyong {{tokenSymbol}} sa {{protocol}} at kumita", @@ -5681,21 +5764,36 @@ "fee": "Bayarin" }, "musd_conversion": { - "convert_to_musd": "Convert to mUSD", + "ok": "OK", + "continue": "Continue", + "convert_and_get_percentage_bonus": "I-convert at makakuha ng {{percentage}}%", + "get_a_percentage_musd_bonus": "Makakuha ng {{percentage}}% mUSD bonus", + "convert": "I-convert", "toasts": { - "converting": "Converting {{token}} → mUSD", + "converting": "Ikino-convert ang {{token}} → mUSD", "eta": "~{{time}}", - "delivered": "Your mUSD has been delivered!", - "failed": "mUSD conversion failed" + "delivered": "Ang mUSD mo ay narito na!", + "failed": "Nabigong palitan ang mUSD" }, "education": { - "heading": "Kumita ng mga reward gamit ang mUSD", - "description": "Convert your USDC, USDT, or DAI for mUSD, MetaMask’s dollar-backed stablecoin.Earn points every time you convert or hold $100.", - "continue_button": "Magsimula" + "heading": "MAKAKUHA NG {{percentage}}% SA\nMGA STABLECOIN", + "description": "Convert your stablecoins to mUSD, MetaMask’s US dollar-backed stablecoin, and receive up to a {{percentage}}% bonus.", + "terms_apply": "Terms apply.", + "primary_button": "Magsimula", + "secondary_button": "Hindi sa ngayon" }, - "earn_points_daily": "Earn points daily", - "buy_musd": "Buy mUSD", - "get_musd": "Get mUSD" + "buy_musd": "Bumili ng mUSD", + "get_musd": "Kumuha ng mUSD", + "boost_title": "Get {{percentage}}% on your stablecoins", + "boost_description": "Convert your stablecoins to mUSD and receive up to a {{percentage}}% bonus.", + "powered_by_relay": "Pinapagana ng Relay" + }, + "bonus_claim": { + "toasts": { + "claiming": "Your mUSD bonus is processing", + "delivered": "Your mUSD bonus is here!", + "failed": "Bonus claim failed" + } }, "rewards": { "rewards_tag_label": "Mga Reward", @@ -5711,22 +5809,22 @@ "stake": "Mag-stake", "earn": "Kumita", "tron": { - "stake_completed": "Staking completed", - "stake_completed_description": "Your staking transaction has been completed successfully.", - "stake_failed": "Staking failed", + "stake_completed": "Nakumpleto ang pag-stake", + "stake_completed_description": "Matagumpay na nakumpleto ang transaksyon mo na pag-stake.", + "stake_failed": "Nabigo ang pag-stake", "unstake_completed": "Nakumpleto ang pag-unstake", - "unstake_completed_description": "Your unstaking transaction has been completed successfully.", - "unstake_failed": "Unstaking failed", + "unstake_completed_description": "Matagumpay na nakumpleto ang transaksyon mo na pag-unstake.", + "unstake_failed": "Nabigo ang pag-unstake", "bandwidth": "Bandwidth", "energy": "Enerhiya", "estimated_annual_reward": "Tinatayang taunang reward", - "trx_locked_for": "TRX locked for", - "trx_locked_for_minimum_time": "~3 days", - "trx_released_in": "TRX released in", - "trx_released_in_minimum_time": "~14 days", + "trx_locked_for": "Naka-lock ang TRX ng", + "trx_locked_for_minimum_time": "~3 araw", + "trx_released_in": "Ilalabas ang TRX pagkalipas ng", + "trx_released_in_minimum_time": "~14 na araw", "fee": "Bayarin", "errors": { - "insufficient_balance": "You don't have enough resource balance to do this action." + "insufficient_balance": "Wala kang sapat na balanse ng mapagkukunan para gawin ang aksyong ito." } }, "stake_eth": "Mag-stake ng ETH", @@ -5772,12 +5870,19 @@ "learn_more_with_period": "Matuto pa." }, "stake_your_trx_cta": { - "title": "Lend Tron and earn", - "description_start": "Stake your Tron and earn ", + "title": "Magpahiram ng Tron at kumita", + "description_start": "I-stake ang Tron mo at kumita ", "description_end": " taun-taon.", "learn_more": "Matuto pa.", "earn_button": "Kumita" }, + "trx_learn_more": { + "title": "Stake TRX and earn", + "stake_any_amount": "Stake any amount of TRX.", + "earn_trx_rewards": "Kumita ng mga TRX reward.", + "earn_trx_rewards_description": "Simulang kumita sa sandaling mag-stake ka. Awtomatikong naiipon ang mga reward.", + "flexible_unstaking_description": "Unstake anytime. Unstaking takes 14 days to process." + }, "day": { "zero": "", "one": "araw", @@ -5981,7 +6086,7 @@ "switch_account_type": "Pag-update ng account", "approve": "Aprubahan ang kahilingan", "perps_deposit": "Magdagdag ng pondo", - "predict_deposit": "Magdagdag ng mga pondo para sa prediksyon", + "predict_deposit": "Magdagdag ng mga pondo para sa Prediksyon", "predict_withdraw": "Mag-withdraw" }, "sub_title": { @@ -6002,14 +6107,15 @@ "transaction_fee": "Isa-swap namin ang iyong mga token para sa USDC sa HyperCore, ang network na ginagamit ng Perps. Maaaring maningil ng bayarin ang mga swap provider, ngunit hindi ang MetaMask." }, "predict_deposit": { - "transaction_fee": "Isu-swap namin ang mga token mo para sa USDE.e sa Polygon, ang network na ginamit ng Predict. Maaaring maningil ang mga swap provider, ngunit hindi ang MetaMask." + "transaction_fee": "Isu-swap namin ang mga token mo para sa USDE.e sa Polygon, ang network na ginamit ng mga Prediksyon. Maaaring maningil ang mga swap provider, ngunit hindi ang MetaMask." }, "musd_conversion": { - "transaction_fee": "mUSD conversion fees include network costs and may include provider fees." + "transaction_fee": "Kasama sa mga bayarin sa palitan ng mUSD ang mga gastos sa network at maaaring may kasamang bayarin sa provider." }, "title": { "transaction_fee": "Mga Bayarin" - } + }, + "network_fee": "Nagbabago ang bayad sa network depende kung gaano karami ang gumagamit at kung gaano kahirap ang transaksyon mo." }, "spending_cap": "Limitasyon sa paggastos", "withdraw": "I-withdraw", @@ -6026,7 +6132,7 @@ "qr_get_sign": "Get signature", "qr_scan_text": "I-scan gamit ang iyong wallet na hardware", "sign_with_ledger": "Pumirma gamit ang Ledger", - "smart_account": "Smart Account", + "smart_account": "Smart account", "smart_contract": "Smart contract", "standard_account": "Standard account", "siwe_message": { @@ -6061,7 +6167,7 @@ "unavailable": "Hindi available" }, "7702_functionality": { - "smartAccountLabel": "Smart Account", + "smartAccountLabel": "Smart account", "standardAccountLabel": "Standard account", "switch": "Lumipat", "switchBack": "Lumipat pabalik", @@ -6078,7 +6184,7 @@ }, "includes_transaction": "Kasama ang {{transactionCount}} (na) transaksyon", "useSmartAccount": "Gumamit ng smart account", - "successful": "Matagumpay!", + "successful": "Tagumpay", "success_message": "Maa-update sa smart account ang iyong account sa susunod mong transaksyon." }, "edit_spending_cap_modal": { @@ -6086,9 +6192,9 @@ "cancel": "Kanselahin", "description": "Ilagay ang halagang komportable kang gastusin sa ngalan mo.", "invalid_number_error": "Dapat na numero ang iyong limitasyon sa paggastos", - "no_empty_error": "Hindi maaaring walang laman ang iyong limitasyon sa paggastos", - "no_extra_decimals_error": "Hindi maaaring mas marami ang decimal ng iyong limitasyon sa paggastos kaysa sa token", - "no_zero_error": "Hindi maaaring 0 ang iyong limitasyon sa paggastos", + "no_empty_error": "Spending cap can't be empty", + "no_extra_decimals_error": "Spending cap can't have more decimals than the token", + "no_zero_error": "Spending cap can't be 0", "no_zero_error_decrease_allowance": "Walang epekto ang 0 na limitasyon sa paggastos sa 'decreaseAllowance' na paraan", "no_zero_error_increase_allowance": "Walang epekto ang 0 na limitasyon sa paggastos sa 'increaseAllowance' na paraan", "save": "I-save", @@ -6119,7 +6225,7 @@ "edit_amount_done": "Magpatuloy", "deposit_edit_amount_done": "Magdagdag ng pondo", "deposit_edit_amount_predict_withdraw": "Mag-withdraw", - "deposit_edit_amount_musd_conversion": "Convert to mUSD" + "deposit_edit_amount_musd_conversion": "I-convert sa mUSD" }, "change_in_simulation_modal": { "title": "Nagbago ang mga resulta", @@ -6144,6 +6250,8 @@ "confirm_swap": "Mag-swap", "terms_and_conditions": "Mga Tuntunin at Kundisyon", "select_token": "Pumili ng token", + "no_tokens_found": "Walang nakitang token", + "no_tokens_found_description": "We couldn't find any tokens with this name. Try a different search.", "select_network": "Pumili ng network", "all_networks": "Lahat ng network", "num_networks": "{{numNetworks}} (na) network", @@ -6151,6 +6259,7 @@ "select_all_networks": "Piliin lahat", "deselect_all_networks": "Alisin ang pagkakapili sa lahat", "see_all": "Tingnan lahat", + "all": "Lahat", "apply": "Ilapat", "slippage": "Slippage", "slippage_info": "Kung magbabago ang presyo sa pagitan ng oras ng paglalagay mo ng order at sa oras na nakumpirma ito, tinatawag itong “slippage”. Awtomatikong makakansela ang iyong pag-swap kung lalampas ang slippage sa katanggap-tanggap na itinakda mo rito.", @@ -6191,9 +6300,9 @@ "title": "Mag-bridge", "submitting_transaction": "Isinusumite", "fetching_quote": "Kumukuha ng quote", - "fee_disclaimer": "Kabilang ang {{feePercentage}}% na bayad sa MM.", + "fee_disclaimer": "Includes {{feePercentage}}% MetaMask fee.", "no_mm_fee": "Walang bayad sa MM", - "no_mm_fee_disclaimer": "Walang bayad sa MM na isu-swap sa {{destTokenSymbol}}.", + "no_mm_fee_disclaimer": "No MetaMask fee swapping into {{destTokenSymbol}}.", "hardware_wallet_not_supported": "Hindi pa sinusuportahan ang mga wallet na hardware. Gumamit ng hot wallet para magpatuloy.", "hardware_wallet_not_supported_solana": "Hindi pa sinusuportahan ang mga wallet na hardware sa Solana. Gumamit ng hot wallet para magpatuloy.", "price_impact_info_title": "Epekto ng presyo", @@ -6208,15 +6317,7 @@ "approval_tooltip_content": "Pinapayagan mo ang pag-access sa tinukoy na halaga, {{amount}} {{symbol}}. Hindi ia-access ng kontrata ang anumang karagdagang pondo.", "minimum_received": "Minimum received", "minimum_received_tooltip_title": "Minimum received", - "minimum_received_tooltip_content": "Ang pinakamababang halaga na iyong matatanggap kapag nagbago ang presyo habang pinoproseso ang iyong transaksyon, batay sa iyong slippage tolerance. Pagtantiya ito mula sa aming mga liquidity provider. Posibleng mag-iba ang pinal na halaga.", - "verified_token": "Na-verify na token", - "price": "Presyo", - "percent_change": "Pagbabago ng porsiyento", - "volume": "Volume", - "market_cap_fdv": "Market cap (FDV)", - "listed_on": "Nakalista sa", - "centralized_exchanges": "Mga sentralisadong palitan", - "contract_address": "Address ng kontrata" + "minimum_received_tooltip_content": "Ang pinakamababang halaga na iyong matatanggap kapag nagbago ang presyo habang pinoproseso ang iyong transaksyon, batay sa iyong slippage tolerance. Pagtantiya ito mula sa aming mga liquidity provider. Posibleng mag-iba ang pinal na halaga." }, "quote_expired_modal": { "title": "Available ang mga bagong quote", @@ -6290,12 +6391,12 @@ "title": "Pagbawi sa wallet", "login_with_social": "Mag-log in sa mga social account", "setup": "I-set up", - "secret_recovery_phrase": "Lihim na parirala sa pagbawi {{num}}", + "secret_recovery_phrase": "Secret Recovery Phrase {{num}}", "back_up": "Mag-back up", "reveal": "Ipakita", "social_recovery_title": "PAGBAWI SA {{authConnection}}", "social_recovery_enable": "Pinagana", - "social_login_description": "Gamitin ang iyong {{authConnection}} login at password sa MetaMask para mabawi ang iyong account at mga lihim na parirala sa pagbawi.", + "social_login_description": "Gamitin ang iyong {{authConnection}} login at MetaMask password para mabai ang iyong account at Mga Lihim na Parirala sa Pagbawi (Secret Recovery Phrases).", "srps_title": "MGA LIHIM NA PARIRALA SA PAGBAWI", "srps_description": "Pinakaprotektado ang iyong wallet kapag naka-set up ang dalawang paraan ng pagbawi. Kapag hindi gumana ang isa, matutulungan ka ng isa pa na mabawi ang iyong wallet." }, @@ -6349,7 +6450,7 @@ "section_1_title": "Ano ang mga account na multichain?", "section_1_description": "Isang account lang, may mga address sa lahat ng network na sinusuportahan ng MetaMask. Kaya ngayon, maaari mong gamitin ang Ethereum, Solana, at iba pa nang hindi kailangang magpalit ng account.", "section_2_title": "Parehong address, mas maraming network", - "section_2_description": "Pinaggrupo na namin ang iyong mga account, kaya magpatuloy lang gamitin ang MetaMask gaya ng dati. Ligtas at hindi nagbago ang iyong mga pondo", + "section_2_description": "Pinaggrupo na namin ang iyong mga account, kaya magpatuloy lang gamitin ang MetaMask gaya ng dati. Ligtas at hindi nagbago ang iyong mga pondo.", "view_accounts_button": "Tingnan ang mga account", "learn_more_button": "Matuto pa", "setting_up_accounts": "Sinet-set up ang iyong mga account" @@ -6511,8 +6612,10 @@ }, "card_onboarding": { "title": "Gumastos \nat \nKumita", - "description": "Ang MetaMask Card ang mabilis at madaling paraan para gastusin ang crypto mo na parang cash at makakuha ng mga reward.", + "description": "Ang MetaMask Card ang mabilis at madaling paraan para gastusin ang crypto mo at kumita ng 3% na cashback.", "apply_now_button": "Mag-apply ngayon", + "login_button": "Mag-log in", + "not_now_button": "Hindi sa ngayon", "sign_up": { "title": "Magsimula na tayo", "description": "Gawin ang MetaMask Card account mo, na hatid ng Crypto Life. Hiwalay ito sa MetaMask account mo.", @@ -6540,6 +6643,7 @@ "phone_number_label": "Ilagay ang numero ng telepono", "country_area_code_label": "Area code ng bansa", "invalid_phone_number": "Di-wastong numero ng telepono", + "invalid_us_phone_number": "Ilagay ang wastong numero ng telepono ng US (10 digit) para magpatuloy.", "legal_terms": "Sa pagpapatuloy, sumasang-ayon kang makatanggap ng text para i-verify ang numero ng telepono." }, "confirm_phone_number": { @@ -6576,8 +6680,8 @@ "terms": "Karaniwang tumatagal ang mga pag-apruba nang humigit-kumulang 12 oras. Aabisuhan ka namin kapag may desisyon na." }, "verifying_veriff_kyc": { - "title": "Bini-verify ang iyong pagkakakilanlan", - "description": "Maghintay habang vine-verify namin ang pagkakakilanlan mo.", + "title": "Naghihintay ng pag-apruba", + "description": "Kailangang i-verify ng aming partner ang iyong pagkakakilanlan mo para aprubahan ang aplikasyon mo.", "helper_text": "Karaniwan itong tumatagal nang ilang segundo. Huwag isara ang app." }, "verifying_registration": { @@ -6614,7 +6718,7 @@ }, "physical_address": { "title": "Ilagay ang address mo", - "description": "Ilagay ang address ng tirahan mo. Kapag naaprubahan, ipapadala namin dito ang aktwal mong card.", + "description": "Ilagay ang kasalukuyang address ng tirahan mo. Gagamitin namin ito para sa pag-verify.", "address_line_1_label": "Linya 1 ng address", "address_line_2_label": "Linya 2 ng address", "city_label": "Lungsod", @@ -6622,7 +6726,7 @@ "zip_code_label": "Zip code", "country_label": "Bansa", "electronic_consent_1": "Sumasang-ayon ako sa E-Sign Act Consent and Disclosure at na makatanggap ng lahat ng komunikasyon sa elektronikong paraan. ", - "electronic_consent_2": "View document(PDF)" + "electronic_consent_2": "Tingnan ang dokumento (PDF)" }, "mailing_address": { "title": "Address ng koreo", @@ -6668,22 +6772,24 @@ } }, "card_home": { + "title": "Card", + "available_balance": "Available na balanse", "error_title": "Hindi makuha ang data", "error_description": "Mukhang may isyu na humahadlang sa iyong tingnan ang nilalaman ng page na ito. Suriin ang iyong koneksyon o subukang i-refresh ang page.", "try_again": "Subukang muli", - "limited_spending_warning": "Posibleng limitado ang aktwal na kakayahan mong gumastos. Para ayusin ang limitasyon mo, pumunta sa {{manageCard}}", + "limited_spending_warning": "Posibleng limitado ang aktwal na kakayahan mong gumastos. Para ayusin ang limitasyon mo, pumunta sa ", "add_funds": "Magdagdag ng mga pondo", "change_asset": "Baguhin ang asset", "enable_card_button_label": "Paganahin ang card", "enable_assets_button_label": "I-enable ang mga asset", "spending_limit_warning": "Malapit mo nang maabot ang limit ng paggastos. Mag-update para maiwasan ang hindi pagtanggap.", "logout": "Mag-log out", - "logout_description": "Mag-log out mula sa iyong MetaMask Card account", "logout_confirmation_title": "I-log out ang Card?", "logout_confirmation_message": "Sigurado ka bang gusto mong mag-log out sa MetaMask Card account mo?", "logout_confirmation_cancel": "Kanselahin", "logout_confirmation_confirm": "Mag-log out", "enable_card_error": "Hindi napagana ang card. Subukan ulit mamaya.", + "view_card_details_error": "Unable to load card details. Please try again.", "warnings": { "close_spending_limit": { "title": "Malapit mo nang maabot ang limitasyon mo sa paggastos", @@ -6706,11 +6812,21 @@ "blocked": { "title": "Naka-block ang iyong card", "description": "Pakikontakin ang suporta mo para ma-unblock ang iyong card" + }, + "kyc_pending": { + "title": "Kasalukuyan ang pag-verify", + "description": "Your identity verification is being reviewed. This typically takes less than 12 hours." + } + }, + "messages": { + "card_provisioning": { + "title": "Card being created", + "description": "Your card is being created. This may take a few moments." } }, "kyc_status": { "pending": { - "title": "Kasalukuyan ang Pag-verify", + "title": "Kasalukuyan ang pag-verify", "description": "Ipinoproseso ang pag-verify ng pagkakakilanlan mo. Karaniwan itong tumatagal nang ilang minuto. Bumalik kaagad para paganahin ang card mo." }, "rejected": { @@ -6729,33 +6845,46 @@ "ok_button": "OK" }, "manage_card_options": { - "manage_spending_limit": "Pamahalaan ang limitasyon sa paggastos", + "view_card_details": "View card details", + "hide_card_details": "Hide card details", + "view_card_details_description": "Card number, expiration and CVV", + "manage_spending_limit": "Manage limit", "manage_spending_limit_description_restricted": "Naka-on ang limitadong paggastos", "manage_spending_limit_description_full": "Naka-on ang buong pag-access", "manage_card": "Pamahalaan ang card", - "advanced_card_management_description": "Tingnan ang mga detalye ng card, mga transaksyon at higit pa", + "advanced_card_management_description": "See activity, cashback, freeze card, and more", "travel_title": "MetaMask Travel", - "travel_description": "Mag-book ng mga hotel na may hanggang 60% diskuwento kumpara sa Expedia", - "card_tos_title": "Mga Tuntunin at Kundisyon ng Card", - "card_tos_description": "Basahin ang mga tuntunin ng provider ng card" + "travel_description": "Book hotels with up to 70% discounts", + "card_tos_title": "Terms and conditions" } }, "card_spending_limit": { "title_change_token": "Palitan ang token at network", "title_enable_token": "Paganahin ang token", + "title_onboarding": "Paganahin ang paggastos", + "setup_title": "Set up your card", + "setup_description": "Select the token you'd like to use and set a limit for how much you can spend.", + "asset_label": "Asset", + "limit_label": "Limit", + "other_token": "Other", "full_access_title": "Buong pag-access", - "full_access_description": "Maaaring awtomatikong gamitin ng card ang iyong pondo nang hindi kailangang humingi ng pahintulot sa bawat paggamit.", - "restricted_limit_title": "Limitadong paggastos", - "restricted_limit_description": "Kailangan mong bumalik at magbayad ng network fee sa bawat pagkakataon na gusto mong taasan ang limit.", + "full_access_description": "Your card can use your funds automatically without asking for approval each time.", + "restricted_limit_title": "Limit sa Paggastos", + "restricted_limit_description": "Maaari ka lamang gumastos nang hanggang sa limit na ito. Magbabayad ka ng bayarin sa network sa tuwing mababago ang limit na ito.", "edit_limit": "I-edit ang limitasyon", "confirm_new_limit": "Kumpirmahin", "cancel": "Kanselahin", + "skip": "Laktawan muna", "set_new_limit": "Magtakda ng limitasyon", "dismiss": "I-dismiss", "update_success": "Matagumpay na na-update ang limit ng paggastos", "update_error": "Hindi na-update ang limit ng paggastos", "solana_not_supported": "Paganahin ang mga token ng Solana sa card.metamask.io", - "select_token": "Pumili ng token" + "select_token": "Pumili ng token", + "loading": "Naglo-load ng mga available na token...", + "load_error": "Hindi makapag-load ng mga token. Pakisubukan muli.", + "retry": "Subukang muli", + "on_linea": "sa Linea" }, "change_asset": { "title": "Palitan ang token at network", @@ -6793,6 +6922,7 @@ "signup_button": "Mag-sign up", "errors": { "invalid_credentials": "Di-wastong mga detalye ng login", + "invalid_otp_code": "Maling code, pakisubukan muli", "unknown_error": "Hindi matukoy na error, subukan ulit sa ibang pagkakataon", "email_required": "Kinakailangan ang email", "password_required": "Kinakailangan ang password", @@ -6811,7 +6941,7 @@ "description_without_phone_number": "Nagpadala kami ng confirmation code sa numero ng telepono mo. Pakilagay ang code para magpatuloy.", "confirm_code_label": "Code ng kumpirmasyon", "confirm_button": "Kumpirmahin", - "back_to_login_button": "Bumalik sa Pag-login", + "back_to_login_button": "Bumalik sa pag-login", "didnt_receive_code": "Hindi natanggap ang code? ", "resend_verification": "Ipadala itong muli", "resend_cooldown": "Ipadala muli ang available sa pagkalipas ng {{seconds}} segundo" @@ -6839,8 +6969,8 @@ }, "rewards": { "auth_fail_title": "Hindi kilalang error.", - "auth_fail_description": "May naganap na hindi nakikilalang error habang ina-authenticate ang account na ito gamit ang programa ng mga reward. Pakisubukang muli mamaya.", - "failed_to_authenticate": "Nabigong ma-authenticate gamit ang programa ng mga reward", + "auth_fail_description": "May naganap na hindi nakikilalang error habang ina-authenticate ang account na ito gamit ang mga Reward ng MetaMask. Pakisubukang muli mamaya.", + "failed_to_authenticate": "Nabigong ma-authenticate gamit ang programa ng mga Reward ng MetaMask", "not_implemented": "Paparating na", "not_implemented_season_summary": "Paparating na ang buod ng season", "optin_error": { @@ -6867,6 +6997,10 @@ "error_fetching_description": "Suriin ang iyong koneksyon at subukang muli.", "retry_button": "Subukang muli" }, + "linea_tokens": { + "default_title": "$LINEA", + "title_earned": "Kumita ka ng {{amount}} $LINEA" + }, "upcoming_rewards_error": { "error_fetching_title": "Hindi mai--load ang rewards", "error_fetching_description": "Suriin ang iyong koneksyon at subukang muli.", @@ -6898,6 +7032,15 @@ "claim_reward_error": { "title": "Nabigong ma-claim ang reward" }, + "metal_card_claim": { + "title": "Bawiin ang iyong reward", + "description": "Ang MetaMask Metal Card ay may mga kundisyon sa pagiging kwalipikado at hindi available sa lahat ng rehiyon. Kung hindi ka kwalipikado, makakatanggap ka na lang ng isang eksklusibong premium merch reward bilang kapalit.", + "contact_info": "Ibahagi ang iyong impormasyon sa pakikipag-ugnayan at makakatanggap ka ng tugon sa loob ng 2 linggo mula sa amin sa @MidwitMilhouse sa Telegram o sa christian.montoya@consensys.net.", + "email_label": "Email", + "email_validation_error": "Paki-lagay ang wastong valid email address", + "telegram_label": "Ginagamit na Telegram", + "telegram_placeholder": "Opsyonal" + }, "accounts_opt_in_state_error": { "error_fetching_title": "Hindi mai-load ang mga account", "error_fetching_description": "Suriin ang iyong koneksyon at subukang muli.", @@ -6979,7 +7122,7 @@ "gtm_title": "Narito na ang mga reward", "gtm_description": "Mag-ipon ng points mula sa aktibidad mo. \nMagpatuloy sa mas mataas na antas upang ma-unlock ang mga reward.", "gtm_confirm": "Magsimula", - "intro_title": "Ang Season 1 \nay Live", + "intro_title": "Live ang \nSeason 1", "intro_description": "Mag-ipon ng points mula sa aktibidad mo. \nMagpatuloy sa mas mataas na antas upang ma-unlock ang mga reward.", "intro_confirm": "I-claim ang 250 point", "intro_confirm_geo_loading": "Sinusuri ang rehiyon...", @@ -7052,12 +7195,12 @@ "dashboard_modal_info": { "active_account": { "title": "Huwag palampasin", - "description": "Idagdag ang iyong account para simulang makaipon ng puntos mula sa iyong aktibidad.", + "description": "Add your account to Rewards.", "confirm": "Magdagdag ng account" }, "multiple_unlinked_accounts": { - "title": "Simulang makaipon ng mga point", - "description": "Idagdag ang iyong mga account upang madali mong masubaybayan ang iyong mga reward sa isang tingin.", + "title": "Huwag palampasin", + "description": "Add your accounts to Rewards.", "confirm": "Magdagdag ng mga account" }, "account_not_supported": { @@ -7110,10 +7253,10 @@ } }, "predict": { - "title": "Mga market ng prediksyon", + "title": "Mga hula", "description": "20 points kada $10 na prediksyon", "sheet": { - "title": "Mga market ng prediksyon", + "title": "Mga hula", "points": "20 point kada $10", "description": "Makakuha ng points sa bawat $10 na ire-trade mo.", "cta_label": "Mag-browse ng mga market" @@ -7191,6 +7334,19 @@ "time_left": "natitira", "expired": "Nag-expire" }, + "end_of_season_rewards": { + "confirm_label_default": "Kumpirmahin", + "confirm_label_access": "Access", + "redeem_success_title": "Na-redeem na ang reward", + "metal_card_claim_success": "Nakumpirma ang impormasyon ng kontak", + "linea_tokens_claim_success": "Nakumpirma ang address", + "arriving_soon": "Malapit nang dumating", + "check_back_soon": "Tingnan muli sa susunod para ma-claim", + "redeem_failure_title": "Nabigong ma-redeem", + "redeem_failure_description": "Pakisubukan uli mamaya.", + "reward_details": "Mga Detalye ng Reward", + "select_account_description": "Piliin ang account kung saan mo nais ipadala ang reward na ito. Ipamamahagi ang mga token sa loob ng dalawang linggo." + }, "animation": { "could_not_load": "Hindi mai-load" } @@ -7257,13 +7413,13 @@ "still_connecting_network": "Patuloy na kumukonekta sa {{networkName}}...", "unable_to_connect_network": "Hindi makakonekta sa {{networkName}}.", "update_rpc": "I-update ang RPC", + "switch_to_metamask_default_rpc": "Switch to MetaMask default RPC", "check_network_connectivity": "Tingnan ang konektibidad ng network mo.", - "check_network_connectivity_or": "Tingnan ang konektibidad ng network mo o" + "check_network_connectivity_or": "Tingnan ang konektibidad ng network mo o", + "updated_to_metamask_default": "Updated to MetaMask default" }, "trending": { "title": "Explore", - "view_all": "View all", - "tokens": "Mga Token", "trending_tokens": "Trending tokens", "price_change": "Price change", "all_networks": "Lahat ng network", @@ -7295,6 +7451,10 @@ "title": "Trending tokens is not available", "description": "We can't fetch this page right now", "try_again": "Subukang muli" + }, + "empty_search_result_state": { + "title": "Walang nakitang token", + "description": "We were not able to find this token" } }, "ota_update_modal": { diff --git a/locales/languages/tr.json b/locales/languages/tr.json index 5699417f75fe..fe046d83b718 100644 --- a/locales/languages/tr.json +++ b/locales/languages/tr.json @@ -8,7 +8,7 @@ "increment": "Redux Sayacını Artır" }, "pet_name": { - "list_count_text": "Pet names on this network", + "list_count_text": "Bu ağdaki Takma Adlar", "add_pet_name_button": "Add pet name", "address": "Adres", "address_placeholder": "0x...", @@ -193,11 +193,10 @@ "connector": "saat" }, "autocomplete": { - "placeholder": "Token'a, siteye veya adrese göre ara", + "placeholder": "Siteye veya adrese göre ara", "recents": "Yakın Zamanda Gerçekleşenler", "favorites": "Favoriler", - "sites": "Siteler", - "tokens": "Tokenler" + "sites": "Siteler" }, "navigation": { "back": "Geri", @@ -306,7 +305,7 @@ "get_started": "Başla" }, "onboarding_wizard": { - "skip_tutorial": "Skip tutorial", + "skip_tutorial": "Öğreticiyi geç", "coachmark": { "action_back": "Hayır, teşekkürler", "action_next": "Tura çık", @@ -330,12 +329,12 @@ "content3": "hesap adını düzenlemek için uzun dokunun." }, "step4": { - "title": "Main menu", - "content1": "Bu menüden İşlem geçmişi, Ayarlar ve Destek kısımlarına erişim sağlayabilirsiniz.", + "title": "Ana menü", + "content1": "Bu menüden işlem geçmişi, ayarlar ve destek kısımlarına erişim sağlayabilirsiniz.", "content2": "Hesaplarınızla daha fazla işlem yapabilir ve MetaMask ayarlarına erişim sağlayabilirsiniz." }, "step5": { - "title": "Tarayıcıyı Keşfet", + "title": "Tarayıcıyı keşfet", "content1": "Tarayıcıyı kullanarak web3'ü keşfedebilirsiniz" }, "step6": { @@ -596,9 +595,9 @@ "transaction_activity": "Faaliyet", "request_feature": "Bir Özellik Talep Et", "submit_feedback_message": "Gönderilecek geri bildirim türünü seçin.", - "submit_bug": "Bug report", + "submit_bug": "Hata raporu", "submit_general_feedback": "Genel", - "share_address": "Share my public address", + "share_address": "Genel adresimi paylaş", "view_in_etherscan": "Etherscan üzerinde görüntüle", "view_in": "Şurada görüntüle:", "browser": "Tarayıcı", @@ -612,12 +611,13 @@ "lock_cancel": "HAYIR", "feedback": "Geri Bildirim", "metamask_support": "MetaMask Destek", - "public_address": "Public address" + "public_address": "Genel adres" }, "send": { "available": "kullanılabilir", "invalid_value": "Geçersiz değer", "insufficient_funds": "Yetersiz bakiye", + "insufficient_balance_to_cover_fee": "Insufficient balance to cover fees", "continue": "Devam Et", "unit": "birim", "units": "birim", @@ -643,8 +643,8 @@ "no_tokens_available": "Token yok", "sign": "İmzala", "network_not_found_title": "Ağ bulunamadı", - "network_not_found_description": "Zincir kimliği {{chain_id}} olan ağ, cüzdanınızda bulunamadı. Lütfen önce ağı ekleyin.", - "network_missing_id": "Zincir kimliği eksik.", + "network_not_found_description": "Network with chain ID {{chain_id}} not found in your wallet. Please add the network first.", + "network_missing_id": "Missing chain ID.", "search_tokens": "Token ara", "search_tokens_and_nfts": "Token ve NFT ara", "tokens": "Token'lar", @@ -675,13 +675,13 @@ "limitError": "Yatırma limitleriniz kontrol edilemedi. Lütfen daha sonra tekrar deneyin." }, "token_modal": { - "select_a_token": "Bir Token seçin", + "select_a_token": "Bir token seç", "select_token": "Token seç", "search_by_name_or_address": "İsme veya adrese göre token ara", "no_tokens_found": "\"{{searchString}}\" ile eşleşen token yok", "unsupported_token_title": "Mevcut değil", - "unsupported_token_description": "This token may not be available in your region or supported by any local payment providers", - "error_loading_tokens": "Unable to load tokens. Please try again later." + "unsupported_token_description": "Bu token bölgenizde kullanılamıyor veya yerel ödeme sağlayıcı tarafından desteklenmiyor olabilir", + "error_loading_tokens": "Tokenler yüklenemiyor. Lütfen daha sonra tekrar deneyin." }, "networks_filter_bar": { "all_networks": "Tüm ağlar" @@ -696,12 +696,12 @@ "title": "Ayarlar", "view_order_history": "Emir geçmişini görüntüle", "contact_support": "Destek ile iletişime geçin", - "log_out": "Log out of Transak", + "log_out": "Transak oturumunu kapat", "logged_out_success": "Oturum başarılı bir şekilde kapatıldı", "error_sdk_not_initialized": "SDK başlatılmadı", "logged_out_error": "Oturum kapatılırken hata", - "more_ways_to_buy": "More ways to buy", - "more_ways_to_buy_description": "Switch to the classic version" + "more_ways_to_buy": "Daha fazla satın alma yöntemi", + "more_ways_to_buy_description": "Klasik sürüme geç" }, "region_modal": { "select_a_region": "Bir bölge seçin", @@ -714,7 +714,7 @@ "no_state_results": "\"{{searchString}}\" ile eşleşen eyalet yok" }, "payment_modal": { - "select_a_payment_method": "Select a payment method" + "select_a_payment_method": "Bir ödeme yöntemi seç" }, "payment_duration": { "instant": "Anında", @@ -805,7 +805,7 @@ "button": "Kabul et ve devam et" }, "additional_verification": { - "title": "Additional verification", + "title": "Ek doğrulama", "paragraph_1": "Daha büyük para yatırma işlemleri için geçerli bir kimlik belgesine (sürücü belgesi gibi) ve gerçek zamanlı bir selfie'ye ihtiyacınız olacak.", "paragraph_2": "Doğrulamanızı tamamlamak için kameranıza erişimi etkinleştirmeniz gerekecek.", "button": "Devam et" @@ -832,7 +832,7 @@ "dob_invalid": "Lütfen geçerli bir doğum tarihi girin", "ssn_required": "Sosyal güvenlik numarası gereklidir", "unexpected_error": "Beklenmedik bir hata oluştu. Lütfen tekrar deneyin.", - "phone_already_registered": "This phone number is already in use by {{email}}. Log in using this email to continue.", + "phone_already_registered": "Bu telefon numarası zaten {{email}} tarafından kullanılıyor. Devam etmek için bu e-posta adresini kullanarak oturum açın.", "login_with_email": "E-posta ile oturum aç" }, "enter_address": { @@ -844,7 +844,7 @@ "address_line_2": "Adres satırı 2 (isteğe bağlı)", "state": "Eyalet/Bölge", "city": "Şehir", - "postal_code": "Postal/zip code", + "postal_code": "Posta kodu", "country": "Ülke", "select_state": "Eyalet seçin", "address_line_1_required": "Adres satırı 1 gereklidir", @@ -854,7 +854,7 @@ "city_invalid": "Lütfen geçerli bir şehir girin", "state_required": "Eyalet/Bölge gereklidir", "state_invalid": "Lütfen geçerli bir eyalet girin", - "postal_code_required": "Postal/zip code is required", + "postal_code_required": "Posta kodu gereklidir", "postal_code_invalid": "Lütfen geçerli bir posta kodu girin", "unexpected_error": "Beklenmedik hata." }, @@ -903,7 +903,7 @@ "cancel_order_button": "Emri iptal et" }, "order_details": { - "title": "Deposit order", + "title": "Para yatırma emri", "error_title": "Para yatırma emrinizle ilgili bir hata oluştu", "error_message": "Beklenmedik bir hata oluştu." }, @@ -955,30 +955,34 @@ "fetch_payment_methods": "Ödeme yöntemleri alınırken bir sorun oldu.", "fetch_user_details": "Kullanıcı bilgileri alınırken bir sorun oldu.", "try_again": "Tekrar dene", - "error_details_title": "Error details", + "error_details_title": "Hata bilgileri", "see_more": "Daha fazlasını gör" } }, "perps": { - "basic_functionality_disabled_title": "Perps is not available", + "basic_functionality_disabled_title": "Sürekli vadeli işlem sözleşmeleri kullanılamıyor", "title": "Perps", - "perps_trading": "Sürekli Vadeli İşlem Sözleşmeleri ile İşlem", + "perps_trading": "Sürekli vadeli işlem sözleşmeleri ile işlem", "perp_account_balance": "Sürekli vadeli işlem sözleşmesi hesap bakiyesi", - "manage_balance": "Bakiyeyi Yönet", - "total_balance": "Toplam Bakiye", + "manage_balance": "Bakiyeyi yönet", + "total_balance": "Toplam bakiye", "available_balance": "Kullanılabilir bakiye", - "margin_used": "Kullanılan Marj", + "margin_used": "Kullanılan marj", "gtm_content": { "title": "SÜREKLİ VADELİ İŞLEM SÖZLEŞMELERİ BURADA", "title_description": "40 kata kadar kaldıraçla uzun veya kısa pozisyon. Hesabınızı tek tıkta fonlayın.", "not_now": "Şimdi değil", "try_now": "Başlarken" }, + "discovery_banner": { + "title": "{{symbol}} sürekli vadeli işlemi yap", + "subtitle": "K&Z'ni {{leverage}} kadar katla" + }, "today": "Bugün", "yesterday": "Dün", - "unrealized_pnl": "Gerçekleşmemiş Kazanç/Zarar", + "unrealized_pnl": "Gerçekleşmemiş K&Z", "withdraw": "Çek", - "refresh_balance": "Bakiyeyi Yenile", + "refresh_balance": "Bakiyeyi yenile", "add_funds": "Fon ekle", "trade_perps": "Sürekli vadeli işlem sözleşmeleriyle işlem yap", "trade_perps_description": "Bir varlığın vadeli işlem fiyatına yönelik işlem yapmak için sürekli vadeli işlem sözleşmelerini kullanın. Başlamak için sürekli vadeli işlem sözleşmeleri hesabınıza fon ekleyin", @@ -1138,7 +1142,7 @@ "trigger_price": "Tetikleme fiyatı", "liquidation_price": "Likidasyon fiyatı", "fees": "Ücretler", - "estimated_points": "Tah. Puanlar", + "estimated_points": "Tah. puanlar", "market": "Piyasa", "limit": "Limit", "open_orders": "Emirler", @@ -1199,7 +1203,7 @@ "short": "Kısa {{asset}}" }, "tpsl_modal": { - "title": "Kazancı al ve Zararda durdur", + "title": "Kazancı al ve zararda durdur", "save": "Kaydet", "current_price": "Mevcut fiyat: {{price}}", "on": "AÇIK", @@ -1306,8 +1310,8 @@ "cancel": "İptal et", "margin": "Marj", "includes_pnl": "K&Z dahil", - "pnl": "Kazanç/Zarar", - "estimated_pnl": "Tahmini Kazanç/Zarar", + "pnl": "K&Z", + "estimated_pnl": "Tahmini K&Z", "fees": "Ücretler", "receive": "Elinize geçecek miktar:", "you_receive": "Elinize geçecek miktar:", @@ -1414,6 +1418,7 @@ "failedToEstablishAllMids": "Kürsel allMids aboneliği başarısız oldu", "failedToEstablishMarketData": "{{symbol}} için piyasa verileri aboneliği kurulamadı", "failed_to_toggle_network": "Ağ değiştirilemedi", + "failed_to_switch_provider": "Sağlayıcı değiştirilemedi", "noAccountSelected": "Hesap seçilmedi", "unsupportedMethod": "Desteklenmeyen yöntem: {{method}}", "invalidAddressFormat": "Geçersiz adres biçimi: {{address}}", @@ -1452,6 +1457,24 @@ "orderLeverageReductionFailed": "Kaldıracınızı düşüremezsiniz", "insufficientLiquidity": "Emri gerçekleştirmek için likidite yetersiz. Limit emri kullanmayı deneyin veya bir süre sonra tekrar deneyin.", "connectionTimeout": "Bağlantı zaman aşımına uğradı. Lütfen ağınızı kontrol edin ve tekrar deneyin.", + "clientReinitializing": "Hizmet yeniden başlatılıyor. Lütfen bir dakika bekleyip tekrar deneyin.", + "transferFailed": "Fon transferi yapılamıyor. Lütfen tekrar deneyin.", + "swapFailed": "Token takas işlemleri yapılamıyor. Lütfen tekrar deneyin.", + "spotPairNotFound": "İşlem çifti şu anda kullanılamıyor.", + "priceUnavailable": "Fiyat verileri mevcut değil. Lütfen yenileyin ve tekrar deneyin.", + "batchCancelFailed": "Bazı emirler iptal edilemedi. Lütfen tekrar deneyin.", + "batchCloseFailed": "Bazı pozisyonlar kapatılamadı. Lütfen tekrar deneyin.", + "insufficientMargin": "Bu işlemi gerçekleştirmek için marj yetersiz. Daha fazla fon eklemeyi veya pozisyonunuzun büyüklüğünü azaltmayı düşünebilirsiniz.", + "reduceOnlyViolation": "Bu emir pozisyonunuzu artıracaktır. Yalnızca azaltılabilen emirlere izin verilir.", + "positionWouldFlip": "Bu emir pozisyonunuzun yönünü çevirecektir. Lütfen önce mevcut pozisyonunuzu kapatın.", + "marginAdjustmentFailed": "Marj ayarlanamıyor. Lütfen tekrar deneyin.", + "tpslUpdateFailed": "Kazancı al/zararda durdur güncellenemiyor. Lütfen tekrar deneyin.", + "orderRejected": "Emir reddedildi. Lütfen parametrelerinizi kontrol edip tekrar deneyin.", + "slippageExceeded": "Fiyat çok hareket etti. Limit emir kullanmayı deneyin veya kayma toleransını artırın.", + "rateLimitExceeded": "Çok sayıda talepte bulunuldu. Lütfen bir dakika bekleyip tekrar deneyin.", + "serviceUnavailable": "Hizmet geçici olarak kullanılamıyor. Lütfen daha sonra tekrar deneyin.", + "networkErrorSimple": "Ağ hatası oluştu. Lütfen bağlantınızı kontrol edip tekrar deneyin.", + "insufficientBalance": "Bu işlemi tamamlamak için bakiye yetersiz. Lütfen kullanılabilir fonunuzu kontrol edin.", "connectionFailed": { "title": "Sürekli vadeli işlem sözleşmelerine bağlanılamadı", "description": "En kısa sürede çevrimiçi olması için çalışıyoruz.", @@ -1489,7 +1512,7 @@ "details_title": "Ayrıntılar", "entry_price": "Giriş fiyatı", "funding_cost": "Fonlama", - "liquidation_price": "Lik. Fiyatı", + "liquidation_price": "Lik. fiyatı", "take_profit": "Kazancı al", "stop_loss": "Zararda durdur", "margin": "Marj", @@ -1521,7 +1544,7 @@ "total_balance": "Toplam bakiye", "available_balance": "Kullanılabilir bakiye", "margin_used": "Kullanılan marj", - "total_unrealized_pnl": "Toplam Gerçekleşmemiş K ve Z", + "total_unrealized_pnl": "Toplam gerçekleşmemiş K&Z", "unrealized_pnl": "Gerçekleşmemiş K&Z" }, "tpsl": { @@ -1654,7 +1677,7 @@ }, "tp_sl": { "title": "Kazancı al ve zararda durdur", - "content": "Kazancı Al (KA), hedeflediğiniz kazanca ulaştığınızda pozisyonunuzu otomatik olarak kapatır. Zararda Durdur (ZD), fiyat sizin aleyhinize hareket ettiğinde pozisyonunuzu kapatarak zararınızı sınırlar." + "content": "Kazancı al (KA), hedeflediğiniz kazanca ulaştığınızda pozisyonunuzu otomatik olarak kapatır. Zararda durdur (ZD), fiyat sizin aleyhinize hareket ettiğinde pozisyonunuzu kapatarak zararınızı sınırlar." }, "close_position_you_receive": { "title": "Alınacak miktar", @@ -1697,7 +1720,14 @@ "retry_connection": "Bağlantıyı tekrar deneyin", "retrying_connection": "Bağlanıyor...", "connecting_to_perps": "Sürekli Vadeli İşlemlere bağlanılıyor", - "timeout_title": "Bağlantı beklenenden uzun sürüyor" + "timeout_title": "Bağlantı beklenenden uzun sürüyor", + "websocket_disconnected": "Bağlantı çevrim dışı.", + "websocket_disconnected_message": "Veriler güncel olmayabilir.", + "websocket_connecting": "Sürekli vadeli işlem sözleşmelerine bağlanılıyor...", + "websocket_connecting_message": "Bağlantı yeniden yükleniyor... Deneme {{attempt}}", + "websocket_connected": "Bağlandı", + "websocket_connected_message": "Canlı veri güncellemeleri yeniden başlatıldı", + "websocket_retry": "Tekrar Dene" }, "chart": { "no_data": "Grafik verileri mevcut değil", @@ -1754,6 +1784,9 @@ "title": "Destek ile iletişime geçin", "description": "Yardım için MetaMask Destek ile iletişime geçin" }, + "feedback": { + "title": "Bize geri bildirim gönder" + }, "close_all_modal": { "title": "Tüm pozisyonları kapat", "description": "Tüm açık pozisyonlarınızı güncel piyasa fiyatından kapatacağız.", @@ -1795,8 +1828,8 @@ "funding_rate_short": "Fonlama", "open_interest": "Açık faiz", "open_interest_short": "Açık Pozisyon", - "high_to_low": "Yüksekten Düşüğe", - "low_to_high": "Düşükten Yükseğe", + "high_to_low": "Yüksekten düşüğe", + "low_to_high": "Düşükten yükseğe", "high": "Yüksek", "low": "Düşük", "sort_by": "Şuna göre sırala", @@ -1806,7 +1839,11 @@ "price_change_low_to_high": "Fiyat değişikliği: düşükten yükseğe", "past_hour": "Son bir saat", "past_24_hours": "Son 24 saat", - "time": "Zaman" + "time": "Zaman", + "apply": "Uygula" + }, + "market_type": { + "filter_by": "Farklı filtrele" }, "perps_markets": "Sürekli vadeli işlem sözleşmesi piyasaları", "volume": "Hacim", @@ -1823,6 +1860,7 @@ "mainnet": "Ana Ağ", "developer_options": { "hyperliquid_network_toggle": "Hyperliquid Ağ Değişimi", + "provider_mode_toggle": "Sağlayıcı Modu", "simulate_connection_error": "Bağlantı hatasını simüle et" }, "transactions": { @@ -1857,7 +1895,7 @@ "liquidated": "Likide edildi", "take_profit": "Kazancı al", "stop_loss": "Zararda durdur", - "auto_deleveraging": "Otomatik Kaldıraç Azaltma" + "auto_deleveraging": "Otomatik kaldıraç azaltma" }, "funding": { "date": "Tarih", @@ -1925,7 +1963,7 @@ } }, "points": "Puan", - "estimated_points": "Tah. Puanlar", + "estimated_points": "Tah. puanlar", "points_error": "Şu anda puanları yükleyemiyoruz", "points_error_content": "Endişelenmeyin, puan kazanmaya devam ediyorsunuz. Yakında hesabınızda gösterilecek veya daha sonra Ödüller sekmesinde kontrol edebileceksiniz.", "tp_on_chart": "KA Grafikte", @@ -1942,7 +1980,7 @@ } }, "predict": { - "title": "MetaMask Tahmini", + "title": "MetaMask Tahminler", "prediction_markets": "Tahmin piyasaları", "market_list": "Piyasa listesi", "loading": "Yükleniyor...", @@ -1981,7 +2019,8 @@ "fee_exemption": "Bu piyasada herhangi bir ücret almıyoruz.", "ended": "Sona erdi", "resolved_early": "Erken sonuçlandı", - "disclaimer": "Bu bilgi eksik olabilir. Tüm piyasa kuralları, çözüm kriterleri ve nihai sonuçlar yalnızca Polymarket tarafından yönetilir. İşlemler, Polymarket'te yer alan tam kurallara göre yapılmalıdır." + "disclaimer": "Bu bilgi eksik olabilir. Tüm piyasa kuralları, çözüm kriterleri ve nihai sonuçlar yalnızca Polymarket tarafından yönetilir. İşlemler, Polymarket'te yer alan tam kurallara göre yapılmalıdır.", + "your_picks": "Sizin seçimleriniz" }, "tab": { "no_predictions_description": "Tahminleriniz burada görünecek, stakenizi ve piyasa hareketini gösterecek.", @@ -2001,6 +2040,8 @@ "cashout_info": "{{amount}} {{outcome}} için {{initialPrice}} fiyatıyla", "cashout_info_multiple": "{{amount}} {{outcomeGroupTitle}} • {{outcome}} için {{initialPrice}} fiyatıyla", "position_info": "{{shares}} kazanmak üzere {{outcome}} için {{initialValue}}", + "position_pick_info": "{{outcome}} için {{initialValue}}", + "position_pick_info_to_win": "{{outcome}} için {{initialValue}} yatırarak kazan", "buy_yes": "Evet", "buy_no": "Hayır", "outcomes": "sonuçlar", @@ -2035,6 +2076,7 @@ "won_markets_text": "{{count}} piyasada kazanıldı", "available_balance": "Kullanılabilir bakiye", "claim_amount_text": "{{amount}}$ al", + "claim_winnings_text": "Kazançları al", "unrealized_pnl_label": "Gerçekleşmemiş K&Z", "unrealized_pnl_value": "({{percent}}) {{amount}}", "unrealized_pnl_error": "Yüklenemiyor", @@ -2093,8 +2135,8 @@ "price_per_share": "Hisse başına fiyat", "price_impact": "Piyasa etkisi", "net_pnl": "Net K&Z", - "total_net_pnl": "Toplam Net K/Z", - "market_net_pnl": "Piyasa Net K/Z", + "total_net_pnl": "Toplam net K&Z", + "market_net_pnl": "Piyasa net K&Z", "activity_details": "İşlem ayrıntıları", "today": "Bugün", "yesterday": "Dün" @@ -2173,6 +2215,15 @@ "order_not_fully_filled": "Emriniz gerçekleştirilemedi", "buy_order_not_fully_filled": "Şu anda emrinizi vermek için piyasa fiyatında yeterli hisse yok.", "sell_order_not_fully_filled": "Şu anda piyasa fiyatında nakde çevirmek için yeterli talep yok." + }, + "game_details_footer": { + "pick_a_winner": "Bir kazanan seç", + "volume_display": "{{volume}}$ Hacim", + "read_terms": "Tüm sözleşme şart ve koşullarını oku" + }, + "sports": { + "halftime": "Ara", + "final": "Final" } }, "receive": { @@ -2290,7 +2341,7 @@ "add_funds": "Fon ekle", "next": "Sonraki", "buy_asset": "{{asset}} satın alın", - "no_tokens": "Tokeniniz yok!", + "no_tokens": "Tokeniniz yok", "show_tokens_without_balance": "Bakiyesi olmayan token'leri göster", "nfts_autodetection_title": "NFT algılama", "nfts_autodetection_desc": "MetaMask'in otomatik olarak cüzdanınızdaki NFT'leri algılayıp göstermesine izin verin.", @@ -2303,7 +2354,7 @@ "target_scam_network": "dolandırıcılıkların hedefi haline gelmesine neden olmaktadır. Dolandırıcılar, karşılığında daha değerli bir para birimi göndereceğini belirterek sizi aldatabilir. Devam etmeden önce her şeyi doğrulayın.", "use_the_currency_symbol": "para birimi sembolü kullanır", "use_correct_symbol": "Devam etmeden önce doğru sembolü kullandığınızdan emin olun", - "chain_id_currently_used": "Bu Zincir Kimliği şu anda şunun tarafından kullanılıyor:", + "chain_id_currently_used": "This chain ID is currently used by the", "incorrect_network_name_warning": "Kayıtlarımıza göre ağ adı bu zincir kimliği ile doğru şekilde eşleşmiyor olabilir.", "suggested_name": "Önerilen ad:", "network_check_validation_desc": "kötü amaçlı veya yanlış bir ağa bağlanma ihtimalinizi azaltır.", @@ -2314,7 +2365,7 @@ "nft_empty_description": "NFT dünyası sizi bekliyor. Koleksiyonunuzu oluşturmaya bugünden başlayın.", "tokens_empty_description": "Nothing to see yet. Why not browse tokens or make a trade?", "discover_nfts": "NFT'leri içe aktar", - "no_transactions": "Hiç işleminiz yok!", + "no_transactions": "Hiç işleminiz yok", "switch_network_to_view_transactions": "İşlemleri görüntülemek için lütfen ağ değiştirin", "send_button": "Gönder", "deposit_button": "Para Yatır", @@ -2362,6 +2413,7 @@ "network_fee": "Ağ ücreti", "lists": "Token lists", "hide_cta": "Tokeni gizle", + "perps_trading": "Sürekli vadeli işlem sözleşmeleri ile işlem", "options": { "title": "Token options", "view_on_portfolio": "Portfolio'da görüntüle", @@ -2409,8 +2461,8 @@ "add_token": "İÇE AKTAR" }, "collectibles": { - "cancel_add_collectible": "İPTAL", - "add_collectible": "İÇE AKTAR" + "cancel_add_collectible": "İptal et", + "add_collectible": "İçe aktar" }, "banners": { "search_desc": "Gelişmiş token algılama şu anda {{network}} ağında kullanılabilir. ", @@ -2521,18 +2573,20 @@ "billion_abbreviation": "MR", "trillion_abbreviation": "T", "million_abbreviation": "MN", + "thousand_abbreviation": "K", "token_details": "Token bilgileri", "contract_address": "Sözleşme adresi", "token_list": "Token listesi", "market_details": "Piyasa bilgileri", "market_cap": "Market cap", "total_volume": "Total volume (24h)", - "volume_to_marketcap": "Volume / market cap", + "volume_to_marketcap": "Volume / Market cap", "circulating_supply": "Dolaşımdaki arz", "all_time_high": "Tüm zamanların en yükseği", "all_time_low": "Tüm zamanların en düşüğü", "fully_diluted": "Tamamen seyreltilmiş", - "unknown": "Bilinmeyen" + "unknown": "Bilinmeyen", + "stock": "Stock" }, "collectible": { "collectible_address": "Adres", @@ -2583,7 +2637,7 @@ "remove_snap_account": "Snap hesabını kaldır", "remove_snap_account_alert_description": "Bu hesap cüzdanınızdan kaldırılacak. Devam etmeden önce lütfen orijinal Gizli Kurtarma İfadenizin veya içe aktarılan bu hesabın özel anahtarının sizde bulunduğundan emin olun. Hesap açılır menüsünden hesapları içe aktarabilir veya tekrar hesap oluşturabilirsiniz.", "remove_account_alert_remove_btn": "Kaldır", - "remove_account_alert_cancel_btn": "Fark etmez", + "remove_account_alert_cancel_btn": "Never mind", "accounts_title": "Hesaplar", "connect_account_title": "Hesabı bağla", "connect_accounts_title": "Hesapları bağla", @@ -2620,7 +2674,7 @@ "advisory_by": "Ethereum Kimlik Avı Algılayıcı ve PhishFort tarafından sunulan uyarı", "potential_threat": "Potansiyel tehditler şunları içerir", "fake_metamask": "Sahte MetaMask sürümleri", - "srp_theft": "Gizli kurtarma ifadesi veya şifre hırsızlığı", + "srp_theft": "Secret Recovery Phrase or password theft", "malicious_transactions": "Varlıkların çalınmasına neden olan kötü amaçlı işlemler", "secret_recovery_phrase": "Gizli Kurtarma İfadesi", "account_name": "Hesap adı", @@ -2675,7 +2729,7 @@ }, "connect_qr_hardware": { "title": "QR tabanlı bir donanım cüzdanı bağlayın", - "description1": "QR kodları ile iletişim kuran kapalı bir donanım cüzdanı bağlayın.", + "description1": "Connect an airgapped hardware wallet that communicates through QR codes.", "description2": "Nasıl çalışır?", "description3": "Resmi olarak desteklenen kapalı donanım cüzdanları şunları içerir:", "keystone": "Ana İlke", @@ -2690,7 +2744,7 @@ "hint_text": "Donanım cüzdanınızı tarayarak ", "purpose_connect": "bağlan", "purpose_sign": "kilit cüzdanınızı okutun", - "select_accounts": "Hesap Seç" + "select_accounts": "Bir hesap seç" }, "data_collection_modal": { "accept": "Tamam", @@ -2716,15 +2770,15 @@ "notifications_dismiss_modal": "Yok say", "select_rpc_url": "RPC URL adresini seç", "title": "Ayarlar", - "current_conversion": "Temel Para Birimi", - "current_language": "Current language", - "ipfs_gateway": "IPFS Ağ Geçidi", + "current_conversion": "Temel para birimi", + "current_language": "Geçerli dil", + "ipfs_gateway": "IPFS ağ geçidi", "ipfs_gateway_content": "MetaMask, IPFS'de depolanan NFT'lerinizin görüntülerini göstermek, tarayıcınızın adres çubuğuna girilen ENS adresleri ile ilgili bilgileri göstermek ve farklı token'lerin simgelerini almak için üçüncü taraf hizmetleri kullanır. Siz bunları kullanırken IP adresiniz bu hizmetlerle paylaşılabilir.", "ipfs_gateway_down": "Geçerli IPFS ağ geçidiniz bozuk", "ipfs_gateway_desc": "Tercih ettiğiniz IPFS ağ geçidini seçin.", - "search_engine": "Search engine", - "new_RPC_URL": "Yeni RPC Ağı", - "state_logs": "State logs", + "search_engine": "Arama motoru", + "new_RPC_URL": "Yeni RPC ağı", + "state_logs": "Durum günlükleri", "add_network_title": "Ağ ekle", "auto_lock": "Otomatik kilitle", "auto_lock_desc": "Uygulama otomatik olarak kilitlenmeden süre miktarını seçin.", @@ -2733,15 +2787,15 @@ "autolock_never": "Hiçbir Zaman", "autolock_after": "{{time}} saniye sonra", "autolock_after_minutes": "{{time}} dakika sonra", - "reveal_seed_words": "Reveal seed words", - "reset_account": "Reset account", - "state_logs_button": "Download state logs", + "reveal_seed_words": "Seed Sözcüklerini Göster", + "reset_account": "Hesabı sıfırla", + "state_logs_button": "Durum günlüklerini indir", "reveal_seed_words_button": "SEED SÖZCÜKLERİNİ GÖSTER", - "reset_account_button": "Reset account", + "reset_account_button": "Hesabı sıfırla", "reset_account_confirm_button": "Evet, sıfırla", "reset_account_cancel_button": "İptal", - "reset_account_modal_title": "Reset account?", - "clear_approvals_modal_title": "Clear approval data?", + "reset_account_modal_title": "Hesap sıfırlansın mı?", + "clear_approvals_modal_title": "Onay verileri temizlensin mi?", "clear_approvals_modal_message": "Merkeziyetsiz tüm uygulamaların hesap bilgilerini tekrar görüntülemek için erişim istemesi gerekecek.", "clear_browser_history_modal_title": "Tarayıcı geçmişi temizlensin mi?", "clear_browser_history_modal_message": "Tüm tarayıcı geçmişinizi silmek üzereyiz. Emin misiniz?", @@ -2763,7 +2817,7 @@ "protect_title": "Cüzdan kurtarma", "banner_social_login_enabled": "{{authConnection}} ile oturum aç", "manage_recovery_method": "Kurtarma yöntemlerini yönet", - "video_failed": "Video failed to load.", + "video_failed": "Video yüklenemedi.", "protect_desc": "Cüzdanınıza erişimi asla kaybetmemeniz için Gizli Kurtarma İfadenizi yedekleyin. Yalnızca sizin erişiminiz olan ve unutmayacağınız güvenli bir yerde sakladığınızdan emin olun", "protect_desc_no_backup": "Bu sizin cüzdanınızın 12 sözcükten oluşan ifadesidir. Bu ifade, cüzdanınızda para gönderme kabiliyeti de dahil olmak üzere tüm şimdiki ve gelecekteki hesaplarınızı kontrol etmek için kullanılabilir. Bu ifadeyi güvenli bir şekilde saklayın, hiç kimseyle PAYLAŞMAYIN. MetaMask bu anahtarı kurtarmanıza yardımcı olamaz.", "learn_more": "Daha fazlasını öğren.", @@ -2782,9 +2836,9 @@ "show_fiat_on_testnets_desc": "Test ağlarındaki fiat para dönüşümünü göstermek için bunu seçin.", "show_fiat_on_testnets_modal_title": "Dikkatli olun", "show_fiat_on_testnets_modal_description": "Sizden bu özelliği açmanız istenirse dolandırılıyor olabilirsiniz. Bu tokenlerin hiçbir parasal değeri yoktur ve sadece test amaçlıdır. Bu özellik, geliştiricilerin uygulamalarının çalıştığından emin olmalarına yardımcı olur.", - "show_fiat_on_testnets_modal_learn_more": "Daha fazla bilgi edinin.", + "show_fiat_on_testnets_modal_learn_more": "Daha fazla bilgi edin", "show_fiat_on_testnets_modal_button": "Devam et", - "show_hex_data": "Show hex data", + "show_hex_data": "On altılı verileri göster", "show_hex_data_desc": "Gönderim ekranında on altılı veri alanını göstermek için bunu seçin.", "accounts_identicon_title": "Hesap simgesi", "accounts_identicon_desc": "Hesapları hemen tanımlamanıza yardımcı olabilen üç farklı eşsiz simge stili arasından seçiminizi yapın.", @@ -2804,10 +2858,10 @@ "customize_session_desc": "Almak istediğiniz bildirim türlerini açın:", "account_session_title": "Hesap aktivitesi", "account_session_desc": "Hakkında bildirim almak istediğiniz hesapları seçin:", - "assets_sent_title": "Assets sent", - "assets_sent_desc": "Fonlar ve NFT", - "assets_received_title": "Assets received", - "assets_received_desc": "Fonlar ve NFT", + "assets_sent_title": "Gönderilen varlıklar", + "assets_sent_desc": "Fonlar ve NFT'ler", + "assets_received_title": "Alınan varlıklar", + "assets_received_desc": "Fonlar ve NFT'ler", "defi_title": "DeFi", "defi_desc": "Stake, swap ve köprü", "snaps_title": "Snap'ler", @@ -2822,32 +2876,32 @@ "permissions_desc": "Sitelere ve uygulamalara verilen izinleri yönet.", "no_permissions": "İzin yok", "no_permissions_desc": "Bir siteye veya bir uygulamaya bağladığınız hesabı burada göreceksiniz.", - "security_title": "Güvenlik ve Gizlilik", + "security_title": "Güvenlik ve gizlilik", "back": "Geri", "security_desc": "Gizlilik ayarları, MetaMetrics, özel anahtar ve Gizli Kurtarma İfadesi.", "networks_title": "Ağlar", - "networks_default_title": "Default network", + "networks_default_title": "Varsayılan ağ", "network_delete": "Bu ağı silerseniz bu ağdaki varlıklarınızı görüntülemek için bu ağı tekrar eklemeniz gerekir", "networks_default_cta": "Bu ağı kullan", "add_rpc_url": "RPC URL adresi ekle", "add_block_explorer_url": "Blok Gezgini URL adresi ekle", "networks_desc": "Kişisel RPC ağı ekle ve düzenle", - "network_name_label": "Network name", - "network_name_placeholder": "Network name (optional)", + "network_name_label": "Ağ adı", + "network_name_placeholder": "Ağ adı (isteğe bağlı)", "network_rpc_url_label": "RPC URL adresi", - "network_rpc_name_label": "RPC Adı", - "network_rpc_placeholder": "Yeni RPC Ağı", + "network_rpc_name_label": "RPC adı", + "network_rpc_placeholder": "Yeni RPC ağı", "network_failover_rpc_url_label": "Yedek RPC URL adresi", "failover": "Yedekleme", "network_chain_id_label": "Zincir Kimliği", "network_chain_id_placeholder": "Zincir Kimliği", "network_symbol_label": "Sembol", "network_block_explorer_label": "Blok Gezgini URL adresi", - "network_block_explorer_placeholder": "Blok Gezgini URL adresi (isteğe bağlı)", - "network_chain_id_warning": "Geçersiz Zincir Kimliği", - "network_other_networks": "Other networks", - "network_rpc_networks": "RPC Ağları", - "network_add_network": "Add network", + "network_block_explorer_placeholder": "Blok gezgini URL adresi (isteğe bağlı)", + "network_chain_id_warning": "Geçersiz zincir kimliği", + "network_other_networks": "Diğer ağlar", + "network_rpc_networks": "RPC ağları", + "network_add_network": "Ağ ekle", "network_add_custom_network": "Özel bir ağ ekle", "network_add": "Ekle", "network_save": "Kaydet", @@ -2862,7 +2916,7 @@ "legal_title": "Hukuki", "conversion_title": "Para birimi dönüştürme", "conversion_desc": "Uygulama genelinde belirli bir para birimini kullanarak fiat para değerlerini göster.", - "primary_currency_title": "Primary currency", + "primary_currency_title": "Birincil para birimi", "primary_currency_desc": "Zincirin yerli para biriminde değerleri göstermeye öncelik vermek için Yerel seçeneğini seçin (ör. ETH). Kendi seçtiğiniz fiat paradaki değerleri göstermeye öncelik vermek için Fiat Para seçeneğini seçin.", "primary_currency_text_first": "Yerel", "primary_currency_text_second": "Fiat Para", @@ -2899,11 +2953,11 @@ "invalid_number": "Geçersiz sayı. Ondalık sayısı veya '0x' ön ekli on altılı bir sayı girin.", "invalid_number_leading_zeros": "Geçersiz sayı. Baştaki tüm sıfırları silin.", "invalid_number_range": "Geçersiz sayı. 1 ile %{maxSafeChainId} arasında bir sayı girin.", - "hide_zero_balance_tokens_title": "Hide tokens without balance", + "hide_zero_balance_tokens_title": "Bakiyesi olmayan tokenleri gizle", "hide_zero_balance_tokens_desc": "Bakiyesi olmayan tokenlerin token listenizde gösterilmesini önler.", "token_detection_title": "Token'leri otomatik algıla", "token_detection_description": "Cüzdanınıza gönderilen yeni tokenleri algılamak ve göstermek için üçüncü taraf API'leri kullanırız. Bu hizmetlerden veri çekmek istemiyorsanız kapatın.", - "theme_button_text": "Change theme", + "theme_button_text": "Temayı değiştir", "theme_title": "Tema ({{theme}})", "theme_description": "Temayı ayarlayarak uygulamanın görünümünü değiştir.", "theme_os": "Sistem", @@ -2935,20 +2989,20 @@ "delete_metrics_description_after_delete_part_two": ". Bu işlem 30 gün kadar sürebilir. Şunu görüntüleyin:", "delete_metrics_description_privacy_policy": "Gizlilik Politikası.", "delete_metrics_button": "MetaMetrics verilerini sil", - "check_status_button": "Check status", + "check_status_button": "Durumu kontrol et", "delete_metrics_confirm_modal_title": "MetaMetrics verilerini sil?", "delete_metrics_confirm_modal_description": "Tüm MetaMetrics verilerini kaldırmak üzeresiniz. Emin misiniz?", "delete_wallet_data_title": "Cüzdanı sıfırla", "delete_wallet_data_description": "Bu işlem cüzdanla ilgili tüm verileri cihazınızdan silecek. Hesaplar blokzincirinde bulunur ve MetaMask ile ilgili değildir. Dilediğiniz zaman Gizli Kurtarma İfadenizi kullanarak hesaplarınızı kurtarabilirsiniz.", "delete_wallet_data_button": "Cüzdanı sıfırla", - "delete_data_status_title": "Deletion task status", + "delete_data_status_title": "Silme işleminin durumu", "delete_data_status_description": "Güncel durum ", "delete_metrics_error_title": "Şu anda bu verileri silemiyoruz.", "delete_metrics_error_description": "Bu talep analitik bir sistem sunucusu sorunundan dolayı şu anda tamamlanamıyor, lütfen daha sonra tekrar deneyin.", "ok": "Tamam", - "clear_sdk_connections_title": "Tüm MetaMask SDK Bağlantılarını temizle", + "clear_sdk_connections_title": "Tüm MetaMask SDK bağlantılarını temizle", "clear_sdk_connections_text": "Tüm bağlantılar temizlenecek ve uygulamaların tekrar bağlantı talep etmesi gerekecek", - "sdk_connections": "MetaMask SDK Bağlantıları", + "sdk_connections": "MetaMask SDK bağlantıları", "manage_sdk_connections_title": "Bağlantıları yönet", "manage_sdk_connections_text": "Sitelere ve/veya MetaMask SDK bağlantılarını kaldırın.", "fiat_on_ramp": { @@ -2956,8 +3010,9 @@ "description": "Bölge ve daha fazlası...", "current_region": "Mevcut bölge", "reset_region": "Bölgeyi sıfırla", + "change_region": "Bölgeyi değiştir", "no_region_selected": "Bölge seçilmedi", - "sdk_activation_keys": "SDK Aktivasyon Anahtarları", + "sdk_activation_keys": "SDK aktivasyon anahtarları", "activation_keys_description": "Aktivasyon anahtarları belirli özellikleri veya sağlayıcıları etkinleştirecektir.", "add_activation_key": "Aktivasyon anahtarı ekle", "edit_activation_key": "Aktivasyon anahtarını düzenle", @@ -3006,13 +3061,13 @@ }, "snap_details": { "install_date": "{{date}} tarihinde yüklendi", - "install_origin": "Install origin", + "install_origin": "Kökeni yükle", "enabled": "Etkinleştirildi", "version": "Sürüm" }, "keyring_account_list_item": { "account_name": "Hesap adı", - "public_address": "Public address" + "public_address": "Genel adres" }, "snap_permissions": { "approved_date": "{{date}} tarihinde onaylandı", @@ -3063,28 +3118,28 @@ "blockaid_desc": "Bu özellik, işlem ve imza taleplerini aktif bir şekilde inceleyerek kötü amaçlı aktivite konusunda sizi uyarır.", "security_alerts": "Güvenlik uyarıları", "security_alerts_desc": "Bu özellik, işlem ve imza taleplerinizi yerel olarak incelerken gizliliğinizi koruyarak Ethereum Ana Ağındaki kötü amaçlı aktivitelere karşı sizi uyarır. Talepleri onaylamadan önce her zaman gereken özeni kendiniz gösterin. Bu özelliğin tüm kötü amaçlı faaliyetleri algılayacağına dair herhangi bir garanti bulunmamaktadır. Bu özelliği etkinleştirerek sağlayıcının kullanım koşullarını kabul etmiş olursunuz.", - "dismiss_smart_account_update_heading": "\"Akıllı Hesaba Geçiş Yap\" önerisini yok say", - "dismiss_smart_account_update_desc": "Artık herhangi bir hesapta \"Akıllı Hesaba Geçiş Yap\" önerisini görmemek için bunu açın. Akıllı hesaplar daha hızlı işlemlerin, daha düşük ağ ücretlerinin ve bunların ödemesinde daha fazla esnekliğin kilidini açar.", + "dismiss_smart_account_update_heading": "\"Akıllı hesaba geçiş yap\" önerisini yok say", + "dismiss_smart_account_update_desc": "Artık herhangi bir hesapta \"Akıllı hesaba geçiş yap\" önerisini görmemek için bunu açın. Akıllı hesaplar daha hızlı işlemlerin, daha düşük ağ ücretlerinin ve bunların ödemesinde daha fazla esnekliğin kilidini açar.", "use_smart_account_heading": "Akıllı hesap kullan", "use_smart_account_desc": "Daha hızlı işlemler, daha düşük ağ ücretleri ve bunların ödenmesinde ödeme esnekliği gibi ilgili özellikler kullanılabilir olduğunda akıllı hesaplara geçmek için MetaMask dahilinde oluşturulan hesaplar arasında otomatik geçiş yapmak için bunu açık tutun.", - "use_smart_account_learn_more": "Daha fazla bilgi edinin.", + "use_smart_account_learn_more": "Daha fazla bilgi edin", "smart_transactions_opt_in_heading": "Akıllı İşlemler", "smart_transactions_opt_in_desc_supported_networks": "Desteklenen ağlarda daha güvenilir ve güvenli işlemler için Akıllı İşlemleri açın.", - "smart_transactions_learn_more": "Daha fazla bilgi edinin.", + "smart_transactions_learn_more": "Daha fazla bilgi edin", "simulation_details": "Bakiye değişikliklerini tahmin edin", "simulation_details_description": "İşlemleri onaylamadan önce işlemlerin neden olacağı bakiye değişikliklerini tahmin etmek için bunu açın. İşlemlerinizin nihai sonucunu garanti etmez. ", "simulation_details_learn_more": "Daha fazla bilgi edinin.", - "aes_crypto_test_form_title": "AES crypto - test form", + "aes_crypto_test_form_title": "AES şifreleme - test biçimi", "aes_crypto_test_form_description": "Bu kısım özel olarak E2E testi için geliştirilmiştir. Bu, uygulamanızda görünüyorsa lütfen MetaMask destek bölümüne bildirin.", "developer_options": { - "title": "Developer options", - "generate_trace_test": "Generate trace test", - "generate_trace_test_desc": "Generate a developer test Sentry trace.", - "navigate_to_sample_feature": "Navigate to sample feature", + "title": "Geliştirici seçenekleri", + "generate_trace_test": "Takip testi oluştur", + "generate_trace_test_desc": "Geliştirici testi Sentry takibi oluştur.", + "navigate_to_sample_feature": "Örnek özelliğe git", "sample_feature_desc": "Geliştiriciler için bir şablon olarak örnek özellik." }, "feature_flag_override": { - "title": "Feature flag override", + "title": "Özellik bayrağını geçersiz kılma", "description": "Uygulamadaki özellik bayraklarını yerel olarak geçersiz kıl." } }, @@ -3107,7 +3162,7 @@ "disconnect_all_info": "Tüm sitelerin bağlantılarını kaldırırsanız tekrar bağlanmak için izin vermeniz gerekecektir.", "disconnect": "Bağlantıyı kes", "disconnect_all": "Tümünün bağlantısını kes", - "disconnect_all_accounts": "Tüm Hesapların bağlantısını kes", + "disconnect_all_accounts": "Tüm hesapların bağlantısını kes", "manage_connections": "Bağlantıları yönet", "manage": "Yönet", "cancel": "İptal", @@ -3124,7 +3179,7 @@ "disconnect_all": "Tüm sitelerden bağlantı kesilsin mi?", "disconnect_all_desc": "Tüm sitelerden hesaplarınızın bağlantısını keserseniz onları tekrar bağlamak için izin vermeniz gerekecektir.", "disconnect_account": "Hesabın bağlantısı kesilsin mi?", - "disconnect_all_accounts": "Tüm Hesapların bağlantısını kes", + "disconnect_all_accounts": "Tüm hesapların bağlantısını kes", "disconnect_all_accounts_desc": "{{dapp}} uygulamasından tüm hesaplarınızın bağlantısını keserseniz onları tekrar bağlamak için izin vermeniz gerekecektir.", "disconnect_account_desc": "{{dapp}} uygulamasından {{account}} bağlantısını keserseniz onu tekrar bağlamak için izin vermeniz gerekecektir.", "disconnect_confirm": "Bağlantıyı kes", @@ -3137,7 +3192,7 @@ "sdk_feedback_modal": { "ok": "Tamam", "title": "Hesap bağlantısı kurulamadı", - "info": "MetaMask'a tekrar bağlanmak için lütfen merkeziyetsiz uygulama üzerinde QR kodunu tarayın" + "info": "Please scan the QR code on the site to reconnect to MetaMask" }, "app_information": { "title": "Bilgi", @@ -3145,8 +3200,8 @@ "privacy_policy": "Gizlilik Politikası", "terms_of_use": "Kullanım şartları", "attributions": "Özellikler", - "support_center": "Visit our support center", - "web_site": "Web Sitemizi ziyaret edin", + "support_center": "Destek merkezimizi ziyaret et", + "web_site": "Visit our website", "contact_us": "Contact us" }, "reveal_credential": { @@ -3203,7 +3258,7 @@ "keep_credential_safe": "{{credentialName}} bilgini güvende tut", "srp_abbreviation_text": "GKİ", "srp_text": "Gizli Kurtarma İfadesi", - "private_key_text": "Özel Anahtar", + "private_key_text": "Özel anahtar", "got_it": "Anladım", "learn_more": "Daha fazla bilgi edin" }, @@ -3211,12 +3266,12 @@ "title": "Güvenlik uyarısı", "description": "Ekran görüntüleri {{credentialName}} takibinin güvenli bir yöntemi değildir. Hesabınızı güvende tutmak için çevrimiçi olarak yedeklenmeyen bir yerde saklayın.", "srp_text": "Gizli Kurtarma İfadesi", - "priv_key_text": "Özel Anahtar" + "priv_key_text": "Özel anahtar" }, "password_reset": { "password_title": "Şifre", "password_desc": "Cihazınızda MetaMask uygulamasının kilidini açmak için güçlü bir şifre seçin. Bu şifreyi kaybettiğiniz takdirde cüzdanınızı yeniden içe aktarmak için Gizli Kurtarma İfadenize ihtiyacınız olacaktır.", - "password_learn_more": "Daha fazlasını öğren.", + "password_learn_more": "Daha fazla bilgi edin", "change_password": "Şifreyi değiştir", "password_hint": "Şifre ipucu" }, @@ -3246,19 +3301,28 @@ "swap": "Takas Et", "bridge": "Köprü", "earn": "Kazan", - "convert_to_musd": "Convert to mUSD", + "convert_to_musd": "mUSD'ye dönüştür", + "merkl_rewards": { + "annual_bonus": "%{{apy}} bonus", + "claimable_bonus": "Alınabilir bonus", + "claimable_bonus_tooltip_description": "mUSD bonuses are claimed on Linea.", + "terms_apply": "Terms apply.", + "ok": "Tamam", + "claim": "Al", + "processing_claim": "Processing claim..." + }, "tron": { - "daily_resource_new_energy": "New daily energy", - "sufficient_to_cover": "Sufficient to cover", + "daily_resource_new_energy": "Yeni günlük enerji", + "sufficient_to_cover": "Karşılanamıyor", "transactions": "işlem", "daily_resource": "Günlük kaynak", "bandwidth": "Bant genişliği", "energy": "Enerji", - "daily_resource_description": "This is your daily allowance based on your staked TRX. Hold TRX to get 600 bandwidth daily.", - "sufficient_to_cover_trx_transfers": "Covers ~{{amount}} TRX transfers", - "sufficient_to_cover_trx_transfer": "Covers 1 TRX transfer", - "sufficient_to_cover_usdt_transfers": "Covers ~{{amount}} USDT transfers", - "sufficient_to_cover_usdt_transfer": "Covers 1 USDT transfer" + "daily_resource_description": "Bu, stake ettiğiniz TRX'e göre günlük kullanım izninizdir. TRX tutarak günlük olarak ücretsiz 600 bant genişliği alın.", + "sufficient_to_cover_trx_transfers": "~{{amount}} TRX transferi karşılar", + "sufficient_to_cover_trx_transfer": "1 TRX transferi karşılar", + "sufficient_to_cover_usdt_transfers": "~{{amount}} USDT transferi karşılar", + "sufficient_to_cover_usdt_transfer": "1 USDT transferi karşılar" }, "disabled_button": { "buy": "Bu hesap için satın alma desteklenmiyor", @@ -3311,9 +3375,11 @@ }, "no_chart_data": { "title": "Grafik verileri yok", - "description": "Bu token için herhangi bir veri alamadık" + "description": "Bu token için herhangi bir veri alamadık", + "insufficient_data": "Data is not available for this time period" }, "your_balance": "Bakiyeniz", + "perps_position": "Sürekli vadeli işlem sözleşmeleri pozisyonu", "unable_to_load_balance": "Bakiyeniz yüklenemedi", "about": "Hakkında", "about_content_display": { @@ -3363,11 +3429,11 @@ "address_copied_to_clipboard": "Token adresi hafıza panosuna kopyalandı" }, "qr_scanner": { - "invalid_qr_code_title": "QR Kodu geçersiz", + "invalid_qr_code_title": "Invalid QR code", "invalid_qr_code_message": "Taramaya çalıştığınız QR kodu geçerli değil.", "allow_camera_dialog_title": "Kamera erişimine izin ver", "allow_camera_dialog_message": "QR kodlarını taramak için izninize ihtiyacımız var", - "scanning": "taranıyor...", + "scanning": "Taranıyor...", "ok": "Tamam", "continue": "Devam et", "cancel": "İptal", @@ -3376,14 +3442,14 @@ "attempting_sync_from_wallet_error": "Görünüşe göre uzantı ile senkronize etmeye çalışıyorsunuz. Bunu yapabilmek için mevcut cüzdanınızı silmeniz gerekecek. \n\nUygulamayı sildiğinizde veya uygulamanın yeni bir sürümünü tekrar yüklediğinizde \"MetaMask Uzantısı ile Senkronize Et\" seçeneğini seçin. Önemli! Cüzdanınızı silmeden önce Gizli Kurtarma İfadenizi yedeklediğinizden emin olun.", "not_allowed_error_title": "Kamera erişimini aç", "not_allowed_error_desc": "Bir QR kodunu taramak için cihazınızın ayarlar menüsünden MetaMask'e kamera erişimi vermeniz gerekecektir.", - "unrecognized_address_qr_code_title": "Tanınmayan QR kodu", + "unrecognized_address_qr_code_title": "Unrecognized QR code", "unrecognized_address_qr_code_desc": "Üzgünüz, bu QR kodu bir hesap adresi ya da bir iletişim adresiyle ilişkilendirilmemiş.", "url_redirection_alert_title": "Harici bir bağlantıyı ziyaret etmek üzeresiniz", "url_redirection_alert_desc": "Bağlantılar insanları dolandırmak ya da kimlik avı için kullanılabilir bu nedenle sadece güendiğiniz web sitelerini ziyaret ettiğinizden emin olun.", "label": "Bir QR kodunu tara", "open_settings": "Ayarlar", "camera_not_available": "Kamera mevcut değil", - "tron_address_not_supported": "Tron addresses are not currently supported" + "tron_address_not_supported": "Tron adresleri şu anda desteklenmiyor" }, "action_view": { "cancel": "İptal", @@ -3471,10 +3537,10 @@ "cancel_tx_message": "Bu denemeyi göndermek ilk işlemin iptalini garanti etmez. İptal denemesi başarılı olursa sizden yukarıdaki işlem ücreti alınır.", "speedup_tx_title": "Hızlandırmayı dene?", "speedup_tx_message": "Bu denemeyi göndermek ilk işlemin hızlandırılmasını garanti etmez. Hızlandırma denemesi başarılı olursa sizden yukarıdaki işlem ücreti alınır.", - "nevermind": "Fark etmez", + "nevermind": "Never mind", "edit_network_fee": "Gaz ücretini düzenle", "edit_priority": "Önceliği düzenle", - "gas_cancel_fee": "Gaz iptal ücreti", + "gas_cancel_fee": "Gas cancellation fee", "gas_speedup_fee": "Gaz hızlandırma ücreti", "use_max": "Maksimumu kullan", "set_gas": "Ayarla", @@ -3602,7 +3668,7 @@ "reload": "Tekrar Yükle", "share": "Paylaş", "bookmark": "Yer İmi", - "add_to_favorites": "Favorilere Ekle", + "add_to_favorites": "Add to favorites", "error": "Hata", "cancel": "İptal", "go_back": "Geri git", @@ -3610,7 +3676,7 @@ "home": "Ana Sayfa", "close": "Kapat", "open_in_browser": "Tarayıcıda aç", - "change_url": "Url adresini değiştir", + "change_url": "Change URL", "switch_network": "Ağ değiştir", "dapp_browser": "MERKEZİYETSİZ UYGULAMA TARAYICISI", "dapp_browser_message": "MetaMask, merkeziyetsiz web için cüzdanınız ve tarayıcınızdır. Bir bakın!", @@ -3654,7 +3720,7 @@ "add_favorite": { "title": "Add favorite", "title_label": "Adı", - "url_label": "Url adresi", + "url_label": "URL Adresi", "add_button": "Ekle", "cancel_button": "İptal" }, @@ -3664,7 +3730,7 @@ "approve": { "title": "Onayla", "deeplink": "Derin Bağlantı", - "qr_code": "QR KODU" + "qr_code": "QR kodu" }, "transactions": { "tx_review_confirm": "Onayla", @@ -3676,30 +3742,30 @@ "tx_review_increase_allowance": "Increase allowance", "tx_review_set_approval_for_all": "Set approval for all", "tx_review_staking_claim": "Staking claim", - "tx_review_staking_deposit": "Staking deposit", + "tx_review_staking_deposit": "Stake para yatırma işlemi", "tx_review_staking_unstake": "Unstake Et", - "tx_review_lending_deposit": "Lending deposit", + "tx_review_lending_deposit": "Borç verme para yatırma işlemi", "tx_review_lending_withdraw": "Lending withdrawal", - "tx_review_perps_deposit": "Fonlanan Sürekli Vadeli İşlem Sözleşmeleri", + "tx_review_perps_deposit": "Fonlanan sürekli vadeli işlem sözleşmeleri", "tx_review_predict_deposit": "Fonlanmış tahminler", "tx_review_predict_claim": "Alınan kazançlar", "tx_review_predict_withdraw": "Tahmin bakiyesini çek", - "tx_review_musd_conversion": "mUSD Conversion", - "sent_ether": "Ether Gönderdi", - "self_sent_ether": "Sent yourself Ether", - "received_ether": "Ether Aldı", + "tx_review_musd_conversion": "mUSD dönüştürme", + "sent_ether": "Sent ETH", + "self_sent_ether": "Sent yourself ETH", + "received_ether": "Received ETH", "sent_dai": "DAI Gönderdi", "self_sent_dai": "Sana DAI gönderdi", "received_dai": "DAI aldı", "sent_tokens": "Sent tokens", "received_tokens": "Received tokens", - "ether": "Ether", + "ether": "ETH", "sent_unit": "{{unit}} Gönderdi", "self_sent_unit": "Sent yourself {{unit}}", "received_unit": "{{unit}} Aldı", "sent_collectible": "Sent collectible", "received_collectible": "Received collectible", - "send_ether": "Send Ether", + "send_ether": "Send ETH", "send_unit": "Send {{unit}}", "send_collectible": "Send collectible", "receive_collectible": "Receive collectible", @@ -3732,9 +3798,9 @@ }, "gas_used": "Gas used (units)", "gas_limit": "Gas limit (units)", - "gas_price": "Gaz Fiyatı (GWEI)", - "base_fee": "Baz Ücreti (GEWI)", - "priority_fee": "Öncelik Ücreti (GWEI)", + "gas_price": "Gas price (GWEI)", + "base_fee": "Base fee (GWEI)", + "priority_fee": "Priority fee (GWEI)", "multichain_priority_fee": "Öncelik ücreti", "max_fee": "Max fee per gas", "total": "Toplam", @@ -3767,7 +3833,7 @@ "confirm_gas_fee_token_tooltip": "Bu, işleminizi gerçekleştirmek için ağa ödenir. ETH dışı token'lar veya önceden fonlanmış ETH için {{metamaskFeeFiat}} MetaMask ücreti dahildir.", "paid_by_metamask": "MetaMask tarafından ödenir", "confirm_gas_fee_token_metamask_fee": "{{metamaskFeeFiat}} ücreti dahildir", - "smart_account_upgrade": "Akıllı hesaba yükselt", + "smart_account_upgrade": "Akıllı hesaba geçiş yap", "smart_account_downgrade": "Standart hesaba geçiş yap", "batched_transactions": "Toplu işlemler", "gas_modal": { @@ -3906,7 +3972,7 @@ "select_all": "Tümünü seç", "deselect_all": "Tümünün seçimini kaldır", "new_network": "Yeni ağ eklendi", - "network_name": "{{networkName}} Ağı", + "network_name": "{{networkName}} ağı", "network_added": " artık ağ seçicide mevcut.", "provider": "Size bakiyelerinizi söyleyen ve işlemlerini dürüstçe yayınlayan bir sağlayıcı güvenilirdir.", "no_match": "Eşleşen sonuç bulunamadı.", @@ -4004,8 +4070,8 @@ "biometrics": { "enable_touchid": "Touch ID ile kilidi aç?", "enable_faceid": "Face ID ile kilidi aç?", - "enable_fingerprint": "Parmak İzi ile kilidi aç?", - "enable_biometrics": "Biyometri ile kilidi aç?", + "enable_fingerprint": "Unlock with fingerprint?", + "enable_biometrics": "Unlock with biometrics?", "enable_device_passcode_ios": "Cihaz parolası ile kilidi aç?", "enable_device_passcode_android": "Cihazın PIN kodu ile kilidi aç?" }, @@ -4020,18 +4086,18 @@ "title": "BAĞLANTI TALEBİ", "walletconnect_title": "WALLETCONNECT TALEBİ", "action": "Bu siteye bağlan?", - "action_reconnect": "Bağlantıyı sürdürmek için merkeziyetsiz uygulama üzerinde gördüğünüz sayıyı seçin", - "action_reconnect_deeplink": "Bu merkeziyetsiz uygulamaya tekrar bağlanmak istiyor musunuz?", + "action_reconnect": "To resume connection, choose the number you see on the site", + "action_reconnect_deeplink": "Do you want to reconnect to this site?", "connect": "Bağlan", "resume": "Sürdür", "cancel": "İptal", - "donot_rememberme": "Bu merkeziyetsiz uygulama bağlantısını unut", + "donot_rememberme": "Do not remember this site connection", "disconnect": "Bağlantıyı kes", "permission": "Şunu görüntüle:", "address": "genel adres", "sign_messages": "Kendi adına", "on_your_behalf": "mesajları imzala", - "warning": "Bağla düğmesine tıklayarak bu merkeziyetsiz uygulamanın genel adresinizi görüntülemesine izin verirsiniz. Bu, verilerinizi olası kimlik avı risklerinden korumak için önemli bir güvenlik adımıdır." + "warning": "By clicking connect, you allow this site to view your public address. This is an important security step to protect your data from potential phishing risks." }, "import_private_key": { "title": "Hesabı içe aktar", @@ -4047,7 +4113,7 @@ "error_title": "Bir şeyler ters gitti", "error_message": "Bu özel anahtarı içe aktaramadık. Lütfen doğru girdiğinizden emin olun.", "error_empty_message": "Özel anahtarınızı girmeniz gerekiyor.", - "or_scan_a_qr_code": "veya bir QR Kodunu taratın" + "or_scan_a_qr_code": "or scan a QR code" }, "import_private_key_success": { "title": "Hesap başarılı bir şekilde içe aktarıldı!", @@ -4064,12 +4130,12 @@ "paste": "Yapıştır", "clear": "Tümünü temizle", "srp_number_of_words_option_title": "Sözcük sayısı", - "12_word_option": "12 sözcükten oluşan bir ifadem var", - "24_word_option": "24 sözcükten oluşan bir ifadem var", + "12_word_option": "I have a 12-word phrase", + "24_word_option": "I have a 24-word phrase", "error_title": "Bir şeyler ters gitti", "error_message": "We couldn't import that Secret Recovery Phrase. Please make sure you entered it correctly.", "error_empty_message": "You need to enter your Secret Recovery Phrase.", - "error_number_of_words_error_message": "Gizli Kurtarma İfadeleri 12 veya 24 sözcük içerir", + "error_number_of_words_error_message": "Secret Recovery Phrases contain 12 or 24 words", "error_srp_is_case_sensitive": "Giriş geçersiz! Gizli Kurtarma İfadesi büyük/küçük harfe duyarlıdır.", "error_srp_word_error_1": "Sözcük ", "error_srp_word_error_2": " yanlış veya yanlış yazılmış.", @@ -4079,7 +4145,7 @@ "error_invalid_srp": "Gizli Kurtarma İfadesi geçersiz", "error_duplicate_srp": "Bu Gizli Kurtarma İfadesi zaten içe aktarıldı.", "error_duplicate_account": "The account you are trying to import is a duplicate.", - "invalid_qr_code_title": "QR Kodu geçersiz", + "invalid_qr_code_title": "Invalid QR code", "invalid_qr_code_message": "The QR code does not contain a valid Secret Recovery Phrase", "success_1": "Cüzdan", "success_2": "i̇çe aktarıldı" @@ -4151,7 +4217,7 @@ "why_secure_2": " Uygulamaya giriş yapamadığınızda veya yeni bir cihaz edindiğinizde cüzdanınızı kurtarmanın tek yolu budur." }, "account_backup_step_2": { - "cancel_backup_title": "Cancel backup", + "cancel_backup_title": "Yedeklemeyi iptal et", "cancel_backup_message": "Cüzdanınızı geri yüklemek için Gizli Kurtarma İfadenizi mutlaka kaydetmenizi öneririz.", "cancel_backup_ok": "Evet, riski alıyorum", "cancel_backup_no": "Hayır, Gizli Kurtarma İfadesini yedekle", @@ -4163,7 +4229,7 @@ "cta_text": "Tamam" }, "account_backup_step_3": { - "cancel_backup_title": "Cancel backup", + "cancel_backup_title": "Yedeklemeyi iptal et", "cancel_backup_message": "Cüzdanınızı geri yüklemek için Gizli Kurtarma İfadenizi mutlaka kaydetmenizi öneririz.", "cancel_backup_ok": "Evet, riski alıyorum", "cancel_backup_no": "Hayır, Gizli Kurtarma İfadesini yedekle", @@ -4172,7 +4238,7 @@ "cta_text": "HİÇ KİMSE BENİ İZLEMİYOR" }, "account_backup_step_4": { - "cancel_backup_title": "Cancel backup", + "cancel_backup_title": "Yedeklemeyi iptal et", "cancel_backup_message": "Cüzdanınızı geri yüklemek için Gizli Kurtarma İfadenizi mutlaka kaydetmenizi öneririz.", "cancel_backup_ok": "Evet, riski alıyorum", "cancel_backup_no": "Hayır, Gizli Kurtarma İfadesini yedekle", @@ -4197,16 +4263,16 @@ "modal_button": "SONRAKİ" }, "account_backup_step_6": { - "title": "Security tips", + "title": "Güvenlik ipuçları", "info_text": "MetaMask, Gizli Kurtarma İfadenizi kaybettiğiniz takdirde kurtaramaz", "tip_1": "Gizli Kurtarma İfadenizin birden fazla yedeğini tutun", "tip_2": "İfadeyi güvenilen bir şifre yöneticisinde ve güvenli bir yerde kağıt yedekler halinde saklayın", "tip_3": "Bu ifadeyi asla hiç kimseyle paylaşmayın", "disclaimer": "* Gizli Kurtarma İfadenizi şuraya giderek bulabilirsiniz: ", - "disclaimer_bold": "Ayarlar > Güvenlik ve Gizlilik", - "cta_text": "ANLADIM!", + "disclaimer_bold": "Ayarlar > Güvenlik ve gizlilik", + "cta_text": "ANLADIM", "modal_title": "Tebrikler!", - "modal_text": "Tamamen yedeklisiniz ve gitmeye hazırsınız!", + "modal_text": "Tamamen yedeklisiniz ve gitmeye hazırsınız.", "modal_button": "BİTTİ", "copy_seed_phrase": "Gizli Kurtarma İfadesini PANOYA KOPYALA" }, @@ -4238,7 +4304,7 @@ "steps": "Adım {{currentStep}}/{{totalSteps}}", "action": "Gizli Kurtarma İfadenizi onaylayın", "info": "Eksik sözcükleri doğru sıralamada seçin.", - "complete": "Complete backup", + "complete": "Yedeklemeyi tamamla", "success": "Başarılı", "error-title": "Doğru değil", "error-description": "Gizli Kurtarma İfadenizi kontrol edip tekrar deneyin.", @@ -4253,7 +4319,7 @@ "congratulations": "Tebrikler", "success": "Cüzdanınızı başarılı bir şekilde korudunuz! Gizli Kurtarma İfadenizi güvende tutmayı unutmayın, bu sizin sorumluluğunuzdadır!", "hint": "Kendine bir ipucu bırak?", - "recover": "Kaybettiğiniz takdirde MetaMask cüzdanınızı kurtaramaz. Gizli Kurtarma İfadenizi Ayarlar > Güvenlik ve Gizlilik kısmında bulabilirsiniz.", + "recover": "Kaybettiğiniz takdirde MetaMask cüzdanınızı kurtaramaz. Gizli Kurtarma İfadenizi Ayarlar > Güvenlik ve gizlilik kısmında bulabilirsiniz.", "learn": "Daha fazlasını öğren", "done": "Bitti", "recovery_hint": "Kurtarma ipucu", @@ -4300,7 +4366,7 @@ "withdrawal_completed": "Para çekme işlemi tamamlandı", "unstake_completed": "Unstake tamamlandı", "withdrawal_requested": "Para çekme talep edildi", - "stake_ready_to_be_withdrawn": "Stake çekilmeye hazır", + "stake_ready_to_be_withdrawn": "Stake, para çekme işlemine hazır", "swap_completed": "{{from}} - {{to}} swap işlemi gerçekleştirildi", "swap": "Swap yapılan:", "sent": "{{address}} adresine gönderildi", @@ -4417,7 +4483,7 @@ "metamask_swap_completed_title": "Swap tamamlandı", "metamask_swap_completed_description": "MetaMask Swap başarılı oldu", "nft_sent_title": "NFT gönderildi", - "nft_sent_description": "Başarılı bir şekilde bir NFT gönderdiniz", + "nft_sent_description": "You successfully sent an NFT", "nft_received_title": "NFT alındı", "nft_received_description": "Yeni NFT'ler aldınız", "rocketpool_stake_completed_title": "Stake tamamlandı", @@ -4517,16 +4583,16 @@ "description_1": "Talep bağlantınız gönderilmeye hazır!", "description_2": "Bu bağlantıyı bir arkadaşınıza gönderin ve ondan da göndermesi istenecek", "copy_to_clipboard": "Panoya kopyala", - "qr_code": "QR KODU", + "qr_code": "QR kodu", "send_link": "Send link", - "request_qr_code": "Ödeme Talebi QR Kodu", + "request_qr_code": "Payment request QR code", "balance": "Bakiye" }, "receive_request": { "title": "Al", "share_title": "Share address", "share_description": "Adresinizi e-posta veya mesajla gönderin", - "qr_code_title": "QR KODU", + "qr_code_title": "QR kodu", "qr_code_description": "Adresinizi okuyabilen taranabilir bir görüntü", "request_title": "Talep", "request_description": "Arkadaşlarınızdan varlık talep edin", @@ -4541,7 +4607,7 @@ "copy_address": "Adresi kopyala" }, "experimental_settings": { - "wallet_connect_dapps": "WalletConnect Oturumları", + "wallet_connect_dapps": "WalletConnect oturumları", "wallet_connect_dapps_desc": "Aktif WalletConnect oturumlarının listesini görüntüle.", "wallet_connect_dapps_cta": "Oturumları görüntüle", "network_not_supported": "Geçerli ağ desteklenmiyor", @@ -4561,12 +4627,12 @@ "close_current_session": "Yeni bir oturum başlatmadan önce geçerli oturumu kapat." }, "paymentRequest": { - "title": "ÖDEME TALEBİ", - "title_complete": "ÖDEME TAMAMLANDI", - "confirm": "ÖDE", - "cancel": "REDDET", + "title": "Payment request", + "title_complete": "Payment complete", + "confirm": "Pay", + "cancel": "Decline", "is_requesting_you_to_pay": "ödeme yapmanızı istiyor", - "total": "TOPLAM:" + "total": "Toplam:" }, "webview_error": { "title": "Bir şeyler ters gitti", @@ -4589,6 +4655,10 @@ "fiat_on_ramp": { "buy_eth": "ETH Satın Al", "buy": "{{ticker}} Satın Al", + "on_network": "{{networkName}} üzerinde", + "debit_card": "Banka kartı", + "continue": "Devam et", + "powered_by_provider": "Destekleyen {{provider}}", "purchased_currency": "{{currency}} Satın Alındı", "network_not_supported": "Geçerli ağ desteklenmiyor", "switch_network": "Lütfen Ana Ağa geçin", @@ -4609,7 +4679,7 @@ "second_line": "yapmak istersiniz?" }, "buy_ticker": "{{ticker}} Satın Al", - "buy_ticker_stablecoins": "{{ticker}} ve Stable kripto para satın al", + "buy_ticker_stablecoins": "{{ticker}} ve stabil kripto para al", "multiple_payment_methods": "Çoklu ödeme yöntemleri", "debit_credit_bank_transfers_country": "Ülkeye göre banka/kredi ve banka havaleleri.", "debit_credit_bank_transfers_more_country": "Ülkeye göre banka/kredi, banka havaleleri ve daha fazlası.", @@ -4676,6 +4746,14 @@ "subtitle_5": "ve ne kadar gaz ücreti çıktığına bakmaktır.", "cta": "{{ticker}} satın almak için devam edin" } + }, + "build_quote_settings_modal": { + "title": "Ayarlar", + "view_order_history": "Emir geçmişini görüntüle", + "contact_support": "Destek ile iletişime geç", + "log_out": "{{provider}} oturumunu kapat", + "logged_out_success": "Oturum başarılı bir şekilde kapatıldı", + "logged_out_error": "Oturum kapatılırken hata" } }, "fiat_on_ramp_aggregator": { @@ -4706,7 +4784,7 @@ "use_new_buy_experience_description": "Yeni sürüme geç" }, "onboarding": { - "what_to_expect": "Bekleyebileceklerin", + "what_to_expect": "Ne beklenmeli", "quotes": "Kripto satın alma özelliğimiz, entegre satıcılardan teklifleri toplayarak bekleme süresi olmadan doğrudan cüzdanınıza kripto para alabilmeniz için size bu kaynaklardan teklifleri sunar.", "quotes_sell": "Artık doğrudan MetaMask'te paraya çevirebilirsiniz! Biz size yolun her adımında rehberlik ederken güvenilir sağlayıcılardan en güncel teklifleri alın.", "benefits": "Daha az gaz ücreti ödenir ve çeşitli ağ, token ve ödeme yöntemleri desteklenir", @@ -4761,7 +4839,7 @@ "get_quotes": "Teklif al", "done": "Bitti", "fetching_quotes": "Teklifler alınıyor", - "select_a_quote": "Teklif Seç", + "select_a_quote": "Bir teklif seç", "recommended_quote": "Önerilen teklif", "select_a_cryptocurrency": "Kripto para seç", "select_a_cryptocurrency_description": "Mevcut token listesinden seçiminizi yapın.", @@ -4819,15 +4897,16 @@ "region": { "buy_crypto_tokens": "Kripto token al", "sell_crypto_tokens": "Kripto token sat", - "title": "Bölgeni Seç", + "title": "Bölgeni seç", "description": "Kullanabileceğin ödeme yöntemleri ve tokenler üçüncü taraf entegrasyonlarımız tarafından belirlenir ve bölgen ile entegrasyonlarımızın desteğine bağlı olarak değişiklik gösterebilir.", "sell_description": "Nakit varış yeri seçenekleri ve tokenler bölgenize bağlı olarak değişiklik gösterebilir.", + "region_variation_notice": "Ödeme yöntemleri ve kullanılabilir tokenler bölgenize ve sağlayıcılarımıza göre değişiklik gösterebilir.", "search_by_country": "Ülkeye göre ara", "search_by_state": "Eyalete göre ara", "no_region_results": "Eşleşen bölge yok", "your_region": "Bölgeniz", "select_region": "Bölgeni seç", - "select_region_title": "Bölgeni Seç", + "select_region_title": "Bölgeni seç", "select_country_registered": "Kartının kayıtlı olduğu ülkeyi seç (bulunduğun yere bakılmaksızın).", "unsupported": "Bölge desteklenmiyor", "unsupported_description": "Mümkün olan en kısa süre içinde bölgenizi de kapsamak için çok çalışıyoruz. Bu sırada, kripto {{rampType}} için diğer yolları öğrenmek üzere destek makalemize bakın.", @@ -4849,7 +4928,7 @@ "continue_order_description": "Emrinize devam etmek için bu sayfanın alt kısmındaki düğmeyi seçmeniz gerekecek.", "the_provider": "sağlayıcı", "processing": "Emir gerçekleştiriliyor", - "processing_card_description": "Kredi Kartı/Banka Kartı satın alma işlemleri genellikle birkaç dakika sürer", + "processing_card_description": "Kredi Kartı/banka kartı satın alma işlemleri genellikle birkaç dakika sürer", "processing_bank_description": "Banka transferleri genellikle birkaç iş günü sürer", "details": "Emir bilgileri", "via": "aracı", @@ -4863,7 +4942,7 @@ "support": "Destek", "view_order_status": "Emir durumunu {{provider}} üzerinde görüntüleyin", "id": "Emir Numarası", - "date_and_time": "Tarih ve Saat", + "date_and_time": "Tarih ve saat", "payment_method": "Ödeme yöntemi", "destination": "Varış yeri", "token_amount": "Token miktarı", @@ -4883,11 +4962,11 @@ "sent": "Gönderildi!" }, "notifications": { - "purchase_failed_title": "{{currency}} satın alma işlemi başarısız oldu! Lütfen tekrar deneyin, verdiğimiz rahatsızlıktan dolayı özür dileriz!", + "purchase_failed_title": "{{currency}} satın alma işlemi başarısız oldu. Lütfen birazdan tekrar deneyin.", "purchase_failed_description": "Ödeme yönteminizi ve kart desteğini doğrulayın", "purchase_cancelled_title": "Satın alma işleminiz iptal edildi", "purchase_cancelled_description": "Ödeme yönteminizi ve kart desteğini doğrulayın", - "purchase_completed_title": "{{amount}} {{currency}} satın alma işleminiz başarılı oldu!", + "purchase_completed_title": "{{amount}} {{currency}} satın alma işleminiz başarılı oldu.", "purchase_completed_description": "{{currency}} para biriminiz artık kullanılabilir", "purchase_pending_title": "{{currency}} satın alma işleminiz gerçekleşiyor", "purchase_pending_description": "Bu işlem sadece birkaç dakika sürecektir...", @@ -4921,7 +5000,7 @@ "start_swapping": "Swap işlemine başlayın" }, "feature_off_title": "Geçici olarak kullanılamıyor", - "feature_off_body": "MetaMask Swaps şu anda bakım altındadır. Lütfen daha sonra tekrar kontrol edin.", + "feature_off_body": "MetaMask Swaps are undergoing maintenance. Please check back later.", "wrong_network_title": "Swaplar kullanılamıyor", "wrong_network_body": "Sadece Ethereum Ana Ağında token swap işlemi gerçekleştirebilirsiniz.", "unallowed_asset_title": "Bu token ile swap gerçekleştirilemiyor", @@ -5002,7 +5081,7 @@ "edit": "Düzenle", "quotes_include_fee": "%{{fee}} MetaMask ücreti tekliflere dahildir", "quotes_include_gas_and_metamask_fee": "Gaz ve %{{fee}} MetaMask ücreti teklife dahildir", - "tap_to_swap": "Swap gerçekleştirmek için dokun", + "tap_to_swap": "Tap to swap", "swipe_to_swap": "Swap gerçekleştirmek için kaydır", "swipe_to": "Swap gerçekleştirmek için", "swap": "Swap Yap", @@ -5302,7 +5381,7 @@ }, "network_information": { "things_to_keep_in_mind": "Akılda tutulması gerekenler", - "testnet_network": "{{type}} Test Ağı", + "testnet_network": "{{type}} test Ağı", "first_description": "Bu ağdaki yerli token {{ticker}}. Bu, gaz ücretleri için kullanılan token'dır.", "second_description": "Varlıkları doğrudan bir ağdan diğerine göndermeye çalışırsan bu, kalıcı varlık kaybına neden olabilir. Bir köprü kullandığından emin ol.", "third_description": "Tokenleriniz cüzdanınızda otomatik olarak görünmeyebilir.", @@ -5385,7 +5464,7 @@ "learn_more": "Daha fazla bilgi edin" }, "token_allowance": { - "verify_third_party_details": "Üçüncü taraf bilgilerini doğrula", + "verify_third_party_details": "Verify third-party details", "protect_from_scams": "Kendinizi dolandırıcılardan korumak için bir dakikanızı ayırarak üçüncü taraf bilgilerini doğrulayın.", "learn_to_verify": "Üçüncü taraf bilgilerinin nasıl doğrulanacağını öğrenin", "spending_cap": "harcama üst limiti", @@ -5399,7 +5478,7 @@ }, "restore_wallet": { "restore_needed_title": "Geri yükleme gerekiyor", - "restore_needed_description": "Bir sorunla karşılaşıldı ama endişelenme! Cüzdanını geri geri yüklemeye çalışalım.", + "restore_needed_description": "Something went wrong, but don’t worry! Let’s try to restore your wallet.", "restore_needed_action": "Cüzdanı geri yükle" }, "wallet_restored": { @@ -5545,7 +5624,7 @@ "add_bitcoin_account": "Bitcoin hesabı", "add_solana_account": "Solana hesabı", "add_tron_account": "Tron hesabı", - "switch_to_smart_account": "Akıllı Hesaba Geçiş Yap", + "switch_to_smart_account": "Akıllı hesaba geçiş yap", "rename_account": "Hesabı yeniden adlandır", "addresses": "Adresler", "headers": { @@ -5598,6 +5677,10 @@ "error_description": "{{snap}} yüklemesi başarısız oldu." }, "earn": { + "claimable_bonus_tooltip": "An annual bonus claimable daily from your wallet.", + "earn_a_percentage_bonus": "Earn a {{percentage}}% bonus", + "claimable_bonus": "Claimable bonus", + "claim_bonus": "Claim bonus", "empty_state_cta": { "heading": "{{tokenSymbol}} borç verin ve kazanın", "body": "{{protocol}} ile {{tokenSymbol}} token'ınızı borç verin ve", @@ -5681,21 +5764,36 @@ "fee": "Ücret" }, "musd_conversion": { - "convert_to_musd": "Convert to mUSD", + "ok": "Tamam", + "continue": "Continue", + "convert_and_get_percentage_bonus": "Dönüştür ve %{{percentage}} al", + "get_a_percentage_musd_bonus": "%{{percentage}} mUSD bonus al", + "convert": "Dönüştür", "toasts": { - "converting": "Converting {{token}} → mUSD", + "converting": "{{token}} → mUSD dönüştürülüyor", "eta": "~{{time}}", - "delivered": "Your mUSD has been delivered!", - "failed": "mUSD conversion failed" + "delivered": "mUSD'niz hazır!", + "failed": "mUSD dönüştürme işlemi başarısız oldu" }, "education": { - "heading": "mUSD ile ödül kazan", - "description": "Convert your USDC, USDT, or DAI for mUSD, MetaMask’s dollar-backed stablecoin.Earn points every time you convert or hold $100.", - "continue_button": "Başlarken" + "heading": "STABİL KRİPTO PARALARDA\n%{{percentage}} AL", + "description": "Convert your stablecoins to mUSD, MetaMask’s US dollar-backed stablecoin, and receive up to a {{percentage}}% bonus.", + "terms_apply": "Terms apply.", + "primary_button": "Başlarken", + "secondary_button": "Şimdi değil" }, - "earn_points_daily": "Earn points daily", - "buy_musd": "Buy mUSD", - "get_musd": "Get mUSD" + "buy_musd": "mUSD al", + "get_musd": "mUSD kazan", + "boost_title": "Get {{percentage}}% on your stablecoins", + "boost_description": "Convert your stablecoins to mUSD and receive up to a {{percentage}}% bonus.", + "powered_by_relay": "Destekleyen Relay" + }, + "bonus_claim": { + "toasts": { + "claiming": "Your mUSD bonus is processing", + "delivered": "Your mUSD bonus is here!", + "failed": "Bonus claim failed" + } }, "rewards": { "rewards_tag_label": "Ödüller", @@ -5711,22 +5809,22 @@ "stake": "Pay", "earn": "Kazan", "tron": { - "stake_completed": "Staking completed", - "stake_completed_description": "Your staking transaction has been completed successfully.", - "stake_failed": "Staking failed", + "stake_completed": "Stake işlemi tamamlandı", + "stake_completed_description": "Stake işleminiz başarılı bir şekilde tamamlandı.", + "stake_failed": "Stake işlemi başarısız oldu", "unstake_completed": "Unstake tamamlandı", - "unstake_completed_description": "Your unstaking transaction has been completed successfully.", - "unstake_failed": "Unstaking failed", + "unstake_completed_description": "Unstake işleminiz başarılı bir şekilde tamamlandı.", + "unstake_failed": "Unstake işlemi başarısız oldu", "bandwidth": "Bant genişliği", "energy": "Enerji", "estimated_annual_reward": "Tahmini yıllık ödül", - "trx_locked_for": "TRX locked for", - "trx_locked_for_minimum_time": "~3 days", - "trx_released_in": "TRX released in", - "trx_released_in_minimum_time": "~14 days", + "trx_locked_for": "TRX kilitli kalma süresi", + "trx_locked_for_minimum_time": "~3 gün", + "trx_released_in": "TRX serbest bırakılmasına kalan süre", + "trx_released_in_minimum_time": "~14 gün", "fee": "Ücret", "errors": { - "insufficient_balance": "You don't have enough resource balance to do this action." + "insufficient_balance": "Bu eylemi gerçekleştirmek için yeterli kaynak bakiyeniz yok." } }, "stake_eth": "ETH Stake Et", @@ -5772,12 +5870,19 @@ "learn_more_with_period": "Daha fazla bilgi edinin." }, "stake_your_trx_cta": { - "title": "Lend Tron and earn", - "description_start": "Stake your Tron and earn ", + "title": "Tron borç ver ve şunu kazan:", + "description_start": "Tron'unu stake et ve şunu kazan: ", "description_end": " yıllık kazanç sağlayın.", "learn_more": "Daha fazla bilgi edinin.", "earn_button": "Kazan" }, + "trx_learn_more": { + "title": "Stake TRX and earn", + "stake_any_amount": "Stake any amount of TRX.", + "earn_trx_rewards": "TRX ödülleri kazan.", + "earn_trx_rewards_description": "Stake eder etmez kazanmaya başlayın. Ödüller otomatik olarak birikir.", + "flexible_unstaking_description": "Unstake anytime. Unstaking takes 14 days to process." + }, "day": { "zero": "", "one": "gün", @@ -6002,14 +6107,15 @@ "transaction_fee": "Tokenlerinizi Sürekli Vadeli İşlem Sözleşmelerinin kullandığı HyperCore ağı üzerinden USDC’ye çevireceğiz. Takas sağlayıcıları ücret alabilir, ancak MetaMask ücret talep etmez." }, "predict_deposit": { - "transaction_fee": "Token'larınızı Predict'in kullandığı Polygon ağı üzerinden USDC ile takas edeceğiz. Takas sağlayıcıları ücret alabilir ancak MetaMask ücret talep etmez." + "transaction_fee": "Tokenlerinizi Tahminler tarafından kullanılan Polygon ağı üzerinden USDC ile takas edeceğiz. Takas sağlayıcıları ücret alabilir ancak MetaMask ücret talep etmez." }, "musd_conversion": { - "transaction_fee": "mUSD conversion fees include network costs and may include provider fees." + "transaction_fee": "mUSD dönüştürme ücretlerine ağ ücretleri dahildir ve sağlayıcı ücretleri dahil olabilir." }, "title": { "transaction_fee": "Ücretler" - } + }, + "network_fee": "Ağ ücretleri, ağın yoğunluğuna ve işlemin karmaşıklığına bağlıdır." }, "spending_cap": "Harcama üst limiti", "withdraw": "Çek", @@ -6026,7 +6132,7 @@ "qr_get_sign": "Get signature", "qr_scan_text": "Donanım cüzdanınızla tarayın", "sign_with_ledger": "Ledger ile oturum aç", - "smart_account": "Akıllı Hesap", + "smart_account": "Akıllı hesap", "smart_contract": "Akıllı sözleşme", "standard_account": "Standard account", "siwe_message": { @@ -6061,7 +6167,7 @@ "unavailable": "Mevcut değil" }, "7702_functionality": { - "smartAccountLabel": "Akıllı Hesap", + "smartAccountLabel": "Akıllı hesap", "standardAccountLabel": "Standard account", "switch": "Değiştir", "switchBack": "Geri dön", @@ -6078,7 +6184,7 @@ }, "includes_transaction": "{{transactionCount}} işlem içerir", "useSmartAccount": "Akıllı hesap kullan", - "successful": "Başarılı!", + "successful": "Başarılı", "success_message": "Bir sonraki işleminizle hesabınız akıllı hesaba güncellenecektir." }, "edit_spending_cap_modal": { @@ -6086,9 +6192,9 @@ "cancel": "İptal et", "description": "Sizin adınıza harcanması konusunda rahat hissettiğiniz tutarı girin.", "invalid_number_error": "Harcama üst limiti bir sayı olmalıdır", - "no_empty_error": "Harcama üst limiti boş olamaz", - "no_extra_decimals_error": "Harcama üst limiti token'dan daha fazla ondalık basamak içeremez", - "no_zero_error": "Harcama üst limiti 0 olamaz", + "no_empty_error": "Spending cap can't be empty", + "no_extra_decimals_error": "Spending cap can't have more decimals than the token", + "no_zero_error": "Spending cap can't be 0", "no_zero_error_decrease_allowance": "0 harcama üst limitinin 'decreaseAllowance' yönteminde hiçbir etkisi yoktur", "no_zero_error_increase_allowance": "0 harcama üst limitinin 'increaseAllowance' yönteminde hiçbir etkisi yoktur", "save": "Kaydet", @@ -6119,7 +6225,7 @@ "edit_amount_done": "Devam et", "deposit_edit_amount_done": "Fon ekle", "deposit_edit_amount_predict_withdraw": "Çek", - "deposit_edit_amount_musd_conversion": "Convert to mUSD" + "deposit_edit_amount_musd_conversion": "mUSD'ye dönüştür" }, "change_in_simulation_modal": { "title": "Sonuçlar değişti", @@ -6144,6 +6250,8 @@ "confirm_swap": "Swap Yap", "terms_and_conditions": "Şart ve Koşullar", "select_token": "Token seç", + "no_tokens_found": "Token bulunamadı", + "no_tokens_found_description": "We couldn't find any tokens with this name. Try a different search.", "select_network": "Ağ seç", "all_networks": "Tüm ağlar", "num_networks": "{{numNetworks}} ağ", @@ -6151,6 +6259,7 @@ "select_all_networks": "Tümünü seç", "deselect_all_networks": "Tümünün seçimini kaldır", "see_all": "Tümünü gör", + "all": "Tümü", "apply": "Uygula", "slippage": "Kayma", "slippage_info": "Emrinizin verildiği zaman ile onaylandığı zaman arasında fiyat değişirse buna “kayma” denir. Kayma burada belirlediğiniz toleransı aşarsa swap işleminiz otomatik olarak iptal edilir.", @@ -6191,9 +6300,9 @@ "title": "Köprü", "submitting_transaction": "Gönderiliyor", "fetching_quote": "Teklif alınıyor", - "fee_disclaimer": "%{{feePercentage}} MM ücreti dahildir.", + "fee_disclaimer": "Includes {{feePercentage}}% MetaMask fee.", "no_mm_fee": "MM ücreti yok", - "no_mm_fee_disclaimer": "{{destTokenSymbol}} takasında MM ücreti yok.", + "no_mm_fee_disclaimer": "No MetaMask fee swapping into {{destTokenSymbol}}.", "hardware_wallet_not_supported": "Donanım cüzdanları henüz desteklenmiyor. Devam etmek için sıcak cüzdan kullanın.", "hardware_wallet_not_supported_solana": "Donanım cüzdanları henüz Solana için desteklenmiyor. Devam etmek için sıcak cüzdan kullanın.", "price_impact_info_title": "Piyasa etkisi", @@ -6208,15 +6317,7 @@ "approval_tooltip_content": "{{amount}} {{symbol}} belirtilen tutara erişim veriyorsunuz. Sözleşmenin daha fazla fona erişimi olmayacak.", "minimum_received": "Minimum received", "minimum_received_tooltip_title": "Minimum received", - "minimum_received_tooltip_content": "Kayma toleransınıza göre işleminiz gerçekleştirilirken fiyat değişirse alacağınız minimum tutar. Bu, likidite sağlayıcılarımızdan alınan bir tahmindir. Nihai tutarlar değişiklik gösterebilir.", - "verified_token": "Doğrulanmış token", - "price": "Fiyat", - "percent_change": "Yüzde değişikliği", - "volume": "Hacim", - "market_cap_fdv": "Piyasa değeri (FDV)", - "listed_on": "Listelendiği yer", - "centralized_exchanges": "Merkezi borsalar", - "contract_address": "Sözleşme adresi" + "minimum_received_tooltip_content": "Kayma toleransınıza göre işleminiz gerçekleştirilirken fiyat değişirse alacağınız minimum tutar. Bu, likidite sağlayıcılarımızdan alınan bir tahmindir. Nihai tutarlar değişiklik gösterebilir." }, "quote_expired_modal": { "title": "Yeni teklifler mevcut", @@ -6290,12 +6391,12 @@ "title": "Cüzdan kurtarma", "login_with_social": "Sosyal medya hesapları ile oturum aç", "setup": "Kur", - "secret_recovery_phrase": "Gizli kurtarma ifadesi {{num}}", + "secret_recovery_phrase": "Secret Recovery Phrase {{num}}", "back_up": "Yedekle", "reveal": "Açığa Çıkar", "social_recovery_title": "{{authConnection}} KURTARMA", "social_recovery_enable": "Etkinleştirildi", - "social_login_description": "Hesabınızı ve gizli kurtarma ifadelerinizi kurtarmak için {{authConnection}} oturumunuzu ve MetaMask şifrenizi kullanın.", + "social_login_description": "Hesabınızı ve Gizli Kurtarma İfadelerinizi kurtarmak için {{authConnection}} oturumunuzu ve MetaMask şifrenizi kullanın.", "srps_title": "GİZLİ KURTARMA İFADELERİ", "srps_description": "Cüzdanınız en çok her iki kurtarma yöntemi de ayarlandığında en iyi şekilde korunur. Bir tanesi başarısız olursa diğeri cüzdanınızı kurtarmanıza yardımcı olur." }, @@ -6349,7 +6450,7 @@ "section_1_title": "Çoklu zincir hesapları nedir?", "section_1_description": "Bir hesap, MetaMask'in desteklediği tüm ağlardaki adresler. Başka bir deyişle artık hesap değiştirmeden Ethereum, Solana ve daha fazlasını kullanabilirsiniz.", "section_2_title": "Aynı adres, daha fazla ağ", - "section_2_description": "Hesaplarınızı gruplandırdık, yani MetaMask'i önceden olduğu gibi kullanmaya devam edebilirsiniz. Fonlarınız güvende ve herhangi bir değişiklik söz konusu değil", + "section_2_description": "Hesaplarınızı gruplandırdık, yani MetaMask'i önceden olduğu gibi kullanmaya devam edebilirsiniz. Fonlarınız güvende ve herhangi bir değişiklik söz konusu değil.", "view_accounts_button": "Hesapları görüntüle", "learn_more_button": "Daha fazla bilgi edin", "setting_up_accounts": "Hesaplarınızın kurulumu" @@ -6511,8 +6612,10 @@ }, "card_onboarding": { "title": "Harca\nve\nKazan", - "description": "MetaMask Kartı, kriptonuzu nakit gibi harcamanın ve ödül kazanmanın hızlı ve kolay yoludur.", + "description": "MetaMask Kart, kriptonuzu harcamanın ve %3'e varan para iadesi kazanmanın hızlı ve kolay yoludur.", "apply_now_button": "Hemen başvur", + "login_button": "Giriş yap", + "not_now_button": "Şimdi değil", "sign_up": { "title": "Başlayalım", "description": "Crypto Life tarafından sağlanan MetaMask Card hesabınızı oluşturun. Bu, MetaMask hesabınızdan ayrı bir hesap olacaktır.", @@ -6540,6 +6643,7 @@ "phone_number_label": "Telefon numarası girin", "country_area_code_label": "Ülke alan kodu", "invalid_phone_number": "Geçersiz telefon numarası", + "invalid_us_phone_number": "İlerlemek için lütfen geçerli bir ABD telefon numarası (10 haneli) girin.", "legal_terms": "Devam ederek, telefon numaranızı doğrulamak için SMS almayı kabul etmiş olursunuz." }, "confirm_phone_number": { @@ -6576,8 +6680,8 @@ "terms": "Onaylar genellikle yaklaşık 12 saat sürer. Bir karar verildiğinde sizi bilgilendireceğiz." }, "verifying_veriff_kyc": { - "title": "Kimliğiniz doğrulanıyor", - "description": "Biz kimliğinizi doğrularken lütfen bekleyin.", + "title": "Onay bekliyor", + "description": "Başvurunuzun onaylanması için iş ortağımızın kimliğinizi doğrulaması gerekiyor.", "helper_text": "Bu işlem genellikle birkaç saniye sürer. Lütfen uygulamayı kapatmayın." }, "verifying_registration": { @@ -6614,7 +6718,7 @@ }, "physical_address": { "title": "Adresinizi ekleyin", - "description": "Ev adresinizi girin. Onaylanırsa fiziksel kartınızı bu adrese göndereceğiz.", + "description": "Geçerli ev adresinizi girin. Bu bilgiyi doğrulama maksadıyla kullanacağız.", "address_line_1_label": "Adres satırı 1", "address_line_2_label": "Adres satırı 2", "city_label": "Şehir", @@ -6622,7 +6726,7 @@ "zip_code_label": "Zip kodu", "country_label": "Ülke", "electronic_consent_1": "E-İmza Yasası Onay ve Açıklamalarını ve tüm iletişimleri elektronik olarak almayı kabul ediyorum. ", - "electronic_consent_2": "View document(PDF)" + "electronic_consent_2": "Belgeyi görüntüle (PDF)" }, "mailing_address": { "title": "Posta adresi", @@ -6668,22 +6772,24 @@ } }, "card_home": { + "title": "Card", + "available_balance": "Kullanılabilir bakiye", "error_title": "Veriler alınamıyor", "error_description": "Bu sayfadaki içeriği görüntülemenizi önleyen bir sorun var gibi görünüyor. Lütfen bağlantınızı kontrol edin veya sayfayı yenilemeyi deneyin.", "try_again": "Tekrar dene", - "limited_spending_warning": "Gerçek harcama kapasiteniz sınırlı olabilir. Limitinizi ayarlamak için {{manageCard}} alanına gidin", + "limited_spending_warning": "Your actual spending ability may be limited. To adjust your limit, go to ", "add_funds": "Para ekle", "change_asset": "Varlık değiştir", "enable_card_button_label": "Kartı etkinleştir", "enable_assets_button_label": "Varlıkları etkinleştir", "spending_limit_warning": "Harcama limitinize yaklaştınız. Reddedilmeleri önlemek için güncelleyin.", "logout": "Oturumu kapat", - "logout_description": "MetaMask Kart hesabınızın oturumunu kapatın", "logout_confirmation_title": "Kart oturumu kapatılsın mı?", "logout_confirmation_message": "MetaMask Kart hesabınızın oturumunu kapatmak istediğinizden emin misiniz?", "logout_confirmation_cancel": "İptal", "logout_confirmation_confirm": "Oturumu kapat", "enable_card_error": "Kart etkinleştirilemedi. Lütfen daha sonra tekrar deneyin.", + "view_card_details_error": "Unable to load card details. Please try again.", "warnings": { "close_spending_limit": { "title": "Harcama limitinize yakınsınız", @@ -6706,11 +6812,21 @@ "blocked": { "title": "Kartınız bloke edilmiş", "description": "Kartınızın blokesini kaldırmak için lütfen destek ekibiyle iletişime geçin" + }, + "kyc_pending": { + "title": "Doğrulama işlemi devam ediyor", + "description": "Your identity verification is being reviewed. This typically takes less than 12 hours." + } + }, + "messages": { + "card_provisioning": { + "title": "Card being created", + "description": "Your card is being created. This may take a few moments." } }, "kyc_status": { "pending": { - "title": "Doğrulama İşlemi Devam Ediyor", + "title": "Doğrulama işlemi devam ediyor", "description": "Kimlik doğrulama işleminiz gerçekleştiriliyor. Bu işlem genellikle birkaç dakika sürer. Kartınızı etkinleştirmek için lütfen kısa bir süre sonra tekrar kontrol edin." }, "rejected": { @@ -6729,33 +6845,46 @@ "ok_button": "Tamam" }, "manage_card_options": { - "manage_spending_limit": "Harcama limitini yönet", + "view_card_details": "View card details", + "hide_card_details": "Hide card details", + "view_card_details_description": "Card number, expiration and CVV", + "manage_spending_limit": "Manage limit", "manage_spending_limit_description_restricted": "Sınırlı harcama açık", "manage_spending_limit_description_full": "Tam erişim açık", "manage_card": "Kartı yönet", - "advanced_card_management_description": "Kart bilgilerine, işlemlere ve daha fazlasına göz at", + "advanced_card_management_description": "See activity, cashback, freeze card, and more", "travel_title": "MetaMask Travel", - "travel_description": "Expedia'ya kıyasla %60'a varan indirimlerle otel rezervasyonu yapın", - "card_tos_title": "Kart Şart ve Koşulları", - "card_tos_description": "Kart sağlayıcısının şartlarını okuyun" + "travel_description": "Book hotels with up to 70% discounts", + "card_tos_title": "Terms and conditions" } }, "card_spending_limit": { "title_change_token": "Token'ı ve ağı değiştir", "title_enable_token": "Token'ı etkinleştir", + "title_onboarding": "Harcamayı etkinleştir", + "setup_title": "Set up your card", + "setup_description": "Select the token you'd like to use and set a limit for how much you can spend.", + "asset_label": "Varlık", + "limit_label": "Limit", + "other_token": "Other", "full_access_title": "Tam erişim", - "full_access_description": "Kartınız, her defasında onay istemeden fonlarınızı otomatik olarak kullanabilir.", - "restricted_limit_title": "Sınırlı harcama", - "restricted_limit_description": "Limiti her artırmak istediğinizde tekrar gelip bir ağ ücreti ödemeniz gerekecek.", + "full_access_description": "Your card can use your funds automatically without asking for approval each time.", + "restricted_limit_title": "Harcama limiti", + "restricted_limit_description": "Yalnızca bu limite kadar harcama yapabilirsiniz. Bu limit güncellendiğinde her defasında bir ağ ücreti ödeyeceksiniz.", "edit_limit": "Limiti düzenle", "confirm_new_limit": "Onayla", "cancel": "İptal et", + "skip": "Şimdilik atla", "set_new_limit": "Bir limit ayarla", "dismiss": "Yok say", "update_success": "Harcama limiti başarılı bir şekilde güncellendi", "update_error": "Harcama limiti güncellenemedi", "solana_not_supported": "card.metamask.io adresinde Solana token'larını etkinleştir", - "select_token": "Token seç" + "select_token": "Token seç", + "loading": "Kullanılabilir tokenler yükleniyor...", + "load_error": "Tokenler yüklenemedi. Lütfen tekrar deneyin.", + "retry": "Tekrar dene", + "on_linea": "Linea üzerinde" }, "change_asset": { "title": "Token'ı ve ağı değiştir", @@ -6793,6 +6922,7 @@ "signup_button": "Kaydol", "errors": { "invalid_credentials": "Geçersiz giriş bilgileri", + "invalid_otp_code": "Kod yanlış, lütfen tekrar deneyin", "unknown_error": "Bilinmeyen hata, lütfen daha sonra tekrar deneyin", "email_required": "E-posta gerekli", "password_required": "Şifre gerekli", @@ -6811,7 +6941,7 @@ "description_without_phone_number": "Telefon numaranıza bir onay kodu gönderdik. Devam etmek için lütfen kodu girin.", "confirm_code_label": "Onay kodu", "confirm_button": "Onayla", - "back_to_login_button": "Oturum Açma Sayfasına Geri Dön", + "back_to_login_button": "Oturum açma sayfasına geri dön", "didnt_receive_code": "Kodu almadınız mı? ", "resend_verification": "Tekrar gönder", "resend_cooldown": "{{seconds}} saniye sonra tekrar gönderilebilir" @@ -6839,8 +6969,8 @@ }, "rewards": { "auth_fail_title": "Bilinmeyen hata.", - "auth_fail_description": "Bu hesabın ödüller programıyla doğrulanması sırasında bilinmeyen bir hata oluştu. Lütfen daha sonra tekrar deneyin.", - "failed_to_authenticate": "Ödüller programıyla doğrulanamadı", + "auth_fail_description": "Bu hesabın MetaMask Ödüller programıyla doğrulanması sırasında bilinmeyen bir hata oluştu. Daha sonra tekrar deneyin.", + "failed_to_authenticate": "MetaMask Ödüller programıyla doğrulanamadı", "not_implemented": "Çok yakında", "not_implemented_season_summary": "Sezon özeti çok yakında", "optin_error": { @@ -6867,6 +6997,10 @@ "error_fetching_description": "Bağlantınızı kontrol edin ve tekrar deneyin.", "retry_button": "Tekrar Dene" }, + "linea_tokens": { + "default_title": "$LINEA", + "title_earned": "{{amount}} $LINEA kazandınız" + }, "upcoming_rewards_error": { "error_fetching_title": "Ödüller yüklenemedi", "error_fetching_description": "Bağlantınızı kontrol edin ve tekrar deneyin.", @@ -6898,6 +7032,15 @@ "claim_reward_error": { "title": "Ödül alınamadı" }, + "metal_card_claim": { + "title": "Ödülünüzü alın", + "description": "MetaMask Metal Card, uygunluğa tabidir ve her bölgede mevcut değildir. Uygunluk kazanamazsanız onun yerine premium ürün ödülü alacaksınız.", + "contact_info": "İletişim bilgilerinizi paylaşın; 2 hafta içinde @MidwitMilhouse Telegram kullanıcısından veya christian.montoya@consensys.net adresinden geri dönüş alacaksınız.", + "email_label": "E-posta", + "email_validation_error": "Lütfen geçerli bir e-posta adresi girin", + "telegram_label": "Telegram kullanıcı adı", + "telegram_placeholder": "İsteğe bağlı" + }, "accounts_opt_in_state_error": { "error_fetching_title": "Hesaplar yüklenemedi", "error_fetching_description": "Bağlantınızı kontrol edin ve tekrar deneyin.", @@ -6979,7 +7122,7 @@ "gtm_title": "Ödüller burada", "gtm_description": "Aktivitelerinizden puan kazanın. \nSeviyelerde ilerleyerek ödüllerin kilidini açın.", "gtm_confirm": "Başlarken", - "intro_title": "Sezon 1 \nBaşladı", + "intro_title": "Sezon 1 \nbaşladı", "intro_description": "Aktivitelerinizden puan kazanın. \nSeviyelerde ilerleyerek ödüllerin kilidini açın.", "intro_confirm": "250 puan alın", "intro_confirm_geo_loading": "Bölge kontrol ediliyor...", @@ -7052,12 +7195,12 @@ "dashboard_modal_info": { "active_account": { "title": "Kaçırmayın", - "description": "Aktivitenizden puan kazanmaya başlamak için hesabınızı ekleyin.", + "description": "Add your account to Rewards.", "confirm": "Hesap ekleyin" }, "multiple_unlinked_accounts": { - "title": "Puan kazanmaya başla", - "description": "Ödüllerinizi bir bakışta takip edebilmek için hesaplarınızı ekleyin.", + "title": "Kaçırmayın", + "description": "Add your accounts to Rewards.", "confirm": "Hesaplar ekle" }, "account_not_supported": { @@ -7110,10 +7253,10 @@ } }, "predict": { - "title": "Tahmin piyasaları", + "title": "Tahminler", "description": "Her 10$ tahminde 20 puan", "sheet": { - "title": "Tahmin piyasaları", + "title": "Tahminler", "points": "Her 10$ için 20 puan", "description": "Her 10$ işlemde puan kazanın.", "cta_label": "Piyasalara göz at" @@ -7191,6 +7334,19 @@ "time_left": "kaldı", "expired": "Süresi doldu" }, + "end_of_season_rewards": { + "confirm_label_default": "Onayla", + "confirm_label_access": "Erişim", + "redeem_success_title": "Ödül kullanıldı", + "metal_card_claim_success": "İletişim bilgileri onaylandı", + "linea_tokens_claim_success": "Adres onaylandı", + "arriving_soon": "Çok yakında", + "check_back_soon": "Almak için bir süre sonra tekrar kontrol edin", + "redeem_failure_title": "Kullanılamadı", + "redeem_failure_description": "Lütfen daha sonra tekrar deneyin.", + "reward_details": "Ödül Bilgileri", + "select_account_description": "Bu ödülün gönderilmesini istediğiniz hesabı seçin. Tokenler iki hafta içinde dağıtılacaktır." + }, "animation": { "could_not_load": "Yüklenemedi" } @@ -7257,13 +7413,13 @@ "still_connecting_network": "Halen {{networkName}} ağına bağlanılıyor...", "unable_to_connect_network": "{{networkName}} ağına bağlanılamıyor.", "update_rpc": "RPC'yi güncelle", + "switch_to_metamask_default_rpc": "Switch to MetaMask default RPC", "check_network_connectivity": "Ağ bağlantınızı kontrol edin.", - "check_network_connectivity_or": "Ağ bağlantınızı kontrol edin veya" + "check_network_connectivity_or": "Ağ bağlantınızı kontrol edin veya", + "updated_to_metamask_default": "Updated to MetaMask default" }, "trending": { "title": "Explore", - "view_all": "View all", - "tokens": "Token'lar", "trending_tokens": "Trending tokens", "price_change": "Price change", "all_networks": "Tüm ağlar", @@ -7295,6 +7451,10 @@ "title": "Trending tokens is not available", "description": "We can't fetch this page right now", "try_again": "Tekrar dene" + }, + "empty_search_result_state": { + "title": "Token bulunamadı", + "description": "We were not able to find this token" } }, "ota_update_modal": { diff --git a/locales/languages/vi.json b/locales/languages/vi.json index afaf8faeb18b..2daa187e2e89 100644 --- a/locales/languages/vi.json +++ b/locales/languages/vi.json @@ -8,7 +8,7 @@ "increment": "Tăng Bộ đếm Redux" }, "pet_name": { - "list_count_text": "Pet names on this network", + "list_count_text": "Tên thú trên mạng này", "add_pet_name_button": "Add pet name", "address": "Địa chỉ", "address_placeholder": "0x...", @@ -193,11 +193,10 @@ "connector": "tại" }, "autocomplete": { - "placeholder": "Tìm kiếm theo token, trang web hoặc địa chỉ", + "placeholder": "Tìm kiếm theo trang web hoặc địa chỉ", "recents": "Gần đây", "favorites": "Yêu thích", - "sites": "Trang web", - "tokens": "Token" + "sites": "Trang web" }, "navigation": { "back": "Quay lại", @@ -306,7 +305,7 @@ "get_started": "Bắt đầu" }, "onboarding_wizard": { - "skip_tutorial": "Skip tutorial", + "skip_tutorial": "Bỏ qua hướng dẫn", "coachmark": { "action_back": "Không, cảm ơn", "action_next": "Xem một vòng", @@ -330,12 +329,12 @@ "content3": "ngay để sửa tên tài khoản." }, "step4": { - "title": "Main menu", - "content1": "Bạn có thể truy cập lịch sử Giao dịch, Cài đặt và Hỗ trợ từ trình đơn này.", + "title": "Trình đơn chính", + "content1": "Bạn có thể truy cập lịch sử giao dịch, cài đặt và hỗ trợ từ trình đơn này.", "content2": "Bạn có thể thực hiện nhiều hành động hơn với tài khoản của mình và truy cập phần cài đặt của MetaMask." }, "step5": { - "title": "Khám phá Trình duyệt", + "title": "Khám phá trình duyệt", "content1": "Bạn có thể dùng trình duyệt để khám phá web3" }, "step6": { @@ -596,9 +595,9 @@ "transaction_activity": "Hoạt động", "request_feature": "Yêu cầu một tính năng", "submit_feedback_message": "Chọn loại ý kiến phản hồi để gửi.", - "submit_bug": "Bug report", + "submit_bug": "Báo cáo lỗi", "submit_general_feedback": "Chung", - "share_address": "Share my public address", + "share_address": "Chia sẻ địa chỉ công khai của tôi", "view_in_etherscan": "Xem trên Etherscan", "view_in": "Xem trên", "browser": "Trình duyệt", @@ -612,12 +611,13 @@ "lock_cancel": "KHÔNG", "feedback": "Phản hồi", "metamask_support": "Hỗ trợ MetaMask", - "public_address": "Public address" + "public_address": "Địa chỉ công khai" }, "send": { "available": "khả dụng", "invalid_value": "Giá trị không hợp lệ", "insufficient_funds": "Không đủ tiền", + "insufficient_balance_to_cover_fee": "Insufficient balance to cover fees", "continue": "Tiếp tục", "unit": "đơn vị", "units": "đơn vị", @@ -643,8 +643,8 @@ "no_tokens_available": "Không có token khả dụng", "sign": "Ký", "network_not_found_title": "Không tìm thấy mạng", - "network_not_found_description": "Không tìm thấy mạng với ID chuỗi là {{chain_id}} trên ví của bạn. Vui lòng thêm mạng trước.", - "network_missing_id": "Thiếu ID chuỗi.", + "network_not_found_description": "Network with chain ID {{chain_id}} not found in your wallet. Please add the network first.", + "network_missing_id": "Missing chain ID.", "search_tokens": "Tìm kiếm token", "search_tokens_and_nfts": "Tìm kiếm token và NFT", "tokens": "Token", @@ -675,13 +675,13 @@ "limitError": "Không thể kiểm tra hạn mức nạp của bạn. Vui lòng thử lại sau." }, "token_modal": { - "select_a_token": "Chọn Token", + "select_a_token": "Chọn token", "select_token": "Chọn token", "search_by_name_or_address": "Tìm kiếm token theo tên hoặc địa chỉ", "no_tokens_found": "Không có token nào khớp với \"{{searchString}}\"", "unsupported_token_title": "Không có sẵn", - "unsupported_token_description": "This token may not be available in your region or supported by any local payment providers", - "error_loading_tokens": "Unable to load tokens. Please try again later." + "unsupported_token_description": "Token này có thể không khả dụng ở khu vực của bạn hoặc không được hỗ trợ bởi bất kỳ nhà cung cấp dịch vụ thanh toán địa phương nào", + "error_loading_tokens": "Không thể tải token. Vui lòng thử lại sau." }, "networks_filter_bar": { "all_networks": "Tất cả mạng" @@ -696,12 +696,12 @@ "title": "Cài đặt", "view_order_history": "Xem lịch sử lệnh", "contact_support": "Liên hệ bộ phận hỗ trợ", - "log_out": "Log out of Transak", + "log_out": "Đăng xuất khỏi Transak", "logged_out_success": "Đã đăng xuất thành công", "error_sdk_not_initialized": "SDK chưa được khởi tạo", "logged_out_error": "Lỗi khi đăng xuất", - "more_ways_to_buy": "More ways to buy", - "more_ways_to_buy_description": "Switch to the classic version" + "more_ways_to_buy": "Thêm nhiều cách để mua", + "more_ways_to_buy_description": "Chuyển sang phiên bản cổ điển" }, "region_modal": { "select_a_region": "Chọn khu vực", @@ -714,7 +714,7 @@ "no_state_results": "Không có bang nào khớp với \"{{searchString}}\"" }, "payment_modal": { - "select_a_payment_method": "Select a payment method" + "select_a_payment_method": "Chọn phương thức thanh toán" }, "payment_duration": { "instant": "Ngay lập tức", @@ -805,7 +805,7 @@ "button": "Đồng ý và tiếp tục" }, "additional_verification": { - "title": "Additional verification", + "title": "Xác minh bổ sung", "paragraph_1": "Đối với khoản nạp tiền lớn hơn, bạn sẽ cần giấy tờ tùy thân hợp lệ (chẳng hạn như bằng lái xe) và ảnh tự chụp thời gian thực.", "paragraph_2": "Để hoàn tất xác minh, bạn sẽ cần cấp quyền truy cập vào camera.", "button": "Tiếp tục" @@ -832,7 +832,7 @@ "dob_invalid": "Vui lòng nhập ngày tháng năm sinh hợp lệ", "ssn_required": "Số an sinh xã hội là bắt buộc", "unexpected_error": "Đã xảy ra lỗi không mong muốn. Vui lòng thử lại.", - "phone_already_registered": "This phone number is already in use by {{email}}. Log in using this email to continue.", + "phone_already_registered": "Số điện thoại này đã được {{email}} sử dụng. Vui lòng đăng nhập bằng email này để tiếp tục.", "login_with_email": "Đăng nhập bằng email" }, "enter_address": { @@ -844,7 +844,7 @@ "address_line_2": "Dòng địa chỉ 2 (không bắt buộc)", "state": "Tỉnh/Bang/Khu vực", "city": "Thành phố", - "postal_code": "Postal/zip code", + "postal_code": "Mã bưu chính", "country": "Quốc gia", "select_state": "Chọn bang", "address_line_1_required": "Địa chỉ dòng 1 là bắt buộc", @@ -854,7 +854,7 @@ "city_invalid": "Vui lòng nhập thành phố hợp lệ", "state_required": "Bang/Khu vực là bắt buộc", "state_invalid": "Vui lòng nhập bang hợp lệ", - "postal_code_required": "Postal/zip code is required", + "postal_code_required": "Cần nhập mã bưu chính", "postal_code_invalid": "Vui lòng nhập mã bưu chính hợp lệ", "unexpected_error": "Lỗi không mong muốn." }, @@ -903,7 +903,7 @@ "cancel_order_button": "Hủy lệnh" }, "order_details": { - "title": "Deposit order", + "title": "Lệnh nạp tiền", "error_title": "Đã xảy ra lỗi với lệnh nạp tiền của bạn", "error_message": "Đã xảy ra lỗi không mong muốn." }, @@ -955,12 +955,12 @@ "fetch_payment_methods": "Đã xảy ra sự cố khi tìm nạp phương thức thanh toán.", "fetch_user_details": "Đã xảy ra sự cố khi tìm nạp thông tin người dùng.", "try_again": "Thử lại", - "error_details_title": "Error details", + "error_details_title": "Chi tiết lỗi", "see_more": "Xem thêm" } }, "perps": { - "basic_functionality_disabled_title": "Perps is not available", + "basic_functionality_disabled_title": "Hợp đồng vĩnh cửu không khả dụng", "title": "Vĩnh cửu", "perps_trading": "Giao dịch hợp đồng vĩnh cửu", "perp_account_balance": "Số dư tài khoản hợp đồng vĩnh cửu", @@ -974,6 +974,10 @@ "not_now": "Không phải bây giờ", "try_now": "Bắt đầu" }, + "discovery_banner": { + "title": "Giao dịch hợp đồng vĩnh cửu {{symbol}}", + "subtitle": "Nhân Lãi/Lỗ của bạn lên đến {{leverage}} lần" + }, "today": "Hôm nay", "yesterday": "Hôm qua", "unrealized_pnl": "Lãi/Lỗ chưa thực hiện", @@ -1047,7 +1051,7 @@ "preparing": "Đang chuẩn bị nạp tiền...", "swapping": "Đang hoán đổi {{token}} sang USDC", "bridging": "Đang tạo cầu nối đến Hyperliquid", - "depositing": "Đang nạp tiền vào tài khoản hợp đồng vĩnh cửu", + "depositing": "Nạp tiền vào tài khoản Hợp đồng vĩnh cửu", "depositing_direct": "Đang chuyển USDC trực tiếp vào tài khoản HyperLiquid của bạn..." }, "step_descriptions": { @@ -1199,7 +1203,7 @@ "short": "Bán khống {{asset}}" }, "tpsl_modal": { - "title": "Chốt lời & Cắt lỗ", + "title": "Chốt lời & cắt lỗ", "save": "Lưu", "current_price": "Giá hiện tại: {{price}}", "on": "BẬT", @@ -1414,6 +1418,7 @@ "failedToEstablishAllMids": "Không thể thiết lập gói đăng ký allMids toàn cục", "failedToEstablishMarketData": "Không thể thiết lập gói đăng ký dữ liệu thị trường cho {{symbol}}", "failed_to_toggle_network": "Không thể chuyển đổi mạng", + "failed_to_switch_provider": "Không thể chuyển nhà cung cấp", "noAccountSelected": "Chưa chọn tài khoản", "unsupportedMethod": "Phương thức không được hỗ trợ: {{method}}", "invalidAddressFormat": "Định dạng địa chỉ không hợp lệ: {{address}}", @@ -1452,6 +1457,24 @@ "orderLeverageReductionFailed": "Bạn không thể giảm đòn bẩy", "insufficientLiquidity": "Thanh khoản không đủ để thực hiện lệnh. Hãy thử dùng lệnh giới hạn hoặc thử lại sau.", "connectionTimeout": "Đã hết thời gian chờ kết nối. Vui lòng kiểm tra mạng và thử lại.", + "clientReinitializing": "Dịch vụ đang khởi tạo lại. Vui lòng chờ một chút và thử lại.", + "transferFailed": "Không thể chuyển tiền. Vui lòng thử lại.", + "swapFailed": "Không thể hoán đổi token. Vui lòng thử lại.", + "spotPairNotFound": "Cặp giao dịch hiện không khả dụng.", + "priceUnavailable": "Không có dữ liệu giá. Vui lòng làm mới và thử lại.", + "batchCancelFailed": "Một số lệnh không thể bị hủy. Vui lòng thử lại.", + "batchCloseFailed": "Một số vị thế không thể đóng. Vui lòng thử lại.", + "insufficientMargin": "Ký quỹ không đủ để thực hiện giao dịch này. Hãy cân nhắc nạp thêm tiền hoặc giảm kích thước vị thế.", + "reduceOnlyViolation": "Lệnh này sẽ làm tăng vị thế của bạn. Chỉ được phép đặt lệnh chỉ giảm.", + "positionWouldFlip": "Lệnh này sẽ đảo ngược hướng vị thế của bạn. Vui lòng đóng vị thế hiện tại trước.", + "marginAdjustmentFailed": "Không thể điều chỉnh ký quỹ. Vui lòng thử lại.", + "tpslUpdateFailed": "Không thể cập nhật chốt lời/cắt lỗ. Vui lòng thử lại.", + "orderRejected": "Lệnh bị từ chối. Vui lòng kiểm tra các thông số và thử lại.", + "slippageExceeded": "Giá biến động quá nhiều. Hãy thử sử dụng lệnh giới hạn hoặc tăng mức trượt giá cho phép.", + "rateLimitExceeded": "Quá nhiều yêu cầu. Vui lòng đợi một chút và thử lại.", + "serviceUnavailable": "Dịch vụ tạm thời không khả dụng. Vui lòng thử lại sau.", + "networkErrorSimple": "Đã xảy ra lỗi mạng. Vui lòng kiểm tra kết nối và thử lại.", + "insufficientBalance": "Số dư không đủ để hoàn tất thao tác này. Vui lòng kiểm tra số tiền khả dụng của bạn.", "connectionFailed": { "title": "Không thể kết nối với hợp đồng vĩnh cửu", "description": "Chúng tôi đang nỗ lực khôi phục sớm nhất có thể.", @@ -1697,7 +1720,14 @@ "retry_connection": "Thử kết nối lại", "retrying_connection": "Đang kết nối...", "connecting_to_perps": "Đang kết nối với hợp đồng vĩnh cửu", - "timeout_title": "Thời gian kết nối lâu hơn dự kiến" + "timeout_title": "Thời gian kết nối lâu hơn dự kiến", + "websocket_disconnected": "Kết nối của bạn đang ngoại tuyến.", + "websocket_disconnected_message": "Dữ liệu có thể không được cập nhật.", + "websocket_connecting": "Đang kết nối với hợp đồng vĩnh cửu...", + "websocket_connecting_message": "Đang khôi phục kết nối... Thử lần {{attempt}}", + "websocket_connected": "Đã kết nối", + "websocket_connected_message": "Cập nhật dữ liệu trực tiếp đã tiếp tục", + "websocket_retry": "Thử lại" }, "chart": { "no_data": "Không có dữ liệu biểu đồ", @@ -1746,7 +1776,7 @@ "markets": "Thị trường" }, "learn_more": { - "title": "Tìm hiểu thêm về Hợp đồng vĩnh cửu", + "title": "Tìm hiểu về Hợp đồng vĩnh cửu", "description": "Khám phá cách giao dịch hợp đồng vĩnh cửu hoạt động và cách bắt đầu", "cta": "Tìm hiểu thêm" }, @@ -1754,6 +1784,9 @@ "title": "Liên hệ bộ phận hỗ trợ", "description": "Liên hệ bộ phận Hỗ trợ MetaMask để được trợ giúp" }, + "feedback": { + "title": "Gửi phản hồi cho chúng tôi" + }, "close_all_modal": { "title": "Đóng tất cả vị thế", "description": "Chúng tôi sẽ đóng tất cả các vị thế đang mở của bạn theo giá thị trường hiện tại.", @@ -1795,8 +1828,8 @@ "funding_rate_short": "Tài trợ", "open_interest": "Lãi suất mở", "open_interest_short": "Khối lượng mở", - "high_to_low": "Cao đến Thấp", - "low_to_high": "Thấp đến Cao", + "high_to_low": "Cao đến thấp", + "low_to_high": "Thấp đến cao", "high": "Cao", "low": "Thấp", "sort_by": "Sắp xếp theo", @@ -1806,7 +1839,11 @@ "price_change_low_to_high": "Biến động giá: thấp đến cao", "past_hour": "Trong giờ qua", "past_24_hours": "Trong 24 giờ qua", - "time": "Thời gian" + "time": "Thời gian", + "apply": "Áp dụng" + }, + "market_type": { + "filter_by": "Lọc theo" }, "perps_markets": "Thị trường hợp đồng vĩnh cửu", "volume": "Khối lượng", @@ -1823,6 +1860,7 @@ "mainnet": "Mạng chính thức", "developer_options": { "hyperliquid_network_toggle": "Chuyển đổi Mạng Hyperliquid", + "provider_mode_toggle": "Chế độ nhà cung cấp", "simulate_connection_error": "Mô phỏng lỗi kết nối" }, "transactions": { @@ -1981,7 +2019,8 @@ "fee_exemption": "Chúng tôi không tính bất kỳ khoản phí nào trên thị trường này.", "ended": "Đã kết thúc", "resolved_early": "Đã được giải quyết sớm", - "disclaimer": "Thông tin này có thể chưa đầy đủ. Tất cả các quy tắc thị trường, tiêu chí giải quyết và kết quả cuối cùng đều do Polymarket quyết định. Các giao dịch cần được thực hiện dựa trên toàn bộ các quy tắc có sẵn trên Polymarket." + "disclaimer": "Thông tin này có thể chưa đầy đủ. Tất cả các quy tắc thị trường, tiêu chí giải quyết và kết quả cuối cùng đều do Polymarket quyết định. Các giao dịch cần được thực hiện dựa trên toàn bộ các quy tắc có sẵn trên Polymarket.", + "your_picks": "Lựa chọn của bạn" }, "tab": { "no_predictions_description": "Dự đoán của bạn sẽ xuất hiện ở đây, hiển thị số tiền ký gửi và biến động thị trường.", @@ -2001,6 +2040,8 @@ "cashout_info": "{{amount}} cho kết quả {{outcome}} với giá {{initialPrice}}", "cashout_info_multiple": "{{amount}} cho kết quả {{outcomeGroupTitle}} • {{outcome}} với giá {{initialPrice}}", "position_info": "{{initialValue}} cho kết quả {{outcome}} để trúng thưởng {{shares}}", + "position_pick_info": "{{initialValue}} cho kết quả {{outcome}}", + "position_pick_info_to_win": "{{initialValue}} cho kết quả {{outcome}} để trúng thưởng", "buy_yes": "Có", "buy_no": "Không", "outcomes": "kết quả", @@ -2035,6 +2076,7 @@ "won_markets_text": "Đã thắng {{count}} thị trường{{s}}", "available_balance": "Số dư khả dụng", "claim_amount_text": "Nhận ${{amount}}", + "claim_winnings_text": "Nhận tiền thắng", "unrealized_pnl_label": "Lãi/Lỗ chưa thực hiện", "unrealized_pnl_value": "{{amount}} ({{percent}})", "unrealized_pnl_error": "Không thể tải", @@ -2173,6 +2215,15 @@ "order_not_fully_filled": "Không thể thực hiện lệnh của bạn", "buy_order_not_fully_filled": "Hiện không có đủ cổ phần theo giá thị trường để đặt lệnh vào lúc này.", "sell_order_not_fully_filled": "Không có đủ nhu cầu theo giá thị trường để rút tiền ngay bây giờ." + }, + "game_details_footer": { + "pick_a_winner": "Chọn người chiến thắng", + "volume_display": "Khối lượng ${{volume}}", + "read_terms": "Đọc đầy đủ các điều khoản và điều kiện của hợp đồng" + }, + "sports": { + "halftime": "Giữa trận", + "final": "Chung cuộc" } }, "receive": { @@ -2290,7 +2341,7 @@ "add_funds": "Nạp tiền", "next": "Tiếp theo", "buy_asset": "Mua {{asset}}", - "no_tokens": "Bạn không có Token nào!", + "no_tokens": "Bạn không có token nào", "show_tokens_without_balance": "Hiển thị token không kèm số dư", "nfts_autodetection_title": "Phát hiện NFT", "nfts_autodetection_desc": "Cho phép MetaMask tự động phát hiện và hiển thị NFT trong ví của bạn.", @@ -2303,7 +2354,7 @@ "target_scam_network": "khiến nó trở thành mục tiêu để lừa đảo. Những kẻ lừa đảo có thể lừa bạn gửi lại cho họ những loại tiền tệ có giá trị hơn. Nhớ xác minh mọi thông tin trước khi tiếp tục.", "use_the_currency_symbol": "sử dụng ký hiệu tiền tệ", "use_correct_symbol": "Đảm bảo bạn đang sử dụng đúng ký hiệu trước khi tiếp tục", - "chain_id_currently_used": "ID chuỗi này hiện được sử dụng bởi", + "chain_id_currently_used": "This chain ID is currently used by the", "incorrect_network_name_warning": "Theo hồ sơ của chúng tôi, tên mạng có thể không khớp chính xác với ID chuỗi này.", "suggested_name": "Tên đề xuất:", "network_check_validation_desc": "giảm khả năng bạn kết nối với mạng độc hại hoặc mạng không chính xác.", @@ -2314,7 +2365,7 @@ "nft_empty_description": "Có cả một thế giới NFT đang chờ bạn khám phá. Bắt đầu bộ sưu tập của bạn ngay hôm nay.", "tokens_empty_description": "Nothing to see yet. Why not browse tokens or make a trade?", "discover_nfts": "Nhập NFT", - "no_transactions": "Bạn không có giao dịch nào!", + "no_transactions": "Bạn không có giao dịch nào", "switch_network_to_view_transactions": "Vui lòng chuyển mạng để xem giao dịch", "send_button": "Gửi", "deposit_button": "Nạp", @@ -2362,6 +2413,7 @@ "network_fee": "Phí mạng", "lists": "Token lists", "hide_cta": "Ẩn token", + "perps_trading": "Giao dịch hợp đồng vĩnh cửu", "options": { "title": "Token options", "view_on_portfolio": "Xem trên Portfolio", @@ -2409,8 +2461,8 @@ "add_token": "NHẬP" }, "collectibles": { - "cancel_add_collectible": "HỦY", - "add_collectible": "NHẬP" + "cancel_add_collectible": "Hủy", + "add_collectible": "Nhập" }, "banners": { "search_desc": "Tính năng phát hiện token cải tiến hiện được cung cấp trên mạng {{network}}. ", @@ -2521,18 +2573,20 @@ "billion_abbreviation": "Tỷ", "trillion_abbreviation": "Nghìn Tỷ", "million_abbreviation": "Triệu", + "thousand_abbreviation": "K", "token_details": "Thông tin chi tiết về token", "contract_address": "Địa chỉ hợp đồng", "token_list": "Danh sách token", "market_details": "Chi tiết thị trường", "market_cap": "Market cap", "total_volume": "Total volume (24h)", - "volume_to_marketcap": "Volume / market cap", + "volume_to_marketcap": "Volume / Market cap", "circulating_supply": "Cung lưu hành", "all_time_high": "Cao nhất lịch sử", "all_time_low": "Thấp nhất lịch sử", "fully_diluted": "Pha loãng hoàn toàn", - "unknown": "Không xác định" + "unknown": "Không xác định", + "stock": "Stock" }, "collectible": { "collectible_address": "Địa chỉ", @@ -2583,7 +2637,7 @@ "remove_snap_account": "Xóa tài khoản Snap", "remove_snap_account_alert_description": "Tài khoản này sẽ bị xóa khỏi ví của bạn. Hãy chắc chắn rằng bạn có Cụm từ khôi phục bí mật hoặc khóa riêng tư gốc cho tài khoản đã nhập này trước khi tiếp tục. Bạn có thể nhập hoặc tạo lại tài khoản từ trình đơn thả xuống tài khoản.", "remove_account_alert_remove_btn": "Xóa", - "remove_account_alert_cancel_btn": "Bỏ qua", + "remove_account_alert_cancel_btn": "Never mind", "accounts_title": "Tài khoản", "connect_account_title": "Kết nối tài khoản", "connect_accounts_title": "Kết nối tài khoản", @@ -2620,7 +2674,7 @@ "advisory_by": "Cảnh báo được cung cấp bởi Trình phát hiện lừa đảo qua mạng Ethereum và PhishFort", "potential_threat": "Các mối đe dọa tiềm ẩn bao gồm", "fake_metamask": "Các phiên bản giả mạo của MetaMask", - "srp_theft": "Đánh cắp mật khẩu hoặc cụm từ khôi phục bí mật", + "srp_theft": "Secret Recovery Phrase or password theft", "malicious_transactions": "Các giao dịch độc hại dẫn đến tài sản bị đánh cắp", "secret_recovery_phrase": "của bạn", "account_name": "Tên tài khoản", @@ -2675,8 +2729,8 @@ }, "connect_qr_hardware": { "title": "Kết nối với một ví cứng dựa trên mã QR", - "description1": "Kết nối với một ví cứng ngoại tuyến hoàn toàn có thể truyền tin bằng mã QR.", - "description2": "Cách hoạt động?", + "description1": "Connect an airgapped hardware wallet that communicates through QR codes.", + "description2": "Cách hoạt động", "description3": "Các ví cứng ngoại tuyến hoàn toàn được hỗ trợ chính thức bao gồm:", "keystone": "Keystone", "ngravezero": "Ngrave Zero", @@ -2690,10 +2744,10 @@ "hint_text": "Quét ví cứng của bạn để ", "purpose_connect": "kết nối", "purpose_sign": "xác nhận giao dịch", - "select_accounts": "Chọn một tài khoản" + "select_accounts": "Chọn tài khoản" }, "data_collection_modal": { - "accept": "Đồng ý", + "accept": "OK", "content": "Bạn đã tắt tính năng thu thập dữ liệu cho mục đích tiếp thị của chúng tôi. Thao tác này chỉ áp dụng cho thiết bị này. Nếu bạn sử dụng MetaMask trên các thiết bị khác, nhớ chọn không tham gia trên các thiết bị đó." }, "account_selector": { @@ -2717,14 +2771,14 @@ "select_rpc_url": "Chọn URL RPC", "title": "Cài đặt", "current_conversion": "Tiền tệ cơ bản", - "current_language": "Current language", - "ipfs_gateway": "Giao thức IPFS", + "current_language": "Ngôn ngữ hiện tại", + "ipfs_gateway": "Cổng IPFS", "ipfs_gateway_content": "MetaMask sử dụng các dịch vụ của bên thứ ba để hiển thị hình ảnh các NFT của bạn được lưu trữ trên IPFS, hiển thị thông tin liên quan đến địa chỉ ENS được nhập trong thanh địa chỉ của trình duyệt và tìm nạp biểu tượng cho các token khác nhau. Địa chỉ IP của bạn có thể được hiển thị với các dịch vụ này khi bạn đang sử dụng chúng.", "ipfs_gateway_down": "Giao thức IPFS hiện tại của bạn đã bị hỏng", "ipfs_gateway_desc": "Vui lòng chọn giao thức IPFS ưa thích của bạn.", - "search_engine": "Search engine", + "search_engine": "Công cụ tìm kiếm", "new_RPC_URL": "Mạng RPC mới", - "state_logs": "State logs", + "state_logs": "Nhật ký trạng thái", "add_network_title": "Thêm mạng", "auto_lock": "Tự động khóa", "auto_lock_desc": "Chọn khoảng thời gian trước khi ứng dụng tự động khóa.", @@ -2733,15 +2787,15 @@ "autolock_never": "Không bao giờ", "autolock_after": "Sau {{time}} giây", "autolock_after_minutes": "Sau {{time}} phút", - "reveal_seed_words": "Reveal seed words", - "reset_account": "Reset account", - "state_logs_button": "Download state logs", + "reveal_seed_words": "Tiết lộ Cụm từ khôi phục bí mật", + "reset_account": "Đặt lại tài khoản", + "state_logs_button": "Tải xuống nhật ký trạng thái", "reveal_seed_words_button": "HIỂN THỊ CỤM TỪ KHÔI PHỤC BÍ MẬT", - "reset_account_button": "Reset account", + "reset_account_button": "Đặt lại tài khoản", "reset_account_confirm_button": "Có, đặt lại", "reset_account_cancel_button": "Hủy", - "reset_account_modal_title": "Reset account?", - "clear_approvals_modal_title": "Clear approval data?", + "reset_account_modal_title": "Đặt lại tài khoản?", + "clear_approvals_modal_title": "Xóa dữ liệu chấp thuận?", "clear_approvals_modal_message": "Tất cả dapp sẽ cần yêu cầu lại quyền truy cập để xem thông tin tài khoản.", "clear_browser_history_modal_title": "Xóa lịch sử trình duyệt?", "clear_browser_history_modal_message": "Chúng tôi sắp xóa tất cả lịch sử trình duyệt của bạn. Bạn có chắc không?", @@ -2763,7 +2817,7 @@ "protect_title": "Khôi phục ví", "banner_social_login_enabled": "Đăng nhập bằng {{authConnection}}", "manage_recovery_method": "Quản lý phương thức khôi phục", - "video_failed": "Video failed to load.", + "video_failed": "Không tải được video.", "protect_desc": "Sao lưu Cụm từ khôi phục bí mật để bạn không bao giờ mất quyền truy cập vào ví. Hãy chắc chắn lưu trữ cụm từ này ở nơi an toàn mà chỉ bạn mới có thể truy cập và không bị quên", "protect_desc_no_backup": "Đây là cụm từ gồm 12 từ cho ví của bạn. Cụm từ này có thể được sử dụng để kiểm soát tất cả tài khoản hiện tại và tương lai của bạn, bao gồm cả khả năng gửi tiền trong ví của bạn đi. Hãy cất giữ cụm từ này an toàn, KHÔNG chia sẻ nó với bất kỳ ai. MetaMask không thể giúp bạn khôi phục khóa này.", "learn_more": "Tìm hiểu thêm.", @@ -2782,9 +2836,9 @@ "show_fiat_on_testnets_desc": "Chọn tùy chọn này để hiển thị tỷ lệ quy đổi tiền pháp định trên mạng thử nghiệm.", "show_fiat_on_testnets_modal_title": "Hãy cẩn thận", "show_fiat_on_testnets_modal_description": "Nếu bạn được yêu cầu bật tính năng này, bạn có thể đang bị lừa đảo. Các token này không có giá trị tài chính và chỉ dành cho mục đích thử nghiệm. Tính năng này giúp các nhà phát triển đảm bảo ứng dụng của họ hoạt động bình thường.", - "show_fiat_on_testnets_modal_learn_more": "Tìm hiểu thêm.", + "show_fiat_on_testnets_modal_learn_more": "Tìm hiểu thêm", "show_fiat_on_testnets_modal_button": "Tiếp tục", - "show_hex_data": "Show hex data", + "show_hex_data": "Hiển thị dữ liệu thập lục phân", "show_hex_data_desc": "Chọn mục này để hiển thị trường dữ liệu với mã hex trên màn hình gửi.", "accounts_identicon_title": "Biểu tượng tài khoản", "accounts_identicon_desc": "Chọn trong số ba kiểu biểu tượng độc đáo khác nhau để giúp bạn nhận diện tài khoản một cách nhanh chóng.", @@ -2793,7 +2847,7 @@ "general_title": "Chung", "general_desc": "Chuyển đổi tiền tệ, đơn vị tiền tệ chính, ngôn ngữ và công cụ tìm kiếm.", "advanced_title": "Nâng cao", - "advanced_desc": "Truy cập các tính năng của lập trình viên, đặt lại tài khoản, thiết lập mạng thử nghiệm, nhật ký trạng thái, giao thức IPFS và RPC tùy chỉnh.", + "advanced_desc": "Truy cập các tính năng dành cho nhà lập trình, đặt lại tài khoản, thiết lập mạng thử nghiệm, nhật ký trạng thái, cổng IPFS và RPC tùy chỉnh.", "notifications_title": "Thông báo", "notifications_desc": "Quản lý thông báo", "allow_notifications": "Cho phép thông báo", @@ -2804,9 +2858,9 @@ "customize_session_desc": "Bật các loại thông báo mà bạn muốn nhận:", "account_session_title": "Hoạt động của tài khoản", "account_session_desc": "Chọn tài khoản mà bạn muốn nhận thông báo:", - "assets_sent_title": "Assets sent", + "assets_sent_title": "Tài sản đã gửi", "assets_sent_desc": "Tiền và NFT", - "assets_received_title": "Assets received", + "assets_received_title": "Tài sản đã nhận", "assets_received_desc": "Tiền và NFT", "defi_title": "DeFi", "defi_desc": "Ký gửi, hoán đổi và cầu nối", @@ -2822,18 +2876,18 @@ "permissions_desc": "Quản lý các quyền được cấp cho trang web và ứng dụng.", "no_permissions": "Không có quyền nào", "no_permissions_desc": "Nếu bạn kết nối tài khoản với một trang web hoặc một ứng dụng, bạn sẽ thấy tài khoản đó ở đây.", - "security_title": "Bảo mật & Quyền riêng tư", + "security_title": "Bảo mật và quyền riêng tư", "back": "Quay lại", "security_desc": "Cài đặt quyền riêng tư, MetaMetrics, khóa riêng tư và Cụm từ khôi phục bí mật.", "networks_title": "Mạng", - "networks_default_title": "Default network", + "networks_default_title": "Mạng mặc định", "network_delete": "Nếu xóa mạng này, bạn sẽ cần thêm lại mạng này để xem các tài sản của mình trong mạng này", "networks_default_cta": "Sử dụng mạng này", "add_rpc_url": "Thêm URL RPC", "add_block_explorer_url": "Thêm URL trình khám phá khối", "networks_desc": "Thêm và sửa mạng RPC tùy chỉnh", - "network_name_label": "Network name", - "network_name_placeholder": "Network name (optional)", + "network_name_label": "Tên mạng", + "network_name_placeholder": "Tên mạng (không bắt buộc)", "network_rpc_url_label": "URL RPC", "network_rpc_name_label": "Tên RPC", "network_rpc_placeholder": "Mạng RPC mới", @@ -2842,12 +2896,12 @@ "network_chain_id_label": "ID chuỗi", "network_chain_id_placeholder": "ID chuỗi", "network_symbol_label": "Biểu tượng", - "network_block_explorer_label": "URL của Block Explorer", - "network_block_explorer_placeholder": "URL của Block Explorer (không bắt buộc)", + "network_block_explorer_label": "URL của Trình khám phá khối", + "network_block_explorer_placeholder": "URL trình khám phá khối (không bắt buộc)", "network_chain_id_warning": "ID chuỗi không hợp lệ", - "network_other_networks": "Other networks", + "network_other_networks": "Mạng khác", "network_rpc_networks": "Mạng RPC", - "network_add_network": "Add network", + "network_add_network": "Thêm mạng", "network_add_custom_network": "Thêm mạng tùy chỉnh", "network_add": "Thêm", "network_save": "Lưu", @@ -2858,11 +2912,11 @@ "info_title_beta": "Giới thiệu về MetaMask Beta", "info_title_flask": "Giới thiệu về MetaMask Flask", "experimental_title": "Thử nghiệm", - "experimental_desc": "WalletConnect & hơn thế nữa...", + "experimental_desc": "WalletConnect và các tùy chọn khác...", "legal_title": "Pháp lý", "conversion_title": "Chuyển đổi tiền tệ", "conversion_desc": "Hiển thị giá trị tiền pháp định bằng cách sử dụng một loại tiền tệ cụ thể trong toàn bộ ứng dụng.", - "primary_currency_title": "Primary currency", + "primary_currency_title": "Tiền tệ chính", "primary_currency_desc": "Chọn Gốc để ưu tiên hiển thị giá trị bằng đơn vị tiền tệ gốc của chuỗi (ví dụ: ETH). Chọn Pháp định để ưu tiên hiển thị giá trị bằng đơn vị tiền pháp định mà bạn chọn.", "primary_currency_text_first": "Gốc", "primary_currency_text_second": "Pháp định", @@ -2883,7 +2937,7 @@ "batch_balance_requests_description": "Nhận cập nhật số dư cho tất cả tài khoản cùng lúc. Tắt tính năng này sẽ giúp giảm khả năng người khác liên kết một tài khoản với tài khoản khác.", "third_party_title": "Nhận các giao dịch chuyển đến", "third_party_description": "API của bên thứ ba (Etherscan) được sử dụng để hiển thị các giao dịch chuyển đến của bạn trong phần lịch sử. Hãy tắt nếu bạn không muốn chúng tôi lấy dữ liệu từ các dịch vụ đó.", - "metametrics_opt_out": "Chọn không tham gia MetaMetrics", + "metametrics_opt_out": "chọn không tham gia MetaMetrics", "metametrics_restart_required": "Bạn cần khởi động lại ứng dụng để các thay đổi có hiệu lực.", "create_password": "Tạo mật khẩu", "invalid_password": "Mật khẩu không hợp lệ", @@ -2899,11 +2953,11 @@ "invalid_number": "Số không hợp lệ. Nhập số thập lục phân có tiền tố là số thập phân hoặc \"0x\".", "invalid_number_leading_zeros": "Số thập lục phân không hợp lệ. Hãy xóa bất kỳ số 0 nào nằm ở đầu.", "invalid_number_range": "Số không hợp lệ. Hãy nhập một số từ 1 đến %{maxSafeChainId}", - "hide_zero_balance_tokens_title": "Hide tokens without balance", + "hide_zero_balance_tokens_title": "Ẩn token không có số dư", "hide_zero_balance_tokens_desc": "Không hiển thị các Token không có số dư trong danh sách Token của bạn.", "token_detection_title": "Tự động phát hiện token", "token_detection_description": "Chúng tôi sử dụng các API của bên thứ ba để phát hiện và hiển thị các Token mới được gửi đến ví của bạn. Hãy tắt nếu bạn không muốn ứng dụng lấy dữ liệu từ các dịch vụ đó.", - "theme_button_text": "Change theme", + "theme_button_text": "Thay đổi chủ đề", "theme_title": "Chủ đề ({{theme}})", "theme_description": "Thiết lập chủ đề để thay đổi giao diện của ứng dụng.", "theme_os": "Hệ thống", @@ -2935,18 +2989,18 @@ "delete_metrics_description_after_delete_part_two": ". Quá trình này có thể mất đến 30 ngày. Xem", "delete_metrics_description_privacy_policy": "Chính sách quyền riêng tư.", "delete_metrics_button": "Xóa dữ liệu MetaMetrics", - "check_status_button": "Check status", + "check_status_button": "Kiểm tra trạng thái", "delete_metrics_confirm_modal_title": "Xóa dữ liệu MetaMetrics?", "delete_metrics_confirm_modal_description": "Chúng tôi sắp xóa tất cả dữ liệu MetaMetrics của bạn. Bạn có chắc không?", "delete_wallet_data_title": "Đặt lại ví", "delete_wallet_data_description": "Thao tác này sẽ xóa tất cả dữ liệu liên quan đến ví khỏi thiết bị của bạn. Các tài khoản của bạn tồn tại trên chuỗi khối và không liên quan đến MetaMask. Bạn luôn có thể khôi phục tài khoản của mình bằng Cụm từ khôi phục bí mật.", "delete_wallet_data_button": "Đặt lại ví", - "delete_data_status_title": "Deletion task status", + "delete_data_status_title": "Trạng thái tác vụ xóa", "delete_data_status_description": "Trạng thái hiện tại là", "delete_metrics_error_title": "Chúng tôi không thể xóa dữ liệu này bây giờ.", "delete_metrics_error_description": "Không thể hoàn tất yêu cầu này ngay bây giờ do sự cố máy chủ hệ thống phân tích, vui lòng thử lại sau.", "ok": "OK", - "clear_sdk_connections_title": "Xóa tất cả các Kết nối MetaMask SDK", + "clear_sdk_connections_title": "Xóa tất cả các kết nối MetaMask SDK", "clear_sdk_connections_text": "Tất cả các kết nối sẽ bị xóa và các dapp sẽ cần yêu cầu kết nối lại", "sdk_connections": "Kết nối MetaMask SDK", "manage_sdk_connections_title": "Quản lý kết nối", @@ -2956,6 +3010,7 @@ "description": "Khu vực & khác...", "current_region": "Khu vực hiện tại", "reset_region": "Đặt lại khu vực", + "change_region": "Thay đổi khu vực", "no_region_selected": "Chưa chọn khu vực nào", "sdk_activation_keys": "Khóa kích hoạt SDK", "activation_keys_description": "Khóa kích hoạt sẽ kích hoạt các tính năng hoặc nhà cung cấp cụ thể.", @@ -3006,13 +3061,13 @@ }, "snap_details": { "install_date": "Đã cài đặt vào {{date}}", - "install_origin": "Install origin", + "install_origin": "Nguồn cài đặt", "enabled": "Đã bật", "version": "Phiên bản" }, "keyring_account_list_item": { "account_name": "Tên tài khoản", - "public_address": "Public address" + "public_address": "Địa chỉ công khai" }, "snap_permissions": { "approved_date": "Đã duyệt vào {{date}}", @@ -3063,28 +3118,28 @@ "blockaid_desc": "Tính năng này sẽ cảnh báo bạn khi có hoạt động độc hại bằng cách chủ động xem xét các yêu cầu giao dịch và chữ ký.", "security_alerts": "Cảnh báo bảo mật", "security_alerts_desc": "Tính năng này sẽ cảnh báo bạn về hoạt động độc hại bằng cách xem xét cục bộ các yêu cầu giao dịch và chữ ký của bạn. Hãy luôn tự mình thực hiện quy trình thẩm định trước khi chấp thuận bất kỳ yêu cầu nào. Không có gì đảm bảo rằng tính năng này sẽ phát hiện được tất cả các hoạt động độc hại. Bằng cách bật tính năng này, bạn đồng ý với các điều khoản sử dụng của nhà cung cấp.", - "dismiss_smart_account_update_heading": "Bỏ qua đề xuất \"Chuyển sang Tài khoản Thông minh\"", - "dismiss_smart_account_update_desc": "Bật tính năng này để không còn thấy đề xuất \"Chuyển sang Tài khoản Thông minh\" trên bất kỳ tài khoản nào. Tài khoản Thông minh cho phép giao dịch nhanh hơn, phí mạng thấp hơn và linh hoạt hơn trong thanh toán.", + "dismiss_smart_account_update_heading": "Bỏ qua đề xuất \"Chuyển sang tài khoản thông minh\"", + "dismiss_smart_account_update_desc": "Bật tính năng này để không còn thấy đề xuất \"Chuyển sang tài khoản thông minh\" trên bất kỳ tài khoản nào. Tài khoản thông minh cho phép giao dịch nhanh hơn, phí mạng thấp hơn và linh hoạt hơn trong thanh toán.", "use_smart_account_heading": "Sử dụng tài khoản thông minh", "use_smart_account_desc": "Luôn bật tùy chọn này để tự động chuyển các tài khoản được tạo trong MetaMask sang tài khoản thông minh khi có sẵn các tính năng liên quan, chẳng hạn như giao dịch nhanh hơn, phí mạng thấp hơn và linh hoạt trong thanh toán.", - "use_smart_account_learn_more": "Tìm hiểu thêm.", + "use_smart_account_learn_more": "Tìm hiểu thêm", "smart_transactions_opt_in_heading": "Giao dịch thông minh", "smart_transactions_opt_in_desc_supported_networks": "Bật Giao dịch thông minh để có các giao dịch đáng tin cậy và an toàn hơn trên các mạng được hỗ trợ.", - "smart_transactions_learn_more": "Tìm hiểu thêm.", + "smart_transactions_learn_more": "Tìm hiểu thêm", "simulation_details": "Ước tính thay đổi số dư", "simulation_details_description": "Bật tính năng này để ước tính thay đổi số dư của các giao dịch trước khi bạn xác nhận. Điều này không đảm bảo cho kết quả cuối cùng của giao dịch. ", "simulation_details_learn_more": "Tìm hiểu thêm.", - "aes_crypto_test_form_title": "AES crypto - test form", + "aes_crypto_test_form_title": "Tiền mã hóa AES - mẫu thử nghiệm", "aes_crypto_test_form_description": "Phần được phát triển dành riêng cho thử nghiệm E2E. Nếu bạn thấy phần này trong ứng dụng, vui lòng báo cáo với bộ phận hỗ trợ của MetaMask.", "developer_options": { - "title": "Developer options", - "generate_trace_test": "Generate trace test", - "generate_trace_test_desc": "Generate a developer test Sentry trace.", - "navigate_to_sample_feature": "Navigate to sample feature", + "title": "Tùy chọn Nhà lập trình", + "generate_trace_test": "Tạo thử nghiệm truy vết", + "generate_trace_test_desc": "Tạo một truy vết thử nghiệm cho nhà lập trình trên Sentry.", + "navigate_to_sample_feature": "Truy cập tính năng mẫu", "sample_feature_desc": "Một tính năng mẫu làm mẫu cho các nhà lập trình." }, "feature_flag_override": { - "title": "Feature flag override", + "title": "Ghi đè cờ tính năng", "description": "Ghi đè các cờ tính năng cho ứng dụng cục bộ." } }, @@ -3107,7 +3162,7 @@ "disconnect_all_info": "Nếu bạn xóa kết nối với tất cả các trang web, bạn sẽ cần cấp quyền để kết nối lại.", "disconnect": "Ngắt kết nối", "disconnect_all": "Ngắt kết nối tất cả", - "disconnect_all_accounts": "Ngắt kết nối tất cả Tài khoản", + "disconnect_all_accounts": "Ngắt kết nối tất cả các tài khoản", "manage_connections": "Quản lý kết nối", "manage": "Quản lý", "cancel": "Hủy", @@ -3124,7 +3179,7 @@ "disconnect_all": "Ngắt kết nối khỏi tất cả các trang web?", "disconnect_all_desc": "Nếu bạn ngắt kết nối tài khoản khỏi tất cả các trang web, bạn sẽ cần cấp quyền để kết nối lại.", "disconnect_account": "Ngắt kết nối tài khoản?", - "disconnect_all_accounts": "Ngắt kết nối tất cả Tài khoản", + "disconnect_all_accounts": "Ngắt kết nối tất cả các tài khoản", "disconnect_all_accounts_desc": "Nếu bạn ngắt kết nối tất cả các tài khoản khỏi {{dapp}}, bạn sẽ cần cấp quyền để kết nối lại.", "disconnect_account_desc": "Nếu bạn ngắt kết nối {{account}} khỏi {{dapp}}, bạn sẽ cần cấp quyền để kết nối lại.", "disconnect_confirm": "Ngắt kết nối", @@ -3137,7 +3192,7 @@ "sdk_feedback_modal": { "ok": "OK", "title": "Tài khoản không thể kết nối", - "info": "Vui lòng quét mã QR trên dApp để kết nối lại với MetaMask" + "info": "Please scan the QR code on the site to reconnect to MetaMask" }, "app_information": { "title": "Thông tin", @@ -3145,8 +3200,8 @@ "privacy_policy": "Chính sách Quyền riêng tư", "terms_of_use": "Điều khoản sử dụng", "attributions": "Thuộc tính", - "support_center": "Visit our support center", - "web_site": "Truy cập Trang web của chúng tôi", + "support_center": "Truy cập trung tâm hỗ trợ của chúng tôi", + "web_site": "Visit our website", "contact_us": "Contact us" }, "reveal_credential": { @@ -3216,7 +3271,7 @@ "password_reset": { "password_title": "Mật khẩu", "password_desc": "Chọn một mật khẩu mạnh để mở khóa ứng dụng MetaMask trên thiết bị của bạn. Nếu làm mất mật khẩu này, bạn sẽ cần dùng Cụm từ khôi phục bí mật để nhập lại ví.", - "password_learn_more": "Tìm hiểu thêm.", + "password_learn_more": "Tìm hiểu thêm", "change_password": "Đổi mật khẩu", "password_hint": "Gợi ý mật khẩu" }, @@ -3246,19 +3301,28 @@ "swap": "Hoán đổi", "bridge": "Cầu nối", "earn": "Kiếm lợi nhuận", - "convert_to_musd": "Convert to mUSD", + "convert_to_musd": "Chuyển đổi sang mUSD", + "merkl_rewards": { + "annual_bonus": "Thưởng {{apy}}%", + "claimable_bonus": "Thưởng có thể nhận", + "claimable_bonus_tooltip_description": "mUSD bonuses are claimed on Linea.", + "terms_apply": "Terms apply.", + "ok": "OK", + "claim": "Nhận", + "processing_claim": "Processing claim..." + }, "tron": { - "daily_resource_new_energy": "New daily energy", - "sufficient_to_cover": "Sufficient to cover", + "daily_resource_new_energy": "Năng lượng hằng ngày mới", + "sufficient_to_cover": "Đủ để thực hiện", "transactions": "thấp hơn 82%", "daily_resource": "Tài nguyên hằng ngày", "bandwidth": "Băng thông", "energy": "Năng lượng", - "daily_resource_description": "This is your daily allowance based on your staked TRX. Hold TRX to get 600 bandwidth daily.", - "sufficient_to_cover_trx_transfers": "Covers ~{{amount}} TRX transfers", - "sufficient_to_cover_trx_transfer": "Covers 1 TRX transfer", - "sufficient_to_cover_usdt_transfers": "Covers ~{{amount}} USDT transfers", - "sufficient_to_cover_usdt_transfer": "Covers 1 USDT transfer" + "daily_resource_description": "Đây là hạn mức hằng ngày của bạn dựa trên TRX đã ký gửi. Nắm giữ TRX để nhận 600 băng thông mỗi ngày.", + "sufficient_to_cover_trx_transfers": "Thực hiện ~{{amount}} giao dịch TRX", + "sufficient_to_cover_trx_transfer": "Thực hiện 1 giao dịch TRX", + "sufficient_to_cover_usdt_transfers": "Thực hiện ~{{amount}} giao dịch USDT", + "sufficient_to_cover_usdt_transfer": "Thực hiện 1 giao dịch USDT" }, "disabled_button": { "buy": "Không hỗ trợ mua cho tài khoản này", @@ -3311,9 +3375,11 @@ }, "no_chart_data": { "title": "Không có dữ liệu biểu đồ", - "description": "Chúng tôi không thể tìm nạp bất kỳ dữ liệu nào cho token này" + "description": "Chúng tôi không thể tìm nạp bất kỳ dữ liệu nào cho token này", + "insufficient_data": "Data is not available for this time period" }, "your_balance": "Số dư của bạn", + "perps_position": "Vị thế hợp đồng vĩnh cửu", "unable_to_load_balance": "Không thể tải số dư của bạn", "about": "Giới thiệu", "about_content_display": { @@ -3363,11 +3429,11 @@ "address_copied_to_clipboard": "Đã sao chép địa chỉ token vào bộ nhớ đệm" }, "qr_scanner": { - "invalid_qr_code_title": "Mã QR không hợp lệ", + "invalid_qr_code_title": "Invalid QR code", "invalid_qr_code_message": "Mã QR bạn đang cố quét không hợp lệ.", "allow_camera_dialog_title": "Cho phép truy cập camera", "allow_camera_dialog_message": "Chúng tôi cần sự cho phép của bạn để quét mã QR", - "scanning": "đang quét...", + "scanning": "Đang quét...", "ok": "Ok", "continue": "Tiếp tục", "cancel": "Hủy", @@ -3376,14 +3442,14 @@ "attempting_sync_from_wallet_error": "Có vẻ như bạn đang cố đồng bộ với tiện ích mở rộng. Để làm như vậy, bạn sẽ cần xóa ví hiện tại của mình. \n\nSau khi bạn đã xóa hoặc cài đặt lại phiên bản ứng dụng mới, hãy chọn tùy chọn \"Đồng bộ với Tiện ích mở rộng MetaMask\". Lưu ý quan trọng! Trước khi xóa ví, hãy đảm bảo rằng bạn đã sao lưu Cụm từ khôi phục bí mật.", "not_allowed_error_title": "Bật quyền truy cập camera", "not_allowed_error_desc": "Để quét mã QR, bạn cần cấp quyền truy cập camera cho MetaMask từ trình đơn cài đặt của thiết bị.", - "unrecognized_address_qr_code_title": "Không nhận diện được mã QR", + "unrecognized_address_qr_code_title": "Unrecognized QR code", "unrecognized_address_qr_code_desc": "Rất tiếc, mã QR này không được liên kết với bất kỳ địa chỉ tài khoản hoặc địa chỉ hợp đồng nào.", "url_redirection_alert_title": "Bạn sắp truy cập một liên kết bên ngoài", "url_redirection_alert_desc": "Các liên kết có thể được sử dụng để cố gắng gian lận hoặc lừa đảo mọi người, vì vậy hãy đảm bảo chỉ truy cập các trang web mà bạn tin tưởng.", "label": "Quét mã QR", "open_settings": "Cài đặt", "camera_not_available": "Camera không có sẵn", - "tron_address_not_supported": "Tron addresses are not currently supported" + "tron_address_not_supported": "Hiện tại không hỗ trợ địa chỉ Tron" }, "action_view": { "cancel": "Hủy", @@ -3471,10 +3537,10 @@ "cancel_tx_message": "Việc cố hủy này không đảm bảo giao dịch ban đầu của bạn sẽ được hủy. Nếu hủy thành công, bạn sẽ bị tính phí giao dịch ở trên.", "speedup_tx_title": "Cố tăng tốc?", "speedup_tx_message": "Việc cố tăng tốc này không đảm bảo giao dịch ban đầu của bạn sẽ được tăng tốc. Nếu tăng tốc thành công, bạn sẽ bị tính phí giao dịch ở trên.", - "nevermind": "Bỏ qua", + "nevermind": "Never mind", "edit_network_fee": "Sửa phí gas", "edit_priority": "Sửa mức ưu tiên", - "gas_cancel_fee": "Phí gas hủy", + "gas_cancel_fee": "Gas cancellation fee", "gas_speedup_fee": "Phí gas tăng tốc", "use_max": "Dùng tối đa", "set_gas": "Thiết lập", @@ -3602,7 +3668,7 @@ "reload": "Tải lại", "share": "Chia sẻ", "bookmark": "Dấu trang", - "add_to_favorites": "Thêm vào mục Ưa thích", + "add_to_favorites": "Add to favorites", "error": "Lỗi", "cancel": "Hủy", "go_back": "Lùi", @@ -3610,7 +3676,7 @@ "home": "Trang chủ", "close": "Đóng", "open_in_browser": "Mở trong trình duyệt", - "change_url": "Thay đổi URL", + "change_url": "Change URL", "switch_network": "Chuyển mạng", "dapp_browser": "TRÌNH DUYỆT DAPP", "dapp_browser_message": "MetaMask là ví và trình duyệt của bạn cho trang web phi tập trung. Hãy xem thử!", @@ -3664,7 +3730,7 @@ "approve": { "title": "Phê duyệt", "deeplink": "Liên kết sâu", - "qr_code": "MÃ QR" + "qr_code": "Mã QR" }, "transactions": { "tx_review_confirm": "Xác nhận", @@ -3676,30 +3742,30 @@ "tx_review_increase_allowance": "Increase allowance", "tx_review_set_approval_for_all": "Set approval for all", "tx_review_staking_claim": "Staking claim", - "tx_review_staking_deposit": "Staking deposit", + "tx_review_staking_deposit": "Nạp tài sản ký gửi", "tx_review_staking_unstake": "Hủy ký gửi", - "tx_review_lending_deposit": "Lending deposit", + "tx_review_lending_deposit": "Nạp tài sản cho vay", "tx_review_lending_withdraw": "Lending withdrawal", "tx_review_perps_deposit": "Hợp đồng vĩnh cửu đã được nạp tiền", "tx_review_predict_deposit": "Dự đoán đã nạp tiền", "tx_review_predict_claim": "Tiền thắng đã nhận", "tx_review_predict_withdraw": "Rút tiền dự đoán", - "tx_review_musd_conversion": "mUSD Conversion", - "sent_ether": "Đã gửi Ether", - "self_sent_ether": "Sent yourself Ether", - "received_ether": "Đã nhận Ether", + "tx_review_musd_conversion": "Chuyển đổi mUSD", + "sent_ether": "Sent ETH", + "self_sent_ether": "Sent yourself ETH", + "received_ether": "Received ETH", "sent_dai": "Đã gửi DAI", "self_sent_dai": "Đã gửi DAI cho chính bạn", "received_dai": "Đã nhận DAI", "sent_tokens": "Sent tokens", "received_tokens": "Received tokens", - "ether": "Ether", + "ether": "ETH", "sent_unit": "Đã gửi {{unit}}", "self_sent_unit": "Sent yourself {{unit}}", "received_unit": "Đã nhận {{unit}}", "sent_collectible": "Sent collectible", "received_collectible": "Received collectible", - "send_ether": "Send Ether", + "send_ether": "Send ETH", "send_unit": "Send {{unit}}", "send_collectible": "Send collectible", "receive_collectible": "Receive collectible", @@ -3732,9 +3798,9 @@ }, "gas_used": "Gas used (units)", "gas_limit": "Gas limit (units)", - "gas_price": "Giá gas (GWEI)", - "base_fee": "Phí cơ bản (GWEI)", - "priority_fee": "Phí ưu tiên (GWEI)", + "gas_price": "Gas price (GWEI)", + "base_fee": "Base fee (GWEI)", + "priority_fee": "Priority fee (GWEI)", "multichain_priority_fee": "Phí ưu tiên", "max_fee": "Max fee per gas", "total": "Tổng", @@ -3767,7 +3833,7 @@ "confirm_gas_fee_token_tooltip": "Số tiền này được trả cho mạng để xử lý giao dịch của bạn. Bao gồm phí {{metamaskFeeFiat}} của MetaMask đối với các token không phải ETH hoặc ETH được nạp sẵn.", "paid_by_metamask": "Được thanh toán bởi MetaMask", "confirm_gas_fee_token_metamask_fee": "Bao gồm phí {{metamaskFeeFiat}}", - "smart_account_upgrade": "Nâng cấp lên tài khoản thông minh", + "smart_account_upgrade": "Chuyển sang tài khoản thông minh", "smart_account_downgrade": "Chuyển sang tài khoản tiêu chuẩn", "batched_transactions": "Giao dịch hàng loạt", "gas_modal": { @@ -3906,7 +3972,7 @@ "select_all": "Chọn tất cả", "deselect_all": "Bỏ chọn tất cả", "new_network": "Đã thêm mạng mới", - "network_name": "Mạng {{networkName}}", + "network_name": "mạng {{networkName}}", "network_added": " hiện có sẵn trong trình chọn mạng.", "provider": "Một nhà cung cấp đáng tin cậy sẽ thông báo cho bạn biết về số dư trong ví và phát các giao dịch một cách trung thực", "no_match": "Không tìm thấy kết quả trùng khớp.", @@ -4004,8 +4070,8 @@ "biometrics": { "enable_touchid": "Mở khóa bằng Touch ID?", "enable_faceid": "Mở khóa bằng Face ID?", - "enable_fingerprint": "Mở khóa bằng Vân tay?", - "enable_biometrics": "Mở khóa bằng Sinh trắc học?", + "enable_fingerprint": "Unlock with fingerprint?", + "enable_biometrics": "Unlock with biometrics?", "enable_device_passcode_ios": "Mở khóa bằng mật mã của thiết bị?", "enable_device_passcode_android": "Mở khóa bằng mã PIN của thiết bị?" }, @@ -4020,18 +4086,18 @@ "title": "YÊU CẦU KẾT NỐI", "walletconnect_title": "YÊU CẦU WALLETCONNECT", "action": "Kết nối với trang web này?", - "action_reconnect": "Để bắt đầu lại kết nối, hãy chọn số bạn nhìn thấy trên dApp", - "action_reconnect_deeplink": "Bạn có muốn kết nối lại với dApp này không?", + "action_reconnect": "To resume connection, choose the number you see on the site", + "action_reconnect_deeplink": "Do you want to reconnect to this site?", "connect": "Kết nối", "resume": "Bắt đầu lại", "cancel": "Hủy", - "donot_rememberme": "Không ghi nhớ kết nối dApp này", + "donot_rememberme": "Do not remember this site connection", "disconnect": "Ngắt kết nối", "permission": "Xem", "address": "địa chỉ công khai", "sign_messages": "Ký vào tin nhắn", "on_your_behalf": "thay mặt cho bạn", - "warning": "Bằng cách nhấp kết nối, bạn cho phép dapp này xem địa chỉ công khai của bạn. Đây là một bước bảo mật quan trọng để bảo vệ dữ liệu của bạn khỏi các nguy cơ lừa đảo qua mạng." + "warning": "By clicking connect, you allow this site to view your public address. This is an important security step to protect your data from potential phishing risks." }, "import_private_key": { "title": "Nhập tài khoản", @@ -4047,7 +4113,7 @@ "error_title": "Đã xảy ra sự cố", "error_message": "Chúng tôi không thể nhập khóa cá nhân. Vui lòng đảm bảo bạn đã nhập chính xác.", "error_empty_message": "Chúng tôi cần nhập khóa cá nhân của bạn.", - "or_scan_a_qr_code": "hoặc Quét Mã QR" + "or_scan_a_qr_code": "or scan a QR code" }, "import_private_key_success": { "title": "Tài khoản đã được nhập thành công!", @@ -4064,12 +4130,12 @@ "paste": "Dán", "clear": "Xóa tất cả", "srp_number_of_words_option_title": "Số lượng từ", - "12_word_option": "Tôi có cụm từ gồm 12 từ", - "24_word_option": "Tôi có cụm từ gồm 24 từ", + "12_word_option": "I have a 12-word phrase", + "24_word_option": "I have a 24-word phrase", "error_title": "Đã xảy ra sự cố", "error_message": "We couldn't import that Secret Recovery Phrase. Please make sure you entered it correctly.", "error_empty_message": "You need to enter your Secret Recovery Phrase.", - "error_number_of_words_error_message": "Cụm từ khôi phục bí mật gồm 12 hoặc 24 từ", + "error_number_of_words_error_message": "Secret Recovery Phrases contain 12 or 24 words", "error_srp_is_case_sensitive": "Dữ liệu đã nhập không hợp lệ! Cụm từ khôi phục bí mật có phân biệt chữ hoa và chữ thường.", "error_srp_word_error_1": "Từ ", "error_srp_word_error_2": " không đúng hoặc sai chính tả.", @@ -4079,7 +4145,7 @@ "error_invalid_srp": "Cụm từ khôi phục bí mật không hợp lệ", "error_duplicate_srp": "Cụm từ khôi phục bí mật này đã được nhập rồi.", "error_duplicate_account": "The account you are trying to import is a duplicate.", - "invalid_qr_code_title": "Mã QR không hợp lệ", + "invalid_qr_code_title": "Invalid QR code", "invalid_qr_code_message": "The QR code does not contain a valid Secret Recovery Phrase", "success_1": "Ví", "success_2": "đã nhập" @@ -4151,7 +4217,7 @@ "why_secure_2": "Đó là cách duy nhất để khôi phục ví nếu bạn không thể truy cập ứng dụng hoặc sử dụng thiết bị mới." }, "account_backup_step_2": { - "cancel_backup_title": "Cancel backup", + "cancel_backup_title": "Hủy sao lưu", "cancel_backup_message": "Chúng tôi đặc biệt khuyên bạn nên lưu Cụm từ khôi phục bí mật để khôi phục ví của bạn.", "cancel_backup_ok": "Được, tôi sẽ chấp nhận rủi ro", "cancel_backup_no": "Không, hãy sao lưu Cụm từ khôi phục bí mật", @@ -4163,7 +4229,7 @@ "cta_text": "OK" }, "account_backup_step_3": { - "cancel_backup_title": "Cancel backup", + "cancel_backup_title": "Hủy sao lưu", "cancel_backup_message": "Chúng tôi đặc biệt khuyên bạn nên lưu Cụm từ khôi phục bí mật để khôi phục ví của bạn.", "cancel_backup_ok": "Được, tôi sẽ chấp nhận rủi ro", "cancel_backup_no": "Không, hãy sao lưu Cụm từ khôi phục bí mật", @@ -4172,7 +4238,7 @@ "cta_text": "KHÔNG CÓ AI ĐANG QUAN SÁT TÔI" }, "account_backup_step_4": { - "cancel_backup_title": "Cancel backup", + "cancel_backup_title": "Hủy sao lưu", "cancel_backup_message": "Chúng tôi đặc biệt khuyên bạn nên lưu Cụm từ khôi phục bí mật để khôi phục ví của bạn.", "cancel_backup_ok": "Được, tôi sẽ chấp nhận rủi ro", "cancel_backup_no": "Không, hãy sao lưu Cụm từ khôi phục bí mật", @@ -4197,16 +4263,16 @@ "modal_button": "TIẾP" }, "account_backup_step_6": { - "title": "Security tips", + "title": "Lời khuyên bảo mật", "info_text": "MetaMask không thể khôi phục Cụm từ khôi phục bí mật của bạn nếu bạn làm mất", "tip_1": "Hãy giữ vài bản sao Cụm từ khôi phục bí mật của bạn", "tip_2": "Lưu cụm từ trong trình quản lý mật khẩu đáng tin cậy và cất giữ bản sao lưu trên giấy ở nơi an toàn", "tip_3": "Không bao giờ chia sẻ cụm từ này với bất cứ ai", "disclaimer": "* Bạn có thể tìm Cụm từ khôi phục bí mật của bạn bằng cách truy cập", - "disclaimer_bold": "Cài đặt > Bảo mật & Quyền riêng tư", - "cta_text": "ĐÃ HIỂU!", + "disclaimer_bold": "Cài đặt > Bảo mật và quyền riêng tư", + "cta_text": "ĐÃ HIỂU", "modal_title": "Chúc mừng!", - "modal_text": "Bạn đã sao lưu đầy đủ và sẵn sàng tiếp tục!", + "modal_text": "Bạn đã sao lưu đầy đủ và sẵn sàng tiếp tục.", "modal_button": "XONG", "copy_seed_phrase": "SAO CHÉP Cụm từ khôi phục bí mật VÀO BỘ NHỚ ĐỆM" }, @@ -4238,7 +4304,7 @@ "steps": "Bước {{currentStep}}/{{totalSteps}}", "action": "Xác nhận Cụm từ khôi phục bí mật của bạn", "info": "Chọn các từ còn thiếu theo đúng thứ tự.", - "complete": "Complete backup", + "complete": "Hoàn tất sao lưu", "success": "Thành công", "error-title": "Chưa đúng lắm", "error-description": "Kiểm tra kỹ Cụm từ khôi phục bí mật và thử lại.", @@ -4253,7 +4319,7 @@ "congratulations": "Chúc mừng", "success": "Bạn đã bảo vệ thành công ví của mình. Hãy nhớ giữ Cụm từ khôi phục bí mật an toàn, đó là trách nhiệm của bạn!", "hint": "Để lại gợi ý cho chính bạn?", - "recover": "MetaMask không thể khôi phục ví của bạn nếu bạn mất cụm từ này. Bạn có thể tìm Cụm từ khôi phục bí mật của bạn trong phần Cài đặt > Bảo mật & Quyền riêng tư.", + "recover": "MetaMask không thể khôi phục ví nếu bạn mất cụm từ này. Bạn có thể tìm Cụm từ khôi phục bí mật trong phần Cài đặt > Bảo mật và quyền riêng tư.", "learn": "Tìm hiểu thêm", "done": "Xong", "recovery_hint": "Gợi ý khôi phục", @@ -4417,7 +4483,7 @@ "metamask_swap_completed_title": "Đã hoàn tất hoán đổi", "metamask_swap_completed_description": "Quá trình Hoán đổi MetaMask của bạn đã thành công", "nft_sent_title": "Đã gửi NFT", - "nft_sent_description": "Bạn đã gửi thành công một NFT", + "nft_sent_description": "You successfully sent an NFT", "nft_received_title": "Đã nhận NFT", "nft_received_description": "Bạn đã nhận được NFT mới", "rocketpool_stake_completed_title": "Hoàn tất ký gửi", @@ -4517,16 +4583,16 @@ "description_1": "Liên kết mà bạn yêu cầu đã sẵn sàng để gửi!", "description_2": "Gửi liên kết này cho một người bạn, và nó sẽ đề nghị họ gửi", "copy_to_clipboard": "Sao chép vào bộ nhớ đệm", - "qr_code": "MÃ QR", + "qr_code": "Mã QR", "send_link": "Send link", - "request_qr_code": "Mã QR yêu cầu thanh toán", + "request_qr_code": "Payment request QR code", "balance": "Số dư" }, "receive_request": { "title": "Nhận", "share_title": "Share address", "share_description": "Email hoặc nhắn tin địa chỉ của bạn", - "qr_code_title": "MÃ QR", + "qr_code_title": "Mã QR", "qr_code_description": "Ảnh có thể quét có thể đọc địa chỉ của bạn", "request_title": "Yêu cầu", "request_description": "Yêu cầu tài sản từ bạn bè", @@ -4561,12 +4627,12 @@ "close_current_session": "Đóng phiên hiện tại trước khi bắt đầu một phiên mới." }, "paymentRequest": { - "title": "YÊU CẦU THANH TOÁN", - "title_complete": "HOÀN TẤT THANH TOÁN", - "confirm": "THANH TOÁN", - "cancel": "TỪ CHỐI", + "title": "Payment request", + "title_complete": "Payment complete", + "confirm": "Pay", + "cancel": "Decline", "is_requesting_you_to_pay": "đang yêu cầu bạn thanh toán", - "total": "TỔNG:" + "total": "Tổng cộng:" }, "webview_error": { "title": "Đã xảy ra sự cố", @@ -4589,6 +4655,10 @@ "fiat_on_ramp": { "buy_eth": "Mua ETH", "buy": "Mua {{ticker}}", + "on_network": "trên {{networkName}}", + "debit_card": "Thẻ ghi nợ", + "continue": "Tiếp tục", + "powered_by_provider": "Cung cấp bởi {{provider}}", "purchased_currency": "Đã mua {{currency}}", "network_not_supported": "Không hỗ trợ mạng hiện tại", "switch_network": "Vui lòng chuyển sang Mạng chính", @@ -4676,6 +4746,14 @@ "subtitle_5": "để xem phí gas là bao nhiêu.", "cta": "Tiếp tục mua {{ticker}}" } + }, + "build_quote_settings_modal": { + "title": "Cài đặt", + "view_order_history": "Xem lịch sử lệnh", + "contact_support": "Liên hệ bộ phận hỗ trợ", + "log_out": "Đăng xuất khỏi {{provider}}", + "logged_out_success": "Đã đăng xuất thành công", + "logged_out_error": "Lỗi khi đăng xuất" } }, "fiat_on_ramp_aggregator": { @@ -4706,7 +4784,7 @@ "use_new_buy_experience_description": "Chuyển sang phiên bản mới" }, "onboarding": { - "what_to_expect": "Mong đợi", + "what_to_expect": "Những điều cần biết", "quotes": "Tính năng mua tiền mã hóa của chúng tôi sẽ tổng hợp báo giá từ các nhà cung cấp được tích hợp, cung cấp báo giá từ các nguồn đó để nhận tiền mã hóa trực tiếp vào ví của bạn mà không mất thời gian chờ đợi.", "quotes_sell": "Giờ đây, bạn có thể rút tiền trực tiếp trong MetaMask! Nhận báo giá cập nhật từng phút từ các nhà cung cấp đáng tin cậy trong lúc chúng tôi hướng dẫn bạn từng bước.", "benefits": "Trả phí gas ít hơn và hỗ trợ nhiều mạng, token và phương thức thanh toán", @@ -4761,7 +4839,7 @@ "get_quotes": "Nhận báo giá", "done": "Hoàn tất", "fetching_quotes": "Đang tìm nạp báo giá", - "select_a_quote": "Chọn một báo giá", + "select_a_quote": "Chọn báo giá", "recommended_quote": "Báo giá đề xuất", "select_a_cryptocurrency": "Chọn một loại tiền điện tử", "select_a_cryptocurrency_description": "Chọn từ danh sách token có sẵn.", @@ -4822,6 +4900,7 @@ "title": "Chọn khu vực của bạn", "description": "Phương thức thanh toán và token có sẵn dành cho bạn được xác định bởi các nhà cung cấp tích hợp bên thứ ba của chúng tôi và có thể khác nhau tùy thuộc vào khu vực của bạn cũng như tùy theo sự hỗ trợ của các nhà cung cấp tích hợp của chúng tôi.", "sell_description": "Các tùy chọn điểm nhận tiền và token có thể khác nhau tùy theo khu vực của bạn.", + "region_variation_notice": "Phương thức thanh toán và token khả dụng có thể khác nhau tùy theo khu vực của bạn và nhà cung cấp của chúng tôi.", "search_by_country": "Tìm kiếm theo quốc gia", "search_by_state": "Tìm kiếm theo bang", "no_region_results": "Không có khu vực phù hợp", @@ -4849,7 +4928,7 @@ "continue_order_description": "Để tiếp tục lệnh, bạn sẽ cần chọn nút ở cuối trang này.", "the_provider": "nhà cung cấp", "processing": "Đang xử lý lệnh", - "processing_card_description": "Mua bằng thẻ Tín dụng/Ghi nợ thường mất vài phút", + "processing_card_description": "Mua bằng thẻ tín dụng/ghi nợ thường chỉ mất vài phút", "processing_bank_description": "Chuyển khoản ngân hàng thường mất vài ngày làm việc", "details": "Chi tiết về lệnh", "via": "qua", @@ -4883,11 +4962,11 @@ "sent": "Đã gửi!" }, "notifications": { - "purchase_failed_title": "Giao dịch mua {{currency}} đã thất bại! Vui lòng thử lại, rất tiếc vì sự bất tiện này!", + "purchase_failed_title": "Mua {{currency}} không thành công. Vui lòng thử lại sau.", "purchase_failed_description": "Xác minh phương thức thanh toán và kiểm tra thẻ của bạn có được hỗ trợ hay không", "purchase_cancelled_title": "Giao dịch mua của bạn đã bị hủy", "purchase_cancelled_description": "Xác minh phương thức thanh toán và kiểm tra thẻ của bạn có được hỗ trợ hay không", - "purchase_completed_title": "Giao dịch mua {{amount}} {{currency}} của bạn đã thành công!", + "purchase_completed_title": "Bạn đã mua {{amount}} {{currency}} thành công.", "purchase_completed_description": "{{currency}} của bạn giờ đã sẵn sàng", "purchase_pending_title": "Đang xử lý giao dịch mua {{currency}} của bạn", "purchase_pending_description": "Quá trình này chỉ mất vài phút...", @@ -4896,7 +4975,7 @@ "sale_cancelled_title": "Lệnh đã bị hủy", "sale_cancelled_description": "Không thể hoàn tất lệnh của bạn.", "sale_completed_title": "Lệnh đã hoàn tất", - "sale_completed_description": "Lệnh của bạn đã thành công!.", + "sale_completed_description": "Lệnh của bạn đã thành công.", "sale_pending_title": "Đang xử lý lệnh bán {{currency}}", "sale_pending_description": "Lệnh của bạn hiện đang được xử lý.", "no_date": "Không xác định" @@ -4921,7 +5000,7 @@ "start_swapping": "Bắt đầu hoán đổi" }, "feature_off_title": "Tạm thời không được cung cấp", - "feature_off_body": "Tính năng Hoán đổi trên MetaMask đang được bảo trì. Vui lòng thử lại sau.", + "feature_off_body": "MetaMask Swaps are undergoing maintenance. Please check back later.", "wrong_network_title": "Giao dịch hoán đổi không có sẵn", "wrong_network_body": "Bạn chỉ có thể hoán đổi những Token trên Mạng chính của Ethereum.", "unallowed_asset_title": "Không thể hoán đổi Token này", @@ -5002,7 +5081,7 @@ "edit": "Sửa", "quotes_include_fee": "Báo giá bao gồm {{fee}}% phí MetaMask", "quotes_include_gas_and_metamask_fee": "Báo giá bao gồm phí gas và phí MetaMask {{fee}}%", - "tap_to_swap": "Chạm để hoán đổi", + "tap_to_swap": "Tap to swap", "swipe_to_swap": "Vuốt để hoán đổi", "swipe_to": "Vuốt để", "swap": "Hoán đổi", @@ -5130,7 +5209,7 @@ "contact_support": "Liên hệ bộ phận hỗ trợ" }, "whats_new": { - "title": "Có gì mới", + "title": "Xem tính năng mới", "remove_gns_new_ui_update": { "title": "Cập nhật giao diện người dùng mới", "introduction": "Chúng tôi đã cập nhật để cải thiện trải nghiệm ứng dụng.", @@ -5302,7 +5381,7 @@ }, "network_information": { "things_to_keep_in_mind": "Những điều cần lưu ý", - "testnet_network": "Mạng thử nghiệm {{type}}", + "testnet_network": "mạng thử nghiệm {{type}}", "first_description": "Token gốc của mạng này là {{ticker}}. Token này được dùng làm phí gas.", "second_description": "Nếu bạn cố gắng gửi tài sản trực tiếp từ mạng này sang mạng khác, điều này có thể khiến tài sản bị mất vĩnh viễn. Nhớ sử dụng cầu nối.", "third_description": "Các token có thể không tự động hiển thị trong ví của bạn.", @@ -5385,7 +5464,7 @@ "learn_more": "Tìm hiểu thêm" }, "token_allowance": { - "verify_third_party_details": "Xác minh thông tin bên thứ ba", + "verify_third_party_details": "Verify third-party details", "protect_from_scams": "Để bảo vệ chính mình khỏi những kẻ lừa đảo, hãy dành chút thời gian để xác minh thông tin bên thứ ba.", "learn_to_verify": "Tìm hiểu cách xác minh thông tin bên thứ ba", "spending_cap": "giới hạn chi tiêu", @@ -5399,7 +5478,7 @@ }, "restore_wallet": { "restore_needed_title": "Cần khôi phục", - "restore_needed_description": "Đã xảy ra sự cố nhưng đừng lo lắng! Hãy thử khôi phục ví của bạn.", + "restore_needed_description": "Something went wrong, but don’t worry! Let’s try to restore your wallet.", "restore_needed_action": "Khôi phục ví" }, "wallet_restored": { @@ -5545,7 +5624,7 @@ "add_bitcoin_account": "Tài khoản Bitcoin", "add_solana_account": "Tài khoản Solana", "add_tron_account": "Tài khoản Tron", - "switch_to_smart_account": "Chuyển sang Tài khoản Thông minh", + "switch_to_smart_account": "Chuyển sang tài khoản thông minh", "rename_account": "Đổi tên tài khoản", "addresses": "Địa chỉ", "headers": { @@ -5598,6 +5677,10 @@ "error_description": "Cài đặt {{snap}} thất bại." }, "earn": { + "claimable_bonus_tooltip": "An annual bonus claimable daily from your wallet.", + "earn_a_percentage_bonus": "Earn a {{percentage}}% bonus", + "claimable_bonus": "Claimable bonus", + "claim_bonus": "Claim bonus", "empty_state_cta": { "heading": "Cho vay {{tokenSymbol}} và nhận lãi", "body": "Cho vay {{tokenSymbol}} với {{protocol}} và kiếm lợi nhuận", @@ -5681,21 +5764,36 @@ "fee": "Phí" }, "musd_conversion": { - "convert_to_musd": "Convert to mUSD", + "ok": "OK", + "continue": "Continue", + "convert_and_get_percentage_bonus": "Chuyển đổi và nhận {{percentage}}%", + "get_a_percentage_musd_bonus": "Nhận thưởng {{percentage}}% mUSD", + "convert": "Chuyển đổi", "toasts": { - "converting": "Converting {{token}} → mUSD", + "converting": "Đang chuyển đổi {{token}} → mUSD", "eta": "~{{time}}", - "delivered": "Your mUSD has been delivered!", - "failed": "mUSD conversion failed" + "delivered": "mUSD của bạn đã sẵn sàng!", + "failed": "Chuyển đổi mUSD thất bại" }, "education": { - "heading": "Nhận phần thưởng với mUSD", - "description": "Convert your USDC, USDT, or DAI for mUSD, MetaMask’s dollar-backed stablecoin.Earn points every time you convert or hold $100.", - "continue_button": "Bắt đầu" + "heading": "NHẬN {{percentage}}%\nĐỒNG ỔN ĐỊNH", + "description": "Convert your stablecoins to mUSD, MetaMask’s US dollar-backed stablecoin, and receive up to a {{percentage}}% bonus.", + "terms_apply": "Terms apply.", + "primary_button": "Bắt đầu", + "secondary_button": "Không phải bây giờ" }, - "earn_points_daily": "Earn points daily", - "buy_musd": "Buy mUSD", - "get_musd": "Get mUSD" + "buy_musd": "Mua mUSD", + "get_musd": "Nhận mUSD", + "boost_title": "Get {{percentage}}% on your stablecoins", + "boost_description": "Convert your stablecoins to mUSD and receive up to a {{percentage}}% bonus.", + "powered_by_relay": "Cung cấp bởi Relay" + }, + "bonus_claim": { + "toasts": { + "claiming": "Your mUSD bonus is processing", + "delivered": "Your mUSD bonus is here!", + "failed": "Bonus claim failed" + } }, "rewards": { "rewards_tag_label": "Phần thưởng", @@ -5711,22 +5809,22 @@ "stake": "Stake", "earn": "Kiếm lợi nhuận", "tron": { - "stake_completed": "Staking completed", - "stake_completed_description": "Your staking transaction has been completed successfully.", - "stake_failed": "Staking failed", + "stake_completed": "Ký gửi đã hoàn tất", + "stake_completed_description": "Giao dịch ký gửi của bạn đã hoàn tất thành công.", + "stake_failed": "Ký gửi thất bại", "unstake_completed": "Đã hoàn tất hủy ký gửi", - "unstake_completed_description": "Your unstaking transaction has been completed successfully.", - "unstake_failed": "Unstaking failed", + "unstake_completed_description": "Giao dịch hủy ký gửi của bạn đã hoàn tất thành công.", + "unstake_failed": "Hủy ký gửi thất bại", "bandwidth": "Băng thông", "energy": "Năng lượng", "estimated_annual_reward": "Phần thưởng hằng năm ước tính", - "trx_locked_for": "TRX locked for", - "trx_locked_for_minimum_time": "~3 days", - "trx_released_in": "TRX released in", - "trx_released_in_minimum_time": "~14 days", + "trx_locked_for": "TRX bị khóa trong", + "trx_locked_for_minimum_time": "~3 ngày", + "trx_released_in": "TRX được mở khóa sau", + "trx_released_in_minimum_time": "~14 ngày", "fee": "Phí", "errors": { - "insufficient_balance": "You don't have enough resource balance to do this action." + "insufficient_balance": "Bạn không có đủ số dư tài nguyên để thực hiện hành động này." } }, "stake_eth": "Ký gửi ETH", @@ -5772,12 +5870,19 @@ "learn_more_with_period": "Tìm hiểu thêm." }, "stake_your_trx_cta": { - "title": "Lend Tron and earn", - "description_start": "Stake your Tron and earn ", + "title": "Cho vay Tron và nhận lãi", + "description_start": "Ký gửi Tron và kiếm lợi nhuận ", "description_end": " hằng năm.", "learn_more": "Tìm hiểu thêm.", "earn_button": "Kiếm lợi nhuận" }, + "trx_learn_more": { + "title": "Stake TRX and earn", + "stake_any_amount": "Stake any amount of TRX.", + "earn_trx_rewards": "Nhận phần thưởng TRX.", + "earn_trx_rewards_description": "Bắt đầu nhận thưởng ngay khi bạn ký gửi. Phần thưởng sẽ tự động cộng dồn.", + "flexible_unstaking_description": "Unstake anytime. Unstaking takes 14 days to process." + }, "day": { "zero": "", "one": "ngày", @@ -5981,7 +6086,7 @@ "switch_account_type": "Cập nhật tài khoản", "approve": "Phê duyệt yêu cầu", "perps_deposit": "Nạp tiền", - "predict_deposit": "Nạp tiền dự đoán", + "predict_deposit": "Nạp tiền Dự đoán", "predict_withdraw": "Rút tiền" }, "sub_title": { @@ -6005,11 +6110,12 @@ "transaction_fee": "Chúng tôi sẽ hoán đổi token của bạn sang USDC.e trên Polygon, mạng được thị trường Dự đoán sử dụng. Các nhà cung cấp dịch vụ hoán đổi có thể tính phí, nhưng MetaMask thì không." }, "musd_conversion": { - "transaction_fee": "mUSD conversion fees include network costs and may include provider fees." + "transaction_fee": "Phí chuyển đổi mUSD bao gồm phí mạng và có thể bao gồm phí từ nhà cung cấp." }, "title": { "transaction_fee": "Phí" - } + }, + "network_fee": "Phí mạng phụ thuộc vào mức độ tắc nghẽn của mạng và độ phức tạp của giao dịch." }, "spending_cap": "Giới hạn chi tiêu", "withdraw": "Rút tiền", @@ -6026,7 +6132,7 @@ "qr_get_sign": "Get signature", "qr_scan_text": "Quét bằng ví cứng của bạn", "sign_with_ledger": "Ký bằng Ledger", - "smart_account": "Tài khoản Thông minh", + "smart_account": "Tài khoản thông minh", "smart_contract": "Hợp đồng thông minh", "standard_account": "Standard account", "siwe_message": { @@ -6061,7 +6167,7 @@ "unavailable": "Không khả dụng" }, "7702_functionality": { - "smartAccountLabel": "Tài khoản Thông minh", + "smartAccountLabel": "Tài khoản thông minh", "standardAccountLabel": "Standard account", "switch": "Chuyển", "switchBack": "Chuyển trở lại", @@ -6078,7 +6184,7 @@ }, "includes_transaction": "Bao gồm {{transactionCount}} giao dịch", "useSmartAccount": "Sử dụng tài khoản thông minh", - "successful": "Thành công!", + "successful": "Thành công", "success_message": "Tài khoản của bạn sẽ được nâng cấp thành tài khoản thông minh từ giao dịch tiếp theo." }, "edit_spending_cap_modal": { @@ -6086,9 +6192,9 @@ "cancel": "Hủy", "description": "Nhập số tiền mà bạn cảm thấy thoải mái khi được chi tiêu thay mặt cho bạn.", "invalid_number_error": "Hạn mức chi tiêu phải là một con số", - "no_empty_error": "Hạn mức chi tiêu không được để trống", - "no_extra_decimals_error": "Hạn mức chi tiêu không được có nhiều số thập phân hơn token", - "no_zero_error": "Hạn mức chi tiêu không được bằng 0", + "no_empty_error": "Spending cap can't be empty", + "no_extra_decimals_error": "Spending cap can't have more decimals than the token", + "no_zero_error": "Spending cap can't be 0", "no_zero_error_decrease_allowance": "Hạn mức chi tiêu bằng 0 không có hiệu lực đối với phương thức 'decreaseAllowance'", "no_zero_error_increase_allowance": "Hạn mức chi tiêu bằng 0 không có hiệu lực đối với phương thức \"increaseAllowance\"", "save": "Lưu", @@ -6119,7 +6225,7 @@ "edit_amount_done": "Tiếp tục", "deposit_edit_amount_done": "Nạp tiền", "deposit_edit_amount_predict_withdraw": "Rút tiền", - "deposit_edit_amount_musd_conversion": "Convert to mUSD" + "deposit_edit_amount_musd_conversion": "Chuyển đổi sang mUSD" }, "change_in_simulation_modal": { "title": "Kết quả đã thay đổi", @@ -6144,6 +6250,8 @@ "confirm_swap": "Hoán đổi", "terms_and_conditions": "Điều khoản và điều kiện", "select_token": "Chọn token", + "no_tokens_found": "Không tìm thấy token", + "no_tokens_found_description": "We couldn't find any tokens with this name. Try a different search.", "select_network": "Chọn mạng", "all_networks": "Tất cả mạng", "num_networks": "{{numNetworks}} mạng", @@ -6151,6 +6259,7 @@ "select_all_networks": "Chọn tất cả", "deselect_all_networks": "Bỏ chọn tất cả", "see_all": "Xem tất cả", + "all": "Tất cả", "apply": "Áp dụng", "slippage": "Trượt giá", "slippage_info": "Nếu giá thay đổi giữa thời điểm bạn đặt lệnh và xác nhận, điều đó gọi là “trượt giá”. Giao dịch hoán đổi của bạn sẽ tự động bị hủy nếu mức trượt giá vượt quá mức sai lệch bạn đã thiết lập ở đây.", @@ -6191,9 +6300,9 @@ "title": "Cầu nối", "submitting_transaction": "Đang gửi", "fetching_quote": "Tìm nạp báo giá", - "fee_disclaimer": "Bao gồm phí {{feePercentage}}% của MM.", + "fee_disclaimer": "Includes {{feePercentage}}% MetaMask fee.", "no_mm_fee": "Không có phí MM", - "no_mm_fee_disclaimer": "Không có phí MM khi hoán đổi sang {{destTokenSymbol}}.", + "no_mm_fee_disclaimer": "No MetaMask fee swapping into {{destTokenSymbol}}.", "hardware_wallet_not_supported": "Ví cứng hiện chưa được hỗ trợ. Hãy sử dụng ví nóng để tiếp tục.", "hardware_wallet_not_supported_solana": "Ví cứng hiện chưa được hỗ trợ cho Solana. Hãy sử dụng ví nóng để tiếp tục.", "price_impact_info_title": "Mức tác động giá", @@ -6208,15 +6317,7 @@ "approval_tooltip_content": "Bạn đang cho phép truy cập đúng số lượng đã chỉ định, {{amount}} {{symbol}}. Hợp đồng sẽ không truy cập thêm bất kỳ khoản tiền nào khác.", "minimum_received": "Minimum received", "minimum_received_tooltip_title": "Minimum received", - "minimum_received_tooltip_content": "Số lượng tối thiểu bạn sẽ nhận được nếu giá thay đổi trong quá trình xử lý giao dịch, dựa trên mức trượt giá bạn cho phép. Đây là con số ước tính từ các nhà cung cấp thanh khoản. Số lượng cuối cùng có thể khác.", - "verified_token": "Token đã xác minh", - "price": "Giá", - "percent_change": "Phần trăm thay đổi", - "volume": "Khối lượng", - "market_cap_fdv": "Vốn hóa thị trường (FDV)", - "listed_on": "Được niêm yết trên", - "centralized_exchanges": "Sàn giao dịch tập trung", - "contract_address": "Địa chỉ hợp đồng" + "minimum_received_tooltip_content": "Số lượng tối thiểu bạn sẽ nhận được nếu giá thay đổi trong quá trình xử lý giao dịch, dựa trên mức trượt giá bạn cho phép. Đây là con số ước tính từ các nhà cung cấp thanh khoản. Số lượng cuối cùng có thể khác." }, "quote_expired_modal": { "title": "Đã có báo giá mới", @@ -6290,12 +6391,12 @@ "title": "Khôi phục ví", "login_with_social": "Đăng nhập bằng tài khoản mạng xã hội", "setup": "Thiết lập", - "secret_recovery_phrase": "Cụm từ khôi phục bí mật {{num}}", + "secret_recovery_phrase": "Secret Recovery Phrase {{num}}", "back_up": "Sao lưu", "reveal": "Hiển thị", "social_recovery_title": "KHÔI PHỤC {{authConnection}}", "social_recovery_enable": "Đã bật", - "social_login_description": "Sử dụng thông tin đăng nhập {{authConnection}} và mật khẩu MetaMask để khôi phục tài khoản và cụm từ khôi phục bí mật của bạn.", + "social_login_description": "Sử dụng thông tin đăng nhập {{authConnection}} và mật khẩu MetaMask để khôi phục tài khoản và Cụm từ khôi phục bí mật của bạn.", "srps_title": "CỤM TỪ KHÔI PHỤC BÍ MẬT", "srps_description": "Ví của bạn được bảo vệ tốt nhất khi cả hai phương thức khôi phục đều được thiết lập. Nếu một phương thức thất bại, phương thức còn lại sẽ giúp bạn khôi phục ví." }, @@ -6349,7 +6450,7 @@ "section_1_title": "Tài khoản đa chuỗi là gì?", "section_1_description": "Một tài khoản, nhiều địa chỉ trên tất cả các mạng mà MetaMask hỗ trợ. Giờ đây bạn có thể sử dụng Ethereum, Solana và nhiều mạng khác mà không cần chuyển tài khoản.", "section_2_title": "Cùng một địa chỉ, nhiều mạng hơn", - "section_2_description": "Chúng tôi đã nhóm các tài khoản của bạn, vì vậy bạn có thể tiếp tục sử dụng MetaMask như trước đây. Tiền của bạn vẫn an toàn và không thay đổi", + "section_2_description": "Chúng tôi đã nhóm các tài khoản của bạn, vì vậy bạn có thể tiếp tục sử dụng MetaMask như trước đây. Tiền của bạn vẫn an toàn và không thay đổi.", "view_accounts_button": "Xem tài khoản", "learn_more_button": "Tìm hiểu thêm", "setting_up_accounts": "Thiết lập tài khoản của bạn" @@ -6511,8 +6612,10 @@ }, "card_onboarding": { "title": "Chi tiêu\nvà\nNhận thưởng", - "description": "MetaMask Card là cách nhanh chóng và dễ dàng để chi tiêu tiền mã hóa như tiền mặt và nhận phần thưởng.", + "description": "MetaMask Card là cách nhanh chóng và dễ dàng để chi tiêu tiền mã hóa và nhận hoàn tiền lên đến 3%.", "apply_now_button": "Đăng ký ngay", + "login_button": "Đăng nhập", + "not_now_button": "Không phải bây giờ", "sign_up": { "title": "Bắt đầu nào", "description": "Tạo tài khoản MetaMask Card của bạn, được cung cấp bởi Crypto Life. Tài khoản này sẽ tách biệt với tài khoản MetaMask của bạn.", @@ -6540,6 +6643,7 @@ "phone_number_label": "Nhập số điện thoại", "country_area_code_label": "Mã vùng quốc gia", "invalid_phone_number": "Số điện thoại không hợp lệ", + "invalid_us_phone_number": "Vui lòng nhập số điện thoại hợp lệ tại Hoa Kỳ (10 chữ số) để tiếp tục.", "legal_terms": "Bằng cách tiếp tục, bạn đồng ý nhận tin nhắn SMS để xác minh số điện thoại của mình." }, "confirm_phone_number": { @@ -6576,8 +6680,8 @@ "terms": "Phê duyệt thường mất khoảng 12 giờ. Chúng tôi sẽ thông báo cho bạn khi có quyết định." }, "verifying_veriff_kyc": { - "title": "Đang xác minh danh tính của bạn", - "description": "Vui lòng đợi trong lúc chúng tôi xác minh danh tính của bạn.", + "title": "Đang chờ phê duyệt", + "description": "Đối tác của chúng tôi cần xác minh danh tính của bạn để phê duyệt đơn đăng ký.", "helper_text": "Quá trình này thường chỉ mất vài giây. Vui lòng không đóng ứng dụng." }, "verifying_registration": { @@ -6614,7 +6718,7 @@ }, "physical_address": { "title": "Thêm địa chỉ của bạn", - "description": "Nhập địa chỉ nhà của bạn. Nếu được phê duyệt, chúng tôi sẽ gửi thẻ vật lý đến địa chỉ này.", + "description": "Nhập địa chỉ nhà hiện tại của bạn. Chúng tôi sẽ sử dụng thông tin này để xác minh.", "address_line_1_label": "Dòng địa chỉ 1", "address_line_2_label": "Dòng địa chỉ 2", "city_label": "Thành phố", @@ -6622,7 +6726,7 @@ "zip_code_label": "Mã Zip", "country_label": "Quốc gia", "electronic_consent_1": "Tôi đồng ý với Thỏa thuận Đạo luật Chữ ký Điện tử và Tiết lộ Thông tin và đồng ý nhận tất cả thông tin liên lạc dưới dạng điện tử. ", - "electronic_consent_2": "View document(PDF)" + "electronic_consent_2": "Xem tài liệu (PDF)" }, "mailing_address": { "title": "Địa chỉ nhận thư", @@ -6668,22 +6772,24 @@ } }, "card_home": { + "title": "Card", + "available_balance": "Số dư khả dụng", "error_title": "Không thể tìm nạp dữ liệu", "error_description": "Dường như đang có sự cố khiến bạn không thể xem nội dung trên trang này. Vui lòng kiểm tra kết nối hoặc thử làm mới trang.", "try_again": "Thử lại", - "limited_spending_warning": "Khả năng chi tiêu thực tế của bạn có thể bị giới hạn. Để điều chỉnh hạn mức, hãy vào {{manageCard}}", + "limited_spending_warning": "Khả năng chi tiêu thực tế của bạn có thể bị giới hạn. Để điều chỉnh hạn mức, hãy vào ", "add_funds": "Thêm tiền", "change_asset": "Thay đổi tài sản", "enable_card_button_label": "Kích hoạt thẻ", "enable_assets_button_label": "Kích hoạt tài sản", "spending_limit_warning": "Bạn sắp đạt đến hạn mức chi tiêu. Cập nhật để tránh bị từ chối.", "logout": "Đăng xuất", - "logout_description": "Đăng xuất khỏi tài khoản Thẻ MetaMask của bạn", "logout_confirmation_title": "Đăng xuất khỏi Thẻ?", "logout_confirmation_message": "Bạn có chắc chắn muốn đăng xuất khỏi tài khoản Thẻ MetaMask của mình không?", "logout_confirmation_cancel": "Hủy", "logout_confirmation_confirm": "Đăng xuất", "enable_card_error": "Không thể kích hoạt thẻ. Vui lòng thử lại sau.", + "view_card_details_error": "Unable to load card details. Please try again.", "warnings": { "close_spending_limit": { "title": "Bạn sắp đạt đến hạn mức chi tiêu", @@ -6706,6 +6812,16 @@ "blocked": { "title": "Thẻ của bạn bị chặn", "description": "Vui lòng liên hệ bộ phận hỗ trợ để bỏ chặn thẻ của bạn" + }, + "kyc_pending": { + "title": "Đang xác minh", + "description": "Your identity verification is being reviewed. This typically takes less than 12 hours." + } + }, + "messages": { + "card_provisioning": { + "title": "Card being created", + "description": "Your card is being created. This may take a few moments." } }, "kyc_status": { @@ -6729,33 +6845,46 @@ "ok_button": "OK" }, "manage_card_options": { - "manage_spending_limit": "Quản lý hạn mức chi tiêu", + "view_card_details": "View card details", + "hide_card_details": "Hide card details", + "view_card_details_description": "Card number, expiration and CVV", + "manage_spending_limit": "Manage limit", "manage_spending_limit_description_restricted": "Giới hạn chi tiêu đang bật", "manage_spending_limit_description_full": "Quyền truy cập đầy đủ đang bật", "manage_card": "Quản lý thẻ", - "advanced_card_management_description": "Xem thông tin thẻ, giao dịch, v.v.", + "advanced_card_management_description": "See activity, cashback, freeze card, and more", "travel_title": "MetaMask Travel", - "travel_description": "Đặt phòng khách sạn với mức giảm giá lên đến 60% so với Expedia", - "card_tos_title": "Điều khoản và Điều kiện của Thẻ", - "card_tos_description": "Đọc điều khoản của nhà cung cấp thẻ" + "travel_description": "Book hotels with up to 70% discounts", + "card_tos_title": "Terms and conditions" } }, "card_spending_limit": { "title_change_token": "Thay đổi token và mạng", "title_enable_token": "Kích hoạt token", + "title_onboarding": "Bật chi tiêu", + "setup_title": "Set up your card", + "setup_description": "Select the token you'd like to use and set a limit for how much you can spend.", + "asset_label": "Tài sản", + "limit_label": "Giới hạn", + "other_token": "Other", "full_access_title": "Quyền truy cập đầy đủ", - "full_access_description": "Thẻ của bạn có thể sử dụng tiền tự động mà không cần yêu cầu phê duyệt cho mỗi lần sử dụng.", - "restricted_limit_title": "Chi tiêu giới hạn", - "restricted_limit_description": "Bạn sẽ cần quay lại và trả phí mạng mỗi khi muốn tăng hạn mức.", + "full_access_description": "Your card can use your funds automatically without asking for approval each time.", + "restricted_limit_title": "Hạn mức chi tiêu", + "restricted_limit_description": "Bạn chỉ có thể chi tiêu trong hạn mức này. Mỗi lần cập nhật hạn mức, bạn sẽ phải trả một khoản phí mạng.", "edit_limit": "Sửa hạn mức", "confirm_new_limit": "Xác nhận", "cancel": "Hủy", + "skip": "Bỏ qua bây giờ", "set_new_limit": "Đặt hạn mức", "dismiss": "Đóng", "update_success": "Đã cập nhật hạn mức chi tiêu thành công", "update_error": "Cập nhật hạn mức chi tiêu thất bại", "solana_not_supported": "Kích hoạt token Solana trên card.metamask.io", - "select_token": "Chọn token" + "select_token": "Chọn token", + "loading": "Đang tải các token khả dụng...", + "load_error": "Không thể tải token. Vui lòng thử lại.", + "retry": "Thử lại", + "on_linea": "trên Linea" }, "change_asset": { "title": "Thay đổi token và mạng", @@ -6793,6 +6922,7 @@ "signup_button": "Đăng ký", "errors": { "invalid_credentials": "Thông tin đăng nhập không hợp lệ", + "invalid_otp_code": "Mã không chính xác, vui lòng thử lại", "unknown_error": "Lỗi không xác định, vui lòng thử lại sau", "email_required": "Yêu cầu nhập email", "password_required": "Yêu cầu nhập mật khẩu", @@ -6811,7 +6941,7 @@ "description_without_phone_number": "Chúng tôi đã gửi mã xác nhận đến số điện thoại của bạn. Vui lòng nhập mã để tiếp tục.", "confirm_code_label": "Mã xác nhận", "confirm_button": "Xác nhận", - "back_to_login_button": "Quay lại Đăng nhập", + "back_to_login_button": "Quay lại đăng nhập", "didnt_receive_code": "Không nhận được mã? ", "resend_verification": "Gửi lại", "resend_cooldown": "Có thể gửi lại sau {{seconds}} giây" @@ -6839,8 +6969,8 @@ }, "rewards": { "auth_fail_title": "Lỗi không xác định.", - "auth_fail_description": "Đã xảy ra lỗi không xác định khi xác thực tài khoản này với chương trình phần thưởng. Vui lòng thử lại sau.", - "failed_to_authenticate": "Không thể xác thực với chương trình phần thưởng", + "auth_fail_description": "Đã xảy ra lỗi không xác định khi xác thực tài khoản này với MetaMask Phần thưởng. Vui lòng thử lại sau.", + "failed_to_authenticate": "Xác thực với MetaMask Phần thưởng không thành công", "not_implemented": "Sắp ra mắt", "not_implemented_season_summary": "Tổng kết mùa giải sắp ra mắt", "optin_error": { @@ -6867,6 +6997,10 @@ "error_fetching_description": "Kiểm tra kết nối của bạn và thử lại.", "retry_button": "Thử lại" }, + "linea_tokens": { + "default_title": "$LINEA", + "title_earned": "Bạn đã nhận được {{amount}} $LINEA" + }, "upcoming_rewards_error": { "error_fetching_title": "Không thể tải phần thưởng", "error_fetching_description": "Kiểm tra kết nối của bạn và thử lại.", @@ -6898,6 +7032,15 @@ "claim_reward_error": { "title": "Không thể nhận phần thưởng" }, + "metal_card_claim": { + "title": "Đổi phần thưởng của bạn", + "description": "Thẻ MetaMask Metal phụ thuộc vào tư cách đủ điều kiện và không khả dụng ở tất cả các khu vực. Nếu bạn không đủ điều kiện, bạn sẽ nhận được phần thưởng hàng hóa cao cấp độc quyền.", + "contact_info": "Chia sẻ thông tin liên hệ của bạn và bạn sẽ nhận được phản hồi trong vòng 2 tuần từ @MidwitMilhouse trên Telegram hoặc christian.montoya@consensys.net.", + "email_label": "Email", + "email_validation_error": "Vui lòng nhập địa chỉ email hợp lệ", + "telegram_label": "Tên người dùng Telegram", + "telegram_placeholder": "Không bắt buộc" + }, "accounts_opt_in_state_error": { "error_fetching_title": "Không thể tải tài khoản", "error_fetching_description": "Kiểm tra kết nối của bạn và thử lại.", @@ -7052,12 +7195,12 @@ "dashboard_modal_info": { "active_account": { "title": "Đừng bỏ lỡ cơ hội", - "description": "Thêm tài khoản để bắt đầu kiếm điểm từ hoạt động của bạn.", + "description": "Add your account to Rewards.", "confirm": "Thêm tài khoản" }, "multiple_unlinked_accounts": { - "title": "Bắt đầu kiếm điểm", - "description": "Thêm các tài khoản của bạn để có thể theo dõi phần thưởng dễ dàng hơn.", + "title": "Đừng bỏ lỡ cơ hội", + "description": "Add your accounts to Rewards.", "confirm": "Thêm tài khoản" }, "account_not_supported": { @@ -7110,10 +7253,10 @@ } }, "predict": { - "title": "Thị trường dự đoán", + "title": "Dự đoán", "description": "20 điểm cho mỗi dự đoán $10", "sheet": { - "title": "Thị trường dự đoán", + "title": "Dự đoán", "points": "20 điểm cho mỗi $10", "description": "Kiếm điểm với mỗi $10 bạn giao dịch.", "cta_label": "Duyệt tìm thị trường" @@ -7191,6 +7334,19 @@ "time_left": "còn lại", "expired": "Đã hết hạn" }, + "end_of_season_rewards": { + "confirm_label_default": "Xác nhận", + "confirm_label_access": "Truy cập", + "redeem_success_title": "Phần thưởng đã đổi", + "metal_card_claim_success": "Thông tin liên hệ đã được xác nhận", + "linea_tokens_claim_success": "Địa chỉ đã được xác nhận", + "arriving_soon": "Sắp ra mắt", + "check_back_soon": "Hãy sớm quay lại để nhận phần thưởng", + "redeem_failure_title": "Đổi không thành công", + "redeem_failure_description": "Vui lòng thử lại sau.", + "reward_details": "Chi tiết phần thưởng", + "select_account_description": "Chọn tài khoản mà bạn muốn nhận phần thưởng này. Token sẽ được phân phối trong vòng hai tuần." + }, "animation": { "could_not_load": "Không thể tải" } @@ -7257,13 +7413,13 @@ "still_connecting_network": "Vẫn đang kết nối với {{networkName}}...", "unable_to_connect_network": "Không thể kết nối với {{networkName}}.", "update_rpc": "Cập nhật RPC", + "switch_to_metamask_default_rpc": "Switch to MetaMask default RPC", "check_network_connectivity": "Kiểm tra kết nối mạng của bạn.", - "check_network_connectivity_or": "Kiểm tra kết nối mạng của bạn hoặc" + "check_network_connectivity_or": "Kiểm tra kết nối mạng của bạn hoặc", + "updated_to_metamask_default": "Updated to MetaMask default" }, "trending": { "title": "Explore", - "view_all": "View all", - "tokens": "Token", "trending_tokens": "Trending tokens", "price_change": "Price change", "all_networks": "Tất cả mạng", @@ -7295,6 +7451,10 @@ "title": "Trending tokens is not available", "description": "We can't fetch this page right now", "try_again": "Thử lại" + }, + "empty_search_result_state": { + "title": "Không tìm thấy token", + "description": "We were not able to find this token" } }, "ota_update_modal": { diff --git a/locales/languages/zh.json b/locales/languages/zh.json index 72379c79a0b9..8d6ff242c60f 100644 --- a/locales/languages/zh.json +++ b/locales/languages/zh.json @@ -8,7 +8,7 @@ "increment": "增量 Redux 计数器" }, "pet_name": { - "list_count_text": "Pet names on this network", + "list_count_text": "此网络上的宠物名称", "add_pet_name_button": "Add pet name", "address": "地址", "address_placeholder": "0x……", @@ -193,11 +193,10 @@ "connector": "于" }, "autocomplete": { - "placeholder": "按代币、网站或地址搜索", + "placeholder": "按网站或地址搜索", "recents": "最近", "favorites": "收藏", - "sites": "网站", - "tokens": "代币" + "sites": "网站" }, "navigation": { "back": "返回", @@ -306,7 +305,7 @@ "get_started": "开始使用" }, "onboarding_wizard": { - "skip_tutorial": "Skip tutorial", + "skip_tutorial": "跳过教程", "coachmark": { "action_back": "不,谢谢", "action_next": "进行导览", @@ -330,7 +329,7 @@ "content3": "长按以编辑账户名。" }, "step4": { - "title": "Main menu", + "title": "主选单", "content1": "您可以从此选单访问交易历史记录、设置和支持。", "content2": "您可以对账户执行更多操作及访问 MetaMask 设置。" }, @@ -596,9 +595,9 @@ "transaction_activity": "活动", "request_feature": "请求功能", "submit_feedback_message": "选择要发送的反馈类型。", - "submit_bug": "Bug report", + "submit_bug": "错误报告", "submit_general_feedback": "通用", - "share_address": "Share my public address", + "share_address": "共享我的公钥", "view_in_etherscan": "在 Etherscan 上查看", "view_in": "在以下位置查看:", "browser": "浏览器", @@ -612,12 +611,13 @@ "lock_cancel": "否", "feedback": "反馈", "metamask_support": "MetaMask 支持团队", - "public_address": "Public address" + "public_address": "公钥" }, "send": { "available": "可用", "invalid_value": "无效值", "insufficient_funds": "资金不足", + "insufficient_balance_to_cover_fee": "Insufficient balance to cover fees", "continue": "继续", "unit": "单位", "units": "单位", @@ -643,8 +643,8 @@ "no_tokens_available": "无可用代币", "sign": "签名", "network_not_found_title": "未找到网络", - "network_not_found_description": "在您的钱包中没有发现链 ID 为 {{chain_id}} 的网络。请先添加该网络。", - "network_missing_id": "缺少链 ID。", + "network_not_found_description": "Network with chain ID {{chain_id}} not found in your wallet. Please add the network first.", + "network_missing_id": "Missing chain ID.", "search_tokens": "搜索代币", "search_tokens_and_nfts": "搜索代币和 NFT", "tokens": "代币", @@ -680,8 +680,8 @@ "search_by_name_or_address": "按名称或地址搜索代币", "no_tokens_found": "没有符合“{{searchString}}”的代币", "unsupported_token_title": "不可用", - "unsupported_token_description": "This token may not be available in your region or supported by any local payment providers", - "error_loading_tokens": "Unable to load tokens. Please try again later." + "unsupported_token_description": "此代币可能在您所在的地区不可用,或不获任何当地支付服务商支持", + "error_loading_tokens": "无法加载代币。请稍后重试。" }, "networks_filter_bar": { "all_networks": "所有网络" @@ -696,12 +696,12 @@ "title": "设置", "view_order_history": "查看订单历史", "contact_support": "联系支持团队", - "log_out": "Log out of Transak", + "log_out": "登出 Transak", "logged_out_success": "成功退出登录", "error_sdk_not_initialized": "SDK 未初始化", "logged_out_error": "退出登录时出错", - "more_ways_to_buy": "More ways to buy", - "more_ways_to_buy_description": "Switch to the classic version" + "more_ways_to_buy": "更多购买方式", + "more_ways_to_buy_description": "切换到经典版本" }, "region_modal": { "select_a_region": "选择地区", @@ -714,7 +714,7 @@ "no_state_results": "没有符合 “{{searchString}}” 的州" }, "payment_modal": { - "select_a_payment_method": "Select a payment method" + "select_a_payment_method": "选择支付方式" }, "payment_duration": { "instant": "即时", @@ -805,7 +805,7 @@ "button": "同意并继续" }, "additional_verification": { - "title": "Additional verification", + "title": "额外验证", "paragraph_1": "对于大额存款,您需要提供有效的身份证件(如驾照)以及实时自拍。", "paragraph_2": "为完成身份验证,您需开启摄像头权限。", "button": "继续" @@ -832,7 +832,7 @@ "dob_invalid": "请输入有效出生日期", "ssn_required": "社会保障号码为必填项", "unexpected_error": "发生意外错误。请重试。", - "phone_already_registered": "This phone number is already in use by {{email}}. Log in using this email to continue.", + "phone_already_registered": "此电话号码已被 {{email}} 占用。请使用该电子邮箱登录以继续。", "login_with_email": "使用电子邮箱登录" }, "enter_address": { @@ -844,7 +844,7 @@ "address_line_2": "地址行 2(可选)", "state": "州/地区", "city": "城市", - "postal_code": "Postal/zip code", + "postal_code": "邮政编码", "country": "国家/地区", "select_state": "选择州", "address_line_1_required": "地址第 1 行为必填项", @@ -854,7 +854,7 @@ "city_invalid": "请输入有效城市", "state_required": "州/地区为必填项", "state_invalid": "请输入有效州", - "postal_code_required": "Postal/zip code is required", + "postal_code_required": "邮政编码为必填项", "postal_code_invalid": "请输入有效邮政编码", "unexpected_error": "意外错误。" }, @@ -903,7 +903,7 @@ "cancel_order_button": "取消订单" }, "order_details": { - "title": "Deposit order", + "title": "存款订单", "error_title": "您的存款订单出错了", "error_message": "发生意外错误。" }, @@ -955,12 +955,12 @@ "fetch_payment_methods": "获取支付方式时出现问题。", "fetch_user_details": "获取用户详情时出现问题。", "try_again": "请重试", - "error_details_title": "Error details", + "error_details_title": "错误详情", "see_more": "查看更多" } }, "perps": { - "basic_functionality_disabled_title": "Perps is not available", + "basic_functionality_disabled_title": "永续合约不可用", "title": "永续合约", "perps_trading": "永续合约交易", "perp_account_balance": "永续合约账户余额", @@ -974,6 +974,10 @@ "not_now": "暂时不", "try_now": "开始" }, + "discovery_banner": { + "title": "交易 {{symbol}} 永续合约", + "subtitle": "将您的盈亏放大至 {{leverage}} 倍" + }, "today": "今天", "yesterday": "昨天", "unrealized_pnl": "未实现盈亏", @@ -1138,7 +1142,7 @@ "trigger_price": "触发价格", "liquidation_price": "清算价格", "fees": "费用", - "estimated_points": "预估积分", + "estimated_points": "预计积分", "market": "市场型", "limit": "限制", "open_orders": "订单", @@ -1306,7 +1310,7 @@ "cancel": "取消", "margin": "保证金", "includes_pnl": "含盈亏", - "pnl": "盈亏", + "pnl": "损益", "estimated_pnl": "预计盈亏", "fees": "费用", "receive": "您将收到", @@ -1414,6 +1418,7 @@ "failedToEstablishAllMids": "建立全局 allMids 订阅失败", "failedToEstablishMarketData": "为 {{symbol}} 建立市场数据订阅失败", "failed_to_toggle_network": "切换网络失败", + "failed_to_switch_provider": "切换服务商失败", "noAccountSelected": "未选择账户", "unsupportedMethod": "不支持的方法:{{method}}", "invalidAddressFormat": "无效地址格式:{{address}}", @@ -1452,6 +1457,24 @@ "orderLeverageReductionFailed": "无法降低杠杆", "insufficientLiquidity": "流动性不足,无法执行订单。请尝试使用限价订单或稍后重试。", "connectionTimeout": "连接超时。请检查网络连接后重试。", + "clientReinitializing": "服务正在重新初始化。请稍等片刻,然后重试。", + "transferFailed": "无法转账。请重试。", + "swapFailed": "无法兑换代币。请重试。", + "spotPairNotFound": "该交易对暂时不可用。", + "priceUnavailable": "价格数据无法获取。请刷新后重试。", + "batchCancelFailed": "部分订单无法取消。请重试。", + "batchCloseFailed": "部分仓位无法平仓。请重试。", + "insufficientMargin": "保证金不足,无法执行此交易。请考虑追加资金或减少持仓规模。", + "reduceOnlyViolation": "此订单将增加您的持仓。仅允许减仓订单。", + "positionWouldFlip": "此订单将翻转您的仓位走向。请先平仓现有仓位。", + "marginAdjustmentFailed": "无法调整保证金。请重试。", + "tpslUpdateFailed": "无法更新止盈/止损。请重试。", + "orderRejected": "订单已被拒绝。请检查参数后重试。", + "slippageExceeded": "价格波动过大。请尝试使用限价订单或提高滑移容忍度。", + "rateLimitExceeded": "请求次数过多。请稍等片刻,然后重试。", + "serviceUnavailable": "服务暂时不可用。请稍后再试。", + "networkErrorSimple": "发生了网络错误。请检查您的连接后重试。", + "insufficientBalance": "余额不足,无法完成此操作。请检查您的可用资金。", "connectionFailed": { "title": "无法连接永续合约", "description": "我们正在努力让它尽快重新上线。", @@ -1684,7 +1707,7 @@ "after_hours_trading": { "title": "非交易时段交易", "reopens_in": "距开盘 {{time}}", - "content": "您当前处于非常规交易时段(美东时间上午 9:30 至下午 4 点)。休市期间可能面临买卖差价扩大、价格波动加剧及资金费率上升的风险。" + "content": "您当前处于非常规交易时段(常规时间为美东时间上午 9:30 至下午 4 点)。休市期间可能面临买卖差价扩大、价格波动加剧及资金费率上升的风险。" }, "spread": { "title": "买卖差价", @@ -1697,7 +1720,14 @@ "retry_connection": "重新尝试连接", "retrying_connection": "正在连接……", "connecting_to_perps": "正在连接到永续合约", - "timeout_title": "连接耗时超出预期" + "timeout_title": "连接耗时超出预期", + "websocket_disconnected": "您的连接已断开。", + "websocket_disconnected_message": "数据可能不是最新的。", + "websocket_connecting": "正在连接到永续合约……", + "websocket_connecting_message": "正在恢复连接……第{{attempt}}次尝试", + "websocket_connected": "已连接", + "websocket_connected_message": "实时数据更新已恢复", + "websocket_retry": "重试" }, "chart": { "no_data": "无可用图表数据", @@ -1746,7 +1776,7 @@ "markets": "市场" }, "learn_more": { - "title": "了解永续合约详情", + "title": "了解永续合约", "description": "探索如何交易永续合约与入门指南", "cta": "了解详情" }, @@ -1754,6 +1784,9 @@ "title": "联系支持团队", "description": "联系 MetaMask 支持团队获取帮助" }, + "feedback": { + "title": "向我们提供反馈" + }, "close_all_modal": { "title": "全部平仓", "description": "我们将按当前市价为您的所有未平仓仓位进行平仓。", @@ -1806,7 +1839,11 @@ "price_change_low_to_high": "价格变化:从低到高", "past_hour": "过去 1 小时", "past_24_hours": "过去 24 小时", - "time": "时间" + "time": "时间", + "apply": "应用" + }, + "market_type": { + "filter_by": "筛选方式" }, "perps_markets": "永续合约市场", "volume": "成交量", @@ -1823,6 +1860,7 @@ "mainnet": "主网", "developer_options": { "hyperliquid_network_toggle": "Hyperliquid 网络切换", + "provider_mode_toggle": "服务商模式", "simulate_connection_error": "模拟连接错误" }, "transactions": { @@ -1925,7 +1963,7 @@ } }, "points": "积分", - "estimated_points": "预估积分", + "estimated_points": "预计积分", "points_error": "当前无法加载积分", "points_error_content": "请放心,您的积分仍在累计。稍后将在账户中显示或可在奖励标签页查看。", "tp_on_chart": "图表显示止盈", @@ -1981,7 +2019,8 @@ "fee_exemption": "本市场不收取任何费用。", "ended": "已结束", "resolved_early": "已提前结算", - "disclaimer": "此信息可能不完整。所有市场规则、解决标准和最终结果均由 Polymarket 全权管辖。交易应基于 Polymarket 上提供的完整规则进行。" + "disclaimer": "此信息可能不完整。所有市场规则、解决标准和最终结果均由 Polymarket 全权管辖。交易应基于 Polymarket 上提供的完整规则进行。", + "your_picks": "您的选择" }, "tab": { "no_predictions_description": "您的预测将在此显示,包括您的持仓量与市场动态。", @@ -2001,6 +2040,8 @@ "cashout_info": "针对 {{outcome}},以 {{initialPrice}} 的价格下注 {{amount}}", "cashout_info_multiple": "针对 {{outcomeGroupTitle}} • {{outcome}},以 {{initialPrice}} 的价格下注 {{amount}}", "position_info": "针对 {{outcome}},下注 {{initialValue}} 以赢得 {{shares}}", + "position_pick_info": "针对 {{outcome}} 下注 {{initialValue}}", + "position_pick_info_to_win": "针对 {{outcome}},下注 {{initialValue}} 以赢得", "buy_yes": "是", "buy_no": "否", "outcomes": "结果", @@ -2035,6 +2076,7 @@ "won_markets_text": "已赢取 {{count}} 个市场{{s}}", "available_balance": "可用余额", "claim_amount_text": "领取 ${{amount}}", + "claim_winnings_text": "领取收益", "unrealized_pnl_label": "未实现盈亏", "unrealized_pnl_value": "{{amount}}({{percent}})", "unrealized_pnl_error": "无法加载", @@ -2173,6 +2215,15 @@ "order_not_fully_filled": "您的订单未能成交", "buy_order_not_fully_filled": "当前市价可用股票数量不足,无法立即执行您的订单。", "sell_order_not_fully_filled": "当前市价需求不足,无法立即变现。" + }, + "game_details_footer": { + "pick_a_winner": "选出赢家", + "volume_display": "${{volume}} 成交额", + "read_terms": "阅读完整的合约条款与条件" + }, + "sports": { + "halftime": "半场", + "final": "终场" } }, "receive": { @@ -2290,7 +2341,7 @@ "add_funds": "充值", "next": "下一步", "buy_asset": "买入 {{asset}}", - "no_tokens": "您没有任何代币!", + "no_tokens": "You don't have any tokens", "show_tokens_without_balance": "显示没有余额的代币", "nfts_autodetection_title": "NFT 检测", "nfts_autodetection_desc": "让 MetaMask 自动检测并显示您钱包中的 NFT。", @@ -2303,7 +2354,7 @@ "target_scam_network": "这使其成为欺诈目标。骗子可能会诱骗您将更有价值的货币转给他们作为回报。在继续之前请先验证所有信息。", "use_the_currency_symbol": "使用货币符号", "use_correct_symbol": "确保您使用正确的符号才能继续", - "chain_id_currently_used": "此链 ID 目前的使用者是", + "chain_id_currently_used": "This chain ID is currently used by the", "incorrect_network_name_warning": "根据我们的记录,该网络名称可能与此链 ID 不匹配。", "suggested_name": "建议名称:", "network_check_validation_desc": "减少您连接到恶意或错误网络的机会。", @@ -2314,7 +2365,7 @@ "nft_empty_description": "NFT 世界广阔无限,立即开启您的收藏之旅。", "tokens_empty_description": "Nothing to see yet. Why not browse tokens or make a trade?", "discover_nfts": "导入 NFT", - "no_transactions": "您没有交易!", + "no_transactions": "You have no transactions", "switch_network_to_view_transactions": "请切换网络以查看交易", "send_button": "发送", "deposit_button": "保证金", @@ -2362,6 +2413,7 @@ "network_fee": "网络费", "lists": "Token lists", "hide_cta": "隐藏代币", + "perps_trading": "永续合约交易", "options": { "title": "Token options", "view_on_portfolio": "在 Portfolio 上查看", @@ -2410,7 +2462,7 @@ }, "collectibles": { "cancel_add_collectible": "取消", - "add_collectible": "添加" + "add_collectible": "导入" }, "banners": { "search_desc": "{{network}}网络现在提供经过改进的代币检测。 ", @@ -2521,18 +2573,20 @@ "billion_abbreviation": "十亿", "trillion_abbreviation": "万亿", "million_abbreviation": "百万", + "thousand_abbreviation": "K", "token_details": "代币详情", "contract_address": "合约地址", "token_list": "代币列表", "market_details": "市场详情", "market_cap": "Market cap", "total_volume": "Total volume (24h)", - "volume_to_marketcap": "Volume / market cap", + "volume_to_marketcap": "Volume / Market cap", "circulating_supply": "循环供应", "all_time_high": "有史以来新高", "all_time_low": "有史以来新低", "fully_diluted": "已充分稀释", - "unknown": "未知" + "unknown": "未知", + "stock": "Stock" }, "collectible": { "collectible_address": "地址", @@ -2583,7 +2637,7 @@ "remove_snap_account": "去除 Snap 账户", "remove_snap_account_alert_description": "此账户将从您的钱包中去除。在继续之前,请确保您拥有此导入账户的原始私钥助记词或私钥。您可以从账户下拉列表中再次导入或创建账户。", "remove_account_alert_remove_btn": "去除", - "remove_account_alert_cancel_btn": "没关系", + "remove_account_alert_cancel_btn": "Never mind", "accounts_title": "账户", "connect_account_title": "连接账户", "connect_accounts_title": "连接账户", @@ -2620,7 +2674,7 @@ "advisory_by": "建议由以太坊网络钓鱼探测器和PhishFort提供", "potential_threat": "潜在威胁包括", "fake_metamask": "MetaMask的伪造版本", - "srp_theft": "私钥助记词或密码被盗", + "srp_theft": "Secret Recovery Phrase or password theft", "malicious_transactions": "导致资产被盗的恶意交易", "secret_recovery_phrase": "私钥助记词,", "account_name": "账户名称", @@ -2675,8 +2729,8 @@ }, "connect_qr_hardware": { "title": "连接基于二维码的硬件钱包", - "description1": "连接通过二维码通信的物理隔离(网闸)硬件钱包。", - "description2": "如何运行?", + "description1": "Connect an airgapped hardware wallet that communicates through QR codes.", + "description2": "如何运行", "description3": "官方支持的物理隔离(网闸)硬件钱包包括:", "keystone": "Keystone", "ngravezero": "Ngrave Zero", @@ -2693,7 +2747,7 @@ "select_accounts": "选择一个账户" }, "data_collection_modal": { - "accept": "好的", + "accept": "OK", "content": "您关闭了我们用于营销目的的数据收集。 这仅适用于此设备。如果您在其他设备上使用 MetaMask,请务必也在其他设备上选择退出。" }, "account_selector": { @@ -2717,14 +2771,14 @@ "select_rpc_url": "选择 RPC(远程过程调用)URL", "title": "设置", "current_conversion": "基础货币", - "current_language": "Current language", - "ipfs_gateway": "IPFS 网关", + "current_language": "当前语言", + "ipfs_gateway": "在", "ipfs_gateway_content": "MetaMask使用第三方服务来显示存储在IPFS的NFT图像、显示与在浏览器地址栏中输入的ENS地址相关的信息,并获取不同代币的图标。当您使用这些服务时,您的IP地址可能会被其获悉。", "ipfs_gateway_down": "您当前的 IPFS 网关发生故障", "ipfs_gateway_desc": "选择您的首选 IPFS 网关。", - "search_engine": "Search engine", + "search_engine": "搜索引擎", "new_RPC_URL": "新 RPC 网络", - "state_logs": "State logs", + "state_logs": "状态记录", "add_network_title": "添加网络", "auto_lock": "自动锁定", "auto_lock_desc": "选择应用程序自动锁定之前空闲的时间。", @@ -2733,15 +2787,15 @@ "autolock_never": "永不", "autolock_after": "{{time}} 秒后", "autolock_after_minutes": "{{time}} 分钟后", - "reveal_seed_words": "Reveal seed words", - "reset_account": "Reset account", - "state_logs_button": "Download state logs", + "reveal_seed_words": "显示助记词", + "reset_account": "重设账户", + "state_logs_button": "下载状态记录", "reveal_seed_words_button": "显示助记词", - "reset_account_button": "Reset account", + "reset_account_button": "重设账户", "reset_account_confirm_button": "是,重置", "reset_account_cancel_button": "取消", - "reset_account_modal_title": "Reset account?", - "clear_approvals_modal_title": "Clear approval data?", + "reset_account_modal_title": "重设账户?", + "clear_approvals_modal_title": "清除批准数据?", "clear_approvals_modal_message": "所有去中心化应用都将需要再次请求查看账户信息的访问权限。", "clear_browser_history_modal_title": "是否清除浏览器历史记录?", "clear_browser_history_modal_message": "我们即将删除您的所有浏览器历史记录。您确定吗?", @@ -2763,7 +2817,7 @@ "protect_title": "钱包恢复", "banner_social_login_enabled": "使用 {{authConnection}} 登录", "manage_recovery_method": "管理恢复方式", - "video_failed": "Video failed to load.", + "video_failed": "视频加载失败。", "protect_desc": "备份您的私钥助记词,这可确保您永远不会失去对钱包的访问权限。请务必将其存放在一个只有您能访问且不会忘记的安全位置", "protect_desc_no_backup": "这是您钱包的12单词助记词。此助记词可以用来控制您当前和未来的所有账户,包括发送您钱包中资金的能力。请确保安全存储此助记词,不要与任何人分享。MetaMask 不能帮助您恢复这个密钥。", "learn_more": "了解更多。", @@ -2782,9 +2836,9 @@ "show_fiat_on_testnets_desc": "选择此项以在测试网络上显示法币兑换.", "show_fiat_on_testnets_modal_title": "请小心", "show_fiat_on_testnets_modal_description": "如果要求您开启此功能,则您可能会被骗。这些代币没有货币价值,仅用于测试目的。此功能可协助开发者确保应用程序正常工作。", - "show_fiat_on_testnets_modal_learn_more": "了解更多。", + "show_fiat_on_testnets_modal_learn_more": "了解详情", "show_fiat_on_testnets_modal_button": "继续", - "show_hex_data": "Show hex data", + "show_hex_data": "显示十六进制数据", "show_hex_data_desc": "选择此项可在发送屏幕上显示十六进制数据字段。", "accounts_identicon_title": "账户图标", "accounts_identicon_desc": "从三种不同风格的独特图标中选择,助您轻松实现账户清晰显示。", @@ -2793,7 +2847,7 @@ "general_title": "通用", "general_desc": "货币转换、主要货币、语言和搜索引擎.", "advanced_title": "高级", - "advanced_desc": "访问开发者功能、重置账户、设置测试网、状态日志、IPFS 网关和自定义 RPC.", + "advanced_desc": "访问开发者功能、重设账户、设置测试网、查看状态记录、配置 IPFS 网关和自定义 RPC。", "notifications_title": "通知", "notifications_desc": "管理您的通知", "allow_notifications": "允许通知", @@ -2804,9 +2858,9 @@ "customize_session_desc": "开启您想要接收的通知类型:", "account_session_title": "账户活动", "account_session_desc": "选择您想要接收通知的账户:", - "assets_sent_title": "Assets sent", + "assets_sent_title": "已发送资产", "assets_sent_desc": "资金和 NFT", - "assets_received_title": "Assets received", + "assets_received_title": "已接收资产", "assets_received_desc": "资金和 NFT", "defi_title": "去中心化金融", "defi_desc": "质押、兑换和跨链桥", @@ -2826,14 +2880,14 @@ "back": "返回", "security_desc": "隐私设置、MetaMetrics、私钥和私钥助记词。", "networks_title": "网络", - "networks_default_title": "Default network", + "networks_default_title": "默认网络", "network_delete": "如果您删除此网络,则需要再次添加此网络才能查看您在其中的资产", "networks_default_cta": "使用此网络", "add_rpc_url": "添加 RPC(远程过程调用)URL", "add_block_explorer_url": "添加区块浏览器 URL", "networks_desc": "添加并编辑自定义 RPC 网络", - "network_name_label": "Network name", - "network_name_placeholder": "Network name (optional)", + "network_name_label": "网络名称", + "network_name_placeholder": "网络名称(可选)", "network_rpc_url_label": "RPC(远程过程调用)URL", "network_rpc_name_label": "RPC(远程过程调用)名称", "network_rpc_placeholder": "新 RPC 网络", @@ -2845,9 +2899,9 @@ "network_block_explorer_label": "区块浏览器 URL", "network_block_explorer_placeholder": "区块浏览器 URL(可选)", "network_chain_id_warning": "链 ID 无效", - "network_other_networks": "Other networks", + "network_other_networks": "其他网络", "network_rpc_networks": "RPC 网络", - "network_add_network": "Add network", + "network_add_network": "添加网络", "network_add_custom_network": "添加自定义网络", "network_add": "添加", "network_save": "保存", @@ -2858,11 +2912,11 @@ "info_title_beta": "关于 MetaMask Beta", "info_title_flask": "关于 MetaMask Flask", "experimental_title": "实验性", - "experimental_desc": "WalletConnect 及更多...", + "experimental_desc": "WalletConnect 及更多……", "legal_title": "法律", "conversion_title": "货币转换", "conversion_desc": "在整个应用程序中使用特定货币显示法币价值。", - "primary_currency_title": "Primary currency", + "primary_currency_title": "主要货币", "primary_currency_desc": "选择“原生”可优先以链的原生货币(如 ETH)显示值。选择“法币”可优先以您选定的法币显示值。", "primary_currency_text_first": "原生", "primary_currency_text_second": "法币", @@ -2899,11 +2953,11 @@ "invalid_number": "无效数字。输入一个十进制或带有“0x”前缀的十六进制数字。", "invalid_number_leading_zeros": "无效数字。删除所有前导零。", "invalid_number_range": "无效数字。输入1至%{maxSafeChainId}之间的数字", - "hide_zero_balance_tokens_title": "Hide tokens without balance", + "hide_zero_balance_tokens_title": "隐藏没有余额的代币", "hide_zero_balance_tokens_desc": "防止没有余额的代币显示在您的代币列表中。", "token_detection_title": "自动检测代币", "token_detection_description": "我们使用第三方 API 来检测和显示发送到您钱包的新代币。如果您不希望该应用程序从这些服务中获取数据,请关闭。", - "theme_button_text": "Change theme", + "theme_button_text": "更改主题", "theme_title": "主题({{theme}})", "theme_description": "通过设置主题更改应用程序外观。", "theme_os": "系统", @@ -2935,20 +2989,20 @@ "delete_metrics_description_after_delete_part_two": "。此过程可能需要长达 30 天的时间。查看我们的", "delete_metrics_description_privacy_policy": "隐私政策。", "delete_metrics_button": "删除MetaMetrics数据", - "check_status_button": "Check status", + "check_status_button": "检查状态", "delete_metrics_confirm_modal_title": "删除MetaMetrics数据?", "delete_metrics_confirm_modal_description": "我们即将删除您所有的MetaMetrics数据。您确定吗?", "delete_wallet_data_title": "重设钱包", "delete_wallet_data_description": "这将会刪除您的设备中所有与钱包关联的数据。您的账户存在于区块链上,与 MetaMask无关。您可以随时使用您的私钥助记词来恢复您的账户。", "delete_wallet_data_button": "重设钱包", - "delete_data_status_title": "Deletion task status", + "delete_data_status_title": "删除任务状态", "delete_data_status_description": "当前状态为", "delete_metrics_error_title": "我们现在无法删除此数据。", "delete_metrics_error_description": "由于分析系统服务器问题,现在无法完成此请求,请稍后再试。", "ok": "OK", - "clear_sdk_connections_title": "清除所有MetaMask SDK连接", + "clear_sdk_connections_title": "清除所有 MetaMask SDK 连接", "clear_sdk_connections_text": "将会清除所有连接,dapps需要再次请求连接", - "sdk_connections": "MetaMask SDK连接", + "sdk_connections": "MetaMask SDK 连接", "manage_sdk_connections_title": "管理连接", "manage_sdk_connections_text": "删除与网站和/或MetaMask SDK的连接。", "fiat_on_ramp": { @@ -2956,6 +3010,7 @@ "description": "地区及其他......", "current_region": "当前地区", "reset_region": "重设地区", + "change_region": "更改地区", "no_region_selected": "未选择地区", "sdk_activation_keys": "SDK 激活密钥", "activation_keys_description": "激活密钥将启用特定功能或提供商。", @@ -3006,13 +3061,13 @@ }, "snap_details": { "install_date": "于{{date}}安装", - "install_origin": "Install origin", + "install_origin": "安装源", "enabled": "已启用", "version": "版本" }, "keyring_account_list_item": { "account_name": "账户名称", - "public_address": "Public address" + "public_address": "公钥" }, "snap_permissions": { "approved_date": "于{{date}}批准", @@ -3063,28 +3118,28 @@ "blockaid_desc": "此功能通过主动审查交易和签名请求向您发出恶意活动提醒。", "security_alerts": "安全警报", "security_alerts_desc": "此功能通过本地审查您的交易和签名请求来提醒您注意恶意活动。在批准任何请求之前,请务必自行进行审慎调查。无法保证此功能能够检测到所有恶意活动。启用此功能即表示您同意提供商的使用条款。", - "dismiss_smart_account_update_heading": "关闭“切换至智能账户”建议", + "dismiss_smart_account_update_heading": "关闭“切换到智能账户”建议", "dismiss_smart_account_update_desc": "启用此选项后,所有账户将不再显示“切换到智能账户”建议。智能账户可实现更快的交易、更低的网络费用,并为这些账户提供更灵活的支付方式。", "use_smart_account_heading": "使用智能账户", "use_smart_account_desc": "保持此设置开启,以便在相关功能(如更快的交易速度、更低的网络费用以及灵活支付)可用时,自动将 MetaMask 内创建的账户切换为智能账户。", - "use_smart_account_learn_more": "了解更多。", + "use_smart_account_learn_more": "了解详情", "smart_transactions_opt_in_heading": "智能交易", "smart_transactions_opt_in_desc_supported_networks": "开启智能交易,以便在支持网络上实现更加安全可靠的交易。", - "smart_transactions_learn_more": "了解更多。", + "smart_transactions_learn_more": "了解详情", "simulation_details": "预计余额变化", "simulation_details_description": "开启此选项,以便在确认交易之前估计交易余额的变化。这并不能保证交易的最终结果。 ", "simulation_details_learn_more": "了解更多。", - "aes_crypto_test_form_title": "AES crypto - test form", + "aes_crypto_test_form_title": "AES 加密 - 测试表", "aes_crypto_test_form_description": "专为 E2E 测试开发的部分。如果这在您的应用程序中可见,请向 MetaMask 支持团队报告。", "developer_options": { - "title": "Developer options", - "generate_trace_test": "Generate trace test", - "generate_trace_test_desc": "Generate a developer test Sentry trace.", - "navigate_to_sample_feature": "Navigate to sample feature", + "title": "开发者选项", + "generate_trace_test": "生成跟踪测试", + "generate_trace_test_desc": "生成开发者测试 Sentry 追踪。", + "navigate_to_sample_feature": "前往示例功能", "sample_feature_desc": "为开发者提供的示例功能模板。" }, "feature_flag_override": { - "title": "Feature flag override", + "title": "功能开关覆盖", "description": "本地覆盖应用程序的功能标签。" } }, @@ -3137,7 +3192,7 @@ "sdk_feedback_modal": { "ok": "OK", "title": "账户无法连接", - "info": "请扫描dApp上的二维码以重新连接到MetaMask" + "info": "Please scan the QR code on the site to reconnect to MetaMask" }, "app_information": { "title": "信息", @@ -3145,8 +3200,8 @@ "privacy_policy": "隐私政策", "terms_of_use": "使用条款", "attributions": "参与者", - "support_center": "Visit our support center", - "web_site": "访问我们的网站", + "support_center": "访问我们的支持中心", + "web_site": "Visit our website", "contact_us": "Contact us" }, "reveal_credential": { @@ -3216,7 +3271,7 @@ "password_reset": { "password_title": "密码", "password_desc": "选择一个强密码来解锁您设备上的 MetaMask 应用。如果丢失密码,您将需要私钥助记词来重新导入钱包。", - "password_learn_more": "了解更多。", + "password_learn_more": "了解详情", "change_password": "更改密码", "password_hint": "密码提示" }, @@ -3246,19 +3301,28 @@ "swap": "兑换", "bridge": "桥接", "earn": "赚取", - "convert_to_musd": "Convert to mUSD", + "convert_to_musd": "兑换为 mUSD", + "merkl_rewards": { + "annual_bonus": "{{apy}}% 奖励", + "claimable_bonus": "可领取奖励", + "claimable_bonus_tooltip_description": "mUSD bonuses are claimed on Linea.", + "terms_apply": "Terms apply.", + "ok": "确定", + "claim": "领取", + "processing_claim": "Processing claim..." + }, "tron": { - "daily_resource_new_energy": "New daily energy", - "sufficient_to_cover": "Sufficient to cover", + "daily_resource_new_energy": "每日新能量", + "sufficient_to_cover": "足以覆盖", "transactions": "交易", "daily_resource": "每日资源", "bandwidth": "带宽", "energy": "能量", - "daily_resource_description": "This is your daily allowance based on your staked TRX. Hold TRX to get 600 bandwidth daily.", - "sufficient_to_cover_trx_transfers": "Covers ~{{amount}} TRX transfers", - "sufficient_to_cover_trx_transfer": "Covers 1 TRX transfer", - "sufficient_to_cover_usdt_transfers": "Covers ~{{amount}} USDT transfers", - "sufficient_to_cover_usdt_transfer": "Covers 1 USDT transfer" + "daily_resource_description": "这是基于您的质押 TRX 获得的每日配额。持有 TRX 每日可获取 600 带宽。", + "sufficient_to_cover_trx_transfers": "覆盖约 {{amount}} 笔 TRX 转账", + "sufficient_to_cover_trx_transfer": "覆盖 1 笔 TRX 转账", + "sufficient_to_cover_usdt_transfers": "覆盖约 {{amount}} 笔 USDT 转账", + "sufficient_to_cover_usdt_transfer": "覆盖 1 笔 USDT 转账" }, "disabled_button": { "buy": "此账户不支持买入", @@ -3311,9 +3375,11 @@ }, "no_chart_data": { "title": "无图表数据", - "description": "我们无法获取此代币的任何数据" + "description": "我们无法获取此代币的任何数据", + "insufficient_data": "Data is not available for this time period" }, "your_balance": "您的余额", + "perps_position": "永续合约仓位", "unable_to_load_balance": "无法载入您的余额", "about": "关于", "about_content_display": { @@ -3363,7 +3429,7 @@ "address_copied_to_clipboard": "代币地址已复制到剪贴板" }, "qr_scanner": { - "invalid_qr_code_title": "无效的二维码", + "invalid_qr_code_title": "Invalid QR code", "invalid_qr_code_message": "您尝试扫描的二维码无效。", "allow_camera_dialog_title": "允许访问摄像头", "allow_camera_dialog_message": "我们需要您的许可才能扫描二维码", @@ -3376,14 +3442,14 @@ "attempting_sync_from_wallet_error": "好像您正尝试与扩展程序同步。要进行同步,请转至“设置”>“高级”>“与 MetaMask 扩展程序同步”", "not_allowed_error_title": "开启摄像头访问功能", "not_allowed_error_desc": "要扫描二维码,您需要从设备的设置菜单中授予 MetaMask 摄像头访问权限。", - "unrecognized_address_qr_code_title": "二维码无法识别", + "unrecognized_address_qr_code_title": "Unrecognized QR code", "unrecognized_address_qr_code_desc": "对不起,此二维码没有关联的账户地址或合约地址。", "url_redirection_alert_title": "您即将访问外部链接", "url_redirection_alert_desc": "链接可能会被用于诈骗或网络钓鱼,因此请确保您只访问您信任的网站。", "label": "扫描二维码", "open_settings": "设置", "camera_not_available": "摄像头不可用", - "tron_address_not_supported": "Tron addresses are not currently supported" + "tron_address_not_supported": "目前暂不支持 Tron 地址" }, "action_view": { "cancel": "取消", @@ -3471,10 +3537,10 @@ "cancel_tx_message": "提交此尝试不保证您的初始交易能被成功取消。如果取消成功,将向您收取上述交易费。", "speedup_tx_title": "尝试加速?", "speedup_tx_message": "提交此尝试不能保证将会加速您的初始交易。如果加速尝试成功,将向您收取以上交易费。", - "nevermind": "没关系", + "nevermind": "Never mind", "edit_network_fee": "编辑网络费", "edit_priority": "编辑优先级", - "gas_cancel_fee": "燃料取消费", + "gas_cancel_fee": "Gas cancellation fee", "gas_speedup_fee": "燃料加速费", "use_max": "使用最大值", "set_gas": "设置", @@ -3602,7 +3668,7 @@ "reload": "重新加载", "share": "共享", "bookmark": "书签", - "add_to_favorites": "添加到收藏夹", + "add_to_favorites": "Add to favorites", "error": "错误", "cancel": "取消", "go_back": "返回", @@ -3610,7 +3676,7 @@ "home": "主页", "close": "关闭", "open_in_browser": "在浏览器中打开", - "change_url": "更改 URL", + "change_url": "Change URL", "switch_network": "切换网络", "dapp_browser": "去中心化应用浏览器", "dapp_browser_message": "MetaMask 是您的钱包和去中心化网络浏览器。随便看看!", @@ -3676,30 +3742,30 @@ "tx_review_increase_allowance": "Increase allowance", "tx_review_set_approval_for_all": "Set approval for all", "tx_review_staking_claim": "Staking claim", - "tx_review_staking_deposit": "Staking deposit", + "tx_review_staking_deposit": "质押存款", "tx_review_staking_unstake": "解除质押", - "tx_review_lending_deposit": "Lending deposit", + "tx_review_lending_deposit": "出借存款", "tx_review_lending_withdraw": "Lending withdrawal", "tx_review_perps_deposit": "已注资的永续合约", "tx_review_predict_deposit": "带资金押注的预测", "tx_review_predict_claim": "已领取的获胜投注", "tx_review_predict_withdraw": "预测提现", - "tx_review_musd_conversion": "mUSD Conversion", - "sent_ether": "已发送以太币", - "self_sent_ether": "Sent yourself Ether", - "received_ether": "已接收以太币", + "tx_review_musd_conversion": "mUSD 兑换", + "sent_ether": "Sent ETH", + "self_sent_ether": "Sent yourself ETH", + "received_ether": "Received ETH", "sent_dai": "已发送 DAI", "self_sent_dai": "已向自己发送 DAI", "received_dai": "已接收 DAI", "sent_tokens": "Sent tokens", "received_tokens": "Received tokens", - "ether": "以太币", + "ether": "ETH", "sent_unit": "已发送 {{unit}} 个", "self_sent_unit": "Sent yourself {{unit}}", "received_unit": "已接收 {{unit}} 个", "sent_collectible": "Sent collectible", "received_collectible": "Received collectible", - "send_ether": "Send Ether", + "send_ether": "Send ETH", "send_unit": "Send {{unit}}", "send_collectible": "Send collectible", "receive_collectible": "Receive collectible", @@ -3732,9 +3798,9 @@ }, "gas_used": "Gas used (units)", "gas_limit": "Gas limit (units)", - "gas_price": "燃料价格 (GWEI)", - "base_fee": "基础费用(GWEI)", - "priority_fee": "优先费用(GWEI)", + "gas_price": "Gas price (GWEI)", + "base_fee": "Base fee (GWEI)", + "priority_fee": "Priority fee (GWEI)", "multichain_priority_fee": "优先费用", "max_fee": "Max fee per gas", "total": "总计", @@ -3767,7 +3833,7 @@ "confirm_gas_fee_token_tooltip": "此项费用需支付给网络以处理您的交易。其中包含 {{metamaskFeeFiat}} MetaMask 费用(适用于非 ETH 代币或预存 ETH 的情况)。", "paid_by_metamask": "由 MetaMask 支付", "confirm_gas_fee_token_metamask_fee": "包含 {{metamaskFeeFiat}} 费用", - "smart_account_upgrade": "升级至智能账户", + "smart_account_upgrade": "切换到智能账户", "smart_account_downgrade": "切换到标准账户", "batched_transactions": "批量交易", "gas_modal": { @@ -4004,8 +4070,8 @@ "biometrics": { "enable_touchid": "使用 Touch ID 登录?", "enable_faceid": "使用 Face ID 登录?", - "enable_fingerprint": "使用指纹登录?", - "enable_biometrics": "使用生物特征登录?", + "enable_fingerprint": "Unlock with fingerprint?", + "enable_biometrics": "Unlock with biometrics?", "enable_device_passcode_ios": "使用设备密码登录?", "enable_device_passcode_android": "使用设备 PIN 登录?" }, @@ -4020,18 +4086,18 @@ "title": "连接请求", "walletconnect_title": "WalletConnect 请求", "action": "连接此站点?", - "action_reconnect": "要恢复连接,请选择您在dApp上看到的号码", - "action_reconnect_deeplink": "是否要重新连接到此dApp?", + "action_reconnect": "To resume connection, choose the number you see on the site", + "action_reconnect_deeplink": "Do you want to reconnect to this site?", "connect": "连接", "resume": "恢复", "cancel": "取消", - "donot_rememberme": "不要记住此dApp连接", + "donot_rememberme": "Do not remember this site connection", "disconnect": "断开连接", "permission": "查看您的", "address": "公钥", "sign_messages": "代表您自己", "on_your_behalf": "签署消息", - "warning": "单击“连接”即表示您允许此去中心化应用查看您的公钥。这是保护您的数据防范网络钓鱼风险的重要安全步骤。" + "warning": "By clicking connect, you allow this site to view your public address. This is an important security step to protect your data from potential phishing risks." }, "import_private_key": { "title": "导入账户", @@ -4047,7 +4113,7 @@ "error_title": "出错了......", "error_message": "我们无法导入该私钥。请确保输入正确。", "error_empty_message": "您需要输入您的私钥。", - "or_scan_a_qr_code": "或扫描二维码" + "or_scan_a_qr_code": "or scan a QR code" }, "import_private_key_success": { "title": "账户导入成功!", @@ -4064,12 +4130,12 @@ "paste": "粘贴", "clear": "全部清除", "srp_number_of_words_option_title": "单词数量", - "12_word_option": "我有12个单词组成的助记词", - "24_word_option": "我有24个单词组成的助记词", + "12_word_option": "I have a 12-word phrase", + "24_word_option": "I have a 24-word phrase", "error_title": "出错了......", "error_message": "We couldn't import that Secret Recovery Phrase. Please make sure you entered it correctly.", "error_empty_message": "You need to enter your Secret Recovery Phrase.", - "error_number_of_words_error_message": "私钥助记词包含 12 或 24 个单词", + "error_number_of_words_error_message": "Secret Recovery Phrases contain 12 or 24 words", "error_srp_is_case_sensitive": "输入无效!私钥助记词需区分大小写。", "error_srp_word_error_1": "单词 ", "error_srp_word_error_2": " 不正确或拼写错误。", @@ -4079,7 +4145,7 @@ "error_invalid_srp": "私钥助记词无效", "error_duplicate_srp": "此私钥助记词已导入。", "error_duplicate_account": "The account you are trying to import is a duplicate.", - "invalid_qr_code_title": "无效二维码", + "invalid_qr_code_title": "Invalid QR code", "invalid_qr_code_message": "The QR code does not contain a valid Secret Recovery Phrase", "success_1": "钱包", "success_2": "已导入" @@ -4151,7 +4217,7 @@ "why_secure_2": " 如果您被应用锁定或换新设备,这是找回钱包的唯一途径。" }, "account_backup_step_2": { - "cancel_backup_title": "Cancel backup", + "cancel_backup_title": "取消备份", "cancel_backup_message": "我们强烈建议您保存私钥助记词,以便恢复钱包。", "cancel_backup_ok": "是,我将承受风险", "cancel_backup_no": "不,备份私钥助记词", @@ -4163,7 +4229,7 @@ "cta_text": "确定" }, "account_backup_step_3": { - "cancel_backup_title": "Cancel backup", + "cancel_backup_title": "取消备份", "cancel_backup_message": "我们强烈建议您保存私钥助记词,以便恢复钱包。", "cancel_backup_ok": "是,我将承受风险", "cancel_backup_no": "不,备份私钥助记词", @@ -4172,7 +4238,7 @@ "cta_text": "没有人看我" }, "account_backup_step_4": { - "cancel_backup_title": "Cancel backup", + "cancel_backup_title": "取消备份", "cancel_backup_message": "我们强烈建议您保存私钥助记词,以便恢复钱包。", "cancel_backup_ok": "是,我将承受风险", "cancel_backup_no": "不,备份私钥助记词", @@ -4197,16 +4263,16 @@ "modal_button": "下一步" }, "account_backup_step_6": { - "title": "Security tips", + "title": "安全提示", "info_text": "如果您丢失私钥助记词,MetaMask 无法找回", "tip_1": "为私钥助记词保留多个备份", "tip_2": "在信任的密码管理器中保存助记词,并在安全的地方存放纸质备份", "tip_3": "切勿将此助记词告诉他人", "disclaimer": "* 您可以在以下位置找到私钥助记词: ", - "disclaimer_bold": "“设置”>“安全和隐私”", - "cta_text": "知道了!", + "disclaimer_bold": "“设置 > 安全和隐私”中", + "cta_text": "知道了", "modal_title": "恭喜!", - "modal_text": "您已完全备份,整装待发!", + "modal_text": "您已备份完毕,随时可以开始。", "modal_button": "完成", "copy_seed_phrase": "将私钥助记词复制到剪贴板" }, @@ -4238,7 +4304,7 @@ "steps": "第 {{currentStep}} 步(共 {{totalSteps}} 步)", "action": "确认您的私钥助记词", "info": "按正确顺序选择缺失的单词。", - "complete": "Complete backup", + "complete": "完成备份", "success": "成功", "error-title": "不完全正确", "error-description": "请仔细检查您的私钥助记词,然后重试。", @@ -4300,7 +4366,7 @@ "withdrawal_completed": "提取已完成", "unstake_completed": "取消质押已完成", "withdrawal_requested": "已请求提取", - "stake_ready_to_be_withdrawn": "已准备好提取质押", + "stake_ready_to_be_withdrawn": "可供提取的质押", "swap_completed": "已用 {{from}} 兑换 {{to}}", "swap": "已兑换", "sent": "已发送至 {{address}}", @@ -4417,7 +4483,7 @@ "metamask_swap_completed_title": "兑换已完成", "metamask_swap_completed_description": "您的 MetaMask 兑换已成功", "nft_sent_title": "NFT 已发送", - "nft_sent_description": "您已成功发送一个 NFT", + "nft_sent_description": "You successfully sent an NFT", "nft_received_title": "NFT 已收到", "nft_received_description": "您已收到新的 NFT", "rocketpool_stake_completed_title": "质押完成", @@ -4519,7 +4585,7 @@ "copy_to_clipboard": "复制到剪贴板", "qr_code": "二维码", "send_link": "Send link", - "request_qr_code": "付款请求二维码", + "request_qr_code": "Payment request QR code", "balance": "余额" }, "receive_request": { @@ -4561,12 +4627,12 @@ "close_current_session": "在开始新会话之前,请先关闭当前会话。" }, "paymentRequest": { - "title": "付款请求", - "title_complete": "付款完成", - "confirm": "支付", - "cancel": "拒绝", + "title": "Payment request", + "title_complete": "Payment complete", + "confirm": "Pay", + "cancel": "Decline", "is_requesting_you_to_pay": "请求您付款", - "total": "总计:" + "total": "总额:" }, "webview_error": { "title": "出错了", @@ -4589,6 +4655,10 @@ "fiat_on_ramp": { "buy_eth": "购买 ETH", "buy": "购买 {{ticker}}", + "on_network": "在 {{networkName}} 上", + "debit_card": "借记卡", + "continue": "继续", + "powered_by_provider": "由 {{provider}} 提供技术支持", "purchased_currency": "已购买 {{currency}}", "network_not_supported": "不支持当前网络", "switch_network": "请切换为主网", @@ -4609,7 +4679,7 @@ "second_line": "购买?" }, "buy_ticker": "购买 {{ticker}}", - "buy_ticker_stablecoins": "购买 {{ticker}}和稳定币", + "buy_ticker_stablecoins": "购买 {{ticker}} 和稳定币", "multiple_payment_methods": "多种支付方式", "debit_credit_bank_transfers_country": "借记/贷记和银行转账(取决于国家/地区)。", "debit_credit_bank_transfers_more_country": "借记/贷记和银行转账等(取决于国家/地区)。", @@ -4676,6 +4746,14 @@ "subtitle_5": "并看看燃料成本是多少。", "cta": "继续购买{{ticker}}" } + }, + "build_quote_settings_modal": { + "title": "设置", + "view_order_history": "查看订单历史", + "contact_support": "联系支持团队", + "log_out": "退出 {{provider}}", + "logged_out_success": "成功退出登录", + "logged_out_error": "退出登录时出错" } }, "fiat_on_ramp_aggregator": { @@ -4822,6 +4900,7 @@ "title": "选择您所在的地区", "description": "您可以使用的支付方式和代币取决于我们的第三方集成,并可能因您所在的地区和我们的集成提供的支持而不同。", "sell_description": "现金目的地选项和代币可能因地区而异。", + "region_variation_notice": "支付方式及可用代币可能因您所在地区及我方供应商而有所差异。", "search_by_country": "按国家/地区搜索", "search_by_state": "按州搜索", "no_region_results": "没有与地区匹配的结果", @@ -4883,11 +4962,11 @@ "sent": "已发送!" }, "notifications": { - "purchase_failed_title": "购买 {{currency}} 失败!请重试,抱歉给您带来不便!", + "purchase_failed_title": "购买 {{currency}} 失败。请稍后重试。", "purchase_failed_description": "验证您的支付方式和卡支持", "purchase_cancelled_title": "您的购买已取消", "purchase_cancelled_description": "验证您的支付方式和卡支持", - "purchase_completed_title": "您已成功购买 {{amount}} {{currency}}!", + "purchase_completed_title": "您已成功购买 {{amount}} {{currency}}。", "purchase_completed_description": "您的 {{currency}} 现在可用", "purchase_pending_title": "正在处理您的 {{currency}} 购买", "purchase_pending_description": "整个过程通常只有几分钟时间...", @@ -4896,7 +4975,7 @@ "sale_cancelled_title": "订单已取消", "sale_cancelled_description": "您的订单无法完成。", "sale_completed_title": "订单已完成", - "sale_completed_description": "您的订单已成功!", + "sale_completed_description": "您的订单已成交。", "sale_pending_title": "正在处理{{currency}}的卖出", "sale_pending_description": "您的订单正在处理中。", "no_date": "未知" @@ -4921,7 +5000,7 @@ "start_swapping": "开始兑换" }, "feature_off_title": "暂时无法使用", - "feature_off_body": "MetaMask Swaps 正在进行维护。请稍后再查看。", + "feature_off_body": "MetaMask Swaps are undergoing maintenance. Please check back later.", "wrong_network_title": "兑换不可用", "wrong_network_body": "您只能在以太坊主网上兑换代币。", "unallowed_asset_title": "不能兑换此代币", @@ -5002,7 +5081,7 @@ "edit": "编辑", "quotes_include_fee": "报价包括 %{{fee}} 的 MetaMask 费用", "quotes_include_gas_and_metamask_fee": "报价包括燃料费和 {{fee}}% 的 MetaMask 费用", - "tap_to_swap": "点按以兑换", + "tap_to_swap": "Tap to swap", "swipe_to_swap": "滑动以兑换", "swipe_to": "滑动以", "swap": "兑换", @@ -5302,7 +5381,7 @@ }, "network_information": { "things_to_keep_in_mind": "注意事项", - "testnet_network": "{{type}} Testnet", + "testnet_network": "{{type}} testnet", "first_description": "此网络上的原生代币是{{ticker}}。这是用于燃料费的代币。", "second_description": "如果您试图将资产从一个网络直接发送到另一个网络,这可能会导致永久的资产损失。请务必使用跨链桥进行操作。", "third_description": "您的代币可能不会在您的钱包中自动出现。", @@ -5385,7 +5464,7 @@ "learn_more": "了解详情" }, "token_allowance": { - "verify_third_party_details": "核实第三方的详细信息", + "verify_third_party_details": "Verify third-party details", "protect_from_scams": "为了免受骗子欺诈,请花点时间核实第三方的详细信息。", "learn_to_verify": "了解如何核实第三方的详细信息", "spending_cap": "支出上限", @@ -5399,7 +5478,7 @@ }, "restore_wallet": { "restore_needed_title": "需要恢复", - "restore_needed_description": "出了问题,但别担心!让我们尝试恢复您的钱包。", + "restore_needed_description": "Something went wrong, but don’t worry! Let’s try to restore your wallet.", "restore_needed_action": "恢复钱包" }, "wallet_restored": { @@ -5598,6 +5677,10 @@ "error_description": "{{snap}}安装失败。" }, "earn": { + "claimable_bonus_tooltip": "An annual bonus claimable daily from your wallet.", + "earn_a_percentage_bonus": "Earn a {{percentage}}% bonus", + "claimable_bonus": "Claimable bonus", + "claim_bonus": "Claim bonus", "empty_state_cta": { "heading": "借出 {{tokenSymbol}} 并赚取", "body": "通过 {{protocol}} 借出您的 {{tokenSymbol}},", @@ -5681,21 +5764,36 @@ "fee": "费用" }, "musd_conversion": { - "convert_to_musd": "Convert to mUSD", + "ok": "OK", + "continue": "Continue", + "convert_and_get_percentage_bonus": "转换并获得 {{percentage}}%", + "get_a_percentage_musd_bonus": "获取 {{percentage}}% mUSD 奖励", + "convert": "兑换", "toasts": { - "converting": "Converting {{token}} → mUSD", - "eta": "~{{time}}", - "delivered": "Your mUSD has been delivered!", - "failed": "mUSD conversion failed" + "converting": "正在将 {{token}} 兑换为 mUSD", + "eta": "大约 {{time}}", + "delivered": "您的 mUSD 已到账!", + "failed": "mUSD 兑换失败" }, "education": { - "heading": "使用 mUSD 赚取奖励", - "description": "Convert your USDC, USDT, or DAI for mUSD, MetaMask’s dollar-backed stablecoin.Earn points every time you convert or hold $100.", - "continue_button": "开始" + "heading": "获取 {{percentage}}% 稳定币收益", + "description": "Convert your stablecoins to mUSD, MetaMask’s US dollar-backed stablecoin, and receive up to a {{percentage}}% bonus.", + "terms_apply": "Terms apply.", + "primary_button": "开始", + "secondary_button": "暂时不" }, - "earn_points_daily": "Earn points daily", - "buy_musd": "Buy mUSD", - "get_musd": "Get mUSD" + "buy_musd": "购买 mUSD", + "get_musd": "获取 mUSD", + "boost_title": "Get {{percentage}}% on your stablecoins", + "boost_description": "Convert your stablecoins to mUSD and receive up to a {{percentage}}% bonus.", + "powered_by_relay": "由 Relay 提供技术支持" + }, + "bonus_claim": { + "toasts": { + "claiming": "Your mUSD bonus is processing", + "delivered": "Your mUSD bonus is here!", + "failed": "Bonus claim failed" + } }, "rewards": { "rewards_tag_label": "奖励", @@ -5711,22 +5809,22 @@ "stake": "Stake", "earn": "赚取", "tron": { - "stake_completed": "Staking completed", - "stake_completed_description": "Your staking transaction has been completed successfully.", - "stake_failed": "Staking failed", + "stake_completed": "质押已完成", + "stake_completed_description": "您的质押交易已成功完成。", + "stake_failed": "质押失败", "unstake_completed": "解除质押完成", - "unstake_completed_description": "Your unstaking transaction has been completed successfully.", - "unstake_failed": "Unstaking failed", + "unstake_completed_description": "您的解除质押交易已成功完成。", + "unstake_failed": "解除质押失败", "bandwidth": "带宽", "energy": "能量", "estimated_annual_reward": "预计年度奖励", - "trx_locked_for": "TRX locked for", - "trx_locked_for_minimum_time": "~3 days", - "trx_released_in": "TRX released in", - "trx_released_in_minimum_time": "~14 days", + "trx_locked_for": "TRX 锁定时长", + "trx_locked_for_minimum_time": "约 3 天", + "trx_released_in": "TRX 释放时间", + "trx_released_in_minimum_time": "约 14 天", "fee": "费用", "errors": { - "insufficient_balance": "You don't have enough resource balance to do this action." + "insufficient_balance": "您的资源余额不足以执行此操作。" } }, "stake_eth": "质押 ETH", @@ -5772,12 +5870,19 @@ "learn_more_with_period": "了解更多。" }, "stake_your_trx_cta": { - "title": "Lend Tron and earn", - "description_start": "Stake your Tron and earn ", + "title": "借出 Tron 并赚取", + "description_start": "抵押您的 Tron 并赚取 ", "description_end": " annually.", "learn_more": "了解更多。", "earn_button": "赚取" }, + "trx_learn_more": { + "title": "Stake TRX and earn", + "stake_any_amount": "Stake any amount of TRX.", + "earn_trx_rewards": "赚取 TRX 奖励。", + "earn_trx_rewards_description": "质押后,即刻开始赚取奖励。奖励将自动累积。", + "flexible_unstaking_description": "Unstake anytime. Unstaking takes 14 days to process." + }, "day": { "zero": "", "one": "天", @@ -5855,7 +5960,7 @@ "one_year_average": "平均 1 年" }, "default_settings": { - "title": "Your wallet is ready", + "title": "您的钱包已准备就绪", "description": "MetaMask 使用默认设置达到安全性和易用性的最佳平衡。更改这些设置以进一步保护您的隐私。", "learn_more_about_privacy": "了解有关隐私最佳实践的更多信息。", "privacy_policy": "隐私政策", @@ -5981,7 +6086,7 @@ "switch_account_type": "账户更新", "approve": "批准请求", "perps_deposit": "充值", - "predict_deposit": "添加预测资金", + "predict_deposit": "存入预测资金", "predict_withdraw": "提取" }, "sub_title": { @@ -6005,11 +6110,12 @@ "transaction_fee": "我们将在预测所使用的 Polygon 网络上将您的代币兑换为 USDC.e。兑换提供商可能收取费用,但 MetaMask 不收取费用。" }, "musd_conversion": { - "transaction_fee": "mUSD conversion fees include network costs and may include provider fees." + "transaction_fee": "mUSD 兑换费用包含网络成本,且可能包含服务商费用。" }, "title": { "transaction_fee": "费用" - } + }, + "network_fee": "网络费用取决于网络的繁忙程度及交易的复杂程度。" }, "spending_cap": "支出上限", "withdraw": "提取", @@ -6078,7 +6184,7 @@ }, "includes_transaction": "包含 {{transactionCount}} 笔交易", "useSmartAccount": "使用智能账户", - "successful": "成功!", + "successful": "成功", "success_message": "您的账户将在下次交易时升级为智能账户。" }, "edit_spending_cap_modal": { @@ -6086,9 +6192,9 @@ "cancel": "取消", "description": "输入您愿意让他人代表您花费的金额。", "invalid_number_error": "支出限额必须为数字", - "no_empty_error": "支出限额不能为空", - "no_extra_decimals_error": "支出限额的小数位数不能超过该代币的小数位数", - "no_zero_error": "支出限额不能为 0", + "no_empty_error": "Spending cap can't be empty", + "no_extra_decimals_error": "Spending cap can't have more decimals than the token", + "no_zero_error": "Spending cap can't be 0", "no_zero_error_decrease_allowance": "支出限额设为 0 对“decreaseAllowance”方法无影响", "no_zero_error_increase_allowance": "支出限额设为 0 对“increaseAllowance”方法无影响", "save": "保存", @@ -6119,7 +6225,7 @@ "edit_amount_done": "继续", "deposit_edit_amount_done": "充值", "deposit_edit_amount_predict_withdraw": "提取", - "deposit_edit_amount_musd_conversion": "Convert to mUSD" + "deposit_edit_amount_musd_conversion": "兑换为 mUSD" }, "change_in_simulation_modal": { "title": "结果已发生变化", @@ -6144,6 +6250,8 @@ "confirm_swap": "交换", "terms_and_conditions": "条款和条件", "select_token": "选择代币", + "no_tokens_found": "找不到代币", + "no_tokens_found_description": "We couldn't find any tokens with this name. Try a different search.", "select_network": "选择网络", "all_networks": "所有网络", "num_networks": "{{numNetworks}} 个网络", @@ -6151,6 +6259,7 @@ "select_all_networks": "全部选择", "deselect_all_networks": "取消全部选择", "see_all": "查看全部", + "all": "所有", "apply": "应用", "slippage": "滑移", "slippage_info": "如果价格在您下单和确认之间发生变化,称为“滑移”。如果滑移超过您在此设置的最大幅度,您的兑换将自动取消。", @@ -6191,9 +6300,9 @@ "title": "桥接", "submitting_transaction": "正在提交", "fetching_quote": "正在获取报价", - "fee_disclaimer": "包含 {{feePercentage}}% MM 费用.", + "fee_disclaimer": "Includes {{feePercentage}}% MetaMask fee.", "no_mm_fee": "无 MM 费用", - "no_mm_fee_disclaimer": "兑换成 {{destTokenSymbol}} 时无 MM 费用.", + "no_mm_fee_disclaimer": "No MetaMask fee swapping into {{destTokenSymbol}}.", "hardware_wallet_not_supported": "目前暂不支持硬件钱包。请改用热钱包继续操作。", "hardware_wallet_not_supported_solana": "Solana 目前暂不支持硬件钱包。请改用热钱包继续操作。", "price_impact_info_title": "价格影响", @@ -6208,15 +6317,7 @@ "approval_tooltip_content": "您正在授权动用指定金额({{amount}} {{symbol}})。该合约将无法动用超出此额度的任何资金。", "minimum_received": "Minimum received", "minimum_received_tooltip_title": "Minimum received", - "minimum_received_tooltip_content": "若交易处理期间价格发生波动,根据您设置的滑移容限,此为您将收到的最低金额。该金额来自流动性供应商提供的预估,最终到账金额可能存在差异。", - "verified_token": "已验证代币", - "price": "价格", - "percent_change": "变化百分比", - "volume": "交易量", - "market_cap_fdv": "市值(完全稀释估值 FDV)", - "listed_on": "上线于", - "centralized_exchanges": "中心化交易所", - "contract_address": "合约地址" + "minimum_received_tooltip_content": "若交易处理期间价格发生波动,根据您设置的滑移容限,此为您将收到的最低金额。该金额来自流动性供应商提供的预估,最终到账金额可能存在差异。" }, "quote_expired_modal": { "title": "有新的报价", @@ -6290,7 +6391,7 @@ "title": "钱包恢复", "login_with_social": "使用社交账户登录", "setup": "设置", - "secret_recovery_phrase": "私钥助记词 {{num}}", + "secret_recovery_phrase": "Secret Recovery Phrase {{num}}", "back_up": "备份", "reveal": "显示", "social_recovery_title": "{{authConnection}} 恢复", @@ -6349,7 +6450,7 @@ "section_1_title": "什么是多链账户?", "section_1_description": "单一账户即可应对 MetaMask 支持的所有网络的地址。现在您无需切换账户即可顺畅使用以太坊、Solana 等。", "section_2_title": "相同地址,更多网络", - "section_2_description": "我们已对您的账户进行了分组,您仍可照常使用 MetaMask。您的资金安全无虞且未变动。", + "section_2_description": "We’ve grouped your accounts, so keep using MetaMask the same as before. Your funds are safe and unchanged.", "view_accounts_button": "查看账户", "learn_more_button": "了解详情", "setting_up_accounts": "设置您的账户" @@ -6511,8 +6612,10 @@ }, "card_onboarding": { "title": "消费并赚取", - "description": "MetaMask 卡是一款快捷的支付工具,让您能如使用现金般轻松消费加密货币,同时还能赚取奖励。", + "description": "MetaMask 卡是一款快捷的支付工具,让您能轻松消费加密货币,并享受高达3%返现。", "apply_now_button": "立即申请", + "login_button": "登录", + "not_now_button": "暂时不", "sign_up": { "title": "让我们开始吧", "description": "创建您的 MetaMask 卡账户(由 Crypto Life 提供)。该账户将独立于您的 MetaMask 账户存在。", @@ -6540,6 +6643,7 @@ "phone_number_label": "输入电话号码", "country_area_code_label": "国家/地区代码", "invalid_phone_number": "电话号码无效", + "invalid_us_phone_number": "请输入有效的美国电话号码(10位数字)以继续。", "legal_terms": "继续操作即表示您同意接收短信以验证手机号码。" }, "confirm_phone_number": { @@ -6576,8 +6680,8 @@ "terms": "审核通常需要大约12小时。结果出来后我们会通知您。" }, "verifying_veriff_kyc": { - "title": "正在验证您的身份", - "description": "我们正在验证您的身份,请稍候。", + "title": "等待批准", + "description": "我们的合作伙伴需要验证您的身份信息,以便批准您的申请。", "helper_text": "此过程通常只需几秒钟,请勿关闭应用。" }, "verifying_registration": { @@ -6614,7 +6718,7 @@ }, "physical_address": { "title": "填写您的地址", - "description": "请输入您的家庭地址。若审核通过,我们将把实体卡寄送至该地址。", + "description": "请输入您当前的居住地址。我们将把此信息用于验证目的。", "address_line_1_label": "地址行 1", "address_line_2_label": "地址行 2", "city_label": "城市", @@ -6622,7 +6726,7 @@ "zip_code_label": "邮政编码", "country_label": "国家/地区", "electronic_consent_1": "我同意《电子签名法案同意书与披露声明》,并同意以电子方式接收所有通讯. ", - "electronic_consent_2": "View document(PDF)" + "electronic_consent_2": "查看文档(PDF)" }, "mailing_address": { "title": "邮寄地址", @@ -6668,22 +6772,24 @@ } }, "card_home": { + "title": "Card", + "available_balance": "可用余额", "error_title": "无法获取数据", "error_description": "似乎存在一个问题,导致您无法查看此页面上的内容。请检查网络连接或尝试刷新页面。", "try_again": "请重试", - "limited_spending_warning": "您的实际消费额度可能受限。请前往 {{manageCard}} 调整限额", + "limited_spending_warning": "Your actual spending ability may be limited. To adjust your limit, go to ", "add_funds": "充值", "change_asset": "更改资产", "enable_card_button_label": "启用卡", "enable_assets_button_label": "启用资产", "spending_limit_warning": "您已接近消费限额。请及时更新以避免交易被拒。", "logout": "退出登录", - "logout_description": "退出您的 MetaMask 卡账户", "logout_confirmation_title": "确定要退出卡账户吗?", "logout_confirmation_message": "确定要退出您的 MetaMask 卡账户吗?", "logout_confirmation_cancel": "取消", "logout_confirmation_confirm": "退出登录", "enable_card_error": "启用卡失败。请稍后再试。", + "view_card_details_error": "Unable to load card details. Please try again.", "warnings": { "close_spending_limit": { "title": "您即将达到消费限额", @@ -6706,6 +6812,16 @@ "blocked": { "title": "您的卡已封禁", "description": "请联系支持团队为您的卡解除封禁" + }, + "kyc_pending": { + "title": "验证中", + "description": "Your identity verification is being reviewed. This typically takes less than 12 hours." + } + }, + "messages": { + "card_provisioning": { + "title": "Card being created", + "description": "Your card is being created. This may take a few moments." } }, "kyc_status": { @@ -6729,33 +6845,46 @@ "ok_button": "OK" }, "manage_card_options": { - "manage_spending_limit": "管理消费限额", + "view_card_details": "View card details", + "hide_card_details": "Hide card details", + "view_card_details_description": "Card number, expiration and CVV", + "manage_spending_limit": "Manage limit", "manage_spending_limit_description_restricted": "限额消费已开启", "manage_spending_limit_description_full": "全部权限已开启", "manage_card": "管理卡片", - "advanced_card_management_description": "查看卡详情、交易记录等信息", + "advanced_card_management_description": "See activity, cashback, freeze card, and more", "travel_title": "MetaMask Travel", - "travel_description": "与 Expedia 相比,预订酒店可享高达60%的折扣", - "card_tos_title": "卡条款与条件", - "card_tos_description": "阅读发卡机构的条款" + "travel_description": "Book hotels with up to 70% discounts", + "card_tos_title": "Terms and conditions" } }, "card_spending_limit": { "title_change_token": "更改代币和网络", "title_enable_token": "启用代币", + "title_onboarding": "启用消费权限", + "setup_title": "Set up your card", + "setup_description": "Select the token you'd like to use and set a limit for how much you can spend.", + "asset_label": "资产", + "limit_label": "限制", + "other_token": "Other", "full_access_title": "完整访问权限", - "full_access_description": "您的卡可自动使用您的资金,无需每次交易都请求批准。", - "restricted_limit_title": "受限消费", - "restricted_limit_description": "每次需要提高限额时,您都需要返回并支付网络手续费。", + "full_access_description": "Your card can use your funds automatically without asking for approval each time.", + "restricted_limit_title": "支出限额", + "restricted_limit_description": "您最多只能支出此限额。每次更新此限额时,您将需要支付网络手续费。", "edit_limit": "编辑限制", "confirm_new_limit": "确认", "cancel": "取消", + "skip": "暂时跳过", "set_new_limit": "设置限额", "dismiss": "忽略", "update_success": "消费限额更新成功", "update_error": "消费限额更新失败", "solana_not_supported": "请在 card.metamask.io 启用 Solana 代币", - "select_token": "选择代币" + "select_token": "选择代币", + "loading": "正在加载可用代币……", + "load_error": "无法加载代币。请重试。", + "retry": "请重试", + "on_linea": "在 Linea 上" }, "change_asset": { "title": "更改代币和网络", @@ -6793,6 +6922,7 @@ "signup_button": "注册", "errors": { "invalid_credentials": "登录信息无效", + "invalid_otp_code": "验证码错误,请重试", "unknown_error": "未知错误,请稍后再试", "email_required": "电子邮件为必填项", "password_required": "密码为必填项", @@ -6839,8 +6969,8 @@ }, "rewards": { "auth_fail_title": "未知错误。", - "auth_fail_description": "为此账户进行奖励计划认证时发生未知错误。请稍后再试。", - "failed_to_authenticate": "奖励计划认证失败", + "auth_fail_description": "为此账户进行 MetaMask 奖励计划认证时发生未知错误。请稍后再试。", + "failed_to_authenticate": "MetaMask 奖励计划认证失败", "not_implemented": "即将推出", "not_implemented_season_summary": "赛季总结即将推出", "optin_error": { @@ -6867,6 +6997,10 @@ "error_fetching_description": "请检查连接后重试。", "retry_button": "重试" }, + "linea_tokens": { + "default_title": "$LINEA", + "title_earned": "您赚取了 {{amount}} $LINEA" + }, "upcoming_rewards_error": { "error_fetching_title": "奖励加载失败", "error_fetching_description": "请检查连接后重试。", @@ -6898,6 +7032,15 @@ "claim_reward_error": { "title": "领取奖励失败" }, + "metal_card_claim": { + "title": "兑换您的奖励", + "description": "MetaMask 金属卡受资格限制,并非所有地区均可申请。若您不符合申领条件,我们将为您提供独家高级周边礼品作为替代。", + "contact_info": "请提供您的联系方式,您将在2周内收到来自 Telegram 用户 @MidwitMilhouse 或邮箱 christian.montoya@consensys.net 的回复。", + "email_label": "电子邮件", + "email_validation_error": "请输入有效的电子邮件地址", + "telegram_label": "Telegram 用户名", + "telegram_placeholder": "可选" + }, "accounts_opt_in_state_error": { "error_fetching_title": "账户加载失败", "error_fetching_description": "请检查连接后重试。", @@ -6979,7 +7122,7 @@ "gtm_title": "奖励已到", "gtm_description": "通过活动赚取积分。 \n提升等级即可解锁奖励。", "gtm_confirm": "开始", - "intro_title": "第 1 季\n已上线", + "intro_title": "第 1 季 \n已上线", "intro_description": "通过活动赚取积分。 \n提升等级即可解锁奖励。", "intro_confirm": "领取 250 积分", "intro_confirm_geo_loading": "正在检查地区……", @@ -7052,12 +7195,12 @@ "dashboard_modal_info": { "active_account": { "title": "切勿错过", - "description": "添加您的账户,即可开始通过活动赚取积分。", + "description": "Add your account to Rewards.", "confirm": "添加账户" }, "multiple_unlinked_accounts": { - "title": "开始赚取积分", - "description": "添加您的账户,即可一目了然地追踪奖励。", + "title": "切勿错过", + "description": "Add your accounts to Rewards.", "confirm": "添加账户" }, "account_not_supported": { @@ -7110,10 +7253,10 @@ } }, "predict": { - "title": "预测市场", + "title": "预测", "description": "为预测每投注10美元可获20积分", "sheet": { - "title": "预测市场", + "title": "预测", "points": "每 10 美元 20 积分", "description": "每交易10美元即可获得积分。", "cta_label": "浏览市场" @@ -7191,6 +7334,19 @@ "time_left": "剩余时间", "expired": "已过期" }, + "end_of_season_rewards": { + "confirm_label_default": "确认", + "confirm_label_access": "访问", + "redeem_success_title": "奖励已兑换", + "metal_card_claim_success": "联系方式已确认", + "linea_tokens_claim_success": "地址已确认", + "arriving_soon": "即将送达", + "check_back_soon": "请稍后再来领取", + "redeem_failure_title": "兑换失败", + "redeem_failure_description": "请稍后再试。", + "reward_details": "奖励详情", + "select_account_description": "选择您希望接收此奖励的账户。代币将在两周内发放。" + }, "animation": { "could_not_load": "无法加载" } @@ -7257,13 +7413,13 @@ "still_connecting_network": "仍在连接到 {{networkName}}……", "unable_to_connect_network": "无法连接到 {{networkName}}。", "update_rpc": "更新 RPC(远程过程调用)", + "switch_to_metamask_default_rpc": "Switch to MetaMask default RPC", "check_network_connectivity": "请检查您的网络连接。", - "check_network_connectivity_or": "请检查您的网络连接或" + "check_network_connectivity_or": "请检查您的网络连接或", + "updated_to_metamask_default": "Updated to MetaMask default" }, "trending": { "title": "Explore", - "view_all": "View all", - "tokens": "代币", "trending_tokens": "Trending tokens", "price_change": "Price change", "all_networks": "所有网络", @@ -7295,6 +7451,10 @@ "title": "Trending tokens is not available", "description": "We can't fetch this page right now", "try_again": "请重试" + }, + "empty_search_result_state": { + "title": "找不到代币", + "description": "We were not able to find this token" } }, "ota_update_modal": { From b8fcbe0fe75a1da464d2ef4ca96fad52c69ebe46 Mon Sep 17 00:00:00 2001 From: metamaskbot Date: Thu, 29 Jan 2026 00:57:25 +0000 Subject: [PATCH 38/80] [skip ci] Bump version number to 3568 --- android/app/build.gradle | 2 +- bitrise.yml | 4 ++-- ios/MetaMask.xcodeproj/project.pbxproj | 12 ++++++------ 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index abe87175bba1..06d4844eb395 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -188,7 +188,7 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion versionName "7.63.0" - versionCode 3566 + versionCode 3568 testBuildType System.getProperty('testBuildType', 'debug') testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" manifestPlaceholders.MM_BRANCH_KEY_TEST = "$System.env.MM_BRANCH_KEY_TEST" diff --git a/bitrise.yml b/bitrise.yml index 95935420c6c1..63effca15339 100644 --- a/bitrise.yml +++ b/bitrise.yml @@ -3472,13 +3472,13 @@ app: VERSION_NAME: 7.63.0 - opts: is_expand: false - VERSION_NUMBER: 3566 + VERSION_NUMBER: 3568 - opts: is_expand: false FLASK_VERSION_NAME: 7.63.0 - opts: is_expand: false - FLASK_VERSION_NUMBER: 3566 + FLASK_VERSION_NUMBER: 3568 - opts: is_expand: false ANDROID_APK_LINK: '' diff --git a/ios/MetaMask.xcodeproj/project.pbxproj b/ios/MetaMask.xcodeproj/project.pbxproj index 29a89d6e3ba7..a24189553797 100644 --- a/ios/MetaMask.xcodeproj/project.pbxproj +++ b/ios/MetaMask.xcodeproj/project.pbxproj @@ -1281,7 +1281,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3566; + CURRENT_PROJECT_VERSION = 3568; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 48XVW22RCG; @@ -1350,7 +1350,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3566; + CURRENT_PROJECT_VERSION = 3568; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 48XVW22RCG; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 48XVW22RCG; @@ -1416,7 +1416,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3566; + CURRENT_PROJECT_VERSION = 3568; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 48XVW22RCG; @@ -1483,7 +1483,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3566; + CURRENT_PROJECT_VERSION = 3568; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 48XVW22RCG; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 48XVW22RCG; @@ -1646,7 +1646,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3566; + CURRENT_PROJECT_VERSION = 3568; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 48XVW22RCG; @@ -1716,7 +1716,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3566; + CURRENT_PROJECT_VERSION = 3568; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 48XVW22RCG; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 48XVW22RCG; From a254115b822d8a43755eb8fa41368831dff15341 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Loureiro?= <175489935+joaoloureirop@users.noreply.github.com> Date: Fri, 23 Jan 2026 20:39:54 +0000 Subject: [PATCH 39/80] Revert "fix: MUL-1331 modify android manifest file for correct BLE location permission. (#23759)" This reverts commit ddd333ce68f2bd948326ba63f226e79a442c231e. --- android/app/src/main/AndroidManifest.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index bc632e822527..9d30b90cb861 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -12,12 +12,12 @@ - + - + From d858ef1eb0eb783656ddc92915eb4ef4ceec261a Mon Sep 17 00:00:00 2001 From: MetaMask Bot <37885440+metamaskbot@users.noreply.github.com> Date: Mon, 26 Jan 2026 09:22:49 -0500 Subject: [PATCH 40/80] release: release/7.62.0-Changelog (#24580) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR updates the change log for 7.62.0. (Hotfix - no test plan generated.) --------- Co-authored-by: metamaskbot Co-authored-by: João Loureiro <175489935+joaoloureirop@users.noreply.github.com> --- CHANGELOG.md | 987 +++++++++++++++++++++++++++++++-------------------- 1 file changed, 603 insertions(+), 384 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 542cd38248ea..461e04ae2481 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,161 +7,379 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [7.62.0] + +### Added + +- Add first iteration of mUSD conversion segment events (#24457) +- Added Perps Discovery Banner on spot asset detail screens to help users discover perpetual trading options (#24512) +- Adopted new ramp controller variable names (#24280) +- Updated Networks bottom sheet to open at 50% screen height with improved header and close button (#24493) +- Refactored mUSD conversion CTA rendering conditions (#24335) +- UseTokenAsset to make use of `@assets-controller` `getNativeTokenAddress` implementation. (#24483) +- Added a "Give feedback" button to Perps home screen (#24511) +- Hide Earn product entry points for ineligible users (#24490) +- Add 5 min polling to trending tokens (#24462) +- Adds intent based swap support (#23776) +- Improved Card onboarding flow with better state handling and navigation after delegation setup (#24430) +- Added perps deeplinks for home view, market list with category filtering, and HIP-3 asset support (#24132) +- Set trending token as the dest token when navigating to swaps (#24373) +- Misc mUSD conversion flow design changes ahead of UAT (#24336) +- Perps icon fallback url mechanism (#24340) +- Added fill type indicators (Take Profit, Stop Loss, Liquidation, ADL) to perps transactions on Home and Market Details (#24259) + screens +- Allow metal card rewards claim when season 1 ends (#24314) +- Ai workflow with jira and simulator setup (#24283) +- feat: bip39 word bar suggestions in onboarding and import srp module. (#22927) +- Added a fallback for Perps users who have Basic Functionality disabled. (#23952) +- Added remotely configurable allowlist and blocklist for mUSD conversion tokens. (#24126) +- Use optimistic approach when updating TP/SL in perps (#24159) +- Added OTA updates modal (#24175) +- Updated token list item musd conversion cta position to secondary balance position. This replaces the price change percentage (#24249) + for specified stablecoins +- Added a verification step to the Card onboarding flow to validate Veriff KYC results before proceeding. (#24246) +- Added override functionality to remote feature flags with methods to set and clear overrides and access A/B test groups (#23487) +- Improved initial cross ecosystem connection flows by preselecting all supported chains (EVM + Solana) when connecting through (#24137) + injected providers. +- Implement modal for user already has a Card account (#24007) +- Added card-home deeplink handler to navigate users to MetaMask Card based on authentication and card-linked account status (#24118) +- Fixed HIP-3 market symbols displaying with DEX prefix in Order Book view (#24068) +- Added ability to view trade details when tapping on recent trades in Perps, with a "Trade again" button to quickly navigate (#24067) + back to trading +- Added new card-onboarding deeplink to navigate users to the MetaMask Card feature (#24042) +- Reveal SRP flow ui and text updates. (#24058) +- Fixed "See all" button visibility in Perps Recent Activity section (#24099) +- Updated limit price presets to include Mid and Bid/Ask buttons for quicker price selection (#24069) +- Re-enabled order book access from perps market details view (#24010) +- Changed address copy confirmation from modal to Toast notification (#23980) +- Add Tron Account Change detection support for multichain Api (#23639) +- Removed hardcoded mainnet output chainId for mUSD conversion flow (#23704) +- Add animation for importSRP and create password layout and vice-versa (#24011) +- Updated mUSD conversion education screen theming (#23949) +- Update optin metrics screen ui changes (#24008) +- NFTs allow fetching one page and aborting fetch when navigating away (#23962) +- Removed the notification badge from the card icon button (#23978) +- Improved Toast component visual alignment and positioning (#23928) +- Updated Deposit page transition to slide in from the right instead of bottom (#23913) +- Updated NFT details pages to slide in from right instead of from bottom (#23912) +- Changed DeFi protocol detail page to slide in from right instead of from bottom (#23911) +- Added QuickNode fallback RPC for Monad. (#23479) +- Added paste button for email verification code input on Deposit flow (#23939) +- Automatically change the destination asset to match source asset chain when users land on swaps. (#23822) +- Added useTronStakeApy hook (#23743) +- Added support for delegating Base assets in the MetaMask Card feature (#23509) +- Implement MM Travel and ToS links on Card Home (#23550) +- Disable token selection in Perps and Predict deposits if no native balance and gas station not supported (#23680) +- Updated the mUSD confirmation screen's header to display the mUSD token and target network icon. (#23691) +- Added mUSD CTA to asset overview screen (#23562) +- Add support for progressive rollout FF (#23670) +- Adds "Inaccurate fee" alert in Confirmations (#23588) +- Fixed Perps tab to display total balance instead of available balance (#23466) +- Add conditional rendering of bridge-time-row by tx type (#23552) +- Adds 1-click approval/deposit transaction confirmation flow for Earn lending (#23154) +- Add mUSD conversion CTA above token list (#23390) +- Fixed an issue where users could accidentally add burn addresses to their contacts, which could lead to sending funds to (#23358) + unrecoverable addresses +- Social Login user create wallet will always enable metametric flag (#22469) + SRP user create wallet will always disable metametric + flag by default and prompted metametric screen +- Add support for gas-included swaps with EIP-7702 (#22593) +- Added MegaETH Mainnet to Additional Networks (PopularList) (#23401) +- Added new simplified predict market row item for trending (#23388) +- Network connection banner now hides immediately when network becomes available again (#23425) +- Get marketData on trending search request (#23197) +- Added automatic saving and restoration of trade form configuration when navigating away from the perps trading screen (#23321) +- Add mUSD conversion education screen on first visit to conversion flow (#22972) +- Added price deviation warning to Perps trading interface to prevent opening positions when perps price deviates (#23242) + significantly from spot price + +### Fixed + +- Fixed a bug where quotes would attempt to refresh even while a swap was being actively submitted (#24552) +- None (#24548) +- Adds predict sports primitives (#24506) +- Fixed QR code scanning in dark mode by adding white background (#24533) +- Fix incorrect skeleton used for predictions when searching in main explore page (#24519) +- Fix trending tokens search crashes on search (#24517) +- Explore browser tab open behaviour when opening empty vs populated browser (#24371) +- Use preferred search engine on trending (#24513) +- Add fallback for cardFeature flag using local value (#24428) +- Use custom values for liquidity and min14hvalue param for trending requests (#24481) +- fix: search token input box size (#24380) +- Fixed sentence case violations in locale strings (#24451) +- Add MetaMask Portfolio to explore sites (#24369) +- Reset token icon when source changes to recalculate fallback (#24334) +- Fixed a bug where total volume was displaying the wrong value in asset details page (#24331) +- Fix Predict feed animations, tab bar UI and search overlay (#24337) +- Using v3 api to get historical prices for asset details page instead of v1 (#24315) +- Bug fix where a user couldn't scroll through the SRP reveal bottom sheet on Android (#24338) +- Removes `Add account` in the account selector during the ramps flow. (#22114) +- Fixed an issue where Perps withdrawal indicators could remain stuck in "pending" state after the withdrawal completed (#24214) +- Fix trending search not getting market data (#24311) +- Token 2022 send (#24350) +- Fixed TP/SL price input validation to respect HyperLiquid's 5 significant figure limit (#24169) +- Fixes an issue where flipping source/dest assets do not update balances when user has zero balance on non-evm chains (#24329) +- Add conditional mounting to perps tab in Activity View (#24271) +- Add hybrid REST/websocket approach to building recent activity (#24212) +- Added ScreenshotDeterrent to the login page to prevent screenshots and recordings on the page. (#24285) +- Improved Card performance by reducing redundant authentication token refresh requests and ensuring CardHome updates (#24295) + correctly after changing the spending asset or spending limit. +- Updated Edit Account Name to display as a full-page drill-down with right-to-left transition and back button instead of a (#23579) + bottom sheet modal +- Fixed Swap button not showing for trending tokens on asset details page (#24299) +- Prevent filtering of transactions with 0x0 hash in activity view (#24289) +- Fixes a small localization key bug in the OTP code screen for Buy (deposit) (#24264) +- Modify the android manifest so that android 12+ will never ask for location permission. (#23759) +- Fixes issue where certain search queries in Predict would return no results (#24266) +- Fixed UI styling inconsistencies in Perps close positions and market balance views (#24234) +- Fixed inconsistent font size for TP/SL text in Perps position card (#24238) +- Fixed analytics `ramp_type` to correctly report `UNIFIED_BUY` when Unified Ramp V1 is enabled (#24245) +- Phishing screen UX background color papercut (#23836) +- Use cache headers on sentinel calls (#23429) +- Fixed mUSD conversion flow not rejecting transactions when navigating away (#24171) +- Fixed inconsistent price formatting on TradingView chart y-axis that showed unnecessary trailing zeros (#24184) +- Fixed rounded corners in Perps order screen when there are more than 2 rows displayed (#24162) +- Fixed payment method selector modal scroll not working (#24188) +- Fixed liquidation distance showing 0% instead of fallback when liquidation price is unavailable (#24128) +- Fixed sentence case violations in English locale strings lines 6001-7000 (#24056) +- Fixed market name text being truncated in Perps header for hip-3 markets (#24140) +- Fixed position size USD display showing 3 decimals instead of 2 (#24131) +- Added indicator name shortcuts in Perps asset pills to reflect sorting mechanism (#24130) +- Fixed sentence case violations in English locale strings lines 7001-7279 (#24127) +- Fixed bug where requesting quotes for successive non-EVM networks failed (#24095) +- Fixes header text in token details page (#24101) +- Fix balance updates using the new feature flags for balance fetching (#24156) +- Fixed sentence case violations in English locale strings lines 4001-5000 (#23996) +- Fixed sentence case violations in English locale strings lines 5001-6000 (#24049) +- Fixed delay between the live candlestick close price and current price line on the Perps TradingView chart (#24100) +- Fixed date format display on Perps price chart x-axis from "6 Nov" to "11/6" format (#24103) +- Fixed entry price decimal precision in Perps trade history (#24096) +- Fox animation raise up issue during keyboard open. (#23354) +- Fixed Perps activity view to show aggregated PnL values for stop loss and take profit orders that execute as multiple fills (#24050) +- Add excludeLabels to trending api. (#23988) +- Fix biometric sudden reset issue (#24018) +- fix: resolved minor send flow UI issues (#24034) +- Fixed sentence case violations in English locale strings lines 2001-3000 (#23957) +- Fix non-live current price in leverage slider (#24046) +- Fixed OHLC bar text overflow for tokens with small prices (#23471) +- Fixed an issue where pending approval requests could become permanently stuck in the queue, preventing users from approving (#24040) + or rejecting subsequent connection requests. +- Avoid re-rendering home when navigating back from trending (#24062) +- Improved the minimum received bridge label by rounding down (#23851) +- Fix TokenListController initialization. (#24020) +- Fixed sentence case violations in English locale strings lines 3001-4000 (#23994) +- Remove ens calls from account list to improve perf (#23920) +- Fixed an issue where switching back to the native token after automatic gas fee token selection did not trigger the insufficient (#23855) + balance alert. +- Fixed balance display in Perps to show proper decimal formatting with trailing zeros (#23898) +- Fixes empty quote card details issue when swapping on Solana network (#23915) +- Fixed a bug where alert modal styling would not update correctly when switching between different severity alerts. (#23893) +- Fixed a bug that caused Swap button to be blocked even though a quote was available (#23792) +- fix: update asset details transition to left to right (#23933) +- Token details block explorer correct urls (#23890) +- Google login fallback in android if no google account available on device. (#23520) +- Reduced number of calls to bulk-scan for NFT detection (#23803) +- Add default blockexplorer for linea and mainnet. (#23861) +- Resetpassword screen touch-id state (#23798) +- Remove emojis from gas options (#23907) +- fix: remove background from more button in multichain account selector (#23904) +- Change selected account styles (#22203) +- Remove scroll on click when clicking a tx in the asset details modal (#23885) +- Fixed "Report a detection problem" button to link to the correct GitHub repository for reporting phishing detection issues (#23824) +- fix: updated checkbox border to correct color (#23846) +- Fixed hiding nft flow. (#23833) +- Improved import assets UI (#23735) +- Fix nft auto detection not triggered on network switch (#23858) +- Fix token balances init (#23668) +- Fix issue where rejecting a MMConnect confirmation results in a connection failure toast (rather than a error toast) in the (#23806) + wallet. +- Fix stable coin chart (#23168) +- Fix re-rendering of nfts grid (#23768) +- Fixed QR scanner navigation by chain type and recipient address pre-population in send flow (#21498) +- Fixed leverage initialization when modifying existing perpetual positions (#23619) +- Fixed a bug where stale quote data remained momentarily when changing swap destination token (#23737) +- Fixed bug where the EVM addresses were not checksummed (#23703) +- Fixed chart jumping issues when font accessibility is turned on (#23732) +- Updated swaps network picker ordering (#23686) +- fix: update bg color for earn upsell banner (#23701) +- fix: unified keyboard actions background color (#23649) +- Fixed sentence case violations in English locale strings lines 1-1000 (#23499) +- Fixed a flicker where the insufficient balance alert appeared before gas-station checks completed (#23361) +- fix: update lend UI (#23633) +- fix: enlarge question mark icon in lend header (#23635) +- Added readme for using OTA updates on nightly builds (#23573) +- Fixes an issue where when users selected the swap button for an asset presented in browser URL bar, that asset was not (#23534) + selected as source when navigating to swap page. +- Hides trending section if empty (#23586) +- Fixed withdrawal progress component to display decimal amounts correctly (e.g., $1.30 instead of $1) (#23477) +- Truncate long titles in Predict claim confirmations (#23462) +- Fixed a bug where mainnet where showing after testnets in the send modal screen (#23492) +- Fixed sentence case violations in English locale strings lines 1001-2000 (#23516) +- Improved Portfolio integration by passing tracking consent from Mobile app (#22683) +- Removes usePopularNetworks hook and replace it with constant. (#23525) +- Google One Tap "user disabled the feature" errors are no longer sent to Sentry (#23101) +- Fixed an issue where "Fund your wallet" empty state briefly appeared when importing wallets with existing funds or switching (#23351) + between funded accounts +- Fixed internal transfers not appearing in perps transaction history (#23405) +- Filter and handle unsupported notifications (#23291) +- Fix trending tokens inconsistencies in search results (#23408) +- Prevent any dialogs for multichain wallet Snaps (Solana, Bitcoin, Tron) (#23218) + ## [7.61.6] ### Fixed -- fix: fix apr issue display value cp-7.61.6 ([#24382](https://github.com/MetaMask/metamask-mobile/pull/24382)) -- chore: bump @metamask/tron-wallet-snap to version 1.19.0 cp-7.61.6 ([#24378](https://github.com/MetaMask/metamask-mobile/pull/24378)) -- fix(tron): max energy and bandwidth incorrectly set to 1 instead of 0 cp-7.61.6 ([#24376](https://github.com/MetaMask/metamask-mobile/pull/24376)) -- fix: include hip3 dexes when building position map on init ([#24300](https://github.com/MetaMask/metamask-mobile/pull/24300)) -- chore(perps): Refactor HL subscription service (#24015) ([#24274](https://github.com/MetaMask/metamask-mobile/pull/24274)) -- chore: fix apr issue with znon-zero values cp-7.61.6 ([#24261](https://github.com/MetaMask/metamask-mobile/pull/24261)) +- fix: fix apr issue display value cp-7.61.6 (#24382) +- chore: bump @metamask/tron-wallet-snap to version 1.19.0 cp-7.61.6 (#24378) +- fix(tron): max energy and bandwidth incorrectly set to 1 instead of 0 cp-7.61.6 (#24376) +- fix: include hip3 dexes when building position map on init (#24300) +- chore(perps): Refactor HL subscription service (#24274, #24015) +- chore: fix apr issue with znon-zero values cp-7.61.6 (#24261) ## [7.61.5] ### Fixed -- fix: robustness deeplinking ([#24227](https://github.com/MetaMask/metamask-mobile/pull/24227)) -- chore: refine hardware signing flow ([#24228](https://github.com/MetaMask/metamask-mobile/pull/24228)) +- fix: robustness deeplinking (#24227) +- chore: refine hardware signing flow (#24228) ## [7.61.4] ### Fixed -- chore: robust implementation dapp connection ([#24222](https://github.com/MetaMask/metamask-mobile/pull/24222)) +- chore: robust implementation dapp connection (#24222) ## [7.61.3] ### Fixed -- feat: add Tron stakeComputeFee and other improvements ([#24209](https://github.com/MetaMask/metamask-mobile/pull/24209)) -- feat: NWNT-681: Add useTronStakeApy hook ([#24206](https://github.com/MetaMask/metamask-mobile/pull/24206)) -- feat: add support for accountChanged for Tron network ([#24207](https://github.com/MetaMask/metamask-mobile/pull/24207)) -- chore: update @metamask/keyring-api and @metamask/tron-wallet-snap versions ([#24205](https://github.com/MetaMask/metamask-mobile/pull/24205)) -- chore: adds localization method and other improvements ([#24204](https://github.com/MetaMask/metamask-mobile/pull/24204)) -- chore: add support for fiat use in tron staking/unstaking flows ([#24199](https://github.com/MetaMask/metamask-mobile/pull/24199)) -- chore: adds the Tron staking details preview ([#24198](https://github.com/MetaMask/metamask-mobile/pull/24198)) -- fix(ramp): use ScrollView from react-native-gesture-handler in PaymentMethodSelectorModal ([#24197](https://github.com/MetaMask/metamask-mobile/pull/24197)) -- chore: broadcast staking TRX transaction cp-7.61.3 ([#24196](https://github.com/MetaMask/metamask-mobile/pull/24196)) -- chore: connection updates and improvements ([#24215](https://github.com/MetaMask/metamask-mobile/pull/24215)) +- feat: add Tron stakeComputeFee and other improvements (#24209) +- feat: NWNT-681: Add useTronStakeApy hook (#24206) +- feat: add support for accountChanged for Tron network (#24207) +- chore: update @metamask/keyring-api and @metamask/tron-wallet-snap versions (#24205) +- chore: adds localization method and other improvements (#24204) +- chore: add support for fiat use in tron staking/unstaking flows (#24199) +- chore: adds the Tron staking details preview (#24198) +- fix(ramp): use ScrollView from react-native-gesture-handler in PaymentMethodSelectorModal (#24197) +- chore: broadcast staking TRX transaction cp-7.61.3 (#24196) +- chore: connection updates and improvements (#24215) ## [7.61.2] ### Fixed -- fix: Fix bug where EIP-1559 compatibility check was skipped in some circumstances ([#24166](https://github.com/MetaMask/metamask-mobile/pull/24166)) +- fix: Fix bug where EIP-1559 compatibility check was skipped in some circumstances (#24166) ## [7.61.1] ### Fixed -- fix: fix rounding issue ([#24032](https://github.com/MetaMask/metamask-mobile/pull/24032)) -- fix(ramp): enable WebView scrolling in Checkout on Android cp-7.61.1 ([#24081](https://github.com/MetaMask/metamask-mobile/pull/24081)) +- fix: fix rounding issue (#24032) +- fix(ramp): enable WebView scrolling in Checkout on Android cp-7.61.1 (#24081) ## [7.61.0] ### Added -- feat: previous season summary ([#23329](https://github.com/MetaMask/metamask-mobile/pull/23329)) -- feat: MUSD-108 Pre-select payment token for mUSD conversion flow ([#23225](https://github.com/MetaMask/metamask-mobile/pull/23225)) -- feat: add stop loss prompt banner to PerpsMarketDetailsView ([#23325](https://github.com/MetaMask/metamask-mobile/pull/23325)) -- feat: MUSD-108: Restrict payment tokens during mUSD conversion flow ([#23216](https://github.com/MetaMask/metamask-mobile/pull/23216)) -- feat: Remove nonce editing from Settings ([#23031](https://github.com/MetaMask/metamask-mobile/pull/23031)) -- feat: dark-theme friendly cronos logo ([#23323](https://github.com/MetaMask/metamask-mobile/pull/23323)) -- feat: render gas fees sponsored network and swap ([#20878](https://github.com/MetaMask/metamask-mobile/pull/20878)) -- feat: trust signals alerts on addresses and urls ([#23167](https://github.com/MetaMask/metamask-mobile/pull/23167)) -- feat: add trust signal middlware ([#22800](https://github.com/MetaMask/metamask-mobile/pull/22800)) -- feat: malicious token screening on transactions ([#22688](https://github.com/MetaMask/metamask-mobile/pull/22688)) -- feat: basic functionality toggle for trending ([#23252](https://github.com/MetaMask/metamask-mobile/pull/23252)) -- feat: track RPC update from network connection banner ([#22879](https://github.com/MetaMask/metamask-mobile/pull/22879)) -- feat: no point estimation when no active season ([#23244](https://github.com/MetaMask/metamask-mobile/pull/23244)) -- feat: [Trending] added support for refreshing + some code restructuring ([#23250](https://github.com/MetaMask/metamask-mobile/pull/23250)) -- feat: Throw error in Segment instead of Sentry Stop throwing error in Sentry when user tries to add a chain with unrecognized rpc url ([#23075](https://github.com/MetaMask/metamask-mobile/pull/23075)) -- feat: Add predefined recipient support to send flow ([#23087](https://github.com/MetaMask/metamask-mobile/pull/23087)) -- feat: add trending tokens search ([#23036](https://github.com/MetaMask/metamask-mobile/pull/23036)) -- feat: track analytics events for View All button clicks in NFT and Token lists ([#23107](https://github.com/MetaMask/metamask-mobile/pull/23107)) -- feat: sites section ([#23163](https://github.com/MetaMask/metamask-mobile/pull/23163)) -- feat: Bump deflation numbers to latest migration cp-7.60.0 ([#23161](https://github.com/MetaMask/metamask-mobile/pull/23161)) -- feat: enhance PerpsHomeView with new empty state and balance actions ([#23086](https://github.com/MetaMask/metamask-mobile/pull/23086)) -- feat: musd conversion optimizations ([#23146](https://github.com/MetaMask/metamask-mobile/pull/23146)) -- feat: [Trending] allow navigating to a website or search on google using the omnisearch and other minor improvements ([#22872](https://github.com/MetaMask/metamask-mobile/pull/22872)) -- feat: add musd conversion flow ([#23060](https://github.com/MetaMask/metamask-mobile/pull/23060)) -- feat: improve Predict withdrawal toast messaging ([#23045](https://github.com/MetaMask/metamask-mobile/pull/23045)) -- feat: add sentry logs for OTA updates ([#22682](https://github.com/MetaMask/metamask-mobile/pull/22682)) -- feat: refactor and fix invalid RPC URL error on paste ([#22875](https://github.com/MetaMask/metamask-mobile/pull/22875)) -- feat: cp-7.60.0 gas station support for metamask pay deposits ([#23033](https://github.com/MetaMask/metamask-mobile/pull/23033)) -- feat: OTA update exp workflow ([#22168](https://github.com/MetaMask/metamask-mobile/pull/22168)) -- feat: allow enroll rewards account in perps flows ([#22918](https://github.com/MetaMask/metamask-mobile/pull/22918)) -- feat: add trending tokens page ([#22568](https://github.com/MetaMask/metamask-mobile/pull/22568)) -- feat: update omni network and native token logo to nomina ([#22816](https://github.com/MetaMask/metamask-mobile/pull/22816)) -- feat: cp-7.60.0 reject duplicate metamask pay transactions ([#22836](https://github.com/MetaMask/metamask-mobile/pull/22836)) -- feat: Enhance AccountSelector with full-page layout and animations ([#22797](https://github.com/MetaMask/metamask-mobile/pull/22797)) -- feat: Add skeleton loading for the Send flow ([#22853](https://github.com/MetaMask/metamask-mobile/pull/22853)) -- feat: migrate features to new arch ([#22675](https://github.com/MetaMask/metamask-mobile/pull/22675)) -- feat: brwoser button ([#22871](https://github.com/MetaMask/metamask-mobile/pull/22871)) -- feat: cp-7.60.0 add new networks logo ([#22929](https://github.com/MetaMask/metamask-mobile/pull/22929)) -- feat: Open OS settings when push notifications are disabled ([#22830](https://github.com/MetaMask/metamask-mobile/pull/22830)) -- feat: allow add account predict flow ([#22856](https://github.com/MetaMask/metamask-mobile/pull/22856)) -- feat: Implement New migration failure detection cp-7.60.0 ([#22757](https://github.com/MetaMask/metamask-mobile/pull/22757)) -- feat: Start implement base link handlers for new universal link-router system ([#22566](https://github.com/MetaMask/metamask-mobile/pull/22566)) -- feat: cp-7.60.0 validate source amount in metamask pay ([#22758](https://github.com/MetaMask/metamask-mobile/pull/22758)) -- feat: introduce quick pick options in swap keypad ([#22407](https://github.com/MetaMask/metamask-mobile/pull/22407)) -- feat: allow add account in swap flow ([#22718](https://github.com/MetaMask/metamask-mobile/pull/22718)) -- feat: [Trending] make sections dynamic and restructure code part 2/2 ([#22724](https://github.com/MetaMask/metamask-mobile/pull/22724)) -- feat: Integrate season status hook in PerpsHeroCardView ([#22768](https://github.com/MetaMask/metamask-mobile/pull/22768)) -- feat: clicking src/dest swap flipper should invert token amounts from previosuly fetched quote ([#22540](https://github.com/MetaMask/metamask-mobile/pull/22540)) -- feat: EAS updates feature flag ([#22036](https://github.com/MetaMask/metamask-mobile/pull/22036)) -- feat: [Trending] quick actions and restructuring (1/2) ([#22700](https://github.com/MetaMask/metamask-mobile/pull/22700)) -- feat: ui experience enhancements in createpassword screen ([#22687](https://github.com/MetaMask/metamask-mobile/pull/22687)) -- feat: Add all entry points for Predict feed ([#22659](https://github.com/MetaMask/metamask-mobile/pull/22659)) -- feat: updated transaction details for predict claim and withdraw ([#22370](https://github.com/MetaMask/metamask-mobile/pull/22370)) -- feat: predict claim gas station ([#22553](https://github.com/MetaMask/metamask-mobile/pull/22553)) -- feat: rewards activity compatible with predict and deposit musd ([#22636](https://github.com/MetaMask/metamask-mobile/pull/22636)) -- feat: upgrade notification package and add Platform Notifications ([#22539](https://github.com/MetaMask/metamask-mobile/pull/22539)) -- feat: added powered by polymarket ([#22637](https://github.com/MetaMask/metamask-mobile/pull/22637)) -- feat: [Trending] add perps section ([#22611](https://github.com/MetaMask/metamask-mobile/pull/22611)) -- feat: update login screen rive animation ([#21138](https://github.com/MetaMask/metamask-mobile/pull/21138)) -- feat: add use-feature-flag ([#22590](https://github.com/MetaMask/metamask-mobile/pull/22590)) -- feat: trade confirmation redesign ([#22384](https://github.com/MetaMask/metamask-mobile/pull/22384)) -- feat: ways to earn musd deposits ([#22620](https://github.com/MetaMask/metamask-mobile/pull/22620)) -- feat: mcwp176 add auto tracking for related feature flags and override ([#22023](https://github.com/MetaMask/metamask-mobile/pull/22023)) -- feat: implement view all prediction ([#22621](https://github.com/MetaMask/metamask-mobile/pull/22621)) -- feat: update metamask pay same chain duration ([#22629](https://github.com/MetaMask/metamask-mobile/pull/22629)) -- feat: Implement `onAmountInput` for nonEVM send flow amount validations ([#22389](https://github.com/MetaMask/metamask-mobile/pull/22389)) -- feat: predict claim loader ([#22368](https://github.com/MetaMask/metamask-mobile/pull/22368)) -- feat: add hyperevm as additional network ([#22459](https://github.com/MetaMask/metamask-mobile/pull/22459)) -- feat: reward ways to earn for predict ([#22609](https://github.com/MetaMask/metamask-mobile/pull/22609)) -- feat: metamask pay buy button ([#22367](https://github.com/MetaMask/metamask-mobile/pull/22367)) -- feat: add cursor feature flag rule ([#22520](https://github.com/MetaMask/metamask-mobile/pull/22520)) -- feat: relay predict ([#22509](https://github.com/MetaMask/metamask-mobile/pull/22509)) -- feat: Predict GTM Modal ([#22530](https://github.com/MetaMask/metamask-mobile/pull/22530)) -- feat: eas updates initial setup ([#22467](https://github.com/MetaMask/metamask-mobile/pull/22467)) -- feat: Swaps tron integration ([#21294](https://github.com/MetaMask/metamask-mobile/pull/21294)) -- feat: Integrate Rewards with Predict ([#22546](https://github.com/MetaMask/metamask-mobile/pull/22546)) -- feat: trending main search ([#22535](https://github.com/MetaMask/metamask-mobile/pull/22535)) -- feat: extra details if single win in predict claim ([#22369](https://github.com/MetaMask/metamask-mobile/pull/22369)) -- feat: add analytics tracking for social login failures ([#22182](https://github.com/MetaMask/metamask-mobile/pull/22182)) -- feat: Implement part 1 of UniversalRouter for link-handling (deep links) ([#22453](https://github.com/MetaMask/metamask-mobile/pull/22453)) -- feat: Make Predict Charts Interactive ([#22402](https://github.com/MetaMask/metamask-mobile/pull/22402)) -- feat: add support to automatically upgrade account ([#22241](https://github.com/MetaMask/metamask-mobile/pull/22241)) -- feat: Enable automatic updates of preinstalled Snaps ([#22383](https://github.com/MetaMask/metamask-mobile/pull/22383)) -- feat: Support sponsored transactions through smart transactions ([#21932](https://github.com/MetaMask/metamask-mobile/pull/21932)) -- feat: Update points equations and details in Rewards ways to earn section cp-7.59.0 ([#22457](https://github.com/MetaMask/metamask-mobile/pull/22457)) -- feat: Improve Predict Activity UI ([#22331](https://github.com/MetaMask/metamask-mobile/pull/22331)) -- feat: updated currency switch clicked event for deposit and withdrawal screens ([#22286](https://github.com/MetaMask/metamask-mobile/pull/22286)) -- feat: update notification account settings to use BIP-44 designs ([#20307](https://github.com/MetaMask/metamask-mobile/pull/20307)) -- feat: metamask pay with send picker ([#22363](https://github.com/MetaMask/metamask-mobile/pull/22363)) -- feat: predict deposit account created metric ([#22366](https://github.com/MetaMask/metamask-mobile/pull/22366)) -- feat: update predict claim background ([#22348](https://github.com/MetaMask/metamask-mobile/pull/22348)) -- feat: support importing and ignoring non-evm tokens ([#22103](https://github.com/MetaMask/metamask-mobile/pull/22103)) -- feat: add logout button to BasicInfo error banner for Transak phone already registered error ([#22183](https://github.com/MetaMask/metamask-mobile/pull/22183)) -- feat: Implement LegacyLinkAdapter between old and new 'core' links ([#22202](https://github.com/MetaMask/metamask-mobile/pull/22202)) -- feat: calculate insufficientBal for quote requests ([#22312](https://github.com/MetaMask/metamask-mobile/pull/22312)) -- feat: Improve link-handling for internally-sourced links (carousel / in-app browser) ([#22012](https://github.com/MetaMask/metamask-mobile/pull/22012)) -- feat: implement eas updates ([#17431](https://github.com/MetaMask/metamask-mobile/pull/17431)) -- feat: add deeplink support for Predict markets ([#22258](https://github.com/MetaMask/metamask-mobile/pull/22258)) -- feat: Add geo-blocking analytics tracking ([#22126](https://github.com/MetaMask/metamask-mobile/pull/22126)) +- feat: previous season summary (#23329) +- feat: MUSD-108 Pre-select payment token for mUSD conversion flow (#23225) +- feat: add stop loss prompt banner to PerpsMarketDetailsView (#23325) +- feat: MUSD-108: Restrict payment tokens during mUSD conversion flow (#23216) +- feat: Remove nonce editing from Settings (#23031) +- feat: dark-theme friendly cronos logo (#23323) +- feat: render gas fees sponsored network and swap (#20878) +- feat: trust signals alerts on addresses and urls (#23167) +- feat: add trust signal middlware (#22800) +- feat: malicious token screening on transactions (#22688) +- feat: basic functionality toggle for trending (#23252) +- feat: track RPC update from network connection banner (#22879) +- feat: no point estimation when no active season (#23244) +- feat: [Trending] added support for refreshing + some code restructuring (#23250) +- feat: Throw error in Segment instead of Sentry Stop throwing error in Sentry when user tries to add a chain with unrecognized rpc url (#23075) +- feat: Add predefined recipient support to send flow (#23087) +- feat: add trending tokens search (#23036) +- feat: track analytics events for View All button clicks in NFT and Token lists (#23107) +- feat: sites section (#23163) +- feat: Bump deflation numbers to latest migration cp-7.60.0 (#23161) +- feat: enhance PerpsHomeView with new empty state and balance actions (#23086) +- feat: musd conversion optimizations (#23146) +- feat: [Trending] allow navigating to a website or search on google using the omnisearch and other minor improvements (#22872) +- feat: add musd conversion flow (#23060) +- feat: improve Predict withdrawal toast messaging (#23045) +- feat: add sentry logs for OTA updates (#22682) +- feat: refactor and fix invalid RPC URL error on paste (#22875) +- feat: cp-7.60.0 gas station support for metamask pay deposits (#23033) +- feat: OTA update exp workflow (#22168) +- feat: allow enroll rewards account in perps flows (#22918) +- feat: add trending tokens page (#22568) +- feat: update omni network and native token logo to nomina (#22816) +- feat: cp-7.60.0 reject duplicate metamask pay transactions (#22836) +- feat: Enhance AccountSelector with full-page layout and animations (#22797) +- feat: Add skeleton loading for the Send flow (#22853) +- feat: migrate features to new arch (#22675) +- feat: brwoser button (#22871) +- feat: cp-7.60.0 add new networks logo (#22929) +- feat: Open OS settings when push notifications are disabled (#22830) +- feat: allow add account predict flow (#22856) +- feat: Implement New migration failure detection cp-7.60.0 (#22757) +- feat: Start implement base link handlers for new universal link-router system (#22566) +- feat: cp-7.60.0 validate source amount in metamask pay (#22758) +- feat: introduce quick pick options in swap keypad (#22407) +- feat: allow add account in swap flow (#22718) +- feat: [Trending] make sections dynamic and restructure code part 2/2 (#22724) +- feat: Integrate season status hook in PerpsHeroCardView (#22768) +- feat: clicking src/dest swap flipper should invert token amounts from previosuly fetched quote (#22540) +- feat: EAS updates feature flag (#22036) +- feat: [Trending] quick actions and restructuring (1/2) (#22700) +- feat: ui experience enhancements in createpassword screen (#22687) +- feat: Add all entry points for Predict feed (#22659) +- feat: updated transaction details for predict claim and withdraw (#22370) +- feat: predict claim gas station (#22553) +- feat: rewards activity compatible with predict and deposit musd (#22636) +- feat: upgrade notification package and add Platform Notifications (#22539) +- feat: added powered by polymarket (#22637) +- feat: [Trending] add perps section (#22611) +- feat: update login screen rive animation (#21138) +- feat: add use-feature-flag (#22590) +- feat: trade confirmation redesign (#22384) +- feat: ways to earn musd deposits (#22620) +- feat: mcwp176 add auto tracking for related feature flags and override (#22023) +- feat: implement view all prediction (#22621) +- feat: update metamask pay same chain duration (#22629) +- feat: Implement `onAmountInput` for nonEVM send flow amount validations (#22389) +- feat: predict claim loader (#22368) +- feat: add hyperevm as additional network (#22459) +- feat: reward ways to earn for predict (#22609) +- feat: metamask pay buy button (#22367) +- feat: add cursor feature flag rule (#22520) +- feat: relay predict (#22509) +- feat: Predict GTM Modal (#22530) +- feat: eas updates initial setup (#22467) +- feat: Swaps tron integration (#21294) +- feat: Integrate Rewards with Predict (#22546) +- feat: trending main search (#22535) +- feat: extra details if single win in predict claim (#22369) +- feat: add analytics tracking for social login failures (#22182) +- feat: Implement part 1 of UniversalRouter for link-handling (deep links) (#22453) +- feat: Make Predict Charts Interactive (#22402) +- feat: add support to automatically upgrade account (#22241) +- feat: Enable automatic updates of preinstalled Snaps (#22383) +- feat: Support sponsored transactions through smart transactions (#21932) +- feat: Update points equations and details in Rewards ways to earn section cp-7.59.0 (#22457) +- feat: Improve Predict Activity UI (#22331) +- feat: updated currency switch clicked event for deposit and withdrawal screens (#22286) +- feat: update notification account settings to use BIP-44 designs (#20307) +- feat: metamask pay with send picker (#22363) +- feat: predict deposit account created metric (#22366) +- feat: update predict claim background (#22348) +- feat: support importing and ignoring non-evm tokens (#22103) +- feat: add logout button to BasicInfo error banner for Transak phone already registered error (#22183) +- feat: Implement LegacyLinkAdapter between old and new 'core' links (#22202) +- feat: calculate insufficientBal for quote requests (#22312) +- feat: Improve link-handling for internally-sourced links (carousel / in-app browser) (#22012) +- feat: implement eas updates (#17431) +- feat: add deeplink support for Predict markets (#22258) +- feat: Add geo-blocking analytics tracking (#22126) - feat: previous season summary (#23329) - feat: MUSD-108 Pre-select payment token for mUSD conversion flow (#23225) - feat: add stop loss prompt banner to PerpsMarketDetailsView (#23325) @@ -264,149 +482,149 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed -- fix: fix recipient account icons cp-7.60.0 ([#23362](https://github.com/MetaMask/metamask-mobile/pull/23362)) -- fix: Reset recipient when existing asset selected but new one picked ([#23312](https://github.com/MetaMask/metamask-mobile/pull/23312)) -- fix: update staking UI ([#23169](https://github.com/MetaMask/metamask-mobile/pull/23169)) -- fix: skip expo updates configuration in env e2e ([#23337](https://github.com/MetaMask/metamask-mobile/pull/23337)) -- fix: update logic to support all non-evm chains cp-7.60.0 ([#23328](https://github.com/MetaMask/metamask-mobile/pull/23328)) -- fix: cp-7.60.0 non-evm accounts not found ([#23318](https://github.com/MetaMask/metamask-mobile/pull/23318)) -- fix: bump bitcoin ([#23317](https://github.com/MetaMask/metamask-mobile/pull/23317)) -- fix: correct token/fiat toggle background ([#23228](https://github.com/MetaMask/metamask-mobile/pull/23228)) -- fix: cp-7.60.0 Generate correct blockchain explorer urls on bridge txs ([#23273](https://github.com/MetaMask/metamask-mobile/pull/23273)) -- fix: skip Snap account name ([#23221](https://github.com/MetaMask/metamask-mobile/pull/23221)) -- fix: SL-325: remove runAfterInteraction ([#22653](https://github.com/MetaMask/metamask-mobile/pull/22653)) -- fix: cp-7.60.0 remove max button from metamask pay deposits ([#23287](https://github.com/MetaMask/metamask-mobile/pull/23287)) -- fix: rework right back button in send flow when navigating from asset overview ([#23144](https://github.com/MetaMask/metamask-mobile/pull/23144)) -- fix: Fix MM Connect resuming of sessions before NetworkController state is available for BackgroundBridge ([#22749](https://github.com/MetaMask/metamask-mobile/pull/22749)) -- fix: cp-7.59.1 cp-7.60.0 add mon to the currency list ([#23269](https://github.com/MetaMask/metamask-mobile/pull/23269)) -- fix: cp-7.60.0 staked eth balances show first account staked balance across accounts ([#23257](https://github.com/MetaMask/metamask-mobile/pull/23257)) -- fix: cp-7.60.0 set default balances polling ([#23253](https://github.com/MetaMask/metamask-mobile/pull/23253)) -- fix: cp-7.60.0 predict withdraw using gas station ([#23255](https://github.com/MetaMask/metamask-mobile/pull/23255)) -- fix: cp-7.60.0 alerts persisting in metamask pay ([#23240](https://github.com/MetaMask/metamask-mobile/pull/23240)) -- fix: cp-7.60.0 gas station with metamask pay if send bundle supported ([#23219](https://github.com/MetaMask/metamask-mobile/pull/23219)) -- fix: revert version number ([#23217](https://github.com/MetaMask/metamask-mobile/pull/23217)) -- fix: cp-7.60.0 perps deposit activity filtering ([#23158](https://github.com/MetaMask/metamask-mobile/pull/23158)) -- fix: cp-7.60.0 predict withdraw value in activity ([#23156](https://github.com/MetaMask/metamask-mobile/pull/23156)) -- fix: update setSelectedAccount to set the account group ([#22120](https://github.com/MetaMask/metamask-mobile/pull/22120)) -- fix: cp-7.60.0 Fix address validation for Tron ([#23172](https://github.com/MetaMask/metamask-mobile/pull/23172)) -- fix: cp-7.60.0 predict claim button style ([#23153](https://github.com/MetaMask/metamask-mobile/pull/23153)) -- fix: cp-7.60.0 automatic highest balance token in metamask pay ([#23152](https://github.com/MetaMask/metamask-mobile/pull/23152)) -- fix: cp-7.60.0 infinite loader in metamask pay ([#23150](https://github.com/MetaMask/metamask-mobile/pull/23150)) -- fix: fix unknown chain icon display issue in permissions ([#21914](https://github.com/MetaMask/metamask-mobile/pull/21914)) -- fix: cp-7.60.0 keyboard in metamask pay asset picker ([#23148](https://github.com/MetaMask/metamask-mobile/pull/23148)) -- fix: cp-7.60.0 no quotes alert message ([#23120](https://github.com/MetaMask/metamask-mobile/pull/23120)) -- fix: earn banner border and background are wrong colors ([#22275](https://github.com/MetaMask/metamask-mobile/pull/22275)) -- fix: add staked energy and staked bandwidth to nontradabletokens list cp-7.60.0 ([#23128](https://github.com/MetaMask/metamask-mobile/pull/23128)) -- fix: cp-7.60.0 patch TokenBalancesController to resolve missing aggregated balance ([#23113](https://github.com/MetaMask/metamask-mobile/pull/23113)) -- fix: cp-7.60.0 bump tron 1.10 ([#23106](https://github.com/MetaMask/metamask-mobile/pull/23106)) -- fix: add logic to compute the correct non-EVM network image source using `getNetworkImageSource` ([#23089](https://github.com/MetaMask/metamask-mobile/pull/23089)) -- fix: Implement nonEVM zero balance check to send flow before `onAmountInput` ([#23037](https://github.com/MetaMask/metamask-mobile/pull/23037)) -- fix: add badge to bridge activity list entries cp-7.60.0 ([#23076](https://github.com/MetaMask/metamask-mobile/pull/23076)) -- fix: start animate when rive onPlay ( ready ) cp-7.60.0 ([#22982](https://github.com/MetaMask/metamask-mobile/pull/22982)) -- fix: remove GNS logic from network selection and use enabled network state ([#22838](https://github.com/MetaMask/metamask-mobile/pull/22838)) -- fix: cp-7.60.0 use correct chainId collectibles for nft send flow ([#22966](https://github.com/MetaMask/metamask-mobile/pull/22966)) -- fix: ubuntu-latest instead of cirrus ([#23050](https://github.com/MetaMask/metamask-mobile/pull/23050)) -- fix: hard code remove GNS feature flag ([#22961](https://github.com/MetaMask/metamask-mobile/pull/22961)) -- fix: invalid id in bug report template ([#23047](https://github.com/MetaMask/metamask-mobile/pull/23047)) -- fix: cp-7.60.0 bump transaction controller and transaction pay controller versions ([#23029](https://github.com/MetaMask/metamask-mobile/pull/23029)) -- fix: cp-7.60.0 filter out tron staked tokens from send flow ([#22979](https://github.com/MetaMask/metamask-mobile/pull/22979)) -- fix: cp-7.60.0 show all blocking alerts if keyboard not visible ([#22837](https://github.com/MetaMask/metamask-mobile/pull/22837)) -- fix: cp-7.60.0 predict withdraw with missing token ([#22908](https://github.com/MetaMask/metamask-mobile/pull/22908)) -- fix: cp-7.60.0 predict deposit layout ([#22937](https://github.com/MetaMask/metamask-mobile/pull/22937)) -- fix: increase Node.js heap size for iOS bundle generation in CI ([#22971](https://github.com/MetaMask/metamask-mobile/pull/22971)) -- fix: remove crypto compare fallback ([#22772](https://github.com/MetaMask/metamask-mobile/pull/22772)) -- fix: SL-296: handle on biometric cancel - cp-7.60.0 ([#22774](https://github.com/MetaMask/metamask-mobile/pull/22774)) -- fix: loading issues in asset details page ([#22916](https://github.com/MetaMask/metamask-mobile/pull/22916)) -- fix: cp-7.60.0 block metamask pay if submitted transaction ([#22904](https://github.com/MetaMask/metamask-mobile/pull/22904)) -- fix: validate selected internal account address format in Asset component cp-7.60.0 ([#22870](https://github.com/MetaMask/metamask-mobile/pull/22870)) -- fix: cp-7.60.0 fix metamask pay totals ([#22829](https://github.com/MetaMask/metamask-mobile/pull/22829)) -- fix: cp-7.60.0 target network fee alert in metamask pay ([#22839](https://github.com/MetaMask/metamask-mobile/pull/22839)) -- fix: various swaps UI discrepancies ([#22717](https://github.com/MetaMask/metamask-mobile/pull/22717)) -- fix: SL-323: login screen design fixes ([#22781](https://github.com/MetaMask/metamask-mobile/pull/22781)) -- fix: only mainnet eth should be stakable cp-7.60.0 ([#22778](https://github.com/MetaMask/metamask-mobile/pull/22778)) -- fix: scrolling issue in asset list prevents rendering bottom assets ([#22792](https://github.com/MetaMask/metamask-mobile/pull/22792)) -- fix: cp-7.60.0 hide metamask pay transaction notifications ([#22794](https://github.com/MetaMask/metamask-mobile/pull/22794)) -- fix: add resync mechanism to sync Snap accounts states with client accounts cp-7.60.0 ([#22649](https://github.com/MetaMask/metamask-mobile/pull/22649)) -- fix: fix carousel design ([#22805](https://github.com/MetaMask/metamask-mobile/pull/22805)) -- fix: cp-7.60.0 hide monad from supported networks in boost cards ([#22835](https://github.com/MetaMask/metamask-mobile/pull/22835)) -- fix: add delay before revoke tokens ([#22769](https://github.com/MetaMask/metamask-mobile/pull/22769)) -- fix: Decrease threshold before RPC failover is activated ([#21432](https://github.com/MetaMask/metamask-mobile/pull/21432)) -- fix: cp-7.60.0 bump bitcoin ([#22803](https://github.com/MetaMask/metamask-mobile/pull/22803)) -- fix: cp-7.60.0 predict confirmation design ([#22745](https://github.com/MetaMask/metamask-mobile/pull/22745)) -- fix: swaps amount truncation and received tokens action key ([#22705](https://github.com/MetaMask/metamask-mobile/pull/22705)) -- fix: useEffect infinity loop in SimpleWebview ([#22534](https://github.com/MetaMask/metamask-mobile/pull/22534)) -- fix: cp-7.59.0 Fix layout of small devices in asset amount ([#22703](https://github.com/MetaMask/metamask-mobile/pull/22703)) -- fix: Pass provider param to ChoosePassword page ([#22695](https://github.com/MetaMask/metamask-mobile/pull/22695)) -- fix: validate insufficient balance for bridges ([#22481](https://github.com/MetaMask/metamask-mobile/pull/22481)) -- fix: getGenericPassword errors ([#22523](https://github.com/MetaMask/metamask-mobile/pull/22523)) -- fix: transition to BIP-44 selectors for rewards row cp-7.59.0 ([#22742](https://github.com/MetaMask/metamask-mobile/pull/22742)) -- fix: prevent concurrency for `createAccount` for Snap account providers cp-7.59.0 ([#22719](https://github.com/MetaMask/metamask-mobile/pull/22719)) -- fix: Fix Predict Navigation to Cash Out and Single Market ([#22711](https://github.com/MetaMask/metamask-mobile/pull/22711)) -- fix: onboarding rehydrate tracking ([#22686](https://github.com/MetaMask/metamask-mobile/pull/22686)) -- fix: Remove raised amount error when value deleted on fiat mode ([#22529](https://github.com/MetaMask/metamask-mobile/pull/22529)) -- fix: cp-7.59.0 Fix submit loading for nonEVM send transactions ([#22697](https://github.com/MetaMask/metamask-mobile/pull/22697)) -- fix: remove browser navigation on account click when in initial connection flow ([#22604](https://github.com/MetaMask/metamask-mobile/pull/22604)) -- fix: Change to available fiat value text when fiat mode is enabled ([#22541](https://github.com/MetaMask/metamask-mobile/pull/22541)) -- fix: switching networks from dapp permissions dapp icon has no effect ([#22692](https://github.com/MetaMask/metamask-mobile/pull/22692)) -- fix: trim whitespace from amount input in PaymentRequest component ([#22608](https://github.com/MetaMask/metamask-mobile/pull/22608)) -- fix: code cleanup ([#22648](https://github.com/MetaMask/metamask-mobile/pull/22648)) -- fix: asset value metric in metamask pay ([#22645](https://github.com/MetaMask/metamask-mobile/pull/22645)) -- fix: handle swipe in confirmations on android ([#22638](https://github.com/MetaMask/metamask-mobile/pull/22638)) -- fix: Exclude token transfers from marking them as a swap tx cp-7.59.0 ([#22607](https://github.com/MetaMask/metamask-mobile/pull/22607)) -- fix: pay hide testnet assets in metamask pay ([#22619](https://github.com/MetaMask/metamask-mobile/pull/22619)) -- fix: ui issues ([#22605](https://github.com/MetaMask/metamask-mobile/pull/22605)) -- fix: run discovery and alignment upon unlock for all wallets cp-7.59.0 ([#22598](https://github.com/MetaMask/metamask-mobile/pull/22598)) -- fix: send transaction copy ([#22109](https://github.com/MetaMask/metamask-mobile/pull/22109)) -- fix: cp-7.59.0 fix perps flow when solana is selected ([#22588](https://github.com/MetaMask/metamask-mobile/pull/22588)) -- fix: swaps navigation issue when changing source token ([#22545](https://github.com/MetaMask/metamask-mobile/pull/22545)) -- fix: add prediction carousel ([#22537](https://github.com/MetaMask/metamask-mobile/pull/22537)) -- fix: cp-7.59.0 bump bitcoin ([#22557](https://github.com/MetaMask/metamask-mobile/pull/22557)) -- fix: invalid QR code showing alert multiple times ([#22292](https://github.com/MetaMask/metamask-mobile/pull/22292)) -- fix: add specific error message for duplicate SRP imports ([#22536](https://github.com/MetaMask/metamask-mobile/pull/22536)) -- fix: asset picker scroll in metamask pay on android ([#22525](https://github.com/MetaMask/metamask-mobile/pull/22525)) -- fix: Add PPOM validation for deeplink requests ([#22473](https://github.com/MetaMask/metamask-mobile/pull/22473)) -- fix: Prevent recipient input to show multiline for selected address ([#22392](https://github.com/MetaMask/metamask-mobile/pull/22392)) -- fix: max predict withdraw ([#22350](https://github.com/MetaMask/metamask-mobile/pull/22350)) -- fix: cp-7.59.0 unconfirmed status styling ([#22316](https://github.com/MetaMask/metamask-mobile/pull/22316)) -- fix: New Persistence Improvements based on Abuse testing cp-7.59.0 ([#21990](https://github.com/MetaMask/metamask-mobile/pull/21990)) -- fix: correct alignment of header ([#22456](https://github.com/MetaMask/metamask-mobile/pull/22456)) -- fix: array reference being reused ([#22480](https://github.com/MetaMask/metamask-mobile/pull/22480)) -- fix: bug 22375 ([#22382](https://github.com/MetaMask/metamask-mobile/pull/22382)) -- fix: safe area in full screen confirmations ([#22365](https://github.com/MetaMask/metamask-mobile/pull/22365)) -- fix: cp-7.59.0 Update minimum BTC amount ([#22401](https://github.com/MetaMask/metamask-mobile/pull/22401)) -- fix: cp-7.59.0 remove dex prefix for hip3 asset display ([#22461](https://github.com/MetaMask/metamask-mobile/pull/22461)) -- fix: cp-7.59.0 remove hip-3 stocks list all filter ([#22462](https://github.com/MetaMask/metamask-mobile/pull/22462)) -- fix: pressability measureAsyncOnUI only running on Android cp-7.58.2 ([#22436](https://github.com/MetaMask/metamask-mobile/pull/22436)) -- fix: use correct order for BTC network and fees cp-7.59.0 ([#22244](https://github.com/MetaMask/metamask-mobile/pull/22244)) -- fix: PerpsMarketList navigation, and performance optimizations in TabList cp-7.59.0 ([#22341](https://github.com/MetaMask/metamask-mobile/pull/22341)) -- fix: use METAMASK_ENVIRONMENT instead of NODE_ENV ([#22282](https://github.com/MetaMask/metamask-mobile/pull/22282)) -- fix: Consider client active once it is open and unlocked ([#22385](https://github.com/MetaMask/metamask-mobile/pull/22385)) -- fix: hide predict deposit incoming transactions ([#22371](https://github.com/MetaMask/metamask-mobile/pull/22371)) -- fix: cp-7.59.0 fix display tabs based on selected networks ([#22372](https://github.com/MetaMask/metamask-mobile/pull/22372)) -- fix: disable fingerprint, repack, cache restore for Android E2E & revert Expo Updates cp-7.59.0 ([#22349](https://github.com/MetaMask/metamask-mobile/pull/22349)) -- fix: trigger rewards animation value update on state transition cp-7.59.0 ([#22351](https://github.com/MetaMask/metamask-mobile/pull/22351)) -- fix: fix MM Connect account switching via homepage account selector ([#22163](https://github.com/MetaMask/metamask-mobile/pull/22163)) -- fix: cp-7.59.0 fix crash when hiding token on token details in android ([#22327](https://github.com/MetaMask/metamask-mobile/pull/22327)) -- fix: metaMetrics not tracking events for social login users ([#22259](https://github.com/MetaMask/metamask-mobile/pull/22259)) -- fix: skip inserting EAS update config in dev ([#22273](https://github.com/MetaMask/metamask-mobile/pull/22273)) -- fix: cp-7.59.0 market list open interest sort ([#22294](https://github.com/MetaMask/metamask-mobile/pull/22294)) -- fix: back arrow perps home should always navigate to wallet home cp-7.59.0 ([#22288](https://github.com/MetaMask/metamask-mobile/pull/22288)) -- fix: Toast component theme reactivity in production builds cp-7.59.0 ([#22291](https://github.com/MetaMask/metamask-mobile/pull/22291)) -- fix: Updated tabsbar to update when font size pref changes ([#22208](https://github.com/MetaMask/metamask-mobile/pull/22208)) -- fix: cp-7.59.0 hotfix-7.58.2 update close position calculation with funding fees and live data ([#22229](https://github.com/MetaMask/metamask-mobile/pull/22229)) -- fix: btc account selection during btc network change cp-7.59.0 ([#22328](https://github.com/MetaMask/metamask-mobile/pull/22328)) -- fix: re order migrations 105, 106, 107 cp-7.59.0 ([#22276](https://github.com/MetaMask/metamask-mobile/pull/22276)) -- fix: hide trending and show browser when ff is false ([#22209](https://github.com/MetaMask/metamask-mobile/pull/22209)) -- fix: cp-7.59.0 ensure that txs show on asset details page ([#22285](https://github.com/MetaMask/metamask-mobile/pull/22285)) -- fix: Update Ledger support link to the correct article ([#22297](https://github.com/MetaMask/metamask-mobile/pull/22297)) -- fix: add load tests for assets ([#21912](https://github.com/MetaMask/metamask-mobile/pull/21912)) -- fix: cp-7.59.0 Fix minimum BTC amount validation in send flow ([#22245](https://github.com/MetaMask/metamask-mobile/pull/22245)) -- fix: navigate users directly to blockchaine explorer on Solana swaps ([#22048](https://github.com/MetaMask/metamask-mobile/pull/22048)) -- fix: user interface descriepenses ([#21938](https://github.com/MetaMask/metamask-mobile/pull/21938)) -- fix: backdrop press on edit rpc bottom sheets ([#22098](https://github.com/MetaMask/metamask-mobile/pull/22098)) -- fix: 20839 fix the qr name not matched in swap page. ([#22043](https://github.com/MetaMask/metamask-mobile/pull/22043)) -- fix: cp-7.59.0 Return empty contacts for nonEVM send flow ([#22235](https://github.com/MetaMask/metamask-mobile/pull/22235)) -- fix: styling for backup and sync toggle. ([#22128](https://github.com/MetaMask/metamask-mobile/pull/22128)) +- fix: fix recipient account icons cp-7.60.0 (#23362) +- fix: Reset recipient when existing asset selected but new one picked (#23312) +- fix: update staking UI (#23169) +- fix: skip expo updates configuration in env e2e (#23337) +- fix: update logic to support all non-evm chains cp-7.60.0 (#23328) +- fix: cp-7.60.0 non-evm accounts not found (#23318) +- fix: bump bitcoin (#23317) +- fix: correct token/fiat toggle background (#23228) +- fix: cp-7.60.0 Generate correct blockchain explorer urls on bridge txs (#23273) +- fix: skip Snap account name (#23221) +- fix: SL-325: remove runAfterInteraction (#22653) +- fix: cp-7.60.0 remove max button from metamask pay deposits (#23287) +- fix: rework right back button in send flow when navigating from asset overview (#23144) +- fix: Fix MM Connect resuming of sessions before NetworkController state is available for BackgroundBridge (#22749) +- fix: cp-7.59.1 cp-7.60.0 add mon to the currency list (#23269) +- fix: cp-7.60.0 staked eth balances show first account staked balance across accounts (#23257) +- fix: cp-7.60.0 set default balances polling (#23253) +- fix: cp-7.60.0 predict withdraw using gas station (#23255) +- fix: cp-7.60.0 alerts persisting in metamask pay (#23240) +- fix: cp-7.60.0 gas station with metamask pay if send bundle supported (#23219) +- fix: revert version number (#23217) +- fix: cp-7.60.0 perps deposit activity filtering (#23158) +- fix: cp-7.60.0 predict withdraw value in activity (#23156) +- fix: update setSelectedAccount to set the account group (#22120) +- fix: cp-7.60.0 Fix address validation for Tron (#23172) +- fix: cp-7.60.0 predict claim button style (#23153) +- fix: cp-7.60.0 automatic highest balance token in metamask pay (#23152) +- fix: cp-7.60.0 infinite loader in metamask pay (#23150) +- fix: fix unknown chain icon display issue in permissions (#21914) +- fix: cp-7.60.0 keyboard in metamask pay asset picker (#23148) +- fix: cp-7.60.0 no quotes alert message (#23120) +- fix: earn banner border and background are wrong colors (#22275) +- fix: add staked energy and staked bandwidth to nontradabletokens list cp-7.60.0 (#23128) +- fix: cp-7.60.0 patch TokenBalancesController to resolve missing aggregated balance (#23113) +- fix: cp-7.60.0 bump tron 1.10 (#23106) +- fix: add logic to compute the correct non-EVM network image source using `getNetworkImageSource` (#23089) +- fix: Implement nonEVM zero balance check to send flow before `onAmountInput` (#23037) +- fix: add badge to bridge activity list entries cp-7.60.0 (#23076) +- fix: start animate when rive onPlay ( ready ) cp-7.60.0 (#22982) +- fix: remove GNS logic from network selection and use enabled network state (#22838) +- fix: cp-7.60.0 use correct chainId collectibles for nft send flow (#22966) +- fix: ubuntu-latest instead of cirrus (#23050) +- fix: hard code remove GNS feature flag (#22961) +- fix: invalid id in bug report template (#23047) +- fix: cp-7.60.0 bump transaction controller and transaction pay controller versions (#23029) +- fix: cp-7.60.0 filter out tron staked tokens from send flow (#22979) +- fix: cp-7.60.0 show all blocking alerts if keyboard not visible (#22837) +- fix: cp-7.60.0 predict withdraw with missing token (#22908) +- fix: cp-7.60.0 predict deposit layout (#22937) +- fix: increase Node.js heap size for iOS bundle generation in CI (#22971) +- fix: remove crypto compare fallback (#22772) +- fix: SL-296: handle on biometric cancel - cp-7.60.0 (#22774) +- fix: loading issues in asset details page (#22916) +- fix: cp-7.60.0 block metamask pay if submitted transaction (#22904) +- fix: validate selected internal account address format in Asset component cp-7.60.0 (#22870) +- fix: cp-7.60.0 fix metamask pay totals (#22829) +- fix: cp-7.60.0 target network fee alert in metamask pay (#22839) +- fix: various swaps UI discrepancies (#22717) +- fix: SL-323: login screen design fixes (#22781) +- fix: only mainnet eth should be stakable cp-7.60.0 (#22778) +- fix: scrolling issue in asset list prevents rendering bottom assets (#22792) +- fix: cp-7.60.0 hide metamask pay transaction notifications (#22794) +- fix: add resync mechanism to sync Snap accounts states with client accounts cp-7.60.0 (#22649) +- fix: fix carousel design (#22805) +- fix: cp-7.60.0 hide monad from supported networks in boost cards (#22835) +- fix: add delay before revoke tokens (#22769) +- fix: Decrease threshold before RPC failover is activated (#21432) +- fix: cp-7.60.0 bump bitcoin (#22803) +- fix: cp-7.60.0 predict confirmation design (#22745) +- fix: swaps amount truncation and received tokens action key (#22705) +- fix: useEffect infinity loop in SimpleWebview (#22534) +- fix: cp-7.59.0 Fix layout of small devices in asset amount (#22703) +- fix: Pass provider param to ChoosePassword page (#22695) +- fix: validate insufficient balance for bridges (#22481) +- fix: getGenericPassword errors (#22523) +- fix: transition to BIP-44 selectors for rewards row cp-7.59.0 (#22742) +- fix: prevent concurrency for `createAccount` for Snap account providers cp-7.59.0 (#22719) +- fix: Fix Predict Navigation to Cash Out and Single Market (#22711) +- fix: onboarding rehydrate tracking (#22686) +- fix: Remove raised amount error when value deleted on fiat mode (#22529) +- fix: cp-7.59.0 Fix submit loading for nonEVM send transactions (#22697) +- fix: remove browser navigation on account click when in initial connection flow (#22604) +- fix: Change to available fiat value text when fiat mode is enabled (#22541) +- fix: switching networks from dapp permissions dapp icon has no effect (#22692) +- fix: trim whitespace from amount input in PaymentRequest component (#22608) +- fix: code cleanup (#22648) +- fix: asset value metric in metamask pay (#22645) +- fix: handle swipe in confirmations on android (#22638) +- fix: Exclude token transfers from marking them as a swap tx cp-7.59.0 (#22607) +- fix: pay hide testnet assets in metamask pay (#22619) +- fix: ui issues (#22605) +- fix: run discovery and alignment upon unlock for all wallets cp-7.59.0 (#22598) +- fix: send transaction copy (#22109) +- fix: cp-7.59.0 fix perps flow when solana is selected (#22588) +- fix: swaps navigation issue when changing source token (#22545) +- fix: add prediction carousel (#22537) +- fix: cp-7.59.0 bump bitcoin (#22557) +- fix: invalid QR code showing alert multiple times (#22292) +- fix: add specific error message for duplicate SRP imports (#22536) +- fix: asset picker scroll in metamask pay on android (#22525) +- fix: Add PPOM validation for deeplink requests (#22473) +- fix: Prevent recipient input to show multiline for selected address (#22392) +- fix: max predict withdraw (#22350) +- fix: cp-7.59.0 unconfirmed status styling (#22316) +- fix: New Persistence Improvements based on Abuse testing cp-7.59.0 (#21990) +- fix: correct alignment of header (#22456) +- fix: array reference being reused (#22480) +- fix: bug 22375 (#22382) +- fix: safe area in full screen confirmations (#22365) +- fix: cp-7.59.0 Update minimum BTC amount (#22401) +- fix: cp-7.59.0 remove dex prefix for hip3 asset display (#22461) +- fix: cp-7.59.0 remove hip-3 stocks list all filter (#22462) +- fix: pressability measureAsyncOnUI only running on Android cp-7.58.2 (#22436) +- fix: use correct order for BTC network and fees cp-7.59.0 (#22244) +- fix: PerpsMarketList navigation, and performance optimizations in TabList cp-7.59.0 (#22341) +- fix: use METAMASK_ENVIRONMENT instead of NODE_ENV (#22282) +- fix: Consider client active once it is open and unlocked (#22385) +- fix: hide predict deposit incoming transactions (#22371) +- fix: cp-7.59.0 fix display tabs based on selected networks (#22372) +- fix: disable fingerprint, repack, cache restore for Android E2E & revert Expo Updates cp-7.59.0 (#22349) +- fix: trigger rewards animation value update on state transition cp-7.59.0 (#22351) +- fix: fix MM Connect account switching via homepage account selector (#22163) +- fix: cp-7.59.0 fix crash when hiding token on token details in android (#22327) +- fix: metaMetrics not tracking events for social login users (#22259) +- fix: skip inserting EAS update config in dev (#22273) +- fix: cp-7.59.0 market list open interest sort (#22294) +- fix: back arrow perps home should always navigate to wallet home cp-7.59.0 (#22288) +- fix: Toast component theme reactivity in production builds cp-7.59.0 (#22291) +- fix: Updated tabsbar to update when font size pref changes (#22208) +- fix: cp-7.59.0 hotfix-7.58.2 update close position calculation with funding fees and live data (#22229) +- fix: btc account selection during btc network change cp-7.59.0 (#22328) +- fix: re order migrations 105, 106, 107 cp-7.59.0 (#22276) +- fix: hide trending and show browser when ff is false (#22209) +- fix: cp-7.59.0 ensure that txs show on asset details page (#22285) +- fix: Update Ledger support link to the correct article (#22297) +- fix: add load tests for assets (#21912) +- fix: cp-7.59.0 Fix minimum BTC amount validation in send flow (#22245) +- fix: navigate users directly to blockchaine explorer on Solana swaps (#22048) +- fix: user interface descriepenses (#21938) +- fix: backdrop press on edit rpc bottom sheets (#22098) +- fix: 20839 fix the qr name not matched in swap page. (#22043) +- fix: cp-7.59.0 Return empty contacts for nonEVM send flow (#22235) +- fix: styling for backup and sync toggle. (#22128) - fix: fix recipient account icons cp-7.60.0 (#23362) - fix: Reset recipient when existing asset selected but new one picked (#23312) - fix: update staking UI (#23169) @@ -556,140 +774,140 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed -- chore(runway): cherry-pick feat: add megaeth to additional networks ([#23599](https://github.com/MetaMask/metamask-mobile/pull/23599)) -- chore(runway): cherry-pick fix: select megaeth when all popular network selected cp-7.60.3 ([#23609](https://github.com/MetaMask/metamask-mobile/pull/23609)) -- chore(runway): cherry-pick fix: Prevent interstitial from appearing on barebones deeplinks ([#23651](https://github.com/MetaMask/metamask-mobile/pull/23651)) -- chore(runway): cherry-pick chore: Bypass interstitial modal for URLs that originate from within app ([#23631](https://github.com/MetaMask/metamask-mobile/pull/23631)) -- chore(runway): cherry-pick chore: Fix to only bypass 'Redirect' modal for in-app signed links ([#23702](https://github.com/MetaMask/metamask-mobile/pull/23702)) +- chore(runway): cherry-pick feat: add megaeth to additional networks (#23599) +- chore(runway): cherry-pick fix: select megaeth when all popular network selected cp-7.60.3 (#23609) +- chore(runway): cherry-pick fix: Prevent interstitial from appearing on barebones deeplinks (#23651) +- chore(runway): cherry-pick chore: Bypass interstitial modal for URLs that originate from within app (#23631) +- chore(runway): cherry-pick chore: Fix to only bypass 'Redirect' modal for in-app signed links (#23702) ## [7.60.2] ### Fixed -- chore(runway): cherry-pick fix: cp-7.60.2 overwrite account upgrade in metamask pay ([#23542](https://github.com/MetaMask/metamask-mobile/pull/23542)) -- chore(runway): cherry-pick feat(predict): cp-7.60.2 add auto-refresh polling when country is missing ([#23518](https://github.com/MetaMask/metamask-mobile/pull/23518)) +- chore(runway): cherry-pick fix: cp-7.60.2 overwrite account upgrade in metamask pay (#23542) +- chore(runway): cherry-pick feat(predict): cp-7.60.2 add auto-refresh polling when country is missing (#23518) ## [7.60.1] ### Fixed -- chore(runway): cherry-pick fix: bump bitcoin ([#23493](https://github.com/MetaMask/metamask-mobile/pull/23493)) +- chore(runway): cherry-pick fix: bump bitcoin (#23493) ## [7.60.0] ### Added -- feat: Add all entry points for Predict feed ([#22659](https://github.com/MetaMask/metamask-mobile/pull/22659)) -- feat: updated transaction details for predict claim and withdraw ([#22370](https://github.com/MetaMask/metamask-mobile/pull/22370)) -- feat: predict claim gas station ([#22553](https://github.com/MetaMask/metamask-mobile/pull/22553)) -- feat: rewards activity compatible with predict and deposit musd ([#22636](https://github.com/MetaMask/metamask-mobile/pull/22636)) -- feat: upgrade notification package and add Platform Notifications ([#22539](https://github.com/MetaMask/metamask-mobile/pull/22539)) -- feat: added powered by polymarket ([#22637](https://github.com/MetaMask/metamask-mobile/pull/22637)) -- feat: [Trending] add perps section ([#22611](https://github.com/MetaMask/metamask-mobile/pull/22611)) -- feat: update login screen rive animation ([#21138](https://github.com/MetaMask/metamask-mobile/pull/21138)) -- feat: add use-feature-flag ([#22590](https://github.com/MetaMask/metamask-mobile/pull/22590)) -- feat: trade confirmation redesign ([#22384](https://github.com/MetaMask/metamask-mobile/pull/22384)) -- feat: ways to earn musd deposits ([#22620](https://github.com/MetaMask/metamask-mobile/pull/22620)) -- feat: mcwp176 add auto tracking for related feature flags and override ([#22023](https://github.com/MetaMask/metamask-mobile/pull/22023)) -- feat: implement view all prediction ([#22621](https://github.com/MetaMask/metamask-mobile/pull/22621)) -- feat: update metamask pay same chain duration ([#22629](https://github.com/MetaMask/metamask-mobile/pull/22629)) -- feat: Implement `onAmountInput` for nonEVM send flow amount validations ([#22389](https://github.com/MetaMask/metamask-mobile/pull/22389)) -- feat: predict claim loader ([#22368](https://github.com/MetaMask/metamask-mobile/pull/22368)) -- feat: add hyperevm as additional network ([#22459](https://github.com/MetaMask/metamask-mobile/pull/22459)) -- feat: reward ways to earn for predict ([#22609](https://github.com/MetaMask/metamask-mobile/pull/22609)) -- feat: metamask pay buy button ([#22367](https://github.com/MetaMask/metamask-mobile/pull/22367)) -- feat: add cursor feature flag rule ([#22520](https://github.com/MetaMask/metamask-mobile/pull/22520)) -- feat: relay predict ([#22509](https://github.com/MetaMask/metamask-mobile/pull/22509)) -- feat: Predict GTM Modal ([#22530](https://github.com/MetaMask/metamask-mobile/pull/22530)) -- feat: eas updates initial setup ([#22467](https://github.com/MetaMask/metamask-mobile/pull/22467)) -- feat: Swaps tron integration ([#21294](https://github.com/MetaMask/metamask-mobile/pull/21294)) -- feat: Integrate Rewards with Predict ([#22546](https://github.com/MetaMask/metamask-mobile/pull/22546)) -- feat: trending main search ([#22535](https://github.com/MetaMask/metamask-mobile/pull/22535)) -- feat: extra details if single win in predict claim ([#22369](https://github.com/MetaMask/metamask-mobile/pull/22369)) -- feat: add analytics tracking for social login failures ([#22182](https://github.com/MetaMask/metamask-mobile/pull/22182)) -- feat: Implement part 1 of UniversalRouter for link-handling (deep links) ([#22453](https://github.com/MetaMask/metamask-mobile/pull/22453)) -- feat: Make Predict Charts Interactive ([#22402](https://github.com/MetaMask/metamask-mobile/pull/22402)) -- feat: add support to automatically upgrade account ([#22241](https://github.com/MetaMask/metamask-mobile/pull/22241)) -- feat: Enable automatic updates of preinstalled Snaps ([#22383](https://github.com/MetaMask/metamask-mobile/pull/22383)) -- feat: Support sponsored transactions through smart transactions ([#21932](https://github.com/MetaMask/metamask-mobile/pull/21932)) -- feat: Update points equations and details in Rewards ways to earn section cp-7.59.0 ([#22457](https://github.com/MetaMask/metamask-mobile/pull/22457)) -- feat: Improve Predict Activity UI ([#22331](https://github.com/MetaMask/metamask-mobile/pull/22331)) -- feat: updated currency switch clicked event for deposit and withdrawal screens ([#22286](https://github.com/MetaMask/metamask-mobile/pull/22286)) -- feat: update notification account settings to use BIP-44 designs ([#20307](https://github.com/MetaMask/metamask-mobile/pull/20307)) -- feat: metamask pay with send picker ([#22363](https://github.com/MetaMask/metamask-mobile/pull/22363)) -- feat: predict deposit account created metric ([#22366](https://github.com/MetaMask/metamask-mobile/pull/22366)) -- feat: update predict claim background ([#22348](https://github.com/MetaMask/metamask-mobile/pull/22348)) -- feat: support importing and ignoring non-evm tokens ([#22103](https://github.com/MetaMask/metamask-mobile/pull/22103)) -- feat: add logout button to BasicInfo error banner for Transak phone already registered error ([#22183](https://github.com/MetaMask/metamask-mobile/pull/22183)) -- feat: Implement LegacyLinkAdapter between old and new 'core' links ([#22202](https://github.com/MetaMask/metamask-mobile/pull/22202)) -- feat: calculate insufficientBal for quote requests ([#22312](https://github.com/MetaMask/metamask-mobile/pull/22312)) -- feat: Improve link-handling for internally-sourced links (carousel / in-app browser) ([#22012](https://github.com/MetaMask/metamask-mobile/pull/22012)) -- feat: implement eas updates ([#17431](https://github.com/MetaMask/metamask-mobile/pull/17431)) -- feat: add deeplink support for Predict markets ([#22258](https://github.com/MetaMask/metamask-mobile/pull/22258)) -- feat: Add geo-blocking analytics tracking ([#22126](https://github.com/MetaMask/metamask-mobile/pull/22126)) - -### Fixed - -- fix: cp-7.59.1 cp-7.60.0 add mon to the currency list (#23269) ([#23269](https://github.com/MetaMask/metamask-mobile/pull/23269)) -- fix: trim whitespace from amount input in PaymentRequest component ([#22608](https://github.com/MetaMask/metamask-mobile/pull/22608)) -- fix: code cleanup ([#22648](https://github.com/MetaMask/metamask-mobile/pull/22648)) -- fix: asset value metric in metamask pay ([#22645](https://github.com/MetaMask/metamask-mobile/pull/22645)) -- fix: handle swipe in confirmations on android ([#22638](https://github.com/MetaMask/metamask-mobile/pull/22638)) -- fix: Exclude token transfers from marking them as a swap tx cp-7.59.0 ([#22607](https://github.com/MetaMask/metamask-mobile/pull/22607)) -- fix: pay hide testnet assets in metamask pay ([#22619](https://github.com/MetaMask/metamask-mobile/pull/22619)) -- fix: ui issues ([#22605](https://github.com/MetaMask/metamask-mobile/pull/22605)) -- fix: run discovery and alignment upon unlock for all wallets cp-7.59.0 ([#22598](https://github.com/MetaMask/metamask-mobile/pull/22598)) -- fix: send transaction copy ([#22109](https://github.com/MetaMask/metamask-mobile/pull/22109)) -- fix: cp-7.59.0 fix perps flow when solana is selected ([#22588](https://github.com/MetaMask/metamask-mobile/pull/22588)) -- fix: swaps navigation issue when changing source token ([#22545](https://github.com/MetaMask/metamask-mobile/pull/22545)) -- fix: add prediction carousel ([#22537](https://github.com/MetaMask/metamask-mobile/pull/22537)) -- fix: cp-7.59.0 bump bitcoin ([#22557](https://github.com/MetaMask/metamask-mobile/pull/22557)) -- fix: invalid QR code showing alert multiple times ([#22292](https://github.com/MetaMask/metamask-mobile/pull/22292)) -- fix: add specific error message for duplicate SRP imports ([#22536](https://github.com/MetaMask/metamask-mobile/pull/22536)) -- fix: asset picker scroll in metamask pay on android ([#22525](https://github.com/MetaMask/metamask-mobile/pull/22525)) -- fix: Add PPOM validation for deeplink requests ([#22473](https://github.com/MetaMask/metamask-mobile/pull/22473)) -- fix: Prevent recipient input to show multiline for selected address ([#22392](https://github.com/MetaMask/metamask-mobile/pull/22392)) -- fix: max predict withdraw ([#22350](https://github.com/MetaMask/metamask-mobile/pull/22350)) -- fix: cp-7.59.0 unconfirmed status styling ([#22316](https://github.com/MetaMask/metamask-mobile/pull/22316)) -- fix: New Persistence Improvements based on Abuse testing cp-7.59.0 ([#21990](https://github.com/MetaMask/metamask-mobile/pull/21990)) -- fix: correct alignment of header ([#22456](https://github.com/MetaMask/metamask-mobile/pull/22456)) -- fix: array reference being reused ([#22480](https://github.com/MetaMask/metamask-mobile/pull/22480)) -- fix: bug 22375 ([#22382](https://github.com/MetaMask/metamask-mobile/pull/22382)) -- fix: safe area in full screen confirmations ([#22365](https://github.com/MetaMask/metamask-mobile/pull/22365)) -- fix: cp-7.59.0 Update minimum BTC amount ([#22401](https://github.com/MetaMask/metamask-mobile/pull/22401)) -- fix: cp-7.59.0 remove dex prefix for hip3 asset display ([#22461](https://github.com/MetaMask/metamask-mobile/pull/22461)) -- fix: cp-7.59.0 remove hip-3 stocks list all filter ([#22462](https://github.com/MetaMask/metamask-mobile/pull/22462)) -- fix: pressability measureAsyncOnUI only running on Android cp-7.58.2 ([#22436](https://github.com/MetaMask/metamask-mobile/pull/22436)) -- fix: use correct order for BTC network and fees cp-7.59.0 ([#22244](https://github.com/MetaMask/metamask-mobile/pull/22244)) -- fix: PerpsMarketList navigation, and performance optimizations in TabList cp-7.59.0 ([#22341](https://github.com/MetaMask/metamask-mobile/pull/22341)) -- fix: use METAMASK_ENVIRONMENT instead of NODE_ENV ([#22282](https://github.com/MetaMask/metamask-mobile/pull/22282)) -- fix: Consider client active once it is open and unlocked ([#22385](https://github.com/MetaMask/metamask-mobile/pull/22385)) -- fix: hide predict deposit incoming transactions ([#22371](https://github.com/MetaMask/metamask-mobile/pull/22371)) -- fix: cp-7.59.0 fix display tabs based on selected networks ([#22372](https://github.com/MetaMask/metamask-mobile/pull/22372)) -- fix: disable fingerprint, repack, cache restore for Android E2E & revert Expo Updates cp-7.59.0 ([#22349](https://github.com/MetaMask/metamask-mobile/pull/22349)) -- fix: trigger rewards animation value update on state transition cp-7.59.0 ([#22351](https://github.com/MetaMask/metamask-mobile/pull/22351)) -- fix: fix MM Connect account switching via homepage account selector ([#22163](https://github.com/MetaMask/metamask-mobile/pull/22163)) -- fix: cp-7.59.0 fix crash when hiding token on token details in android ([#22327](https://github.com/MetaMask/metamask-mobile/pull/22327)) -- fix: metaMetrics not tracking events for social login users ([#22259](https://github.com/MetaMask/metamask-mobile/pull/22259)) -- fix: skip inserting EAS update config in dev ([#22273](https://github.com/MetaMask/metamask-mobile/pull/22273)) -- fix: cp-7.59.0 market list open interest sort ([#22294](https://github.com/MetaMask/metamask-mobile/pull/22294)) -- fix: back arrow perps home should always navigate to wallet home cp-7.59.0 ([#22288](https://github.com/MetaMask/metamask-mobile/pull/22288)) -- fix: Toast component theme reactivity in production builds cp-7.59.0 ([#22291](https://github.com/MetaMask/metamask-mobile/pull/22291)) -- fix: Updated tabsbar to update when font size pref changes ([#22208](https://github.com/MetaMask/metamask-mobile/pull/22208)) -- fix: cp-7.59.0 hotfix-7.58.2 update close position calculation with funding fees and live data ([#22229](https://github.com/MetaMask/metamask-mobile/pull/22229)) -- fix: btc account selection during btc network change cp-7.59.0 ([#22328](https://github.com/MetaMask/metamask-mobile/pull/22328)) -- fix: re order migrations 105, 106, 107 cp-7.59.0 ([#22276](https://github.com/MetaMask/metamask-mobile/pull/22276)) -- fix: hide trending and show browser when ff is false ([#22209](https://github.com/MetaMask/metamask-mobile/pull/22209)) -- fix: cp-7.59.0 ensure that txs show on asset details page ([#22285](https://github.com/MetaMask/metamask-mobile/pull/22285)) -- fix: Update Ledger support link to the correct article ([#22297](https://github.com/MetaMask/metamask-mobile/pull/22297)) -- fix: add load tests for assets ([#21912](https://github.com/MetaMask/metamask-mobile/pull/21912)) -- fix: cp-7.59.0 Fix minimum BTC amount validation in send flow ([#22245](https://github.com/MetaMask/metamask-mobile/pull/22245)) -- fix: navigate users directly to blockchaine explorer on Solana swaps ([#22048](https://github.com/MetaMask/metamask-mobile/pull/22048)) -- fix: user interface descriepenses ([#21938](https://github.com/MetaMask/metamask-mobile/pull/21938)) -- fix: backdrop press on edit rpc bottom sheets ([#22098](https://github.com/MetaMask/metamask-mobile/pull/22098)) -- fix: 20839 fix the qr name not matched in swap page. ([#22043](https://github.com/MetaMask/metamask-mobile/pull/22043)) -- fix: cp-7.59.0 Return empty contacts for nonEVM send flow ([#22235](https://github.com/MetaMask/metamask-mobile/pull/22235)) -- fix: styling for backup and sync toggle. ([#22128](https://github.com/MetaMask/metamask-mobile/pull/22128)) +- feat: Add all entry points for Predict feed (#22659) +- feat: updated transaction details for predict claim and withdraw (#22370) +- feat: predict claim gas station (#22553) +- feat: rewards activity compatible with predict and deposit musd (#22636) +- feat: upgrade notification package and add Platform Notifications (#22539) +- feat: added powered by polymarket (#22637) +- feat: [Trending] add perps section (#22611) +- feat: update login screen rive animation (#21138) +- feat: add use-feature-flag (#22590) +- feat: trade confirmation redesign (#22384) +- feat: ways to earn musd deposits (#22620) +- feat: mcwp176 add auto tracking for related feature flags and override (#22023) +- feat: implement view all prediction (#22621) +- feat: update metamask pay same chain duration (#22629) +- feat: Implement `onAmountInput` for nonEVM send flow amount validations (#22389) +- feat: predict claim loader (#22368) +- feat: add hyperevm as additional network (#22459) +- feat: reward ways to earn for predict (#22609) +- feat: metamask pay buy button (#22367) +- feat: add cursor feature flag rule (#22520) +- feat: relay predict (#22509) +- feat: Predict GTM Modal (#22530) +- feat: eas updates initial setup (#22467) +- feat: Swaps tron integration (#21294) +- feat: Integrate Rewards with Predict (#22546) +- feat: trending main search (#22535) +- feat: extra details if single win in predict claim (#22369) +- feat: add analytics tracking for social login failures (#22182) +- feat: Implement part 1 of UniversalRouter for link-handling (deep links) (#22453) +- feat: Make Predict Charts Interactive (#22402) +- feat: add support to automatically upgrade account (#22241) +- feat: Enable automatic updates of preinstalled Snaps (#22383) +- feat: Support sponsored transactions through smart transactions (#21932) +- feat: Update points equations and details in Rewards ways to earn section cp-7.59.0 (#22457) +- feat: Improve Predict Activity UI (#22331) +- feat: updated currency switch clicked event for deposit and withdrawal screens (#22286) +- feat: update notification account settings to use BIP-44 designs (#20307) +- feat: metamask pay with send picker (#22363) +- feat: predict deposit account created metric (#22366) +- feat: update predict claim background (#22348) +- feat: support importing and ignoring non-evm tokens (#22103) +- feat: add logout button to BasicInfo error banner for Transak phone already registered error (#22183) +- feat: Implement LegacyLinkAdapter between old and new 'core' links (#22202) +- feat: calculate insufficientBal for quote requests (#22312) +- feat: Improve link-handling for internally-sourced links (carousel / in-app browser) (#22012) +- feat: implement eas updates (#17431) +- feat: add deeplink support for Predict markets (#22258) +- feat: Add geo-blocking analytics tracking (#22126) + +### Fixed + +- fix: cp-7.59.1 cp-7.60.0 add mon to the currency list (#23269) +- fix: trim whitespace from amount input in PaymentRequest component (#22608) +- fix: code cleanup (#22648) +- fix: asset value metric in metamask pay (#22645) +- fix: handle swipe in confirmations on android (#22638) +- fix: Exclude token transfers from marking them as a swap tx cp-7.59.0 (#22607) +- fix: pay hide testnet assets in metamask pay (#22619) +- fix: ui issues (#22605) +- fix: run discovery and alignment upon unlock for all wallets cp-7.59.0 (#22598) +- fix: send transaction copy (#22109) +- fix: cp-7.59.0 fix perps flow when solana is selected (#22588) +- fix: swaps navigation issue when changing source token (#22545) +- fix: add prediction carousel (#22537) +- fix: cp-7.59.0 bump bitcoin (#22557) +- fix: invalid QR code showing alert multiple times (#22292) +- fix: add specific error message for duplicate SRP imports (#22536) +- fix: asset picker scroll in metamask pay on android (#22525) +- fix: Add PPOM validation for deeplink requests (#22473) +- fix: Prevent recipient input to show multiline for selected address (#22392) +- fix: max predict withdraw (#22350) +- fix: cp-7.59.0 unconfirmed status styling (#22316) +- fix: New Persistence Improvements based on Abuse testing cp-7.59.0 (#21990) +- fix: correct alignment of header (#22456) +- fix: array reference being reused (#22480) +- fix: bug 22375 (#22382) +- fix: safe area in full screen confirmations (#22365) +- fix: cp-7.59.0 Update minimum BTC amount (#22401) +- fix: cp-7.59.0 remove dex prefix for hip3 asset display (#22461) +- fix: cp-7.59.0 remove hip-3 stocks list all filter (#22462) +- fix: pressability measureAsyncOnUI only running on Android cp-7.58.2 (#22436) +- fix: use correct order for BTC network and fees cp-7.59.0 (#22244) +- fix: PerpsMarketList navigation, and performance optimizations in TabList cp-7.59.0 (#22341) +- fix: use METAMASK_ENVIRONMENT instead of NODE_ENV (#22282) +- fix: Consider client active once it is open and unlocked (#22385) +- fix: hide predict deposit incoming transactions (#22371) +- fix: cp-7.59.0 fix display tabs based on selected networks (#22372) +- fix: disable fingerprint, repack, cache restore for Android E2E & revert Expo Updates cp-7.59.0 (#22349) +- fix: trigger rewards animation value update on state transition cp-7.59.0 (#22351) +- fix: fix MM Connect account switching via homepage account selector (#22163) +- fix: cp-7.59.0 fix crash when hiding token on token details in android (#22327) +- fix: metaMetrics not tracking events for social login users (#22259) +- fix: skip inserting EAS update config in dev (#22273) +- fix: cp-7.59.0 market list open interest sort (#22294) +- fix: back arrow perps home should always navigate to wallet home cp-7.59.0 (#22288) +- fix: Toast component theme reactivity in production builds cp-7.59.0 (#22291) +- fix: Updated tabsbar to update when font size pref changes (#22208) +- fix: cp-7.59.0 hotfix-7.58.2 update close position calculation with funding fees and live data (#22229) +- fix: btc account selection during btc network change cp-7.59.0 (#22328) +- fix: re order migrations 105, 106, 107 cp-7.59.0 (#22276) +- fix: hide trending and show browser when ff is false (#22209) +- fix: cp-7.59.0 ensure that txs show on asset details page (#22285) +- fix: Update Ledger support link to the correct article (#22297) +- fix: add load tests for assets (#21912) +- fix: cp-7.59.0 Fix minimum BTC amount validation in send flow (#22245) +- fix: navigate users directly to blockchaine explorer on Solana swaps (#22048) +- fix: user interface descriepenses (#21938) +- fix: backdrop press on edit rpc bottom sheets (#22098) +- fix: 20839 fix the qr name not matched in swap page. (#22043) +- fix: cp-7.59.0 Return empty contacts for nonEVM send flow (#22235) +- fix: styling for backup and sync toggle. (#22128) - fix: invalid QR code showing alert multiple times (#22292) - fix: correct alignment of header (#22456) - fix: skip inserting EAS update config in dev (#22273) @@ -9686,7 +9904,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.61.6...HEAD +[Unreleased]: https://github.com/MetaMask/metamask-mobile/compare/v7.62.0...HEAD +[7.62.0]: https://github.com/MetaMask/metamask-mobile/compare/v7.61.6...v7.62.0 [7.61.6]: https://github.com/MetaMask/metamask-mobile/compare/v7.61.5...v7.61.6 [7.61.5]: https://github.com/MetaMask/metamask-mobile/compare/v7.61.4...v7.61.5 [7.61.4]: https://github.com/MetaMask/metamask-mobile/compare/v7.61.3...v7.61.4 From 4058c42dc5037d5e7f6f7f23214fab8d2662f760 Mon Sep 17 00:00:00 2001 From: MetaMask Bot <37885440+metamaskbot@users.noreply.github.com> Date: Thu, 29 Jan 2026 06:58:48 -0500 Subject: [PATCH 41/80] release: release/7.62.1-Changelog (#25214) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR updates the change log for 7.62.1. (Hotfix - no test plan generated.) --------- Co-authored-by: metamaskbot Co-authored-by: João Loureiro <175489935+joaoloureirop@users.noreply.github.com> --- CHANGELOG.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 461e04ae2481..9cdab1b72f05 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [7.62.1] + +### Fixed + +- fix: update selectedGasFeeToken when payment token is selected for gasless flow cp-7.62.1 (#25273) + ## [7.62.0] ### Added @@ -9904,7 +9910,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.62.0...HEAD +[Unreleased]: https://github.com/MetaMask/metamask-mobile/compare/v7.62.1...HEAD +[7.62.1]: https://github.com/MetaMask/metamask-mobile/compare/v7.62.0...v7.62.1 [7.62.0]: https://github.com/MetaMask/metamask-mobile/compare/v7.61.6...v7.62.0 [7.61.6]: https://github.com/MetaMask/metamask-mobile/compare/v7.61.5...v7.61.6 [7.61.5]: https://github.com/MetaMask/metamask-mobile/compare/v7.61.4...v7.61.5 From a13329c02ffefa7d122bae0d3a18c9baf79aa669 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Loureiro?= <175489935+joaoloureirop@users.noreply.github.com> Date: Thu, 29 Jan 2026 12:09:50 +0000 Subject: [PATCH 42/80] update changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9cdab1b72f05..8d51a248853a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,7 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed -- fix: update selectedGasFeeToken when payment token is selected for gasless flow cp-7.62.1 (#25273) +- fix: update selectedGasFeeToken when payment token is selected for gasless flow (#25273) ## [7.62.0] From a74773c05505335cc28202f2e3376191104d2358 Mon Sep 17 00:00:00 2001 From: Pedro Figueiredo Date: Tue, 27 Jan 2026 14:07:25 +0000 Subject: [PATCH 43/80] fix: update selectedGasFeeToken when payment token is selected for gasless flow cp-7.62.1 (#25209) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## **Description** Fixes a regression from bcf7c34 ([see PR](https://github.com/MetaMask/metamask-mobile/pull/24290)) where passing `gasFeeToken` at transaction creation time caused premature balance validation, failing deposits with "Gas fee token not found and insufficient native balance". Instead of setting `gasFeeToken` at transaction creation, we now update `selectedGasFeeToken` on the transaction metadata when the user selects a payment token in the MetaMask Pay UI. This allows the 7702 gasless flow to process the transaction correctly without triggering early validation. Changes: - Remove `gasFeeToken` from Perps/Predict transaction creation - Update `useTransactionPayToken` to set `selectedGasFeeToken` on the transaction metadata when a payment token is selected - Update tests to reflect the new approach ## **Changelog** CHANGELOG entry: ## **Related issues** Fixes: https://github.com/MetaMask/metamask-mobile/issues/25185 ## **Manual testing steps** ```gherkin Feature: my feature name Scenario: user [verb for user action] Given [describe expected initial app state] When user [verb for user action] Then [describe expected outcome] ``` ## **Screenshots/Recordings** ### **Before** ### **After** ## **Pre-merge author checklist** - [ ] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile Coding Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md). - [ ] I've completed the PR template to the best of my ability - [ ] I've included tests if applicable - [ ] I've documented my code using [JSDoc](https://jsdoc.app/) format if applicable - [ ] I've applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors. ## **Pre-merge reviewer checklist** - [ ] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [ ] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots. --- > [!NOTE] > Fixes gasless deposit flow by deferring gas fee token selection to the confirmation UI instead of at transaction creation. > > - Removes `gasFeeToken` from Perps and Predict deposit submission paths (`PerpsController`, `PredictController`, Polymarket provider), and types/tests updated accordingly > - Updates `useTransactionPayToken` to set `selectedGasFeeToken` (and `isGasFeeTokenIgnoredIfBalance`) for `predictDeposit` when the chosen pay token matches the required token; resets when it doesn’t; triggers gas estimate refresh > - Adds unit tests validating `selectedGasFeeToken` update/reset logic and adjusts existing deposit tests to new behavior > > Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit f0ad3ed448d7d29064cfecc707ca0b9b457928c7. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot). --- .../Perps/controllers/PerpsController.test.ts | 47 ------- .../UI/Perps/controllers/PerpsController.ts | 16 +-- .../controllers/PredictController.test.ts | 4 - .../Predict/controllers/PredictController.ts | 3 +- .../polymarket/PolymarketProvider.ts | 8 +- app/components/UI/Predict/providers/types.ts | 1 - .../hooks/pay/useTransactionPayToken.test.ts | 120 +++++++++++++++++- .../hooks/pay/useTransactionPayToken.ts | 61 +++++++-- 8 files changed, 170 insertions(+), 90 deletions(-) diff --git a/app/components/UI/Perps/controllers/PerpsController.test.ts b/app/components/UI/Perps/controllers/PerpsController.test.ts index a0037c8518c1..63ba7c5cc195 100644 --- a/app/components/UI/Perps/controllers/PerpsController.test.ts +++ b/app/components/UI/Perps/controllers/PerpsController.test.ts @@ -25,10 +25,6 @@ import type { import { HyperLiquidProvider } from './providers/HyperLiquidProvider'; import { createMockHyperLiquidProvider } from '../__mocks__/providerMocks'; import { createMockInfrastructure } from '../__mocks__/serviceMocks'; -import { - ARBITRUM_MAINNET_CHAIN_ID_HEX, - USDC_ARBITRUM_MAINNET_ADDRESS, -} from '../constants/hyperLiquidConfig'; import Engine from '../../../../core/Engine'; jest.mock('./providers/HyperLiquidProvider'); @@ -2391,52 +2387,9 @@ describe('PerpsController', () => { origin: 'metamask', type: 'perpsDeposit', skipInitialGasEstimate: true, - gasFeeToken: undefined, }); }); - it('adds gasFeeToken for Arbitrum USDC deposits', async () => { - markControllerAsInitialized(); - controller.testSetProviders(new Map([['hyperliquid', mockProvider]])); - - Engine.context.AccountTrackerController.state.accountsByChainId = { - [ARBITRUM_MAINNET_CHAIN_ID_HEX]: { - [mockTransaction.from.toLowerCase()]: { - balance: '0x0', - }, - }, - }; - - jest - .spyOn(mockDepositServiceInstance, 'prepareTransaction') - .mockResolvedValueOnce({ - transaction: { - ...mockTransaction, - to: USDC_ARBITRUM_MAINNET_ADDRESS, - }, - assetChainId: ARBITRUM_MAINNET_CHAIN_ID_HEX, - currentDepositId: mockDepositId, - }); - - await controller.depositWithConfirmation('100'); - - expect( - mockInfrastructure.controllers.transaction.submit, - ).toHaveBeenCalledWith( - { - ...mockTransaction, - to: USDC_ARBITRUM_MAINNET_ADDRESS, - }, - { - networkClientId: mockNetworkClientId, - origin: 'metamask', - type: 'perpsDeposit', - skipInitialGasEstimate: true, - gasFeeToken: USDC_ARBITRUM_MAINNET_ADDRESS, - }, - ); - }); - it('throws error when controller not initialized', async () => { controller.testSetInitialized(false); diff --git a/app/components/UI/Perps/controllers/PerpsController.ts b/app/components/UI/Perps/controllers/PerpsController.ts index 2098c5782ecd..f2258c67e7b9 100644 --- a/app/components/UI/Perps/controllers/PerpsController.ts +++ b/app/components/UI/Perps/controllers/PerpsController.ts @@ -13,12 +13,7 @@ import { TransactionControllerTransactionSubmittedEvent, TransactionType, } from '@metamask/transaction-controller'; -import { Hex } from '@metamask/utils'; -import { - ARBITRUM_MAINNET_CHAIN_ID_HEX, - USDC_ARBITRUM_MAINNET_ADDRESS, - USDC_SYMBOL, -} from '../constants/hyperLiquidConfig'; +import { USDC_SYMBOL } from '../constants/hyperLiquidConfig'; import { LastTransactionResult, TransactionStatus, @@ -1509,14 +1504,6 @@ export class PerpsController extends BaseController< ); } - const gasFeeToken = - transaction.to && - assetChainId.toLowerCase() === ARBITRUM_MAINNET_CHAIN_ID_HEX && - transaction.to.toLowerCase() === - USDC_ARBITRUM_MAINNET_ADDRESS.toLowerCase() - ? (transaction.to as Hex) - : undefined; - // submit shows the confirmation screen and returns a promise // The promise will resolve when transaction completes or reject if cancelled/failed const { result, transactionMeta } = await controllers.transaction.submit( @@ -1526,7 +1513,6 @@ export class PerpsController extends BaseController< origin: 'metamask', type: TransactionType.perpsDeposit, skipInitialGasEstimate: true, - gasFeeToken, }, ); diff --git a/app/components/UI/Predict/controllers/PredictController.test.ts b/app/components/UI/Predict/controllers/PredictController.test.ts index 89c3af71a407..1a4a93008769 100644 --- a/app/components/UI/Predict/controllers/PredictController.test.ts +++ b/app/components/UI/Predict/controllers/PredictController.test.ts @@ -13,7 +13,6 @@ import { } from '@metamask/transaction-controller'; import type { NetworkState } from '@metamask/network-controller'; import type { InternalAccount } from '@metamask/keyring-internal-api'; -import type { Hex } from '@metamask/utils'; import Engine from '../../../../core/Engine'; import DevLogger from '../../../../core/SDKConnect/utils/DevLogger'; @@ -22,7 +21,6 @@ import { addTransactionBatch, } from '../../../../util/transaction-controller'; import { PolymarketProvider } from '../providers/polymarket/PolymarketProvider'; -import { MATIC_CONTRACTS } from '../providers/polymarket/constants'; import type { OrderPreview } from '../providers/types'; import { PredictBalance, @@ -3005,7 +3003,6 @@ describe('PredictController', () => { mockPolymarketProvider.prepareDeposit.mockResolvedValue({ transactions: mockTransactions, chainId: mockChainId, - gasFeeToken: MATIC_CONTRACTS.collateral as Hex, }); (addTransactionBatch as jest.Mock).mockResolvedValue({ @@ -3073,7 +3070,6 @@ describe('PredictController', () => { disableUpgrade: true, skipInitialGasEstimate: true, transactions: mockTransactions, - gasFeeToken: MATIC_CONTRACTS.collateral, }); }); }); diff --git a/app/components/UI/Predict/controllers/PredictController.ts b/app/components/UI/Predict/controllers/PredictController.ts index 87b2113bdbed..3ec84f8273db 100644 --- a/app/components/UI/Predict/controllers/PredictController.ts +++ b/app/components/UI/Predict/controllers/PredictController.ts @@ -1953,7 +1953,7 @@ export class PredictController extends BaseController< throw new Error('Deposit preparation returned undefined'); } - const { transactions, chainId, gasFeeToken } = depositPreparation; + const { transactions, chainId } = depositPreparation; if (!transactions || transactions.length === 0) { throw new Error('No transactions returned from deposit preparation'); @@ -2000,7 +2000,6 @@ export class PredictController extends BaseController< disableUpgrade: true, skipInitialGasEstimate: true, transactions, - gasFeeToken, }); if (!batchResult?.batchId) { diff --git a/app/components/UI/Predict/providers/polymarket/PolymarketProvider.ts b/app/components/UI/Predict/providers/polymarket/PolymarketProvider.ts index 64c60aa0a014..9e4120b31a9f 100644 --- a/app/components/UI/Predict/providers/polymarket/PolymarketProvider.ts +++ b/app/components/UI/Predict/providers/polymarket/PolymarketProvider.ts @@ -1512,15 +1512,9 @@ export class PolymarketProvider implements PredictProvider { type: TransactionType.predictDeposit, }); - const chainId = CHAIN_IDS.POLYGON; - const isPolygonChain = - chainId.toLowerCase() === - numberToHex(POLYGON_MAINNET_CHAIN_ID).toLowerCase(); - return { - chainId, + chainId: CHAIN_IDS.POLYGON, transactions, - gasFeeToken: isPolygonChain ? (collateral as Hex) : undefined, }; } diff --git a/app/components/UI/Predict/providers/types.ts b/app/components/UI/Predict/providers/types.ts index b869d2784270..058f6c317172 100644 --- a/app/components/UI/Predict/providers/types.ts +++ b/app/components/UI/Predict/providers/types.ts @@ -187,7 +187,6 @@ export interface PrepareDepositResponse { }; type?: TransactionType; }[]; - gasFeeToken?: Hex; } export interface GetPredictWalletParams { diff --git a/app/components/Views/confirmations/hooks/pay/useTransactionPayToken.test.ts b/app/components/Views/confirmations/hooks/pay/useTransactionPayToken.test.ts index 0998b3fa2ce4..08e178694e8d 100644 --- a/app/components/Views/confirmations/hooks/pay/useTransactionPayToken.test.ts +++ b/app/components/Views/confirmations/hooks/pay/useTransactionPayToken.test.ts @@ -10,9 +10,13 @@ import { tokenAddress1Mock, } from '../../__mocks__/controllers/other-controllers-mock'; import { TransactionType } from '@metamask/transaction-controller'; -import { TransactionPaymentToken } from '@metamask/transaction-pay-controller'; +import { + TransactionPaymentToken, + TransactionPayRequiredToken, +} from '@metamask/transaction-pay-controller'; import Engine from '../../../../../core/Engine'; import { flushPromises } from '../../../../../util/test/utils'; +import { updateTransaction } from '../../../../../util/transaction-controller'; jest.mock('../../../../../core/Engine', () => ({ context: { @@ -28,6 +32,10 @@ jest.mock('../../../../../core/Engine', () => ({ }, })); +jest.mock('../../../../../util/transaction-controller', () => ({ + updateTransaction: jest.fn(), +})); + const STATE_MOCK = merge( simpleSendTransactionControllerMock, transactionApprovalControllerMock, @@ -50,14 +58,22 @@ const PAY_TOKEN_MOCK = { symbol: 'TST', } as TransactionPaymentToken; +const REQUIRED_TOKEN_MOCK = { + address: tokenAddress1Mock, + chainId: ChainId.mainnet, + skipIfBalance: false, +} as unknown as TransactionPayRequiredToken; + function runHook({ currency, payToken, type, + requiredTokens, }: { currency?: string; payToken?: TransactionPaymentToken; type?: TransactionType; + requiredTokens?: TransactionPayRequiredToken[]; } = {}) { const mockState = cloneDeep(STATE_MOCK); @@ -66,7 +82,7 @@ function runHook({ [TRANSACTION_ID_MOCK]: { isLoading: false, paymentToken: payToken, - tokens: [], + tokens: requiredTokens ?? [], }, }, }; @@ -157,4 +173,104 @@ describe('useTransactionPayToken', () => { expect(result.current.isNative).toBe(true); }); + + describe('selectedGasFeeToken update for predictDeposit', () => { + const updateTransactionMock = jest.mocked(updateTransaction); + + beforeEach(() => { + updateTransactionMock.mockClear(); + }); + + it('updates transaction with selectedGasFeeToken for predictDeposit when pay token matches required token', async () => { + const { result } = runHook({ + payToken: PAY_TOKEN_MOCK, + type: TransactionType.predictDeposit, + requiredTokens: [REQUIRED_TOKEN_MOCK], + }); + + result.current.setPayToken({ + address: PAY_TOKEN_MOCK.address, + chainId: PAY_TOKEN_MOCK.chainId as ChainId, + }); + + await flushPromises(); + + expect(updateTransactionMock).toHaveBeenCalledWith( + expect.objectContaining({ + selectedGasFeeToken: PAY_TOKEN_MOCK.address, + isGasFeeTokenIgnoredIfBalance: true, + }), + TRANSACTION_ID_MOCK, + ); + }); + + it('does not update transaction for non-predictDeposit transaction types', async () => { + const { result } = runHook({ + payToken: PAY_TOKEN_MOCK, + type: TransactionType.simpleSend, + requiredTokens: [REQUIRED_TOKEN_MOCK], + }); + + result.current.setPayToken({ + address: PAY_TOKEN_MOCK.address, + chainId: PAY_TOKEN_MOCK.chainId as ChainId, + }); + + await flushPromises(); + + expect(updateTransactionMock).not.toHaveBeenCalled(); + }); + + it('resets selectedGasFeeToken when pay token does not match required token', async () => { + const differentToken = { + address: '0xDifferentTokenAddress1234567890123456789012', + chainId: ChainId.mainnet, + skipIfBalance: false, + } as unknown as TransactionPayRequiredToken; + + const { result } = runHook({ + payToken: PAY_TOKEN_MOCK, + type: TransactionType.predictDeposit, + requiredTokens: [differentToken], + }); + + result.current.setPayToken({ + address: PAY_TOKEN_MOCK.address, + chainId: PAY_TOKEN_MOCK.chainId as ChainId, + }); + + await flushPromises(); + + expect(updateTransactionMock).toHaveBeenCalledWith( + expect.objectContaining({ + selectedGasFeeToken: undefined, + isGasFeeTokenIgnoredIfBalance: undefined, + }), + TRANSACTION_ID_MOCK, + ); + }); + + it('resets selectedGasFeeToken when no required tokens exist', async () => { + const { result } = runHook({ + payToken: PAY_TOKEN_MOCK, + type: TransactionType.predictDeposit, + requiredTokens: [], + }); + + result.current.setPayToken({ + address: PAY_TOKEN_MOCK.address, + chainId: PAY_TOKEN_MOCK.chainId as ChainId, + }); + + await flushPromises(); + + expect(updateTransactionMock).toHaveBeenCalledWith( + expect.objectContaining({ + selectedGasFeeToken: undefined, + isGasFeeTokenIgnoredIfBalance: undefined, + }), + TRANSACTION_ID_MOCK, + ); + }); + }); }); diff --git a/app/components/Views/confirmations/hooks/pay/useTransactionPayToken.ts b/app/components/Views/confirmations/hooks/pay/useTransactionPayToken.ts index 637e236de606..9f3f536aecd1 100644 --- a/app/components/Views/confirmations/hooks/pay/useTransactionPayToken.ts +++ b/app/components/Views/confirmations/hooks/pay/useTransactionPayToken.ts @@ -1,26 +1,35 @@ -import { useSelector } from 'react-redux'; -import { useTransactionMetadataRequest } from '../transactions/useTransactionMetadataRequest'; -import { useCallback } from 'react'; -import { RootState } from '../../../../../reducers'; -import Engine from '../../../../../core/Engine'; -import { selectTransactionPaymentTokenByTransactionId } from '../../../../../selectors/transactionPayController'; +import { getNativeTokenAddress } from '@metamask/assets-controllers'; +import { TransactionType } from '@metamask/transaction-controller'; +import { TransactionPaymentToken } from '@metamask/transaction-pay-controller'; import { Hex } from '@metamask/utils'; import { noop } from 'lodash'; +import { useCallback } from 'react'; +import { useSelector } from 'react-redux'; +import Engine from '../../../../../core/Engine'; import EngineService from '../../../../../core/EngineService'; -import { TransactionPaymentToken } from '@metamask/transaction-pay-controller'; -import { getNativeTokenAddress } from '@metamask/assets-controllers'; +import { RootState } from '../../../../../reducers'; +import { selectTransactionPaymentTokenByTransactionId } from '../../../../../selectors/transactionPayController'; +import { updateTransaction } from '../../../../../util/transaction-controller'; +import { useTransactionMetadataRequest } from '../transactions/useTransactionMetadataRequest'; +import { useTransactionPayRequiredTokens } from './useTransactionPayData'; export function useTransactionPayToken(): { isNative?: boolean; payToken: TransactionPaymentToken | undefined; setPayToken: (newPayToken: { address: Hex; chainId: Hex }) => void; } { - const { id: transactionId } = useTransactionMetadataRequest() || { id: '' }; + const transactionMeta = useTransactionMetadataRequest(); + const { id: transactionId } = transactionMeta || { id: '' }; const payToken = useSelector((state: RootState) => selectTransactionPaymentTokenByTransactionId(state, transactionId), ); + const requiredTokens = useTransactionPayRequiredTokens(); + const primaryRequiredToken = (requiredTokens ?? []).find( + (token) => !token.skipIfBalance, + ); + const isNative = payToken && payToken?.address === getNativeTokenAddress(payToken?.chainId); @@ -43,13 +52,41 @@ export function useTransactionPayToken(): { tokenAddress: newPayToken.address, chainId: newPayToken.chainId, }); - - EngineService.flushState(); } catch (e) { console.error('Error updating payment token', e); } + + // perps deposits only use relay, so doesn't need gasFeeToken update + const isPredictDepositTransaction = + transactionMeta?.type === TransactionType.predictDeposit; + + if (isPredictDepositTransaction) { + const isNewPayTokenRequiredToken = + newPayToken.chainId === primaryRequiredToken?.chainId && + newPayToken.address.toLowerCase() === + primaryRequiredToken?.address.toLowerCase(); + + const updatedTx = { + ...transactionMeta, + selectedGasFeeToken: isNewPayTokenRequiredToken + ? newPayToken.address + : undefined, + isGasFeeTokenIgnoredIfBalance: isNewPayTokenRequiredToken + ? true + : undefined, + }; + + updateTransaction(updatedTx, transactionMeta.id); + } + + EngineService.flushState(); }, - [transactionId], + [ + transactionId, + transactionMeta, + primaryRequiredToken?.chainId, + primaryRequiredToken?.address, + ], ); return { From 87d2dae0cf68f3b9f904cec9120fe433d2474cb5 Mon Sep 17 00:00:00 2001 From: metamaskbot Date: Thu, 29 Jan 2026 14:23:04 +0000 Subject: [PATCH 44/80] [skip ci] Bump version number to 3572 --- android/app/build.gradle | 2 +- bitrise.yml | 4 ++-- ios/MetaMask.xcodeproj/project.pbxproj | 12 ++++++------ 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 06d4844eb395..133c46887e50 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -188,7 +188,7 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion versionName "7.63.0" - versionCode 3568 + versionCode 3572 testBuildType System.getProperty('testBuildType', 'debug') testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" manifestPlaceholders.MM_BRANCH_KEY_TEST = "$System.env.MM_BRANCH_KEY_TEST" diff --git a/bitrise.yml b/bitrise.yml index 63effca15339..6d9e97b3d9ff 100644 --- a/bitrise.yml +++ b/bitrise.yml @@ -3472,13 +3472,13 @@ app: VERSION_NAME: 7.63.0 - opts: is_expand: false - VERSION_NUMBER: 3568 + VERSION_NUMBER: 3572 - opts: is_expand: false FLASK_VERSION_NAME: 7.63.0 - opts: is_expand: false - FLASK_VERSION_NUMBER: 3568 + FLASK_VERSION_NUMBER: 3572 - opts: is_expand: false ANDROID_APK_LINK: '' diff --git a/ios/MetaMask.xcodeproj/project.pbxproj b/ios/MetaMask.xcodeproj/project.pbxproj index a24189553797..00cab4b23d1a 100644 --- a/ios/MetaMask.xcodeproj/project.pbxproj +++ b/ios/MetaMask.xcodeproj/project.pbxproj @@ -1281,7 +1281,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3568; + CURRENT_PROJECT_VERSION = 3572; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 48XVW22RCG; @@ -1350,7 +1350,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3568; + CURRENT_PROJECT_VERSION = 3572; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 48XVW22RCG; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 48XVW22RCG; @@ -1416,7 +1416,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3568; + CURRENT_PROJECT_VERSION = 3572; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 48XVW22RCG; @@ -1483,7 +1483,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3568; + CURRENT_PROJECT_VERSION = 3572; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 48XVW22RCG; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 48XVW22RCG; @@ -1646,7 +1646,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3568; + CURRENT_PROJECT_VERSION = 3572; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 48XVW22RCG; @@ -1716,7 +1716,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3568; + CURRENT_PROJECT_VERSION = 3572; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 48XVW22RCG; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 48XVW22RCG; From e36d8291dab56ef5a0bfd91e9f0ff632664260d8 Mon Sep 17 00:00:00 2001 From: "runway-github[bot]" <73448015+runway-github[bot]@users.noreply.github.com> Date: Thu, 29 Jan 2026 18:53:32 +0000 Subject: [PATCH 45/80] chore(runway): cherry-pick fix(perps): geo-restrictions on ui (#25392) - fix(perps): geo-restrictions on ui cp-7.63.0 (#25379) ## **Description** This PR fixes the missing geo-restriction checks in several perpetuals trading flows as reported in #25374. **PerpsOrderBookView.tsx:** - Added geo-restriction check to `handleLongPress` - shows geo-block modal instead of navigating to long order - Added geo-restriction check to `handleShortPress` - shows geo-block modal instead of navigating to short order - Added geo-restriction check to `handleClosePosition` - shows geo-block modal instead of navigating to close position - Added geo-restriction check to `handleModifyPress` - shows geo-block modal instead of opening modify sheet **PerpsMarketDetailsView.tsx:** - Added geo-restriction check to `handleAutoClosePress` - shows geo-block modal instead of navigating to TP/SL screen - Added geo-restriction check to `handleMarginPress` - shows geo-block modal instead of opening adjust margin sheet - Added geo-restriction check to `handleAddMarginFromBanner` - shows geo-block modal instead of navigating to add margin - Added geo-restriction check to `handleSetStopLossFromBanner` - shows geo-block modal instead of setting stop loss **PerpsTabView.tsx:** - Added geo-restriction check to `handleCloseAllPress` - shows geo-block modal instead of navigating to close all positions modal **PerpsHomeView.tsx:** - Added geo-restriction check to `handleCloseAllPress` - shows geo-block modal instead of opening close all positions sheet **eventNames.ts:** - Added new analytics source values for tracking geo-block notifications from each flow **Note:** Cancel all orders is intentionally NOT geo-blocked - users should be able to cancel their existing orders similar to withdrawals. ## **Changelog** CHANGELOG entry: Fixed geo-restriction enforcement for perpetuals trading flows including order book actions, position management, stop-loss prompts, and close all positions ## **Related issues** Fixes: #25374 ## **Manual testing steps** ```gherkin Feature: Geo-restriction on perps trading flows Scenario: User in geo-blocked region cannot trade via order book Given user is in a geo-blocked region (e.g., US) And user has navigated to the perps order book screen When user taps on Long button Then geo-restriction modal should appear And user should not navigate to long order screen When user taps on Short button Then geo-restriction modal should appear And user should not navigate to short order screen When user taps on Close button (with existing position) Then geo-restriction modal should appear And user should not navigate to close position screen When user taps on Modify button (with existing position) Then geo-restriction modal should appear And modify sheet should not open Scenario: User in geo-blocked region cannot manage positions Given user is in a geo-blocked region (e.g., US) And user has an existing perpetuals position When user taps on Auto-close button on position card Then geo-restriction modal should appear And user should not navigate to TP/SL screen When user taps on Margin button on position card Then geo-restriction modal should appear And adjust margin sheet should not open Scenario: User in geo-blocked region cannot use stop-loss prompt actions Given user is in a geo-blocked region (e.g., US) And user has an existing position with stop-loss prompt visible When user taps on Add Margin from stop-loss prompt banner Then geo-restriction modal should appear And user should not navigate to add margin screen When user taps on Set Stop Loss from stop-loss prompt banner Then geo-restriction modal should appear And stop loss should not be set Scenario: User in geo-blocked region cannot close all positions Given user is in a geo-blocked region (e.g., US) And user has existing perpetuals positions When user taps on Close All button in perps tab Then geo-restriction modal should appear And close all positions modal should not open When user taps on Close All button in perps home Then geo-restriction modal should appear And close all positions sheet should not open Scenario: User in geo-blocked region CAN cancel all orders Given user is in a geo-blocked region (e.g., US) And user has existing perpetuals orders When user taps on Cancel All button Then cancel all orders modal should open (NOT geo-blocked) ``` ## **Screenshots/Recordings** ### **Before** Users in geo-blocked regions could access trading flows without restriction ### **After** Geo-restriction modal appears for all trading flows when user is not eligible ## **Pre-merge author checklist** - [x] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile Coding Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md). - [x] I've completed the PR template to the best of my ability - [x] I've included tests if applicable - [x] I've documented my code using [JSDoc](https://jsdoc.app/) format if applicable - [x] I've applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors. ## **Pre-merge reviewer checklist** - [ ] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [ ] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots. --- > [!NOTE] > **Medium Risk** > Adds eligibility gating to multiple trading and position-management UI actions; mistakes could wrongly block eligible users or allow restricted actions through. Changes are localized to UI handlers and analytics but touch critical perps flows. > > **Overview** > **Enforces geo-restrictions across key Perps UI actions.** Order book Long/Short/Close/Modify, market details auto-close (TP/SL), adjust margin, stop-loss prompt actions, and bulk close-all entry points now check `selectPerpsEligibility` and show the geo-block tooltip instead of navigating/opening sheets. > > **Adds analytics attribution for blocked actions.** New `PerpsEventValues.SOURCE` constants are introduced to distinguish which UI trigger surfaced the geo-block notification. > > **Updates tests to cover new gating behavior.** Mocks are extended and new cases added to assert geo-block modal display and that navigation/sheets are not triggered when ineligible. > > Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 1698d0557ccb8d270b85f3cc3f86d6ee203608ab. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot). [d87e9ea](https://github.com/MetaMask/metamask-mobile/commit/d87e9ea05ef3033ee460a9d681e49dfb96648c0f) Co-authored-by: Alejandro Garcia Anglada --- .../PerpsHomeView/PerpsHomeView.test.tsx | 4 +- .../Views/PerpsHomeView/PerpsHomeView.tsx | 35 +- .../PerpsMarketDetailsView.test.tsx | 304 +++++++++++++++++- .../PerpsMarketDetailsView.tsx | 70 +++- .../PerpsOrderBookView.test.tsx | 168 ++++++++++ .../PerpsOrderBookView/PerpsOrderBookView.tsx | 73 ++++- .../Perps/Views/PerpsTabView/PerpsTabView.tsx | 18 +- .../UI/Perps/constants/eventNames.ts | 12 + 8 files changed, 671 insertions(+), 13 deletions(-) diff --git a/app/components/UI/Perps/Views/PerpsHomeView/PerpsHomeView.test.tsx b/app/components/UI/Perps/Views/PerpsHomeView/PerpsHomeView.test.tsx index 15ff90cbd7b3..c9c20c5aed52 100644 --- a/app/components/UI/Perps/Views/PerpsHomeView/PerpsHomeView.test.tsx +++ b/app/components/UI/Perps/Views/PerpsHomeView/PerpsHomeView.test.tsx @@ -95,7 +95,9 @@ jest.mock('../../hooks/usePerpsHomeActions', () => ({ })); jest.mock('../../hooks/usePerpsEventTracking', () => ({ - usePerpsEventTracking: jest.fn(), + usePerpsEventTracking: jest.fn(() => ({ + track: jest.fn(), + })), })); jest.mock('../../hooks/stream', () => ({ diff --git a/app/components/UI/Perps/Views/PerpsHomeView/PerpsHomeView.tsx b/app/components/UI/Perps/Views/PerpsHomeView/PerpsHomeView.tsx index fa0101d8d75e..14b0b977b153 100644 --- a/app/components/UI/Perps/Views/PerpsHomeView/PerpsHomeView.tsx +++ b/app/components/UI/Perps/Views/PerpsHomeView/PerpsHomeView.tsx @@ -98,12 +98,18 @@ const PerpsHomeView = () => { const { handleAddFunds, handleWithdraw, + isEligible, isEligibilityModalVisible, closeEligibilityModal, } = usePerpsHomeActions({ buttonLocation: PerpsEventValues.BUTTON_LOCATION.PERPS_HOME, }); + // Separate geo-block modal state for close all / cancel all actions + const [isCloseAllGeoBlockVisible, setIsCloseAllGeoBlockVisible] = + useState(false); + const { track } = usePerpsEventTracking(); + // Section scroll tracking for analytics const { handleSectionLayout, handleScroll, resetTracking } = usePerpsHomeSectionTracking(); @@ -340,10 +346,21 @@ const PerpsHomeView = () => { handleGiveFeedback, ]); - // Bottom sheet handlers - open sheets directly + // Bottom sheet handlers - open sheets directly with geo-restriction check const handleCloseAllPress = useCallback(() => { + // Geo-restriction check for close all positions + if (!isEligible) { + track(MetaMetricsEvents.PERPS_SCREEN_VIEWED, { + [PerpsEventProperties.SCREEN_TYPE]: + PerpsEventValues.SCREEN_TYPE.GEO_BLOCK_NOTIF, + [PerpsEventProperties.SOURCE]: + PerpsEventValues.SOURCE.CLOSE_ALL_POSITIONS_BUTTON, + }); + setIsCloseAllGeoBlockVisible(true); + return; + } setShowCloseAllSheet(true); - }, []); + }, [isEligible, track]); const handleCancelAllPress = useCallback(() => { setShowCancelAllSheet(true); @@ -576,6 +593,20 @@ const PerpsHomeView = () => { )} + + {/* Close All / Cancel All Geo-Block Modal */} + {isCloseAllGeoBlockVisible && ( + + + setIsCloseAllGeoBlockVisible(false)} + contentKey={'geo_block'} + testID={'perps-home-close-all-geo-block-tooltip'} + /> + + + )} ); }; diff --git a/app/components/UI/Perps/Views/PerpsMarketDetailsView/PerpsMarketDetailsView.test.tsx b/app/components/UI/Perps/Views/PerpsMarketDetailsView/PerpsMarketDetailsView.test.tsx index 12f691f89ed4..aad6f4c1919c 100644 --- a/app/components/UI/Perps/Views/PerpsMarketDetailsView/PerpsMarketDetailsView.test.tsx +++ b/app/components/UI/Perps/Views/PerpsMarketDetailsView/PerpsMarketDetailsView.test.tsx @@ -471,10 +471,69 @@ jest.mock('../../components/PerpsMarketStatisticsCard', () => { }; }); -// Mock PerpsPositionCard +// Mock PerpsPositionCard - render clickable buttons for testing jest.mock('../../components/PerpsPositionCard', () => ({ __esModule: true, - default: () => null, + default: (props: { + onAutoClosePress?: () => void; + onMarginPress?: () => void; + }) => { + const { View, TouchableOpacity, Text } = jest.requireActual('react-native'); + return ( + + {props.onAutoClosePress && ( + + Auto Close + + )} + {props.onMarginPress && ( + + Margin + + )} + + ); + }, +})); + +// Mock PerpsStopLossPromptBanner - render clickable buttons for testing +jest.mock('../../components/PerpsStopLossPromptBanner', () => ({ + __esModule: true, + default: (props: { + onSetStopLoss?: () => void; + onAddMargin?: () => void; + variant?: string; + testID?: string; + }) => { + const { View, TouchableOpacity, Text } = jest.requireActual('react-native'); + if (!props.variant) return null; + return ( + + {props.variant === 'add_margin' && props.onAddMargin && ( + + Add Margin Banner + + )} + {props.variant === 'stop_loss' && props.onSetStopLoss && ( + + Set Stop Loss Banner + + )} + + ); + }, })); // Mock notification utility @@ -531,6 +590,19 @@ jest.mock( }, ); +// Mock useStopLossPrompt hook +jest.mock('../../hooks/useStopLossPrompt', () => ({ + useStopLossPrompt: jest.fn(() => ({ + variant: null, + liquidationDistance: null, + suggestedStopLossPrice: null, + suggestedStopLossPercent: null, + isVisible: false, + isDismissing: false, + onDismissComplete: jest.fn(), + })), +})); + const initialState = { engine: { backgroundState, @@ -1483,6 +1555,234 @@ describe('PerpsMarketDetailsView', () => { expect(getByText('Geo Block Tooltip')).toBeTruthy(); // Modify sheet should NOT open when user is not eligible }); + + it('shows geo block modal when auto-close button is pressed and user is not eligible', () => { + const { useSelector } = jest.requireMock('react-redux'); + const mockSelectPerpsEligibility = jest.requireMock( + '../../selectors/perpsController', + ).selectPerpsEligibility; + useSelector.mockImplementation((selector: unknown) => { + if (selector === mockSelectPerpsEligibility) { + return false; + } + return undefined; + }); + + // Set up existing position to show position card + mockUseHasExistingPosition.mockReturnValue({ + hasPosition: true, + isLoading: false, + error: null, + existingPosition: { + symbol: 'BTC', + size: '0.5', + entryPrice: '50000', + leverage: { value: 10, type: 'isolated' }, + marginUsed: '5000', + unrealizedPnl: '100', + returnOnEquity: '0.02', + liquidationPrice: '45000', + }, + refreshPosition: jest.fn(), + positionOpenedTimestamp: undefined, + }); + + const { getByTestId, getByText } = renderWithProvider( + + + , + { + state: initialState, + }, + ); + + // Click the auto-close button from mocked position card + const autoCloseButton = getByTestId( + 'perps-position-card-auto-close-button', + ); + fireEvent.press(autoCloseButton); + + expect(getByText('Geo Block Tooltip')).toBeTruthy(); + expect(mockNavigate).not.toHaveBeenCalledWith( + expect.anything(), + expect.objectContaining({ screen: expect.stringContaining('TPSL') }), + ); + }); + + it('shows geo block modal when margin button is pressed and user is not eligible', () => { + const { useSelector } = jest.requireMock('react-redux'); + const mockSelectPerpsEligibility = jest.requireMock( + '../../selectors/perpsController', + ).selectPerpsEligibility; + useSelector.mockImplementation((selector: unknown) => { + if (selector === mockSelectPerpsEligibility) { + return false; + } + return undefined; + }); + + // Set up existing position to show position card + mockUseHasExistingPosition.mockReturnValue({ + hasPosition: true, + isLoading: false, + error: null, + existingPosition: { + symbol: 'BTC', + size: '0.5', + entryPrice: '50000', + leverage: { value: 10, type: 'isolated' }, + marginUsed: '5000', + unrealizedPnl: '100', + returnOnEquity: '0.02', + liquidationPrice: '45000', + }, + refreshPosition: jest.fn(), + positionOpenedTimestamp: undefined, + }); + + const { getByTestId, getByText } = renderWithProvider( + + + , + { + state: initialState, + }, + ); + + // Click the margin button from mocked position card + const marginButton = getByTestId('perps-position-card-margin-button'); + fireEvent.press(marginButton); + + expect(getByText('Geo Block Tooltip')).toBeTruthy(); + }); + + it('shows geo block modal when add margin from banner is pressed and user is not eligible', () => { + const { useSelector } = jest.requireMock('react-redux'); + const mockSelectPerpsEligibility = jest.requireMock( + '../../selectors/perpsController', + ).selectPerpsEligibility; + useSelector.mockImplementation((selector: unknown) => { + if (selector === mockSelectPerpsEligibility) { + return false; + } + return undefined; + }); + + // Set up existing position and stop loss prompt conditions + mockUseHasExistingPosition.mockReturnValue({ + hasPosition: true, + isLoading: false, + error: null, + existingPosition: { + symbol: 'BTC', + size: '0.5', + entryPrice: '50000', + leverage: { value: 10, type: 'isolated' }, + marginUsed: '5000', + unrealizedPnl: '-500', + returnOnEquity: '-0.10', + liquidationPrice: '45000', + }, + refreshPosition: jest.fn(), + positionOpenedTimestamp: Date.now() - 120000, // 2 minutes ago + }); + + // Mock useStopLossPrompt to return add_margin variant + const { useStopLossPrompt } = jest.requireMock( + '../../hooks/useStopLossPrompt', + ); + useStopLossPrompt.mockReturnValue({ + variant: 'add_margin', + liquidationDistance: 2.5, + suggestedStopLossPrice: null, + suggestedStopLossPercent: null, + isVisible: true, + onDismissComplete: jest.fn(), + }); + + const { getByTestId, getByText } = renderWithProvider( + + + , + { + state: initialState, + }, + ); + + // Click the add margin button from mocked stop loss prompt banner + const addMarginBannerButton = getByTestId( + 'stop-loss-prompt-add-margin-button', + ); + fireEvent.press(addMarginBannerButton); + + expect(getByText('Geo Block Tooltip')).toBeTruthy(); + expect(mockNavigate).not.toHaveBeenCalledWith( + expect.anything(), + expect.objectContaining({ mode: 'add' }), + ); + }); + + it('shows geo block modal when set stop loss from banner is pressed and user is not eligible', () => { + const { useSelector } = jest.requireMock('react-redux'); + const mockSelectPerpsEligibility = jest.requireMock( + '../../selectors/perpsController', + ).selectPerpsEligibility; + useSelector.mockImplementation((selector: unknown) => { + if (selector === mockSelectPerpsEligibility) { + return false; + } + return undefined; + }); + + // Set up existing position and stop loss prompt conditions + mockUseHasExistingPosition.mockReturnValue({ + hasPosition: true, + isLoading: false, + error: null, + existingPosition: { + symbol: 'BTC', + size: '0.5', + entryPrice: '50000', + leverage: { value: 10, type: 'isolated' }, + marginUsed: '5000', + unrealizedPnl: '-500', + returnOnEquity: '-0.10', + liquidationPrice: '45000', + }, + refreshPosition: jest.fn(), + positionOpenedTimestamp: Date.now() - 120000, // 2 minutes ago + }); + + // Mock useStopLossPrompt to return stop_loss variant + const { useStopLossPrompt } = jest.requireMock( + '../../hooks/useStopLossPrompt', + ); + useStopLossPrompt.mockReturnValue({ + variant: 'stop_loss', + liquidationDistance: 15, + suggestedStopLossPrice: '45000', + suggestedStopLossPercent: -50, + isVisible: true, + onDismissComplete: jest.fn(), + }); + + const { getByTestId, getByText } = renderWithProvider( + + + , + { + state: initialState, + }, + ); + + // Click the set stop loss button from mocked stop loss prompt banner + const setStopLossBannerButton = getByTestId( + 'stop-loss-prompt-set-sl-button', + ); + fireEvent.press(setStopLossBannerButton); + + expect(getByText('Geo Block Tooltip')).toBeTruthy(); + }); }); describe('Notification tooltip functionality', () => { diff --git a/app/components/UI/Perps/Views/PerpsMarketDetailsView/PerpsMarketDetailsView.tsx b/app/components/UI/Perps/Views/PerpsMarketDetailsView/PerpsMarketDetailsView.tsx index bbe9b9ce4a07..8a738ec25c71 100644 --- a/app/components/UI/Perps/Views/PerpsMarketDetailsView/PerpsMarketDetailsView.tsx +++ b/app/components/UI/Perps/Views/PerpsMarketDetailsView/PerpsMarketDetailsView.tsx @@ -718,6 +718,18 @@ const PerpsMarketDetailsView: React.FC = () => { const handleAutoClosePress = useCallback(() => { if (!existingPosition) return; + // Geo-restriction check for auto-close (TP/SL) action + if (!isEligible) { + track(MetaMetricsEvents.PERPS_SCREEN_VIEWED, { + [PerpsEventProperties.SCREEN_TYPE]: + PerpsEventValues.SCREEN_TYPE.GEO_BLOCK_NOTIF, + [PerpsEventProperties.SOURCE]: + PerpsEventValues.SOURCE.AUTO_CLOSE_ACTION, + }); + setIsEligibilityModalVisible(true); + return; + } + navigation.navigate(Routes.PERPS.TPSL, { asset: existingPosition.symbol, currentPrice, @@ -737,12 +749,32 @@ const PerpsMarketDetailsView: React.FC = () => { ); }, }); - }, [existingPosition, currentPrice, navigation, handleUpdateTPSL]); + }, [ + existingPosition, + currentPrice, + navigation, + handleUpdateTPSL, + isEligible, + track, + ]); const handleMarginPress = useCallback(() => { if (!existingPosition) return; + + // Geo-restriction check for add/remove margin action + if (!isEligible) { + track(MetaMetricsEvents.PERPS_SCREEN_VIEWED, { + [PerpsEventProperties.SCREEN_TYPE]: + PerpsEventValues.SCREEN_TYPE.GEO_BLOCK_NOTIF, + [PerpsEventProperties.SOURCE]: + PerpsEventValues.SOURCE.ADJUST_MARGIN_ACTION, + }); + setIsEligibilityModalVisible(true); + return; + } + openAdjustMarginSheet(); - }, [existingPosition, openAdjustMarginSheet]); + }, [existingPosition, openAdjustMarginSheet, isEligible, track]); const handleSharePress = useCallback(() => { if (!existingPosition) return; @@ -823,6 +855,18 @@ const PerpsMarketDetailsView: React.FC = () => { const handleAddMarginFromBanner = useCallback(() => { if (!existingPosition) return; + // Geo-restriction check for add margin from banner + if (!isEligible) { + track(MetaMetricsEvents.PERPS_SCREEN_VIEWED, { + [PerpsEventProperties.SCREEN_TYPE]: + PerpsEventValues.SCREEN_TYPE.GEO_BLOCK_NOTIF, + [PerpsEventProperties.SOURCE]: + PerpsEventValues.SOURCE.STOP_LOSS_PROMPT_ADD_MARGIN, + }); + setIsEligibilityModalVisible(true); + return; + } + // Navigate directly to PerpsAdjustMarginView with mode='add' navigation.navigate(Routes.PERPS.ADJUST_MARGIN, { position: existingPosition, @@ -837,12 +881,24 @@ const PerpsMarketDetailsView: React.FC = () => { [PerpsEventProperties.SOURCE]: PerpsEventValues.SOURCE.STOP_LOSS_PROMPT_BANNER, }); - }, [existingPosition, navigation, track]); + }, [existingPosition, navigation, track, isEligible]); // Handler for "Set Stop Loss" from stop loss prompt banner const handleSetStopLossFromBanner = useCallback(async () => { if (!existingPosition || !suggestedStopLossPrice) return; + // Geo-restriction check for set stop loss from banner + if (!isEligible) { + track(MetaMetricsEvents.PERPS_SCREEN_VIEWED, { + [PerpsEventProperties.SCREEN_TYPE]: + PerpsEventValues.SCREEN_TYPE.GEO_BLOCK_NOTIF, + [PerpsEventProperties.SOURCE]: + PerpsEventValues.SOURCE.STOP_LOSS_PROMPT_SET_SL, + }); + setIsEligibilityModalVisible(true); + return; + } + setIsSettingStopLoss(true); try { @@ -881,7 +937,13 @@ const PerpsMarketDetailsView: React.FC = () => { } finally { setIsSettingStopLoss(false); } - }, [existingPosition, suggestedStopLossPrice, handleUpdateTPSL, track]); + }, [ + existingPosition, + suggestedStopLossPrice, + handleUpdateTPSL, + track, + isEligible, + ]); // Handler for when banner fade-out animation completes const handleBannerFadeOutComplete = useCallback(() => { diff --git a/app/components/UI/Perps/Views/PerpsOrderBookView/PerpsOrderBookView.test.tsx b/app/components/UI/Perps/Views/PerpsOrderBookView/PerpsOrderBookView.test.tsx index c72693dad975..003e0dacd12e 100644 --- a/app/components/UI/Perps/Views/PerpsOrderBookView/PerpsOrderBookView.test.tsx +++ b/app/components/UI/Perps/Views/PerpsOrderBookView/PerpsOrderBookView.test.tsx @@ -282,6 +282,26 @@ jest.mock('../PerpsSelectModifyActionView', () => { }; }); +// Mock PerpsBottomSheetTooltip for geo-block modal +jest.mock( + '../../components/PerpsBottomSheetTooltip/PerpsBottomSheetTooltip', + () => { + const { View } = jest.requireActual('react-native'); + return { + __esModule: true, + default: (props: { testID?: string; isVisible?: boolean }) => + props.isVisible ? ( + + ) : null, + }; + }, +); + +// Mock perpsController selectors - return eligible by default for action button tests +jest.mock('../../selectors/perpsController', () => ({ + selectPerpsEligibility: jest.fn(() => true), +})); + describe('PerpsOrderBookView', () => { const initialState = { engine: { @@ -786,6 +806,154 @@ describe('PerpsOrderBookView', () => { }); }); + describe('geo-restriction', () => { + const mockLongPosition = { + symbol: 'BTC', + size: '1.5', + entryPrice: '50000', + leverage: { value: 10, type: 'cross' as const }, + margin: '5000', + unrealizedPnl: '100', + unrealizedPnlPercent: '2', + liquidationPrice: '45000', + takeProfitPrice: undefined, + stopLossPrice: undefined, + returnOnEquity: '2', + }; + + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('shows geo-block modal when Long button pressed and user is not eligible', () => { + const { selectPerpsEligibility } = jest.requireMock( + '../../selectors/perpsController', + ); + selectPerpsEligibility.mockReturnValue(false); + + const { getByTestId, queryByTestId } = renderWithProvider( + , + { + state: initialState, + }, + ); + + const longButton = getByTestId( + PerpsOrderBookViewSelectorsIDs.LONG_BUTTON, + ); + fireEvent.press(longButton); + + // Navigation should NOT be called + expect(mockNavigateToOrder).not.toHaveBeenCalled(); + // Geo-block tooltip should be shown + expect( + queryByTestId( + `${PerpsOrderBookViewSelectorsIDs.CONTAINER}-geo-block-tooltip`, + ), + ).toBeOnTheScreen(); + }); + + it('shows geo-block modal when Short button pressed and user is not eligible', () => { + const { selectPerpsEligibility } = jest.requireMock( + '../../selectors/perpsController', + ); + selectPerpsEligibility.mockReturnValue(false); + + const { getByTestId, queryByTestId } = renderWithProvider( + , + { + state: initialState, + }, + ); + + const shortButton = getByTestId( + PerpsOrderBookViewSelectorsIDs.SHORT_BUTTON, + ); + fireEvent.press(shortButton); + + // Navigation should NOT be called + expect(mockNavigateToOrder).not.toHaveBeenCalled(); + // Geo-block tooltip should be shown + expect( + queryByTestId( + `${PerpsOrderBookViewSelectorsIDs.CONTAINER}-geo-block-tooltip`, + ), + ).toBeOnTheScreen(); + }); + + it('shows geo-block modal when Close button pressed and user is not eligible', () => { + const { selectPerpsEligibility } = jest.requireMock( + '../../selectors/perpsController', + ); + selectPerpsEligibility.mockReturnValue(false); + + const { useHasExistingPosition } = jest.requireMock( + '../../hooks/useHasExistingPosition', + ); + useHasExistingPosition.mockReturnValue({ + isLoading: false, + existingPosition: mockLongPosition, + }); + + const { getByTestId, queryByTestId } = renderWithProvider( + , + { + state: initialState, + }, + ); + + const closeButton = getByTestId( + PerpsOrderBookViewSelectorsIDs.CLOSE_BUTTON, + ); + fireEvent.press(closeButton); + + // Navigation should NOT be called + expect(mockNavigateToClosePosition).not.toHaveBeenCalled(); + // Geo-block tooltip should be shown + expect( + queryByTestId( + `${PerpsOrderBookViewSelectorsIDs.CONTAINER}-geo-block-tooltip`, + ), + ).toBeOnTheScreen(); + }); + + it('shows geo-block modal when Modify button pressed and user is not eligible', () => { + const { selectPerpsEligibility } = jest.requireMock( + '../../selectors/perpsController', + ); + selectPerpsEligibility.mockReturnValue(false); + + const { useHasExistingPosition } = jest.requireMock( + '../../hooks/useHasExistingPosition', + ); + useHasExistingPosition.mockReturnValue({ + isLoading: false, + existingPosition: mockLongPosition, + }); + + const { getByTestId, queryByTestId } = renderWithProvider( + , + { + state: initialState, + }, + ); + + const modifyButton = getByTestId( + PerpsOrderBookViewSelectorsIDs.MODIFY_BUTTON, + ); + fireEvent.press(modifyButton); + + // Modify sheet should NOT be opened + expect(mockOpenModifySheet).not.toHaveBeenCalled(); + // Geo-block tooltip should be shown + expect( + queryByTestId( + `${PerpsOrderBookViewSelectorsIDs.CONTAINER}-geo-block-tooltip`, + ), + ).toBeOnTheScreen(); + }); + }); + describe('error state', () => { it('displays error message when order book fails to load', () => { mockUsePerpsLiveOrderBook.mockReturnValue({ diff --git a/app/components/UI/Perps/Views/PerpsOrderBookView/PerpsOrderBookView.tsx b/app/components/UI/Perps/Views/PerpsOrderBookView/PerpsOrderBookView.tsx index 6a28d138bb6e..e420cbffe1da 100644 --- a/app/components/UI/Perps/Views/PerpsOrderBookView/PerpsOrderBookView.tsx +++ b/app/components/UI/Perps/Views/PerpsOrderBookView/PerpsOrderBookView.tsx @@ -18,6 +18,7 @@ import { SafeAreaView, useSafeAreaInsets, } from 'react-native-safe-area-context'; +import { useSelector } from 'react-redux'; import { PerpsOrderBookViewSelectorsIDs } from '../../Perps.testIds'; import { strings } from '../../../../../../locales/i18n'; import ButtonSemantic, { @@ -70,6 +71,7 @@ import { usePerpsEventTracking } from '../../hooks/usePerpsEventTracking'; import { usePerpsMeasurement } from '../../hooks/usePerpsMeasurement'; import { usePerpsOrderBookGrouping } from '../../hooks/usePerpsOrderBookGrouping'; import { selectPerpsButtonColorTestVariant } from '../../selectors/featureFlags'; +import { selectPerpsEligibility } from '../../selectors/perpsController'; import { BUTTON_COLOR_TEST } from '../../utils/abTesting/tests'; import { usePerpsABTest } from '../../utils/abTesting/usePerpsABTest'; import { @@ -113,6 +115,11 @@ const PerpsOrderBookView: React.FC = ({ featureFlagSelector: selectPerpsButtonColorTestVariant, }); + // Geo-restriction eligibility check + const isEligible = useSelector(selectPerpsEligibility); + const [isEligibilityModalVisible, setIsEligibilityModalVisible] = + useState(false); + // Get market data for the header const { markets } = usePerpsMarkets(); const market = useMemo( @@ -343,6 +350,18 @@ const PerpsOrderBookView: React.FC = ({ // Handle Long button press const handleLongPress = useCallback(() => { + // Geo-restriction check + if (!isEligible) { + track(MetaMetricsEvents.PERPS_SCREEN_VIEWED, { + [PerpsEventProperties.SCREEN_TYPE]: + PerpsEventValues.SCREEN_TYPE.GEO_BLOCK_NOTIF, + [PerpsEventProperties.SOURCE]: + PerpsEventValues.SOURCE.ORDER_BOOK_LONG_BUTTON, + }); + setIsEligibilityModalVisible(true); + return; + } + track(MetaMetricsEvents.PERPS_UI_INTERACTION, { [PerpsEventProperties.INTERACTION_TYPE]: PerpsEventValues.INTERACTION_TYPE.TAP, @@ -359,6 +378,7 @@ const PerpsOrderBookView: React.FC = ({ asset: symbol || '', }); }, [ + isEligible, symbol, navigateToOrder, track, @@ -368,6 +388,18 @@ const PerpsOrderBookView: React.FC = ({ // Handle Short button press const handleShortPress = useCallback(() => { + // Geo-restriction check + if (!isEligible) { + track(MetaMetricsEvents.PERPS_SCREEN_VIEWED, { + [PerpsEventProperties.SCREEN_TYPE]: + PerpsEventValues.SCREEN_TYPE.GEO_BLOCK_NOTIF, + [PerpsEventProperties.SOURCE]: + PerpsEventValues.SOURCE.ORDER_BOOK_SHORT_BUTTON, + }); + setIsEligibilityModalVisible(true); + return; + } + track(MetaMetricsEvents.PERPS_UI_INTERACTION, { [PerpsEventProperties.INTERACTION_TYPE]: PerpsEventValues.INTERACTION_TYPE.TAP, @@ -384,6 +416,7 @@ const PerpsOrderBookView: React.FC = ({ asset: symbol || '', }); }, [ + isEligible, symbol, navigateToOrder, track, @@ -394,14 +427,40 @@ const PerpsOrderBookView: React.FC = ({ // Handle Close position button press const handleClosePosition = useCallback(() => { if (!existingPosition) return; + + // Geo-restriction check + if (!isEligible) { + track(MetaMetricsEvents.PERPS_SCREEN_VIEWED, { + [PerpsEventProperties.SCREEN_TYPE]: + PerpsEventValues.SCREEN_TYPE.GEO_BLOCK_NOTIF, + [PerpsEventProperties.SOURCE]: + PerpsEventValues.SOURCE.ORDER_BOOK_CLOSE_BUTTON, + }); + setIsEligibilityModalVisible(true); + return; + } + navigateToClosePosition(existingPosition); - }, [existingPosition, navigateToClosePosition]); + }, [existingPosition, navigateToClosePosition, isEligible, track]); // Handle Modify position button press const handleModifyPress = useCallback(() => { if (!existingPosition) return; + + // Geo-restriction check + if (!isEligible) { + track(MetaMetricsEvents.PERPS_SCREEN_VIEWED, { + [PerpsEventProperties.SCREEN_TYPE]: + PerpsEventValues.SCREEN_TYPE.GEO_BLOCK_NOTIF, + [PerpsEventProperties.SOURCE]: + PerpsEventValues.SOURCE.ORDER_BOOK_MODIFY_BUTTON, + }); + setIsEligibilityModalVisible(true); + return; + } + openModifySheet(); - }, [existingPosition, openModifySheet]); + }, [existingPosition, openModifySheet, isEligible, track]); // Error state if (error) { @@ -709,6 +768,16 @@ const PerpsOrderBookView: React.FC = ({ onReversePosition={handleReversePosition} /> )} + + {/* Geo-restriction Modal */} + {isEligibilityModalVisible && ( + setIsEligibilityModalVisible(false)} + contentKey={'geo_block'} + testID={`${PerpsOrderBookViewSelectorsIDs.CONTAINER}-geo-block-tooltip`} + /> + )} ); }; diff --git a/app/components/UI/Perps/Views/PerpsTabView/PerpsTabView.tsx b/app/components/UI/Perps/Views/PerpsTabView/PerpsTabView.tsx index c9c411b3aff4..d4fc801e3c6e 100644 --- a/app/components/UI/Perps/Views/PerpsTabView/PerpsTabView.tsx +++ b/app/components/UI/Perps/Views/PerpsTabView/PerpsTabView.tsx @@ -25,6 +25,7 @@ import PerpsCard from '../../components/PerpsCard'; import { PerpsTabControlBar } from '../../components/PerpsTabControlBar'; import { useSelector } from 'react-redux'; import { selectHomepageRedesignV1Enabled } from '../../../../../selectors/featureFlagController/homepage'; +import { selectPerpsEligibility } from '../../selectors/perpsController'; import { PerpsEventProperties, PerpsEventValues, @@ -56,6 +57,8 @@ const PerpsTabView: React.FC = () => { const isHomepageRedesignV1Enabled = useSelector( selectHomepageRedesignV1Enabled, ); + const isEligible = useSelector(selectPerpsEligibility); + const { track } = usePerpsEventTracking(); const { positions, isInitialLoading } = usePerpsLivePositions({ throttleMs: 1000, // Update positions every second @@ -117,12 +120,23 @@ const PerpsTabView: React.FC = () => { } }, [navigation, isFirstTimeUser]); - // Modal handlers - now using navigation to modal stack + // Modal handlers - now using navigation to modal stack with geo-restriction check const handleCloseAllPress = useCallback(() => { + // Geo-restriction check for close all positions + if (!isEligible) { + track(MetaMetricsEvents.PERPS_SCREEN_VIEWED, { + [PerpsEventProperties.SCREEN_TYPE]: + PerpsEventValues.SCREEN_TYPE.GEO_BLOCK_NOTIF, + [PerpsEventProperties.SOURCE]: + PerpsEventValues.SOURCE.CLOSE_ALL_POSITIONS_BUTTON, + }); + setIsEligibilityModalVisible(true); + return; + } navigation.navigate(Routes.PERPS.MODALS.ROOT, { screen: Routes.PERPS.MODALS.CLOSE_ALL_POSITIONS, }); - }, [navigation]); + }, [isEligible, navigation, track]); const handleCancelAllPress = useCallback(() => { navigation.navigate(Routes.PERPS.MODALS.ROOT, { diff --git a/app/components/UI/Perps/constants/eventNames.ts b/app/components/UI/Perps/constants/eventNames.ts index 3d67548c58fa..8a12c98af492 100644 --- a/app/components/UI/Perps/constants/eventNames.ts +++ b/app/components/UI/Perps/constants/eventNames.ts @@ -214,6 +214,18 @@ export const PerpsEventValues = { // TAT-2449: Geo-block sources for close/modify actions CLOSE_POSITION_ACTION: 'close_position_action', MODIFY_POSITION_ACTION: 'modify_position_action', + // Geo-block sources for order book actions + ORDER_BOOK_LONG_BUTTON: 'order_book_long_button', + ORDER_BOOK_SHORT_BUTTON: 'order_book_short_button', + ORDER_BOOK_CLOSE_BUTTON: 'order_book_close_button', + ORDER_BOOK_MODIFY_BUTTON: 'order_book_modify_button', + // Geo-block sources for position management actions + AUTO_CLOSE_ACTION: 'auto_close_action', + ADJUST_MARGIN_ACTION: 'adjust_margin_action', + STOP_LOSS_PROMPT_ADD_MARGIN: 'stop_loss_prompt_add_margin', + STOP_LOSS_PROMPT_SET_SL: 'stop_loss_prompt_set_sl', + // Geo-block sources for bulk actions + CLOSE_ALL_POSITIONS_BUTTON: 'close_all_positions_button', }, WARNING_TYPE: { MINIMUM_DEPOSIT: 'minimum_deposit', From 3ebcfa8c030d5c1c7f1185f38140d9ad6bd69df5 Mon Sep 17 00:00:00 2001 From: metamaskbot Date: Thu, 29 Jan 2026 18:55:01 +0000 Subject: [PATCH 46/80] [skip ci] Bump version number to 3577 --- android/app/build.gradle | 2 +- bitrise.yml | 4 ++-- ios/MetaMask.xcodeproj/project.pbxproj | 12 ++++++------ 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 133c46887e50..df3ffc11aa57 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -188,7 +188,7 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion versionName "7.63.0" - versionCode 3572 + versionCode 3577 testBuildType System.getProperty('testBuildType', 'debug') testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" manifestPlaceholders.MM_BRANCH_KEY_TEST = "$System.env.MM_BRANCH_KEY_TEST" diff --git a/bitrise.yml b/bitrise.yml index 6d9e97b3d9ff..006f5c2c9be6 100644 --- a/bitrise.yml +++ b/bitrise.yml @@ -3472,13 +3472,13 @@ app: VERSION_NAME: 7.63.0 - opts: is_expand: false - VERSION_NUMBER: 3572 + VERSION_NUMBER: 3577 - opts: is_expand: false FLASK_VERSION_NAME: 7.63.0 - opts: is_expand: false - FLASK_VERSION_NUMBER: 3572 + FLASK_VERSION_NUMBER: 3577 - opts: is_expand: false ANDROID_APK_LINK: '' diff --git a/ios/MetaMask.xcodeproj/project.pbxproj b/ios/MetaMask.xcodeproj/project.pbxproj index 00cab4b23d1a..629636bd7c1b 100644 --- a/ios/MetaMask.xcodeproj/project.pbxproj +++ b/ios/MetaMask.xcodeproj/project.pbxproj @@ -1281,7 +1281,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3572; + CURRENT_PROJECT_VERSION = 3577; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 48XVW22RCG; @@ -1350,7 +1350,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3572; + CURRENT_PROJECT_VERSION = 3577; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 48XVW22RCG; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 48XVW22RCG; @@ -1416,7 +1416,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3572; + CURRENT_PROJECT_VERSION = 3577; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 48XVW22RCG; @@ -1483,7 +1483,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3572; + CURRENT_PROJECT_VERSION = 3577; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 48XVW22RCG; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 48XVW22RCG; @@ -1646,7 +1646,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3572; + CURRENT_PROJECT_VERSION = 3577; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 48XVW22RCG; @@ -1716,7 +1716,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3572; + CURRENT_PROJECT_VERSION = 3577; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 48XVW22RCG; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 48XVW22RCG; From 4f5e2bf11aff1c790c0082f0ebf79354e33dc5f8 Mon Sep 17 00:00:00 2001 From: MetaMask Bot <37885440+metamaskbot@users.noreply.github.com> Date: Fri, 30 Jan 2026 07:38:03 -0500 Subject: [PATCH 47/80] release: release/7.63.0-Changelog (#25067) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR updates the change log for 7.63.0. (Hotfix - no test plan generated.) --------- Co-authored-by: metamaskbot Co-authored-by: João Loureiro <175489935+joaoloureirop@users.noreply.github.com> --- CHANGELOG.md | 288 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 287 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8d51a248853a..163c83c36825 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,291 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [7.63.0] + +### Added + +- Added "Claim bonus" CTA on token list items for tokens with claimable mUSD bonuses, with automatic scroll to claim section on (#24982) + asset details page +- Removed unnecessary security alerts when revoking token permissions from malicious addresses (#24592) +- Update MegaETH RPC (Infura) and explorer (Blockscout) URLs (#24939) + add migration (113) for MegaETH RPC (Infura) and + explorer (Blockscout) URLs +- Added ability to view card details (card number, expiration, and CVV) as a secure image. Improved card onboarding (#25021) + experience on Android with better keyboard handling. Added card + provisioning status message. +- Added new `network-fee-row` component and conditionally render it for mUSD conversion transactions. (#24943) +- Added smooth slide animation when selecting regions with states in buy/sell flows (#24911) +- Upgrade smart-transactions-controller and replace the legacy smart transactions swaps flags with smart transactions flags from (#23847) + remote config API. +- Redesigned Card Home screen with improved balance display layout and simplified KYC verification flow (#24954) +- Added deeplink support to navigate directly to the Trending/Explore screen (#24952) +- Added geo-blocking for mUSD conversion feature to restrict access in non-compliant countries (#24501) +- Add Merkl Rewards Claim Functionality (#24487) +- Added per-token dismissal for mUSD conversion CTA on asset detail page (#24590) +- Added mUSD developer options section with button to reset education screen seen state (#24949) +- Updated copy for the mUSD conversion education screen. (#24948) +- Adds settings page for changing ramp region (#24856) +- Added optional quickActionsHint to custom-amount-info (#24914) +- Improved readability of market data on Token Details page by shortening large numbers with abbreviations (K/M/B/T) and (#24560) + increasing font size +- Added a check to make the buy button invisible for unsupported tokens (#24924) +- Updated the copy for the mUSD conversion claimable bonus tooltip. (#24912) +- - Add change utxo dropped when full swap use case ([#572](https://github.com/MetaMask/snap-bitcoin-wallet/pull/572)) (#24922) +- Update p2wsh, p2tr and p2sh dust minimum value + ([#570](https://github.com/MetaMask/snap-bitcoin-wallet/pull/570)) +- Refresh smart-transaction feature liveness in bridge and transaction flows. (#24087) +- Fixed font rendering on Android Card welcome screen, improved error messages for incorrect SMS codes, and enhanced keyboard (#24860) + handling during Card onboarding +- Add support for `InsufficientBalanceToCoverFee` error response from Snaps (#24747) +- (Behind feature flag) Fixed UI inconsistency when adding accounts in full-page account list mode - actions now appear as a (#24468) + bottom sheet overlay +- Added replaces active tab if max tabs are open and request comes from trending (#24555) +- Improved browser experience by hiding the app navigation bar when browsing and redesigned the browser controls with (#24444) + quick-access buttons for reloading pages, managing bookmarks, and + opening new tabs, plus added close and tabs buttons to the URL bar +- Add first iteration of mUSD conversion segment events (#24457) +- Added Perps Discovery Banner on spot asset detail screens to help users discover perpetual trading options (#24512) +- Adopted new ramp controller variable names (#24280) +- Updated Networks bottom sheet to open at 50% screen height with improved header and close button (#24493) +- Refactored mUSD conversion CTA rendering conditions (#24335) +- UseTokenAsset to make use of `@assets-controller` `getNativeTokenAddress` implementation. (#24483) +- Added a "Give feedback" button to Perps home screen (#24511) +- Hide Earn product entry points for ineligible users (#24490) +- Add 5 min polling to trending tokens (#24462) +- Adds intent based swap support (#23776) +- Improved Card onboarding flow with better state handling and navigation after delegation setup (#24430) +- Added perps deeplinks for home view, market list with category filtering, and HIP-3 asset support (#24132) +- Set trending token as the dest token when navigating to swaps (#24373) +- Misc mUSD conversion flow design changes ahead of UAT (#24336) +- Perps icon fallback url mechanism (#24340) +- Added fill type indicators (Take Profit, Stop Loss, Liquidation, ADL) to perps transactions on Home and Market Details (#24259) + screens +- Allow metal card rewards claim when season 1 ends (#24314) +- Ai workflow with jira and simulator setup (#24283) +- feat: bip39 word bar suggestions in onboarding and import srp module. (#22927) +- Added a fallback for Perps users who have Basic Functionality disabled. (#23952) +- Added remotely configurable allowlist and blocklist for mUSD conversion tokens. (#24126) +- Use optimistic approach when updating TP/SL in perps (#24159) +- Added OTA updates modal (#24175) +- Updated token list item musd conversion cta position to secondary balance position. This replaces the price change percentage (#24249) + for specified stablecoins +- Added a verification step to the Card onboarding flow to validate Veriff KYC results before proceeding. (#24246) +- Added override functionality to remote feature flags with methods to set and clear overrides and access A/B test groups (#23487) +- Improved initial cross ecosystem connection flows by preselecting all supported chains (EVM + Solana) when connecting through (#24137) + injected providers. +- Implement modal for user already has a Card account (#24007) +- Added card-home deeplink handler to navigate users to MetaMask Card based on authentication and card-linked account status (#24118) +- Fixed HIP-3 market symbols displaying with DEX prefix in Order Book view (#24068) +- Added ability to view trade details when tapping on recent trades in Perps, with a "Trade again" button to quickly navigate (#24067) + back to trading +- Added new card-onboarding deeplink to navigate users to the MetaMask Card feature (#24042) +- Reveal SRP flow ui and text updates. (#24058) +- Fixed "See all" button visibility in Perps Recent Activity section (#24099) +- Updated limit price presets to include Mid and Bid/Ask buttons for quicker price selection (#24069) +- Re-enabled order book access from perps market details view (#24010) +- Changed address copy confirmation from modal to Toast notification (#23980) +- Add Tron Account Change detection support for multichain Api (#23639) +- Removed hardcoded mainnet output chainId for mUSD conversion flow (#23704) +- Add animation for importSRP and create password layout and vice-versa (#24011) +- Updated mUSD conversion education screen theming (#23949) +- Update optin metrics screen ui changes (#24008) +- NFTs allow fetching one page and aborting fetch when navigating away (#23962) +- Removed the notification badge from the card icon button (#23978) +- Improved Toast component visual alignment and positioning (#23928) +- Updated Deposit page transition to slide in from the right instead of bottom (#23913) +- Updated NFT details pages to slide in from right instead of from bottom (#23912) +- Changed DeFi protocol detail page to slide in from right instead of from bottom (#23911) +- Added QuickNode fallback RPC for Monad. (#23479) +- Added paste button for email verification code input on Deposit flow (#23939) +- Automatically change the destination asset to match source asset chain when users land on swaps. (#23822) +- Added useTronStakeApy hook (#23743) +- Added support for delegating Base assets in the MetaMask Card feature (#23509) +- Implement MM Travel and ToS links on Card Home (#23550) +- Disable token selection in Perps and Predict deposits if no native balance and gas station not supported (#23680) +- Updated the mUSD confirmation screen's header to display the mUSD token and target network icon. (#23691) +- Added mUSD CTA to asset overview screen (#23562) +- Add support for progressive rollout FF (#23670) +- Adds "Inaccurate fee" alert in Confirmations (#23588) +- Fixed Perps tab to display total balance instead of available balance (#23466) +- Add conditional rendering of bridge-time-row by tx type (#23552) +- Adds 1-click approval/deposit transaction confirmation flow for Earn lending (#23154) +- Add mUSD conversion CTA above token list (#23390) +- Fixed an issue where users could accidentally add burn addresses to their contacts, which could lead to sending funds to (#23358) + unrecoverable addresses +- Social Login user create wallet will always enable metametric flag (#22469) + SRP user create wallet will always disable metametric + flag by default and prompted metametric screen +- Add support for gas-included swaps with EIP-7702 (#22593) +- Added MegaETH Mainnet to Additional Networks (PopularList) (#23401) +- Added new simplified predict market row item for trending (#23388) +- Network connection banner now hides immediately when network becomes available again (#23425) +- Get marketData on trending search request (#23197) +- Added automatic saving and restoration of trade form configuration when navigating away from the perps trading screen (#23321) +- Add mUSD conversion education screen on first visit to conversion flow (#22972) +- Added price deviation warning to Perps trading interface to prevent opening positions when perps price deviates (#23242) + significantly from spot price + +### Fixed + +- Fixed "Get 3% Stablecoins" heading being rendered on 3 lines. (#25052) +- Fixed `Stake` button showing for assets in the Tron network that were not native TRX (#25043) +- Updated design of perps SortBy bottomSheet (#24970) +- Update SRP flow to display multichain accounts (#24906) +- Fixed TrendingTokenPriceChangeBottomSheet to discard uncommitted changes when reopened. (#24977) +- Fixed TRX token logo displaying incorrectly in swap token selector list (#24942) +- Align the trending tokens network selector UI with the standard network selector for consistency. (#24417) +- Updated secondary mUSD conversion CTA text to get 3% mUSD bonus (#24944) +- Biometric choice logic update (#24695) +- Ensure proper responses when requesting invalid RPC methods using the multichain API (#24887) +- Fixed insufficient balance alert incorrectly showing when using max amount in MetaMask Pay (#24903) +- Trending view search filtering improvement (#24891) +- Display custom msg for chart data when there is a single data point (#24917) +- Remove the network confirmation modal on trending flow (#24888) +- Updated address copy confirmation to show a toast notification instead of inline overlay (#24599) +- Updated get mUSD cta to respect network filter when creating mUSD conversion tx (#24907) +- Predict empty search screen items (#24892) +- Removes Non evm balance section in asset details page when zero (#24332) +- Trending tokens view safe area cleanup (#24883) +- Explore sites icons sizes and padding issues (#24877) +- Fallback to symbol if name is null on trending page (#24813) +- Network selector startup crash (#24872) +- Fixed UI copy casing to align with sentence case standards and corrected punctuation inconsistencies (#23296) +- Adds per network min value params for trending token (#24730) +- Improved price display for trending tokens with subscript notation for very small values (e.g., $0.0₆14) (#24441) +- Show custom error msg page when user searches for token not found on trending page (#24569) +- Fixed a bug where TextField components could wrap text to multiple lines even when multiline={false} (#24584) +- Adds configurable minimum fiat balance required for tokens to be eligible for mUSD conversion flow and CTAs (#24532) +- Fixed a bug where quotes would attempt to refresh even while a swap was being actively submitted (#24552) +- None (#24548) +- Adds predict sports primitives (#24506) +- Fixed QR code scanning in dark mode by adding white background (#24533) +- Fix incorrect skeleton used for predictions when searching in main explore page (#24519) +- Fix trending tokens search crashes on search (#24517) +- Explore browser tab open behaviour when opening empty vs populated browser (#24371) +- Use preferred search engine on trending (#24513) +- Add fallback for cardFeature flag using local value (#24428) +- Use custom values for liquidity and min14hvalue param for trending requests (#24481) +- fix: search token input box size (#24380) +- Fixed sentence case violations in locale strings (#24451) +- Add MetaMask Portfolio to explore sites (#24369) +- Reset token icon when source changes to recalculate fallback (#24334) +- Fixed a bug where total volume was displaying the wrong value in asset details page (#24331) +- Fix Predict feed animations, tab bar UI and search overlay (#24337) +- Using v3 api to get historical prices for asset details page instead of v1 (#24315) +- Bug fix where a user couldn't scroll through the SRP reveal bottom sheet on Android (#24338) +- Removes `Add account` in the account selector during the ramps flow. (#22114) +- Fixed an issue where Perps withdrawal indicators could remain stuck in "pending" state after the withdrawal completed (#24214) +- Fix trending search not getting market data (#24311) +- Token 2022 send (#24350) +- Fixed TP/SL price input validation to respect HyperLiquid's 5 significant figure limit (#24169) +- Fixes an issue where flipping source/dest assets do not update balances when user has zero balance on non-evm chains (#24329) +- Add conditional mounting to perps tab in Activity View (#24271) +- Add hybrid REST/websocket approach to building recent activity (#24212) +- Added ScreenshotDeterrent to the login page to prevent screenshots and recordings on the page. (#24285) +- Improved Card performance by reducing redundant authentication token refresh requests and ensuring CardHome updates (#24295) + correctly after changing the spending asset or spending limit. +- Updated Edit Account Name to display as a full-page drill-down with right-to-left transition and back button instead of a (#23579) + bottom sheet modal +- Fixed Swap button not showing for trending tokens on asset details page (#24299) +- Prevent filtering of transactions with 0x0 hash in activity view (#24289) +- Fixes a small localization key bug in the OTP code screen for Buy (deposit) (#24264) +- Modify the android manifest so that android 12+ will never ask for location permission. (#23759) +- Fixes issue where certain search queries in Predict would return no results (#24266) +- Fixed UI styling inconsistencies in Perps close positions and market balance views (#24234) +- Fixed inconsistent font size for TP/SL text in Perps position card (#24238) +- Fixed analytics `ramp_type` to correctly report `UNIFIED_BUY` when Unified Ramp V1 is enabled (#24245) +- Phishing screen UX background color papercut (#23836) +- Use cache headers on sentinel calls (#23429) +- Fixed mUSD conversion flow not rejecting transactions when navigating away (#24171) +- Fixed inconsistent price formatting on TradingView chart y-axis that showed unnecessary trailing zeros (#24184) +- Fixed rounded corners in Perps order screen when there are more than 2 rows displayed (#24162) +- Fixed payment method selector modal scroll not working (#24188) +- Fixed liquidation distance showing 0% instead of fallback when liquidation price is unavailable (#24128) +- Fixed sentence case violations in English locale strings lines 6001-7000 (#24056) +- Fixed market name text being truncated in Perps header for hip-3 markets (#24140) +- Fixed position size USD display showing 3 decimals instead of 2 (#24131) +- Added indicator name shortcuts in Perps asset pills to reflect sorting mechanism (#24130) +- Fixed sentence case violations in English locale strings lines 7001-7279 (#24127) +- Fixed bug where requesting quotes for successive non-EVM networks failed (#24095) +- Fixes header text in token details page (#24101) +- Fix balance updates using the new feature flags for balance fetching (#24156) +- Fixed sentence case violations in English locale strings lines 4001-5000 (#23996) +- Fixed sentence case violations in English locale strings lines 5001-6000 (#24049) +- Fixed delay between the live candlestick close price and current price line on the Perps TradingView chart (#24100) +- Fixed date format display on Perps price chart x-axis from "6 Nov" to "11/6" format (#24103) +- Fixed entry price decimal precision in Perps trade history (#24096) +- Fox animation raise up issue during keyboard open. (#23354) +- Fixed Perps activity view to show aggregated PnL values for stop loss and take profit orders that execute as multiple fills (#24050) +- Add excludeLabels to trending api. (#23988) +- Fix biometric sudden reset issue (#24018) +- fix: resolved minor send flow UI issues (#24034) +- Fixed sentence case violations in English locale strings lines 2001-3000 (#23957) +- Fix non-live current price in leverage slider (#24046) +- Fixed OHLC bar text overflow for tokens with small prices (#23471) +- Fixed an issue where pending approval requests could become permanently stuck in the queue, preventing users from approving (#24040) + or rejecting subsequent connection requests. +- Avoid re-rendering home when navigating back from trending (#24062) +- Improved the minimum received bridge label by rounding down (#23851) +- Fix TokenListController initialization. (#24020) +- Fixed sentence case violations in English locale strings lines 3001-4000 (#23994) +- Remove ens calls from account list to improve perf (#23920) +- Fixed an issue where switching back to the native token after automatic gas fee token selection did not trigger the insufficient (#23855) + balance alert. +- Fixed balance display in Perps to show proper decimal formatting with trailing zeros (#23898) +- Fixes empty quote card details issue when swapping on Solana network (#23915) +- Fixed a bug where alert modal styling would not update correctly when switching between different severity alerts. (#23893) +- Fixed a bug that caused Swap button to be blocked even though a quote was available (#23792) +- fix: update asset details transition to left to right (#23933) +- Token details block explorer correct urls (#23890) +- Google login fallback in android if no google account available on device. (#23520) +- Reduced number of calls to bulk-scan for NFT detection (#23803) +- Add default blockexplorer for linea and mainnet. (#23861) +- Resetpassword screen touch-id state (#23798) +- Remove emojis from gas options (#23907) +- fix: remove background from more button in multichain account selector (#23904) +- Change selected account styles (#22203) +- Remove scroll on click when clicking a tx in the asset details modal (#23885) +- Fixed "Report a detection problem" button to link to the correct GitHub repository for reporting phishing detection issues (#23824) +- fix: updated checkbox border to correct color (#23846) +- Fixed hiding nft flow. (#23833) +- Improved import assets UI (#23735) +- Fix nft auto detection not triggered on network switch (#23858) +- Fix token balances init (#23668) +- Fix issue where rejecting a MMConnect confirmation results in a connection failure toast (rather than a error toast) in the (#23806) + wallet. +- Fix stable coin chart (#23168) +- Fix re-rendering of nfts grid (#23768) +- Fixed QR scanner navigation by chain type and recipient address pre-population in send flow (#21498) +- Fixed leverage initialization when modifying existing perpetual positions (#23619) +- Fixed a bug where stale quote data remained momentarily when changing swap destination token (#23737) +- Fixed bug where the EVM addresses were not checksummed (#23703) +- Fixed chart jumping issues when font accessibility is turned on (#23732) +- Updated swaps network picker ordering (#23686) +- fix: update bg color for earn upsell banner (#23701) +- fix: unified keyboard actions background color (#23649) +- Fixed sentence case violations in English locale strings lines 1-1000 (#23499) +- Fixed a flicker where the insufficient balance alert appeared before gas-station checks completed (#23361) +- fix: update lend UI (#23633) +- fix: enlarge question mark icon in lend header (#23635) +- Added readme for using OTA updates on nightly builds (#23573) +- Fixes an issue where when users selected the swap button for an asset presented in browser URL bar, that asset was not (#23534) + selected as source when navigating to swap page. +- Hides trending section if empty (#23586) +- Fixed withdrawal progress component to display decimal amounts correctly (e.g., $1.30 instead of $1) (#23477) +- Truncate long titles in Predict claim confirmations (#23462) +- Fixed a bug where mainnet where showing after testnets in the send modal screen (#23492) +- Fixed sentence case violations in English locale strings lines 1001-2000 (#23516) +- Improved Portfolio integration by passing tracking consent from Mobile app (#22683) +- Removes usePopularNetworks hook and replace it with constant. (#23525) +- Google One Tap "user disabled the feature" errors are no longer sent to Sentry (#23101) +- Fixed an issue where "Fund your wallet" empty state briefly appeared when importing wallets with existing funds or switching (#23351) + between funded accounts +- Fixed internal transfers not appearing in perps transaction history (#23405) +- Filter and handle unsupported notifications (#23291) +- Fix trending tokens inconsistencies in search results (#23408) +- Prevent any dialogs for multichain wallet Snaps (Solana, Bitcoin, Tron) (#23218) + ## [7.62.1] ### Fixed @@ -9910,7 +10195,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.62.1...HEAD +[Unreleased]: https://github.com/MetaMask/metamask-mobile/compare/v7.63.0...HEAD +[7.63.0]: https://github.com/MetaMask/metamask-mobile/compare/v7.62.1...v7.63.0 [7.62.1]: https://github.com/MetaMask/metamask-mobile/compare/v7.62.0...v7.62.1 [7.62.0]: https://github.com/MetaMask/metamask-mobile/compare/v7.61.6...v7.62.0 [7.61.6]: https://github.com/MetaMask/metamask-mobile/compare/v7.61.5...v7.61.6 From dfab74f93ae6609bbe153be33e3e4868ea15e857 Mon Sep 17 00:00:00 2001 From: metamaskbot Date: Fri, 30 Jan 2026 12:43:32 +0000 Subject: [PATCH 48/80] [skip ci] Bump version number to 3585 --- android/app/build.gradle | 2 +- bitrise.yml | 4 ++-- ios/MetaMask.xcodeproj/project.pbxproj | 12 ++++++------ 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index df3ffc11aa57..807213b91574 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -188,7 +188,7 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion versionName "7.63.0" - versionCode 3577 + versionCode 3585 testBuildType System.getProperty('testBuildType', 'debug') testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" manifestPlaceholders.MM_BRANCH_KEY_TEST = "$System.env.MM_BRANCH_KEY_TEST" diff --git a/bitrise.yml b/bitrise.yml index 006f5c2c9be6..18f4cf0f157d 100644 --- a/bitrise.yml +++ b/bitrise.yml @@ -3472,13 +3472,13 @@ app: VERSION_NAME: 7.63.0 - opts: is_expand: false - VERSION_NUMBER: 3577 + VERSION_NUMBER: 3585 - opts: is_expand: false FLASK_VERSION_NAME: 7.63.0 - opts: is_expand: false - FLASK_VERSION_NUMBER: 3577 + FLASK_VERSION_NUMBER: 3585 - opts: is_expand: false ANDROID_APK_LINK: '' diff --git a/ios/MetaMask.xcodeproj/project.pbxproj b/ios/MetaMask.xcodeproj/project.pbxproj index 629636bd7c1b..cb4199a14678 100644 --- a/ios/MetaMask.xcodeproj/project.pbxproj +++ b/ios/MetaMask.xcodeproj/project.pbxproj @@ -1281,7 +1281,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3577; + CURRENT_PROJECT_VERSION = 3585; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 48XVW22RCG; @@ -1350,7 +1350,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3577; + CURRENT_PROJECT_VERSION = 3585; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 48XVW22RCG; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 48XVW22RCG; @@ -1416,7 +1416,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3577; + CURRENT_PROJECT_VERSION = 3585; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 48XVW22RCG; @@ -1483,7 +1483,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3577; + CURRENT_PROJECT_VERSION = 3585; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 48XVW22RCG; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 48XVW22RCG; @@ -1646,7 +1646,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3577; + CURRENT_PROJECT_VERSION = 3585; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 48XVW22RCG; @@ -1716,7 +1716,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3577; + CURRENT_PROJECT_VERSION = 3585; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 48XVW22RCG; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 48XVW22RCG; From c6e1142baa7a5740bea41ae173e0eeb8abe5b11e Mon Sep 17 00:00:00 2001 From: Nick Gambino <35090461+gambinish@users.noreply.github.com> Date: Mon, 2 Feb 2026 04:47:38 -0800 Subject: [PATCH 49/80] fix: Perps rate limit hotfix cp-7.63.0 (#25472) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## **Description** Includes two sets of fixes that improve 429 errors during Perps transactions. They were already merged to main, and have been included in a hotfix to 7.62.2 here: https://github.com/MetaMask/metamask-mobile/pull/25443 ## **Changelog** CHANGELOG entry: hotfix to improve 429 error handling in Perps ## **Related issues** Fixes: ## **Manual testing steps** ```gherkin Feature: my feature name Scenario: user [verb for user action] Given [describe expected initial app state] When user [verb for user action] Then [describe expected outcome] ``` ## **Screenshots/Recordings** ### **Before** ### **After** ## **Pre-merge author checklist** - [x] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile Coding Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md). - [x] I've completed the PR template to the best of my ability - [x] I've included tests if applicable - [x] I've documented my code using [JSDoc](https://jsdoc.app/) format if applicable - [x] I've applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors. ## **Pre-merge reviewer checklist** - [ ] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [ ] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots. --- > [!NOTE] > **Medium Risk** > Touches Perps order/position management and provider networking behavior (cache-vs-REST fallbacks), which can affect trade execution flows and data freshness. Changes are mitigated by added validation, staleness checks, and expanded unit tests, but still warrant careful review in production-like conditions. > > **Overview** > Reduces Perps 429s by shifting several read paths to **cache-first WebSocket data with REST fallback**: adds `getOrFetchFills` (provider + aggregated provider) and introduces atomic cache getters for orders/fills/prices in `HyperLiquidSubscriptionService`. > > Updates `HyperLiquidProvider` to centralize price retrieval (`getOrFetchPrice` with validity checks), prefer live WebSocket positions for `updatePositionTPSL`/`closePosition`, and avoid multi-DEX REST queries when canceling TP/SL orders (use cached orders or single-DEX fallback). > > Refactors stop-loss prompt handling: `useHasExistingPosition` now returns `positionOpenedTimestamp` (WS fills + REST fallback) and `PerpsMarketDetailsView` adds staleness/closure-safety refs so banner TP/SL updates don’t misapply after market/position changes; the banner UI switches from a toggle to a **Set** button with success checkmark + delayed fade-out. Also improves order flow UX by surfacing a toast when post-order TP/SL updates fail. > > Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 060868b713abc68787bbb11713714ff16ee1529e. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot). --------- Co-authored-by: abretonc7s <107169956+abretonc7s@users.noreply.github.com> Co-authored-by: João Loureiro <175489935+joaoloureirop@users.noreply.github.com> Co-authored-by: Arthur Breton --- app/components/UI/Perps/Perps.testIds.ts | 3 +- .../PerpsMarketDetailsView.test.tsx | 135 +++--- .../PerpsMarketDetailsView.tsx | 123 +++-- .../PerpsOrderView/PerpsOrderView.test.tsx | 10 + .../Views/PerpsOrderView/PerpsOrderView.tsx | 42 +- .../PerpsStopLossPromptBanner.test.tsx | 52 +- .../PerpsStopLossPromptBanner.tsx | 102 ++-- .../providers/AggregatedPerpsProvider.test.ts | 1 + .../providers/AggregatedPerpsProvider.ts | 12 + .../providers/HyperLiquidProvider.test.ts | 450 +++++++++++++++++- .../providers/HyperLiquidProvider.ts | 344 +++++++++---- .../UI/Perps/controllers/types/index.ts | 30 ++ .../hooks/useHasExistingPosition.test.ts | 343 ++++++++++++- .../UI/Perps/hooks/useHasExistingPosition.ts | 140 +++++- .../Perps/hooks/usePerpsClosePosition.test.ts | 4 + .../UI/Perps/hooks/usePerpsClosePosition.ts | 2 + .../UI/Perps/hooks/usePerpsTPSLUpdate.test.ts | 4 + .../UI/Perps/hooks/usePerpsTPSLUpdate.ts | 30 +- .../HyperLiquidSubscriptionService.test.ts | 54 +++ .../HyperLiquidSubscriptionService.ts | 66 +++ 20 files changed, 1622 insertions(+), 325 deletions(-) diff --git a/app/components/UI/Perps/Perps.testIds.ts b/app/components/UI/Perps/Perps.testIds.ts index 22c9cabc989c..10175c50da4f 100644 --- a/app/components/UI/Perps/Perps.testIds.ts +++ b/app/components/UI/Perps/Perps.testIds.ts @@ -482,7 +482,8 @@ export const PerpsTutorialSelectorsIDs = { export const PerpsStopLossPromptSelectorsIDs = { CONTAINER: 'perps-stop-loss-prompt-container', ADD_MARGIN_BUTTON: 'perps-stop-loss-prompt-add-margin-button', - TOGGLE: 'perps-stop-loss-prompt-toggle', + SET_STOP_LOSS_BUTTON: 'perps-stop-loss-prompt-set-button', + SUCCESS_ICON: 'perps-stop-loss-prompt-success-icon', LOADING: 'perps-stop-loss-prompt-loading', } as const; diff --git a/app/components/UI/Perps/Views/PerpsMarketDetailsView/PerpsMarketDetailsView.test.tsx b/app/components/UI/Perps/Views/PerpsMarketDetailsView/PerpsMarketDetailsView.test.tsx index aad6f4c1919c..835e80c6beab 100644 --- a/app/components/UI/Perps/Views/PerpsMarketDetailsView/PerpsMarketDetailsView.test.tsx +++ b/app/components/UI/Perps/Views/PerpsMarketDetailsView/PerpsMarketDetailsView.test.tsx @@ -252,21 +252,28 @@ jest.mock('../../hooks/usePerpsOpenOrders', () => ({ usePerpsOpenOrders: () => mockUsePerpsOpenOrdersImpl(), })); -const mockUsePerpsOrderFillsImpl = jest.fn< +const mockUsePerpsLiveFillsImpl = jest.fn< ReturnType< - typeof import('../../hooks/usePerpsOrderFills').usePerpsOrderFills + typeof import('../../hooks/stream/usePerpsLiveFills').usePerpsLiveFills >, [] >(() => ({ - orderFills: [], - isLoading: false, - error: null, - refresh: jest.fn(), - isRefreshing: false, + fills: [], + isInitialLoading: false, })); -jest.mock('../../hooks/usePerpsOrderFills', () => ({ - usePerpsOrderFills: () => mockUsePerpsOrderFillsImpl(), +jest.mock('../../hooks/stream/usePerpsLiveFills', () => ({ + usePerpsLiveFills: () => mockUsePerpsLiveFillsImpl(), +})); + +// Mock Engine for REST fallback tests +const mockGetOrderFills = jest.fn(); +jest.mock('../../../../../core/Engine', () => ({ + context: { + PerpsController: { + getOrderFills: (...args: unknown[]) => mockGetOrderFills(...args), + }, + }, })); // Mock for usePerpsMarkets that can be modified per test @@ -640,6 +647,7 @@ describe('PerpsMarketDetailsView', () => { error: null, existingPosition: null, refreshPosition: jest.fn(), + positionOpenedTimestamp: undefined, }); // Reset navigation mocks @@ -672,12 +680,9 @@ describe('PerpsMarketDetailsView', () => { }; // Reset order fills mock to default - mockUsePerpsOrderFillsImpl.mockReturnValue({ - orderFills: [], - isLoading: false, - error: null, - refresh: jest.fn(), - isRefreshing: false, + mockUsePerpsLiveFillsImpl.mockReturnValue({ + fills: [], + isInitialLoading: false, }); }); @@ -906,6 +911,7 @@ describe('PerpsMarketDetailsView', () => { }, }, refreshPosition: jest.fn(), + positionOpenedTimestamp: undefined, }); const { getByTestId, queryByText, queryByTestId } = renderWithProvider( @@ -996,6 +1002,7 @@ describe('PerpsMarketDetailsView', () => { error: null, existingPosition: null, refreshPosition: mockRefreshPosition, // No-op function for WebSocket positions + positionOpenedTimestamp: undefined, }); const { getByTestId } = renderWithProvider( @@ -1047,6 +1054,7 @@ describe('PerpsMarketDetailsView', () => { }, }, refreshPosition: mockRefreshPosition, + positionOpenedTimestamp: undefined, }); const { getByTestId } = renderWithProvider( @@ -1083,6 +1091,7 @@ describe('PerpsMarketDetailsView', () => { error: null, existingPosition: null, refreshPosition: mockRefreshPosition, + positionOpenedTimestamp: undefined, }); const { getByTestId } = renderWithProvider( @@ -1147,6 +1156,7 @@ describe('PerpsMarketDetailsView', () => { error: null, existingPosition: null, refreshPosition: mockRefreshPosition, + positionOpenedTimestamp: undefined, }); const { getByTestId } = renderWithProvider( @@ -2103,10 +2113,13 @@ describe('PerpsMarketDetailsView', () => { }); }); - describe('Position opened timestamp calculation', () => { - it('computes position opened timestamp from order fills data', () => { - // Arrange - const timestamp = Date.now(); + describe('Position opened timestamp', () => { + // Note: The timestamp calculation logic has been moved to useHasExistingPosition hook + // These tests verify the component correctly uses the hook's positionOpenedTimestamp + + it('uses positionOpenedTimestamp from useHasExistingPosition hook', () => { + // Arrange - Hook provides the timestamp + const timestamp = Date.now() - 5 * 60 * 1000; mockUseHasExistingPosition.mockReturnValue({ hasPosition: true, isLoading: false, @@ -2129,51 +2142,50 @@ describe('PerpsMarketDetailsView', () => { }, }, refreshPosition: jest.fn(), + positionOpenedTimestamp: timestamp, // Hook now provides this }); - mockUsePerpsOrderFillsImpl.mockReturnValue({ - orderFills: [ - { - orderId: 'order-1', - symbol: 'BTC', - side: 'buy', - direction: 'Open Long', - timestamp: timestamp - 2000, - size: '0.3', - price: '43000', - pnl: '0', - fee: '0.001', - feeToken: 'USDC', - }, - { - orderId: 'order-2', - symbol: 'BTC', - side: 'buy', - direction: 'Open Long', - timestamp, - size: '0.5', - price: '44000', - pnl: '0', - fee: '0.001', - feeToken: 'USDC', - }, - { - orderId: 'order-3', - symbol: 'ETH', - side: 'sell', - direction: 'Open Short', - timestamp: timestamp - 1000, - size: '1.0', - price: '3000', - pnl: '0', - fee: '0.001', - feeToken: 'USDC', - }, - ], + // Act + const { getByTestId } = renderWithProvider( + + + , + { + state: initialState, + }, + ); + + // Assert - component renders with position data + expect( + getByTestId(PerpsMarketDetailsViewSelectorsIDs.CONTAINER), + ).toBeTruthy(); + }); + + it('handles undefined positionOpenedTimestamp from hook', () => { + // Arrange - Hook returns undefined timestamp (e.g., new position) + mockUseHasExistingPosition.mockReturnValue({ + hasPosition: true, isLoading: false, error: null, - refresh: jest.fn(), - isRefreshing: false, + existingPosition: { + symbol: 'BTC', + size: '0.5', + entryPrice: '44000', + positionValue: '22000', + unrealizedPnl: '50', + marginUsed: '500', + leverage: { type: 'isolated', value: 5 }, + liquidationPrice: '40000', + maxLeverage: 20, + returnOnEquity: '1.14', + cumulativeFunding: { + allTime: '0', + sinceOpen: '0', + sinceChange: '0', + }, + }, + refreshPosition: jest.fn(), + positionOpenedTimestamp: undefined, // No timestamp available yet }); // Act @@ -2186,11 +2198,10 @@ describe('PerpsMarketDetailsView', () => { }, ); - // Assert + // Assert - component still renders correctly expect( getByTestId(PerpsMarketDetailsViewSelectorsIDs.CONTAINER), ).toBeTruthy(); - expect(mockUsePerpsOrderFillsImpl).toHaveBeenCalled(); }); }); diff --git a/app/components/UI/Perps/Views/PerpsMarketDetailsView/PerpsMarketDetailsView.tsx b/app/components/UI/Perps/Views/PerpsMarketDetailsView/PerpsMarketDetailsView.tsx index 8a738ec25c71..2dfeb8696ce2 100644 --- a/app/components/UI/Perps/Views/PerpsMarketDetailsView/PerpsMarketDetailsView.tsx +++ b/app/components/UI/Perps/Views/PerpsMarketDetailsView/PerpsMarketDetailsView.tsx @@ -13,6 +13,12 @@ import React, { useState, } from 'react'; import { Linking, RefreshControl, ScrollView, View } from 'react-native'; +import type { + Position, + PerpsMarketData, + PerpsNavigationParamList, + TPSLTrackingData, +} from '../../controllers/types'; import { SafeAreaView } from 'react-native-safe-area-context'; import { useDispatch, useSelector } from 'react-redux'; import { strings } from '../../../../../../locales/i18n'; @@ -79,11 +85,6 @@ import { PerpsEventValues, } from '../../constants/eventNames'; import { PERPS_CONSTANTS } from '../../constants/perpsConfig'; -import type { - PerpsMarketData, - PerpsNavigationParamList, - TPSLTrackingData, -} from '../../controllers/types'; import { usePerpsConnection, usePerpsNavigation, @@ -108,7 +109,6 @@ import { usePerpsMarkets } from '../../hooks/usePerpsMarkets'; import { usePerpsMarketStats } from '../../hooks/usePerpsMarketStats'; import { usePerpsMeasurement } from '../../hooks/usePerpsMeasurement'; import { usePerpsOICap } from '../../hooks/usePerpsOICap'; -import { usePerpsOrderFills } from '../../hooks/usePerpsOrderFills'; import { usePerpsTPSLUpdate } from '../../hooks/usePerpsTPSLUpdate'; import { useStopLossPrompt } from '../../hooks/useStopLossPrompt'; import { selectPerpsChartPreferredCandlePeriod } from '../../selectors/chartPreferences'; @@ -198,6 +198,17 @@ const PerpsMarketDetailsView: React.FC = () => { // Stop loss prompt banner state - for loading/success when setting stop loss via banner const [isSettingStopLoss, setIsSettingStopLoss] = useState(false); const [isStopLossSuccess, setIsStopLossSuccess] = useState(false); + // Preserve banner variant during success fade-out (hook's variant becomes null after SL is set) + const preservedBannerVariantRef = useRef<'stop_loss' | 'add_margin' | null>( + null, + ); + // Track current market symbol for staleness checks in async callbacks + // Using a ref allows reading the CURRENT value at execution time, not closure-captured value + const currentMarketSymbolRef = useRef(market?.symbol); + // Track current position for callbacks that are stored (e.g., route params) and called later + // This prevents stale closure issues where the captured position is outdated + // Initialized to null, will be updated via useEffect when existingPosition is available + const currentPositionRef = useRef(null); const isEligible = useSelector(selectPerpsEligibility); @@ -222,6 +233,11 @@ const PerpsMarketDetailsView: React.FC = () => { setOptimisticWatchlist(null); }, [market?.symbol]); + // Keep current market symbol ref in sync for staleness checks in async callbacks + useEffect(() => { + currentMarketSymbolRef.current = market?.symbol; + }, [market?.symbol]); + // Clear optimistic state once Redux has caught up useEffect(() => { if ( @@ -377,11 +393,7 @@ const PerpsMarketDetailsView: React.FC = () => { // Only zoom when: // 1. The interval has changed (user pressed button) // 2. New data exists and matches the selected period - if ( - hasIntervalChanged && - candleData && - candleData.interval === selectedCandlePeriod - ) { + if (hasIntervalChanged && candleData?.interval === selectedCandlePeriod) { chartRef.current?.zoomToLatestCandle(visibleCandleCount); // Update the ref to track this interval change previousIntervalRef.current = selectedCandlePeriod; @@ -389,32 +401,21 @@ const PerpsMarketDetailsView: React.FC = () => { }, [candleData, selectedCandlePeriod, visibleCandleCount]); // Check if user has an existing position for this market - const { isLoading: isLoadingPosition, existingPosition } = - useHasExistingPosition({ - asset: market?.symbol || '', - loadOnMount: true, - }); - - // Fetch order fills to get position opened timestamp - const { orderFills } = usePerpsOrderFills({ - skipInitialFetch: false, + // Also provides positionOpenedTimestamp for stop loss prompt timing + const { + isLoading: isLoadingPosition, + existingPosition, + positionOpenedTimestamp, + } = useHasExistingPosition({ + asset: market?.symbol || '', + loadOnMount: true, }); - // Get position opened timestamp from fills data - const positionOpenedTimestamp = useMemo(() => { - if (!existingPosition || !orderFills) return undefined; - - // Find the most recent "Open" fill for this asset - const openFill = orderFills - .filter((fill) => { - const isMatchingAsset = fill.symbol === existingPosition.symbol; - const isOpenDirection = fill.direction?.startsWith('Open'); - return isMatchingAsset && isOpenDirection; - }) - .sort((a, b) => b.timestamp - a.timestamp)[0]; // Most recent first - - return openFill?.timestamp; - }, [existingPosition, orderFills]); + // Keep current position ref in sync for callbacks stored in route params + // This must be after useHasExistingPosition since it depends on existingPosition + useEffect(() => { + currentPositionRef.current = existingPosition; + }, [existingPosition]); // Compute TP/SL lines for the chart based on existing position // Use chartCurrentPrice (from candle close) to ensure price line syncs with live candle @@ -439,12 +440,11 @@ const PerpsMarketDetailsView: React.FC = () => { // Stop loss prompt banner logic // Hook handles visibility orchestration including fade-out animation const { - variant: bannerVariant, + variant: bannerVariantFromHook, liquidationDistance, suggestedStopLossPrice, suggestedStopLossPercent, isVisible: isBannerVisible, - isDismissing: isBannerDismissing, onDismissComplete: handleBannerDismissComplete, } = useStopLossPrompt({ position: existingPosition, @@ -452,9 +452,24 @@ const PerpsMarketDetailsView: React.FC = () => { positionOpenedTimestamp, }); + // Preserve banner variant when we have a valid one (for use during success fade-out) + // The hook's variant becomes null after SL is set, but we need to keep rendering + // Use useEffect to avoid ref mutation during render (React best practice) + useEffect(() => { + if (bannerVariantFromHook && !isStopLossSuccess) { + preservedBannerVariantRef.current = bannerVariantFromHook; + } + }, [bannerVariantFromHook, isStopLossSuccess]); + + // Use preserved variant during success fade-out, otherwise use hook's variant + const bannerVariant = isStopLossSuccess + ? preservedBannerVariantRef.current + : bannerVariantFromHook; + // Reset stop loss success state when market or position changes useEffect(() => { setIsStopLossSuccess(false); + preservedBannerVariantRef.current = null; }, [market?.symbol, existingPosition?.symbol]); // Track Perps asset screen load performance with simplified API @@ -741,12 +756,20 @@ const PerpsMarketDetailsView: React.FC = () => { stopLossPrice?: string, trackingData?: TPSLTrackingData, ) => { - await handleUpdateTPSL( - existingPosition, + // Use ref to get CURRENT position at execution time, not the closure-captured position + // This prevents "No position found" errors when the position updates during navigation + const currentPosition = currentPositionRef.current; + if (!currentPosition) { + return { success: false }; + } + // Return value checked for consistency - error toast is shown internally by hook + const result = await handleUpdateTPSL( + currentPosition, takeProfitPrice, stopLossPrice, trackingData, ); + return result; }, }); }, [ @@ -898,6 +921,8 @@ const PerpsMarketDetailsView: React.FC = () => { setIsEligibilityModalVisible(true); return; } + // Capture symbol before async to detect market changes during API call + const originalSymbol = existingPosition.symbol; setIsSettingStopLoss(true); @@ -910,13 +935,25 @@ const PerpsMarketDetailsView: React.FC = () => { }; // Set the stop loss using the suggested price (keep existing TP if any) - await handleUpdateTPSL( + const result = await handleUpdateTPSL( existingPosition, existingPosition.takeProfitPrice, // Keep existing TP suggestedStopLossPrice, // Use suggested SL trackingData, ); + // Only trigger success state if the update actually succeeded + if (!result.success) { + // Error toast is already shown by handleUpdateTPSL + return; + } + + // Staleness check: user may have navigated to a different market during API call + // Use ref to get CURRENT market symbol, not the closure-captured value + if (originalSymbol !== currentMarketSymbolRef.current) { + return; + } + // Trigger success state to start fade-out animation setIsStopLossSuccess(true); @@ -1141,8 +1178,8 @@ const PerpsMarketDetailsView: React.FC = () => { )} {/* Stop Loss Prompt Banner - Shows when position needs attention */} - {/* Uses hook's isVisible which includes fade-out animation state */} - {isBannerVisible && bannerVariant && ( + {/* Keep mounted while isStopLossSuccess is true to allow fade animation to complete */} + {(isBannerVisible || isStopLossSuccess) && bannerVariant && ( = () => { onSetStopLoss={handleSetStopLossFromBanner} onAddMargin={handleAddMarginFromBanner} isLoading={isSettingStopLoss} - isSuccess={isStopLossSuccess || isBannerDismissing} + isSuccess={isStopLossSuccess} onFadeOutComplete={handleBannerFadeOutComplete} testID={ PerpsMarketDetailsViewSelectorsIDs.STOP_LOSS_PROMPT_BANNER diff --git a/app/components/UI/Perps/Views/PerpsOrderView/PerpsOrderView.test.tsx b/app/components/UI/Perps/Views/PerpsOrderView/PerpsOrderView.test.tsx index 5bc9692bb0ce..d1ca7876dc40 100644 --- a/app/components/UI/Perps/Views/PerpsOrderView/PerpsOrderView.test.tsx +++ b/app/components/UI/Perps/Views/PerpsOrderView/PerpsOrderView.test.tsx @@ -262,6 +262,11 @@ jest.mock('../../hooks', () => ({ creationFailed: jest.fn(), }, }, + positionManagement: { + tpsl: { + updateTPSLError: jest.fn(), + }, + }, dataFetching: { market: { error: { @@ -1783,6 +1788,11 @@ describe('PerpsOrderView', () => { creationFailed: jest.fn(), }, }, + positionManagement: { + tpsl: { + updateTPSLError: jest.fn(), + }, + }, dataFetching: { market: { error: { diff --git a/app/components/UI/Perps/Views/PerpsOrderView/PerpsOrderView.tsx b/app/components/UI/Perps/Views/PerpsOrderView/PerpsOrderView.tsx index 7af2b9352fe8..7cac7e76bd3a 100644 --- a/app/components/UI/Perps/Views/PerpsOrderView/PerpsOrderView.tsx +++ b/app/components/UI/Perps/Views/PerpsOrderView/PerpsOrderView.tsx @@ -871,11 +871,22 @@ const PerpsOrderViewContentBase: React.FC = ({ delete orderWithoutTPSL.stopLossPrice; await executeOrder(orderWithoutTPSL); - await updatePositionTPSL({ + const tpslResult = await updatePositionTPSL({ symbol: orderForm.asset, takeProfitPrice: orderForm.takeProfitPrice, stopLossPrice: orderForm.stopLossPrice, }); + + // Show error toast if TP/SL update failed (order succeeded but TP/SL didn't) + if (!tpslResult.success) { + const errorMessage = + tpslResult.error || strings('perps.errors.unknown'); + showToast( + PerpsToastOptions.positionManagement.tpsl.updateTPSLError( + errorMessage, + ), + ); + } } else { await executeOrder(orderParams); } @@ -884,26 +895,24 @@ const PerpsOrderViewContentBase: React.FC = ({ isSubmittingRef.current = false; } }, [ - orderValidation.isValid, - orderValidation.errors, + isButtonColorTestEnabled, track, orderForm.asset, orderForm.direction, - orderForm.type, - orderForm.leverage, - orderForm.limitPrice, orderForm.takeProfitPrice, orderForm.stopLossPrice, + orderForm.type, + orderForm.leverage, orderForm.amount, - positionSize, - assetData.price, + orderForm.limitPrice, + buttonColorVariant, + orderValidation.isValid, + orderValidation.errors, + currentMarketPosition, navigation, navigationMarketData, - currentMarketPosition, - executeOrder, - showToast, - PerpsToastOptions.formValidation.orderForm, - updatePositionTPSL, + positionSize, + assetData.price, marginRequired, feeResults.totalFee, feeResults.metamaskFee, @@ -911,8 +920,11 @@ const PerpsOrderViewContentBase: React.FC = ({ feeResults.feeDiscountPercentage, feeResults.estimatedPoints, source, - isButtonColorTestEnabled, - buttonColorVariant, + showToast, + PerpsToastOptions.formValidation.orderForm, + PerpsToastOptions.positionManagement.tpsl, + executeOrder, + updatePositionTPSL, ]); // Memoize the tooltip handlers to prevent recreating them on every render diff --git a/app/components/UI/Perps/components/PerpsStopLossPromptBanner/PerpsStopLossPromptBanner.test.tsx b/app/components/UI/Perps/components/PerpsStopLossPromptBanner/PerpsStopLossPromptBanner.test.tsx index 0df0d57bd8e1..90413706211b 100644 --- a/app/components/UI/Perps/components/PerpsStopLossPromptBanner/PerpsStopLossPromptBanner.test.tsx +++ b/app/components/UI/Perps/components/PerpsStopLossPromptBanner/PerpsStopLossPromptBanner.test.tsx @@ -1,6 +1,5 @@ import React from 'react'; import { fireEvent, act } from '@testing-library/react-native'; -import { Switch } from 'react-native'; import PerpsStopLossPromptBanner from './PerpsStopLossPromptBanner'; import renderWithProvider from '../../../../../util/test/renderWithProvider'; import { backgroundState } from '../../../../../util/test/initial-root-state'; @@ -105,14 +104,16 @@ describe('PerpsStopLossPromptBanner', () => { expect( getByTestId(PerpsStopLossPromptSelectorsIDs.CONTAINER), ).toBeTruthy(); - expect(getByTestId(PerpsStopLossPromptSelectorsIDs.TOGGLE)).toBeTruthy(); + expect( + getByTestId(PerpsStopLossPromptSelectorsIDs.SET_STOP_LOSS_BUTTON), + ).toBeTruthy(); expect(getByText(/\$47,500/)).toBeTruthy(); expect(getByText(/-50%/)).toBeTruthy(); }); - it('calls onSetStopLoss when toggle switched on', () => { + it('calls onSetStopLoss when button pressed', () => { const onSetStopLoss = jest.fn(); - const { UNSAFE_getByType } = renderWithProvider( + const { getByTestId } = renderWithProvider( { { state: initialState }, ); - const toggle = UNSAFE_getByType(Switch); - fireEvent(toggle, 'onValueChange', true); + fireEvent.press( + getByTestId(PerpsStopLossPromptSelectorsIDs.SET_STOP_LOSS_BUTTON), + ); expect(onSetStopLoss).toHaveBeenCalledTimes(1); }); - it('does not call onSetStopLoss when toggle switched off', () => { + it('does not call onSetStopLoss when button is disabled (loading)', () => { const onSetStopLoss = jest.fn(); - const { UNSAFE_getByType } = renderWithProvider( + const { getByTestId } = renderWithProvider( , { state: initialState }, ); - const toggle = UNSAFE_getByType(Switch); - fireEvent(toggle, 'onValueChange', false); + // Button is disabled when loading, press should not trigger callback + fireEvent.press( + getByTestId(PerpsStopLossPromptSelectorsIDs.SET_STOP_LOSS_BUTTON), + ); expect(onSetStopLoss).not.toHaveBeenCalled(); }); - it('shows loading indicator instead of toggle when loading', () => { - const { getByTestId, queryByTestId } = renderWithProvider( + it('shows loading indicator instead of button text when loading', () => { + const { getByTestId } = renderWithProvider( { ); expect(getByTestId(PerpsStopLossPromptSelectorsIDs.LOADING)).toBeTruthy(); - expect(queryByTestId(PerpsStopLossPromptSelectorsIDs.TOGGLE)).toBeFalsy(); + // Button still exists but shows loading indicator + expect( + getByTestId(PerpsStopLossPromptSelectorsIDs.SET_STOP_LOSS_BUTTON), + ).toBeTruthy(); }); it('does not trigger action when loading', () => { @@ -232,9 +240,9 @@ describe('PerpsStopLossPromptBanner', () => { { state: initialState }, ); - // Fast-forward past animation duration (300ms) + // Fast-forward past SUCCESS_DISPLAY_DELAY_MS (2000ms) + FADE_OUT_DURATION_MS (300ms) await act(async () => { - jest.advanceTimersByTime(400); + jest.advanceTimersByTime(2500); }); expect(onFadeOutComplete).toHaveBeenCalledTimes(1); @@ -258,8 +266,9 @@ describe('PerpsStopLossPromptBanner', () => { { state: initialState }, ); + // Even after waiting longer than the animation time, callback should not be called await act(async () => { - jest.advanceTimersByTime(400); + jest.advanceTimersByTime(2500); }); expect(onFadeOutComplete).not.toHaveBeenCalled(); @@ -284,7 +293,7 @@ describe('PerpsStopLossPromptBanner', () => { }); it('handles missing onSetStopLoss callback', () => { - const { UNSAFE_getByType } = renderWithProvider( + const { getByTestId } = renderWithProvider( { { state: initialState }, ); - const toggle = UNSAFE_getByType(Switch); - // Should not throw when toggle is pressed without callback - expect(() => fireEvent(toggle, 'onValueChange', true)).not.toThrow(); + // Button exists but is disabled without callback + const button = getByTestId( + PerpsStopLossPromptSelectorsIDs.SET_STOP_LOSS_BUTTON, + ); + // Should not throw when button is pressed without callback + expect(() => fireEvent.press(button)).not.toThrow(); }); it('handles missing onAddMargin callback', () => { diff --git a/app/components/UI/Perps/components/PerpsStopLossPromptBanner/PerpsStopLossPromptBanner.tsx b/app/components/UI/Perps/components/PerpsStopLossPromptBanner/PerpsStopLossPromptBanner.tsx index 9235d035d537..8a78a0f8924e 100644 --- a/app/components/UI/Perps/components/PerpsStopLossPromptBanner/PerpsStopLossPromptBanner.tsx +++ b/app/components/UI/Perps/components/PerpsStopLossPromptBanner/PerpsStopLossPromptBanner.tsx @@ -1,5 +1,5 @@ import React, { memo, useCallback, useEffect, useRef } from 'react'; -import { View, Switch, ActivityIndicator, Animated } from 'react-native'; +import { View, ActivityIndicator, Animated } from 'react-native'; import { useStyles } from '../../../../../component-library/hooks'; import Text, { TextVariant, @@ -9,6 +9,11 @@ import Button, { ButtonVariants, ButtonSize, } from '../../../../../component-library/components/Buttons/Button'; +import Icon, { + IconName, + IconSize, + IconColor, +} from '../../../../../component-library/components/Icons/Icon'; import { useTheme } from '../../../../../util/theme'; import { strings } from '../../../../../../locales/i18n'; import { PerpsStopLossPromptSelectorsIDs } from '../../Perps.testIds'; @@ -19,6 +24,8 @@ import { import styleSheet from './PerpsStopLossPromptBanner.styles'; import type { PerpsStopLossPromptBannerProps } from './PerpsStopLossPromptBanner.types'; +/** Delay before fade-out starts, allowing user to see success checkmark */ +const SUCCESS_DISPLAY_DELAY_MS = 2000; /** Duration of the fade-out animation in milliseconds */ const FADE_OUT_DURATION_MS = 300; @@ -70,18 +77,32 @@ const PerpsStopLossPromptBanner: React.FC = // Animation value for fade-out effect const fadeAnim = useRef(new Animated.Value(1)).current; + // Reset opacity when isSuccess transitions to false (e.g., market change during animation) + // This ensures the banner is visible when shown for a new market + useEffect(() => { + if (!isSuccess) { + fadeAnim.setValue(1); + } + }, [isSuccess, fadeAnim]); + // Trigger fade-out animation when isSuccess becomes true + // Wait for SUCCESS_DISPLAY_DELAY_MS first so user sees success checkmark useEffect(() => { if (isSuccess) { - Animated.timing(fadeAnim, { - toValue: 0, - duration: FADE_OUT_DURATION_MS, - useNativeDriver: true, - }).start(() => { - // Call callback when animation completes - onFadeOutComplete?.(); - }); + const delayTimer = setTimeout(() => { + Animated.timing(fadeAnim, { + toValue: 0, + duration: FADE_OUT_DURATION_MS, + useNativeDriver: true, + }).start(() => { + // Call callback when animation completes + onFadeOutComplete?.(); + }); + }, SUCCESS_DISPLAY_DELAY_MS); + + return () => clearTimeout(delayTimer); } + return undefined; }, [isSuccess, fadeAnim, onFadeOutComplete]); // Safe press handlers that won't trigger if callback is not provided @@ -89,15 +110,12 @@ const PerpsStopLossPromptBanner: React.FC = onAddMargin?.(); }, [onAddMargin]); - // Toggle handler - directly triggers stop loss action - const handleToggleChange = useCallback( - (value: boolean) => { - if (value && !isLoading) { - onSetStopLoss?.(); - } - }, - [isLoading, onSetStopLoss], - ); + // Button press handler - directly triggers stop loss action + const handleSetStopLossPress = useCallback(() => { + if (!isLoading && !isSuccess) { + onSetStopLoss?.(); + } + }, [isLoading, isSuccess, onSetStopLoss]); // Format the suggested stop loss price for display const formattedStopLossPrice = suggestedStopLossPrice @@ -176,28 +194,32 @@ const PerpsStopLossPromptBanner: React.FC = })} - - {isLoading ? ( - - ) : ( - - )} - +