diff --git a/.github/workflows/knip.yaml b/.github/workflows/knip.yaml new file mode 100644 index 000000000..50fe208ac --- /dev/null +++ b/.github/workflows/knip.yaml @@ -0,0 +1,22 @@ +name: Knip + +on: [push] + +jobs: + knip: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + + - name: Install pnpm + run: corepack enable pnpm + + - name: Install Node.js + uses: actions/setup-node@v3 + with: + node-version: 18 + cache: 'pnpm' + + - run: pnpm install --frozen-lockfile + + - run: pnpm knip diff --git a/.github/workflows/pages-deployment.yaml b/.github/workflows/pages-deployment.yaml index 2e292b9f3..91ab55e9b 100644 --- a/.github/workflows/pages-deployment.yaml +++ b/.github/workflows/pages-deployment.yaml @@ -45,7 +45,7 @@ jobs: - name: Install Node.js uses: actions/setup-node@v3 with: - node-version: 18 + node-version: 20 cache: 'pnpm' - run: pnpm install --frozen-lockfile diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 52287215a..73c6a0a06 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -17,7 +17,7 @@ jobs: - name: Install Node.js uses: actions/setup-node@v3 with: - node-version: 18 + node-version: 20 cache: 'pnpm' - run: pnpm install --frozen-lockfile @@ -40,7 +40,7 @@ jobs: - name: Install Node.js uses: actions/setup-node@v3 with: - node-version: 18 + node-version: 20 cache: 'pnpm' - run: pnpm install --frozen-lockfile @@ -73,7 +73,7 @@ jobs: - name: Install Node.js uses: actions/setup-node@v3 with: - node-version: 18 + node-version: 20 cache: 'pnpm' - run: pnpm install --frozen-lockfile @@ -107,7 +107,7 @@ jobs: - name: Install Node.js uses: actions/setup-node@v3 with: - node-version: 18 + node-version: 20 cache: 'pnpm' - run: pnpm install --frozen-lockfile @@ -156,7 +156,7 @@ jobs: - name: Install Node.js uses: actions/setup-node@v3 with: - node-version: 18 + node-version: 20 cache: 'pnpm' - run: pnpm install --frozen-lockfile diff --git a/.gitignore b/.gitignore index f13c733be..6a1a9afe2 100644 --- a/.gitignore +++ b/.gitignore @@ -63,8 +63,6 @@ tsconfig.vitest-temp.json /archives /data /test-environment -/ganache - # hardhat /cache /artifacts diff --git a/.nvmrc b/.nvmrc index a58d2d2c2..297d47ba0 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -18.18.2 \ No newline at end of file +20.13.1 \ No newline at end of file diff --git a/.prettierignore b/.prettierignore index 5c733a882..7ebbca74b 100644 --- a/.prettierignore +++ b/.prettierignore @@ -9,7 +9,6 @@ artifacts cache coverage data -ganache out subgraphs diff --git a/.vscode/settings.json b/.vscode/settings.json index 3f657eec8..4de88a8f5 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -25,5 +25,8 @@ "i18n-ally.localesPaths": [ "public/locales" ], - "i18n-ally.keystyle": "nested" + "i18n-ally.keystyle": "nested", + "[typescript]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + } } diff --git a/README.md b/README.md index 975ec2f34..84d91b826 100644 --- a/README.md +++ b/README.md @@ -507,3 +507,62 @@ Our testing philosophy is user-centric, meaning we want to write out tests so th A user generally clicks, types and swipes, and so most tests should include one of these actions. A user may also load a page in a specific state (by clicking, typing or swiping outside of the app) so sometimes we just want to check a page renders correctly. The vast majority of our tests will be of these kinds. For deeper parts of the codebase that aren't directly related to a user interaction, such as utility functions, the user is the developer. So simply test the code in the way a developer would use it. + +## Knip Configuration Guide + +### 1. Install Knip: + +Install Knip as a development dependency in your project: + +```bash +pnpm add -D knip +``` + +### 2. Add a knip script to your package.json: + +Add a script to your package.json for easy access to Knip: + +```json +{ + "scripts": { + ..., + "knip": "knip", + "knip:fix": "knip --fix --allow-remove-files" + } +} +``` + +### 3. Create Knip Configuration File: + +Create a `knip.config.ts` file at the root of your project. For more detail of configuration options, refer to the [knip.config.ts file](knip.config.ts) in the ENSDomains repository. + +### 4. Run Knip: + +To analyze your project, run Knip using the following command: + +```bash +pnpm knip +``` +Knip will exit with code `1` if any issues are found, such as unused files, dependencies, or exports that need to be removed. + +### 5. Review and Remove Unused Files + +After Knip completes its analysis, review the results. Manually remove any unused files that are safe to delete, or let Knip handle it automatically with the following command: + +```bash +pnpm knip:fix +``` + +Ensure you carefully examine any files marked for removal to avoid accidentally deleting necessary code. + +### 6. Run Unit Tests and E2E Tests: + +After removing files, it's important to run your unit and end-to-end tests to ensure that everything is still functioning correctly: + +```bash +pnpm test:coverage +``` + +```bash +pnpm e2e +``` diff --git a/e2e/specs/stateful/dnsclaim.spec.ts b/e2e/specs/stateful/dnsclaim.spec.ts index 8c13f62e8..0468a182f 100644 --- a/e2e/specs/stateful/dnsclaim.spec.ts +++ b/e2e/specs/stateful/dnsclaim.spec.ts @@ -59,4 +59,15 @@ test.describe('Import DNSSEC name', () => { await expect(page.getByTestId('status-checker-message')).toContainText('Invalid record found') await expect(page.getByTestId('import-next-button')).toBeDisabled() }) + + test('should resolve .pw domains', async ({ page, login }) => { + await page.goto('/test.pw') + await login.connect() + + await page.getByTestId('onchain-radio').click() + await page.getByTestId('import-next-button').click() + await expect(page.getByTestId('import-heading')).toContainText('Enable DNSSEC') + await expect(page.getByTestId('status-checker-message')).toContainText('DNSSEC is not enabled') + await expect(page.getByTestId('import-next-button')).toBeDisabled() + }) }) diff --git a/e2e/specs/stateless/extendNames.spec.ts b/e2e/specs/stateless/extendNames.spec.ts index ac4524bd3..bc54d5e07 100644 --- a/e2e/specs/stateless/extendNames.spec.ts +++ b/e2e/specs/stateless/extendNames.spec.ts @@ -14,7 +14,8 @@ test('should be able to register multiple names on the address page', async ({ makePageObject, makeName, }) => { - const names = await makeName([ + // Generating names in not neccessary but we want to make sure that there are names to extend + await makeName([ { label: 'extend-legacy', type: 'legacy', @@ -32,16 +33,28 @@ test('should be able to register multiple names on the address page', async ({ const transactionModal = makePageObject('TransactionModal') await addresPage.goto(address) - await login.connect() + await page.pause() + await addresPage.selectToggle.click() + + await expect(await page.locator('.name-detail-item').count()).toBeGreaterThan(0) + const nameItems = await page.locator('.name-detail-item').all() + const nameItemTestIds = await Promise.all( + nameItems.map((item) => item.getAttribute('data-testid')), + ) + const extendableNameItems = nameItemTestIds + .filter((testid): testid is string => !!testid) + .map((testid) => testid.replace('name-item-', '')) + .filter((name) => { + const nameParts = name?.split('.') ?? [] + return nameParts.length === 2 && nameParts[1] === 'eth' + }) + const timestampDict: { [key: string]: number } = {} - for (const name of names) { - const label = name.replace('.eth', '') - await addresPage.search(label) + for (const name of extendableNameItems) { const timestamp = await addresPage.getTimestamp(name) timestampDict[name] = timestamp - await addresPage.getNameRow(name).click() } await addresPage.extendNamesButton.click() @@ -53,16 +66,10 @@ test('should be able to register multiple names on the address page', async ({ await addresPage.extendNamesModalNextButton.click() // check the invoice details - await expect(page.getByTestId('invoice-item-0-amount')).toContainText('0.0065') - await expect(page.getByTestId('invoice-item-1-amount')).toContainText('0.0002') - await expect(page.getByTestId('invoice-total')).toContainText('0.0067') + await page.pause() + await expect(page.getByText(`Extend ${extendableNameItems.length} Names`)).toBeVisible() await expect(page.getByText('1 year extension', { exact: true })).toBeVisible() - // check the price comparison table - await expect(page.getByTestId('year-marker-0')).toContainText('3% gas') - await expect(page.getByTestId('year-marker-1')).toContainText('1% gas') - await expect(page.getByTestId('year-marker-2')).toContainText('1% gas') - // increment and save await page.getByTestId('plus-minus-control-plus').click() await page.getByTestId('plus-minus-control-plus').click() @@ -72,11 +79,12 @@ test('should be able to register multiple names on the address page', async ({ await subgraph.sync() await page.reload() - for (const name of names) { + await page.waitForTimeout(3000) + for (const name of extendableNameItems) { const label = name.replace('.eth', '') await addresPage.search(label) - await expect(addresPage.nameExpiry(name)).not.toHaveText(/12/, { timeout: 30000 }) - expect(await addresPage.getTimestamp(name)).toEqual(timestampDict[name] + 31536000000 * 3) + await expect(await addresPage.getTimestamp(name)).not.toBe(timestampDict[name]) + await expect(await addresPage.getTimestamp(name)).toBe(timestampDict[name] + 31536000000 * 3) } }) diff --git a/e2e/specs/stateless/registerName.spec.ts b/e2e/specs/stateless/registerName.spec.ts index 8ad8a9d43..b41b0e5a8 100644 --- a/e2e/specs/stateless/registerName.spec.ts +++ b/e2e/specs/stateless/registerName.spec.ts @@ -1,9 +1,9 @@ import { expect } from '@playwright/test' -import { Web3RequestKind } from 'headless-web3-provider' import { Hash, isHash } from 'viem' import { ethRegistrarControllerCommitSnippet } from '@ensdomains/ensjs/contracts' import { setPrimaryName } from '@ensdomains/ensjs/wallet' +import { Web3RequestKind } from '@ensdomains/headless-web3-provider' // import { secondsToDateInput } from '@app/utils/date' import { daysToSeconds, yearsToSeconds } from '@app/utils/time' @@ -28,7 +28,6 @@ test.describe.serial('normal registration', () => { page, login, accounts, - provider, time, makePageObject, }) => { @@ -112,7 +111,7 @@ test.describe.serial('normal registration', () => { await expect(waitButton).toBeDisabled() const startTimerButton = page.getByTestId('start-timer-button') await expect(startTimerButton).not.toBeVisible() - await provider.increaseTime(60) + await testClient.increaseTime({ seconds: 60 }) await expect(page.getByTestId('finish-button')).toBeEnabled() // should save the registration state and the transaction status @@ -159,7 +158,6 @@ test.describe.serial('normal registration', () => { test('should allow registering a non-primary name', async ({ page, - provider, accounts, time, login, @@ -192,7 +190,7 @@ test.describe.serial('normal registration', () => { await page.getByTestId('next-button').click() await transactionModal.confirm() await expect(page.getByTestId('countdown-complete-check')).toBeVisible() - await provider.increaseTime(60) + await testClient.increaseTime({ seconds: 60 }) await page.getByTestId('finish-button').click() await transactionModal.confirm() await page.getByTestId('view-name').click() @@ -205,7 +203,6 @@ test.describe.serial('normal registration', () => { test('should allow registering a premium name', async ({ page, login, - provider, accounts, makeName, makePageObject, @@ -236,7 +233,7 @@ test('should allow registering a premium name', async ({ await transactionModal.confirm() await expect(page.getByTestId('countdown-complete-check')).toBeVisible() - await provider.increaseTime(120) + await testClient.increaseTime({ seconds: 120 }) await page.getByTestId('finish-button').click() await transactionModal.confirm() @@ -249,7 +246,6 @@ test('should allow registering a premium name', async ({ test('should allow registering a name and resuming from the commit toast', async ({ page, login, - provider, time, makePageObject, }) => { @@ -266,13 +262,13 @@ test('should allow registering a name and resuming from the commit toast', async await page.getByTestId('next-button').click() await page.getByTestId('next-button').click() - await provider.setAutomine(false) + await testClient.setAutomine(false) await transactionModal.confirm() await page.getByTestId('transaction-modal-sent-button').click() await page.goto('/') - await provider.setAutomine(true) + await testClient.setAutomine(true) await page.getByTestId('notification-continue-button').click() await expect(page).toHaveURL(`/${name}/register`) @@ -351,7 +347,6 @@ test('should allow registering with a specific date', async ({ page, login, make test('should allow registering a premium name with a specific date', async ({ page, login, - provider, accounts, makeName, makePageObject, @@ -411,7 +406,7 @@ test('should allow registering a premium name with a specific date', async ({ await transactionModal.confirm() await expect(page.getByTestId('countdown-complete-check')).toBeVisible() - await provider.increaseTime(120) + await testClient.increaseTime({ seconds: 120 }) await page.getByTestId('finish-button').click() await transactionModal.confirm() @@ -424,7 +419,6 @@ test('should allow registering a premium name with a specific date', async ({ test('should allow registering a premium name for two months', async ({ page, login, - provider, accounts, makeName, makePageObject, @@ -484,7 +478,7 @@ test('should allow registering a premium name for two months', async ({ await transactionModal.confirm() await expect(page.getByTestId('countdown-complete-check')).toBeVisible() - await provider.increaseTime(120) + await testClient.increaseTime({ seconds: 120 }) await page.getByTestId('finish-button').click() await transactionModal.confirm() @@ -497,7 +491,6 @@ test('should allow registering a premium name for two months', async ({ test('should not allow registering a premium name for less than 28 days', async ({ page, login, - provider, accounts, makeName, makePageObject, @@ -574,7 +567,7 @@ test('should not allow registering a premium name for less than 28 days', async await transactionModal.confirm() await expect(page.getByTestId('countdown-complete-check')).toBeVisible() - await provider.increaseTime(120) + await testClient.increaseTime({ seconds: 120 }) await page.getByTestId('finish-button').click() await transactionModal.confirm() @@ -588,7 +581,6 @@ test('should allow normal registration for a month', async ({ page, login, accounts, - provider, time, makePageObject, }) => { @@ -692,7 +684,7 @@ test('should allow normal registration for a month', async ({ // should show countdown await expect(page.getByTestId('countdown-circle')).toBeVisible() await expect(page.getByTestId('countdown-complete-check')).toBeVisible() - await provider.increaseTime(60) + await testClient.increaseTime({ seconds: 60 }) await expect(page.getByTestId('finish-button')).toBeEnabled() // should save the registration state and the transaction status @@ -717,7 +709,6 @@ test('should not allow normal registration less than 28 days', async ({ page, login, accounts, - provider, time, makePageObject, }) => { @@ -832,7 +823,7 @@ test('should not allow normal registration less than 28 days', async ({ // should show countdown await expect(page.getByTestId('countdown-circle')).toBeVisible() await expect(page.getByTestId('countdown-complete-check')).toBeVisible() - await provider.increaseTime(60) + await testClient.increaseTime({ seconds: 60 }) await expect(page.getByTestId('finish-button')).toBeEnabled() // should save the registration state and the transaction status @@ -857,7 +848,6 @@ test('should be able to detect an existing commit created on a private mempool', page, login, accounts, - provider, time, wallet, makePageObject, @@ -926,7 +916,7 @@ test('should be able to detect an existing commit created on a private mempool', // should show countdown await expect(page.getByTestId('countdown-circle')).toBeVisible() await expect(page.getByTestId('countdown-circle')).toContainText(/^[0-6]?[0-9]$/) - await provider.increaseTime(60) + await testClient.increaseTime({ seconds: 60 }) await expect(page.getByTestId('countdown-complete-check')).toBeVisible({ timeout: 10000 }) }) diff --git a/e2e/specs/stateless/setPrimary.spec.ts b/e2e/specs/stateless/setPrimary.spec.ts index c59486432..df0bf6040 100644 --- a/e2e/specs/stateless/setPrimary.spec.ts +++ b/e2e/specs/stateless/setPrimary.spec.ts @@ -157,8 +157,6 @@ test.describe('profile', () => { }) => { test.slow() - // const reverseRegistrar = await contracts.get('ReverseRegistrar', { signer: 'user' }) - // await reverseRegistrar.setName('') await setPrimaryName(walletClient, { name: '', account: createAccounts().getAddress('user') as `0x${string}`, diff --git a/e2e/specs/stateless/settings.spec.ts b/e2e/specs/stateless/settings.spec.ts index bc60dcf0d..229578c11 100644 --- a/e2e/specs/stateless/settings.spec.ts +++ b/e2e/specs/stateless/settings.spec.ts @@ -45,7 +45,7 @@ test.describe('Transactions', () => { await transactionMocal.authorize() - await expect(page.getByText('Test transaction')).toBeVisible() + await expect(page.getByText('Test transaction', { exact: true })).toBeVisible() await expect(page.getByTestId('toast-desktop')).toBeVisible() await expect(page.getByTestId('toast-desktop')).toHaveText(/Transaction Successful/) diff --git a/e2e/specs/stateless/verifications.spec.ts b/e2e/specs/stateless/verifications.spec.ts new file mode 100644 index 000000000..706bb1848 --- /dev/null +++ b/e2e/specs/stateless/verifications.spec.ts @@ -0,0 +1,591 @@ +/* eslint-disable @typescript-eslint/naming-convention */ + +import { expect } from '@playwright/test' +import { test } from '@root/playwright' +import { Hash } from 'viem' + +import { setRecords } from '@ensdomains/ensjs/wallet' + +import { + DENTITY_ISS, + DENTITY_VPTOKEN_ENDPOINT, + VERIFICATION_OAUTH_BASE_URL, + VERIFICATION_RECORD_KEY, +} from '@app/constants/verification' + +import { createAccounts } from '../../../playwright/fixtures/accounts' +import { testClient } from '../../../playwright/fixtures/contracts/utils/addTestContracts' + +const makeMockVPToken = ( + records: Array< + 'com.twitter' | 'com.github' | 'com.discord' | 'org.telegram' | 'personhood' | 'email' + >, +) => { + return records.map((record) => ({ + type: [ + 'VerifiableCredential', + { + 'com.twitter': 'VerifiedTwitterAccount', + 'com.github': 'VerifiedGithubAccount', + 'com.discord': 'VerifiedDiscordAccount', + 'org.telegram': 'VerifiedTelegramAccount', + personhood: 'VerifiedPersonhood', + email: 'VerifiedEmail', + }[record], + ], + credentialSubject: { + credentialIssuer: 'Dentity', + ...(record === 'com.twitter' ? { username: '@name' } : {}), + ...(['com.twitter', 'com.github', 'com.discord', 'org.telegram'].includes(record) + ? { name: 'name' } + : {}), + ...(record === 'email' ? { verifiedEmail: 'name@email.com' } : {}), + }, + })) +} + +test.describe('Verified records', () => { + test('Should show badges if records match ', async ({ page, makePageObject, makeName }) => { + const name = await makeName({ + label: 'dentity', + type: 'wrapped', + owner: 'user', + records: { + texts: [ + { + key: 'com.twitter', + value: '@name', + }, + { + key: 'org.telegram', + value: 'name', + }, + { + key: 'com.discord', + value: 'name', + }, + { + key: 'com.github', + value: 'name', + }, + { + key: 'email', + value: 'name@email.com', + }, + { + key: VERIFICATION_RECORD_KEY, + value: JSON.stringify([ + `${DENTITY_VPTOKEN_ENDPOINT}?name=name.eth&federated_token=federated_token`, + ]), + }, + { + key: 'com.twitter', + value: '@name', + }, + ], + }, + }) + + const profilePage = makePageObject('ProfilePage') + + await page.route(`${DENTITY_VPTOKEN_ENDPOINT}*`, async (route) => { + await route.fulfill({ + status: 200, + contentType: 'application/json', + body: JSON.stringify({ + vp_token: makeMockVPToken([ + 'com.twitter', + 'com.github', + 'com.discord', + 'org.telegram', + 'personhood', + 'email', + ]), + }), + }) + }) + + await page.goto(`/${name}`) + // await login.connect() + + await page.pause() + + await expect(page.getByTestId('profile-section-verifications')).toBeVisible() + + await profilePage.isRecordVerified('text', 'com.twitter') + await profilePage.isRecordVerified('text', 'org.telegram') + await profilePage.isRecordVerified('text', 'com.github') + await profilePage.isRecordVerified('text', 'com.discord') + await profilePage.isRecordVerified('verification', 'dentity') + await profilePage.isPersonhoodVerified() + + await expect(profilePage.record('verification', 'dentity')).toBeVisible() + }) + + test('Should not show badges if records do not match ', async ({ + page, + accounts, + makePageObject, + makeName, + }) => { + const name = await makeName({ + label: 'dentity', + type: 'wrapped', + owner: 'user', + records: { + texts: [ + { + key: 'com.twitter', + value: '@name2', + }, + { + key: 'org.telegram', + value: 'name2', + }, + { + key: 'com.discord', + value: 'name2', + }, + { + key: 'com.github', + value: 'name2', + }, + { + key: VERIFICATION_RECORD_KEY, + value: JSON.stringify([ + `${DENTITY_VPTOKEN_ENDPOINT}?name=name.eth&federated_token=federated_token`, + ]), + }, + { + key: 'com.twitter', + value: '@name2', + }, + ], + }, + }) + + const profilePage = makePageObject('ProfilePage') + + await page.route(`${DENTITY_VPTOKEN_ENDPOINT}*`, async (route) => { + await route.fulfill({ + status: 200, + contentType: 'application/json', + body: JSON.stringify({ + ens_name: name, + eth_address: accounts.getAddress('user2'), + vp_token: makeMockVPToken(['com.twitter', 'com.github', 'com.discord', 'org.telegram']), + }), + }) + }) + + await page.goto(`/${name}`) + + await page.pause() + + await expect(page.getByTestId('profile-section-verifications')).toBeVisible() + + await profilePage.isRecordVerified('text', 'com.twitter', false) + await profilePage.isRecordVerified('text', 'org.telegram', false) + await profilePage.isRecordVerified('text', 'com.github', false) + await profilePage.isRecordVerified('text', 'com.discord', false) + await profilePage.isRecordVerified('verification', 'dentity', false) + await profilePage.isPersonhoodVerified(false) + + await expect(profilePage.record('verification', 'dentity')).toBeVisible() + await expect(profilePage.record('verification', 'dentity')).toBeVisible() + }) +}) + +test.describe('Verify profile', () => { + test('Should allow manager to verify profile', async ({ + page, + login, + makeName, + makePageObject, + }) => { + const name = await makeName({ + label: 'dentity', + type: 'legacy', + owner: 'user2', + manager: 'user', + }) + + const verificationsModal = makePageObject('VerificationsModal') + const profilePage = makePageObject('ProfilePage') + + await page.route(`${DENTITY_VPTOKEN_ENDPOINT}*`, async (route) => { + await route.fulfill({ + status: 200, + contentType: 'application/json', + body: JSON.stringify({ + vp_token: makeMockVPToken([ + 'personhood', + 'com.twitter', + 'com.github', + 'com.discord', + 'org.telegram', + ]), + }), + }) + }) + + await profilePage.goto(name) + await login.connect() + + await expect(profilePage.verificationsButton).toBeVisible() + await profilePage.verificationsButton.click() + + await expect(verificationsModal.verificationOption('Dentity')).toBeVisible() + await verificationsModal.isVerificationOptionAdded('Dentity', false) + await verificationsModal.verificationOption('Dentity').click() + + await expect(verificationsModal.removeVerificationOption('Dentity')).toHaveCount(0) + }) + + test('Should disable verifications button if user is owner but not manager of a name', async ({ + page, + login, + makeName, + makePageObject, + }) => { + const name = await makeName({ + label: 'dentity', + type: 'legacy', + owner: 'user', + manager: 'user2', + }) + + const profilePage = makePageObject('ProfilePage') + + await page.route(`${DENTITY_VPTOKEN_ENDPOINT}*`, async (route) => { + await route.fulfill({ + status: 200, + contentType: 'application/json', + body: JSON.stringify({ + vp_token: makeMockVPToken([ + 'personhood', + 'com.twitter', + 'com.github', + 'com.discord', + 'org.telegram', + ]), + }), + }) + }) + + await profilePage.goto(name) + await login.connect() + + await expect(profilePage.disabledVerificationsButton).toBeVisible() + }) + + test('Should be able to delete verifications record for name', async ({ + page, + login, + makeName, + makePageObject, + }) => { + const name = await makeName({ + label: 'dentity', + type: 'legacy', + owner: 'user2', + manager: 'user', + records: { + texts: [ + { + key: 'com.twitter', + value: '@name', + }, + { + key: 'org.telegram', + value: 'name', + }, + { + key: 'com.discord', + value: 'name', + }, + { + key: 'com.github', + value: 'name', + }, + { + key: VERIFICATION_RECORD_KEY, + value: JSON.stringify([ + `${DENTITY_VPTOKEN_ENDPOINT}?name=name.eth&federated_token=federated_token`, + ]), + }, + { + key: 'com.twitter', + value: '@name', + }, + ], + }, + }) + + const verificationsModal = makePageObject('VerificationsModal') + const profilePage = makePageObject('ProfilePage') + const transactionModal = makePageObject('TransactionModal') + + await page.route(`${DENTITY_VPTOKEN_ENDPOINT}*`, async (route) => { + await route.fulfill({ + status: 200, + contentType: 'application/json', + body: JSON.stringify({ + vp_token: makeMockVPToken([ + 'personhood', + 'com.twitter', + 'com.github', + 'com.discord', + 'org.telegram', + ]), + }), + }) + }) + + await profilePage.goto(name) + await login.connect() + + await page.pause() + + await expect(page.getByTestId('profile-section-verifications')).toBeVisible() + + await profilePage.isRecordVerified('text', 'com.twitter') + await profilePage.isRecordVerified('text', 'org.telegram') + await profilePage.isRecordVerified('text', 'com.github') + await profilePage.isRecordVerified('text', 'com.discord') + await profilePage.isRecordVerified('verification', 'dentity') + await profilePage.isPersonhoodVerified() + + await expect(profilePage.verificationsButton).toBeVisible() + await profilePage.verificationsButton.click() + + await expect(verificationsModal.verificationOption('Dentity')).toBeVisible() + await verificationsModal.isVerificationOptionAdded('Dentity') + await verificationsModal.verificationOption('Dentity').click() + + await expect(verificationsModal.removeVerificationOption('Dentity')).toHaveCount(1) + await verificationsModal.removeVerificationOption('Dentity').click() + + await transactionModal.autoComplete() + + await profilePage.isRecordVerified('text', 'com.twitter', false) + await profilePage.isRecordVerified('text', 'org.telegram', false) + await profilePage.isRecordVerified('text', 'com.github', false) + await profilePage.isRecordVerified('text', 'com.discord', false) + await profilePage.isRecordVerified('verification', 'dentity', false) + await profilePage.isPersonhoodVerified(false) + await page.pause() + }) +}) + +test.describe('OAuth flow', () => { + test('Should allow manager of unwrapped name to complete adding verification record', async ({ + page, + login, + makeName, + makePageObject, + }) => { + const name = await makeName({ + label: 'dentity', + type: 'legacy', + owner: 'user2', + manager: 'user', + records: { + texts: [ + { + key: 'com.twitter', + value: '@name', + }, + { + key: 'org.telegram', + value: 'name', + }, + { + key: 'com.discord', + value: 'name', + }, + { + key: 'com.github', + value: 'name', + }, + ], + }, + }) + + const transactionModal = makePageObject('TransactionModal') + const profilePage = makePageObject('ProfilePage') + + await page.route(`${VERIFICATION_OAUTH_BASE_URL}/dentity/token`, async (route) => { + await route.fulfill({ + status: 200, + contentType: 'application/json', + body: JSON.stringify({ + name, + verifiedPresentationUri: `${DENTITY_VPTOKEN_ENDPOINT}?name=${name}&federated_token=federated_token`, + }), + }) + }) + + await page.route(`${DENTITY_VPTOKEN_ENDPOINT}*`, async (route) => { + await route.fulfill({ + status: 200, + contentType: 'application/json', + body: JSON.stringify({ + vp_token: makeMockVPToken([ + 'personhood', + 'com.twitter', + 'com.github', + 'com.discord', + 'org.telegram', + ]), + }), + }) + }) + + await page.goto(`/?iss=${DENTITY_ISS}&code=dummyCode`) + await login.connect() + + await expect(page).toHaveURL(`/${name}`) + + await expect(transactionModal.transactionModal).toBeVisible() + await transactionModal.autoComplete() + + await expect(page.getByTestId('profile-section-verifications')).toBeVisible() + + await expect(profilePage.record('verification', 'dentity')).toBeVisible() + + await profilePage.isRecordVerified('text', 'com.twitter') + await profilePage.isRecordVerified('text', 'org.telegram') + await profilePage.isRecordVerified('text', 'com.github') + await profilePage.isRecordVerified('text', 'com.discord') + await profilePage.isRecordVerified('verification', 'dentity') + await profilePage.isPersonhoodVerified() + }) + + test('Should show an error message if user is owner but not manager', async ({ + page, + login, + makeName, + }) => { + const name = await makeName({ + label: 'dentity', + type: 'legacy', + owner: 'user', + manager: 'user2', + }) + + await page.route(`${VERIFICATION_OAUTH_BASE_URL}/dentity/token`, async (route) => { + await route.fulfill({ + status: 200, + contentType: 'application/json', + body: JSON.stringify({ + name, + verifiedPresentationUri: `${DENTITY_VPTOKEN_ENDPOINT}?name=${name}&federated_token=federated_token`, + }), + }) + }) + + await page.goto(`/?iss=${DENTITY_ISS}&code=dummyCode`) + await login.connect() + + await page.pause() + + await expect(page.getByText('Verification failed')).toBeVisible() + await expect( + page.getByText( + 'You must be connected as the Manager of this name to set the verification record. You can view and update the Manager under the Ownership tab.', + ), + ).toBeVisible() + + await page.pause() + await login.switchTo('user2') + + // Page should redirect to the profile page + await expect(page).toHaveURL(`/${name}`) + + await page.pause() + }) + + test('Should redirect to profile page without showing set verification record if it already set', async ({ + page, + login, + makeName, + makePageObject, + }) => { + const name = await makeName({ + label: 'dentity', + type: 'legacy', + owner: 'user', + manager: 'user', + }) + + await setRecords(testClient, { + name, + texts: [ + { + key: VERIFICATION_RECORD_KEY, + value: JSON.stringify([ + `${DENTITY_VPTOKEN_ENDPOINT}?name=${name}&federated_token=federated_token`, + ]), + }, + ], + resolverAddress: testClient.chain.contracts.legacyPublicResolver.address, + account: createAccounts().getAddress('user') as Hash, + }) + + await page.route(`${VERIFICATION_OAUTH_BASE_URL}/dentity/token`, async (route) => { + await route.fulfill({ + status: 200, + contentType: 'application/json', + body: JSON.stringify({ + name, + verifiedPresentationUri: `${DENTITY_VPTOKEN_ENDPOINT}?name=${name}&federated_token=federated_token`, + }), + }) + }) + + const transactionModal = makePageObject('TransactionModal') + + await page.goto(`/?iss=${DENTITY_ISS}&code=dummyCode`) + await login.connect('user') + + await expect(page).toHaveURL(`/${name}`) + await expect(transactionModal.transactionModal).not.toBeVisible() + + await page.pause() + }) + + test('Should show general error message if other problems occur', async ({ + page, + login, + makeName, + }) => { + const name = await makeName({ + label: 'dentity', + type: 'legacy', + owner: 'user', + manager: 'user', + }) + + await page.route(`${VERIFICATION_OAUTH_BASE_URL}/dentity/token`, async (route) => { + await route.fulfill({ + status: 200, + contentType: 'application/json', + body: JSON.stringify({ + name, + verifiedPresentationUri: undefined, + }), + }) + }) + + await page.goto(`/?iss=${DENTITY_ISS}&code=dummyCode`) + await login.connect('user') + + await page.pause() + + await expect(page.getByText('Verification failed')).toBeVisible() + await expect( + page.getByText("We could't verify your account. Please return to Dentity and try again."), + ).toBeVisible() + }) +}) diff --git a/e2e/specs/stateless/wrapName.spec.ts b/e2e/specs/stateless/wrapName.spec.ts index 198ea9ffa..44a64ac7a 100644 --- a/e2e/specs/stateless/wrapName.spec.ts +++ b/e2e/specs/stateless/wrapName.spec.ts @@ -224,13 +224,6 @@ test('should calculate needed steps without localstorage', async ({ }) => { test.slow() - // Reset name wrapper approval - // const registry = contracts.get('ENSRegistry', { signer: 'user' }) - // const nameWrapper = contracts.get('NameWrapper') - - // const txn = await registry.setApprovalForAll(nameWrapper.address, false) - // await txn.wait() - await walletClient.writeContract({ abi: registrySetApprovalForAllSnippet, address: testClient.chain.contracts.ensRegistry.address, diff --git a/functions/_middleware.ts b/functions/_middleware.ts index dd706956e..9899d867b 100644 --- a/functions/_middleware.ts +++ b/functions/_middleware.ts @@ -53,31 +53,20 @@ const staticHandler: PagesFunction = async ({ request, next, env }) => { const firefoxRewrite: PagesFunction = async ({ request, next }) => { const userAgent = request.headers.get('user-agent')?.toLowerCase() + const response = await next() - if (userAgent) { - if (userAgent.includes('gecko/20100101') && userAgent.includes('firefox/')) { - const response = await next() - response.headers.set( - 'Content-Security-Policy', - "frame-ancestors 'self' https://app.safe.global;", - ) - return new HTMLRewriter() - .on('head', new ScriptWriter('/_next/static/chunks/initialise-metamask.js')) - .transform(response) - } - - if (userAgent.includes('webview metamaskmobile') && userAgent.includes('applewebkit')) { - const response = await next() - response.headers.set( - 'Content-Security-Policy', - "worker-src 'self'; script-src 'self' 'sha256-UyYcl+sKCF/ROFZPHBlozJrndwfNiC5KT5ZZfup/pPc=' https://*.googletagmanager.com plausible.io static.cloudflareinsights.com *.ens-app-v3.pages.dev https://app.intercom.io https://widget.intercom.io https://js.intercomcdn.com 'wasm-unsafe-eval'; frame-ancestors 'self' https://app.safe.global;", - ) - return new HTMLRewriter() - .on('head', new ScriptWriter('/_next/static/chunks/initialise-metamask-ios.js')) - .transform(response) - } + // firefox CSP exception + metamask script + if (userAgent?.includes('gecko/20100101') && userAgent.includes('firefox/')) { + response.headers.set( + 'Content-Security-Policy', + "frame-ancestors 'self' https://app.safe.global;", + ) + return new HTMLRewriter() + .on('head', new ScriptWriter('/_next/static/chunks/initialise-metamask.js')) + .transform(response) } - const response = await next() + + // default headers response.headers.set( 'Content-Security-Policy', "worker-src 'self'; script-src 'self' 'sha256-UyYcl+sKCF/ROFZPHBlozJrndwfNiC5KT5ZZfup/pPc=' https://*.googletagmanager.com plausible.io static.cloudflareinsights.com *.ens-app-v3.pages.dev https://app.intercom.io https://widget.intercom.io https://js.intercomcdn.com 'wasm-unsafe-eval'; frame-ancestors 'self' https://app.safe.global;", diff --git a/knip.config.ts b/knip.config.ts new file mode 100644 index 000000000..edc38490a --- /dev/null +++ b/knip.config.ts @@ -0,0 +1,30 @@ +import type { KnipConfig } from 'knip' + +const config: KnipConfig = { + project: ['src/**/*.{js,jsx,ts,tsx,mjs,mts}'], + include: ['files', 'duplicates'], + exclude: ['types', 'exports', 'unlisted'], + next: { + entry: ['next.config.{js,ts,cjs,mjs}', 'src/pages/**/*.{js,jsx,ts,tsx}'], + }, + playwright: { + config: ['playwright.config.{js,ts}'], + entry: ['e2e/**/*.@(spec|test).?(c|m)[jt]s?(x)'], + }, + vitest: { + config: ['vitest.config.{js,mjs,ts,cjs,mts,cts}'], + entry: ['src/**/*.test.{js,ts,jsx,tsx}'], + }, + ignore: [ + // Duplicate exports. Removal is currently blocked due to potential E2E test failures. + 'src/transaction-flow/input/EditResolver/EditResolver-flow.tsx', + 'src/utils/metamask/firefox.ts', + // We still need the `test-d` files + 'src/hooks/ensjs/public/useRecords.test-d.ts', + 'src/utils/query/match/matchExactOrNullParamItem.test-d.ts', + 'src/utils/query/match/matchQueryKeyMeta.test-d.ts', + 'src/utils/query/match/queryKeyToInternalParams.test-d.ts', + ], +} + +export default config diff --git a/next-i18next.config.js b/next-i18next.config.js index dfa798781..6d9ad63fa 100644 --- a/next-i18next.config.js +++ b/next-i18next.config.js @@ -1,7 +1,7 @@ module.exports = { i18n: { defaultLocale: 'en', - locales: ['en', 'zh', 'de'], + locales: ['en', 'zh', 'de', 'ru', 'uk'], keySeparator: '.', interpolation: { escapeValue: false, diff --git a/package.json b/package.json index 7cea01f0f..4067cf45b 100644 --- a/package.json +++ b/package.json @@ -22,10 +22,8 @@ "lint": "next lint && pnpm stylelint stylelint \"./src/**/*.tsx\"", "lint:types": "tsc --noEmit", "lint:fix": "next lint --fix", - "export:add-mm-ios-provider": "node ./scripts/add-mm-ios-provider.mjs", + "export": "next export", "compare-locales": "node ./scripts/compare-locales.mjs", - "export:base": "next export", - "export": "pnpm export:base && pnpm export:add-mm-ios-provider", "analyze": "ANALYZE=true pnpm build", "analyse": "pnpm analyze", "test": "vitest run", @@ -46,7 +44,9 @@ "generate:sitemaps": "node ./scripts/generate-site-map.mjs", "generate:coinMapper": "ts-node ./scripts/coin-mapper.ts", "compose": "cp ./node_modules/@ensdomains/ens-test-env/src/docker-compose.yml ./docker-compose.yml", - "subgraph:update": "ens-test-env subgraph --var NEXT_PUBLIC_DEPLOYMENT_ADDRESSES" + "subgraph:update": "ens-test-env subgraph --var NEXT_PUBLIC_DEPLOYMENT_ADDRESSES", + "knip": "npx knip", + "knip:fix": "npx knip --fix --allow-remove-files" }, "dependencies": { "@ensdomains/address-encoder": "1.1.1", @@ -82,7 +82,6 @@ "lodash": "^4.17.21", "markdown-to-jsx": "^7.1.7", "next": "13.5.6", - "pino-pretty": "^10.3.1", "react": "^18.2.0", "react-confetti": "^6.1.0", "react-dom": "^18.2.0", @@ -108,7 +107,8 @@ "@adraffy/ens-normalize": "^1.10.1", "@cloudflare/workers-types": "^3.14.1", "@ensdomains/buffer": "^0.1.1", - "@ensdomains/ens-test-env": "^0.5.0-beta.0", + "@ensdomains/ens-test-env": "^0.5.0-beta.1", + "@ensdomains/headless-web3-provider": "^1.0.8", "@ethersproject/abi": "^5.4.0", "@ethersproject/contracts": "^5.4.0", "@ianvs/prettier-plugin-sort-imports": "^4.1.0", @@ -134,14 +134,12 @@ "@types/ws": "^8.5.10", "@typescript-eslint/eslint-plugin": "^6.7.4", "@typescript-eslint/parser": "^6.7.4", - "@vitejs/plugin-react": "^4.2.1", - "@vitest/coverage-v8": "^1.4.0", - "@vitest/spy": "^1.4.0", + "@vitejs/plugin-react": "^4.3.1", + "@vitest/coverage-v8": "^2.0.5", + "@vitest/spy": "^2.0.5", "canvas": "^2.9.3", "cbor": "^8.1.0", - "concurrently": "^7.3.0", "dotenv": "^16.0.1", - "encoding": "^0.1.13", "eslint": "8.50.0", "eslint-config-airbnb": "^19.0.4", "eslint-config-airbnb-base": "^15.0.0", @@ -157,14 +155,13 @@ "eslint-plugin-testing-library": "^6.0.2", "eslint-plugin-vitest": "^0.4.0", "ethers": "^5.7.2", - "ganache": "^7.4.1", "hardhat": "^2.10.2", "hardhat-dependency-compiler": "^1.1.3", "hardhat-deploy": "^0.11.12", - "headless-web3-provider": "0.2.3", "husky": "^7.0.4", "isows": "^1.0.3", "jsdom": "^24.0.0", + "knip": "^5.27.2", "lokijs": "^1.5.12", "msw": "^1.2.3", "multiformats": "^12.0.1", @@ -189,8 +186,8 @@ "ts-node": "^10.9.1", "typescript": "^5.1.6", "typescript-styled-plugin": "^0.18.2", - "vite-plugin-magical-svg": "^1.2.1", - "vitest": "^1.4.0", + "vite-plugin-magical-svg": "^1.3.0", + "vitest": "^2.0.5", "vitest-canvas-mock": "^0.3.3", "wait-on": "^6.0.1", "wrangler": "^3.26.0", diff --git a/playwright/fixtures/accounts.ts b/playwright/fixtures/accounts.ts index ba57cb7f2..ff1ea21ea 100644 --- a/playwright/fixtures/accounts.ts +++ b/playwright/fixtures/accounts.ts @@ -1,11 +1,7 @@ /* eslint-disable import/no-extraneous-dependencies */ -import { ethers } from 'ethers' -import { Address, Hash } from 'viem' - -import { Provider } from './provider.js' import dotenv from 'dotenv' -import { privateKeyToAccount, nonceManager } from 'viem/accounts' -import { publicClient } from './contracts/utils/addTestContracts'; +import { Account, Address, bytesToHex, Hash } from 'viem' +import { mnemonicToAccount, nonceManager, privateKeyToAccount } from 'viem/accounts' dotenv.config() @@ -19,51 +15,47 @@ const shortenAddress = (address = '', maxLength = 10, leftSlice = 5, rightSlice return `${address.slice(0, leftSlice)}...${address.slice(-rightSlice)}` } -export type Dependencies = { - provider: Provider -} - export type Accounts = ReturnType export type User = 'user' | 'user2' | 'user3' export const createAccounts = (stateful = false) => { const mnemonic = stateful ? process.env.SECRET_WORDS || DEFAULT_MNEMONIC : DEFAULT_MNEMONIC - const hdNode = ethers.utils.HDNode.fromMnemonic(mnemonic) - - const usersMap = { - user: 0, - user2: 1, - user3: 2, - } - - const privateKeys = Object.values(usersMap).map((index: number) => hdNode.derivePath(`m/44'/60'/0'/0/${index}`).privateKey) - const accounts = Object.values(usersMap).map((index: number) => { - return privateKeyToAccount(privateKeys[index] as Hash, { - nonceManager - }) - }) + const users: User[] = ['user', 'user2', 'user3'] + + const { accounts, privateKeys } = users.reduce<{ accounts: Account[]; privateKeys: Hash[] }>( + (acc, _, index) => { + const { getHdKey } = mnemonicToAccount(mnemonic, { addressIndex: index }) + const privateKey = bytesToHex(getHdKey().privateKey!) + const account = privateKeyToAccount(privateKey, { nonceManager }) + return { + accounts: [...acc.accounts, account], + privateKeys: [...acc.privateKeys, privateKey], + } + }, + { accounts: [], privateKeys: [] }, + ) return { getAccountForUser: (user: User) => { - const index = usersMap[user] - if (typeof index === 'undefined') throw new Error(`User not found: ${user}`) + const index = users.indexOf(user) + if (index < 0) throw new Error(`User not found: ${user}`) return accounts[index] }, getAllPrivateKeys: () => privateKeys, getAddress: (user: User, length?: number): Address | string => { - const index = usersMap[user] - if (typeof index === 'undefined') throw new Error(`User not found: ${user}`) + const index = users.indexOf(user) + if (index < 0) throw new Error(`User not found: ${user}`) const address = accounts[index].address if (!address) throw new Error(`Address not found: ${user}`) if (length) return shortenAddress(address, length) as string return address as Address }, getPrivateKey: (user: User) => { - const index = usersMap[user] - if (typeof index === 'undefined') throw new Error(`User not found: ${user}`) + const index = users.indexOf(user) + if (index < 0) throw new Error(`User not found: ${user}`) return privateKeys[index] - } + }, } } diff --git a/playwright/fixtures/contracts/index.ts b/playwright/fixtures/contracts/index.ts deleted file mode 100644 index 7cc95c9d6..000000000 --- a/playwright/fixtures/contracts/index.ts +++ /dev/null @@ -1,26 +0,0 @@ -/* eslint-disable import/no-extraneous-dependencies */ -import { Accounts, User } from '../accounts' -import { Provider } from '../provider' -import { getContract } from './utils/getContract' - -type Dependencies = { - provider: Provider - accounts: Accounts -} - -export type Contracts = ReturnType - -type ContractName = Parameters[0] - -export const createContracts = ({ accounts, provider }: Dependencies) => ({ - get: ( - contract: ContractName, - { signer, address }: { signer?: User; address?: `0x${string}` } = {}, - ) => { - const options = { - signer: signer ? provider.getSigner(accounts.getAddress(signer)) : undefined, - address, - } - return getContract(contract, options) - }, -}) diff --git a/playwright/fixtures/contracts/utils/addTestContracts.ts b/playwright/fixtures/contracts/utils/addTestContracts.ts index bd74eed51..7b54919cf 100644 --- a/playwright/fixtures/contracts/utils/addTestContracts.ts +++ b/playwright/fixtures/contracts/utils/addTestContracts.ts @@ -1,10 +1,10 @@ /* eslint-disable import/no-extraneous-dependencies */ import { resolve } from 'path' -import { localhost } from 'viem/chains' import { config } from 'dotenv' import { + Address, createPublicClient, createTestClient, createWalletClient, @@ -16,13 +16,14 @@ import { type TestClient, type TransactionReceipt, type WalletClient, - Address, } from 'viem' -import { makeLocalhostChainWithEns } from '@app/utils/chains/makeLocalhostChainWithEns' +import { localhost } from 'viem/chains' + import { Register } from '@app/local-contracts' +import { makeLocalhostChainWithEns } from '@app/utils/chains/makeLocalhostChainWithEns' config({ - path: resolve(__dirname, '../../.env.local'), + path: resolve(__dirname, '../../../../.env.local'), override: true, }) @@ -45,44 +46,55 @@ export const deploymentAddresses = JSON.parse( process.env.NEXT_PUBLIC_DEPLOYMENT_ADDRESSES || '{}', ) as Register['deploymentAddresses'] -export const localhostWithEns = makeLocalhostChainWithEns(localhost, deploymentAddresses) +export const localhostWithEns = makeLocalhostChainWithEns( + localhost, + deploymentAddresses, +) const localhostWithEnsAndAdditionalTestContracts = { ...localhostWithEns, contracts: { ...localhostWithEns.contracts, - legacyPublicResolver: { - address: deploymentAddresses.LegacyPublicResolver as Address + legacyPublicResolver: { + address: deploymentAddresses.LegacyPublicResolver as Address, }, legacyRegistrarController: { - address: deploymentAddresses.LegacyETHRegistrarController as Address + address: deploymentAddresses.LegacyETHRegistrarController as Address, }, publicResolver: { - address: deploymentAddresses.PublicResolver as Address + address: deploymentAddresses.PublicResolver as Address, }, - } + }, } as const const transport = http('http://localhost:8545') -export const publicClient: PublicClient = createPublicClient({ +export const publicClient: PublicClient< + typeof transport, + typeof localhostWithEnsAndAdditionalTestContracts +> = createPublicClient({ chain: localhostWithEnsAndAdditionalTestContracts, transport, }) -export const testClient: TestClient<'anvil', typeof transport, typeof localhostWithEnsAndAdditionalTestContracts> = createTestClient( - { - chain: localhostWithEnsAndAdditionalTestContracts, - transport, - mode: 'anvil', - }, -) +export const testClient: TestClient< + 'anvil', + typeof transport, + typeof localhostWithEnsAndAdditionalTestContracts +> = createTestClient({ + chain: localhostWithEnsAndAdditionalTestContracts, + transport, + mode: 'anvil', +}) -export const walletClient: WalletClient = - createWalletClient({ - chain: localhostWithEnsAndAdditionalTestContracts, - transport, - }) +export const walletClient: WalletClient< + typeof transport, + typeof localhostWithEnsAndAdditionalTestContracts, + Account +> = createWalletClient({ + chain: localhostWithEnsAndAdditionalTestContracts, + transport, +}) export const waitForTransaction = async (hash: Hash) => new Promise((resolveFn, reject) => { diff --git a/playwright/fixtures/contracts/utils/getContract.ts b/playwright/fixtures/contracts/utils/getContract.ts deleted file mode 100644 index cb52a473f..000000000 --- a/playwright/fixtures/contracts/utils/getContract.ts +++ /dev/null @@ -1,32 +0,0 @@ -/* eslint-disable import/no-extraneous-dependencies */ -import { Contract as ContractClass } from '@ethersproject/contracts' -import { match } from 'ts-pattern' - -import LegacyETHRegistrarControllerJSON from '@ensdomains/ens-contracts/deployments/archive/ETHRegistrarController_mainnet_9380471.sol/ETHRegistrarController_mainnet_9380471.json' - -require('dotenv').config({ path: '.env.local' }) - -type Contract = 'LegacyETHRegistrarController' - -type Options = { - signer?: any - address?: string -} - -export const getContract = (contract: Contract, { signer }: Options = {}) => { - const json = process.env.NEXT_PUBLIC_DEPLOYMENT_ADDRESSES - if (!json) throw new Error('No deployment addresses found') - const addresses = JSON.parse(json) - - return match(contract) - .with( - 'LegacyETHRegistrarController', - () => - new ContractClass( - addresses.LegacyETHRegistrarController, - LegacyETHRegistrarControllerJSON.abi, - signer, - ), - ) - .exhaustive() -} diff --git a/playwright/fixtures/login.ts b/playwright/fixtures/login.ts index 3c1b7eca9..fe28843c4 100644 --- a/playwright/fixtures/login.ts +++ b/playwright/fixtures/login.ts @@ -1,6 +1,7 @@ /* eslint-disable import/no-extraneous-dependencies */ import { expect, Locator, Page } from '@playwright/test' -import { Web3ProviderBackend, Web3RequestKind } from 'headless-web3-provider' + +import { Web3ProviderBackend, Web3RequestKind } from '@ensdomains/headless-web3-provider' import { Accounts, User } from './accounts.js' @@ -54,6 +55,11 @@ export class Login { await expect(this.getProfileButton).toBeVisible() } + async switchTo(user: User) { + const pk = this.accounts.getPrivateKey(user) + await this.wallet.changeAccounts([pk!]) + } + async reconnect() { await this.waitForLoad() await this.getConnectButton.click() diff --git a/playwright/fixtures/makeName/generators/generateLegacySubname.ts b/playwright/fixtures/makeName/generators/generateLegacySubname.ts index 973206cc5..926955eb8 100644 --- a/playwright/fixtures/makeName/generators/generateLegacySubname.ts +++ b/playwright/fixtures/makeName/generators/generateLegacySubname.ts @@ -8,8 +8,7 @@ import { import { RecordOptions } from '@ensdomains/ensjs/utils' import { createSubname, wrapName } from '@ensdomains/ensjs/wallet' -import { Accounts, createAccounts, User } from '../../accounts' -import { Contracts } from '../../contracts' +import { Accounts, User } from '../../accounts' import { testClient, waitForTransaction, @@ -31,12 +30,11 @@ export type LegacySubname = { type Dependencies = { accounts: Accounts - contracts: Contracts } // const DEFAULT_RESOLVER = RESOLVER_ADDRESSES['1337'][2] as `0x${string}` const DEFAULT_RESOLVER = testClient.chain.contracts.legacyPublicResolver.address export const generateLegacySubname = - ({ accounts, contracts }: Dependencies) => + ({ accounts }: Dependencies) => async ({ name, nameOwner, @@ -111,6 +109,6 @@ export const generateLegacySubname = resolver: _subname.resolver ?? DEFAULT_RESOLVER, })) for (const eachSubname of _subnames) { - await generateLegacySubname({ accounts, contracts })(eachSubname) + await generateLegacySubname({ accounts })(eachSubname) } } diff --git a/playwright/fixtures/makeName/generators/generateRecords.ts b/playwright/fixtures/makeName/generators/generateRecords.ts index 522364b4b..0a6d3b507 100644 --- a/playwright/fixtures/makeName/generators/generateRecords.ts +++ b/playwright/fixtures/makeName/generators/generateRecords.ts @@ -2,12 +2,13 @@ /* eslint-disable no-await-in-loop */ // import { toUtf8Bytes } from '@ethersproject/strings/lib/utf8' +import { Hash } from 'viem' + import { RecordOptions } from '@ensdomains/ensjs/utils' import { setRecords } from '@ensdomains/ensjs/wallet' -import { User, Accounts } from '../../accounts'; +import { Accounts, User } from '../../accounts' import { waitForTransaction, walletClient } from '../../contracts/utils/addTestContracts.js' -import { Hash } from 'viem'; type Dependencies = { accounts: Accounts @@ -21,7 +22,7 @@ type Input = { } export const generateRecords = - ({ accounts}: Dependencies) => + ({ accounts }: Dependencies) => async ({ name, owner, resolver, records }: Input) => { if (!resolver || !records || !owner) return diff --git a/playwright/fixtures/makeName/generators/generateWrappedSubname.ts b/playwright/fixtures/makeName/generators/generateWrappedSubname.ts index 2b1c1aed2..08373b5ed 100644 --- a/playwright/fixtures/makeName/generators/generateWrappedSubname.ts +++ b/playwright/fixtures/makeName/generators/generateWrappedSubname.ts @@ -1,17 +1,17 @@ /* eslint-disable import/no-extraneous-dependencies */ /* eslint-disable no-await-in-loop */ + import { EncodeFusesInputObject, RecordOptions } from '@ensdomains/ensjs/utils' import { createSubname, unwrapName } from '@ensdomains/ensjs/wallet' -import { Accounts, createAccounts, User } from '../../accounts' -import { Contracts } from '../../contracts' +import { Accounts, User } from '../../accounts' import { + publicClient, testClient, waitForTransaction, walletClient, } from '../../contracts/utils/addTestContracts' -import { Provider } from '../../provider' import { generateRecords } from './generateRecords' // type Fuse = ParentFuses['fuse'] | ChildFuses['fuse'] @@ -30,15 +30,13 @@ export type WrappedSubname = { } type Dependencies = { - provider: Provider accounts: Accounts - contracts: Contracts } const DEFAULT_RESOLVER = testClient.chain.contracts.ensPublicResolver.address export const generateWrappedSubname = - ({ provider, accounts, contracts }: Dependencies) => + ({ accounts }: Dependencies) => async ({ name, nameOwner, @@ -54,7 +52,7 @@ export const generateWrappedSubname = const subname = `${label}.${name}` console.log('generating wrapped subname:', subname) - const blockTimestamp = await provider.getBlockTimestamp() + const blockTimestamp = Number((await publicClient.getBlock()).timestamp) const expiry = duration + blockTimestamp // Make subname with resolver @@ -72,7 +70,7 @@ export const generateWrappedSubname = // Make records if (records) { - await generateRecords({ accounts})({ + await generateRecords({ accounts })({ name: `${label}.${name}`, owner, resolver, @@ -96,6 +94,6 @@ export const generateWrappedSubname = resolver: subName.resolver ?? DEFAULT_RESOLVER, })) for (const eachSubname of _subNames) { - await generateWrappedSubname({ accounts, provider, contracts })({ ...eachSubname }) + await generateWrappedSubname({ accounts })({ ...eachSubname }) } } diff --git a/playwright/fixtures/makeName/generators/legacyNameGenerator.ts b/playwright/fixtures/makeName/generators/legacyNameGenerator.ts index cb7a962c7..9aaa527b8 100644 --- a/playwright/fixtures/makeName/generators/legacyNameGenerator.ts +++ b/playwright/fixtures/makeName/generators/legacyNameGenerator.ts @@ -6,23 +6,20 @@ /* eslint-disable import/no-extraneous-dependencies */ /* eslint-disable no-await-in-loop */ -import { encodeFunctionData, Hash, hexToBigInt } from 'viem' +import { encodeFunctionData, Hash } from 'viem' import { transferName } from '@ensdomains/ensjs/wallet' -import { Accounts, createAccounts, User } from '../../accounts.js' -import { Contracts } from '../../contracts/index.js' +import { Accounts, User } from '../../accounts.js' import { publicClient, - testClient, waitForTransaction, walletClient, } from '../../contracts/utils/addTestContracts.js' -import { Provider } from '../../provider.js' -import { generateLegacySubname, LegacySubname } from './generateLegacySubname.js' import { legacyEthRegistrarControllerAbi } from '../constants/abis.js' -import { Name } from '../index'; +import { Name } from '../index' import { getLegacyRentPrice } from '../utils/getLegacyRentPrice.js' +import { generateLegacySubname, LegacySubname } from './generateLegacySubname.js' const DEFAULT_DURATION = 31536000 @@ -37,22 +34,20 @@ export type LegacyName = { } type Dependencies = { - provider: Provider accounts: Accounts - contracts: Contracts } export const isLegacyName = (name: Name): name is LegacyName => name.type === 'legacy-register' const nameWithDefaults = (name: LegacyName) => ({ ...name, - duration: name.duration ?? 31536000, + duration: name.duration ?? DEFAULT_DURATION, secret: name.secret ?? '0x0000000000000000000000000000000000000000000000000000000000000000', owner: name.owner ?? 'user', manager: name.manager ?? name.owner ?? 'user', }) -export const makeLegacyNameGenerator = ({ provider, accounts, contracts }: Dependencies) => ({ +export const makeLegacyNameGenerator = ({ accounts }: Dependencies) => ({ commit: async (nameConfig: LegacyName) => { const { label, owner, secret } = nameWithDefaults(nameConfig) const name = `${label}.eth` @@ -66,7 +61,7 @@ export const makeLegacyNameGenerator = ({ provider, accounts, contracts }: Depen functionName: 'makeCommitment', abi: legacyEthRegistrarControllerAbi, args: [label, ownerAddress, secret], - }) + }), }) const preparedTransaction = await walletClient.prepareTransactionRequest({ @@ -87,14 +82,14 @@ export const makeLegacyNameGenerator = ({ provider, accounts, contracts }: Depen const ownerAddress = accounts.getAddress(owner) - const price = await getLegacyRentPrice({ label, duration}) + const price = await getLegacyRentPrice({ label, duration }) const preparedTransaction = await walletClient.prepareTransactionRequest({ to: walletClient.chain.contracts.legacyRegistrarController.address, data: encodeFunctionData({ functionName: 'register', abi: legacyEthRegistrarControllerAbi, - args: [label, accounts.getAddress(owner), duration, secret], + args: [label, ownerAddress, duration, secret], }), value: price, gas: 1000000n, @@ -106,14 +101,16 @@ export const makeLegacyNameGenerator = ({ provider, accounts, contracts }: Depen configure: async (nameConfig: LegacyName) => { const { label, owner, manager, subnames = [], secret } = nameWithDefaults(nameConfig) const name = `${label}.eth` - // Create subnames - await Promise.all(subnames.map((subname) => { - return generateLegacySubname({ accounts, contracts })({ - ...subname, - name: `${label}.eth`, - nameOwner: owner - }) - })) + // Create subnames + await Promise.all( + subnames.map((subname) => { + return generateLegacySubname({ accounts })({ + ...subname, + name: `${label}.eth`, + nameOwner: owner, + }) + }), + ) if (!!manager && manager !== owner) { console.log('setting manager:', name, manager) @@ -126,57 +123,4 @@ export const makeLegacyNameGenerator = ({ provider, accounts, contracts }: Depen await waitForTransaction(tx) } }, - generate: async ({ - label, - owner = 'user', - manager, - duration = DEFAULT_DURATION, - // eslint-disable-next-line no-restricted-syntax - secret = '0x0000000000000000000000000000000000000000000000000000000000000000', - subnames, - }: LegacyName) => { - const name = `${label}.eth` - console.log('generating legacy name:', name) - const _owner = accounts.getAddress(owner) - - console.log('make commit:', name) - const controller = contracts.get('LegacyETHRegistrarController', { signer: owner }) - const commitment = await controller.makeCommitment(label, _owner, secret) - const commitTx = await controller.commit(commitment) - await commitTx.wait() - - await provider.increaseTime(60) - await provider.mine() - - console.log('register name:', name) - const price = await controller.rentPrice(label, duration) - const registrationTx = await controller.register(label, _owner, duration, secret, { - value: price, - }) - await registrationTx.wait() - - // Create subnames - const _subnames = (subnames || []).map((subname) => ({ - ...subname, - name: `${label}.eth`, - nameOwner: owner, - })) - for (const subname of _subnames) { - await generateLegacySubname({ accounts, contracts })(subname) - } - - if (!!manager && manager !== owner) { - console.log('setting manager:', name, manager) - const tx = await transferName(walletClient, { - name, - newOwnerAddress: createAccounts().getAddress(manager) as `0x${string}`, - contract: 'registry', - account: createAccounts().getAddress(owner) as `0x${string}`, - }) - await waitForTransaction(tx) - } - - await testClient.increaseTime({ seconds: 61 }) - await testClient.mine({ blocks: 1 }) - }, }) diff --git a/playwright/fixtures/makeName/generators/legacyWithConfigNameGenerator.ts b/playwright/fixtures/makeName/generators/legacyWithConfigNameGenerator.ts index 979c8a4a6..0d58f8c49 100644 --- a/playwright/fixtures/makeName/generators/legacyWithConfigNameGenerator.ts +++ b/playwright/fixtures/makeName/generators/legacyWithConfigNameGenerator.ts @@ -7,19 +7,17 @@ import { Address, encodeFunctionData, Hash } from 'viem' import { RecordOptions } from '@ensdomains/ensjs/utils' import { setResolver, transferName } from '@ensdomains/ensjs/wallet' -import { Accounts, createAccounts, User } from '../../accounts.js' -import { Contracts } from '../../contracts/index.js' +import { Accounts, User } from '../../accounts.js' import { publicClient, testClient, waitForTransaction, walletClient, } from '../../contracts/utils/addTestContracts.js' -import { Provider } from '../../provider.js' -import { generateLegacySubname, LegacySubname } from './generateLegacySubname.js' -import { generateRecords } from './generateRecords.js' import { legacyEthRegistrarControllerAbi } from '../constants/abis.js' import { getLegacyRentPrice } from '../utils/getLegacyRentPrice.js' +import { generateLegacySubname, LegacySubname } from './generateLegacySubname.js' +import { generateRecords } from './generateRecords.js' const LEGACY_RESOLVER = testClient.chain.contracts.legacyPublicResolver.address as Address const PUBLIC_RESOLVER = testClient.chain.contracts.publicResolver.address as Address @@ -40,16 +38,14 @@ export type LegacyName = { } type Dependencies = { - provider: Provider accounts: Accounts - contracts: Contracts } export const isLegacyName = (name: LegacyName): name is LegacyName => name.type === 'legacy' const nameWithDefaults = (name: LegacyName) => ({ ...name, - duration: name.duration ?? 31536000, + duration: name.duration ?? DEFAULT_DURATION, secret: name.secret ?? '0x0000000000000000000000000000000000000000000000000000000000000000', resolver: name.resolver ?? DEFAULT_RESOLVER, owner: name.owner ?? 'user', @@ -57,17 +53,13 @@ const nameWithDefaults = (name: LegacyName) => ({ addr: name.addr ?? name.owner ?? 'user', }) -export const makeLegacyWithConfigNameGenerator = ({ - provider, - accounts, - contracts, -}: Dependencies) => ({ +export const makeLegacyWithConfigNameGenerator = ({ accounts }: Dependencies) => ({ commit: async (nameConfig: LegacyName) => { const { label, addr, owner, resolver, secret } = nameWithDefaults(nameConfig) const name = `${label}.eth` console.log('making commitment:', name) - + const ownerAddress = accounts.getAddress(owner) const addrAddress = accounts.getAddress(addr) @@ -112,7 +104,7 @@ export const makeLegacyWithConfigNameGenerator = ({ const _resolver = hasValidResolver ? resolver : DEFAULT_RESOLVER const price = await getLegacyRentPrice({ label, duration }) - + const prepared = await walletClient.prepareTransactionRequest({ to: walletClient.chain.contracts.legacyRegistrarController.address, data: encodeFunctionData({ @@ -128,115 +120,35 @@ export const makeLegacyWithConfigNameGenerator = ({ return walletClient.sendTransaction(prepared) }, configure: async (nameConfig: LegacyName) => { - const { label, owner, resolver, manager, records, subnames = []} = nameWithDefaults(nameConfig) - const name = `${label}.eth` - const hasValidResolver = [LEGACY_RESOLVER, PUBLIC_RESOLVER].includes(resolver) - const _resolver = hasValidResolver ? resolver : DEFAULT_RESOLVER - - // Create records - if (records) await generateRecords({ accounts })({ name: `${label}.eth`, owner, resolver, records }) - - // Create subnames - await Promise.all(subnames.map((subname) => generateLegacySubname({ accounts, contracts})({...subname, name, nameOwner: owner, resolver: subname.resolver ?? _resolver}))) - - // Set resolver if not valid - if (!hasValidResolver && resolver) { - console.log('setting resolver:', name, resolver) - const tx = await setResolver(walletClient, { - name, - contract: 'registry', - resolverAddress: resolver, - account: accounts.getAddress(owner) as `0x${string}`, - }) - await waitForTransaction(tx) - } - - if (!!manager && manager !== owner) { - console.log('setting manager:', name, manager) - const tx = await transferName(walletClient, { - name, - newOwnerAddress: accounts.getAddress(manager) as `0x${string}`, - contract: 'registry', - account: accounts.getAccountForUser(owner), - }) - await waitForTransaction(tx) - } - }, - generate: async ({ - label, - owner = 'user', - manager, - duration = DEFAULT_DURATION, - // eslint-disable-next-line no-restricted-syntax - secret = '0x0000000000000000000000000000000000000000000000000000000000000000', - resolver = DEFAULT_RESOLVER, - addr = owner, - records, - subnames, - }: LegacyName) => { + const { label, owner, resolver, manager, records, subnames = [] } = nameWithDefaults(nameConfig) const name = `${label}.eth` - console.log('generating legacy name:', name) - - const _owner = accounts.getAddress(owner) - const _addr = accounts.getAddress(addr) - - // Registration will fail if resolver is not valid. If an invalid resolver is entered - // we will set the resolver after the name has been registered. const hasValidResolver = [LEGACY_RESOLVER, PUBLIC_RESOLVER].includes(resolver) - // && VALID_RESOLVERS.includes(resolver) const _resolver = hasValidResolver ? resolver : DEFAULT_RESOLVER - console.log('making commitment:', name) - const controller = contracts.get('LegacyETHRegistrarController', { signer: owner }) - const commitment = await controller.makeCommitmentWithConfig( - label, - _owner, - secret, - _resolver, - _addr, - ) - const commitTx = await controller.commit(commitment) - await commitTx.wait() - - await provider.increaseTime(120) - await provider.mine() - - console.log('registering name:', name) - const price = await controller.rentPrice(label, duration) - const registrationTx = await controller.registerWithConfig( - label, - _owner, - duration, - secret, - _resolver, - _addr, - { - value: price, - }, - ) - await registrationTx.wait() - // Create records - await generateRecords({ accounts })({ name: `${label}.eth`, owner, resolver, records }) + if (records) + await generateRecords({ accounts })({ name: `${label}.eth`, owner, resolver, records }) // Create subnames - const _subnames = (subnames || []).map((subname) => ({ - ...subname, - name: `${label}.eth`, - nameOwner: owner, - resolver: subname.resolver ?? _resolver, - })) - for (const subname of _subnames) { - await generateLegacySubname({ accounts, contracts })(subname) - } + await Promise.all( + subnames.map((subname) => + generateLegacySubname({ accounts })({ + ...subname, + name, + nameOwner: owner, + resolver: subname.resolver ?? _resolver, + }), + ), + ) + // Set resolver if not valid if (!hasValidResolver && resolver) { console.log('setting resolver:', name, resolver) const tx = await setResolver(walletClient, { name, contract: 'registry', resolverAddress: resolver, - account: createAccounts().getAddress(owner) as `0x${string}`, + account: accounts.getAddress(owner) as `0x${string}`, }) await waitForTransaction(tx) } @@ -245,13 +157,11 @@ export const makeLegacyWithConfigNameGenerator = ({ console.log('setting manager:', name, manager) const tx = await transferName(walletClient, { name, - newOwnerAddress: createAccounts().getAddress(manager) as `0x${string}`, + newOwnerAddress: accounts.getAddress(manager) as `0x${string}`, contract: 'registry', - account: createAccounts().getAddress(owner) as `0x${string}`, + account: accounts.getAccountForUser(owner), }) await waitForTransaction(tx) } - - await provider.mine() }, }) diff --git a/playwright/fixtures/makeName/generators/wrappedNameGenerator.ts b/playwright/fixtures/makeName/generators/wrappedNameGenerator.ts index 99aa5987c..0d3dbd865 100644 --- a/playwright/fixtures/makeName/generators/wrappedNameGenerator.ts +++ b/playwright/fixtures/makeName/generators/wrappedNameGenerator.ts @@ -9,19 +9,17 @@ import { RecordOptions, RegistrationParameters, } from '@ensdomains/ensjs/utils' -import { commitName, registerName, setResolver, setFuses } from '@ensdomains/ensjs/wallet' +import { commitName, registerName, setFuses, setResolver } from '@ensdomains/ensjs/wallet' -import { Accounts, createAccounts, User } from '../../accounts' -import { Contracts } from '../../contracts' +import { Accounts, User } from '../../accounts' import { testClient, waitForTransaction, walletClient, } from '../../contracts/utils/addTestContracts' -import { Provider } from '../../provider' +import { Name } from '../index' import { generateRecords } from './generateRecords' import { generateWrappedSubname, WrappedSubname } from './generateWrappedSubname' -import { Name } from '../index' const DEFAULT_RESOLVER = testClient.chain.contracts.ensPublicResolver.address @@ -42,8 +40,6 @@ export type WrappedName = { type Dependencies = { accounts: Accounts - provider: Provider - contracts: Contracts } export const isWrappendName = (name: Name): name is WrappedName => name.type === 'wrapped' @@ -56,21 +52,25 @@ const nameWithDefaults = (name: WrappedName) => ({ owner: name.owner ?? 'user', }) -const getParentFuses = (fuses?: EncodeChildFusesInputObject): EncodeChildFusesInputObject | undefined => { +const getParentFuses = ( + fuses?: EncodeChildFusesInputObject, +): EncodeChildFusesInputObject | undefined => { if (!fuses) return undefined return { named: fuses.named?.filter((fuse) => ['CANNOT_UNWRAP'].includes(fuse)) ?? [], } } -const getChildFuses = (fuses?: EncodeChildFusesInputObject): EncodeChildFusesInputObject | undefined => { +const getChildFuses = ( + fuses?: EncodeChildFusesInputObject, +): EncodeChildFusesInputObject | undefined => { if (!fuses) return undefined return { named: fuses.named?.filter((fuse) => !['CANNOT_UNWRAP'].includes(fuse)) ?? [], } } -export const makeWrappedNameGenerator = ({ accounts, provider, contracts }: Dependencies) => ({ +export const makeWrappedNameGenerator = ({ accounts }: Dependencies) => ({ commit: async (nameConfig: WrappedName) => { const { label, owner, resolver, duration, secret, fuses } = nameWithDefaults(nameConfig) const name = `${label}.eth` @@ -151,7 +151,7 @@ export const makeWrappedNameGenerator = ({ accounts, provider, contracts }: Depe const _resolver = hasValidResolver ? resolver : DEFAULT_RESOLVER if (records) { - await generateRecords({ accounts})({ + await generateRecords({ accounts })({ name, owner, resolver: _resolver as `0x${string}`, @@ -159,12 +159,16 @@ export const makeWrappedNameGenerator = ({ accounts, provider, contracts }: Depe }) } - await Promise.all(subnames.map((subname) => generateWrappedSubname({ accounts, provider, contracts})({ - ...subname, - name: `${label}.eth`, - nameOwner: owner, - resolver: subname.resolver ?? _resolver - }))) + await Promise.all( + subnames.map((subname) => + generateWrappedSubname({ accounts })({ + ...subname, + name: `${label}.eth`, + nameOwner: owner, + resolver: subname.resolver ?? _resolver, + }), + ), + ) if (!hasValidResolver && resolver) { console.log('setting resolver: ', name, resolver) @@ -187,89 +191,4 @@ export const makeWrappedNameGenerator = ({ accounts, provider, contracts }: Depe await waitForTransaction(fusesTx) } }, - generate: async ({ - label, - owner = 'user', - duration = 31536000, - // eslint-disable-next-line no-restricted-syntax - secret = '0x0000000000000000000000000000000000000000000000000000000000000000', - resolver = DEFAULT_RESOLVER, - // reverseRecord = false, - fuses, - records, - subnames, - }: WrappedName) => { - const name = `${label}.eth` - const _owner = createAccounts().getAddress(owner) as `0x${string}` - console.log('generating wrapped name:', name, 'with owner:', _owner) - - const hasValidResolver = - resolver.toLocaleLowerCase() === - testClient.chain.contracts.ensPublicResolver.address.toLowerCase() - const _resolver = hasValidResolver ? resolver : DEFAULT_RESOLVER - - console.log('making commitment:', name) - - const params: RegistrationParameters = { - name, - duration, - owner: _owner as `0x${string}`, - secret: secret as `0x${string}`, - fuses, - resolverAddress: _resolver as `0x${string}`, - } - const commitTx = await commitName(walletClient, { - ...params, - account: _owner as `0x${string}`, - }) - await waitForTransaction(commitTx) - - await testClient.increaseTime({ seconds: 120 }) // I use 120 because sometimes with anvil you need to wait a bit longer when registering multiple names at once - await testClient.mine({ blocks: 1 }) - - const price = await getPrice(walletClient, { - nameOrNames: params.name, - duration: params.duration, - }) - const total = price!.base + price!.premium - - const tx = await registerName(walletClient, { - ...params, - account: _owner as `0x${string}`, - value: total, - }) - await waitForTransaction(tx) - - const _subnames = (subnames || []).map((subname) => ({ - ...subname, - name: `${label}.eth`, - nameOwner: owner, - resolver: subname.resolver ?? _resolver, - })) - for (const subname of _subnames) { - await generateWrappedSubname({ accounts, provider, contracts })({ ...subname }) - } - - if (records) { - await generateRecords({ accounts})({ - name, - owner, - resolver: _resolver as `0x${string}`, - records, - }) - } - - if (!hasValidResolver && resolver) { - console.log('setting resolver: ', name, resolver) - const resolverTx = await setResolver(walletClient, { - name, - contract: 'nameWrapper', - resolverAddress: resolver, - account: _owner as `0x${string}`, - }) - await waitForTransaction(resolverTx) - } - - await provider.mine() - }, }) diff --git a/playwright/fixtures/makeName/index.ts b/playwright/fixtures/makeName/index.ts index eba49db8b..3bcd6dbcd 100644 --- a/playwright/fixtures/makeName/index.ts +++ b/playwright/fixtures/makeName/index.ts @@ -1,14 +1,13 @@ /* eslint-disable import/no-extraneous-dependencies */ import { Accounts } from '../accounts.js' -import { Contracts } from '../contracts/index.js' -import { - testClient, - waitForTransaction, -} from '../contracts/utils/addTestContracts' -import { Provider } from '../provider.js' +import { testClient, waitForTransaction } from '../contracts/utils/addTestContracts' import { Subgraph } from '../subgraph.js' import { Time } from '../time.js' -import { makeLegacyNameGenerator, isLegacyName, LegacyName as LegacyName } from './generators/legacyNameGenerator.js' +import { + isLegacyName, + LegacyName, + makeLegacyNameGenerator, +} from './generators/legacyNameGenerator.js' import { LegacyName as LegacyNameWithConfig, makeLegacyWithConfigNameGenerator, @@ -23,9 +22,7 @@ import { getTimeOffset } from './utils/getTimeOffset.js' type Dependencies = { accounts: Accounts - provider: Provider time: Time - contracts: Contracts subgraph: Subgraph } @@ -36,7 +33,7 @@ type Options = { syncSubgraph?: boolean } -export function createMakeNames({ accounts, provider, time, contracts, subgraph }: Dependencies) { +export function createMakeNames({ accounts, time, subgraph }: Dependencies) { async function makeNames(name: Name, options?: Options): Promise async function makeNames(names: Name[], options?: Options): Promise async function makeNames( @@ -51,12 +48,12 @@ export function createMakeNames({ accounts, provider, time, contracts, subgraph const _syncSubgraph = syncSubgraph ?? true // Create generators - const wrappedNameGenerator = makeWrappedNameGenerator({ accounts, provider, contracts }) - const legacyNameGenerator = makeLegacyWithConfigNameGenerator({ provider, accounts, contracts }) - const legacyRegisterNameGenerator = makeLegacyNameGenerator({ provider, accounts, contracts }) + const wrappedNameGenerator = makeWrappedNameGenerator({ accounts }) + const legacyNameGenerator = makeLegacyWithConfigNameGenerator({ accounts }) + const legacyRegisterNameGenerator = makeLegacyNameGenerator({ accounts }) // Set automine to false put all transactions on the same block - await provider.setAutomine(false) + await testClient.setAutomine(false) // Clear out any pending transactions await testClient.mine({ blocks: 1 }) @@ -95,20 +92,22 @@ export function createMakeNames({ accounts, provider, time, contracts, subgraph await testClient.setAutomine(true) // Finish setting up names - await Promise.all(adjustedNames.map((name) => { - if (isWrappendName(name)) { - return wrappedNameGenerator.configure(name) - } else if (isLegacyName(name)) { - return legacyRegisterNameGenerator.configure(name) - } else { - return legacyNameGenerator.configure(name) - } - })) + await Promise.all( + adjustedNames.map((name) => { + if (isWrappendName(name)) { + return wrappedNameGenerator.configure(name) + } else if (isLegacyName(name)) { + return legacyRegisterNameGenerator.configure(name) + } else { + return legacyNameGenerator.configure(name) + } + }), + ) if (offset > 0) { console.warn('You are increasing the block timestamp. Do not run this test in parallel mode.') - await provider.increaseTime(offset) - await provider.mine() + await testClient.increaseTime({ seconds: offset }) + await testClient.mine({ blocks: 1 }) } if (_syncSubgraph) await subgraph.sync() diff --git a/playwright/fixtures/makeName/utils/getLegacyRentPrice.ts b/playwright/fixtures/makeName/utils/getLegacyRentPrice.ts index b2e0e9dd1..784445596 100644 --- a/playwright/fixtures/makeName/utils/getLegacyRentPrice.ts +++ b/playwright/fixtures/makeName/utils/getLegacyRentPrice.ts @@ -1,10 +1,14 @@ -import { encodeFunctionData, hexToBigInt } from 'viem'; -import { publicClient } from '../../contracts/utils/addTestContracts'; -import { LegacyName } from '../generators/legacyNameGenerator'; -import { LegacyName as LegacyNameWithConfig } from "../generators/legacyWithConfigNameGenerator" -import { legacyEthRegistrarControllerAbi } from '../constants/abis'; +import { encodeFunctionData, hexToBigInt } from 'viem' -export const getLegacyRentPrice = async ({ label, duration}: Pick) => { +import { publicClient } from '../../contracts/utils/addTestContracts' +import { legacyEthRegistrarControllerAbi } from '../constants/abis' +import { LegacyName } from '../generators/legacyNameGenerator' +import { LegacyName as LegacyNameWithConfig } from '../generators/legacyWithConfigNameGenerator' + +export const getLegacyRentPrice = async ({ + label, + duration, +}: Pick) => { const { data: price } = await publicClient.call({ to: publicClient.chain.contracts.legacyRegistrarController.address, data: encodeFunctionData({ @@ -15,5 +19,5 @@ export const getLegacyRentPrice = async ({ label, duration}: Pick - -class ExtendedProvider extends ethers.providers.JsonRpcProvider { - async mine() { - return this.send('evm_mine', []) - } - - async increaseTime(seconds: number) { - return this.send('evm_increaseTime', [seconds]) - } - - async setAutomine(active: boolean) { - if (!active) - console.warn( - 'You have disabled automine in a test. Make sure this test is not running in parallel mode or it could affect the results of other tests', - ) - return this.send('evm_setAutomine', [active]) - } - - async getBlockNumber() { - const num = await this.send('eth_blockNumber', []) - return BigNumber.from(num).toNumber() - } - - async getBlockTimestamp() { - const currentBlock = await this.send('eth_blockNumber', []) - const block = await this.send('eth_getBlockByNumber', [currentBlock, false]) - return BigNumber.from(block.timestamp).toNumber() - } -} - -export const createProvider = (stateful = false) => { - // const apiKey = process.env.NEXT_PUBLIC_INFURA_KEY || 'cfa6ae2501cc4354a74e20432507317c' - // Using public rpc node because infura settings is blocking transactions from settings - const rpcUrl = stateful ? 'https://holesky.gateway.tenderly.co/4imxc4hQfRjxrVB2kWKvTo' : 'http://localhost:8545' - const chainId = stateful ? 17000 : 1337 - return new ExtendedProvider(rpcUrl, chainId) -} diff --git a/playwright/fixtures/subgraph.ts b/playwright/fixtures/subgraph.ts index bb4122a3c..0fda0a1ff 100644 --- a/playwright/fixtures/subgraph.ts +++ b/playwright/fixtures/subgraph.ts @@ -4,8 +4,9 @@ /* eslint-disable no-promise-executor-return */ import { gql, GraphQLClient } from 'graphql-request' +import { getBlockNumber } from 'viem/actions' -import { Provider } from './provider.js' +import { publicClient } from './contracts/utils/addTestContracts' export type Subgraph = ReturnType @@ -20,8 +21,9 @@ const query = gql` } ` -export const waitForSubgraph = (provider: Provider) => async () => { - const blockNumber = await provider.getBlockNumber() +export const waitForSubgraph = () => async () => { + const blockNumber = await getBlockNumber(publicClient) + let wait = true let count = 0 do { @@ -34,10 +36,6 @@ export const waitForSubgraph = (provider: Provider) => async () => { } while (wait && count < 10) } -type Dependencies = { - provider: Provider -} - -export const createSubgraph = ({ provider }: Dependencies) => ({ - sync: waitForSubgraph(provider), +export const createSubgraph = () => ({ + sync: waitForSubgraph(), }) diff --git a/playwright/fixtures/time.ts b/playwright/fixtures/time.ts index 406be6afa..447ed26bf 100644 --- a/playwright/fixtures/time.ts +++ b/playwright/fixtures/time.ts @@ -1,20 +1,19 @@ /* eslint-disable import/no-extraneous-dependencies */ import { Page } from '@playwright/test' -import { Provider } from './provider' +import { publicClient } from './contracts/utils/addTestContracts' export type Time = ReturnType type Dependencies = { - provider: Provider page: Page } -export const createTime = ({ provider, page }: Dependencies) => { +export const createTime = ({ page }: Dependencies) => { return { sync: async (offset = 0) => { const browserTime = await page.evaluate(() => Math.floor(Date.now() / 1000)) - const blockTime = await provider.getBlockTimestamp() + const blockTime = Number((await publicClient.getBlock()).timestamp) const browserOffset = (blockTime - browserTime + offset) * 1000 console.log(`Browser time: ${new Date(Date.now() + browserOffset)}`) diff --git a/playwright/index.ts b/playwright/index.ts index 401272d59..40bf2a3c0 100644 --- a/playwright/index.ts +++ b/playwright/index.ts @@ -1,12 +1,12 @@ /* eslint-disable import/no-extraneous-dependencies */ import { test as base } from '@playwright/test' -import { injectHeadlessWeb3Provider, Web3ProviderBackend } from 'headless-web3-provider' +import { anvil, holesky } from 'viem/chains' + +import { injectHeadlessWeb3Provider, type Web3ProviderBackend } from '@ensdomains/headless-web3-provider' import { Accounts, createAccounts } from './fixtures/accounts' -import { createContracts } from './fixtures/contracts' import { Login } from './fixtures/login' import { createMakeNames } from './fixtures/makeName/index.js' -import { createProvider, Provider } from './fixtures/provider' import { createSubgraph } from './fixtures/subgraph.js' import { createTime } from './fixtures/time.js' import { createPageObjectMaker } from './pageObjects/index.js' @@ -14,14 +14,12 @@ import { createPageObjectMaker } from './pageObjects/index.js' type Fixtures = { accounts: Accounts wallet: Web3ProviderBackend - provider: Provider login: InstanceType getContract: (contract: string) => any makeName: ReturnType makePageObject: ReturnType subgraph: ReturnType time: ReturnType - contracts: ReturnType } export const test = base.extend({ @@ -30,38 +28,33 @@ export const test = base.extend({ const stateful = testInfo.project?.name === 'stateful' use(createAccounts(stateful)) }, - contracts: async ({ accounts, provider }, use) => { - await use(createContracts({ accounts, provider })) - }, - wallet: async ({ page, accounts, provider }, use) => { - const chainId = provider.network?.chainId || 1337 - const chainRpcUrl = provider.connection?.url || 'http://localhost:8545' + wallet: async ({ page, accounts }, use, testInfo) => { + const stateful = testInfo.project?.name === 'stateful' + const chains = stateful ? [holesky] : [{ ...anvil, id: 1337 }] const privateKeys = accounts.getAllPrivateKeys() - const wallet = await injectHeadlessWeb3Provider(page, privateKeys, chainId, chainRpcUrl) + const wallet = await injectHeadlessWeb3Provider({ + page, + privateKeys, + chains, + }) await use(wallet) }, - // eslint-disable-next-line no-empty-pattern - provider: async ({}, use, testInfo) => { - const stateful = testInfo.project?.name === 'stateful' - const provider = createProvider(stateful) - await use(provider) - }, login: async ({ page, wallet, accounts }, use) => { const login = new Login(page, wallet, accounts) await use(login) }, - makeName: async ({ accounts, provider, time, contracts, subgraph }, use) => { - const makeNames = createMakeNames({ accounts, provider, time, contracts, subgraph }) + makeName: async ({ accounts, time, subgraph }, use) => { + const makeNames = createMakeNames({ accounts, time, subgraph }) await use(makeNames) }, makePageObject: async ({ page, wallet }, use) => { await use(createPageObjectMaker({ page, wallet })) }, - subgraph: async ({ provider }, use) => { - const subgraph = createSubgraph({ provider }) + subgraph: async ({}, use) => { + const subgraph = createSubgraph() await use(subgraph) }, - time: async ({ provider, page }, use) => { - await use(createTime({ provider, page })) + time: async ({ page }, use) => { + await use(createTime({ page })) }, }) diff --git a/playwright/pageObjects/addressPage.ts b/playwright/pageObjects/addressPage.ts index d28b56d49..656ad1385 100644 --- a/playwright/pageObjects/addressPage.ts +++ b/playwright/pageObjects/addressPage.ts @@ -31,6 +31,10 @@ export class AddressPage { return this.page.getByTestId(`name-item-${name}`) } + getNameAvatarWrapper(name: string) { + return this.page.getByTestId(`name-item-avatar-wrapper-${name}`) + } + getNameRows(names: string[]) { return names.map(this.getNameRow.bind(this)) } diff --git a/playwright/pageObjects/index.ts b/playwright/pageObjects/index.ts index 153138202..158682414 100644 --- a/playwright/pageObjects/index.ts +++ b/playwright/pageObjects/index.ts @@ -1,6 +1,7 @@ /* eslint-disable import/no-extraneous-dependencies */ import { Page } from '@playwright/test' -import { Web3ProviderBackend } from 'headless-web3-provider' + +import { Web3ProviderBackend } from '@ensdomains/headless-web3-provider' import { AddressPage } from './addressPage' import { AdvancedEditorModal } from './advancedEditorModal' @@ -19,6 +20,7 @@ import { SendNameModal } from './sendNameModal' import { SettingsPage } from './settingsPage' import { SubnamesPage } from './subnamePage' import { TransactionModal } from './transactionModal' +import { VerificationsModal } from './verificationsModal' type Dependencies = { page: Page; wallet: Web3ProviderBackend } @@ -40,6 +42,7 @@ const pageObjects = { TransactionModal, RecordsPage, AdvancedEditorModal, + VerificationsModal, } type PageObjects = typeof pageObjects diff --git a/playwright/pageObjects/permissionsPage.ts b/playwright/pageObjects/permissionsPage.ts index 39723033a..c0c81549e 100644 --- a/playwright/pageObjects/permissionsPage.ts +++ b/playwright/pageObjects/permissionsPage.ts @@ -77,15 +77,13 @@ export class PermissionsPage { const checkbox = this.page.getByTestId(`checkbox-${permission}`) if (await checkbox.count()) await checkbox.check() } - if (await nextButton.isDisabled() && await nameConfirmation.isVisible()) { + if ((await nextButton.isDisabled()) && (await nameConfirmation.isVisible())) { await nameConfirmation.fill(name) await nameConfirmation.press('Enter') } await nextButton.click() hasNextButton = (await nextButton.count()) > 0 } - - } async burnExtendExpiry(name: string) { @@ -96,7 +94,7 @@ export class PermissionsPage { while (hasNextButton) { const checkbox = this.page.getByTestId(`checkbox-CAN_EXTEND_EXPIRY`) if (await checkbox.count()) await checkbox.check() - if (await nextButton.isDisabled() && await nameConfirmation.isVisible()) { + if ((await nextButton.isDisabled()) && (await nameConfirmation.isVisible())) { await nameConfirmation.fill(name) await nameConfirmation.press('Enter') } @@ -117,7 +115,7 @@ export class PermissionsPage { const checkbox = this.page.getByTestId(`checkbox-${permission}`) if (await checkbox.count()) await checkbox.check() } - if (await nextButton.isDisabled() && await nameConfirmation.isVisible()) { + if ((await nextButton.isDisabled()) && (await nameConfirmation.isVisible())) { await nameConfirmation.fill(name) await nameConfirmation.press('Enter') } @@ -135,7 +133,7 @@ export class PermissionsPage { while (hasNextButton) { const checkbox = this.page.getByTestId(`checkbox-CANNOT_BURN_FUSES`) if (await checkbox.count()) await checkbox.check() - if (await nextButton.isDisabled() && await nameConfirmation.isVisible()) { + if ((await nextButton.isDisabled()) && (await nameConfirmation.isVisible())) { await nameConfirmation.fill(name) await nameConfirmation.press('Enter') } diff --git a/playwright/pageObjects/profilePage.ts b/playwright/pageObjects/profilePage.ts index 96522f24f..e14abfdba 100644 --- a/playwright/pageObjects/profilePage.ts +++ b/playwright/pageObjects/profilePage.ts @@ -1,7 +1,7 @@ /* eslint-disable import/no-extraneous-dependencies */ /* eslint-disable no-await-in-loop */ -import { Locator, Page } from '@playwright/test' +import { Locator, Page, expect } from '@playwright/test' import coinsWithIcons from '../../src/constants/coinsWithIcons.json' import { supportedGeneralRecordKeys } from '../../src/constants/supportedGeneralRecordKeys' @@ -25,6 +25,10 @@ export class ProfilePage { readonly profileEditor: Locator + readonly verificationsButton: Locator + + readonly disabledVerificationsButton: Locator + constructor(page: Page) { this.page = page this.getRecreateButton = this.page.getByTestId('profile-action-Recreate name') @@ -35,6 +39,8 @@ export class ProfilePage { this.getExtendButton = this.page.getByTestId('extend-button') this.editProfileButton = this.page.getByTestId('profile-action-Edit profile') this.profileEditor = this.page.locator('.modal') + this.verificationsButton = this.page.getByTestId('profile-action-Verifications') + this.disabledVerificationsButton = this.page.getByTestId('disabled-profile-action-Verifications') } async goto(name: string) { @@ -53,7 +59,7 @@ export class ProfilePage { return 0 } - record(type: 'text' | 'address', key: string): Locator { + record(type: 'text' | 'address' | 'verification', key: string): Locator { if (type === 'text' && PROFILE_SNIPPET_KEYS.includes(key)) return this.page.getByTestId(`profile-snippet-${key}`) if (type === 'text' && supportedSocialRecordKeys.includes(key as SupportedSocialRecordsKeys)) @@ -62,9 +68,21 @@ export class ProfilePage { if (type === 'address' && coinsWithIcons.includes(key.toLowerCase())) return this.page.getByTestId(`address-profile-button-${key.toLowerCase()}`) if (type === 'address') return this.page.getByTestId(`other-profile-button-${key}`) + if (type === 'verification') return this.page.getByTestId(`verification-profile-button-${key}`) return this.page.getByTestId(`other-profile-button-${key}`) } + isRecordVerified(type: 'text' | 'verification', key: string, verified = true) { + const count = verified ? 1 : 0 + const testId = type === 'text' ? 'verification-badge-record-icon' : 'verification-badge-person-icon' + return expect(this.record(type, key).locator('../..').getByTestId(testId)).toHaveCount(count) + } + + isPersonhoodVerified(verified = true) { + const count = verified ? 1 : 0 + return expect(this.page.getByTestId("profile-snippet-person-icon")).toHaveCount(count) + } + contentHash(): Locator { return this.page.getByTestId('other-profile-button-contenthash') } diff --git a/playwright/pageObjects/transactionModal.ts b/playwright/pageObjects/transactionModal.ts index b295787de..2f3378845 100644 --- a/playwright/pageObjects/transactionModal.ts +++ b/playwright/pageObjects/transactionModal.ts @@ -1,6 +1,7 @@ /* eslint-disable import/no-extraneous-dependencies */ import { Locator, Page } from '@playwright/test' -import { Web3ProviderBackend, Web3RequestKind } from 'headless-web3-provider' + +import { Web3ProviderBackend, Web3RequestKind } from '@ensdomains/headless-web3-provider' export class TransactionModal { readonly page: Page diff --git a/playwright/pageObjects/verificationsModal.ts b/playwright/pageObjects/verificationsModal.ts new file mode 100644 index 000000000..c4dd98dcc --- /dev/null +++ b/playwright/pageObjects/verificationsModal.ts @@ -0,0 +1,26 @@ +/* eslint-disable import/no-extraneous-dependencies */ + +/* eslint-disable no-await-in-loop */ +import { Locator, Page, expect } from '@playwright/test' + +export class VerificationsModal { + readonly page: Page + + constructor(page: Page) { + this.page = page + } + + verificationOption(protocol: 'Dentity') { + return this.page.getByTestId(`verification-option-${protocol}`) + } + + async isVerificationOptionAdded(protocol: 'Dentity', value = true) { + const count = value ? 1 : 0 + return expect(this.verificationOption(protocol).getByTestId('verification-option-added')).toHaveCount(count) + } + + removeVerificationOption(protocol: 'Dentity') { + return this.page.getByTestId(`remove-verification-button-${protocol}`) + } + +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9d9b5bcd5..11053683f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -37,7 +37,7 @@ importers: version: 1.2.0-beta.0 '@ensdomains/ensjs': specifier: 4.0.0 - version: 4.0.0(encoding@0.1.13)(typescript@5.4.5)(viem@2.19.4(bufferutil@4.0.7)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8) + version: 4.0.0(encoding@0.1.13)(typescript@5.4.5)(viem@2.19.4(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8) '@ensdomains/thorin': specifier: 0.6.50 version: 0.6.50(react-dom@18.3.1(react@18.3.1))(react-transition-state@1.1.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(styled-components@5.3.11(@babel/core@7.24.6)(react-dom@18.3.1(react@18.3.1))(react-is@17.0.2)(react@18.3.1)) @@ -55,7 +55,7 @@ importers: version: 1.4.0 '@rainbow-me/rainbowkit': specifier: 2.1.2 - version: 2.1.2(@tanstack/react-query@5.22.2(react@18.3.1))(@types/react@18.2.21)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.19.4(bufferutil@4.0.7)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(wagmi@2.12.4(@tanstack/query-core@5.22.2)(@tanstack/react-query@5.22.2(react@18.3.1))(@types/react@18.2.21)(bufferutil@4.0.7)(encoding@0.1.13)(immer@9.0.21)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(@types/react@18.2.21)(bufferutil@4.0.7)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1)(rollup@2.78.0)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.19.4(bufferutil@4.0.7)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8)) + version: 2.1.2(@tanstack/react-query@5.22.2(react@18.3.1))(@types/react@18.2.21)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.19.4(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8))(wagmi@2.12.4(@tanstack/query-core@5.22.2)(@tanstack/react-query@5.22.2(react@18.3.1))(@types/react@18.2.21)(bufferutil@4.0.8)(encoding@0.1.13)(immer@9.0.21)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(@types/react@18.2.21)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(rollup@2.78.0)(typescript@5.4.5)(utf-8-validate@5.0.10)(viem@2.19.4(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8)) '@sentry/nextjs': specifier: 7.43.x version: 7.43.0(encoding@0.1.13)(next@13.5.6(@babel/core@7.24.6)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(webpack@5.91.0(esbuild@0.17.19)) @@ -76,10 +76,10 @@ importers: version: 5.22.2(@tanstack/react-query@5.22.2(react@18.3.1))(react@18.3.1) '@wagmi/core': specifier: 2.13.3 - version: 2.13.3(@tanstack/query-core@5.22.2)(@types/react@18.2.21)(immer@9.0.21)(react@18.3.1)(typescript@5.4.5)(viem@2.19.4(bufferutil@4.0.7)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8)) + version: 2.13.3(@tanstack/query-core@5.22.2)(@types/react@18.2.21)(immer@9.0.21)(react@18.3.1)(typescript@5.4.5)(viem@2.19.4(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8)) '@walletconnect/ethereum-provider': specifier: 2.11.1 - version: 2.11.1(@types/react@18.2.21)(bufferutil@4.0.7)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3) + version: 2.11.1(@types/react@18.2.21)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@5.0.10) '@walletconnect/modal': specifier: 2.6.2 version: 2.6.2(@types/react@18.2.21)(react@18.3.1) @@ -125,9 +125,6 @@ importers: next: specifier: 13.5.6 version: 13.5.6(@babel/core@7.24.6)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - pino-pretty: - specifier: ^10.3.1 - version: 10.3.1 react: specifier: ^18.2.0 version: 18.3.1 @@ -145,7 +142,7 @@ importers: version: 7.51.0(react@18.3.1) react-i18next: specifier: ^11.18.5 - version: 11.18.6(i18next@21.10.0)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(@types/react@18.2.21)(bufferutil@4.0.7)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1) + version: 11.18.6(i18next@21.10.0)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(@types/react@18.2.21)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) react-is: specifier: ^17.0.2 version: 17.0.2 @@ -172,10 +169,10 @@ importers: version: 0.7.0(immer@9.0.21)(react@18.3.1) viem: specifier: 2.19.4 - version: 2.19.4(bufferutil@4.0.7)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8) + version: 2.19.4(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8) wagmi: specifier: 2.12.4 - version: 2.12.4(@tanstack/query-core@5.22.2)(@tanstack/react-query@5.22.2(react@18.3.1))(@types/react@18.2.21)(bufferutil@4.0.7)(encoding@0.1.13)(immer@9.0.21)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(@types/react@18.2.21)(bufferutil@4.0.7)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1)(rollup@2.78.0)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.19.4(bufferutil@4.0.7)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8) + version: 2.12.4(@tanstack/query-core@5.22.2)(@tanstack/react-query@5.22.2(react@18.3.1))(@types/react@18.2.21)(bufferutil@4.0.8)(encoding@0.1.13)(immer@9.0.21)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(@types/react@18.2.21)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(rollup@2.78.0)(typescript@5.4.5)(utf-8-validate@5.0.10)(viem@2.19.4(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8) devDependencies: '@adraffy/ens-normalize': specifier: ^1.10.1 @@ -187,8 +184,11 @@ importers: specifier: ^0.1.1 version: 0.1.1 '@ensdomains/ens-test-env': - specifier: ^0.5.0-beta.0 - version: 0.5.0-beta.0 + specifier: ^0.5.0-beta.1 + version: 0.5.0-beta.1 + '@ensdomains/headless-web3-provider': + specifier: ^1.0.8 + version: 1.0.8(viem@2.19.4(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8)) '@ethersproject/abi': specifier: ^5.4.0 version: 5.7.0 @@ -200,22 +200,22 @@ importers: version: 4.2.1(prettier@3.0.3) '@next/bundle-analyzer': specifier: ^13.4.19 - version: 13.5.6(bufferutil@4.0.7)(utf-8-validate@6.0.3) + version: 13.5.6(bufferutil@4.0.8)(utf-8-validate@5.0.10) '@nomiclabs/hardhat-ethers': specifier: npm:hardhat-deploy-ethers@0.3.0-beta.13 - version: hardhat-deploy-ethers@0.3.0-beta.13(ethers@5.7.2(bufferutil@4.0.7)(utf-8-validate@6.0.3))(hardhat@2.22.4(bufferutil@4.0.7)(ts-node@10.9.2(@types/node@18.19.33)(typescript@5.4.5))(typescript@5.4.5)(utf-8-validate@6.0.3)) + version: hardhat-deploy-ethers@0.3.0-beta.13(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.4(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@18.19.33)(typescript@5.4.5))(typescript@5.4.5)(utf-8-validate@5.0.10)) '@openzeppelin/contracts': specifier: ^4.7.3 version: 4.9.6 '@openzeppelin/test-helpers': specifier: ^0.5.16 - version: 0.5.16(bufferutil@4.0.7)(encoding@0.1.13)(utf-8-validate@6.0.3) + version: 0.5.16(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) '@playwright/test': specifier: ^1.36.2 version: 1.44.1 '@testing-library/jest-dom': specifier: ^6.4.2 - version: 6.4.5(@types/jest@29.5.12)(vitest@1.6.0(@types/node@18.19.33)(jsdom@24.1.0(bufferutil@4.0.7)(canvas@2.11.2(encoding@0.1.13))(utf-8-validate@6.0.3))(terser@5.31.5)) + version: 6.4.5(@types/jest@29.5.12)(vitest@2.0.5(@types/node@18.19.33)(jsdom@24.1.0(bufferutil@4.0.8)(canvas@2.11.2(encoding@0.1.13))(utf-8-validate@5.0.10))(terser@5.31.5)) '@testing-library/react': specifier: ^14.0.0 version: 14.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -242,7 +242,7 @@ importers: version: 2.7.3 '@types/puppeteer-core': specifier: ^5.4.0 - version: 5.4.0(bufferutil@4.0.7)(typescript@5.4.5)(utf-8-validate@6.0.3) + version: 5.4.0(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10) '@types/react': specifier: 18.2.21 version: 18.2.21 @@ -265,29 +265,23 @@ importers: specifier: ^6.7.4 version: 6.21.0(eslint@8.50.0)(typescript@5.4.5) '@vitejs/plugin-react': - specifier: ^4.2.1 - version: 4.3.0(vite@5.2.11(@types/node@18.19.33)(terser@5.31.5)) + specifier: ^4.3.1 + version: 4.3.1(vite@5.2.11(@types/node@18.19.33)(terser@5.31.5)) '@vitest/coverage-v8': - specifier: ^1.4.0 - version: 1.6.0(vitest@1.6.0(@types/node@18.19.33)(jsdom@24.1.0(bufferutil@4.0.7)(canvas@2.11.2(encoding@0.1.13))(utf-8-validate@6.0.3))(terser@5.31.5)) + specifier: ^2.0.5 + version: 2.0.5(vitest@2.0.5(@types/node@18.19.33)(jsdom@24.1.0(bufferutil@4.0.8)(canvas@2.11.2(encoding@0.1.13))(utf-8-validate@5.0.10))(terser@5.31.5)) '@vitest/spy': - specifier: ^1.4.0 - version: 1.6.0 + specifier: ^2.0.5 + version: 2.0.5 canvas: specifier: ^2.9.3 version: 2.11.2(encoding@0.1.13) cbor: specifier: ^8.1.0 version: 8.1.0 - concurrently: - specifier: ^7.3.0 - version: 7.6.0 dotenv: specifier: ^16.0.1 version: 16.4.5 - encoding: - specifier: ^0.1.13 - version: 0.1.13 eslint: specifier: 8.50.0 version: 8.50.0 @@ -329,34 +323,31 @@ importers: version: 6.2.2(eslint@8.50.0)(typescript@5.4.5) eslint-plugin-vitest: specifier: ^0.4.0 - version: 0.4.1(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.50.0)(typescript@5.4.5))(eslint@8.50.0)(typescript@5.4.5))(eslint@8.50.0)(typescript@5.4.5)(vitest@1.6.0(@types/node@18.19.33)(jsdom@24.1.0(bufferutil@4.0.7)(canvas@2.11.2(encoding@0.1.13))(utf-8-validate@6.0.3))(terser@5.31.5)) + version: 0.4.1(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.50.0)(typescript@5.4.5))(eslint@8.50.0)(typescript@5.4.5))(eslint@8.50.0)(typescript@5.4.5)(vitest@2.0.5(@types/node@18.19.33)(jsdom@24.1.0(bufferutil@4.0.8)(canvas@2.11.2(encoding@0.1.13))(utf-8-validate@5.0.10))(terser@5.31.5)) ethers: specifier: ^5.7.2 - version: 5.7.2(bufferutil@4.0.7)(utf-8-validate@6.0.3) - ganache: - specifier: ^7.4.1 - version: 7.9.2 + version: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) hardhat: specifier: ^2.10.2 - version: 2.22.4(bufferutil@4.0.7)(ts-node@10.9.2(@types/node@18.19.33)(typescript@5.4.5))(typescript@5.4.5)(utf-8-validate@6.0.3) + version: 2.22.4(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@18.19.33)(typescript@5.4.5))(typescript@5.4.5)(utf-8-validate@5.0.10) hardhat-dependency-compiler: specifier: ^1.1.3 - version: 1.1.4(hardhat@2.22.4(bufferutil@4.0.7)(ts-node@10.9.2(@types/node@18.19.33)(typescript@5.4.5))(typescript@5.4.5)(utf-8-validate@6.0.3)) + version: 1.1.4(hardhat@2.22.4(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@18.19.33)(typescript@5.4.5))(typescript@5.4.5)(utf-8-validate@5.0.10)) hardhat-deploy: specifier: ^0.11.12 - version: 0.11.45(bufferutil@4.0.7)(utf-8-validate@6.0.3) - headless-web3-provider: - specifier: 0.2.3 - version: 0.2.3(bufferutil@4.0.7)(utf-8-validate@6.0.3) + version: 0.11.45(bufferutil@4.0.8)(utf-8-validate@5.0.10) husky: specifier: ^7.0.4 version: 7.0.4 isows: specifier: ^1.0.3 - version: 1.0.4(ws@8.17.0(bufferutil@4.0.7)(utf-8-validate@6.0.3)) + version: 1.0.4(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)) jsdom: specifier: ^24.0.0 - version: 24.1.0(bufferutil@4.0.7)(canvas@2.11.2(encoding@0.1.13))(utf-8-validate@6.0.3) + version: 24.1.0(bufferutil@4.0.8)(canvas@2.11.2(encoding@0.1.13))(utf-8-validate@5.0.10) + knip: + specifier: ^5.27.2 + version: 5.27.4(@types/node@18.19.33)(typescript@5.4.5) lokijs: specifier: ^1.5.12 version: 1.5.12 @@ -430,74 +421,35 @@ importers: specifier: ^0.18.2 version: 0.18.3 vite-plugin-magical-svg: - specifier: ^1.2.1 - version: 1.2.1(vite@5.2.11(@types/node@18.19.33)(terser@5.31.5)) + specifier: ^1.3.0 + version: 1.3.0(vite@5.2.11(@types/node@18.19.33)(terser@5.31.5)) vitest: - specifier: ^1.4.0 - version: 1.6.0(@types/node@18.19.33)(jsdom@24.1.0(bufferutil@4.0.7)(canvas@2.11.2(encoding@0.1.13))(utf-8-validate@6.0.3))(terser@5.31.5) + specifier: ^2.0.5 + version: 2.0.5(@types/node@18.19.33)(jsdom@24.1.0(bufferutil@4.0.8)(canvas@2.11.2(encoding@0.1.13))(utf-8-validate@5.0.10))(terser@5.31.5) vitest-canvas-mock: specifier: ^0.3.3 - version: 0.3.3(vitest@1.6.0(@types/node@18.19.33)(jsdom@24.1.0(bufferutil@4.0.7)(canvas@2.11.2(encoding@0.1.13))(utf-8-validate@6.0.3))(terser@5.31.5)) + version: 0.3.3(vitest@2.0.5(@types/node@18.19.33)(jsdom@24.1.0(bufferutil@4.0.8)(canvas@2.11.2(encoding@0.1.13))(utf-8-validate@5.0.10))(terser@5.31.5)) wait-on: specifier: ^6.0.1 version: 6.0.1 wrangler: specifier: ^3.26.0 - version: 3.57.1(@cloudflare/workers-types@3.19.0)(bufferutil@4.0.7)(utf-8-validate@6.0.3) + version: 3.57.1(@cloudflare/workers-types@3.19.0)(bufferutil@4.0.8)(utf-8-validate@5.0.10) ws: specifier: ^8.16.0 - version: 8.17.0(bufferutil@4.0.7)(utf-8-validate@6.0.3) + version: 8.17.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) yalc: specifier: ^1.0.0-pre.53 version: 1.0.0-pre.53 - .yalc/@ensdomains/ensjs: - dependencies: - '@adraffy/ens-normalize': - specifier: 1.10.1 - version: 1.10.1 - '@ensdomains/address-encoder': - specifier: 1.1.1 - version: 1.1.1 - '@ensdomains/content-hash': - specifier: 3.1.0-rc.1 - version: 3.1.0-rc.1 - '@ensdomains/dnsprovejs': - specifier: ^0.5.1 - version: 0.5.1 - abitype: - specifier: ^1.0.0 - version: 1.0.5(typescript@5.4.5)(zod@3.23.8) - dns-packet: - specifier: ^5.3.1 - version: 5.6.1 - graphql: - specifier: ^16.3.0 - version: 16.8.1 - graphql-request: - specifier: 6.1.0 - version: 6.1.0(encoding@0.1.13)(graphql@16.8.1) - pako: - specifier: ^2.1.0 - version: 2.1.0 - viem: - specifier: ^2.9.2 - version: 2.19.0(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8) - .yalc/@ensdomains/thorin: dependencies: - '@types/jest': - specifier: ^29.5.12 - version: 29.5.12 clsx: specifier: ^1.1.1 version: 1.2.1 focus-visible: specifier: ^5.2.0 version: 5.2.0 - jest-babel: - specifier: ^1.0.1 - version: 1.0.1(babel-core@7.0.0-bridge.0(@babel/core@7.24.6)) lodash: specifier: ^4.17.21 version: 4.17.21 @@ -1321,24 +1273,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-self@7.24.6': - resolution: {integrity: sha512-FfZfHXtQ5jYPQsCRyLpOv2GeLIIJhs8aydpNh39vRDjhD411XcfWDni5i7OjP/Rs8GAtTn7sWFFELJSHqkIxYg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-self@7.24.7': resolution: {integrity: sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-source@7.24.6': - resolution: {integrity: sha512-BQTBCXmFRreU3oTUXcGKuPOfXAGb1liNY4AvvFKsOBAJ89RKcTsIrSsnMYkj59fNa66OFKnSa4AJZfy5Y4B9WA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-source@7.24.7': resolution: {integrity: sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ==} engines: {node: '>=6.9.0'} @@ -1652,8 +1592,9 @@ packages: '@ensdomains/ens-contracts@1.2.0-beta.0': resolution: {integrity: sha512-mb/1cPtwhShyaP6fWqDix6GfrJwVWlKgCFxzDKmqNGeFQhBOD/ojYGsy96eJ9UlM/7Tsg7w4RAj7xWrOlHtYIA==} - '@ensdomains/ens-test-env@0.5.0-beta.0': - resolution: {integrity: sha512-hUVdIXib+JioKJwG95PWzClWkXgSUjelAQVCJ0YIcI66TusQoFCDQYOWU3MVB7XMKEb1kPz3LoPhfFDUceYWIw==} + '@ensdomains/ens-test-env@0.5.0-beta.1': + resolution: {integrity: sha512-ppHKJTRQ5vlWSAflv20cNtlhpLyjn375VD9FeeUgl8BTx3IMPwlLvupGQTK2chDln/FJRyp6+wD41uI4oorM9w==} + engines: {node: '>=18'} hasBin: true '@ensdomains/ens@0.4.5': @@ -1668,6 +1609,12 @@ packages: peerDependencies: viem: ^2.9.2 + '@ensdomains/headless-web3-provider@1.0.8': + resolution: {integrity: sha512-whBFtO8i7N2cPW19yJNXjwZpuaGgjdePjAWJThsTpWK5JEc6EGj7Ox3Jcxi8+NtNAt9I5KV5aj94Cn3+cJsplg==} + engines: {node: 18.x || >=20} + peerDependencies: + viem: ^2.17.1 + '@ensdomains/resolver@0.2.4': resolution: {integrity: sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA==} deprecated: Please use @ensdomains/ens-contracts @@ -2134,6 +2081,10 @@ packages: '@vue/compiler-sfc': optional: true + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + '@isaacs/ttlcache@1.4.1': resolution: {integrity: sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==} engines: {node: '>=12'} @@ -2207,10 +2158,6 @@ packages: resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} hasBin: true - '@metamask/abi-utils@1.2.0': - resolution: {integrity: sha512-Hf7fnBDM9ptCPDtq/wQffWbw859CdVGMwlpWUEsTH6gLXhXONGrRXHA2piyYPRuia8YYTdJvRC/zSK1/nyLvYg==} - engines: {node: '>=14.0.0'} - '@metamask/eth-json-rpc-provider@1.0.1': resolution: {integrity: sha512-whiUMPlAOrVGmX8aKYVPvlKyG4CpQXiNNyt74vE1xb5sPvmx5oA7B/kOi/JdBvhGQq97U1/AVdXEdk2zkP8qyA==} engines: {node: '>=14.0.0'} @@ -2219,10 +2166,6 @@ packages: resolution: {integrity: sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==} engines: {node: '>=12.0.0'} - '@metamask/eth-sig-util@6.0.2': - resolution: {integrity: sha512-D6IIefM2vS+4GUGGtezdBbkwUYQC4bCosYx/JteUuF0zfe6lyxR4cruA8+2QHoUg7F7edNH1xymYpqYq1BeOkw==} - engines: {node: '>=14.0.0'} - '@metamask/json-rpc-engine@7.3.3': resolution: {integrity: sha512-dwZPq8wx9yV3IX2caLi9q9xZBw2XeIoYqdyihDDDpuHVCEiqadJLwqM3zy+uwf6F1QYQ65A8aOMQg1Uw7LMLNg==} engines: {node: '>=16.0.0'} @@ -2231,6 +2174,10 @@ packages: resolution: {integrity: sha512-IoQPmql8q7ABLruW7i4EYVHWUbF74yrp63bRuXV5Zf9BQwcn5H9Ww1eLtROYvI1bUXwOiHZ6qT5CWTrDc/t/AA==} engines: {node: '>=16.0.0'} + '@metamask/json-rpc-engine@9.0.2': + resolution: {integrity: sha512-wteoGUDhiqCgyO6Gdjnm6n+7raoRS+dRHOIsTc7LK2zpezAynav9BIK7QWPcJZeieMTSG5HuYrQf+epLbcdB/g==} + engines: {node: ^18.18 || >=20} + '@metamask/json-rpc-middleware-stream@7.0.2': resolution: {integrity: sha512-yUdzsJK04Ev98Ck4D7lmRNQ8FPioXYhEUZOMS01LXW8qTvPGiRVXmVltj2p4wrLkh0vW7u6nv0mNl5xzC5Qmfg==} engines: {node: '>=16.0.0'} @@ -2262,6 +2209,10 @@ packages: resolution: {integrity: sha512-VTgWkjWLzb0nupkFl1duQi9Mk8TGT9rsdnQg6DeRrYEFxtFOh0IF8nAwxM/4GWqDl6uIB06lqUBgUrAVWl62Bw==} engines: {node: '>=16.0.0'} + '@metamask/rpc-errors@6.3.1': + resolution: {integrity: sha512-ugDY7cKjF4/yH5LtBaOIKHw/AiGGSAmzptAUEiAEGr/78LwuzcXAxmzEQfSfMIfI+f9Djr8cttq1pRJJKfTuCg==} + engines: {node: '>=16.0.0'} + '@metamask/safe-event-emitter@2.0.0': resolution: {integrity: sha512-/kSXhY692qiV1MXu6EeOZvg5nECLclxNXcKCxJ3cXQgYuRymRHpdx/t7JXfsK+JLjwA1e1c1/SBrlQYpusC29Q==} @@ -2304,9 +2255,9 @@ packages: react-dom: optional: true - '@metamask/utils@3.6.0': - resolution: {integrity: sha512-9cIRrfkWvHblSiNDVXsjivqa9Ak0RYo/1H6tqTqTbAx+oBK2Sva0lWDHxGchOqA7bySGUJKAWSNJvH6gdHZ0gQ==} - engines: {node: '>=14.0.0'} + '@metamask/superstruct@3.1.0': + resolution: {integrity: sha512-N08M56HdOgBfRKkrgCMZvQppkZGcArEop3kixNEtVbJKm6P9Cfg0YkI6X0s1g78sNrj2fWUwvJADdZuzJgFttA==} + engines: {node: '>=16.0.0'} '@metamask/utils@5.0.2': resolution: {integrity: sha512-yfmE79bRQtnMzarnKfX7AEJBwFTxvTyw3nBQlu/5rmGXrjAeAMltoGxO62TFurxrQAFMNa/fEjIHNvungZp0+g==} @@ -2316,6 +2267,10 @@ packages: resolution: {integrity: sha512-dbIc3C7alOe0agCuBHM1h71UaEaEqOk2W8rAtEn8QGz4haH2Qq7MoK6i7v2guzvkJVVh79c+QCzIqphC3KvrJg==} engines: {node: '>=16.0.0'} + '@metamask/utils@9.2.0': + resolution: {integrity: sha512-01riKC6oc6YJVJBL6g6TgCBwcmzwuVSIIMhnwvWanPWs3ZpUabJzy3GR9PlsBPa2pHd1p0Q6WMVRExWWEHzsQA==} + engines: {node: '>=16.0.0'} + '@motionone/animation@10.17.0': resolution: {integrity: sha512-ANfIN9+iq1kGgsZxs+Nz96uiNcPLGTXwfNo2Xz/fcJXniPYpaz/Uyrfa+7I5BPLxCP82sh7quVDudf1GABqHbg==} @@ -2663,6 +2618,10 @@ packages: resolution: {integrity: sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA==} engines: {node: '>= 10.0.0'} + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + '@pkgr/core@0.1.1': resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} @@ -3032,6 +2991,11 @@ packages: '@sinonjs/fake-timers@10.3.0': resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + '@snyk/github-codeowners@1.1.0': + resolution: {integrity: sha512-lGFf08pbkEac0NYgVf4hdANpAgApRjNByLXB+WBip3qj1iendOIyAwP2GKkKbQMNVy2r1xxDf0ssfWscoiC+Vw==} + engines: {node: '>=8.10'} + hasBin: true + '@socket.io/component-emitter@3.1.2': resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} @@ -3303,9 +3267,6 @@ packages: '@trufflesuite/chromafi@3.0.0': resolution: {integrity: sha512-oqWcOqn8nT1bwlPPfidfzS55vqcIDdpfzo3HbU9EnUmcSTX+I8z0UyUFI3tZQjByVJulbzxHxUGS3ZJPwK/GPQ==} - '@trufflesuite/uws-js-unofficial@20.30.0-unofficial.0': - resolution: {integrity: sha512-r5X0aOQcuT6pLwTRLD+mPnAM/nlKtvIK4Z+My++A8tTOR0qTjNRx8UB8jzRj3D+p9PMAp5LnpCUUGmz7/TppwA==} - '@trysound/sax@0.2.0': resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} engines: {node: '>=10.13.0'} @@ -3485,9 +3446,6 @@ packages: '@types/secp256k1@4.0.6': resolution: {integrity: sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==} - '@types/seedrandom@3.0.1': - resolution: {integrity: sha512-giB9gzDeiCeloIXDgzFBCgjj1k4WxcDrZtGl6h1IqmUPlxF+Nx8Ve+96QCyDZ/HseB/uvDsKbpib9hU5cU53pw==} - '@types/semver@7.5.8': resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} @@ -3644,31 +3602,34 @@ packages: peerDependencies: '@vanilla-extract/css': ^1.0.0 - '@vitejs/plugin-react@4.3.0': - resolution: {integrity: sha512-KcEbMsn4Dpk+LIbHMj7gDPRKaTMStxxWRkRmxsg/jVdFdJCZWt1SchZcf0M4t8lIKdwwMsEyzhrcOXRrDPtOBw==} + '@vitejs/plugin-react@4.3.1': + resolution: {integrity: sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: vite: ^4.2.0 || ^5.0.0 - '@vitest/coverage-v8@1.6.0': - resolution: {integrity: sha512-KvapcbMY/8GYIG0rlwwOKCVNRc0OL20rrhFkg/CHNzncV03TE2XWvO5w9uZYoxNiMEBacAJt3unSOiZ7svePew==} + '@vitest/coverage-v8@2.0.5': + resolution: {integrity: sha512-qeFcySCg5FLO2bHHSa0tAZAOnAUbp4L6/A5JDuj9+bt53JREl8hpLjLHEWF0e/gWc8INVpJaqA7+Ene2rclpZg==} peerDependencies: - vitest: 1.6.0 + vitest: 2.0.5 + + '@vitest/expect@2.0.5': + resolution: {integrity: sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==} - '@vitest/expect@1.6.0': - resolution: {integrity: sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==} + '@vitest/pretty-format@2.0.5': + resolution: {integrity: sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==} - '@vitest/runner@1.6.0': - resolution: {integrity: sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==} + '@vitest/runner@2.0.5': + resolution: {integrity: sha512-TfRfZa6Bkk9ky4tW0z20WKXFEwwvWhRY+84CnSEtq4+3ZvDlJyY32oNTJtM7AW9ihW90tX/1Q78cb6FjoAs+ig==} - '@vitest/snapshot@1.6.0': - resolution: {integrity: sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==} + '@vitest/snapshot@2.0.5': + resolution: {integrity: sha512-SgCPUeDFLaM0mIUHfaArq8fD2WbaXG/zVXjRupthYfYGzc8ztbFbu6dUNOblBG7XLMR1kEhS/DNnfCZ2IhdDew==} - '@vitest/spy@1.6.0': - resolution: {integrity: sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==} + '@vitest/spy@2.0.5': + resolution: {integrity: sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==} - '@vitest/utils@1.6.0': - resolution: {integrity: sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==} + '@vitest/utils@2.0.5': + resolution: {integrity: sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==} '@wagmi/connectors@5.1.4': resolution: {integrity: sha512-LY8RAHy5ichhc7zknFrfrQ3RYZ/fHGgojBz0zMFae5rRrjkR3fG4gRQ9mauPwykGJmOSZshGiFryG1F1gLBm3A==} @@ -3860,14 +3821,6 @@ packages: abortcontroller-polyfill@1.7.5: resolution: {integrity: sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==} - abstract-level@1.0.3: - resolution: {integrity: sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA==} - engines: {node: '>=12'} - - abstract-leveldown@7.2.0: - resolution: {integrity: sha512-DnhQwcFEaYsvYDnACLZhMmCWd3rkOeEvglpa4q5i/5Jlm3UIsWaxVzuXvDLFCSCWRO3yy2/+V/G7FusFgejnfQ==} - engines: {node: '>=10'} - accepts@1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} @@ -3980,6 +3933,10 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} + ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + ansi-styles@3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} engines: {node: '>=4'} @@ -3992,6 +3949,10 @@ packages: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} @@ -4086,6 +4047,10 @@ packages: assertion-error@1.1.0: resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + ast-types-flow@0.0.8: resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} @@ -4105,18 +4070,12 @@ packages: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} engines: {node: '>=8'} - async-eventemitter@0.2.4: - resolution: {integrity: sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==} - async-limiter@1.0.1: resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} async-mutex@0.2.6: resolution: {integrity: sha512-Hs4R+4SPgamu6rSGW8C7cV9gaWUKEHykfzCCvIRuaVv636Ju10ZdeUbvb4TBEW0INuq2DHZqXbK4Nd3yG4RaRw==} - async@2.6.4: - resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} - asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} @@ -4322,14 +4281,6 @@ packages: buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - bufferutil@4.0.5: - resolution: {integrity: sha512-HTm14iMQKK2FjFLRTM5lAVcyaUzOnqbPtesFIvREgXpJHdQm8bWS+GkQgIkfaBYRHuCnea7w8UVNfwiAQhlr9A==} - engines: {node: '>=6.14.2'} - - bufferutil@4.0.7: - resolution: {integrity: sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==} - engines: {node: '>=6.14.2'} - bufferutil@4.0.8: resolution: {integrity: sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==} engines: {node: '>=6.14.2'} @@ -4427,10 +4378,6 @@ packages: caseless@0.12.0: resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} - catering@2.1.1: - resolution: {integrity: sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==} - engines: {node: '>=6'} - cbor@5.2.0: resolution: {integrity: sha512-5IMhi9e1QU76ppa5/ajP1BmMWZ2FHkhAhjeVKQ/EFCgYSEaeVaoGtL7cxJskf9oCCk+XjzaIdc3IuU/dbA/o2A==} engines: {node: '>=6.0.0'} @@ -4449,6 +4396,10 @@ packages: resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} engines: {node: '>=4'} + chai@5.1.1: + resolution: {integrity: sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==} + engines: {node: '>=12'} + chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -4470,6 +4421,10 @@ packages: check-error@1.0.3: resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} + cheerio-select@2.1.0: resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} @@ -4617,9 +4572,6 @@ packages: colorette@1.4.0: resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} - colorette@2.0.20: - resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - colors@1.4.0: resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} engines: {node: '>=0.1.90'} @@ -4637,6 +4589,10 @@ packages: commander@3.0.2: resolution: {integrity: sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==} + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + commander@7.2.0: resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} engines: {node: '>= 10'} @@ -4871,10 +4827,6 @@ packages: data-uri-to-buffer@2.0.2: resolution: {integrity: sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==} - data-uri-to-buffer@4.0.1: - resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} - engines: {node: '>= 12'} - data-uri-to-buffer@6.0.2: resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} engines: {node: '>= 14'} @@ -4899,9 +4851,6 @@ packages: resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} engines: {node: '>=0.11'} - dateformat@4.6.3: - resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} - dayjs@1.11.11: resolution: {integrity: sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==} @@ -4977,6 +4926,10 @@ packages: resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} engines: {node: '>=6'} + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + deep-equal@2.2.3: resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} engines: {node: '>= 0.4'} @@ -5141,6 +5094,12 @@ packages: duplexify@4.1.3: resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==} + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + easy-table@1.2.0: + resolution: {integrity: sha512-OFzVOv03YpvtcWGe5AayU5G2hgybsg3iqA6drU8UaoZyB9jLGMTrz9+asnLp/E+6qPh88yEI1gvyZFZ41dmgww==} + ecc-jsbn@0.1.2: resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} @@ -5162,10 +5121,6 @@ packages: elliptic@6.5.5: resolution: {integrity: sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw==} - emittery@0.10.0: - resolution: {integrity: sha512-AGvFfs+d0JKCJQ4o01ASQLGPmSCxgfU9RFXvzPvZdjKK8oscynksuJhWrSTSw7j7Ep/sZct5b5ZhYCi8S/t0HQ==} - engines: {node: '>=12'} - emmet@2.4.7: resolution: {integrity: sha512-O5O5QNqtdlnQM2bmKHtJgyChcrFMgQuulI+WdiOw2NArzprUqqxUW6bgYtKvzKgrsYpuLWalOkdhNP+1jluhCA==} @@ -5653,9 +5608,6 @@ packages: resolution: {integrity: sha512-3vtXinVyuUKCKFKYcwXhGE6NtGWkqF8Yh3rvMZNzmwz8EPrgoc/v4pDdLHyLnCyCI5MZpZZkDEwFyXyEONOxpA==} engines: {node: '>=8.0.0'} - fast-copy@3.0.2: - resolution: {integrity: sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==} - fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -5711,10 +5663,6 @@ packages: fd-slicer@1.1.0: resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} - fetch-blob@3.2.0: - resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} - engines: {node: ^12.20 || >= 14.13} - figures@3.2.0: resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} engines: {node: '>=8'} @@ -5799,6 +5747,10 @@ packages: for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} + engines: {node: '>=14'} + forever-agent@0.6.1: resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} @@ -5817,10 +5769,6 @@ packages: resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} engines: {node: '>= 6'} - formdata-polyfill@4.0.10: - resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} - engines: {node: '>=12.20.0'} - forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} @@ -5891,15 +5839,6 @@ packages: resolution: {integrity: sha512-SewY5KdMpaoCeh7jachEWFsh1nNlaDjNHZXWqL5IGwtpEYHTgkr2+AMCgNwKWkcc0wpSYrZfR7he4WdmHFtDxQ==} engines: {node: '>=8'} - ganache@7.9.2: - resolution: {integrity: sha512-7gsVVDpO9AhrFyDMWWl7SpMsPpqGcnAzjxz3k32LheIPNd64p2XsY9GYRdhWmKuryb60W1iaWPZWDkFKlbRWHA==} - hasBin: true - bundledDependencies: - - '@trufflesuite/bigint-buffer' - - keccak - - leveldown - - secp256k1 - gauge@3.0.2: resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} engines: {node: '>=10'} @@ -5970,6 +5909,10 @@ packages: glob-to-regexp@0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + glob@7.1.7: resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} deprecated: Glob versions prior to v9 are no longer supported @@ -6151,12 +6094,6 @@ packages: headers-polyfill@3.2.5: resolution: {integrity: sha512-tUCGvt191vNSQgttSyJoibR+VO+I6+iCHIUdhzEMJKE+EAL8BwCN7fUOZlY4ofOelNHsK+gEjxB/B+9N3EWtdA==} - headless-web3-provider@0.2.3: - resolution: {integrity: sha512-xq/HWcghDJGYmmMMGEjLaOya/XQeJWSSLvEUcOLokh768hMKvmrVBK4yI7OBLDdx+KWVLd/f/ppcU6EuXvCeZQ==} - - help-me@5.0.0: - resolution: {integrity: sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==} - hermes-estree@0.19.1: resolution: {integrity: sha512-daLGV3Q2MKk8w4evNMKwS8zBE/rcpA800nu1Q5kM08IKijoSnPe9Uo1iIxzPKRkn95IxxsgBMPeYHt3VG4ej2g==} @@ -6419,10 +6356,6 @@ packages: resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} engines: {node: '>= 0.4'} - is-buffer@2.0.5: - resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} - engines: {node: '>=4'} - is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} @@ -6651,8 +6584,8 @@ packages: resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} engines: {node: '>=10'} - istanbul-lib-source-maps@5.0.4: - resolution: {integrity: sha512-wHOoEsNJTVltaJp8eVkm8w+GVkVNHT2YDYo53YdzQEL2gWm1hBX5cGFR9hQJtuGLebidVX7et3+dmDZrmclduw==} + istanbul-lib-source-maps@5.0.6: + resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} engines: {node: '>=10'} istanbul-reports@3.1.7: @@ -6662,11 +6595,8 @@ packages: iterator.prototype@1.1.2: resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} - jest-babel@1.0.1: - resolution: {integrity: sha512-hZp74w14Rbv9zqkyrVEUBiGpjE3DvG8qmMDI5qblVhDe5TCjDzJYOHGUcousz+tJrTtHB1im29xS3cZUyhLnAg==} - deprecated: jest-babel is outdated and useless now, try to move to babel-jest package - peerDependencies: - babel-core: '>= 5.5.0 < 6' + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} jest-canvas-mock@2.5.2: resolution: {integrity: sha512-vgnpPupjOL6+L5oJXzxTxFrlGEIbHdZqFU+LFNdtLxZ3lRDCl17FlTMM7IatoRQkrcyOTMlDinjUguqmQ6bR2A==} @@ -6719,13 +6649,13 @@ packages: resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} hasBin: true + jiti@1.21.6: + resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} + hasBin: true + joi@17.13.3: resolution: {integrity: sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==} - joycon@3.1.1: - resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} - engines: {node: '>=10'} - js-cookie@2.2.1: resolution: {integrity: sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==} @@ -6745,9 +6675,6 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-tokens@9.0.0: - resolution: {integrity: sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==} - js-yaml@3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true @@ -6877,6 +6804,14 @@ packages: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} + knip@5.27.4: + resolution: {integrity: sha512-7t1yqIKxaVGYD1cLI4raVLWi9cNqv+JNbngc8mgvTVJbomnxOg1pjxgCGEztB7eVgD+6VEwf7Jg5WHXzk+Kbpw==} + engines: {node: '>=18.6.0'} + hasBin: true + peerDependencies: + '@types/node': '>=18' + typescript: '>=5.0.4' + known-css-properties@0.25.0: resolution: {integrity: sha512-b0/9J1O9Jcyik1GC6KC42hJ41jKwdO/Mq8Mdo5sYN+IuRTXs2YFHZC3kZSx6ueusqa95x3wLYe/ytKjbAfGixA==} @@ -6891,22 +6826,6 @@ packages: resolution: {integrity: sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==} engines: {node: '>=0.10.0'} - level-concat-iterator@3.1.0: - resolution: {integrity: sha512-BWRCMHBxbIqPxJ8vHOvKUsaO0v1sLYZtjN3K2iZJsRBYtp+ONsY6Jfi6hy9K3+zolgQRryhIn2NRZjZnWJ9NmQ==} - engines: {node: '>=10'} - - level-supports@2.1.0: - resolution: {integrity: sha512-E486g1NCjW5cF78KGPrMDRBYzPuueMZ6VBXHT6gC7A8UYWGiM14fGgp+s/L1oFfDWSPV/+SFkYCmZ0SiESkRKA==} - engines: {node: '>=10'} - - level-supports@4.0.1: - resolution: {integrity: sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==} - engines: {node: '>=12'} - - level-transcoder@1.0.1: - resolution: {integrity: sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==} - engines: {node: '>=12'} - leven@3.1.0: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} engines: {node: '>=6'} @@ -6945,10 +6864,6 @@ packages: resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} engines: {node: '>=6.11.5'} - local-pkg@0.5.0: - resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} - engines: {node: '>=14'} - localforage@1.10.0: resolution: {integrity: sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==} @@ -7010,6 +6925,9 @@ packages: loupe@2.3.7: resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + loupe@3.1.1: + resolution: {integrity: sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==} + lower-case-first@1.0.2: resolution: {integrity: sha512-UuxaYakO7XeONbKrZf5FEgkantPf5DUqDayzP5VXZrtRPdH86s4kN47I8B3TW10S4QKiE3ziHNf3kRN//okHjA==} @@ -7321,6 +7239,10 @@ packages: resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} engines: {node: '>=8'} + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + minizlib@1.3.3: resolution: {integrity: sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==} @@ -7378,10 +7300,6 @@ packages: modern-ahocorasick@1.0.1: resolution: {integrity: sha512-yoe+JbhTClckZ67b2itRtistFKf8yPYelHLc7e5xAwtNAXxM6wJTUx2C7QeVSJFDzKT7bCIFyBVybPMKvmB9AA==} - module-error@1.0.2: - resolution: {integrity: sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==} - engines: {node: '>=10'} - moo-color@1.0.3: resolution: {integrity: sha512-i/+ZKXMDf6aqYtBhuOcej71YSlbjT3wCO/4H1j8rPvxDJEifdwgg5MaFyu6iYAT8GBZJg2z0dkgK4YMzvURALQ==} @@ -7582,10 +7500,6 @@ packages: encoding: optional: true - node-fetch@3.3.2: - resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - node-forge@1.3.1: resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} engines: {node: '>= 6.13.0'} @@ -7739,10 +7653,6 @@ packages: on-exit-leak-free@0.2.0: resolution: {integrity: sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg==} - on-exit-leak-free@2.1.2: - resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} - engines: {node: '>=14.0.0'} - on-finished@2.3.0: resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} engines: {node: '>= 0.8'} @@ -7824,10 +7734,6 @@ packages: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} - p-limit@5.0.0: - resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} - engines: {node: '>=18'} - p-locate@2.0.0: resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} engines: {node: '>=4'} @@ -7864,6 +7770,9 @@ packages: resolution: {integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==} engines: {node: '>= 14'} + package-json-from-dist@1.0.0: + resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} + pako@2.1.0: resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==} @@ -7889,6 +7798,10 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} + parse-ms@4.0.0: + resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} + engines: {node: '>=18'} + parse5-htmlparser2-tree-adapter@7.0.0: resolution: {integrity: sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==} @@ -7932,6 +7845,10 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + path-to-regexp@0.1.7: resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} @@ -7952,6 +7869,10 @@ packages: pathval@1.1.1: resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + pathval@2.0.0: + resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + engines: {node: '>= 14.16'} + pbkdf2@3.1.2: resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} engines: {node: '>=0.12'} @@ -7972,6 +7893,10 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + pify@2.3.0: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} @@ -7999,13 +7924,6 @@ packages: pino-abstract-transport@0.5.0: resolution: {integrity: sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ==} - pino-abstract-transport@1.2.0: - resolution: {integrity: sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==} - - pino-pretty@10.3.1: - resolution: {integrity: sha512-az8JbIYeN/1iLj2t0jR9DV48/LQ3RC6hZPpapKPkb84Q+yTidMCpgWxIT3N0flnBDilyBQ1luWNpOeJptjdp/g==} - hasBin: true - pino-std-serializers@4.0.0: resolution: {integrity: sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q==} @@ -8117,6 +8035,10 @@ packages: resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + pretty-ms@9.1.0: + resolution: {integrity: sha512-o1piW0n3tgKIKCwk2vpM/vOV13zjJzvP37Ioze54YlTHE06m4tjEbzg9WsKkvTuyYln2DHjo5pY4qrZGI0otpw==} + engines: {node: '>=18'} + printable-characters@1.0.42: resolution: {integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==} @@ -8713,9 +8635,6 @@ packages: resolution: {integrity: sha512-TKWX8xvoGHrxVdqbYeZM9w+izTF4b9z3NhSaDkdn81btvuh+ivbIMGT/zQvDtTFWhRlThpoz6LEYTr7n8A5GcA==} engines: {node: '>=14.0.0'} - secure-json-parse@2.7.0: - resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} - selfsigned@2.4.1: resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} engines: {node: '>=10'} @@ -8871,6 +8790,10 @@ packages: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + smol-toml@1.3.0: + resolution: {integrity: sha512-tWpi2TsODPScmi48b/OQZGi2lgUmBCHy6SZrhi/FdnnHiU1GwebbCfuQuxsC3nHaLwtYeJGPrDZDIeodDOc4pA==} + engines: {node: '>= 18'} + snake-case@2.1.0: resolution: {integrity: sha512-FMR5YoPFwOLuh4rRz92dywJjyKYZNLpMn1R5ujVpIYkbA9p01fq8RMg0FkO4M+Yobt4MjHeLTJVm5xFFBHSV2Q==} @@ -8905,9 +8828,6 @@ packages: sonic-boom@2.8.0: resolution: {integrity: sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==} - sonic-boom@3.8.1: - resolution: {integrity: sha512-y4Z8LCDBuum+PBP3lSV7RHrXscqksve/bi0as7mhwVnBW+/wUqKT/2Kb7um8yqcFy0duYbbPxzt89Zy2nOCaxg==} - source-map-js@1.2.0: resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} engines: {node: '>=0.10.0'} @@ -9061,6 +8981,10 @@ packages: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + string.prototype.matchall@4.0.11: resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} engines: {node: '>= 0.4'} @@ -9101,6 +9025,10 @@ packages: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + strip-bom@2.0.0: resolution: {integrity: sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==} engines: {node: '>=0.10.0'} @@ -9133,8 +9061,9 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - strip-literal@2.1.0: - resolution: {integrity: sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==} + strip-json-comments@5.0.1: + resolution: {integrity: sha512-0fk9zBqO67Nq5M/m45qHCJxylV/DhBlIOVExqgOMiCCrzrhU6tCibRXNqE3jwJLftzE9SNuZtYbpzcO+i9FiKw==} + engines: {node: '>=14.16'} strnum@1.0.5: resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} @@ -9219,6 +9148,9 @@ packages: sudo-prompt@9.2.1: resolution: {integrity: sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==} + summary@2.1.0: + resolution: {integrity: sha512-nMIjMrd5Z2nuB2RZCKJfFMjgS3fygbeyGk9PxPPaJR1RIcyN9yn4A63Isovzm3ZtQuEkLBVgMdPup8UeLH7aQw==} + superstruct@1.0.4: resolution: {integrity: sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ==} engines: {node: '>=14.0.0'} @@ -9329,9 +9261,9 @@ packages: engines: {node: '>=10'} hasBin: true - test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} + test-exclude@7.0.1: + resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} + engines: {node: '>=18'} testrpc@0.0.1: resolution: {integrity: sha512-afH1hO+SQ/VPlmaLUFj2636QMeDvPCeQMc/9RBMW0IfjNe9gFD9Ra3ShqYkB7py0do1ZcCna/9acHyzTJ+GcNA==} @@ -9363,12 +9295,16 @@ packages: tinybench@2.8.0: resolution: {integrity: sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==} - tinypool@0.8.4: - resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} + tinypool@1.0.1: + resolution: {integrity: sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==} + engines: {node: ^18.0.0 || >=20.0.0} + + tinyrainbow@1.2.0: + resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} engines: {node: '>=14.0.0'} - tinyspy@2.2.1: - resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} + tinyspy@3.0.0: + resolution: {integrity: sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA==} engines: {node: '>=14.0.0'} title-case@2.1.1: @@ -9744,14 +9680,6 @@ packages: resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} engines: {node: '>=6.14.2'} - utf-8-validate@5.0.7: - resolution: {integrity: sha512-vLt1O5Pp+flcArHGIyKEQq883nBt8nN8tVBcoL0qUXj2XT1n7p70yGIq2VK98I5FdZ1YHc0wk/koOnHjnXWk1Q==} - engines: {node: '>=6.14.2'} - - utf-8-validate@6.0.3: - resolution: {integrity: sha512-uIuGf9TWQ/y+0Lp+KGZCMuJWc3N9BHA+l/UmHd/oUHwJJDeysyTRxNQVkbzsIWfGFbRe3OcgML/i0mvVRPOyDA==} - engines: {node: '>=6.14.2'} - utf8@3.0.0: resolution: {integrity: sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==} @@ -9814,14 +9742,6 @@ packages: resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} engines: {'0': node >=0.6.0} - viem@2.19.0: - resolution: {integrity: sha512-3UYVzNHhXW6Fug/di4IpISWDUACFEo4CHR+/BgmiNwzEQ/1mskBAsoTjfF5WdWUMeq0HGTGyzjNKipxsak5Jbw==} - peerDependencies: - typescript: '>=5.0.4' - peerDependenciesMeta: - typescript: - optional: true - viem@2.19.4: resolution: {integrity: sha512-JdhK3ui3uPD2tnpqGNkJaDQV4zTfOeKXcF+VrU8RG88Dn2e0lFjv6l7m0YNmYLsHm+n5vFFfCLcUrTk6xcYv5w==} peerDependencies: @@ -9830,13 +9750,13 @@ packages: typescript: optional: true - vite-node@1.6.0: - resolution: {integrity: sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==} + vite-node@2.0.5: + resolution: {integrity: sha512-LdsW4pxj0Ot69FAoXZ1yTnA9bjGohr2yNBU7QKRxpz8ITSkhuDl6h3zS/tvgz4qrNjeRnvrWeXQ8ZF7Um4W00Q==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true - vite-plugin-magical-svg@1.2.1: - resolution: {integrity: sha512-CZBbChp8GwebN6LOpu61WvL3bcZvBGSq2N1n1UVijwVlJyg7NOlKueKJp4Y5BJe1I8td/U5HdWtJjFbfzI87+w==} + vite-plugin-magical-svg@1.3.0: + resolution: {integrity: sha512-uUxFEq+qHtNXRmGuF5TJxjn4fO0AKM9DCc0jp5WNxyx76FFvyiVcrhS8J3bi3N5DGHeawE+D9OO9/Xf8BHE5qA==} peerDependencies: vite: '>= 3.0.0' @@ -9873,15 +9793,15 @@ packages: peerDependencies: vitest: '*' - vitest@1.6.0: - resolution: {integrity: sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==} + vitest@2.0.5: + resolution: {integrity: sha512-8GUxONfauuIdeSl5f9GTgVEpg5BTOlplET4WEDaeY2QBiN8wSm68vxN/tb5z405OwppfoCavnwXafiaYBC/xOA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 1.6.0 - '@vitest/ui': 1.6.0 + '@vitest/browser': 2.0.5 + '@vitest/ui': 2.0.5 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -10220,8 +10140,8 @@ packages: engines: {node: '>= 8'} hasBin: true - why-is-node-running@2.2.2: - resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} engines: {node: '>=8'} hasBin: true @@ -10271,6 +10191,10 @@ packages: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} @@ -10351,18 +10275,6 @@ packages: utf-8-validate: optional: true - ws@8.13.0: - resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - ws@8.17.0: resolution: {integrity: sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==} engines: {node: '>=10.0.0'} @@ -10511,10 +10423,6 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} - engines: {node: '>=12.20'} - youch@3.3.3: resolution: {integrity: sha512-qSFXUk3UZBLfggAW3dJKg0BMblG5biqSF8M34E06o5CSsZtH92u9Hqmj2RzGiHDi64fhe83+4tENFP2DB6t6ZA==} @@ -10524,6 +10432,12 @@ packages: peerDependencies: ethers: ^5.7.0 + zod-validation-error@3.3.1: + resolution: {integrity: sha512-uFzCZz7FQis256dqw4AhPQgD6f3pzNca/Zh62RNELavlumQB3nDIUFbF5JQfFLcMbO1s02Q7Xg/gpcOBlEnYZA==} + engines: {node: '>=18.0.0'} + peerDependencies: + zod: ^3.18.0 + zod@3.22.4: resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} @@ -10616,7 +10530,7 @@ snapshots: '@babel/helper-builder-binary-assignment-operator-visitor@7.24.6': dependencies: - '@babel/types': 7.24.6 + '@babel/types': 7.25.2 '@babel/helper-compilation-targets@7.24.6': dependencies: @@ -10678,8 +10592,8 @@ snapshots: dependencies: '@babel/core': 7.24.6 '@babel/helper-compilation-targets': 7.24.6 - '@babel/helper-plugin-utils': 7.24.6 - debug: 4.3.4(supports-color@8.1.1) + '@babel/helper-plugin-utils': 7.24.8 + debug: 4.3.6 lodash.debounce: 4.0.8 resolve: 1.22.8 transitivePeerDependencies: @@ -10702,7 +10616,7 @@ snapshots: '@babel/helper-member-expression-to-functions@7.24.6': dependencies: - '@babel/types': 7.24.6 + '@babel/types': 7.25.2 '@babel/helper-member-expression-to-functions@7.24.8': dependencies: @@ -10743,7 +10657,7 @@ snapshots: '@babel/helper-optimise-call-expression@7.24.6': dependencies: - '@babel/types': 7.24.6 + '@babel/types': 7.25.2 '@babel/helper-optimise-call-expression@7.24.7': dependencies: @@ -10798,7 +10712,7 @@ snapshots: '@babel/helper-skip-transparent-expression-wrappers@7.24.6': dependencies: - '@babel/types': 7.24.6 + '@babel/types': 7.25.2 '@babel/helper-skip-transparent-expression-wrappers@7.24.7': dependencies: @@ -10827,7 +10741,7 @@ snapshots: dependencies: '@babel/helper-function-name': 7.24.6 '@babel/template': 7.24.6 - '@babel/types': 7.24.6 + '@babel/types': 7.25.2 '@babel/helper-wrap-function@7.25.0': dependencies: @@ -11066,7 +10980,7 @@ snapshots: '@babel/plugin-syntax-typescript@7.24.6(@babel/core@7.24.6)': dependencies: '@babel/core': 7.24.6 - '@babel/helper-plugin-utils': 7.24.6 + '@babel/helper-plugin-utils': 7.24.8 '@babel/plugin-syntax-typescript@7.24.7(@babel/core@7.24.6)': dependencies: @@ -11430,21 +11344,11 @@ snapshots: '@babel/core': 7.24.6 '@babel/plugin-transform-react-jsx': 7.24.6(@babel/core@7.24.6) - '@babel/plugin-transform-react-jsx-self@7.24.6(@babel/core@7.24.6)': - dependencies: - '@babel/core': 7.24.6 - '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-transform-react-jsx-self@7.24.7(@babel/core@7.24.6)': dependencies: '@babel/core': 7.24.6 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-react-jsx-source@7.24.6(@babel/core@7.24.6)': - dependencies: - '@babel/core': 7.24.6 - '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-transform-react-jsx-source@7.24.7(@babel/core@7.24.6)': dependencies: '@babel/core': 7.24.6 @@ -11931,7 +11835,7 @@ snapshots: '@openzeppelin/contracts': 4.9.6 dns-packet: 5.6.1 - '@ensdomains/ens-test-env@0.5.0-beta.0': + '@ensdomains/ens-test-env@0.5.0-beta.1': dependencies: '@ethersproject/wallet': 5.7.0 ansi-colors: 4.1.3 @@ -11940,12 +11844,8 @@ snapshots: concurrently: 7.6.0 docker-compose: 0.24.8 dotenv: 16.4.5 - fs-extra: 10.1.0 - ganache: 7.9.2 - got: 12.1.0 js-yaml: 4.1.0 lz4: 0.6.5 - node-fetch: 3.3.2 progress-stream: 2.0.0 tar-fs: 2.1.1 wait-on: 6.0.1 @@ -11960,7 +11860,7 @@ snapshots: testrpc: 0.0.1 web3-utils: 1.10.4 - '@ensdomains/ensjs@2.1.0(bufferutil@4.0.7)(utf-8-validate@6.0.3)': + '@ensdomains/ensjs@2.1.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: '@babel/runtime': 7.24.6 '@ensdomains/address-encoder': 0.1.9 @@ -11968,13 +11868,13 @@ snapshots: '@ensdomains/resolver': 0.2.4 content-hash: 2.5.2 eth-ens-namehash: 2.0.8 - ethers: 5.7.2(bufferutil@4.0.7)(utf-8-validate@6.0.3) + ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) js-sha3: 0.8.0 transitivePeerDependencies: - bufferutil - utf-8-validate - '@ensdomains/ensjs@4.0.0(encoding@0.1.13)(typescript@5.4.5)(viem@2.19.4(bufferutil@4.0.7)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8)': + '@ensdomains/ensjs@4.0.0(encoding@0.1.13)(typescript@5.4.5)(viem@2.19.4(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8)': dependencies: '@adraffy/ens-normalize': 1.10.1 '@ensdomains/address-encoder': 1.1.1 @@ -11985,12 +11885,20 @@ snapshots: graphql: 16.8.1 graphql-request: 6.1.0(encoding@0.1.13)(graphql@16.8.1) pako: 2.1.0 - viem: 2.19.4(bufferutil@4.0.7)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8) + viem: 2.19.4(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8) transitivePeerDependencies: - encoding - typescript - zod + '@ensdomains/headless-web3-provider@1.0.8(viem@2.19.4(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8))': + dependencies: + '@metamask/json-rpc-engine': 9.0.2 + '@metamask/utils': 9.2.0 + viem: 2.19.4(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8) + transitivePeerDependencies: + - supports-color + '@ensdomains/resolver@0.2.4': {} '@ensdomains/solsha1@0.0.3': @@ -12353,7 +12261,7 @@ snapshots: dependencies: '@ethersproject/logger': 5.7.0 - '@ethersproject/providers@5.7.2(bufferutil@4.0.7)(utf-8-validate@6.0.3)': + '@ethersproject/providers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: '@ethersproject/abstract-provider': 5.7.0 '@ethersproject/abstract-signer': 5.7.0 @@ -12374,7 +12282,7 @@ snapshots: '@ethersproject/transactions': 5.7.0 '@ethersproject/web': 5.7.1 bech32: 1.1.4 - ws: 7.4.6(bufferutil@4.0.7)(utf-8-validate@6.0.3) + ws: 7.4.6(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - utf-8-validate @@ -12507,6 +12415,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + '@isaacs/ttlcache@1.4.1': {} '@istanbuljs/schema@0.1.3': {} @@ -12525,6 +12442,7 @@ snapshots: '@jest/expect-utils@29.7.0': dependencies: jest-get-type: 29.6.3 + optional: true '@jest/fake-timers@29.7.0': dependencies: @@ -12606,13 +12524,6 @@ snapshots: - encoding - supports-color - '@metamask/abi-utils@1.2.0': - dependencies: - '@metamask/utils': 3.6.0 - superstruct: 1.0.4 - transitivePeerDependencies: - - supports-color - '@metamask/eth-json-rpc-provider@1.0.1': dependencies: '@metamask/json-rpc-engine': 7.3.3 @@ -12629,18 +12540,6 @@ snapshots: tweetnacl: 1.0.3 tweetnacl-util: 0.15.1 - '@metamask/eth-sig-util@6.0.2': - dependencies: - '@ethereumjs/util': 8.1.0 - '@metamask/abi-utils': 1.2.0 - '@metamask/utils': 5.0.2 - ethereum-cryptography: 2.1.3 - ethjs-util: 0.1.6 - tweetnacl: 1.0.3 - tweetnacl-util: 0.15.1 - transitivePeerDependencies: - - supports-color - '@metamask/json-rpc-engine@7.3.3': dependencies: '@metamask/rpc-errors': 6.2.1 @@ -12657,6 +12556,14 @@ snapshots: transitivePeerDependencies: - supports-color + '@metamask/json-rpc-engine@9.0.2': + dependencies: + '@metamask/rpc-errors': 6.3.1 + '@metamask/safe-event-emitter': 3.1.1 + '@metamask/utils': 9.2.0 + transitivePeerDependencies: + - supports-color + '@metamask/json-rpc-middleware-stream@7.0.2': dependencies: '@metamask/json-rpc-engine': 8.0.2 @@ -12725,44 +12632,51 @@ snapshots: transitivePeerDependencies: - supports-color + '@metamask/rpc-errors@6.3.1': + dependencies: + '@metamask/utils': 9.2.0 + fast-safe-stringify: 2.1.1 + transitivePeerDependencies: + - supports-color + '@metamask/safe-event-emitter@2.0.0': {} '@metamask/safe-event-emitter@3.1.1': {} - '@metamask/sdk-communication-layer@0.27.0(cross-fetch@4.0.0(encoding@0.1.13))(eciesjs@0.3.18)(eventemitter2@6.4.9)(readable-stream@3.6.2)(socket.io-client@4.7.5(bufferutil@4.0.7)(utf-8-validate@6.0.3))': + '@metamask/sdk-communication-layer@0.27.0(cross-fetch@4.0.0(encoding@0.1.13))(eciesjs@0.3.18)(eventemitter2@6.4.9)(readable-stream@3.6.2)(socket.io-client@4.7.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))': dependencies: bufferutil: 4.0.8 cross-fetch: 4.0.0(encoding@0.1.13) date-fns: 2.30.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.6 eciesjs: 0.3.18 eventemitter2: 6.4.9 readable-stream: 3.6.2 - socket.io-client: 4.7.5(bufferutil@4.0.7)(utf-8-validate@6.0.3) + socket.io-client: 4.7.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) utf-8-validate: 5.0.10 uuid: 8.3.2 transitivePeerDependencies: - supports-color - '@metamask/sdk-install-modal-web@0.26.5(i18next@23.11.5)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(@types/react@18.2.21)(bufferutil@4.0.7)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1)': + '@metamask/sdk-install-modal-web@0.26.5(i18next@23.11.5)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(@types/react@18.2.21)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)': dependencies: i18next: 23.11.5 qr-code-styling: 1.6.0-rc.1 optionalDependencies: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-native: 0.74.1(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(@types/react@18.2.21)(bufferutil@4.0.7)(react@18.3.1)(utf-8-validate@6.0.3) + react-native: 0.74.1(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(@types/react@18.2.21)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10) - '@metamask/sdk@0.27.0(bufferutil@4.0.7)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(@types/react@18.2.21)(bufferutil@4.0.7)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1)(rollup@2.78.0)(utf-8-validate@6.0.3)': + '@metamask/sdk@0.27.0(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(@types/react@18.2.21)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(rollup@2.78.0)(utf-8-validate@5.0.10)': dependencies: '@metamask/onboarding': 1.0.1 '@metamask/providers': 16.1.0 - '@metamask/sdk-communication-layer': 0.27.0(cross-fetch@4.0.0(encoding@0.1.13))(eciesjs@0.3.18)(eventemitter2@6.4.9)(readable-stream@3.6.2)(socket.io-client@4.7.5(bufferutil@4.0.7)(utf-8-validate@6.0.3)) - '@metamask/sdk-install-modal-web': 0.26.5(i18next@23.11.5)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(@types/react@18.2.21)(bufferutil@4.0.7)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1) + '@metamask/sdk-communication-layer': 0.27.0(cross-fetch@4.0.0(encoding@0.1.13))(eciesjs@0.3.18)(eventemitter2@6.4.9)(readable-stream@3.6.2)(socket.io-client@4.7.5(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + '@metamask/sdk-install-modal-web': 0.26.5(i18next@23.11.5)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(@types/react@18.2.21)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) '@types/dom-screen-wake-lock': 1.0.3 bowser: 2.11.0 cross-fetch: 4.0.0(encoding@0.1.13) - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.6 eciesjs: 0.3.18 eth-rpc-errors: 4.0.3 eventemitter2: 6.4.9 @@ -12771,10 +12685,10 @@ snapshots: obj-multiplex: 1.0.0 pump: 3.0.0 qrcode-terminal-nooctal: 0.12.1 - react-native-webview: 11.26.1(react-native@0.74.1(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(@types/react@18.2.21)(bufferutil@4.0.7)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1) + react-native-webview: 11.26.1(react-native@0.74.1(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(@types/react@18.2.21)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) readable-stream: 3.6.2 rollup-plugin-visualizer: 5.12.0(rollup@2.78.0) - socket.io-client: 4.7.5(bufferutil@4.0.7)(utf-8-validate@6.0.3) + socket.io-client: 4.7.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) util: 0.12.5 uuid: 8.3.2 optionalDependencies: @@ -12788,14 +12702,7 @@ snapshots: - supports-color - utf-8-validate - '@metamask/utils@3.6.0': - dependencies: - '@types/debug': 4.1.12 - debug: 4.3.4(supports-color@8.1.1) - semver: 7.6.2 - superstruct: 1.0.4 - transitivePeerDependencies: - - supports-color + '@metamask/superstruct@3.1.0': {} '@metamask/utils@5.0.2': dependencies: @@ -12821,12 +12728,26 @@ snapshots: transitivePeerDependencies: - supports-color - '@motionone/animation@10.17.0': + '@metamask/utils@9.2.0': dependencies: - '@motionone/easing': 10.17.0 - '@motionone/types': 10.17.0 - '@motionone/utils': 10.17.0 - tslib: 2.6.2 + '@ethereumjs/tx': 4.2.0 + '@metamask/superstruct': 3.1.0 + '@noble/hashes': 1.4.0 + '@scure/base': 1.1.6 + '@types/debug': 4.1.12 + debug: 4.3.6 + pony-cause: 2.1.11 + semver: 7.6.3 + uuid: 9.0.1 + transitivePeerDependencies: + - supports-color + + '@motionone/animation@10.17.0': + dependencies: + '@motionone/easing': 10.17.0 + '@motionone/types': 10.17.0 + '@motionone/utils': 10.17.0 + tslib: 2.6.2 '@motionone/dom@10.17.0': dependencies: @@ -12889,9 +12810,9 @@ snapshots: js-sha3: 0.8.0 multiformats: 9.9.0 - '@next/bundle-analyzer@13.5.6(bufferutil@4.0.7)(utf-8-validate@6.0.3)': + '@next/bundle-analyzer@13.5.6(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: - webpack-bundle-analyzer: 4.7.0(bufferutil@4.0.7)(utf-8-validate@6.0.3) + webpack-bundle-analyzer: 4.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - utf-8-validate @@ -13053,17 +12974,17 @@ snapshots: '@openzeppelin/contracts@4.9.6': {} - '@openzeppelin/test-helpers@0.5.16(bufferutil@4.0.7)(encoding@0.1.13)(utf-8-validate@6.0.3)': + '@openzeppelin/test-helpers@0.5.16(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)': dependencies: '@openzeppelin/contract-loader': 0.6.3 - '@truffle/contract': 4.6.31(bufferutil@4.0.7)(encoding@0.1.13)(utf-8-validate@6.0.3) + '@truffle/contract': 4.6.31(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) ansi-colors: 3.2.4 chai: 4.4.1 chai-bn: 0.2.2(chai@4.4.1) ethjs-abi: 0.2.1 lodash.flatten: 4.4.0 semver: 5.7.2 - web3: 1.10.4(bufferutil@4.0.7)(encoding@0.1.13)(utf-8-validate@6.0.3) + web3: 1.10.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) web3-utils: 1.10.4 transitivePeerDependencies: - bn.js @@ -13133,6 +13054,9 @@ snapshots: '@parcel/watcher-win32-ia32': 2.4.1 '@parcel/watcher-win32-x64': 2.4.1 + '@pkgjs/parseargs@0.11.0': + optional: true + '@pkgr/core@0.1.1': {} '@playwright/test@1.44.1': @@ -13154,7 +13078,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@rainbow-me/rainbowkit@2.1.2(@tanstack/react-query@5.22.2(react@18.3.1))(@types/react@18.2.21)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.19.4(bufferutil@4.0.7)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(wagmi@2.12.4(@tanstack/query-core@5.22.2)(@tanstack/react-query@5.22.2(react@18.3.1))(@types/react@18.2.21)(bufferutil@4.0.7)(encoding@0.1.13)(immer@9.0.21)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(@types/react@18.2.21)(bufferutil@4.0.7)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1)(rollup@2.78.0)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.19.4(bufferutil@4.0.7)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8))': + '@rainbow-me/rainbowkit@2.1.2(@tanstack/react-query@5.22.2(react@18.3.1))(@types/react@18.2.21)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.19.4(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8))(wagmi@2.12.4(@tanstack/query-core@5.22.2)(@tanstack/react-query@5.22.2(react@18.3.1))(@types/react@18.2.21)(bufferutil@4.0.8)(encoding@0.1.13)(immer@9.0.21)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(@types/react@18.2.21)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(rollup@2.78.0)(typescript@5.4.5)(utf-8-validate@5.0.10)(viem@2.19.4(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8))': dependencies: '@tanstack/react-query': 5.22.2(react@18.3.1) '@vanilla-extract/css': 1.14.0 @@ -13166,8 +13090,8 @@ snapshots: react-dom: 18.3.1(react@18.3.1) react-remove-scroll: 2.5.7(@types/react@18.2.21)(react@18.3.1) ua-parser-js: 1.0.37 - viem: 2.19.4(bufferutil@4.0.7)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8) - wagmi: 2.12.4(@tanstack/query-core@5.22.2)(@tanstack/react-query@5.22.2(react@18.3.1))(@types/react@18.2.21)(bufferutil@4.0.7)(encoding@0.1.13)(immer@9.0.21)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(@types/react@18.2.21)(bufferutil@4.0.7)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1)(rollup@2.78.0)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.19.4(bufferutil@4.0.7)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8) + viem: 2.19.4(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8) + wagmi: 2.12.4(@tanstack/query-core@5.22.2)(@tanstack/react-query@5.22.2(react@18.3.1))(@types/react@18.2.21)(bufferutil@4.0.8)(encoding@0.1.13)(immer@9.0.21)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(@types/react@18.2.21)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(rollup@2.78.0)(typescript@5.4.5)(utf-8-validate@5.0.10)(viem@2.19.4(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8) transitivePeerDependencies: - '@types/react' @@ -13242,7 +13166,7 @@ snapshots: dependencies: '@react-native-community/cli-platform-apple': 13.6.6 - '@react-native-community/cli-server-api@13.6.6(bufferutil@4.0.7)(utf-8-validate@6.0.3)': + '@react-native-community/cli-server-api@13.6.6(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: '@react-native-community/cli-debugger-ui': 13.6.6 '@react-native-community/cli-tools': 13.6.6 @@ -13252,7 +13176,7 @@ snapshots: nocache: 3.0.4 pretty-format: 26.6.2 serve-static: 1.15.0 - ws: 6.2.3(bufferutil@4.0.7)(utf-8-validate@6.0.3) + ws: 6.2.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - supports-color @@ -13276,14 +13200,14 @@ snapshots: dependencies: joi: 17.13.3 - '@react-native-community/cli@13.6.6(bufferutil@4.0.7)(utf-8-validate@6.0.3)': + '@react-native-community/cli@13.6.6(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: '@react-native-community/cli-clean': 13.6.6 '@react-native-community/cli-config': 13.6.6 '@react-native-community/cli-debugger-ui': 13.6.6 '@react-native-community/cli-doctor': 13.6.6 '@react-native-community/cli-hermes': 13.6.6 - '@react-native-community/cli-server-api': 13.6.6(bufferutil@4.0.7)(utf-8-validate@6.0.3) + '@react-native-community/cli-server-api': 13.6.6(bufferutil@4.0.8)(utf-8-validate@5.0.10) '@react-native-community/cli-tools': 13.6.6 '@react-native-community/cli-types': 13.6.6 chalk: 4.1.2 @@ -13371,16 +13295,16 @@ snapshots: transitivePeerDependencies: - supports-color - '@react-native/community-cli-plugin@0.74.83(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(bufferutil@4.0.7)(utf-8-validate@6.0.3)': + '@react-native/community-cli-plugin@0.74.83(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: - '@react-native-community/cli-server-api': 13.6.6(bufferutil@4.0.7)(utf-8-validate@6.0.3) + '@react-native-community/cli-server-api': 13.6.6(bufferutil@4.0.8)(utf-8-validate@5.0.10) '@react-native-community/cli-tools': 13.6.6 - '@react-native/dev-middleware': 0.74.83(bufferutil@4.0.7)(utf-8-validate@6.0.3) + '@react-native/dev-middleware': 0.74.83(bufferutil@4.0.8)(utf-8-validate@5.0.10) '@react-native/metro-babel-transformer': 0.74.83(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6)) chalk: 4.1.2 execa: 5.1.1 - metro: 0.80.10(bufferutil@4.0.7)(utf-8-validate@6.0.3) - metro-config: 0.80.10(bufferutil@4.0.7)(utf-8-validate@6.0.3) + metro: 0.80.10(bufferutil@4.0.8)(utf-8-validate@5.0.10) + metro-config: 0.80.10(bufferutil@4.0.8)(utf-8-validate@5.0.10) metro-core: 0.80.10 node-fetch: 2.6.1 querystring: 0.2.1 @@ -13394,7 +13318,7 @@ snapshots: '@react-native/debugger-frontend@0.74.83': {} - '@react-native/dev-middleware@0.74.83(bufferutil@4.0.7)(utf-8-validate@6.0.3)': + '@react-native/dev-middleware@0.74.83(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: '@isaacs/ttlcache': 1.4.1 '@react-native/debugger-frontend': 0.74.83 @@ -13408,7 +13332,7 @@ snapshots: selfsigned: 2.4.1 serve-static: 1.15.0 temp-dir: 2.0.0 - ws: 6.2.3(bufferutil@4.0.7)(utf-8-validate@6.0.3) + ws: 6.2.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - supports-color @@ -13430,12 +13354,12 @@ snapshots: '@react-native/normalize-colors@0.74.83': {} - '@react-native/virtualized-lists@0.74.83(@types/react@18.2.21)(react-native@0.74.1(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(@types/react@18.2.21)(bufferutil@4.0.7)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1)': + '@react-native/virtualized-lists@0.74.83(@types/react@18.2.21)(react-native@0.74.1(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(@types/react@18.2.21)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)': dependencies: invariant: 2.2.4 nullthrows: 1.1.1 react: 18.3.1 - react-native: 0.74.1(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(@types/react@18.2.21)(bufferutil@4.0.7)(react@18.3.1)(utf-8-validate@6.0.3) + react-native: 0.74.1(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(@types/react@18.2.21)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10) optionalDependencies: '@types/react': 18.2.21 @@ -13519,9 +13443,9 @@ snapshots: '@rushstack/eslint-patch@1.10.3': {} - '@safe-global/safe-apps-provider@0.18.3(bufferutil@4.0.7)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8)': + '@safe-global/safe-apps-provider@0.18.3(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8)': dependencies: - '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.7)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8) + '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8) events: 3.3.0 transitivePeerDependencies: - bufferutil @@ -13529,10 +13453,10 @@ snapshots: - utf-8-validate - zod - '@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.0.7)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8)': + '@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8)': dependencies: '@safe-global/safe-gateway-typescript-sdk': 3.21.1 - viem: 2.19.4(bufferutil@4.0.7)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8) + viem: 2.19.4(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8) transitivePeerDependencies: - bufferutil - typescript @@ -13750,6 +13674,12 @@ snapshots: dependencies: '@sinonjs/commons': 3.0.1 + '@snyk/github-codeowners@1.1.0': + dependencies: + commander: 4.1.1 + ignore: 5.3.1 + p-map: 4.0.0 + '@socket.io/component-emitter@3.1.2': {} '@stablelib/aead@1.0.1': {} @@ -13970,7 +13900,7 @@ snapshots: lz-string: 1.5.0 pretty-format: 27.5.1 - '@testing-library/jest-dom@6.4.5(@types/jest@29.5.12)(vitest@1.6.0(@types/node@18.19.33)(jsdom@24.1.0(bufferutil@4.0.7)(canvas@2.11.2(encoding@0.1.13))(utf-8-validate@6.0.3))(terser@5.31.5))': + '@testing-library/jest-dom@6.4.5(@types/jest@29.5.12)(vitest@2.0.5(@types/node@18.19.33)(jsdom@24.1.0(bufferutil@4.0.8)(canvas@2.11.2(encoding@0.1.13))(utf-8-validate@5.0.10))(terser@5.31.5))': dependencies: '@adobe/css-tools': 4.3.3 '@babel/runtime': 7.24.6 @@ -13982,7 +13912,7 @@ snapshots: redent: 3.0.0 optionalDependencies: '@types/jest': 29.5.12 - vitest: 1.6.0(@types/node@18.19.33)(jsdom@24.1.0(bufferutil@4.0.7)(canvas@2.11.2(encoding@0.1.13))(utf-8-validate@6.0.3))(terser@5.31.5) + vitest: 2.0.5(@types/node@18.19.33)(jsdom@24.1.0(bufferutil@4.0.8)(canvas@2.11.2(encoding@0.1.13))(utf-8-validate@5.0.10))(terser@5.31.5) '@testing-library/react-hooks@8.0.1(@types/react@18.2.21)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: @@ -14022,7 +13952,7 @@ snapshots: big.js: 6.2.1 bn.js: 5.2.1 cbor: 5.2.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.6 lodash: 4.17.21 semver: 7.6.2 utf8: 3.0.0 @@ -14042,18 +13972,18 @@ snapshots: transitivePeerDependencies: - supports-color - '@truffle/contract@4.6.31(bufferutil@4.0.7)(encoding@0.1.13)(utf-8-validate@6.0.3)': + '@truffle/contract@4.6.31(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)': dependencies: - '@ensdomains/ensjs': 2.1.0(bufferutil@4.0.7)(utf-8-validate@6.0.3) + '@ensdomains/ensjs': 2.1.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) '@truffle/blockchain-utils': 0.1.9 '@truffle/contract-schema': 3.4.16 '@truffle/debug-utils': 6.0.57 '@truffle/error': 0.2.2 - '@truffle/interface-adapter': 0.5.37(bufferutil@4.0.7)(encoding@0.1.13)(utf-8-validate@6.0.3) + '@truffle/interface-adapter': 0.5.37(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) bignumber.js: 7.2.1 debug: 4.3.4(supports-color@8.1.1) ethers: 4.0.49 - web3: 1.10.0(bufferutil@4.0.7)(encoding@0.1.13)(utf-8-validate@6.0.3) + web3: 1.10.0(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) web3-core-helpers: 1.10.0 web3-core-promievent: 1.10.0 web3-eth-abi: 1.10.0 @@ -14077,11 +14007,11 @@ snapshots: '@truffle/error@0.2.2': {} - '@truffle/interface-adapter@0.5.37(bufferutil@4.0.7)(encoding@0.1.13)(utf-8-validate@6.0.3)': + '@truffle/interface-adapter@0.5.37(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)': dependencies: bn.js: 5.2.1 ethers: 4.0.49 - web3: 1.10.0(bufferutil@4.0.7)(encoding@0.1.13)(utf-8-validate@6.0.3) + web3: 1.10.0(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - encoding @@ -14099,13 +14029,6 @@ snapshots: strip-ansi: 4.0.0 strip-indent: 2.0.0 - '@trufflesuite/uws-js-unofficial@20.30.0-unofficial.0': - dependencies: - ws: 8.13.0(bufferutil@4.0.7)(utf-8-validate@6.0.3) - optionalDependencies: - bufferutil: 4.0.7 - utf-8-validate: 6.0.3 - '@trysound/sax@0.2.0': {} '@tsconfig/node10@1.0.11': {} @@ -14120,24 +14043,24 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.24.6 - '@babel/types': 7.24.6 + '@babel/parser': 7.25.3 + '@babel/types': 7.25.2 '@types/babel__generator': 7.6.8 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.20.6 '@types/babel__generator@7.6.8': dependencies: - '@babel/types': 7.24.6 + '@babel/types': 7.25.2 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.24.6 - '@babel/types': 7.24.6 + '@babel/parser': 7.25.3 + '@babel/types': 7.25.2 '@types/babel__traverse@7.20.6': dependencies: - '@babel/types': 7.24.6 + '@babel/types': 7.25.2 '@types/bn.js@4.11.6': dependencies: @@ -14200,6 +14123,7 @@ snapshots: dependencies: expect: 29.7.0 pretty-format: 29.7.0 + optional: true '@types/js-cookie@2.2.7': {} @@ -14253,18 +14177,18 @@ snapshots: '@types/prop-types@15.7.12': {} - '@types/puppeteer-core@5.4.0(bufferutil@4.0.7)(typescript@5.4.5)(utf-8-validate@6.0.3)': + '@types/puppeteer-core@5.4.0(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)': dependencies: - '@types/puppeteer': 7.0.4(bufferutil@4.0.7)(typescript@5.4.5)(utf-8-validate@6.0.3) + '@types/puppeteer': 7.0.4(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - supports-color - typescript - utf-8-validate - '@types/puppeteer@7.0.4(bufferutil@4.0.7)(typescript@5.4.5)(utf-8-validate@6.0.3)': + '@types/puppeteer@7.0.4(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)': dependencies: - puppeteer: 22.10.0(bufferutil@4.0.7)(typescript@5.4.5)(utf-8-validate@6.0.3) + puppeteer: 22.10.0(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - supports-color @@ -14309,8 +14233,6 @@ snapshots: dependencies: '@types/node': 18.19.44 - '@types/seedrandom@3.0.1': {} - '@types/semver@7.5.8': {} '@types/set-cookie-parser@2.4.7': @@ -14535,76 +14457,79 @@ snapshots: dependencies: '@vanilla-extract/css': 1.14.0 - '@vitejs/plugin-react@4.3.0(vite@5.2.11(@types/node@18.19.33)(terser@5.31.5))': + '@vitejs/plugin-react@4.3.1(vite@5.2.11(@types/node@18.19.33)(terser@5.31.5))': dependencies: '@babel/core': 7.24.6 - '@babel/plugin-transform-react-jsx-self': 7.24.6(@babel/core@7.24.6) - '@babel/plugin-transform-react-jsx-source': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-react-jsx-self': 7.24.7(@babel/core@7.24.6) + '@babel/plugin-transform-react-jsx-source': 7.24.7(@babel/core@7.24.6) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 vite: 5.2.11(@types/node@18.19.33)(terser@5.31.5) transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@1.6.0(vitest@1.6.0(@types/node@18.19.33)(jsdom@24.1.0(bufferutil@4.0.7)(canvas@2.11.2(encoding@0.1.13))(utf-8-validate@6.0.3))(terser@5.31.5))': + '@vitest/coverage-v8@2.0.5(vitest@2.0.5(@types/node@18.19.33)(jsdom@24.1.0(bufferutil@4.0.8)(canvas@2.11.2(encoding@0.1.13))(utf-8-validate@5.0.10))(terser@5.31.5))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 0.2.3 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.6 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 5.0.4 + istanbul-lib-source-maps: 5.0.6 istanbul-reports: 3.1.7 magic-string: 0.30.10 magicast: 0.3.4 - picocolors: 1.0.1 std-env: 3.7.0 - strip-literal: 2.1.0 - test-exclude: 6.0.0 - vitest: 1.6.0(@types/node@18.19.33)(jsdom@24.1.0(bufferutil@4.0.7)(canvas@2.11.2(encoding@0.1.13))(utf-8-validate@6.0.3))(terser@5.31.5) + test-exclude: 7.0.1 + tinyrainbow: 1.2.0 + vitest: 2.0.5(@types/node@18.19.33)(jsdom@24.1.0(bufferutil@4.0.8)(canvas@2.11.2(encoding@0.1.13))(utf-8-validate@5.0.10))(terser@5.31.5) transitivePeerDependencies: - supports-color - '@vitest/expect@1.6.0': + '@vitest/expect@2.0.5': dependencies: - '@vitest/spy': 1.6.0 - '@vitest/utils': 1.6.0 - chai: 4.4.1 + '@vitest/spy': 2.0.5 + '@vitest/utils': 2.0.5 + chai: 5.1.1 + tinyrainbow: 1.2.0 + + '@vitest/pretty-format@2.0.5': + dependencies: + tinyrainbow: 1.2.0 - '@vitest/runner@1.6.0': + '@vitest/runner@2.0.5': dependencies: - '@vitest/utils': 1.6.0 - p-limit: 5.0.0 + '@vitest/utils': 2.0.5 pathe: 1.1.2 - '@vitest/snapshot@1.6.0': + '@vitest/snapshot@2.0.5': dependencies: + '@vitest/pretty-format': 2.0.5 magic-string: 0.30.10 pathe: 1.1.2 - pretty-format: 29.7.0 - '@vitest/spy@1.6.0': + '@vitest/spy@2.0.5': dependencies: - tinyspy: 2.2.1 + tinyspy: 3.0.0 - '@vitest/utils@1.6.0': + '@vitest/utils@2.0.5': dependencies: - diff-sequences: 29.6.3 + '@vitest/pretty-format': 2.0.5 estree-walker: 3.0.3 - loupe: 2.3.7 - pretty-format: 29.7.0 + loupe: 3.1.1 + tinyrainbow: 1.2.0 - '@wagmi/connectors@5.1.4(@types/react@18.2.21)(@wagmi/core@2.13.3(@tanstack/query-core@5.22.2)(@types/react@18.2.21)(immer@9.0.21)(react@18.3.1)(typescript@5.4.5)(viem@2.19.4(bufferutil@4.0.7)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8)))(bufferutil@4.0.7)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(@types/react@18.2.21)(bufferutil@4.0.7)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1)(rollup@2.78.0)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.19.4(bufferutil@4.0.7)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8)': + '@wagmi/connectors@5.1.4(@types/react@18.2.21)(@wagmi/core@2.13.3(@tanstack/query-core@5.22.2)(@types/react@18.2.21)(immer@9.0.21)(react@18.3.1)(typescript@5.4.5)(viem@2.19.4(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8)))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(@types/react@18.2.21)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(rollup@2.78.0)(typescript@5.4.5)(utf-8-validate@5.0.10)(viem@2.19.4(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8)': dependencies: '@coinbase/wallet-sdk': 4.0.4 - '@metamask/sdk': 0.27.0(bufferutil@4.0.7)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(@types/react@18.2.21)(bufferutil@4.0.7)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1)(rollup@2.78.0)(utf-8-validate@6.0.3) - '@safe-global/safe-apps-provider': 0.18.3(bufferutil@4.0.7)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8) - '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.7)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8) - '@wagmi/core': 2.13.3(@tanstack/query-core@5.22.2)(@types/react@18.2.21)(immer@9.0.21)(react@18.3.1)(typescript@5.4.5)(viem@2.19.4(bufferutil@4.0.7)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8)) - '@walletconnect/ethereum-provider': 2.11.1(@types/react@18.2.21)(bufferutil@4.0.7)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3) + '@metamask/sdk': 0.27.0(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(@types/react@18.2.21)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(rollup@2.78.0)(utf-8-validate@5.0.10) + '@safe-global/safe-apps-provider': 0.18.3(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8) + '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8) + '@wagmi/core': 2.13.3(@tanstack/query-core@5.22.2)(@types/react@18.2.21)(immer@9.0.21)(react@18.3.1)(typescript@5.4.5)(viem@2.19.4(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8)) + '@walletconnect/ethereum-provider': 2.11.1(@types/react@18.2.21)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@5.0.10) '@walletconnect/modal': 2.6.2(@types/react@18.2.21)(react@18.3.1) cbw-sdk: '@coinbase/wallet-sdk@3.9.3' - viem: 2.19.4(bufferutil@4.0.7)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8) + viem: 2.19.4(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8) optionalDependencies: typescript: 5.4.5 transitivePeerDependencies: @@ -14633,11 +14558,11 @@ snapshots: - utf-8-validate - zod - '@wagmi/core@2.13.3(@tanstack/query-core@5.22.2)(@types/react@18.2.21)(immer@9.0.21)(react@18.3.1)(typescript@5.4.5)(viem@2.19.4(bufferutil@4.0.7)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))': + '@wagmi/core@2.13.3(@tanstack/query-core@5.22.2)(@types/react@18.2.21)(immer@9.0.21)(react@18.3.1)(typescript@5.4.5)(viem@2.19.4(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8))': dependencies: eventemitter3: 5.0.1 mipd: 0.0.7(typescript@5.4.5) - viem: 2.19.4(bufferutil@4.0.7)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8) + viem: 2.19.4(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8) zustand: 4.4.1(@types/react@18.2.21)(immer@9.0.21)(react@18.3.1) optionalDependencies: '@tanstack/query-core': 5.22.2 @@ -14647,13 +14572,13 @@ snapshots: - immer - react - '@walletconnect/core@2.11.1(bufferutil@4.0.7)(utf-8-validate@6.0.3)': + '@walletconnect/core@2.11.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: '@walletconnect/heartbeat': 1.2.1 '@walletconnect/jsonrpc-provider': 1.0.13 '@walletconnect/jsonrpc-types': 1.0.3 '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/jsonrpc-ws-connection': 1.0.14(bufferutil@4.0.7)(utf-8-validate@6.0.3) + '@walletconnect/jsonrpc-ws-connection': 1.0.14(bufferutil@4.0.8)(utf-8-validate@5.0.10) '@walletconnect/keyvaluestorage': 1.1.1 '@walletconnect/logger': 2.1.2 '@walletconnect/relay-api': 1.0.10 @@ -14688,16 +14613,16 @@ snapshots: dependencies: tslib: 1.14.1 - '@walletconnect/ethereum-provider@2.11.1(@types/react@18.2.21)(bufferutil@4.0.7)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3)': + '@walletconnect/ethereum-provider@2.11.1(@types/react@18.2.21)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@5.0.10)': dependencies: '@walletconnect/jsonrpc-http-connection': 1.0.8(encoding@0.1.13) '@walletconnect/jsonrpc-provider': 1.0.14 '@walletconnect/jsonrpc-types': 1.0.4 '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/modal': 2.6.2(@types/react@18.2.21)(react@18.3.1) - '@walletconnect/sign-client': 2.11.1(bufferutil@4.0.7)(utf-8-validate@6.0.3) + '@walletconnect/sign-client': 2.11.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) '@walletconnect/types': 2.11.1 - '@walletconnect/universal-provider': 2.11.1(bufferutil@4.0.7)(encoding@0.1.13)(utf-8-validate@6.0.3) + '@walletconnect/universal-provider': 2.11.1(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) '@walletconnect/utils': 2.11.1 events: 3.3.0 transitivePeerDependencies: @@ -14769,12 +14694,12 @@ snapshots: '@walletconnect/jsonrpc-types': 1.0.4 tslib: 1.14.1 - '@walletconnect/jsonrpc-ws-connection@1.0.14(bufferutil@4.0.7)(utf-8-validate@6.0.3)': + '@walletconnect/jsonrpc-ws-connection@1.0.14(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/safe-json': 1.0.2 events: 3.3.0 - ws: 7.5.10(bufferutil@4.0.7)(utf-8-validate@6.0.3) + ws: 7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - utf-8-validate @@ -14846,9 +14771,9 @@ snapshots: dependencies: tslib: 1.14.1 - '@walletconnect/sign-client@2.11.1(bufferutil@4.0.7)(utf-8-validate@6.0.3)': + '@walletconnect/sign-client@2.11.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: - '@walletconnect/core': 2.11.1(bufferutil@4.0.7)(utf-8-validate@6.0.3) + '@walletconnect/core': 2.11.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) '@walletconnect/events': 1.0.1 '@walletconnect/heartbeat': 1.2.1 '@walletconnect/jsonrpc-utils': 1.0.8 @@ -14903,14 +14828,14 @@ snapshots: - ioredis - uWebSockets.js - '@walletconnect/universal-provider@2.11.1(bufferutil@4.0.7)(encoding@0.1.13)(utf-8-validate@6.0.3)': + '@walletconnect/universal-provider@2.11.1(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)': dependencies: '@walletconnect/jsonrpc-http-connection': 1.0.8(encoding@0.1.13) '@walletconnect/jsonrpc-provider': 1.0.13 '@walletconnect/jsonrpc-types': 1.0.4 '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/logger': 2.1.2 - '@walletconnect/sign-client': 2.11.1(bufferutil@4.0.7)(utf-8-validate@6.0.3) + '@walletconnect/sign-client': 2.11.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) '@walletconnect/types': 2.11.1 '@walletconnect/utils': 2.11.1 events: 3.3.0 @@ -15074,25 +14999,6 @@ snapshots: abortcontroller-polyfill@1.7.5: {} - abstract-level@1.0.3: - dependencies: - buffer: 6.0.3 - catering: 2.1.1 - is-buffer: 2.0.5 - level-supports: 4.0.1 - level-transcoder: 1.0.1 - module-error: 1.0.2 - queue-microtask: 1.2.3 - - abstract-leveldown@7.2.0: - dependencies: - buffer: 6.0.3 - catering: 2.1.1 - is-buffer: 2.0.5 - level-concat-iterator: 3.1.0 - level-supports: 2.1.0 - queue-microtask: 1.2.3 - accepts@1.3.8: dependencies: mime-types: 2.1.35 @@ -15118,7 +15024,7 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.6 transitivePeerDependencies: - supports-color @@ -15190,6 +15096,8 @@ snapshots: ansi-regex@5.0.1: {} + ansi-regex@6.0.1: {} + ansi-styles@3.2.1: dependencies: color-convert: 1.9.3 @@ -15200,6 +15108,8 @@ snapshots: ansi-styles@5.2.0: {} + ansi-styles@6.2.1: {} + anymatch@3.1.3: dependencies: normalize-path: 3.0.0 @@ -15324,6 +15234,8 @@ snapshots: assertion-error@1.1.0: {} + assertion-error@2.0.1: {} + ast-types-flow@0.0.8: {} ast-types@0.13.4: @@ -15338,20 +15250,12 @@ snapshots: astral-regex@2.0.0: {} - async-eventemitter@0.2.4: - dependencies: - async: 2.6.4 - async-limiter@1.0.1: {} async-mutex@0.2.6: dependencies: tslib: 2.6.3 - async@2.6.4: - dependencies: - lodash: 4.17.21 - asynckit@0.4.0: {} atomic-sleep@1.0.0: {} @@ -15617,16 +15521,6 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 - bufferutil@4.0.5: - dependencies: - node-gyp-build: 4.8.1 - optional: true - - bufferutil@4.0.7: - dependencies: - node-gyp-build: 4.8.1 - optional: true - bufferutil@4.0.8: dependencies: node-gyp-build: 4.8.1 @@ -15716,15 +15610,13 @@ snapshots: capnp-ts@0.7.0: dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.6 tslib: 2.6.2 transitivePeerDependencies: - supports-color caseless@0.12.0: {} - catering@2.1.1: {} - cbor@5.2.0: dependencies: bignumber.js: 9.1.2 @@ -15748,6 +15640,14 @@ snapshots: pathval: 1.1.1 type-detect: 4.0.8 + chai@5.1.1: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.1.1 + pathval: 2.0.0 + chalk@2.4.2: dependencies: ansi-styles: 3.2.1 @@ -15791,6 +15691,8 @@ snapshots: dependencies: get-func-name: 2.0.2 + check-error@2.1.1: {} + cheerio-select@2.1.0: dependencies: boolbase: 1.0.0 @@ -15963,8 +15865,6 @@ snapshots: colorette@1.4.0: {} - colorette@2.0.20: {} - colors@1.4.0: {} combined-stream@1.0.8: @@ -15977,6 +15877,8 @@ snapshots: commander@3.0.2: {} + commander@4.1.1: {} + commander@7.2.0: {} commander@9.5.0: {} @@ -16240,8 +16142,6 @@ snapshots: data-uri-to-buffer@2.0.2: {} - data-uri-to-buffer@4.0.1: {} - data-uri-to-buffer@6.0.2: {} data-urls@5.0.0: @@ -16269,9 +16169,7 @@ snapshots: date-fns@2.30.0: dependencies: - '@babel/runtime': 7.24.6 - - dateformat@4.6.3: {} + '@babel/runtime': 7.25.0 dayjs@1.11.11: {} @@ -16330,6 +16228,8 @@ snapshots: dependencies: type-detect: 4.0.8 + deep-eql@5.0.2: {} + deep-equal@2.2.3: dependencies: array-buffer-byte-length: 1.0.1 @@ -16413,7 +16313,8 @@ snapshots: devtools-protocol@0.0.1286932: {} - diff-sequences@29.6.3: {} + diff-sequences@29.6.3: + optional: true diff@4.0.2: {} @@ -16485,6 +16386,14 @@ snapshots: readable-stream: 3.6.2 stream-shift: 1.0.3 + eastasianwidth@0.2.0: {} + + easy-table@1.2.0: + dependencies: + ansi-regex: 5.0.1 + optionalDependencies: + wcwidth: 1.0.1 + ecc-jsbn@0.1.2: dependencies: jsbn: 0.1.1 @@ -16522,8 +16431,6 @@ snapshots: minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 - emittery@0.10.0: {} - emmet@2.4.7: dependencies: '@emmetio/abbreviation': 2.3.3 @@ -16540,17 +16447,18 @@ snapshots: encoding@0.1.13: dependencies: iconv-lite: 0.6.3 + optional: true end-of-stream@1.4.4: dependencies: once: 1.4.0 - engine.io-client@6.5.3(bufferutil@4.0.7)(utf-8-validate@6.0.3): + engine.io-client@6.5.3(bufferutil@4.0.8)(utf-8-validate@5.0.10): dependencies: '@socket.io/component-emitter': 3.1.2 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.6 engine.io-parser: 5.2.2 - ws: 8.11.0(bufferutil@4.0.7)(utf-8-validate@6.0.3) + ws: 8.11.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) xmlhttprequest-ssl: 2.0.0 transitivePeerDependencies: - bufferutil @@ -16969,13 +16877,13 @@ snapshots: - supports-color - typescript - eslint-plugin-vitest@0.4.1(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.50.0)(typescript@5.4.5))(eslint@8.50.0)(typescript@5.4.5))(eslint@8.50.0)(typescript@5.4.5)(vitest@1.6.0(@types/node@18.19.33)(jsdom@24.1.0(bufferutil@4.0.7)(canvas@2.11.2(encoding@0.1.13))(utf-8-validate@6.0.3))(terser@5.31.5)): + eslint-plugin-vitest@0.4.1(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.50.0)(typescript@5.4.5))(eslint@8.50.0)(typescript@5.4.5))(eslint@8.50.0)(typescript@5.4.5)(vitest@2.0.5(@types/node@18.19.33)(jsdom@24.1.0(bufferutil@4.0.8)(canvas@2.11.2(encoding@0.1.13))(utf-8-validate@5.0.10))(terser@5.31.5)): dependencies: '@typescript-eslint/utils': 7.10.0(eslint@8.50.0)(typescript@5.4.5) eslint: 8.50.0 optionalDependencies: '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.50.0)(typescript@5.4.5))(eslint@8.50.0)(typescript@5.4.5) - vitest: 1.6.0(@types/node@18.19.33)(jsdom@24.1.0(bufferutil@4.0.7)(canvas@2.11.2(encoding@0.1.13))(utf-8-validate@6.0.3))(terser@5.31.5) + vitest: 2.0.5(@types/node@18.19.33)(jsdom@24.1.0(bufferutil@4.0.8)(canvas@2.11.2(encoding@0.1.13))(utf-8-validate@5.0.10))(terser@5.31.5) transitivePeerDependencies: - supports-color - typescript @@ -17096,13 +17004,13 @@ snapshots: json-rpc-engine: 6.1.0 pify: 5.0.0 - eth-lib@0.1.29(bufferutil@4.0.7)(utf-8-validate@6.0.3): + eth-lib@0.1.29(bufferutil@4.0.8)(utf-8-validate@5.0.10): dependencies: bn.js: 5.2.1 elliptic: 6.5.5 nano-json-stream-parser: 0.1.2 servify: 0.1.12 - ws: 3.3.3(bufferutil@4.0.7)(utf-8-validate@6.0.3) + ws: 3.3.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) xhr-request-promise: 0.1.3 transitivePeerDependencies: - bufferutil @@ -17195,7 +17103,7 @@ snapshots: uuid: 2.0.1 xmlhttprequest: 1.8.0 - ethers@5.7.2(bufferutil@4.0.7)(utf-8-validate@6.0.3): + ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10): dependencies: '@ethersproject/abi': 5.7.0 '@ethersproject/abstract-provider': 5.7.0 @@ -17215,7 +17123,7 @@ snapshots: '@ethersproject/networks': 5.7.1 '@ethersproject/pbkdf2': 5.7.0 '@ethersproject/properties': 5.7.0 - '@ethersproject/providers': 5.7.2(bufferutil@4.0.7)(utf-8-validate@6.0.3) + '@ethersproject/providers': 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) '@ethersproject/random': 5.7.0 '@ethersproject/rlp': 5.7.0 '@ethersproject/sha2': 5.7.0 @@ -17300,6 +17208,7 @@ snapshots: jest-matcher-utils: 29.7.0 jest-message-util: 29.7.0 jest-util: 29.7.0 + optional: true exponential-backoff@3.1.1: {} @@ -17360,7 +17269,7 @@ snapshots: extract-zip@2.0.1: dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.6 get-stream: 5.2.0 yauzl: 2.10.0 optionalDependencies: @@ -17374,8 +17283,6 @@ snapshots: dependencies: pure-rand: 5.0.5 - fast-copy@3.0.2: {} - fast-deep-equal@3.1.3: {} fast-diff@1.3.0: {} @@ -17424,11 +17331,6 @@ snapshots: dependencies: pend: 1.2.0 - fetch-blob@3.2.0: - dependencies: - node-domexception: 1.0.0 - web-streams-polyfill: 3.3.3 - figures@3.2.0: dependencies: escape-string-regexp: 1.0.5 @@ -17524,6 +17426,11 @@ snapshots: dependencies: is-callable: 1.2.7 + foreground-child@3.3.0: + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + forever-agent@0.6.1: {} form-data-encoder@1.7.1: {} @@ -17546,10 +17453,6 @@ snapshots: combined-stream: 1.0.8 mime-types: 2.1.35 - formdata-polyfill@4.0.10: - dependencies: - fetch-blob: 3.2.0 - forwarded@0.2.0: {} fp-ts@1.19.3: {} @@ -17625,20 +17528,6 @@ snapshots: futoin-hkdf@1.5.3: {} - ganache@7.9.2: - dependencies: - '@trufflesuite/uws-js-unofficial': 20.30.0-unofficial.0 - '@types/bn.js': 5.1.5 - '@types/lru-cache': 5.1.1 - '@types/seedrandom': 3.0.1 - abstract-level: 1.0.3 - abstract-leveldown: 7.2.0 - async-eventemitter: 0.2.4 - emittery: 0.10.0 - optionalDependencies: - bufferutil: 4.0.5 - utf-8-validate: 5.0.7 - gauge@3.0.2: dependencies: aproba: 2.0.0 @@ -17698,7 +17587,7 @@ snapshots: dependencies: basic-ftp: 5.0.5 data-uri-to-buffer: 6.0.2 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.6 fs-extra: 11.2.0 transitivePeerDependencies: - supports-color @@ -17717,6 +17606,15 @@ snapshots: glob-to-regexp@0.4.1: {} + glob@10.4.5: + dependencies: + foreground-child: 3.3.0 + jackspeak: 3.4.3 + minimatch: 9.0.4 + minipass: 7.1.2 + package-json-from-dist: 1.0.0 + path-scurry: 1.11.1 + glob@7.1.7: dependencies: fs.realpath: 1.0.0 @@ -17875,16 +17773,16 @@ snapshots: hard-rejection@2.1.0: {} - hardhat-dependency-compiler@1.1.4(hardhat@2.22.4(bufferutil@4.0.7)(ts-node@10.9.2(@types/node@18.19.33)(typescript@5.4.5))(typescript@5.4.5)(utf-8-validate@6.0.3)): + hardhat-dependency-compiler@1.1.4(hardhat@2.22.4(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@18.19.33)(typescript@5.4.5))(typescript@5.4.5)(utf-8-validate@5.0.10)): dependencies: - hardhat: 2.22.4(bufferutil@4.0.7)(ts-node@10.9.2(@types/node@18.19.33)(typescript@5.4.5))(typescript@5.4.5)(utf-8-validate@6.0.3) + hardhat: 2.22.4(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@18.19.33)(typescript@5.4.5))(typescript@5.4.5)(utf-8-validate@5.0.10) - hardhat-deploy-ethers@0.3.0-beta.13(ethers@5.7.2(bufferutil@4.0.7)(utf-8-validate@6.0.3))(hardhat@2.22.4(bufferutil@4.0.7)(ts-node@10.9.2(@types/node@18.19.33)(typescript@5.4.5))(typescript@5.4.5)(utf-8-validate@6.0.3)): + hardhat-deploy-ethers@0.3.0-beta.13(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.4(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@18.19.33)(typescript@5.4.5))(typescript@5.4.5)(utf-8-validate@5.0.10)): dependencies: - ethers: 5.7.2(bufferutil@4.0.7)(utf-8-validate@6.0.3) - hardhat: 2.22.4(bufferutil@4.0.7)(ts-node@10.9.2(@types/node@18.19.33)(typescript@5.4.5))(typescript@5.4.5)(utf-8-validate@6.0.3) + ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + hardhat: 2.22.4(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@18.19.33)(typescript@5.4.5))(typescript@5.4.5)(utf-8-validate@5.0.10) - hardhat-deploy@0.11.45(bufferutil@4.0.7)(utf-8-validate@6.0.3): + hardhat-deploy@0.11.45(bufferutil@4.0.8)(utf-8-validate@5.0.10): dependencies: '@ethersproject/abi': 5.7.0 '@ethersproject/abstract-signer': 5.7.0 @@ -17893,7 +17791,7 @@ snapshots: '@ethersproject/bytes': 5.7.0 '@ethersproject/constants': 5.7.0 '@ethersproject/contracts': 5.7.0 - '@ethersproject/providers': 5.7.2(bufferutil@4.0.7)(utf-8-validate@6.0.3) + '@ethersproject/providers': 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) '@ethersproject/solidity': 5.7.0 '@ethersproject/transactions': 5.7.0 '@ethersproject/wallet': 5.7.0 @@ -17903,19 +17801,19 @@ snapshots: chokidar: 3.6.0 debug: 4.3.4(supports-color@8.1.1) enquirer: 2.4.1 - ethers: 5.7.2(bufferutil@4.0.7)(utf-8-validate@6.0.3) + ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) form-data: 4.0.0 fs-extra: 10.1.0 match-all: 1.2.6 murmur-128: 0.2.1 qs: 6.12.1 - zksync-web3: 0.14.4(ethers@5.7.2(bufferutil@4.0.7)(utf-8-validate@6.0.3)) + zksync-web3: 0.14.4(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10)) transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - hardhat@2.22.4(bufferutil@4.0.7)(ts-node@10.9.2(@types/node@18.19.33)(typescript@5.4.5))(typescript@5.4.5)(utf-8-validate@6.0.3): + hardhat@2.22.4(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@18.19.33)(typescript@5.4.5))(typescript@5.4.5)(utf-8-validate@5.0.10): dependencies: '@ethersproject/abi': 5.7.0 '@metamask/eth-sig-util': 4.0.1 @@ -17959,7 +17857,7 @@ snapshots: tsort: 0.0.1 undici: 5.28.4 uuid: 8.3.2 - ws: 7.5.9(bufferutil@4.0.7)(utf-8-validate@6.0.3) + ws: 7.5.9(bufferutil@4.0.8)(utf-8-validate@5.0.10) optionalDependencies: ts-node: 10.9.2(@types/node@18.19.33)(typescript@5.4.5) typescript: 5.4.5 @@ -18020,18 +17918,6 @@ snapshots: headers-polyfill@3.2.5: {} - headless-web3-provider@0.2.3(bufferutil@4.0.7)(utf-8-validate@6.0.3): - dependencies: - '@metamask/eth-sig-util': 6.0.2 - ethers: 5.7.2(bufferutil@4.0.7)(utf-8-validate@6.0.3) - rxjs: 7.8.1 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - help-me@5.0.0: {} - hermes-estree@0.19.1: {} hermes-estree@0.23.0: {} @@ -18312,8 +18198,6 @@ snapshots: call-bind: 1.0.7 has-tostringtag: 1.0.2 - is-buffer@2.0.5: {} - is-callable@1.2.7: {} is-core-module@2.13.1: @@ -18477,17 +18361,13 @@ snapshots: node-fetch: 2.6.1 unfetch: 4.2.0 - isows@1.0.4(ws@8.17.0(bufferutil@4.0.7)(utf-8-validate@6.0.3)): + isows@1.0.4(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)): dependencies: - ws: 8.17.0(bufferutil@4.0.7)(utf-8-validate@6.0.3) + ws: 8.17.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - isows@1.0.4(ws@8.17.1(bufferutil@4.0.7)(utf-8-validate@6.0.3)): + isows@1.0.4(ws@8.17.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)): dependencies: - ws: 8.17.1(bufferutil@4.0.7)(utf-8-validate@6.0.3) - - isows@1.0.4(ws@8.17.1(bufferutil@4.0.8)(utf-8-validate@6.0.3)): - dependencies: - ws: 8.17.1(bufferutil@4.0.8)(utf-8-validate@6.0.3) + ws: 8.17.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) isstream@0.1.2: {} @@ -18499,10 +18379,10 @@ snapshots: make-dir: 4.0.0 supports-color: 7.2.0 - istanbul-lib-source-maps@5.0.4: + istanbul-lib-source-maps@5.0.6: dependencies: '@jridgewell/trace-mapping': 0.3.25 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.6 istanbul-lib-coverage: 3.2.2 transitivePeerDependencies: - supports-color @@ -18520,9 +18400,11 @@ snapshots: reflect.getprototypeof: 1.0.6 set-function-name: 2.0.2 - jest-babel@1.0.1(babel-core@7.0.0-bridge.0(@babel/core@7.24.6)): + jackspeak@3.4.3: dependencies: - babel-core: 7.0.0-bridge.0(@babel/core@7.24.6) + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 jest-canvas-mock@2.5.2: dependencies: @@ -18535,6 +18417,7 @@ snapshots: diff-sequences: 29.6.3 jest-get-type: 29.6.3 pretty-format: 29.7.0 + optional: true jest-environment-node@29.7.0: dependencies: @@ -18553,10 +18436,11 @@ snapshots: jest-diff: 29.7.0 jest-get-type: 29.6.3 pretty-format: 29.7.0 + optional: true jest-message-util@29.7.0: dependencies: - '@babel/code-frame': 7.24.6 + '@babel/code-frame': 7.24.7 '@jest/types': 29.6.3 '@types/stack-utils': 2.0.3 chalk: 4.1.2 @@ -18575,7 +18459,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 18.19.33 + '@types/node': 18.19.44 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -18611,6 +18495,8 @@ snapshots: jiti@1.21.0: {} + jiti@1.21.6: {} + joi@17.13.3: dependencies: '@hapi/hoek': 9.3.0 @@ -18619,8 +18505,6 @@ snapshots: '@sideway/formula': 3.0.1 '@sideway/pinpoint': 2.0.0 - joycon@3.1.1: {} - js-cookie@2.2.1: {} js-levenshtein@1.1.6: {} @@ -18633,8 +18517,6 @@ snapshots: js-tokens@4.0.0: {} - js-tokens@9.0.0: {} - js-yaml@3.14.1: dependencies: argparse: 1.0.10 @@ -18677,7 +18559,7 @@ snapshots: transitivePeerDependencies: - supports-color - jsdom@24.1.0(bufferutil@4.0.7)(canvas@2.11.2(encoding@0.1.13))(utf-8-validate@6.0.3): + jsdom@24.1.0(bufferutil@4.0.8)(canvas@2.11.2(encoding@0.1.13))(utf-8-validate@5.0.10): dependencies: cssstyle: 4.0.1 data-urls: 5.0.0 @@ -18698,7 +18580,7 @@ snapshots: whatwg-encoding: 3.1.1 whatwg-mimetype: 4.0.0 whatwg-url: 14.0.0 - ws: 8.17.0(bufferutil@4.0.7)(utf-8-validate@6.0.3) + ws: 8.17.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) xml-name-validator: 5.0.0 optionalDependencies: canvas: 2.11.2(encoding@0.1.13) @@ -18799,6 +18681,27 @@ snapshots: kleur@3.0.3: {} + knip@5.27.4(@types/node@18.19.33)(typescript@5.4.5): + dependencies: + '@nodelib/fs.walk': 1.2.8 + '@snyk/github-codeowners': 1.1.0 + '@types/node': 18.19.33 + easy-table: 1.2.0 + enhanced-resolve: 5.17.1 + fast-glob: 3.3.2 + jiti: 1.21.6 + js-yaml: 4.1.0 + minimist: 1.2.8 + picocolors: 1.0.1 + picomatch: 4.0.2 + pretty-ms: 9.1.0 + smol-toml: 1.3.0 + strip-json-comments: 5.0.1 + summary: 2.1.0 + typescript: 5.4.5 + zod: 3.23.8 + zod-validation-error: 3.3.1(zod@3.23.8) + known-css-properties@0.25.0: {} language-subtag-registry@0.3.23: {} @@ -18811,19 +18714,6 @@ snapshots: dependencies: invert-kv: 1.0.0 - level-concat-iterator@3.1.0: - dependencies: - catering: 2.1.1 - - level-supports@2.1.0: {} - - level-supports@4.0.1: {} - - level-transcoder@1.0.1: - dependencies: - buffer: 6.0.3 - module-error: 1.0.2 - leven@3.1.0: {} levn@0.4.1: @@ -18893,11 +18783,6 @@ snapshots: loader-runner@4.3.0: {} - local-pkg@0.5.0: - dependencies: - mlly: 1.7.0 - pkg-types: 1.1.1 - localforage@1.10.0: dependencies: lie: 3.1.1 @@ -18957,6 +18842,10 @@ snapshots: dependencies: get-func-name: 2.0.2 + loupe@3.1.1: + dependencies: + get-func-name: 2.0.2 + lower-case-first@1.0.2: dependencies: lower-case: 1.1.4 @@ -19008,8 +18897,8 @@ snapshots: magicast@0.3.4: dependencies: - '@babel/parser': 7.24.6 - '@babel/types': 7.24.6 + '@babel/parser': 7.25.3 + '@babel/types': 7.25.2 source-map-js: 1.2.0 make-dir@2.1.0: @@ -19023,7 +18912,7 @@ snapshots: make-dir@4.0.0: dependencies: - semver: 7.6.2 + semver: 7.6.3 make-error@1.3.6: {} @@ -19111,13 +19000,13 @@ snapshots: flow-enums-runtime: 0.0.6 metro-core: 0.80.10 - metro-config@0.80.10(bufferutil@4.0.7)(utf-8-validate@6.0.3): + metro-config@0.80.10(bufferutil@4.0.8)(utf-8-validate@5.0.10): dependencies: connect: 3.7.0 cosmiconfig: 5.2.1 flow-enums-runtime: 0.0.6 jest-validate: 29.7.0 - metro: 0.80.10(bufferutil@4.0.7)(utf-8-validate@6.0.3) + metro: 0.80.10(bufferutil@4.0.8)(utf-8-validate@5.0.10) metro-cache: 0.80.10 metro-core: 0.80.10 metro-runtime: 0.80.10 @@ -19201,14 +19090,14 @@ snapshots: transitivePeerDependencies: - supports-color - metro-transform-worker@0.80.10(bufferutil@4.0.7)(utf-8-validate@6.0.3): + metro-transform-worker@0.80.10(bufferutil@4.0.8)(utf-8-validate@5.0.10): dependencies: '@babel/core': 7.24.6 '@babel/generator': 7.25.0 '@babel/parser': 7.25.3 '@babel/types': 7.25.2 flow-enums-runtime: 0.0.6 - metro: 0.80.10(bufferutil@4.0.7)(utf-8-validate@6.0.3) + metro: 0.80.10(bufferutil@4.0.8)(utf-8-validate@5.0.10) metro-babel-transformer: 0.80.10 metro-cache: 0.80.10 metro-cache-key: 0.80.10 @@ -19221,7 +19110,7 @@ snapshots: - supports-color - utf-8-validate - metro@0.80.10(bufferutil@4.0.7)(utf-8-validate@6.0.3): + metro@0.80.10(bufferutil@4.0.8)(utf-8-validate@5.0.10): dependencies: '@babel/code-frame': 7.24.7 '@babel/core': 7.24.6 @@ -19248,7 +19137,7 @@ snapshots: metro-babel-transformer: 0.80.10 metro-cache: 0.80.10 metro-cache-key: 0.80.10 - metro-config: 0.80.10(bufferutil@4.0.7)(utf-8-validate@6.0.3) + metro-config: 0.80.10(bufferutil@4.0.8)(utf-8-validate@5.0.10) metro-core: 0.80.10 metro-file-map: 0.80.10 metro-resolver: 0.80.10 @@ -19256,7 +19145,7 @@ snapshots: metro-source-map: 0.80.10 metro-symbolicate: 0.80.10 metro-transform-plugins: 0.80.10 - metro-transform-worker: 0.80.10(bufferutil@4.0.7)(utf-8-validate@6.0.3) + metro-transform-worker: 0.80.10(bufferutil@4.0.8)(utf-8-validate@5.0.10) mime-types: 2.1.35 node-fetch: 2.6.1 nullthrows: 1.1.1 @@ -19264,7 +19153,7 @@ snapshots: source-map: 0.5.7 strip-ansi: 6.0.1 throat: 5.0.0 - ws: 7.5.10(bufferutil@4.0.7)(utf-8-validate@6.0.3) + ws: 7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10) yargs: 17.7.2 transitivePeerDependencies: - bufferutil @@ -19308,7 +19197,7 @@ snapshots: min-indent@1.0.1: {} - miniflare@3.20240512.0(bufferutil@4.0.7)(utf-8-validate@6.0.3): + miniflare@3.20240512.0(bufferutil@4.0.8)(utf-8-validate@5.0.10): dependencies: '@cspotcode/source-map-support': 0.8.1 acorn: 8.11.3 @@ -19319,7 +19208,7 @@ snapshots: stoppable: 1.1.0 undici: 5.28.4 workerd: 1.20240512.0 - ws: 8.17.1(bufferutil@4.0.7)(utf-8-validate@6.0.3) + ws: 8.17.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) youch: 3.3.3 zod: 3.23.8 transitivePeerDependencies: @@ -19370,6 +19259,8 @@ snapshots: minipass@5.0.0: {} + minipass@7.1.2: {} + minizlib@1.3.3: dependencies: minipass: 2.9.0 @@ -19437,8 +19328,6 @@ snapshots: modern-ahocorasick@1.0.1: {} - module-error@1.0.2: {} - moo-color@1.0.3: dependencies: color-name: 1.1.4 @@ -19650,12 +19539,6 @@ snapshots: optionalDependencies: encoding: 0.1.13 - node-fetch@3.3.2: - dependencies: - data-uri-to-buffer: 4.0.1 - fetch-blob: 3.2.0 - formdata-polyfill: 4.0.10 - node-forge@1.3.1: {} node-gyp-build@4.8.1: {} @@ -19814,8 +19697,6 @@ snapshots: on-exit-leak-free@0.2.0: {} - on-exit-leak-free@2.1.2: {} - on-finished@2.3.0: dependencies: ee-first: 1.1.1 @@ -19902,10 +19783,6 @@ snapshots: dependencies: yocto-queue: 0.1.0 - p-limit@5.0.0: - dependencies: - yocto-queue: 1.0.0 - p-locate@2.0.0: dependencies: p-limit: 1.3.0 @@ -19934,7 +19811,7 @@ snapshots: dependencies: '@tootallnate/quickjs-emscripten': 0.23.0 agent-base: 7.1.1 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.6 get-uri: 6.0.3 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.4 @@ -19948,6 +19825,8 @@ snapshots: degenerator: 5.0.1 netmask: 2.0.2 + package-json-from-dist@1.0.0: {} + pako@2.1.0: {} param-case@2.1.1: @@ -19976,6 +19855,8 @@ snapshots: json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 + parse-ms@4.0.0: {} + parse5-htmlparser2-tree-adapter@7.0.0: dependencies: domhandler: 5.0.3 @@ -20012,6 +19893,11 @@ snapshots: path-parse@1.0.7: {} + path-scurry@1.11.1: + dependencies: + lru-cache: 10.2.2 + minipass: 7.1.2 + path-to-regexp@0.1.7: {} path-to-regexp@6.2.2: {} @@ -20028,6 +19914,8 @@ snapshots: pathval@1.1.1: {} + pathval@2.0.0: {} + pbkdf2@3.1.2: dependencies: create-hash: 1.2.0 @@ -20046,6 +19934,8 @@ snapshots: picomatch@2.3.1: {} + picomatch@4.0.2: {} + pify@2.3.0: {} pify@3.0.0: {} @@ -20065,28 +19955,6 @@ snapshots: duplexify: 4.1.3 split2: 4.2.0 - pino-abstract-transport@1.2.0: - dependencies: - readable-stream: 4.5.2 - split2: 4.2.0 - - pino-pretty@10.3.1: - dependencies: - colorette: 2.0.20 - dateformat: 4.6.3 - fast-copy: 3.0.2 - fast-safe-stringify: 2.1.1 - help-me: 5.0.0 - joycon: 3.1.1 - minimist: 1.2.8 - on-exit-leak-free: 2.1.2 - pino-abstract-transport: 1.2.0 - pump: 3.0.0 - readable-stream: 4.5.2 - secure-json-parse: 2.7.0 - sonic-boom: 3.8.1 - strip-json-comments: 3.1.1 - pino-std-serializers@4.0.0: {} pino@7.11.0: @@ -20200,6 +20068,10 @@ snapshots: ansi-styles: 5.2.0 react-is: 18.3.1 + pretty-ms@9.1.0: + dependencies: + parse-ms: 4.0.0 + printable-characters@1.0.42: {} process-nextick-args@1.0.7: {} @@ -20240,7 +20112,7 @@ snapshots: proxy-agent@6.4.0: dependencies: agent-base: 7.1.1 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.6 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.4 lru-cache: 7.18.3 @@ -20265,24 +20137,24 @@ snapshots: punycode@2.3.1: {} - puppeteer-core@22.10.0(bufferutil@4.0.7)(utf-8-validate@6.0.3): + puppeteer-core@22.10.0(bufferutil@4.0.8)(utf-8-validate@5.0.10): dependencies: '@puppeteer/browsers': 2.2.3 chromium-bidi: 0.5.19(devtools-protocol@0.0.1286932) debug: 4.3.4(supports-color@8.1.1) devtools-protocol: 0.0.1286932 - ws: 8.17.0(bufferutil@4.0.7)(utf-8-validate@6.0.3) + ws: 8.17.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - puppeteer@22.10.0(bufferutil@4.0.7)(typescript@5.4.5)(utf-8-validate@6.0.3): + puppeteer@22.10.0(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10): dependencies: '@puppeteer/browsers': 2.2.3 cosmiconfig: 9.0.0(typescript@5.4.5) devtools-protocol: 0.0.1286932 - puppeteer-core: 22.10.0(bufferutil@4.0.7)(utf-8-validate@6.0.3) + puppeteer-core: 22.10.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - supports-color @@ -20376,10 +20248,10 @@ snapshots: react: 18.3.1 tween-functions: 1.2.0 - react-devtools-core@5.3.1(bufferutil@4.0.7)(utf-8-validate@6.0.3): + react-devtools-core@5.3.1(bufferutil@4.0.8)(utf-8-validate@5.0.10): dependencies: shell-quote: 1.8.1 - ws: 7.5.10(bufferutil@4.0.7)(utf-8-validate@6.0.3) + ws: 7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - utf-8-validate @@ -20404,7 +20276,7 @@ snapshots: dependencies: react: 18.3.1 - react-i18next@11.18.6(i18next@21.10.0)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(@types/react@18.2.21)(bufferutil@4.0.7)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1): + react-i18next@11.18.6(i18next@21.10.0)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(@types/react@18.2.21)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1): dependencies: '@babel/runtime': 7.24.6 html-parse-stringify: 3.0.1 @@ -20412,7 +20284,7 @@ snapshots: react: 18.3.1 optionalDependencies: react-dom: 18.3.1(react@18.3.1) - react-native: 0.74.1(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(@types/react@18.2.21)(bufferutil@4.0.7)(react@18.3.1)(utf-8-validate@6.0.3) + react-native: 0.74.1(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(@types/react@18.2.21)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10) react-is@16.13.1: {} @@ -20420,26 +20292,26 @@ snapshots: react-is@18.3.1: {} - react-native-webview@11.26.1(react-native@0.74.1(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(@types/react@18.2.21)(bufferutil@4.0.7)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1): + react-native-webview@11.26.1(react-native@0.74.1(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(@types/react@18.2.21)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1): dependencies: escape-string-regexp: 2.0.0 invariant: 2.2.4 react: 18.3.1 - react-native: 0.74.1(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(@types/react@18.2.21)(bufferutil@4.0.7)(react@18.3.1)(utf-8-validate@6.0.3) + react-native: 0.74.1(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(@types/react@18.2.21)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10) - react-native@0.74.1(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(@types/react@18.2.21)(bufferutil@4.0.7)(react@18.3.1)(utf-8-validate@6.0.3): + react-native@0.74.1(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(@types/react@18.2.21)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10): dependencies: '@jest/create-cache-key-function': 29.7.0 - '@react-native-community/cli': 13.6.6(bufferutil@4.0.7)(utf-8-validate@6.0.3) + '@react-native-community/cli': 13.6.6(bufferutil@4.0.8)(utf-8-validate@5.0.10) '@react-native-community/cli-platform-android': 13.6.6 '@react-native-community/cli-platform-ios': 13.6.6 '@react-native/assets-registry': 0.74.83 '@react-native/codegen': 0.74.83(@babel/preset-env@7.24.6(@babel/core@7.24.6)) - '@react-native/community-cli-plugin': 0.74.83(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(bufferutil@4.0.7)(utf-8-validate@6.0.3) + '@react-native/community-cli-plugin': 0.74.83(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(bufferutil@4.0.8)(utf-8-validate@5.0.10) '@react-native/gradle-plugin': 0.74.83 '@react-native/js-polyfills': 0.74.83 '@react-native/normalize-colors': 0.74.83 - '@react-native/virtualized-lists': 0.74.83(@types/react@18.2.21)(react-native@0.74.1(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(@types/react@18.2.21)(bufferutil@4.0.7)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1) + '@react-native/virtualized-lists': 0.74.83(@types/react@18.2.21)(react-native@0.74.1(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(@types/react@18.2.21)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) abort-controller: 3.0.0 anser: 1.4.10 ansi-regex: 5.0.1 @@ -20458,14 +20330,14 @@ snapshots: pretty-format: 26.6.2 promise: 8.3.0 react: 18.3.1 - react-devtools-core: 5.3.1(bufferutil@4.0.7)(utf-8-validate@6.0.3) + react-devtools-core: 5.3.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) react-refresh: 0.14.2 react-shallow-renderer: 16.15.0(react@18.3.1) regenerator-runtime: 0.13.11 scheduler: 0.24.0-canary-efb381bbf-20230505 stacktrace-parser: 0.1.10 whatwg-fetch: 3.6.20 - ws: 6.2.3(bufferutil@4.0.7)(utf-8-validate@6.0.3) + ws: 6.2.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) yargs: 17.7.2 optionalDependencies: '@types/react': 18.2.21 @@ -20913,8 +20785,6 @@ snapshots: node-addon-api: 5.1.0 node-gyp-build: 4.8.1 - secure-json-parse@2.7.0: {} - selfsigned@2.4.1: dependencies: '@types/node-forge': 1.3.11 @@ -21093,6 +20963,8 @@ snapshots: smart-buffer@4.2.0: {} + smol-toml@1.3.0: {} + snake-case@2.1.0: dependencies: no-case: 2.3.2 @@ -21102,11 +20974,11 @@ snapshots: dot-case: 3.0.4 tslib: 2.6.2 - socket.io-client@4.7.5(bufferutil@4.0.7)(utf-8-validate@6.0.3): + socket.io-client@4.7.5(bufferutil@4.0.8)(utf-8-validate@5.0.10): dependencies: '@socket.io/component-emitter': 3.1.2 - debug: 4.3.4(supports-color@8.1.1) - engine.io-client: 6.5.3(bufferutil@4.0.7)(utf-8-validate@6.0.3) + debug: 4.3.6 + engine.io-client: 6.5.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) socket.io-parser: 4.2.4 transitivePeerDependencies: - bufferutil @@ -21116,14 +20988,14 @@ snapshots: socket.io-parser@4.2.4: dependencies: '@socket.io/component-emitter': 3.1.2 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.6 transitivePeerDependencies: - supports-color socks-proxy-agent@8.0.3: dependencies: agent-base: 7.1.1 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.6 socks: 2.8.3 transitivePeerDependencies: - supports-color @@ -21159,10 +21031,6 @@ snapshots: dependencies: atomic-sleep: 1.0.0 - sonic-boom@3.8.1: - dependencies: - atomic-sleep: 1.0.0 - source-map-js@1.2.0: {} source-map-support@0.5.21: @@ -21312,6 +21180,12 @@ snapshots: is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + string.prototype.matchall@4.0.11: dependencies: call-bind: 1.0.7 @@ -21374,6 +21248,10 @@ snapshots: dependencies: ansi-regex: 5.0.1 + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.0.1 + strip-bom@2.0.0: dependencies: is-utf8: 0.2.1 @@ -21396,9 +21274,7 @@ snapshots: strip-json-comments@3.1.1: {} - strip-literal@2.1.0: - dependencies: - js-tokens: 9.0.0 + strip-json-comments@5.0.1: {} strnum@1.0.5: {} @@ -21553,6 +21429,8 @@ snapshots: sudo-prompt@9.2.1: {} + summary@2.1.0: {} + superstruct@1.0.4: {} supports-color@5.5.0: @@ -21593,11 +21471,11 @@ snapshots: lower-case: 1.1.4 upper-case: 1.1.3 - swarm-js@0.1.42(bufferutil@4.0.7)(utf-8-validate@6.0.3): + swarm-js@0.1.42(bufferutil@4.0.8)(utf-8-validate@5.0.10): dependencies: bluebird: 3.7.2 buffer: 5.7.1 - eth-lib: 0.1.29(bufferutil@4.0.7)(utf-8-validate@6.0.3) + eth-lib: 0.1.29(bufferutil@4.0.8)(utf-8-validate@5.0.10) fs-extra: 4.0.3 got: 11.8.6 mime-types: 2.1.35 @@ -21702,11 +21580,11 @@ snapshots: commander: 2.20.3 source-map-support: 0.5.21 - test-exclude@6.0.0: + test-exclude@7.0.1: dependencies: '@istanbuljs/schema': 0.1.3 - glob: 7.2.3 - minimatch: 3.1.2 + glob: 10.4.5 + minimatch: 9.0.4 testrpc@0.0.1: {} @@ -21731,9 +21609,11 @@ snapshots: tinybench@2.8.0: {} - tinypool@0.8.4: {} + tinypool@1.0.1: {} - tinyspy@2.2.1: {} + tinyrainbow@1.2.0: {} + + tinyspy@3.0.0: {} title-case@2.1.1: dependencies: @@ -22060,16 +21940,6 @@ snapshots: dependencies: node-gyp-build: 4.8.1 - utf-8-validate@5.0.7: - dependencies: - node-gyp-build: 4.8.1 - optional: true - - utf-8-validate@6.0.3: - dependencies: - node-gyp-build: 4.8.1 - optional: true - utf8@3.0.0: {} util-deprecate@1.0.2: {} @@ -22119,7 +21989,7 @@ snapshots: core-util-is: 1.0.2 extsprintf: 1.3.0 - viem@2.19.0(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8): + viem@2.19.4(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8): dependencies: '@adraffy/ens-normalize': 1.10.0 '@noble/curves': 1.4.0 @@ -22127,9 +21997,9 @@ snapshots: '@scure/bip32': 1.4.0 '@scure/bip39': 1.3.0 abitype: 1.0.5(typescript@5.4.5)(zod@3.23.8) - isows: 1.0.4(ws@8.17.1(bufferutil@4.0.8)(utf-8-validate@6.0.3)) + isows: 1.0.4(ws@8.17.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)) webauthn-p256: 0.0.5 - ws: 8.17.1(bufferutil@4.0.8)(utf-8-validate@6.0.3) + ws: 8.17.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) optionalDependencies: typescript: 5.4.5 transitivePeerDependencies: @@ -22137,30 +22007,12 @@ snapshots: - utf-8-validate - zod - viem@2.19.4(bufferutil@4.0.7)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8): - dependencies: - '@adraffy/ens-normalize': 1.10.0 - '@noble/curves': 1.4.0 - '@noble/hashes': 1.4.0 - '@scure/bip32': 1.4.0 - '@scure/bip39': 1.3.0 - abitype: 1.0.5(typescript@5.4.5)(zod@3.23.8) - isows: 1.0.4(ws@8.17.1(bufferutil@4.0.7)(utf-8-validate@6.0.3)) - webauthn-p256: 0.0.5 - ws: 8.17.1(bufferutil@4.0.7)(utf-8-validate@6.0.3) - optionalDependencies: - typescript: 5.4.5 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - zod - - vite-node@1.6.0(@types/node@18.19.33)(terser@5.31.5): + vite-node@2.0.5(@types/node@18.19.33)(terser@5.31.5): dependencies: cac: 6.7.14 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.6 pathe: 1.1.2 - picocolors: 1.0.1 + tinyrainbow: 1.2.0 vite: 5.2.11(@types/node@18.19.33)(terser@5.31.5) transitivePeerDependencies: - '@types/node' @@ -22172,7 +22024,7 @@ snapshots: - supports-color - terser - vite-plugin-magical-svg@1.2.1(vite@5.2.11(@types/node@18.19.33)(terser@5.31.5)): + vite-plugin-magical-svg@1.3.0(vite@5.2.11(@types/node@18.19.33)(terser@5.31.5)): dependencies: magic-string: 0.30.10 svgo: 3.3.2 @@ -22189,36 +22041,35 @@ snapshots: fsevents: 2.3.3 terser: 5.31.5 - vitest-canvas-mock@0.3.3(vitest@1.6.0(@types/node@18.19.33)(jsdom@24.1.0(bufferutil@4.0.7)(canvas@2.11.2(encoding@0.1.13))(utf-8-validate@6.0.3))(terser@5.31.5)): + vitest-canvas-mock@0.3.3(vitest@2.0.5(@types/node@18.19.33)(jsdom@24.1.0(bufferutil@4.0.8)(canvas@2.11.2(encoding@0.1.13))(utf-8-validate@5.0.10))(terser@5.31.5)): dependencies: jest-canvas-mock: 2.5.2 - vitest: 1.6.0(@types/node@18.19.33)(jsdom@24.1.0(bufferutil@4.0.7)(canvas@2.11.2(encoding@0.1.13))(utf-8-validate@6.0.3))(terser@5.31.5) + vitest: 2.0.5(@types/node@18.19.33)(jsdom@24.1.0(bufferutil@4.0.8)(canvas@2.11.2(encoding@0.1.13))(utf-8-validate@5.0.10))(terser@5.31.5) - vitest@1.6.0(@types/node@18.19.33)(jsdom@24.1.0(bufferutil@4.0.7)(canvas@2.11.2(encoding@0.1.13))(utf-8-validate@6.0.3))(terser@5.31.5): + vitest@2.0.5(@types/node@18.19.33)(jsdom@24.1.0(bufferutil@4.0.8)(canvas@2.11.2(encoding@0.1.13))(utf-8-validate@5.0.10))(terser@5.31.5): dependencies: - '@vitest/expect': 1.6.0 - '@vitest/runner': 1.6.0 - '@vitest/snapshot': 1.6.0 - '@vitest/spy': 1.6.0 - '@vitest/utils': 1.6.0 - acorn-walk: 8.3.2 - chai: 4.4.1 - debug: 4.3.4(supports-color@8.1.1) + '@ampproject/remapping': 2.3.0 + '@vitest/expect': 2.0.5 + '@vitest/pretty-format': 2.0.5 + '@vitest/runner': 2.0.5 + '@vitest/snapshot': 2.0.5 + '@vitest/spy': 2.0.5 + '@vitest/utils': 2.0.5 + chai: 5.1.1 + debug: 4.3.6 execa: 8.0.1 - local-pkg: 0.5.0 magic-string: 0.30.10 pathe: 1.1.2 - picocolors: 1.0.1 std-env: 3.7.0 - strip-literal: 2.1.0 tinybench: 2.8.0 - tinypool: 0.8.4 + tinypool: 1.0.1 + tinyrainbow: 1.2.0 vite: 5.2.11(@types/node@18.19.33)(terser@5.31.5) - vite-node: 1.6.0(@types/node@18.19.33)(terser@5.31.5) - why-is-node-running: 2.2.2 + vite-node: 2.0.5(@types/node@18.19.33)(terser@5.31.5) + why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 18.19.33 - jsdom: 24.1.0(bufferutil@4.0.7)(canvas@2.11.2(encoding@0.1.13))(utf-8-validate@6.0.3) + jsdom: 24.1.0(bufferutil@4.0.8)(canvas@2.11.2(encoding@0.1.13))(utf-8-validate@5.0.10) transitivePeerDependencies: - less - lightningcss @@ -22262,14 +22113,14 @@ snapshots: dependencies: xml-name-validator: 5.0.0 - wagmi@2.12.4(@tanstack/query-core@5.22.2)(@tanstack/react-query@5.22.2(react@18.3.1))(@types/react@18.2.21)(bufferutil@4.0.7)(encoding@0.1.13)(immer@9.0.21)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(@types/react@18.2.21)(bufferutil@4.0.7)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1)(rollup@2.78.0)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.19.4(bufferutil@4.0.7)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8): + wagmi@2.12.4(@tanstack/query-core@5.22.2)(@tanstack/react-query@5.22.2(react@18.3.1))(@types/react@18.2.21)(bufferutil@4.0.8)(encoding@0.1.13)(immer@9.0.21)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(@types/react@18.2.21)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(rollup@2.78.0)(typescript@5.4.5)(utf-8-validate@5.0.10)(viem@2.19.4(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8): dependencies: '@tanstack/react-query': 5.22.2(react@18.3.1) - '@wagmi/connectors': 5.1.4(@types/react@18.2.21)(@wagmi/core@2.13.3(@tanstack/query-core@5.22.2)(@types/react@18.2.21)(immer@9.0.21)(react@18.3.1)(typescript@5.4.5)(viem@2.19.4(bufferutil@4.0.7)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8)))(bufferutil@4.0.7)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(@types/react@18.2.21)(bufferutil@4.0.7)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1)(rollup@2.78.0)(typescript@5.4.5)(utf-8-validate@6.0.3)(viem@2.19.4(bufferutil@4.0.7)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8))(zod@3.23.8) - '@wagmi/core': 2.13.3(@tanstack/query-core@5.22.2)(@types/react@18.2.21)(immer@9.0.21)(react@18.3.1)(typescript@5.4.5)(viem@2.19.4(bufferutil@4.0.7)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8)) + '@wagmi/connectors': 5.1.4(@types/react@18.2.21)(@wagmi/core@2.13.3(@tanstack/query-core@5.22.2)(@types/react@18.2.21)(immer@9.0.21)(react@18.3.1)(typescript@5.4.5)(viem@2.19.4(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8)))(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.1(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(@types/react@18.2.21)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(rollup@2.78.0)(typescript@5.4.5)(utf-8-validate@5.0.10)(viem@2.19.4(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8) + '@wagmi/core': 2.13.3(@tanstack/query-core@5.22.2)(@types/react@18.2.21)(immer@9.0.21)(react@18.3.1)(typescript@5.4.5)(viem@2.19.4(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8)) react: 18.3.1 use-sync-external-store: 1.2.0(react@18.3.1) - viem: 2.19.4(bufferutil@4.0.7)(typescript@5.4.5)(utf-8-validate@6.0.3)(zod@3.23.8) + viem: 2.19.4(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8) optionalDependencies: typescript: 5.4.5 transitivePeerDependencies: @@ -22335,21 +22186,21 @@ snapshots: web-streams-polyfill@3.3.3: {} - web3-bzz@1.10.0(bufferutil@4.0.7)(utf-8-validate@6.0.3): + web3-bzz@1.10.0(bufferutil@4.0.8)(utf-8-validate@5.0.10): dependencies: '@types/node': 12.20.55 got: 12.1.0 - swarm-js: 0.1.42(bufferutil@4.0.7)(utf-8-validate@6.0.3) + swarm-js: 0.1.42(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - web3-bzz@1.10.4(bufferutil@4.0.7)(utf-8-validate@6.0.3): + web3-bzz@1.10.4(bufferutil@4.0.8)(utf-8-validate@5.0.10): dependencies: '@types/node': 12.20.55 got: 12.1.0 - swarm-js: 0.1.42(bufferutil@4.0.7)(utf-8-validate@6.0.3) + swarm-js: 0.1.42(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - supports-color @@ -22718,9 +22569,9 @@ snapshots: randombytes: 2.1.0 utf8: 3.0.0 - web3@1.10.0(bufferutil@4.0.7)(encoding@0.1.13)(utf-8-validate@6.0.3): + web3@1.10.0(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10): dependencies: - web3-bzz: 1.10.0(bufferutil@4.0.7)(utf-8-validate@6.0.3) + web3-bzz: 1.10.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) web3-core: 1.10.0(encoding@0.1.13) web3-eth: 1.10.0(encoding@0.1.13) web3-eth-personal: 1.10.0(encoding@0.1.13) @@ -22733,9 +22584,9 @@ snapshots: - supports-color - utf-8-validate - web3@1.10.4(bufferutil@4.0.7)(encoding@0.1.13)(utf-8-validate@6.0.3): + web3@1.10.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10): dependencies: - web3-bzz: 1.10.4(bufferutil@4.0.7)(utf-8-validate@6.0.3) + web3-bzz: 1.10.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) web3-core: 1.10.4(encoding@0.1.13) web3-eth: 1.10.4(encoding@0.1.13) web3-eth-personal: 1.10.4(encoding@0.1.13) @@ -22759,7 +22610,7 @@ snapshots: webidl-conversions@7.0.0: {} - webpack-bundle-analyzer@4.7.0(bufferutil@4.0.7)(utf-8-validate@6.0.3): + webpack-bundle-analyzer@4.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10): dependencies: acorn: 8.11.3 acorn-walk: 8.3.2 @@ -22769,7 +22620,7 @@ snapshots: lodash: 4.17.21 opener: 1.5.2 sirv: 1.0.19 - ws: 7.5.10(bufferutil@4.0.7)(utf-8-validate@6.0.3) + ws: 7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - utf-8-validate @@ -22886,7 +22737,7 @@ snapshots: dependencies: isexe: 2.0.0 - why-is-node-running@2.2.2: + why-is-node-running@2.3.0: dependencies: siginfo: 2.0.0 stackback: 0.0.2 @@ -22913,7 +22764,7 @@ snapshots: workerpool@6.2.1: {} - wrangler@3.57.1(@cloudflare/workers-types@3.19.0)(bufferutil@4.0.7)(utf-8-validate@6.0.3): + wrangler@3.57.1(@cloudflare/workers-types@3.19.0)(bufferutil@4.0.8)(utf-8-validate@5.0.10): dependencies: '@cloudflare/kv-asset-handler': 0.3.2 '@esbuild-plugins/node-globals-polyfill': 0.2.3(esbuild@0.17.19) @@ -22921,7 +22772,7 @@ snapshots: blake3-wasm: 2.1.5 chokidar: 3.6.0 esbuild: 0.17.19 - miniflare: 3.20240512.0(bufferutil@4.0.7)(utf-8-validate@6.0.3) + miniflare: 3.20240512.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) nanoid: 3.3.7 path-to-regexp: 6.2.2 resolve: 1.22.8 @@ -22954,6 +22805,12 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + wrappy@1.0.2: {} write-file-atomic@2.4.3: @@ -22967,61 +22824,51 @@ snapshots: imurmurhash: 0.1.4 signal-exit: 3.0.7 - ws@3.3.3(bufferutil@4.0.7)(utf-8-validate@6.0.3): + ws@3.3.3(bufferutil@4.0.8)(utf-8-validate@5.0.10): dependencies: async-limiter: 1.0.1 safe-buffer: 5.1.2 ultron: 1.1.1 optionalDependencies: - bufferutil: 4.0.7 - utf-8-validate: 6.0.3 + bufferutil: 4.0.8 + utf-8-validate: 5.0.10 - ws@6.2.3(bufferutil@4.0.7)(utf-8-validate@6.0.3): + ws@6.2.3(bufferutil@4.0.8)(utf-8-validate@5.0.10): dependencies: async-limiter: 1.0.1 optionalDependencies: - bufferutil: 4.0.7 - utf-8-validate: 6.0.3 - - ws@7.4.6(bufferutil@4.0.7)(utf-8-validate@6.0.3): - optionalDependencies: - bufferutil: 4.0.7 - utf-8-validate: 6.0.3 - - ws@7.5.10(bufferutil@4.0.7)(utf-8-validate@6.0.3): - optionalDependencies: - bufferutil: 4.0.7 - utf-8-validate: 6.0.3 + bufferutil: 4.0.8 + utf-8-validate: 5.0.10 - ws@7.5.9(bufferutil@4.0.7)(utf-8-validate@6.0.3): + ws@7.4.6(bufferutil@4.0.8)(utf-8-validate@5.0.10): optionalDependencies: - bufferutil: 4.0.7 - utf-8-validate: 6.0.3 + bufferutil: 4.0.8 + utf-8-validate: 5.0.10 - ws@8.11.0(bufferutil@4.0.7)(utf-8-validate@6.0.3): + ws@7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10): optionalDependencies: - bufferutil: 4.0.7 - utf-8-validate: 6.0.3 + bufferutil: 4.0.8 + utf-8-validate: 5.0.10 - ws@8.13.0(bufferutil@4.0.7)(utf-8-validate@6.0.3): + ws@7.5.9(bufferutil@4.0.8)(utf-8-validate@5.0.10): optionalDependencies: - bufferutil: 4.0.7 - utf-8-validate: 6.0.3 + bufferutil: 4.0.8 + utf-8-validate: 5.0.10 - ws@8.17.0(bufferutil@4.0.7)(utf-8-validate@6.0.3): + ws@8.11.0(bufferutil@4.0.8)(utf-8-validate@5.0.10): optionalDependencies: - bufferutil: 4.0.7 - utf-8-validate: 6.0.3 + bufferutil: 4.0.8 + utf-8-validate: 5.0.10 - ws@8.17.1(bufferutil@4.0.7)(utf-8-validate@6.0.3): + ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@5.0.10): optionalDependencies: - bufferutil: 4.0.7 - utf-8-validate: 6.0.3 + bufferutil: 4.0.8 + utf-8-validate: 5.0.10 - ws@8.17.1(bufferutil@4.0.8)(utf-8-validate@6.0.3): + ws@8.17.1(bufferutil@4.0.8)(utf-8-validate@5.0.10): optionalDependencies: bufferutil: 4.0.8 - utf-8-validate: 6.0.3 + utf-8-validate: 5.0.10 xhr-request-promise@0.1.3: dependencies: @@ -23177,17 +23024,19 @@ snapshots: yocto-queue@0.1.0: {} - yocto-queue@1.0.0: {} - youch@3.3.3: dependencies: cookie: 0.5.0 mustache: 4.2.0 stacktracey: 2.1.8 - zksync-web3@0.14.4(ethers@5.7.2(bufferutil@4.0.7)(utf-8-validate@6.0.3)): + zksync-web3@0.14.4(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10)): + dependencies: + ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + + zod-validation-error@3.3.1(zod@3.23.8): dependencies: - ethers: 5.7.2(bufferutil@4.0.7)(utf-8-validate@6.0.3) + zod: 3.23.8 zod@3.22.4: {} diff --git a/public/_headers b/public/_headers new file mode 100644 index 000000000..190ae031e --- /dev/null +++ b/public/_headers @@ -0,0 +1,2 @@ +/* + Cross-Origin-Opener-Policy: same-origin \ No newline at end of file diff --git a/public/locales/en/common.json b/public/locales/en/common.json index b00a83a10..7ff878099 100644 --- a/public/locales/en/common.json +++ b/public/locales/en/common.json @@ -211,6 +211,8 @@ "approveNameWrapper": "Approve NameWrapper", "clearRecords": "Clear records", "updateRecords": "Update records", + "updateRecord": "Update record", + "removeRecord": "Remove record", "resetProfileWithRecords": "Reset profile with records", "transferName": "Transfer name", "transferSubname": "Transfer subname", @@ -218,7 +220,9 @@ "syncManager": "Sync manager", "updateProfileRecords": "Update profile", "resetProfile": "Reset profile", - "unwrapName": "Unwrap name" + "unwrapName": "Unwrap name", + "updateVerificationRecord": "Update verification record", + "removeVerificationRecord": "Remove verification record" }, "info": { "sendName": "Set the controller and registrant of the name", @@ -263,7 +267,8 @@ "cost": "Cost", "update": "Update", "resolver": "Resolver", - "records": "Records" + "records": "Records", + "record": "Record" }, "itemValue": { "records_one": "{{count}} record", @@ -349,7 +354,8 @@ "invalid": "Invalid", "unsupportedTLD": "Not Supported", "imported": "Imported", - "owned": "Owned" + "owned": "Owned", + "offChain": "View" } }, "selectableInput": { diff --git a/public/locales/en/profile.json b/public/locales/en/profile.json index fbe32cd47..7e8a11f42 100644 --- a/public/locales/en/profile.json +++ b/public/locales/en/profile.json @@ -9,6 +9,7 @@ "accounts": "Accounts", "addresses": "Addresses", "otherRecords": "Other Records", + "verifications": "Verifications", "editProfile": "Edit Profile", "ownership": "Ownership", "viewDetails": "View Details", @@ -39,6 +40,9 @@ "reclaim": { "label": "Recreate name", "warning": "This subname has expired and is not owned. You can recreate this subname." + }, + "verifyProfile": { + "label": "Verifications" } }, "warnings": { @@ -454,6 +458,8 @@ "default": "This action is not available", "invalidJSON": "Invalid JSON", "isOwnerCannotEdit": "You must be the manager in order to edit the profile", - "cannotEdit": "You do not have permission to update to an authorised resolver" + "cannotEdit": "You do not have permission to update to an authorised resolver", + "isOwnerCannotVerify": "You must be the Manager to verify your profile", + "cannotVerify": "You do not have permission to verify your profile" } } diff --git a/public/locales/en/transactionFlow.json b/public/locales/en/transactionFlow.json index 84b2c82c1..42bdbe028 100644 --- a/public/locales/en/transactionFlow.json +++ b/public/locales/en/transactionFlow.json @@ -399,6 +399,19 @@ "title": "Sync manager", "description": "Syncing the manager will make you the new manager of this name. The current manager ({{manager}}) will no longer be able to make changes.", "warning": "Syncing the manager will also unwrap this name. This will burn the NFT and reset any permissions." + }, + "verifyProfile": { + "list": { + "title": "Verify your profile", + "message": " You can verify profile information and add proofs of personhood. Verified records will be marked on your profile with a blue check." + }, + "dentity": { + "title": "Dentity verification", + "description": "Proceed to Dentity to verify your profile. You’ll need to provide proof of ownership for the records you want to verify. Dentity does not share any private information with ENS.", + "helper": "Your verification will not be complete until you have returned to ENS and updated your records. This will require a transaction.", + "remove": "Remove Dentity from profile", + "link": "Go to Dentity" + } } }, "transaction": { diff --git a/public/locales/ru/address.json b/public/locales/ru/address.json new file mode 100644 index 000000000..864df3288 --- /dev/null +++ b/public/locales/ru/address.json @@ -0,0 +1,18 @@ +{ + "meta": { + "title": "{{address}} на ENS", + "description": "Все имена для {{address}} в Ethereum Name Service" + }, + "addressDetails": "Детали адреса", + "nameCount": "{{count}} имён", + "filter": "Фильтр", + "view": "Просмотр", + "noProfile": { + "title": "Основное имя не установлено", + "message": "Этот кошелек должен установить основное имя для создания профиля" + }, + "noResults": "Имена не найдены", + "errors": { + "names": "Не удалось найти адрес" + } +} diff --git a/public/locales/ru/common.json b/public/locales/ru/common.json new file mode 100644 index 000000000..c23b3bc4e --- /dev/null +++ b/public/locales/ru/common.json @@ -0,0 +1,397 @@ +{ + "title": "Ваше веб3 имя пользователя", + "description": "Ваша идентификация в веб3, одно имя для всех ваших криптоадресов и вашего децентрализованного вебсайта.", + "loading": "Загрузка", + "unsupportedNetwork": "Неподдерживаемая сеть", + "notFound": "404 Не найдено", + "etherscan": "Etherscan", + "action": { + "cancel": "Отмена", + "change": "Изменить", + "upload": "Загрузить", + "close": "Закрыть", + "save": "Сохранить", + "edit": "Редактировать", + "view": "Просмотр", + "clear": "Очистить", + "update": "Обновить", + "learnMore": "Узнать больше", + "send": "Отправить", + "next": "Далее", + "add": "Добавить", + "set": "Установить", + "search": "Поиск", + "back": "Назад", + "continue": "Продолжить", + "confirm": "Подтвердить", + "remove": "Удалить", + "sign": "Подписать", + "reset": "Сбросить", + "transfer": "Передать", + "tryAgain": "Попробовать снова", + "done": "Готово", + "burnSelected": "Сжечь выбранное", + "extend": "Продлить", + "delete": "Удалить", + "sort": "Сортировать", + "check": "Проверить", + "claim": "Запросить", + "remindMe": "Напомнить", + "begin": "Начать", + "finish": "Завершить", + "skip": "Пропустить", + "changeNetwork": "Изменить сеть", + "understand": "Понимаю", + "feedback": "Обратная связь", + "enterEmail": "Введите ваш email", + "migrate": "Мигрировать", + "setToSelf": "Установить на себя", + "editRoles": "Редактировать роли", + "setReminder": "Установить напоминание", + "import": "Импортировать", + "connect": "Подключиться" + }, + "unit": { + "years_one": "{{count}} год", + "years_other": "{{count}} лет", + "months_one": "{{count}} месяц", + "months_other": "{{count}} месяцев", + "days_one": "{{count}} день", + "days_other": "{{count}} дней", + "invalid_date": "Неверная дата", + "yrs_one": "{{count}} г", + "yrs_other": "{{count}} л", + "gas": "{{value}} газа", + "selected": "Выбрано: {{count}}", + "perPage": "{{count}} на странице" + }, + "navigation": { + "home": "Главная", + "names": "Мои Имена", + "favourites": "Избранное", + "settings": "Настройки", + "governance": "Управление", + "community": "Сообщество", + "developers": "Разработчики", + "support": "Поддержка", + "bounty": "Награда за баги", + "terms": "Условия Использования", + "privacy": "Политика Конфиденциальности", + "back": "Назад", + "oldApp": "Старое Приложение ENS", + "language": "Язык", + "currency": "Валюта", + "ipfsApp": "IPFS Приложение ENS", + "feedback": "Обратная связь", + "syncMessage": "Синхронизация с сетью. Изменения от вашей транзакции могут еще не отображаться." + }, + "wallet": { + "myProfile": "Профиль", + "disconnect": "Отключить", + "connect": "Подключить", + "noPrimaryName": "Нет Основного Имени", + "viewProfile": "Просмотреть Профиль", + "viewDetails": "Просмотреть Детали", + "register": "Зарегистрировать" + }, + "name": { + "registered": "Зарегистрировано", + "expires": "Истекает", + "graceEnd": "Конец льготного периода", + "noExpiry": "Без срока действия", + "expiry": "Срок действия", + "parent": "Родитель", + "noParent": "Нет родителя", + "registrant": "Регистратор", + "controller": "Контролер", + "dnsOwner": "DNS Владелец", + "owner": "Владелец", + "notOwned": "Не принадлежит", + "manager": "Менеджер", + "all": "Все Имена", + "copy": "Скопировать имя", + "yourPrimaryName": "Ваше основное имя", + "expiresInYears_one": "Истекает через {{count}} год", + "expiresInYears_other": "Истекает через {{count}} года", + "expiresInMonths_one": "Истекает через {{count}} месяц", + "expiresInMonths_other": "Истекает через {{count}} месяца", + "expiresInDays_one": "Истекает через {{count}} день", + "expiresInDays_other": "Истекает через {{count}} дня", + "expiresInHours_one": "Истекает через {{count}} час", + "expiresInHours_other": "Истекает через {{count}} часов", + "expiresInHours_zero": "Истекает меньше чем через час", + "expiredInHours_one": "Истек {{count}} час назад", + "expiredInHours_other": "Истекло {{count}} часов назад", + "expiredInHours_zero": "Истекло меньше чем час назад", + "expiredInDays_one": "Истек {{count}} день назад", + "expiredInDays_other": "Истекло {{count}} дня назад", + "expiredInMonths_one": "Истек {{count}} месяц назад", + "expiredInMonths_other": "Истекло {{count}} месяца назад", + "expiredInYears_one": "Истек {{count}} год назад", + "expiredInYears_other": "Истекло {{count}} года назад", + "gracePeriod": { + "expiresInYears_one": "Льготный период истекает через {{count}} год", + "expiresInYears_other": "Льготный период истекает через {{count}} года", + "expiresInMonths_one": "Льготный период истекает через {{count}} месяц", + "expiresInMonths_other": "Льготный период истекает через {{count}} месяца", + "expiresInDays_one": "Льготный период истекает через {{count}} день", + "expiresInDays_other": "Льготный период истекает через {{count}} дня", + "expiresInHours_one": "Льготный период истекает через {{count}} час", + "expiresInHours_other": "Льготный период истекает через {{count}} часов", + "expiresInHours_zero": "Льготный период истекает менее чем через час" + }, + "extend": "Продлить", + "send": "Отправить", + "transfer": "Передать", + "sendManager": "Отправить Менеджеру", + "sendOwner": "Отправить Владельцу", + "renew": "Продлить {{name}}" + }, + "address": { + "label": "Адрес", + "viewAddress": "Просмотреть адрес", + "copyAddress": "Копировать адрес" + }, + "records": { + "label": "Записи" + }, + "sortTypes": { + "expiryDate": "Дата истечения", + "labelName": "Имя", + "createdAt": "Дата создания" + }, + "errors": { + "noResults": "Результаты не найдены", + "emailRequired": "Необходим email", + "emailInvalid": "Недействительный адрес электронной почты", + "invalidAddress": "Недействительный адрес", + "addressRequired": "Необходим адрес", + "indexingErrors": { + "title": "Ошибка синхронизации данных", + "message": "Эти данные могут быть устаревшими. Пожалуйста, проявляйте осторожность.", + "message_datetime": "Эти данные были обновлены в {{datetime}} и могут быть устаревшими. Пожалуйста, проявляйте осторожность." + }, + "networkError": { + "title": "Ошибка синхронизации данных", + "message": "Эти данные могут быть устаревшими. Пожалуйста, проявляйте осторожность.", + "blurb": "Эта кнопка в настоящее время отключена из-за проблем с синхронизацией данных." + }, + "networkLatency": { + "title": "Медленная синхронизация данных", + "message": "Приложение ENS испытывает замедление из-за проблем с сетевой задержкой." + } + }, + "transaction": { + "description": { + "setName": "Установить имя", + "setRecords": "Установить записи", + "test": "Тестовая транзакция", + "addSuccess": "Добавить успех", + "sendName": "Отправить имя", + "migrateProfile": "Мигрировать профиль", + "migrateProfileWithReset": "Мигрировать профиль", + "migrateProfileWithSync": "Мигрировать и обновить профиль", + "migrateProfileWithEthAddress": "Мигрировать и обновить ETH адрес", + "wrapName": "Объединить имя", + "updateResolver": "Обновить резолвер", + "updateProfile": "Обновить профиль", + "setPrimaryName": "Установить основное имя", + "resetPrimaryName": "Удалить основное имя", + "updateEthAddress": "Обновить ETH адрес", + "testSendName": "Отправить имя", + "burnFuses": "Сжечь разрешения", + "createSubname": "Создать подимя", + "deleteSubname": "Удалить подимя", + "extendNames": "Продлить имена", + "approveDnsRegistrar": "Одобрить DNS регистратор", + "claimDnsName": "Запросить DNS имя", + "importDnsName": "Импортировать DNS имя", + "commitName": "Запустить таймер", + "registerName": "Зарегистрировать имя", + "approveNameWrapper": "Одобрить NameWrapper", + "clearRecords": "Очистить записи", + "updateRecords": "Обновить записи", + "resetProfileWithRecords": "Сбросить профиль с записями", + "transferName": "Передать имя", + "transferSubname": "Передать подимя", + "changePermissions": "Изменить разрешения", + "syncManager": "Синхронизировать менеджера", + "updateProfileRecords": "Обновить профиль", + "resetProfile": "Сбросить профиль", + "unwrapName": "Развернуть имя" + }, + "info": { + "sendName": "Установить контроллера и регистранта имени", + "migrateProfile": "Установить существующие записи на новом резолвере", + "migrateProfileWithReset": "Установить существующие записи на новом резолвере", + "migrateProfileWithSync": "Установить существующие записи на новом резолвере", + "migrateProfileWithEthAddress": "Установить существующие записи и ETH адрес на новом резолвере", + "wrapName": "Объединить имя", + "updateResolver": "Изменить резолвер на", + "updateProfile": "Обновить записи на существующем резолвере", + "setPrimaryName": "Установить основное имя для вашего адреса", + "updateEthAddress": "Обновить ETH адрес на этот адрес", + "updateEthAddressOnLatestResolver": "Обновить ETH адрес на последнем резолвере", + "testSendName": "Установить контроллера и регистранта имени", + "createSubname": "Создать новое подимя на имя", + "burnFuses": "Сжечь выбранные разрешения до истечения имени", + "commitName": "Запустить таймер для регистрации имени", + "approveNameWrapper": "Одобрить NameWrapper для управления вашими именами", + "fuses": { + "revoke": "Отозвать", + "grant": "Выдать", + "setExpiry": "Установить срок действия", + "PARENT_CANNOT_CONTROL": "Отказаться от контроля родителя", + "CAN_EXTEND_EXPIRY": "Продлить срок действия", + "CANNOT_UNWRAP": "Развернуть это имя", + "CANNOT_CREATE_SUBDOMAIN": "Создать поддомены", + "CANNOT_SET_RESOLVER": "Установить резолвер", + "CANNOT_SET_TTL": "Установить TTL", + "CANNOT_TRANSFER": "Отправить это имя", + "CANNOT_BURN_FUSES": "Изменить разрешения", + "CANNOT_APPROVE": "Изменить менеджера обновлений" + } + }, + "itemLabel": { + "name": "Имя", + "address": "Адрес", + "action": "Действие", + "info": "Информация", + "to": "Кому", + "subname": "Подимя", + "duration": "Продолжительность", + "cost": "Стоимость", + "update": "Обновление", + "resolver": "Резолвер", + "records": "Записи" + }, + "itemValue": { + "records_one": "{{count}} запись", + "records_other": "{{count}} записей" + }, + "status": { + "pending": { + "regular": "В ожидании" + }, + "confirmed": { + "regular": "Подтверждено", + "notifyTitle": "Транзакция успешна", + "notifyMessage": "Ваша транзакция \"{{action}}\" была успешной" + }, + "failed": { + "regular": "Неудача", + "notifyTitle": "Сбой транзакции", + "notifyMessage": "Ваша транзакция \"{{action}}\" не удалась и была отменена" + } + }, + "dialog": { + "intro": { + "trailingButton": "Начать", + "trailingButtonResume": "Возобновить", + "step": "Шаг {{step}}" + }, + "confirm": { + "title": "Подтвердите данные", + "message": "Дважды проверьте эти данные перед подтверждением в вашем кошельке.", + "waitingForWallet": "Ожидание кошелька", + "openWallet": "Открыть кошелек" + }, + "sent": { + "title": "Транзакция отправлена", + "message": "Ваша транзакция сейчас в процессе, вы можете закрыть это окно и вернуться позже.", + "progress": { + "title": "Отправлено", + "message": "Длится дольше, чем ожидалось" + }, + "learn": "Узнать о длительных транзакциях" + }, + "complete": { + "title": "Транзакция завершена", + "message": "Ваша транзакция завершена!", + "progress": { + "title": "Готово" + } + }, + "failed": { + "title": "Транзакция не удалась", + "progress": { + "title": "Неудача" + } + }, + "error": { + "gasLimit": "Лимит газа в вашей транзакции был недостаточно высоким, пожалуйста, попробуйте снова." + } + }, + "error": { + "unknown": "Произошла неизвестная ошибка" + }, + "viewEtherscan": "Посмотреть на Etherscan", + "viewMore": "Посмотреть больше" + }, + "search": { + "label": "Поиск имени", + "placeholder": "Поиск имени", + "emptyText": "Введите имя или адрес для поиска...", + "address": "Адрес", + "errors": { + "tooShort": "Имя слишком короткое", + "invalid": "Неверный формат имени" + }, + "status": { + "registered": "Зарегистрировано", + "gracePeriod": "Проблемный период", + "premium": "Временный премиум", + "available": "Доступно", + "notOwned": "Не принадлежит", + "notImported": "Не импортировано", + "short": "Слишком короткое", + "default": "Неверно", + "invalid": "Неверно", + "unsupportedTLD": "Не поддерживается", + "imported": "Импортировано", + "owned": "Принадлежит" + } + }, + "selectableInput": { + "add": "Добавить", + "placeholder": "Выберите опцию", + "empty": "Опции не найдены" + }, + "testnetFaucet": { + "explanation": "Каждый адрес на {{ testnet }} может получить {{ amount }} {{ ticker }} для тестирования приложения ENS manager, а также для других тестов на тестовой сети.", + "note": "Может занять несколько минут, чтобы появиться в вашем кошельке." + }, + "roles": { + "owner": { + "title": "владелец", + "description": "Адрес, который владеет этим именем." + }, + "dns-owner": { + "title": "DNS владелец", + "description": "Адрес, который владеет этим именем." + }, + "parent-owner": { + "title": "Владелец родителя", + "description": "Адрес, который владеет родителем этого имени." + }, + "manager": { + "title": "менеджер", + "description": "Адрес или контракт, который может изменять профиль, настройки и менеджеров профиля." + }, + "profile-editor": { + "title": "Редактор профиля", + "description": "Адрес, который может изменять профиль." + }, + "eth-record": { + "title": "ETH запись", + "description": "Адрес, на который указывает это имя." + } + }, + "dns": { + "refresh": "Обновить DNS" + }, + "calendar": { + "pick_by_years": "Выберите по годам", + "pick_by_date": "Выберите по дате" + } +} diff --git a/public/locales/ru/dnssec.json b/public/locales/ru/dnssec.json new file mode 100644 index 000000000..537a3fce4 --- /dev/null +++ b/public/locales/ru/dnssec.json @@ -0,0 +1,98 @@ +{ + "title": "Импортировать {{name}} в ENS", + "error": { + "unknown": "Произошла неизвестная ошибка", + "noTxtRecord": "Запись не найдена", + "dnssecFailure": "DNSSEC не включен", + "invalidTxtRecord": "Найдена неверная запись", + "invalidAddressChecksum": "Адрес недействителен", + "resolutionFailure": "Предоставленная запись не разрешилась" + }, + "status": { + "checking": "Проверка...", + "error": "Произошла ошибка при проверке", + "secondsAgo": "Последняя проверка была {{count}} секунд(у) назад", + "aWhileAgo": "Последняя проверка была некоторое время назад", + "minutesAgo_one": "Последняя проверка была {{count}} минуту назад", + "minutesAgo_other": "Последняя проверка была {{count}} минуты назад" + }, + "steps": { + "selectType": { + "title": "Получить {{name}}", + "subtitle": "Импорт доменных имен позволяет использовать их в качестве ENS имен.", + "learnMore": "Узнайте больше о импорте имен", + "select": { + "heading": "Как вы хотите импортировать ваш домен?", + "offchain": { + "name": "Оффчейн", + "tag": "Бесплатно", + "description": "У вашего имени не будет токена на блокчейне.
Это не влияет на его способность получать транзакции или возможностью пользоваться им в качестве основного имени.
Вы не сможете редактировать свой профиль из ENS приложения." + }, + "onchain": { + "name": "В сети", + "description": "У вашего имени будет токен на блокчейне." + } + } + }, + "enableDnssec": { + "title": "Включить DNSSEC", + "help": { + "findOutRegistrar": "Узнайте своего регистратора" + }, + "status": { + "enabled": "DNSSEC включен для этого домена.", + "disabled": { + "heading": "Вам нужно посетить регистратора домена для включения DNSSEC.", + "message": "DNSSEC не включен", + "help": "Помощь в включении DNSSEC" + } + } + }, + "verifyOwnership": { + "title": "Подтвердить право собственности", + "status": { + "disconnected": "Подключите ваш кошелек для подтверждения права собственности.", + "mismatching": { + "heading": "Добавьте DNS запись ниже, чтобы подтвердить ваше право собственности на этот домен.", + "help": "Помощь в добавлении TXT записей", + "message": "Запись не найдена", + "error": { + "onchain": "Найденная запись не соответствует вашему подключенному адресу. Вы все равно можете импортировать это имя, но не будете его владельцем.", + "offchain": "Найденная запись не соответствует вашему подключенному адресу. Вы все равно можете импортировать это имя, но оно не будет указывать на ваш подключенный адрес и не может быть использовано в качестве основного имени." + } + }, + "matching": "Найдена запись, совпадающая с вашим подключенным адресом." + }, + "action": { + "importWithoutOwnership": "Импортировать без права собственности" + } + }, + "transaction": { + "mismatching": { + "title": "Импортировать этот домен", + "subtitle": "Ваше право собственности не было подтверждено. Вы все равно можете импортировать этот домен." + }, + "matching": { + "title": "Претендовать на ваш домен", + "subtitle": "Ваше право собственности было подтверждено." + }, + "estimatedNetworkCost": "Оценочная комиссия сети" + }, + "complete": { + "title": "Поздравляем!", + "import": { + "subtitle": "{{name}} был импортирован", + "description": "Домен был успешно импортирован в ENS. Теперь вы можете просмотреть его.", + "warning": "Безглазные DNS имена в настоящее время не отображаются в вашем списке \"Имена\"." + }, + "claim": { + "subtitle": "Теперь вы являетесь владельцем {{name}}", + "description": "Ваш домен был успешно зарегистрирован. Теперь вы можете просматривать и управлять своим именем." + }, + "action": { + "claimAnother": "Претендовать на другое", + "viewName": "Просмотреть имя" + } + } + } +} diff --git a/public/locales/ru/error.json b/public/locales/ru/error.json new file mode 100644 index 000000000..8dc9372a8 --- /dev/null +++ b/public/locales/ru/error.json @@ -0,0 +1,10 @@ +{ + "not-found": { + "title": "Не найдено", + "message": "Страница, которую вы искали, не найдена.
Вы можете поискать имя или посетить нашу поддержку для получения дополнительной помощи." + }, + "application-error": { + "title": "Ошибка приложения", + "message": "Произошла ошибка.
Если проблема повторится, пожалуйста, обратитесь в нашу поддержку для получения дополнительной помощи." + } +} diff --git a/public/locales/ru/names.json b/public/locales/ru/names.json new file mode 100644 index 000000000..069c1b589 --- /dev/null +++ b/public/locales/ru/names.json @@ -0,0 +1,19 @@ +{ + "title": "Имена", + "subtitle": { + "start": "Все имена, принадлежащие", + "this": "этому", + "your": "вашему", + "wallet": "кошельку" + }, + "empty": "Имена для этого адреса не найдены", + "sortTypes": { + "expiryDate": "Дата истечения", + "labelName": "Имя", + "createdAt": "Дата создания" + }, + "offchainWarning": { + "title": "Некоторые имена могут не отображаться", + "text": "Оффчейн-имена в настоящее время не отображаются в этом списке. Вы все равно можете просматривать их, ища их напрямую. Нажмите, чтобы узнать больше." + } +} diff --git a/public/locales/ru/profile.json b/public/locales/ru/profile.json new file mode 100644 index 000000000..66d40c415 --- /dev/null +++ b/public/locales/ru/profile.json @@ -0,0 +1,459 @@ +{ + "meta": { + "title": "{{name}} на ENS", + "description": "Профиль {{name}} на Ethereum Name Service" + }, + "title": "Профиль", + "yourWallet": "Ваш кошелек", + "yourProfile": "Ваш профиль", + "accounts": "Аккаунты", + "addresses": "Адреса", + "otherRecords": "Другие записи", + "editProfile": "Редактировать профиль", + "ownership": "Владение", + "viewDetails": "Посмотреть детали", + "banner": { + "available": { + "title": "{{name}} доступно", + "description": "Это имя истекло {{date}}. Нажмите здесь, чтобы перейти на страницу регистрации." + } + }, + "tabs": { + "profile": { + "name": "Профиль", + "actions": { + "setAsPrimaryName": { + "label": "Установить как основное имя", + "title": "Установите ваше основное имя", + "description": "Чтобы установить это имя в качестве основного, ETH-адрес должен совпадать с этим адресом." + }, + "deleteSubname": { + "label": "Удалить подимя" + }, + "extend": { + "label": "Продлить имя" + }, + "editProfile": { + "label": "Редактировать профиль" + }, + "reclaim": { + "label": "Восстановить имя", + "warning": "Это подимя истекло и не принадлежит никому. Вы можете восстановить это подимя." + } + }, + "warnings": { + "wrappedDNS": "DNS-имена могут быть восстановлены владельцем DNS в любое время. Не покупайте DNS-имена.", + "offchain": "Offchain-имена в настоящее время не отображаются в вашем списке 'Имена'. Узнать больше", + "homoglyph": "Это имя содержит не-ASCII символы. Возможно, есть символы, которые выглядят идентично или очень похожи на другие символы и могут использоваться для обмана читателей. Узнать больше о гомоглифах" + } + }, + "records": { + "name": "Записи" + }, + "ownership": { + "name": "Владение", + "warning": { + "ownerNotManager": "Вы являетесь владельцем, но не менеджером. Это может быть непреднамеренно, если вы недавно получили это имя от другого адреса.", + "managerNotParentOwner": "Владелец {{parent}} может изменить владение, роли и настройки. Он не может изменить профиль.", + "managerNotDNSOwner": "Вы менеджер, но не DNS-владелец этого имени. DNS-имена могут быть восстановлены DNS-владельцем в любое время. Вы можете отправить это имя владельцу или обновить запись DNS для совпадения.", + "dnsOwnerNotManager": "Вы не можете вносить изменения в это имя, так как вы DNS-владелец, но не менеджер. Вы можете синхронизировать менеджера, чтобы исправить это." + }, + "sections": { + "roles": { + "title": "Роли", + "addresses_one": "{{count}} адрес", + "addresses_other": "{{count}} адресов" + }, + "expiry": { + "panel": { + "expiry": { + "title": "Срок действия имени истекает" + }, + "grace-period": { + "title": "Срок льготного периода истекает", + "tooltip": "90-дневный льготный период после истечения срока, когда имя все еще можно продлить, но не пере-регистровать." + }, + "registration": { + "title": "Зарегистрировано" + }, + "parent-expiry": { + "title": "Срок действия родительского имени истекает" + }, + "parent-grace-period": { + "title": "Срок льготного периода родительского имени истекает" + } + } + }, + "contract": { + "title": "Адрес контракта", + "tooltip": "Адрес контракта, который активирует Wrapped ENS имена.", + "warning": "Некоторые приложения могут показывать адрес контракта как владельца. Это не влияет на ваше владение." + } + }, + "tooltips": { + "owner": "Владелец этого имени. Владелец не может изменить профиль.", + "owner-emancipated": "Владелец этого имени.", + "parent-owner": "Владелец родительского имени ({{parent}}).", + "dns-owner": "Владелец этого имени, установленный записями DNS. Владелец не может изменить профиль.", + "manager": "Адрес, который может изменять профиль, настройки и редакторов профиля.", + "profile-editor": "Адрес, который может изменять только профиль", + "subname-manager": "Адрес или контракт, отвечающий за продление подимен.", + "eth-record": "Адрес, который будет получать средства, отправленные на это имя в основной сети.", + "grace-period": "90-дневный льготный период после истечения срока, когда имя все еще можно продлить, но не пере-регистровать.", + "contract-address": "Адрес контракта, который активирует Wrapped ENS имена.", + "namewrapper": "Контракт, который активирует Wrapped ENS имена." + } + }, + "subnames": { + "name": "Подимена" + }, + "permissions": { + "name": "Разрешения", + "parentUnlockedWarning": "Вы не можете изменить разрешения на это имя. Сначала нужно отменить «развернуть это имя» на родительском ({{parent}}). Нажмите здесь, чтобы просмотреть разрешения родителя.", + "revokedLabel": "Отменено {{date}}", + "grantedLabel": "Предоставлено {{date}}", + "role": { + "manager": "менеджер", + "owner": "владелец", + "parent": "родитель" + }, + "ownership": { + "title": "Разрешения на владение", + "parentCanControl": { + "label": "Это имя может управляться его родителем ({{parent}})", + "list": { + "title": "Владелец родительского имени может:", + "item1": "Управлять и изменять настройки и записи", + "item2": "Возвращать или переназначать владение этим именем", + "item3": "Удалять это имя" + } + }, + "parentCannotControl": { + "label": "Это имя не может управляться его родителем ({{parent}})", + "sublabel": "Владелец родительского имени не может управлять, изменять, удалять или возвращать владение этим именем.", + "list": { + "title": "Владелец имени сохранит владение, если не произойдет одно из следующего:", + "item1": "Имя истечет {{date}} (можно продлить)", + "item2": "Родительское имя истечет {{date}}", + "item3": "Владение именем будет передано другому адресу" + } + }, + "parentCanChange": { + "label": "Родитель этого имени ({{parent}}) может изменить разрешения", + "list": { + "title": "Родитель может:", + "item1": "Отменить разрешения", + "item2": "Изменить или уничтожить пользовательские предохранители" + } + }, + "ownerCanChange": { + "label": "Владелец этого имени может изменить разрешения", + "list": { + "title": "Владелец может:", + "item1": "Отменить разрешения", + "item2": "Изменить или уничтожить пользовательские предохранители" + } + }, + "ownerCannotChange": { + "label": "Владелец этого имени не может изменить разрешения", + "list": { + "title": "Владелец не может:", + "item1": "Отменить разрешения", + "item2": "Изменить или уничтожить пользовательские предохранители" + } + }, + "unwrapWarning": { + "message": "Разрешения на развертывание должны быть отменены на родителе ({{parent}}), прежде чем отказаться от контроля родителя.
Перейти к разрешениям родителя" + }, + "action": { + "giveUpControl": "Отказаться от контроля родителя", + "revokePermission": "Отменить разрешение" + } + }, + "expiry": { + "permissions": { + "canExtendExpiry": { + "label": "Может продлить срок действия", + "description": "Разрешение на срок действия этого имени может быть продлено {{managerOrOwner}}.", + "description_date": "Разрешение на срок действия этого имени ({{date}}) может быть продлено {{managerOrOwner}}." + }, + "cannotExtendExpiry": { + "label": "Не может продлить срок действия", + "description": "Разрешение на срок действия этого имени не может быть продлено менеджером.", + "description_date": "Разрешение на срок действия этого имени ({{date}}) не может быть продлено менеджером." + } + }, + "manager": "менеджер", + "owner": "владелец", + "action": { + "changePermissions": "Изменить разрешения" + } + }, + "nameChangePermissions": { + "title": "Разрешения на изменение имени", + "subtitle": { + "parent-can-change": "Родитель этого имени ({{parent}}) может изменять настройки этого имени.", + "owner-can-change": "Владелец этого имени может изменять настройки этого имени." + }, + "permissions": { + "canUnwrap": { + "label": "Может развернуть это имя", + "description": "{{owner}} этого имени может развернуть это имя." + }, + "cannotUnwrap": { + "label": "Не может развернуть это имя", + "description": "{{owner}} этого имени не может развернуть это имя." + }, + "canCreateSubnames": { + "label": "Может создавать подимена", + "description": "{{owner}} этого имени может создавать новые подимена." + }, + "cannotCreateSubnames": { + "label": "Не может создавать подимена", + "description": "{{owner}} этого имени не может создавать новые подимена." + }, + "canSend": { + "label": "Может отправить это имя", + "description": "{{owner}} этого имени может отправить его новому владельцу." + }, + "cannotSend": { + "label": "Не может отправить это имя", + "description": "{{owner}} этого имени не может отправить его новому владельцу." + }, + "canSetResolver": { + "label": "Может установить резольвер", + "description": "{{owner}} этого имени может установить и изменить резольвер." + }, + "cannotSetResolver": { + "label": "Не может установить резольвер", + "description": "{{owner}} этого имени не может установить и изменить резольвер." + }, + "canSetTTL": { + "label": "Может установить TTL", + "description": "{{owner}} этого имени может установить и изменить TTL." + }, + "cannotSetTTL": { + "label": "Не может установить TTL", + "description": "{{owner}} этого имени не может установить и изменить TTL." + }, + "canApprove": { + "label": "Может изменить менеджера по продлению", + "description": "Владелец этого имени может изменить менеджера, утвержденного для продления подимен." + }, + "cannotApprove": { + "label": "Не может изменить менеджера по продлению", + "description": "Владелец этого имени не может изменить менеджера, утвержденного для продления подимен." + } + }, + "action": { + "changePermissions": "Изменить разрешения" + } + } + }, + "fuses": { + "name": "Предохранители" + }, + "more": { + "name": "Дополнительно", + "resolver": { + "label": "Резольвер", + "custom": "Пользовательский", + "latest": "Последняя версия", + "outdated": "Устаревшая", + "wildcard": "Шаблон", + "version": "Версия", + "etherscan": "Etherscan" + }, + "fuses": { + "label": "Предохранители", + "info": "Вы должны сжечь 'Может развернуть', чтобы сжечь другие предохранители", + "callToAction": "Пожалуйста, оберните ваше имя, чтобы разблокировать эту функцию", + "burnFormTitle": "Сжечь разрешения", + "burned": "Сожжено", + "permissions": { + "label": "Разрешения", + "warning": "Предохранители могут быть изменены родителем", + "CAN_DO_EVERYTHING": "Может делать всё", + "CANNOT_BURN_FUSES": "Не может сжигать предохранители", + "CANNOT_CREATE_SUBDOMAIN": "Не может создавать поддомены", + "CANNOT_SET_RESOLVER": "Не может устанавливать резольвер", + "CANNOT_SET_TTL": "Не может устанавливать TTL", + "CANNOT_TRANSFER": "Не может передавать", + "CANNOT_UNWRAP": "Не может разворачивать", + "PARENT_CANNOT_CONTROL": "Родитель может управлять", + "CAN_EXTEND_EXPIRY": "Не может продлить срок действия", + "IS_DOT_ETH": "Не является .eth" + } + }, + "ownership": { + "label": "Владение", + "refreshDNS": "Обновить DNS", + "dnsOwnerWarning": { + "isDnsOwner": "Вы не можете вносить изменения в это имя, так как вы DNS Владелец, а не Менеджер. Вы можете синхронизировать менеджера, чтобы исправить это.", + "isManager": "Вы Менеджер, но не DNS Владелец этого имени. DNS имена могут быть восстановлены DNS Владельцем в любое время. Вы можете передать это имя Владельцу или обновить DNS запись.", + "refreshDNS": "Обновить DNS", + "syncManager": "Синхронизировать менеджера" + } + }, + "token": { + "label": "Токен", + "noToken": "Нет токена", + "hex": "шестнадцатеричный", + "decimal": "десятичный", + "wrapper": "обертка", + "wrapName": "Обернуть имя", + "unwrap": "Развернуть", + "status": { + "unwrapped": "развернуто", + "wrapped": "обернуто", + "emancipated": "обернуто, освобождено", + "locked": "обернуто, заблокировано" + } + }, + "misc": { + "registered": "Зарегистрировано", + "expires": "Истекает", + "bankless": { + "title": "Напоминания от Bankless", + "enterEmail": "Получайте напоминания от Bankless по электронной почте, PUSH, XMTP, Blockscan Chat и Mailchain.", + "emailConfirmation": "Вы почти закончили. Пожалуйста, проверьте вашу почту, чтобы подтвердить подписку.", + "submitError": "Ошибка отправки. Пожалуйста, попробуйте снова." + }, + "reminderOptions": { + "google": "Календарь Google", + "outlook": "Календарь Outlook", + "office365": "Календарь Office 365", + "yahoo": "Календарь Yahoo", + "ical": "Скачать iCal (.ics)", + "bankless": "Напоминания от Bankless" + } + } + } + }, + "details": { + "title": "Детали имени", + "notWrapped": "Не обернуто", + "sendName": { + "title": "Передать имя", + "description": "Передача имени предоставит новому адресу контроль над ним", + "learnMore": "Узнайте больше о праве собственности на имя.", + "makeOwner": "Сделать владельцем", + "makeOwnerDescription": "Владелец может передавать имя новому владельцу и изменять менеджера", + "makeManager": "Сделать менеджером", + "makeManagerDescription": "Менеджер может изменять и устанавливать записи.", + "inputPlaceholder": "Введите адрес Ethereum или ENS имя", + "transferSubname": "Передать имя", + "transferController": "Передать контроль" + }, + "wrap": { + "startTitle": "Обновите ваше имя", + "resumeTitle": "Возобновите обновление", + "completeTitle": "Обновление завершено", + "description": "Обновление или \"упаковка\" вашего имени предоставляет ему новые функции.", + "startLabel": "Обновить", + "resumeLabel": "Возобновить обновление", + "boxTitle": "Разблокируйте новые функции", + "boxDescription": "Обновление вашего имени открывает последние функции ENS" + }, + "descriptions": { + "owner": "Владеет и управляет именем", + "controller": "Управляет всеми записями имени", + "registrant": "Владелец NFT", + "dnsOwner": "Владелец DNS имени" + }, + "tabs": { + "records": { + "label": "Записи", + "text": "Текст", + "contentHash": "Хеш контента", + "noContentHash": "Хеша контента нет", + "editRecords": "Изменить записи", + "noAbi": "Нет ABI", + "abi": "ABI", + "editRecordsDisabled": "Текущий резольвер несовместим с упакованными именами" + }, + "subnames": { + "label": "Поддомены", + "loading": "Загрузка поддоменов", + "empty": "Поддомены не добавлены", + "noResults": "Нет результатов", + "noMoreResults": "Больше нет результатов", + "addSubname": { + "title": "Поддомены позволяют создавать дополнительные имена на основе вашего существующего имени.", + "learn": "Узнать о поддоменах", + "action": "Новый поддомен", + "dialog": { + "title": "Создать поддомен", + "error": { + "invalidCharacters": "Содержит недопустимые символы", + "mustUseLowercase": "Должны использоваться только строчные буквы", + "alreadyExists": "Имя уже существует", + "nameTooLong": "Имя слишком длинное", + "pccBurned": "Имя заблокировано до {{date}}" + } + } + } + } + } + }, + "advancedEditor": { + "title": "Записи {{name}}", + "tabs": { + "text": { + "label": "Текст", + "addRecord": "Добавить запись", + "createRecord": "Введите название записи...", + "placeholder": { + "default": "Добавьте значение сюда..." + } + }, + "address": { + "label": "Адрес", + "addRecord": "Добавить адрес", + "noOptions": "Нет доступных вариантов адреса", + "placeholder": { + "default": "Добавьте адрес сюда..." + } + }, + "other": { + "label": "Другие", + "labelDisabled": "Не поддерживается текущим резольвером", + "contentHash": { + "label": "Хеш контента", + "placeholder": "например, ipfs://" + }, + "publicKey": { + "label": "Публичный ключ", + "placeholder": "например, pub_1231231231231" + }, + "abi": { + "label": "ABI", + "placeholder": "Введите ABI сюда..." + } + } + } + }, + "errors": { + "invalidName": "Это имя недействительно.", + "invalidAddress": "Недопустимый адрес", + "expiringSoon": "Грейс-период для этого имени заканчивается {{date}}. Если до этой даты не продлить, имя станет доступным для регистрации.", + "hasExpired": "{{ name }} истек", + "ownerManagerChoice": "Необходимо передать владельца или менеджера", + "unknown": "Неизвестная ошибка", + "notMigrated": "Это имя не мигрировало в новый реестр.", + "featureNotAvailable": "Некоторые функции пока недоступны, но вы все равно можете ", + "featureNotAvailableLink": "просмотреть это имя в старом приложении.", + "migrationNotAvailable": "Миграция в новый реестр пока недоступна, но вы все равно можете ", + "migrationNotAvailableLink": "мигрировать это имя в старом приложении.", + "addressLength": "Если адрес, он должен содержать 42 символа", + "unsupportedTLD": "Этот TLD не поддерживается", + "keyInUse": "{{value}} уже используется", + "hasSubnames": "У этого имени есть поддомены", + "permissionRevoked": "Это имя отозвало разрешения, необходимые для выполнения этого действия.", + "gracePeriod": "Это не может быть выполнено, так как имя истекло", + "default": "Это действие недоступно", + "invalidJSON": "Недействительный JSON", + "isOwnerCannotEdit": "Вы должны быть менеджером, чтобы редактировать профиль", + "cannotEdit": "У вас нет разрешения для обновления до авторизованного резольвера" + } +} diff --git a/public/locales/ru/register.json b/public/locales/ru/register.json new file mode 100644 index 000000000..8f99b31e4 --- /dev/null +++ b/public/locales/ru/register.json @@ -0,0 +1,197 @@ +{ + "title": "Зарегистрируйте {{name}} на ENS", + "subtitle": "Регистрация", + "heading": "Зарегистрировать {{name}}", + "invoice": { + "timeRegistration": "{{time}} регистрация", + "registration": "Регистрация", + "estimatedNetworkFee": "Оценочная комиссия сети", + "networkFee": "Комиссия сети", + "temporaryPremium": "Временная премия", + "total": "Оценочная общая сумма", + "totalPaid": "Всего оплачено" + }, + "error": { + "nameTooLong": "Имя, которое вы хотите зарегистрировать, слишком длинное. Пожалуйста, выберите более короткое имя." + }, + "steps": { + "pricing": { + "insufficientBalance": "Недостаточно средств", + "multipleYearsMessage": "Продление на несколько лет позволит сэкономить на комиссии блокчейна, избегая ежегодных транзакций.", + "primaryName": "Использовать как основное имя", + "primaryNameMessage": "Это связывает ваш адрес с этим именем, позволяя dApp отображать его как ваш профиль при подключении к ним. У вас может быть только одно основное имя на адрес.", + "premium": { + "heading": "Это имя имеет временную премию", + "subheading": "Чтобы предоставить справедливую возможность недавно истекшим именам, премия начинается с $100,000,000 и уменьшается до $0 за 21 день. Вы можете рассчитать премию на указанную дату ниже.", + "targetPrice": "Целевая цена", + "targetDate": "Целевая дата", + "timezone": "Дата и время отображаются в местной временной зоне ({{timezone}})" + } + }, + "profile": { + "title": "Создание профиля", + "title2": "Редактировать профиль", + "default": "По умолчанию", + "advanced": "Расширенные", + "permissions": "Разрешения", + "resolver": "Разрешатель", + "visibilityMessage": "Ваша информация профиля будет сохранена в блокчейне. Все, что вы добавите, будет публично доступно.", + "addProfile": "Добавить поля профиля", + "addMore": "Добавить больше в профиль", + "options": { + "groups": { + "general": { + "label": "Общие", + "items": { + "name": "Никнейм", + "url": "Вебсайт", + "location": "Местоположение", + "description": "Краткая биография" + }, + "placeholder": { + "name": "Иван Иванов", + "url": "https://ens.domains", + "location": "Метавселенная", + "description": "Я фермер из села в Теннесси." + } + }, + "social": { + "label": "Социальные сети", + "items": { + "com.twitter": "Twitter", + "com.github": "GitHub", + "com.discord": "Discord", + "org.telegram": "Telegram", + "email": "Email" + }, + "placeholder": { + "com.twitter": "например, ensdomains", + "com.github": "например, ensdomains", + "com.discord": "например, nickjohnson", + "org.telegram": "например, nicksdjohnson", + "email": "например, hello@example.com" + } + }, + "address": { + "label": "Адрес", + "itemLabel": "{{coin}} адрес", + "placeholder": { + "default": "Добавьте адрес здесь", + "eth": "0xb8c2C2...", + "btc": "3FZbgi29...", + "sol": "D4kA7VzHnmV...", + "op": "0xb8c2C2...", + "arb1": "0xb8c2C2...", + "base": "0xb8c2C2...", + "matic": "0xb8c2C2..." + } + }, + "website": { + "label": "Вебсайт", + "items": { + "ipfs": "IPFS", + "ipns": "IPNS", + "swarm": "Swarm", + "onion": "Onion", + "skynet": "Skynet", + "arweave": "Arweave" + }, + "placeholder": { + "default": "Добавьте URL здесь", + "ipfs": "ipfs://...", + "skynet": "sia://...", + "arweave": "ar://...", + "swarm": "bzz://...", + "onion": "onion3://..." + } + }, + "other": { + "label": "Другие", + "items": { + "contentHash": "Хэш контента", + "publicKey": "Публичный ключ", + "abi": "ABI", + "custom": "Пользовательский" + } + }, + "custom": { + "key": "Ключ", + "value": "Значение" + }, + "default": { + "placeholder": "Добавьте значение здесь" + } + } + }, + "errors": { + "labelRequired": "Требуется ключ записи", + "duplicateRecord": "Повторяющийся ключ записи", + "avatarReserved": "Ключ используется менеджером аватаров", + "invalidValue": "Неверное значение" + }, + "confirmations": { + "publicNotice": { + "title": "Ваши данные публичны", + "description": "Все, что вы добавите в свой профиль, будет публично доступно в блокчейне.", + "confirm": "Я понимаю", + "decline": "Назад" + }, + "clearEth": { + "title": "Очистить ETH адрес?", + "description": "Без установленного ETH адреса люди не смогут отправлять деньги на это имя. Это можно обновить позже.", + "confirm": "Очистить", + "decline": "Отмена" + } + }, + "actions": { + "skipProfile": "Пропустить профиль" + } + }, + "complete": { + "heading": "Поздравляем!", + "subheading": "Теперь вы являетесь владельцем ", + "description": "Ваше имя было успешно зарегистрировано. Теперь вы можете просматривать и управлять своим именем.", + "registerAnother": "Зарегистрировать другое", + "viewName": "Просмотреть имя" + }, + "info": { + "heading": "Прежде чем начать", + "subheading": "Регистрация вашего имени занимает три шага", + "ethItems": [ + "Завершите транзакцию, чтобы начать таймер", + "Подождите 60 секунд, пока таймер завершится", + "Завершите вторую транзакцию, чтобы обеспечить ваше имя" + ], + "moonpayItems": [ + "Создайте или войдите в существующую учетную запись MoonPay", + "Используйте свою кредитную или дебетовую карту для завершения одной транзакции" + ], + "setupProfile": "Я хочу сначала настроить свой профиль", + "paymentMethod": "Метод оплаты", + "notEnoughEth": "Недостаточно ETH в кошельке", + "creditOrDebit": "Кредитная или дебетовая карта", + "additionalFee": "Дополнительная плата за обработку", + "pendingMoonpayTransaction": "Ваша транзакция MoonPay обрабатывается. Это может занять до двух минут. Вы можете проверить свой прогресс из подтверждающего письма, которое вы получили.", + "failedMoonpayTransaction": "Ваша транзакция MoonPay не удалась. Пожалуйста, попробуйте снова или выберите метод оплаты 'Ethereum'.", + "ethereum": "Ethereum", + "processing": "Обработка", + "poweredBy": "Работает на", + "moonpayModalHeader": "Оформление MoonPay", + "moonpayTestCard": "Данные тестовой карты" + }, + "transactions": { + "heading": "Почти готово", + "subheading": "Вам нужно будет завершить две транзакции, чтобы обеспечить ваше имя. Вторую транзакцию необходимо завершить в течение 24 часов после первой.", + "startTimer": "Запустить таймер", + "wait": "Подождите", + "transactionFailed": "Транзакция не удалась", + "transactionProgress": "Транзакция в процессе" + }, + "cancelRegistration": { + "heading": "Вы потеряете вашу транзакцию", + "contentOne": "Возврат приведет к сбросу вашей первой транзакции. Если вы вернетесь, вам нужно будет завершить транзакцию снова и оплатить связанные с этим сборы.", + "contentTwo": "Вы уверены, что хотите продолжить?", + "footer": "Сбросить транзакцию и вернуться" + } + } +} diff --git a/public/locales/ru/settings.json b/public/locales/ru/settings.json new file mode 100644 index 000000000..381ed65b5 --- /dev/null +++ b/public/locales/ru/settings.json @@ -0,0 +1,22 @@ +{ + "title": "Настройки", + "section": { + "wallet": { + "title": "Кошелек" + }, + "transaction": { + "title": "Транзакции", + "noRecentTransactions": "Нет недавних транзакций", + "clearTransactions": { + "title": "Очистить историю транзакций", + "description": "Очистка истории транзакций навсегда удалит их из приложения ENS. Ваши транзакции по-прежнему будут видны на блокчейне.", + "actionLabel": "Очистить историю" + } + }, + "primary": { + "title": "Основное имя", + "noNameDescription": "Основное имя связывает ваш адрес с именем, позволяя dApps отображать имя в качестве вашего профиля при подключении к ним. Узнайте о основных именах", + "choosePrimaryName": "Выбрать основное имя" + } + } +} diff --git a/public/locales/ru/transactionFlow.json b/public/locales/ru/transactionFlow.json new file mode 100644 index 000000000..e156466f7 --- /dev/null +++ b/public/locales/ru/transactionFlow.json @@ -0,0 +1,446 @@ +{ + "input": { + "profileEditor": { + "tabs": { + "avatar": { + "change": "Изменить аватар", + "label": "Аватар", + "dropdown": { + "selectNFT": "Выбрать NFT", + "uploadImage": "Загрузить изображение", + "enterManually": "Ввести вручную" + }, + "nft": { + "title": "Выберите NFT", + "searchPlaceholder": "Поиск NFT", + "loading": "Загрузка ваших NFT", + "unknown": "Неизвестный NFT", + "loadError": "NFT не может быть загружен", + "noNFTs": "NFT не найдены для этого адреса.", + "selected": { + "title": "Выбранный NFT", + "subtitle": "Вы уверены, что хотите использовать этот NFT?" + }, + "noResults": "Результаты не найдены." + }, + "image": { + "title": "Редактировать изображение", + "upload": { + "title": "Загрузить аватар", + "subtitle": "Вам нужно подписать сообщение, чтобы загрузить аватар. Это не будет стоить ничего.", + "action": "Подписать и загрузить" + } + } + }, + "general": { + "label": "Общие", + "name": { + "label": "Псевдоним", + "placeholder": "Иван Иванов" + }, + "url": { + "label": "Вебсайт", + "placeholder": "https://ens.domains" + }, + "location": { + "label": "Местоположение", + "placeholder": "Метавселенная" + }, + "description": { + "label": "Краткая биография", + "placeholder": "Я фермер с доходов из сельской Теннесси." + } + }, + "accounts": { + "label": "Учетные записи", + "addAccount": "Добавить учетную запись", + "noOptions": "Нет доступных опций учетных записей", + "placeholder": { + "default": "Добавьте имя пользователя здесь", + "com.twitter": "например, nicksdjohnson", + "com.github": "например, arachnid", + "com.discord": "например, nickjohnson", + "org.telegram": "например, nicksdjohnson", + "email": "например, hello@example.com" + } + }, + "address": { + "label": "Адрес", + "addAddress": "Добавить адрес", + "noOptions": "Нет доступных опций адресов", + "placeholder": { + "default": "Добавьте адрес здесь", + "eth": "0xD9hbQK...", + "bnb": "0xD9hbQK...", + "btc": "3FZbgi29...", + "ltc": "3FZbgi29...", + "sol": "D4kA7VzHnmV...", + "dot": "1D4kA7VxH...", + "doge": "DFabcd12..." + } + }, + "contentHash": { + "label": "Вебсайт", + "addContentHash": "Добавить децентрализованный вебсайт", + "placeholder": { + "default": "Добавьте URL здесь", + "ipfs": "ipfs://...", + "skynet": "sia://...", + "arweave": "ar://...", + "swarm": "bzz://...", + "onion": "onion3://..." + } + }, + "other": { + "label": "Другие", + "addRecord": "Добавить запись", + "createRecord": "Введите название записи...", + "placeholder": { + "default": "Добавьте значение здесь..." + } + } + }, + "warningOverlay": { + "action": { + "learnMoreResolvers": "Узнать больше о разрешателях", + "updateResolver": "Обновить разрешатель", + "setResolver": "Установить разрешатель", + "ignoreUpdate": "Игнорировать это и продолжить использовать текущий разрешатель. Вам снова будет предложено это в следующий раз." + }, + "invalidResolver": { + "title": "Неавторизованный разрешатель", + "subtitle": "У вас нет разрешения на установку записей для этого разрешателя. Вам нужно будет обновить разрешатель до последней версии, чтобы редактировать свой профиль.", + "action": "Обновить разрешатель" + }, + "migrateProfileSelector": { + "title": "Профиль", + "subtitle": "Записи профиля на каждом разрешателе не совпадают. Какой набор записей вы хотите использовать?", + "option": { + "latest": "Записи профиля на новом разрешателе", + "current": "Текущие записи профиля", + "reset": "Сбросить профиль", + "resetSubtitle": "Удалить все записи профиля" + } + }, + "migrateProfileWarning": { + "title": "Миграция профиля", + "subtitle": "Вы мигрируете записи своего профиля на последний разрешатель. Это навсегда удалит все существующие записи на последнем разрешателе и заменит их вашими текущими записями." + }, + "migrateRegistry": { + "title": "Реестр устарел", + "subtitle": "Вам нужно будет мигрировать реестр перед тем, как вносить изменения в это имя.", + "action": "Мигрировать" + }, + "noResolver": { + "title": "Разрешатель не установлен", + "subtitle": "Разрешатель должен быть установлен перед редактированием вашего профиля.", + "action": "Обновить" + }, + "resetProfile": { + "title": "Сброс профиля", + "subtitle": "Вы сбрасываете записи профиля. Вы потеряете всю существующую информацию о профиле, такую как ETH адрес, аватар и записи социальных сетей. Эти данные можно будет добавить снова, отредактировав профиль." + }, + "resolverNotNameWrapperAware": { + "title": "Разрешатель несовместим", + "subtitle": "Ваш текущий разрешатель несовместим с обернутыми именами. Вам нужно будет обновить разрешатель перед редактированием профиля.", + "toggle": { + "title": "Передать текущий профиль", + "subtitle": "Если отключить это, будет обновлен только ваш разрешатель." + } + }, + "resolverOutOfDate": { + "title": "Разрешатель устарел", + "subtitle": "Разрешатель устарел. Рекомендуется обновить его перед редактированием профиля." + }, + "resolverOutOfSync": { + "title": "Разрешатель несинхронизирован", + "subtitle": "Вы не используете последний публичный разрешатель, но у вас есть записи профиля, хранящиеся там. Рекомендуется переключиться на последний публичный разрешатель перед редактированием профиля." + }, + "transferOrResetProfile": { + "title": "Профиль", + "subtitle": "Вы можете передать свой текущий профиль новому разрешателю перед обновлением разрешателя.", + "toggle": { + "title": "Передать текущий профиль", + "subtitle": "Если отключить это, будет обновлен только ваш разрешатель." + } + }, + "updateResolverOrResetProfile": { + "title": "Профиль", + "subtitle": "Вы можете сохранить свой текущий профиль на новом разрешателе или сбросить его и удалить все записи профиля.", + "toggle": { + "title": "Сохранить текущий профиль", + "subtitle": "Если отключить это, ваш профиль будет сброшен." + } + }, + "links": { + "learnMoreResolvers": "Узнать больше о разрешателях" + } + }, + "intro": { + "resetProfile": { + "title": "Сброс профиля", + "description": "Это удалит все записи профиля с последнего разрешателя и затем обновит разрешатель." + }, + "migrateProfile": { + "title": "Миграция профиля", + "description": "Это мигрирует ваши текущие записи профиля на последний разрешатель." + }, + "migrateCurrentProfile": { + "title": "Миграция профиля", + "description": "Это мигрирует ваши текущие записи профиля на последний разрешатель." + } + } + }, + "editResolver": { + "title": "Редактировать разрешатель", + "latestLabel": "Использовать последний разрешатель", + "etherscan": "Etherscan", + "latestMessage": "Вы используете последний разрешатель", + "customLabel": "Пользовательский разрешатель", + "customPlaceholder": "Введите адрес пользовательского разрешателя" + }, + "editRoles": { + "views": { + "main": { + "title": "Редактировать роли", + "noneSet": "Роли не установлены" + }, + "editRole": { + "title": "Изменить {{role}}", + "views": { + "intro": { + "current": "Текущий {{role}}" + } + } + } + } + }, + "extendNames": { + "title_one": "Продлить имя", + "title_other": "Продлить {{count}} имена", + "ownershipWarning": { + "title_one": "Вы не владеете этим именем", + "title_other": "Вы не владеете всеми этими именами", + "description_one": "Продление этого имени увеличит срок регистрации текущего владельца. Это не даст вам права собственности на него.", + "description_other": "Продление этих имен увеличит срок регистрации текущего владельца. Это не даст вам права собственности, если вы уже не являетесь владельцем." + }, + "invoice": { + "extension": "{{time}} продление", + "transaction": "Комиссия за транзакцию", + "total": "Оценочная сумма" + }, + "bannerMsg": "Продление на несколько лет позволит сэкономить на сетевых расходах, избегая ежегодных транзакций.", + "gasLimitError": "Недостаточно средств" + }, + "transferProfile": { + "title": "Передача профиля", + "message1": "Перед обновлением вы можете передать свой текущий профиль, если хотите, в противном случае он будет сброшен при обновлении.", + "message2": "Хотите ли вы передать свой текущий профиль?" + }, + "revokePermissions": { + "views": { + "revokeWarning": { + "title": "Это приведет к постоянным изменениям", + "subtitle": "Разрешения являются расширенной функцией, которая вносит постоянные изменения в ваше имя. Вы не сможете отменить эти изменения, и они будут сброшены только при истечении срока действия имени.", + "subtitle2": "Убедитесь, что вы уверены в использовании этой функции перед продолжением. Узнать больше о разрешениях" + }, + "revokePCC": { + "title": "Отказаться от права собственности", + "subtitle": "Это передаст право собственности на это имя управляющему ({{account}}). Если вы не являетесь управляющим, вы больше не сможете вносить изменения в это имя." + }, + "grantExtendExpiry": { + "title": "Изменить разрешения", + "fuses": { + "CAN_EXTEND_EXPIRY": "Предоставить разрешение на: Продление срока действия" + } + }, + "setExpiry": { + "title": "Установить срок действия имени", + "subtitle": "Установите дату, когда истекут разрешения. Эта дата не может быть позже срока действия родительского имени ({{parent}}).", + "subtitleWithCEE": "Установите дату, когда это имя истечет. Это заменит текущий срок действия разрешений ({{expiry}}) и не может быть позже срока действия родительского имени ({{parent}}).", + "options": { + "max": "Макс.", + "custom": "Выбрать более раннюю дату" + }, + "error": { + "required": "Дата обязательна, если выбрана пользовательская дата", + "min": "Дата должна быть позже {{date}}", + "max": "Дата должна быть раньше {{date}}" + } + }, + "revokeAdditional": { + "title": "Отозвать разрешения", + "subtitle": "Хотите ли вы отозвать разрешения на это имя перед тем, как отказаться от права собственности? Это можно сделать только сейчас.", + "action": { + "title": "Отозвать дополнительные разрешения", + "description": "Если вы не являетесь управляющим, вы не сможете отозвать дополнительные разрешения после этого." + } + }, + "revokeUnwrap": { + "title": "Отозвать разрешения", + "subtitle": "Вы обязаны отозвать это разрешение перед тем, как другие могут быть отозваны. Это предотвращает удаление разрешений.", + "fuses": { + "CANNOT_UNWRAP": "Отозвать разрешение на: Развернуть это имя" + } + }, + "revokePermissions": { + "title": "Отозвать разрешения", + "unwrapSubtitle": "Выберите это, чтобы включить другие", + "fuses": { + "CAN_EXTEND_EXPIRY": "Предоставить разрешение на: Продление срока действия.", + "CANNOT_UNWRAP": "Отозвать разрешение на: Развернуть это имя", + "CANNOT_CREATE_SUBDOMAIN": "Отозвать разрешение на: Создание подсайтов", + "CANNOT_TRANSFER": "Отозвать разрешение на: Передачу этого имени", + "CANNOT_SET_RESOLVER": "Отозвать разрешение на: Установку разрешателя", + "CANNOT_SET_TTL": "Отозвать разрешение на: Установку TTL", + "CANNOT_BURN_FUSES": "Отозвать разрешение на: Изменение разрешений", + "CANNOT_APPROVE": "Отозвать разрешение на: Изменение управляющего по обновлению" + } + }, + "revokeChangeFuses": { + "title": "Отозвать разрешения", + "subtitle": "Отзывая это разрешение, вы навсегда теряете возможность изменять оставшиеся предохранители. Это будет сброшено только при истечении срока действия имени.", + "fuses": { + "CANNOT_BURN_FUSES": "Отозвать разрешение на: Изменение разрешений" + } + }, + "revokeChangeFusesWarning": { + "title": "Оставшиеся разрешения будут заблокированы", + "subtitle": "Разрешения и пользовательские предохранители будут навсегда заблокированы в текущем состоянии после отзыва разрешения «изменение разрешений». Это будет сброшено только при истечении срока действия имени." + }, + "lastWarning": { + "title": "Вы уверены?", + "subtitle": "Вы вносите изменения, которые можно отменить только после истечения срока действия имени ({{date}}).", + "message": "Пожалуйста, введите ваше ENS имя ({{name}}), чтобы подтвердить." + } + }, + "action": { + "revoke": "Отозвать" + } + }, + "unknownLabels": { + "title": "Подтвердите ваше имя", + "subtitle": "Некоторые из меток в вашем имени неизвестны. Пожалуйста, введите их для продолжения." + }, + "deleteEmancipatedSubnameWarning": { + "title": "Это подимя не может быть воссоздано", + "message": "Удаление этого подимени предотвратит его использование или воссоздание до тех пор, пока он не истечет {{date}}. Это невозможно отменить, поскольку права управления родительским именем были отозваны." + }, + "deleteSubnameNotParentWarning": { + "title": "Вы не можете воссоздать это подимя", + "message": "Только {{ownershipTerm}} родительского имени ({{parentOwner}}) может воссоздать это подимя. Вы не сможете воссоздать это имя самостоятельно после его удаления." + }, + "selectPrimaryName": { + "title": "Выберите основное имя", + "errors": { + "noNamesFound": "Имена не найдены", + "noEligibleNames": "Подходящих имен нет" + } + }, + "resetPrimaryName": { + "title": "Удалить основное имя", + "description": "Это имя больше не будет отображаться как имя для этого адреса. Тем не менее, транзакции к этому имени по-прежнему будут разрешаться на этот адрес, если вы не удалите запись ETH." + }, + "sendName": { + "views": { + "error": { + "title": "Невозможно отправить имя", + "description": "У вас нет разрешения отправить это имя." + }, + "search": { + "placeholder": "ENS имя или Ethereum адрес", + "views": { + "error": { + "message": "Что-то пошло не так. Пожалуйста, попробуйте снова." + }, + "intro": { + "message": "Поиск ENS имени или ETH адреса" + }, + "noResults": { + "message": "Результаты не найдены" + } + } + }, + "summary": { + "title": "Отправить имя", + "fields": { + "name": { + "label": "Имя", + "expires": "Истекает {{date}}" + }, + "recipient": "Получатель", + "options": { + "label": "Опции", + "title": "Сбросить профиль", + "description": "Удалить все записи профиля. Это требует дополнительных затрат на газ." + }, + "summary": { + "title": "Итог изменений", + "updates": { + "role": "Обновить роль {{role}} на {{address}}", + "eth-record": "Обновить запись ETH на {{address}}" + }, + "remove": { + "profile": "Удалить записи профиля" + } + } + } + }, + "confirmation": { + "title": "Отправка имени", + "description": "Отправка этого имени передаст права собственности получателю, предоставив ему ваш контроль.", + "warning": "Вы потеряете возможность изменять, получать платежи или использовать его в качестве основного имени.", + "learnMore": "Узнать о передаче имен" + } + } + }, + "syncManager": { + "title": "Синхронизация управляющего", + "description": "Синхронизация управляющего сделает вас новым управляющим этого имени. Текущий управляющий ({{manager}}) больше не сможет вносить изменения.", + "warning": "Синхронизация управляющего также развернет это имя. Это сожжет NFT и сбросит все разрешения." + } + }, + "transaction": { + "extendNames": { + "actionValue": "Продлить регистрацию", + "costValue": "{{value}} + комиссии", + "warning": "Продление этого имени не даст вам права собственности на него" + }, + "deleteSubname": { + "warning": "Привет там" + } + }, + "intro": { + "migrateAndUpdateResolver": { + "title": "Требуется действие", + "heading": "Изменения, которые вы хотите сохранить в вашем профиле, требуют обновления вашего разрешателя.", + "link": "Узнайте больше о обновлении разрешателей", + "warning": "Обратите внимание, что если вы отмените это на любом этапе, ваши изменения не будут сохранены." + }, + "syncManager": { + "description": "Синхронизация управляющего сделает вас новым управляющим этого имени. Текущий управляющий ({{manager}}) больше не сможет вносить изменения.", + "wrappedWarning": "Синхронизация управляющего также развернет это имя. Это сожжет NFT и сбросит все разрешения." + }, + "selectPrimaryName": { + "updateEthAddress": { + "title": "Обновить ETH адрес", + "description": "ETH адрес для этого имени не соответствует этому кошельку. Чтобы использовать это имя в качестве основного, вам сначала нужно обновить ETH адрес." + }, + "noResolver": { + "title": "Разрешатель не установлен", + "description": "Чтобы использовать это имя в качестве основного, вам сначала нужно установить разрешатель и обновить ETH адрес." + }, + "invalidResolver": { + "title": "Установлен неавторизованный разрешатель", + "description": "Чтобы использовать это имя в качестве основного, вам сначала нужно установить действительный разрешатель и обновить ETH адрес." + } + }, + "multiStepSubnameDelete": { + "title": "Удалить подимя", + "description": "Удаление этого подимени требует нескольких транзакций" + } + }, + "errors": { + "duplicateKey": "{{value}} — это дублирующийся ключ" + } +} diff --git a/public/locales/uk/address.json b/public/locales/uk/address.json new file mode 100644 index 000000000..0b3b43e8f --- /dev/null +++ b/public/locales/uk/address.json @@ -0,0 +1,18 @@ +{ + "meta": { + "title": "{{address}} на ENS", + "description": "Усі імена для {{address}} на Ethereum Name Service" + }, + "addressDetails": "Деталі адреси", + "nameCount": "{{count}} імен", + "filter": "Фільтр", + "view": "Перегляд", + "noProfile": { + "title": "Основне ім'я не встановлено", + "message": "Цей гаманець повинен встановити основне ім'я для створення профілю" + }, + "noResults": "Імен не знайдено", + "errors": { + "names": "Не вдалося знайти адресу" + } +} diff --git a/public/locales/uk/common.json b/public/locales/uk/common.json new file mode 100644 index 000000000..dd33172cb --- /dev/null +++ b/public/locales/uk/common.json @@ -0,0 +1,397 @@ +{ + "title": "Ваш веб3 ім'я користувача", + "description": "Ваша ідентичність у веб3, одне ім'я для всіх ваших криптоадрес і ваш децентралізований вебсайт.", + "loading": "Завантаження", + "unsupportedNetwork": "Мережева підтримка не підтримується", + "notFound": "404 Не знайдено", + "etherscan": "Etherscan", + "action": { + "cancel": "Скасувати", + "change": "Змінити", + "upload": "Завантажити", + "close": "Закрити", + "save": "Зберегти", + "edit": "Редагувати", + "view": "Переглянути", + "clear": "Очистити", + "update": "Оновити", + "learnMore": "Дізнатися більше", + "send": "Надіслати", + "next": "Далі", + "add": "Додати", + "set": "Встановити", + "search": "Пошук", + "back": "Назад", + "continue": "Продовжити", + "confirm": "Підтвердити", + "remove": "Видалити", + "sign": "Підписати", + "reset": "Скинути", + "transfer": "Передати", + "tryAgain": "Спробувати ще раз", + "done": "Готово", + "burnSelected": "Спалити вибране", + "extend": "Продовжити", + "delete": "Видалити", + "sort": "Сортувати", + "check": "Перевірити", + "claim": "Претендувати", + "remindMe": "Нагадати мені", + "begin": "Розпочати", + "finish": "Завершити", + "skip": "Пропустити", + "changeNetwork": "Змінити мережу", + "understand": "Я розумію", + "feedback": "Зворотний зв'язок", + "enterEmail": "Введіть вашу електронну пошту", + "migrate": "Міграція", + "setToSelf": "Встановити для себе", + "editRoles": "Редагувати ролі", + "setReminder": "Встановити нагадування", + "import": "Імпортувати", + "connect": "Підключити" + }, + "unit": { + "years_one": "{{count}} рік", + "years_other": "{{count}} років", + "months_one": "{{count}} місяць", + "months_other": "{{count}} місяців", + "days_one": "{{count}} день", + "days_other": "{{count}} днів", + "invalid_date": "Неправильна дата", + "yrs_one": "{{count}} р.", + "yrs_other": "{{count}} р.", + "gas": "{{value}} газ", + "selected": "{{count}} вибрано", + "perPage": "{{count}} на сторінку" + }, + "navigation": { + "home": "Головна", + "names": "Мої імена", + "favourites": "Улюблені", + "settings": "Налаштування", + "governance": "Управління", + "community": "Спільнота", + "developers": "Розробники", + "support": "Підтримка", + "bounty": "Баг-баунті", + "terms": "Умови використання", + "privacy": "Політика конфіденційності", + "back": "Назад", + "oldApp": "Стара програма ENS", + "language": "Мова", + "currency": "Валюта", + "ipfsApp": "IPFS ENS програма", + "feedback": "Зворотний зв'язок", + "syncMessage": "Синхронізація з мережею. Зміни від вашої транзакції можуть ще не відображатися." + }, + "wallet": { + "myProfile": "Профіль", + "disconnect": "Відключити", + "connect": "Підключити", + "noPrimaryName": "Основне ім'я не встановлено", + "viewProfile": "Переглянути профіль", + "viewDetails": "Переглянути деталі", + "register": "Зареєструвати" + }, + "name": { + "registered": "Зареєстровано", + "expires": "Термін дії закінчується", + "graceEnd": "Кінець пільгового періоду", + "noExpiry": "Без терміну дії", + "expiry": "Термін дії", + "parent": "Батьківське", + "noParent": "Без батьківського", + "registrant": "Реєстратор", + "controller": "Контролер", + "dnsOwner": "Власник DNS", + "owner": "Власник", + "notOwned": "Не належить", + "manager": "Менеджер", + "all": "Всі імена", + "copy": "Скопіювати ім'я", + "yourPrimaryName": "Ваше основне ім'я", + "expiresInYears_one": "Термін дії закінчується через {{count}} рік", + "expiresInYears_other": "Термін дії закінчується через {{count}} років", + "expiresInMonths_one": "Термін дії закінчується через {{count}} місяць", + "expiresInMonths_other": "Термін дії закінчується через {{count}} місяців", + "expiresInDays_one": "Термін дії закінчується через {{count}} день", + "expiresInDays_other": "Термін дії закінчується через {{count}} днів", + "expiresInHours_one": "Термін дії закінчується через {{count}} годину", + "expiresInHours_other": "Термін дії закінчується через {{count}} години", + "expiresInHours_zero": "Термін дії закінчується менш ніж за годину", + "expiredInHours_one": "Термін дії закінчився {{count}} годину тому", + "expiredInHours_other": "Термін дії закінчився {{count}} години тому", + "expiredInHours_zero": "Термін дії закінчився менш ніж годину тому", + "expiredInDays_one": "Термін дії закінчився {{count}} день тому", + "expiredInDays_other": "Термін дії закінчився {{count}} днів тому", + "expiredInMonths_one": "Термін дії закінчився {{count}} місяць тому", + "expiredInMonths_other": "Термін дії закінчився {{count}} місяців тому", + "expiredInYears_one": "Термін дії закінчився {{count}} рік тому", + "expiredInYears_other": "Термін дії закінчився {{count}} років тому", + "gracePeriod": { + "expiresInYears_one": "Пільговий період закінчується через {{count}} рік", + "expiresInYears_other": "Пільговий період закінчується через {{count}} років", + "expiresInMonths_one": "Пільговий період закінчується через {{count}} місяць", + "expiresInMonths_other": "Пільговий період закінчується через {{count}} місяців", + "expiresInDays_one": "Пільговий період закінчується через {{count}} день", + "expiresInDays_other": "Пільговий період закінчується через {{count}} днів", + "expiresInHours_one": "Пільговий період закінчується через {{count}} годину", + "expiresInHours_other": "Пільговий період закінчується через {{count}} години", + "expiresInHours_zero": "Пільговий період закінчується менш ніж за годину" + }, + "extend": "Продовжити", + "send": "Надіслати", + "transfer": "Передати", + "sendManager": "Надіслати менеджеру", + "sendOwner": "Надіслати власнику", + "renew": "Оновити {{name}}" + }, + "address": { + "label": "Адреса", + "viewAddress": "Переглянути адресу", + "copyAddress": "Скопіювати адресу" + }, + "records": { + "label": "Записи" + }, + "sortTypes": { + "expiryDate": "Дата закінчення терміну", + "labelName": "Ім'я", + "createdAt": "Дата створення" + }, + "errors": { + "noResults": "Результатів не знайдено", + "emailRequired": "Електронна пошта обов'язкова", + "emailInvalid": "Неправильна електронна адреса", + "invalidAddress": "Неправильна адреса", + "addressRequired": "Адреса обов'язкова", + "indexingErrors": { + "title": "Помилка синхронізації даних", + "message": "Ці дані можуть бути застарілими. Будь ласка, будьте обережні.", + "message_datetime": "Ці дані були востаннє оновлені {{datetime}} і можуть бути застарілими. Будь ласка, будьте обережні" + }, + "networkError": { + "title": "Помилка синхронізації даних", + "message": "Ці дані можуть бути застарілими. Будь ласка, будьте обережні.", + "blurb": "Ця кнопка в даний момент відключена через проблеми з синхронізацією даних." + }, + "networkLatency": { + "title": "Повільна синхронізація даних", + "message": "Додаток ENS стикається з уповільненнями через проблеми з затримкою мережі." + } + }, + "transaction": { + "description": { + "setName": "Встановити ім'я", + "setRecords": "Встановити записи", + "test": "Тестова транзакція", + "addSuccess": "Успішне додавання", + "sendName": "Надіслати ім'я", + "migrateProfile": "Мігрувати профіль", + "migrateProfileWithReset": "Мігрувати профіль", + "migrateProfileWithSync": "Мігрувати і оновити профіль", + "migrateProfileWithEthAddress": "Мігрувати і оновити ETH адресу", + "wrapName": "Огорнути ім'я", + "updateResolver": "Оновити резолвер", + "updateProfile": "Оновити профіль", + "setPrimaryName": "Встановити основне ім'я", + "resetPrimaryName": "Видалити основне ім'я", + "updateEthAddress": "Оновити ETH адресу", + "testSendName": "Надіслати ім'я", + "burnFuses": "Спалити дозволи", + "createSubname": "Створити підім'я", + "deleteSubname": "Видалити підім'я", + "extendNames": "Продовжити імена", + "approveDnsRegistrar": "Схвалити DNS реєстратора", + "claimDnsName": "Одержати DNS ім'я", + "importDnsName": "Імпортувати DNS ім'я", + "commitName": "Розпочати таймер", + "registerName": "Зареєструвати ім'я", + "approveNameWrapper": "Схвалити NameWrapper", + "clearRecords": "Очистити записи", + "updateRecords": "Оновити записи", + "resetProfileWithRecords": "Скинути профіль з записами", + "transferName": "Перенести ім'я", + "transferSubname": "Перенести підім'я", + "changePermissions": "Змінити дозволи", + "syncManager": "Синхронізувати менеджера", + "updateProfileRecords": "Оновити профіль", + "resetProfile": "Скинути профіль", + "unwrapName": "Відгорнути ім'я" + }, + "info": { + "sendName": "Встановити контролера та реєстратора імені", + "migrateProfile": "Встановити існуючі записи на новому резолвері", + "migrateProfileWithReset": "Встановити існуючі записи на новому резолвері", + "migrateProfileWithSync": "Встановити існуючі записи на новому резолвері", + "migrateProfileWithEthAddress": "Встановити існуючі записи та ETH адресу на новому резолвері", + "wrapName": "Огорнути ім'я", + "updateResolver": "Змінити резолвер на", + "updateProfile": "Оновити записи на існуючому резолвері", + "setPrimaryName": "Встановити основне ім'я для вашої адреси", + "updateEthAddress": "Оновити ETH адресу на цю адресу", + "updateEthAddressOnLatestResolver": "Оновити ETH адресу на останньому резолвері", + "testSendName": "Встановити контролера та реєстратора імені", + "createSubname": "Створити нове підім'я для імені", + "burnFuses": "Спалити обрані дозволи до закінчення терміну імені", + "commitName": "Розпочати таймер для реєстрації імені", + "approveNameWrapper": "Схвалити NameWrapper для управління вашими іменами", + "fuses": { + "revoke": "Анулювати", + "grant": "Надати", + "setExpiry": "Встановити термін дії", + "PARENT_CANNOT_CONTROL": "Здати контроль над батьківським", + "CAN_EXTEND_EXPIRY": "Продовжити термін дії", + "CANNOT_UNWRAP": "Відгорнути це ім'я", + "CANNOT_CREATE_SUBDOMAIN": "Створити піддомен", + "CANNOT_SET_RESOLVER": "Встановити резолвер", + "CANNOT_SET_TTL": "Встановити TTL", + "CANNOT_TRANSFER": "Надіслати це ім'я", + "CANNOT_BURN_FUSES": "Змінити дозволи", + "CANNOT_APPROVE": "Змінити менеджера з продовження" + } + }, + "itemLabel": { + "name": "Ім'я", + "address": "Адреса", + "action": "Дія", + "info": "Інформація", + "to": "До", + "subname": "Підім'я", + "duration": "Тривалість", + "cost": "Вартість", + "update": "Оновити", + "resolver": "Резолвер", + "records": "Записи" + }, + "itemValue": { + "records_one": "{{count}} запис", + "records_other": "{{count}} записи" + }, + "status": { + "pending": { + "regular": "Очікує" + }, + "confirmed": { + "regular": "Підтверджено", + "notifyTitle": "Транзакцію успішно завершено", + "notifyMessage": "Ваша транзакція \"{{action}}\" була успішною" + }, + "failed": { + "regular": "Не вдалося", + "notifyTitle": "Помилка транзакції", + "notifyMessage": "Ваша транзакція \"{{action}}\" не вдалася і була скасована" + } + }, + "dialog": { + "intro": { + "trailingButton": "Розпочати", + "trailingButtonResume": "Продовжити", + "step": "Крок {{step}}" + }, + "confirm": { + "title": "Підтвердіть деталі", + "message": "Подвійно перевірте ці деталі перед підтвердженням у вашому гаманці.", + "waitingForWallet": "Очікування на гаманець", + "openWallet": "Відкрити гаманець" + }, + "sent": { + "title": "Транзакцію надіслано", + "message": "Ваша транзакція зараз у процесі, ви можете закрити це і повернутися пізніше.", + "progress": { + "title": "Надіслано", + "message": "Триває довше, ніж очікувалося" + }, + "learn": "Дізнатися про тривалі транзакції" + }, + "complete": { + "title": "Транзакцію завершено", + "message": "Ваша транзакція завершена!", + "progress": { + "title": "Зроблено" + } + }, + "failed": { + "title": "Транзакція не вдалася", + "progress": { + "title": "Не вдалося" + } + }, + "error": { + "gasLimit": "Ліміт газу у вашій транзакції був недостатнім, будь ласка, спробуйте ще раз." + } + }, + "error": { + "unknown": "Сталася невідома помилка" + }, + "viewEtherscan": "Переглянути на Etherscan", + "viewMore": "Переглянути більше" + }, + "search": { + "label": "Пошук імені", + "placeholder": "Шукати ім'я", + "emptyText": "Введіть ім'я або адресу для пошуку...", + "address": "Адреса", + "errors": { + "tooShort": "Ім'я занадто коротке", + "invalid": "Неправильний формат імені" + }, + "status": { + "registered": "Зареєстровано", + "gracePeriod": "Пільговий період", + "premium": "Тимчасовий преміум", + "available": "Доступно", + "notOwned": "Не належить", + "notImported": "Не імпортовано", + "short": "Занадто коротке", + "default": "Неправильне", + "invalid": "Неправильне", + "unsupportedTLD": "Не підтримується", + "imported": "Імпортовано", + "owned": "Належить" + } + }, + "selectableInput": { + "add": "Додати", + "placeholder": "Вибрати опцію", + "empty": "Опцій не знайдено" + }, + "testnetFaucet": { + "explanation": "Кожна адреса на {{ testnet }} може отримати {{ amount }} {{ ticker }} для тестування програми менеджера ENS, а також для іншого використання тестової мережі.", + "note": "Може знадобитися кілька хвилин, щоб відобразитися у вашому гаманці." + }, + "roles": { + "owner": { + "title": "власник", + "description": "Адреса, яка володіє цим ім'ям." + }, + "dns-owner": { + "title": "Власник DNS", + "description": "Адреса, яка володіє цим ім'ям." + }, + "parent-owner": { + "title": "Власник батьківського", + "description": "Адреса, яка володіє батьківським ім'ям." + }, + "manager": { + "title": "менеджер", + "description": "Адреса або контракт, який може змінювати профіль, налаштування та менеджерів профілю." + }, + "profile-editor": { + "title": "Редактор профілю", + "description": "Адреса, яка може змінювати профіль." + }, + "eth-record": { + "title": "ETH запис", + "description": "Адреса, на яку вказує це ім'я." + } + }, + "dns": { + "refresh": "Оновити DNS" + }, + "calendar": { + "pick_by_years": "Вибрати за роками", + "pick_by_date": "Вибрати за датою" + } +} diff --git a/public/locales/uk/dnssec.json b/public/locales/uk/dnssec.json new file mode 100644 index 000000000..0af00944e --- /dev/null +++ b/public/locales/uk/dnssec.json @@ -0,0 +1,98 @@ +{ + "title": "Імпортувати {{name}} в ENS", + "error": { + "unknown": "Сталася невідома помилка", + "noTxtRecord": "Запис не знайдено", + "dnssecFailure": "DNSSEC не увімкнено", + "invalidTxtRecord": "Знайдено неправильний запис", + "invalidAddressChecksum": "Адреса недійсна", + "resolutionFailure": "Наданий запис не розв'язується" + }, + "status": { + "checking": "Перевіряється...", + "error": "Сталася помилка під час перевірки", + "secondsAgo": "Останній раз перевірено кілька секунд тому", + "aWhileAgo": "Останній раз перевірено деякий час тому", + "minutesAgo_one": "Останній раз перевірено {{count}} хвилину тому", + "minutesAgo_other": "Останній раз перевірено {{count}} хвилини тому" + }, + "steps": { + "selectType": { + "title": "Отримати {{name}}", + "subtitle": "Імпорт доменних імен дозволяє використовувати їх як імена ENS.", + "learnMore": "Дізнатися більше про імпорт імен", + "select": { + "heading": "Як ви хочете імплементувати ваш домен?", + "offchain": { + "name": "Оффчейн", + "tag": "Безкоштовно", + "description": "Ваше ім'я не матиме токена в блокчейні.
Це не вплине на його можливість отримувати транзакції або використовуватися як основне ім'я.
Ви не зможете редагувати свій профіль з програми ENS." + }, + "onchain": { + "name": "В блокчейні", + "description": "Ваше ім'я матиме токен в блокчейні." + } + } + }, + "enableDnssec": { + "title": "Увімкнути DNSSEC", + "help": { + "findOutRegistrar": "Дізнатися про вашого реєстратора" + }, + "status": { + "enabled": "DNSSEC увімкнено для цього домену.", + "disabled": { + "heading": "Вам потрібно відвідати вашого реєстратора доменів, щоб увімкнути DNSSEC.", + "message": "DNSSEC не увімкнено", + "help": "Допомога з увімкнення DNSSEC" + } + } + }, + "verifyOwnership": { + "title": "Підтвердити право власності", + "status": { + "disconnected": "Підключіть ваш гаманець для підтвердження права власності.", + "mismatching": { + "heading": "Додайте запис DNS нижче, щоб підтвердити ваше право власності на цей домен.", + "help": "Допомога з додаванням TXT записів", + "message": "Запис не знайдено", + "error": { + "onchain": "Знайдений запис не відповідає вашій підключеній адресі. Ви все ще можете імплементувати це ім'я, але ви не будете його власником.", + "offchain": "Знайдений запис не відповідає вашій підключеній адресі. Ви все ще можете імплементувати це ім'я, але воно не буде вказувати на вашу підключену адресу і не зможе бути використане як ваше основне ім'я." + } + }, + "matching": "Знайдено запис, що відповідає вашій підключеній адресі." + }, + "action": { + "importWithoutOwnership": "Імплементувати без права власності" + } + }, + "transaction": { + "mismatching": { + "title": "Імплементувати цей домен", + "subtitle": "Ваше право власності не підтверджено. Ви все ще можете імплементувати цей домен." + }, + "matching": { + "title": "Претендуйте на ваш домен", + "subtitle": "Ваше право власності підтверджено." + }, + "estimatedNetworkCost": "Оцінкова вартість мережі" + }, + "complete": { + "title": "Вітаємо!", + "import": { + "subtitle": "{{name}} був імпортований", + "description": "Домен був успішно імпортований в ENS. Тепер ви можете переглядати його.", + "warning": "Безгазові DNS імена наразі не з'являються у вашому списку «Імена»." + }, + "claim": { + "subtitle": "Тепер ви є власником {{name}}", + "description": "Ваш домен був успішно претендований. Тепер ви можете переглядати та керувати вашим ім'ям." + }, + "action": { + "claimAnother": "Претендувати на інше", + "viewName": "Переглянути ім'я" + } + } + } +} diff --git a/public/locales/uk/error.json b/public/locales/uk/error.json new file mode 100644 index 000000000..98cc47a15 --- /dev/null +++ b/public/locales/uk/error.json @@ -0,0 +1,10 @@ +{ + "not-found": { + "title": "Не знайдено", + "message": "Сторінку, яку ви шукали, не знайдено.
Ви можете пошукати ім'я або відвідати нашу підтримку для подальшої допомоги." + }, + "application-error": { + "title": "Помилка додатку", + "message": "Щось пішло не так.
Якщо це повторюється, будь ласка, відвідайте нашу підтримку для подальшої допомоги." + } +} diff --git a/public/locales/uk/names.json b/public/locales/uk/names.json new file mode 100644 index 000000000..1de5fb7e9 --- /dev/null +++ b/public/locales/uk/names.json @@ -0,0 +1,19 @@ +{ + "title": "Імена", + "subtitle": { + "start": "Всі імена, що належать", + "this": "цьому", + "your": "вашому", + "wallet": "гаманцю" + }, + "empty": "Імен для цієї адреси не знайдено", + "sortTypes": { + "expiryDate": "Дата закінчення терміну", + "labelName": "Ім'я", + "createdAt": "Дата створення" + }, + "offchainWarning": { + "title": "Деякі імена можуть не відображатися", + "text": "Оффчейн-имена наразі не відображаються в цьому списку. Ви все ще можете переглядати їх, шукаючи їх безпосередньо. Натисніть, щоб дізнатися більше." + } +} diff --git a/public/locales/uk/profile.json b/public/locales/uk/profile.json new file mode 100644 index 000000000..80e262622 --- /dev/null +++ b/public/locales/uk/profile.json @@ -0,0 +1,459 @@ +{ + "meta": { + "title": "{{name}} на ENS", + "description": "Профіль {{name}} на Ethereum Name Service" + }, + "title": "Профіль", + "yourWallet": "Ваш гаманець", + "yourProfile": "Ваш профіль", + "accounts": "Облікові записи", + "addresses": "Адреси", + "otherRecords": "Інші записи", + "editProfile": "Редагувати профіль", + "ownership": "Володіння", + "viewDetails": "Переглянути деталі", + "banner": { + "available": { + "title": "{{name}} доступне", + "description": "Це ім'я прострочене {{date}}. Натисніть тут, щоб переглянути сторінку реєстрації." + } + }, + "tabs": { + "profile": { + "name": "Профіль", + "actions": { + "setAsPrimaryName": { + "label": "Встановити як основне ім'я", + "title": "Встановіть ваше основне ім'я", + "description": "Щоб встановити це ім'я як основне, адреса ETH повинна відповідати цій адресі." + }, + "deleteSubname": { + "label": "Видалити субімена" + }, + "extend": { + "label": "Подовжити ім'я" + }, + "editProfile": { + "label": "Редагувати профіль" + }, + "reclaim": { + "label": "Відновити ім'я", + "warning": "Цей субімена прострочено і не є власністю. Ви можете відновити цей субімен." + } + }, + "warnings": { + "wrappedDNS": "DNS-імена можуть бути відновлені власником DNS у будь-який час. Не купуйте DNS-імена.", + "offchain": "Offchain-імена наразі не з'являються у вашому списку 'Імена'. Дізнайтесь більше", + "homoglyph": "Це ім'я містить не ASCII-символи. Можуть бути символи, які виглядають ідентично або дуже схожі на інші символи, що може бути використано для обману читачів. Дізнайтеся більше про гомогліфи" + } + }, + "records": { + "name": "Записи" + }, + "ownership": { + "name": "Володіння", + "warning": { + "ownerNotManager": "Ви є власником, але не менеджером. Це може бути неочікувано, якщо ви нещодавно отримали це ім'я від іншої адреси.", + "managerNotParentOwner": "Власник {{parent}} може змінювати власність, ролі та налаштування. Вони не можуть змінювати профіль.", + "managerNotDNSOwner": "Ви є менеджером, але не власником DNS цього імені. DNS-імена можуть бути відновлені власником DNS у будь-який час. Ви можете передати це ім'я власнику або оновити запис DNS, щоб відповідати.", + "dnsOwnerNotManager": "Ви не можете вносити зміни в це ім'я, оскільки ви є власником DNS, але не менеджером. Ви можете синхронізувати менеджера, щоб виправити це." + }, + "sections": { + "roles": { + "title": "Ролі", + "addresses_one": "{{count}} адреса", + "addresses_other": "{{count}} адреси" + }, + "expiry": { + "panel": { + "expiry": { + "title": "Ім'я закінчується" + }, + "grace-period": { + "title": "Грейс-період закінчується", + "tooltip": "90-денний період після закінчення терміну, коли ім'я ще можна продовжити, але не пере-зареєструвати." + }, + "registration": { + "title": "Зареєстровано" + }, + "parent-expiry": { + "title": "Ім'я батька закінчується" + }, + "parent-grace-period": { + "title": "Грейс-період батька закінчується" + } + } + }, + "contract": { + "title": "Адреса контракту", + "tooltip": "Адреса контракту, який дозволяє Wrapped ENS імена.", + "warning": "Деякі додатки можуть показувати адресу контракту як власника. Це не впливає на ваше володіння." + } + }, + "tooltips": { + "owner": "Власник цього імені. Власник не може змінювати профіль.", + "owner-emancipated": "Власник цього імені.", + "parent-owner": "Власник імені батька ({{parent}}).", + "dns-owner": "Власник цього імені, як зазначено в записах DNS. Власник не може змінювати профіль.", + "manager": "Адреса, яка може змінювати профіль, налаштування та редакторів профілю.", + "profile-editor": "Адреса, яка може тільки змінювати профіль", + "subname-manager": "Адреса або контракт, відповідальний за продовження субімен.", + "eth-record": "Адреса, яка отримуватиме кошти, надіслані на це ім'я на основній мережі.", + "grace-period": "90-денний період після закінчення терміну, коли ім'я ще можна продовжити, але не пере-зареєструвати.", + "contract-address": "Адреса контракту, який дозволяє Wrapped ENS імена.", + "namewrapper": "Контракт, який дозволяє Wrapped ENS імена." + } + }, + "subnames": { + "name": "Субімена" + }, + "permissions": { + "name": "Дозволи", + "parentUnlockedWarning": "Ви не можете змінювати дозволи для цього імені. Спочатку потрібно відкликати ‘розпакувати це ім'я’ на батьківському ім'ї ({{parent}}). Натисніть тут, щоб переглянути дозволи батьківського імені.", + "revokedLabel": "Відкликано {{date}}", + "grantedLabel": "Надано {{date}}", + "role": { + "manager": "менеджер", + "owner": "власник", + "parent": "батько" + }, + "ownership": { + "title": "Дозволи на володіння", + "parentCanControl": { + "label": "Цим ім'ям може керувати його батько ({{parent}})", + "list": { + "title": "Власник батьківського імені може:", + "item1": "Керувати і змінювати налаштування та записи", + "item2": "Взяти назад або перепризначити володіння цим ім'ям", + "item3": "Видалити це ім'я" + } + }, + "parentCannotControl": { + "label": "Цим ім'ям не може керувати його батько ({{parent}})", + "sublabel": "Власник батьківського імені не може керувати, змінювати, видаляти або забирати володіння цим ім'ям.", + "list": { + "title": "Власник імені залишиться власником, якщо не відбудеться одне з наступного:", + "item1": "Ім'я закінчується {{date}} (можна продовжити)", + "item2": "Батьківське ім'я закінчується {{date}}", + "item3": "Володіння ім'ям передається іншій адресі" + } + }, + "parentCanChange": { + "label": "Батько цього імені ({{parent}}) може змінювати дозволи", + "list": { + "title": "Батько може:", + "item1": "Відкликати дозволи", + "item2": "Змінювати або спалювати користувацькі запобіжники" + } + }, + "ownerCanChange": { + "label": "Власник цього імені може змінювати дозволи", + "list": { + "title": "Власник може:", + "item1": "Відкликати дозволи", + "item2": "Змінювати або спалювати користувацькі запобіжники" + } + }, + "ownerCannotChange": { + "label": "Власник цього імені не може змінювати дозволи", + "list": { + "title": "Власник не може:", + "item1": "Відкликати дозволи", + "item2": "Змінювати або спалювати користувацькі запобіжники" + } + }, + "unwrapWarning": { + "message": "Дозволи на розпакування повинні бути відкликані на батьківському ім'ї ({{parent}}), перш ніж відмовитися від контролю батька.
Перейти до дозволів батьківського імені" + }, + "action": { + "giveUpControl": "Відмовитися від контролю батька", + "revokePermission": "Відкликати дозвіл" + } + }, + "expiry": { + "permissions": { + "canExtendExpiry": { + "label": "Може продовжити термін дії", + "description": "Термін дії дозволів для цього імені може бути продовжено {{managerOrOwner}}.", + "description_date": "Термін дії дозволів для цього імені ({{date}}) може бути продовжено {{managerOrOwner}}." + }, + "cannotExtendExpiry": { + "label": "Не може продовжити термін дії", + "description": "Термін дії дозволів для цього імені не може бути продовжено менеджером.", + "description_date": "Термін дії дозволів для цього імені ({{date}}) не може бути продовжено менеджером." + } + }, + "manager": "менеджер", + "owner": "власник", + "action": { + "changePermissions": "Змінити дозволи" + } + }, + "nameChangePermissions": { + "title": "Дозволи на зміну імені", + "subtitle": { + "parent-can-change": "Батько цього імені ({{parent}}) може змінювати налаштування цього імені.", + "owner-can-change": "Власник цього імені може змінювати налаштування цього імені." + }, + "permissions": { + "canUnwrap": { + "label": "Може розпакувати це ім'я", + "description": "Власник цього імені може розпакувати це ім'я." + }, + "cannotUnwrap": { + "label": "Не може розпакувати це ім'я", + "description": "Власник цього імені не може розпакувати це ім'я." + }, + "canCreateSubnames": { + "label": "Може створювати піддомени", + "description": "Власник цього імені може створювати нові піддомени." + }, + "cannotCreateSubnames": { + "label": "Не може створювати піддомени", + "description": "Власник цього імені не може створювати нові піддомени." + }, + "canSend": { + "label": "Може надіслати це ім'я", + "description": "Власник цього імені може надіслати його новому власнику." + }, + "cannotSend": { + "label": "Не може надіслати це ім'я", + "description": "Власник цього імені не може надіслати його новому власнику." + }, + "canSetResolver": { + "label": "Може встановити розв'язувач", + "description": "Власник цього імені може встановити та змінювати розв'язувач." + }, + "cannotSetResolver": { + "label": "Не може встановити розв'язувач", + "description": "Власник цього імені не може встановити та змінювати розв'язувач." + }, + "canSetTTL": { + "label": "Може встановити TTL", + "description": "Власник цього імені може встановити та змінювати TTL." + }, + "cannotSetTTL": { + "label": "Не може встановити TTL", + "description": "Власник цього імені не може встановити та змінювати TTL." + }, + "canApprove": { + "label": "Може змінити менеджера з продовження", + "description": "Власник цього імені може змінити менеджера, затвердженого для продовження піддоменів." + }, + "cannotApprove": { + "label": "Не може змінити менеджера з продовження", + "description": "Власник цього імені не може змінити менеджера, затвердженого для продовження піддоменів." + } + }, + "action": { + "changePermissions": "Змінити дозволи" + } + } + }, + "fuses": { + "name": "Запобіжники" + }, + "more": { + "name": "Більше", + "resolver": { + "label": "Розв'язувач", + "custom": "Користувацький", + "latest": "Остання версія", + "outdated": "Застаріла", + "wildcard": "Шаблон", + "version": "Версія", + "etherscan": "Etherscan" + }, + "fuses": { + "label": "Запобіжники", + "info": "Ви повинні спалити 'Можна розпакувати', щоб спалити інші запобіжники", + "callToAction": "Будь ласка, обгорніть ваше ім'я, щоб розблокувати цю функцію", + "burnFormTitle": "Спалення дозволів", + "burned": "Спалено", + "permissions": { + "label": "Дозволи", + "warning": "Запобіжники можуть бути змінені батьківським ім'ям", + "CAN_DO_EVERYTHING": "Може робити все", + "CANNOT_BURN_FUSES": "Не може спалювати запобіжники", + "CANNOT_CREATE_SUBDOMAIN": "Не може створювати піддомен", + "CANNOT_SET_RESOLVER": "Не може встановити розв'язувач", + "CANNOT_SET_TTL": "Не може встановити TTL", + "CANNOT_TRANSFER": "Не може передати", + "CANNOT_UNWRAP": "Не може розпакувати", + "PARENT_CANNOT_CONTROL": "Батько може контролювати", + "CAN_EXTEND_EXPIRY": "Не може продовжити термін дії", + "IS_DOT_ETH": "Не є .eth" + } + }, + "ownership": { + "label": "Володіння", + "refreshDNS": "Оновити DNS", + "dnsOwnerWarning": { + "isDnsOwner": "Ви не можете вносити зміни в це ім'я, оскільки ви є власником DNS, але не менеджером. Ви можете синхронізувати менеджера, щоб виправити це.", + "isManager": "Ви є менеджером, але не власником DNS цього імені. DNS-імена можуть бути відновлені власником DNS у будь-який час. Ви можете передати це ім'я власнику або оновити запис DNS, щоб відповідати.", + "refreshDNS": "Оновити DNS", + "syncManager": "Синхронізувати менеджера" + } + }, + "token": { + "label": "Токен", + "noToken": "Немає токена", + "hex": "шістнадцятковий", + "decimal": "десятковий", + "wrapper": "обгортка", + "wrapName": "Обгорнути ім'я", + "unwrap": "Розпакувати", + "status": { + "unwrapped": "розпаковано", + "wrapped": "обгорнуто", + "emancipated": "обгорнуто, емансиповане", + "locked": "обгорнуто, заблоковане" + } + }, + "misc": { + "registered": "Зареєстровано", + "expires": "Термін закінчується", + "bankless": { + "title": "Нагадування Bankless", + "enterEmail": "Отримуйте Bankless Нагадування через Email, PUSH, XMTP, Blockscan Chat та Mailchain.", + "emailConfirmation": "Ви майже закінчили. Будь ласка, перевірте вашу електронну пошту, щоб підтвердити підписку.", + "submitError": "Помилка при надсиланні. Будь ласка, спробуйте ще раз." + }, + "reminderOptions": { + "google": "Календар Google", + "outlook": "Календар Outlook", + "office365": "Календар Office 365", + "yahoo": "Календар Yahoo", + "ical": "Завантаження iCal (.ics)", + "bankless": "Нагадування Bankless" + } + } + } + }, + "details": { + "title": "Деталі імені", + "notWrapped": "Не запаковане", + "sendName": { + "title": "Надіслати ім'я", + "description": "Надсилання імені надасть новій адресі контроль над ним", + "learnMore": "Дізнайтесь більше про володіння іменем.", + "makeOwner": "Зробити власником", + "makeOwnerDescription": "Власник може передати новому власнику і змінювати менеджера", + "makeManager": "Зробити менеджером", + "makeManagerDescription": "Менеджер може змінювати та встановлювати записи.", + "inputPlaceholder": "Введіть адресу Ethereum або ім'я ENS", + "transferSubname": "Передати ім'я", + "transferController": "Передати контролер" + }, + "wrap": { + "startTitle": "Оновіть ваше ім'я", + "resumeTitle": "Продовжити оновлення", + "completeTitle": "Оновлення завершено", + "description": "Оновлення або \"запакування\" вашого імені надає йому нові функції.", + "startLabel": "Оновити", + "resumeLabel": "Продовжити оновлення", + "boxTitle": "Розблокувати нові функції", + "boxDescription": "Оновлення вашого імені розблоковує останні можливості ENS" + }, + "descriptions": { + "owner": "Володіє та контролює ім'я", + "controller": "Контролює всі записи імені", + "registrant": "Власник NFT", + "dnsOwner": "Власник DNS-імені" + }, + "tabs": { + "records": { + "label": "Записи", + "text": "Текст", + "contentHash": "Хеш контенту", + "noContentHash": "Хеш контенту відсутній", + "editRecords": "Редагувати записи", + "noAbi": "ABI відсутній", + "abi": "ABI", + "editRecordsDisabled": "Поточний резолвер не сумісний з запакованими іменами" + }, + "subnames": { + "label": "Субімена", + "loading": "Завантаження субімен", + "empty": "Субімен не додано", + "noResults": "Результатів немає", + "noMoreResults": "Більше результатів немає", + "addSubname": { + "title": "Субімена дозволяють створювати додаткові імена з вашого існуючого імені.", + "learn": "Дізнайтесь про субімена", + "action": "Новий субімен", + "dialog": { + "title": "Створити субімен", + "error": { + "invalidCharacters": "Містить недопустимі символи", + "mustUseLowercase": "Потрібно використовувати малі літери", + "alreadyExists": "Ім'я вже існує", + "nameTooLong": "Ім'я занадто довге", + "pccBurned": "Ім'я заблоковане до {{date}}" + } + } + } + } + } + }, + "advancedEditor": { + "title": "Записи {{name}}", + "tabs": { + "text": { + "label": "Текст", + "addRecord": "Додати запис", + "createRecord": "Введіть назву запису...", + "placeholder": { + "default": "Додайте значення сюди..." + } + }, + "address": { + "label": "Адреса", + "addRecord": "Додати адресу", + "noOptions": "Опції адрес відсутні", + "placeholder": { + "default": "Додайте адресу сюди..." + } + }, + "other": { + "label": "Інше", + "labelDisabled": "Не підтримується поточним резолвером", + "contentHash": { + "label": "Хеш контенту", + "placeholder": "наприклад, ipfs://" + }, + "publicKey": { + "label": "Публічний ключ", + "placeholder": "наприклад, pub_1231231231231" + }, + "abi": { + "label": "ABI", + "placeholder": "Введіть ABI сюди..." + } + } + } + }, + "errors": { + "invalidName": "Це ім'я недійсне.", + "invalidAddress": "Не дійсна адреса", + "expiringSoon": "Грейс-період для цього імені закінчується {{date}}. Якщо його не продовжити до цієї дати, воно стане доступним для реєстрації.", + "hasExpired": "{{ name }} прострочено", + "ownerManagerChoice": "Потрібно передати власника або менеджера", + "unknown": "Невідома помилка", + "notMigrated": "Це ім'я не мігрувало до нової реєстраційної системи.", + "featureNotAvailable": "Деякі функції ще не доступні, але ви все ще можете ", + "featureNotAvailableLink": "переглянути це ім'я в старому додатку.", + "migrationNotAvailable": "Міграція до нової реєстраційної системи ще не доступна, але ви все ще можете ", + "migrationNotAvailableLink": "мігрувати це ім'я в старому додатку.", + "addressLength": "Якщо це адреса, вона повинна бути 42 символи довжиною", + "unsupportedTLD": "Цей TLD не підтримується", + "keyInUse": "{{value}} вже використовується", + "hasSubnames": "Це ім'я має субімена", + "permissionRevoked": "Це ім'я відкликало дозволи, необхідні для виконання цієї дії.", + "gracePeriod": "Цю дію не можна виконати, оскільки ім'я прострочене", + "default": "Цю дію недоступно", + "invalidJSON": "Недійсний JSON", + "isOwnerCannotEdit": "Ви повинні бути менеджером, щоб редагувати профіль", + "cannotEdit": "Ви не маєте дозволу на оновлення до авторизованого резолдера" + } +} diff --git a/public/locales/uk/register.json b/public/locales/uk/register.json new file mode 100644 index 000000000..a698279fc --- /dev/null +++ b/public/locales/uk/register.json @@ -0,0 +1,197 @@ +{ + "title": "Зареєструвати {{name}} в ENS", + "subtitle": "Реєстрація", + "heading": "Зареєструвати {{name}}", + "invoice": { + "timeRegistration": "{{time}} реєстрація", + "registration": "Реєстрація", + "estimatedNetworkFee": "Оцінка плати за мережу", + "networkFee": "Плата за мережу", + "temporaryPremium": "Тимчасовий преміум", + "total": "Орієнтовна сума", + "totalPaid": "Всього сплачено" + }, + "error": { + "nameTooLong": "Ім'я, яке ви хочете зареєструвати, занадто довге. Будь ласка, виберіть коротше ім'я." + }, + "steps": { + "pricing": { + "insufficientBalance": "Нестача коштів", + "multipleYearsMessage": "Продовження на кілька років дозволить заощадити на витратах на мережу, уникнувши щорічних транзакцій.", + "primaryName": "Використовувати як основне ім'я", + "primaryNameMessage": "Це прив'язує вашу адресу до цього імені, дозволяючи dApps відображати його як ваш профіль при підключенні до них. Ви можете мати тільки одне основне ім'я на адресу.", + "premium": { + "heading": "Це ім'я має тимчасовий преміум", + "subheading": "Щоб надати справедливу можливість нещодавно простроченим іменам, преміум починається з $100,000,000 і зменшується до $0 протягом 21 дня. Ви можете розрахувати преміум на дату нижче.", + "targetPrice": "Цільова ціна", + "targetDate": "Цільова дата", + "timezone": "Дата та час показані у місцевому часі ({{timezone}})" + } + }, + "profile": { + "title": "Створення профілю", + "title2": "Редагувати профіль", + "default": "За замовчуванням", + "advanced": "Розширені", + "permissions": "Дозволи", + "resolver": "Розв'язувач", + "visibilityMessage": "Інформація про ваш профіль буде зберігатися в блокчейні. Все, що ви додасте, буде публічно видимим.", + "addProfile": "Додати поля профілю", + "addMore": "Додати більше до профілю", + "options": { + "groups": { + "general": { + "label": "Загальні", + "items": { + "name": "Нікнейм", + "url": "Вебсайт", + "location": "Місцезнаходження", + "description": "Коротка біографія" + }, + "placeholder": { + "name": "Джон Сміт", + "url": "https://ens.domains", + "location": "Метавсесвіт", + "description": "Я фермер з сільської місцевості Теннессі." + } + }, + "social": { + "label": "Соціальні", + "items": { + "com.twitter": "Twitter", + "com.github": "GitHub", + "com.discord": "Discord", + "org.telegram": "Telegram", + "email": "Email" + }, + "placeholder": { + "com.twitter": "наприклад, ensdomains", + "com.github": "наприклад, ensdomains", + "com.discord": "наприклад, nickjohnson", + "org.telegram": "наприклад, nicksdjohnson", + "email": "наприклад, hello@example.com" + } + }, + "address": { + "label": "Адреса", + "itemLabel": "{{coin}} адреса", + "placeholder": { + "default": "Додати адресу тут", + "eth": "0xb8c2C2...", + "btc": "3FZbgi29...", + "sol": "D4kA7VzHnmV...", + "op": "0xb8c2C2...", + "arb1": "0xb8c2C2...", + "base": "0xb8c2C2...", + "matic": "0xb8c2C2..." + } + }, + "website": { + "label": "Вебсайт", + "items": { + "ipfs": "IPFS", + "ipns": "IPNS", + "swarm": "Swarm", + "onion": "Onion", + "skynet": "Skynet", + "arweave": "Arweave" + }, + "placeholder": { + "default": "Додати URL тут", + "ipfs": "ipfs://...", + "skynet": "sia://...", + "arweave": "ar://...", + "swarm": "bzz://...", + "onion": "onion3://..." + } + }, + "other": { + "label": "Інше", + "items": { + "contentHash": "Хеш контенту", + "publicKey": "Публічний ключ", + "abi": "ABI", + "custom": "Користувацьке" + } + }, + "custom": { + "key": "Ключ", + "value": "Значення" + }, + "default": { + "placeholder": "Додати значення тут" + } + } + }, + "errors": { + "labelRequired": "Ключ запису обов'язковий", + "duplicateRecord": "Дубльований ключ запису", + "avatarReserved": "Ключ використовується менеджером аватара", + "invalidValue": "Неправильне значення" + }, + "confirmations": { + "publicNotice": { + "title": "Ваші дані публічні", + "description": "Все, що ви додасте до вашого профілю, буде публічно видиме в блокчейні.", + "confirm": "Я розумію", + "decline": "Назад" + }, + "clearEth": { + "title": "Очистити ETH адресу?", + "description": "Без встановленої ETH адреси люди не зможуть надсилати гроші на це ім'я. Це можна оновити пізніше.", + "confirm": "Очистити", + "decline": "Скасувати" + } + }, + "actions": { + "skipProfile": "Пропустити профіль" + } + }, + "complete": { + "heading": "Вітаємо!", + "subheading": "Тепер ви є власником", + "description": "Ваше ім'я було успішно зареєстроване. Тепер ви можете переглядати та керувати своїм ім'ям.", + "registerAnother": "Зареєструвати інше", + "viewName": "Переглянути ім'я" + }, + "info": { + "heading": "Перед початком", + "subheading": "Реєстрація вашого імені займає три етапи", + "ethItems": [ + "Завершити транзакцію, щоб розпочати таймер", + "Чекати 60 секунд, поки таймер завершиться", + "Завершити другу транзакцію, щоб закріпити ваше ім'я" + ], + "moonpayItems": [ + "Створіть або увійдіть в існуючий обліковий запис MoonPay", + "Використовуйте вашу кредитну або дебетову картку, щоб завершити одну транзакцію" + ], + "setupProfile": "Я б хотів спочатку налаштувати свій профіль", + "paymentMethod": "Спосіб оплати", + "notEnoughEth": "Недостатньо ETH в гаманці", + "creditOrDebit": "Кредитна або дебетова картка", + "additionalFee": "Додаткова плата за обробку", + "pendingMoonpayTransaction": "Ваша транзакція MoonPay обробляється. Це може зайняти до двох хвилин. Ви можете перевірити свій прогрес з підтвердженням електронною поштою, яку ви отримали.", + "failedMoonpayTransaction": "Ваша транзакція MoonPay не вдалася. Будь ласка, спробуйте ще раз або виберіть спосіб оплати 'Ethereum'.", + "ethereum": "Ethereum", + "processing": "Обробка", + "poweredBy": "Підтримується", + "moonpayModalHeader": "MoonPay Checkout", + "moonpayTestCard": "Дані тестової картки" + }, + "transactions": { + "heading": "Майже готово", + "subheading": "Вам потрібно завершити дві транзакції, щоб закріпити ваше ім'я. Другу транзакцію потрібно завершити протягом 24 годин після першої.", + "startTimer": "Запустити таймер", + "wait": "Чекати", + "transactionFailed": "Транзакція не вдалася", + "transactionProgress": "Транзакція в процесі" + }, + "cancelRegistration": { + "heading": "Ви втратите свою транзакцію", + "contentOne": "Повернення назад скине вашу першу транзакцію. Якщо ви повернетеся, вам потрібно буде завершити транзакцію знову і сплатити супутні витрати.", + "contentTwo": "Ви впевнені, що хочете продовжити?", + "footer": "Скинути транзакцію та повернутися" + } + } +} diff --git a/public/locales/uk/settings.json b/public/locales/uk/settings.json new file mode 100644 index 000000000..f064cbf5a --- /dev/null +++ b/public/locales/uk/settings.json @@ -0,0 +1,22 @@ +{ + "title": "Налаштування", + "section": { + "wallet": { + "title": "Гаманець" + }, + "transaction": { + "title": "Транзакції", + "noRecentTransactions": "Немає нещодавніх транзакцій", + "clearTransactions": { + "title": "Очистити історію транзакцій", + "description": "Очищення вашої історії транзакцій назавжди видалить їх з додатку ENS. Ваші транзакції все ще будуть видимі на блокчейні.", + "actionLabel": "Очистити історію" + } + }, + "primary": { + "title": "Основне ім'я", + "noNameDescription": "Основне ім'я зв'язує вашу адресу з ім'ям, дозволяючи dApps відображати ім'я як ваш профіль при підключенні до них. Дізнайтеся про основні імена", + "choosePrimaryName": "Вибрати основне ім'я" + } + } +} diff --git a/public/locales/uk/transactionFlow.json b/public/locales/uk/transactionFlow.json new file mode 100644 index 000000000..8869dfb0b --- /dev/null +++ b/public/locales/uk/transactionFlow.json @@ -0,0 +1,446 @@ +{ + "input": { + "profileEditor": { + "tabs": { + "avatar": { + "change": "Змінити аватар", + "label": "Аватар", + "dropdown": { + "selectNFT": "Вибрати NFT", + "uploadImage": "Завантажити зображення", + "enterManually": "Ввести вручну" + }, + "nft": { + "title": "Виберіть NFT", + "searchPlaceholder": "Пошук NFT", + "loading": "Завантаження ваших NFT", + "unknown": "Невідомий NFT", + "loadError": "NFT не вдалося завантажити", + "noNFTs": "NFT не знайдено для цієї адреси.", + "selected": { + "title": "Вибраний NFT", + "subtitle": "Ви впевнені, що хочете використовувати цей NFT?" + }, + "noResults": "Результатів не знайдено." + }, + "image": { + "title": "Редагувати зображення", + "upload": { + "title": "Завантажити аватар", + "subtitle": "Вам потрібно підписати повідомлення, щоб завантажити аватар. Це не коштує нічого.", + "action": "Підписати та завантажити" + } + } + }, + "general": { + "label": "Основне", + "name": { + "label": "Псевдонім", + "placeholder": "Джон Сміт" + }, + "url": { + "label": "Вебсайт", + "placeholder": "https://ens.domains" + }, + "location": { + "label": "Місцезнаходження", + "placeholder": "Метавсесвіт" + }, + "description": { + "label": "Коротка біографія", + "placeholder": "Я фермер із прибуткових культур з сільської Теннесі." + } + }, + "accounts": { + "label": "Акаунти", + "addAccount": "Додати акаунт", + "noOptions": "Немає доступних опцій акаунту", + "placeholder": { + "default": "Додати ім'я користувача тут", + "com.twitter": "наприклад, nicksdjohnson", + "com.github": "наприклад, arachnid", + "com.discord": "наприклад, nickjohnson", + "org.telegram": "наприклад, nicksdjohnson", + "email": "наприклад, hello@example.com" + } + }, + "address": { + "label": "Адреса", + "addAddress": "Додати адресу", + "noOptions": "Немає доступних опцій адреси", + "placeholder": { + "default": "Додати адресу тут", + "eth": "0xD9hbQK...", + "bnb": "0xD9hbQK...", + "btc": "3FZbgi29...", + "ltc": "3FZbgi29...", + "sol": "D4kA7VzHnmV...", + "dot": "1D4kA7VxH...", + "doge": "DFabcd12..." + } + }, + "contentHash": { + "label": "Вебсайт", + "addContentHash": "Додати децентралізований вебсайт", + "placeholder": { + "default": "Додати URL тут", + "ipfs": "ipfs://...", + "skynet": "sia://...", + "arweave": "ar://...", + "swarm": "bzz://...", + "onion": "onion3://..." + } + }, + "other": { + "label": "Інше", + "addRecord": "Додати запис", + "createRecord": "Введіть назву запису...", + "placeholder": { + "default": "Додати значення тут..." + } + } + }, + "warningOverlay": { + "action": { + "learnMoreResolvers": "Дізнайтеся більше про resolvers", + "updateResolver": "Оновити resolver", + "setResolver": "Встановити resolver", + "ignoreUpdate": "Ігнорувати це і продовжити використовувати ваш поточний resolver. Вам знову буде запропоновано наступного разу." + }, + "invalidResolver": { + "title": "Несанкціонований resolver", + "subtitle": "У вас немає дозволу на встановлення записів для цього resolver. Вам потрібно оновити до останньої версії resolver, щоб редагувати ваш профіль.", + "action": "Оновити resolver" + }, + "migrateProfileSelector": { + "title": "Профіль", + "subtitle": "Записи профілю на кожному resolver не збігаються. Який набір записів ви хотіли б використовувати?", + "option": { + "latest": "Записи профілю на новому resolver", + "current": "Поточні записи профілю", + "reset": "Скинути ваш профіль", + "resetSubtitle": "Видалити всі записи профілю" + } + }, + "migrateProfileWarning": { + "title": "Міграція профілю", + "subtitle": "Ви переносите записи профілю на останній resolver. Це назавжди очистить будь-які існуючі записи на останньому resolver і замінить їх вашими поточними записами." + }, + "migrateRegistry": { + "title": "Реєстр застарілий", + "subtitle": "Вам потрібно мігрувати реєстр перед внесенням змін до цього імені.", + "action": "Мігрувати" + }, + "noResolver": { + "title": "Resolver не встановлено", + "subtitle": "Нам потрібно встановити resolver перед редагуванням вашого профілю.", + "action": "Оновити" + }, + "resetProfile": { + "title": "Скинути профіль", + "subtitle": "Ви скидаєте записи профілю. Ви втратите всю існуючу інформацію про профіль, таку як ETH-адреса, аватар і соціальні записи. Їх можна буде повторно додати, редагуючи ваш профіль." + }, + "resolverNotNameWrapperAware": { + "title": "Resolver несумісний", + "subtitle": "Ваш поточний resolver несумісний з обгорнутими іменами. Вам потрібно оновити resolver перед редагуванням вашого профілю.", + "toggle": { + "title": "Передати поточний профіль", + "subtitle": "Відзначення цієї опції оновить тільки ваш resolver." + } + }, + "resolverOutOfDate": { + "title": "Resolver застарілий", + "subtitle": "Resolver застарілий. Рекомендується оновити його перед редагуванням вашого профілю." + }, + "resolverOutOfSync": { + "title": "Resolver не синхронізований", + "subtitle": "Ви не використовуєте останній публічний resolver, але у вас є збережені записи профілю. Рекомендується переключитися на останній публічний resolver перед редагуванням вашого профілю." + }, + "transferOrResetProfile": { + "title": "Профіль", + "subtitle": "Ви можете передати свій поточний профіль новому resolver перед оновленням вашого resolver.", + "toggle": { + "title": "Передати поточний профіль", + "subtitle": "Відзначення цієї опції оновить тільки ваш resolver." + } + }, + "updateResolverOrResetProfile": { + "title": "Профіль", + "subtitle": "Ви можете зберегти свій поточний профіль на новому resolver або скинути його і видалити всі записи профілю.", + "toggle": { + "title": "Зберегти поточний профіль", + "subtitle": "Відзначення цієї опції скине ваш профіль." + } + }, + "links": { + "learnMoreResolvers": "Дізнайтеся більше про resolvers" + } + }, + "intro": { + "resetProfile": { + "title": "Скинути профіль", + "description": "Це видалить всі записи профілю з останнього resolver і потім оновить resolver." + }, + "migrateProfile": { + "title": "Міграція профілю", + "description": "Це перенесе ваші поточні записи профілю на останній resolver." + }, + "migrateCurrentProfile": { + "title": "Міграція профілю", + "description": "Це перенесе ваші поточні записи профілю на останній resolver." + } + } + }, + "editResolver": { + "title": "Редагувати Resolver", + "latestLabel": "Використовувати останню версію resolver", + "etherscan": "Etherscan", + "latestMessage": "Ви використовуєте останню версію resolver", + "customLabel": "Користувацький resolver", + "customPlaceholder": "Введіть адресу користувацького resolver" + }, + "editRoles": { + "views": { + "main": { + "title": "Редагувати ролі", + "noneSet": "Не встановлено" + }, + "editRole": { + "title": "Змінити {{role}}", + "views": { + "intro": { + "current": "Поточний {{role}}" + } + } + } + } + }, + "extendNames": { + "title_one": "Продовжити ім'я", + "title_other": "Продовжити {{count}} імен", + "ownershipWarning": { + "title_one": "Ви не володієте цим ім'ям", + "title_other": "Ви не володієте всіма цими іменами", + "description_one": "Продовження цього імені продовжить реєстрацію поточного власника. Це не надасть вам права власності на нього.", + "description_other": "Продовження цих імен продовжить реєстрацію поточного власника. Це не надасть вам права власності, якщо ви ще не є власником." + }, + "invoice": { + "extension": "{{time}} продовження", + "transaction": "Комісія за транзакцію", + "total": "Оцінкова загальна сума" + }, + "bannerMsg": "Продовження на кілька років дозволить зекономити на витратах на мережу, уникнувши щорічних транзакцій.", + "gasLimitError": "Недостатньо коштів" + }, + "transferProfile": { + "title": "Передати профіль", + "message1": "Перед оновленням ви можете передати свій поточний профіль, якщо хочете, в іншому випадку він буде скинутий при оновленні.", + "message2": "Бажаєте передати свій поточний профіль?" + }, + "revokePermissions": { + "views": { + "revokeWarning": { + "title": "Це призведе до постійних змін", + "subtitle": "Дозволи є розширеною функцією, яка вносить постійні зміни до вашого імені. Ви не зможете скасувати ці зміни, і вони будуть скинуті лише якщо ім'я спливе.", + "subtitle2": "Переконайтеся, що ви впевнені у використанні цієї функції перед продовженням. Дізнайтеся більше про дозволи" + }, + "revokePCC": { + "title": "Відмовитися від права власності", + "subtitle": "Це надасть право власності на це ім'я менеджеру ({{account}}). Якщо ви не є менеджером, ви більше не зможете вносити зміни до цього імені." + }, + "grantExtendExpiry": { + "title": "Змінити дозволи", + "fuses": { + "CAN_EXTEND_EXPIRY": "Надати дозвіл на: Подовження терміну дії" + } + }, + "setExpiry": { + "title": "Встановити термін дії імені", + "subtitle": "Встановіть дату, коли дозволи сплинуть. Ця дата не може бути пізнішою за термін дії батьківського імені ({{parent}}).", + "subtitleWithCEE": "Встановіть дату, коли це ім'я спливе. Це замінить існуючий термін дії дозволів ({{expiry}}) і не може бути пізнішою за термін дії батьківського імені ({{parent}}).", + "options": { + "max": "Максимум", + "custom": "Вибрати ранішу дату" + }, + "error": { + "required": "Дата потрібна, якщо вибрана користувацька дата", + "min": "Дата повинна бути пізніше {{date}}", + "max": "Дата повинна бути раніше {{date}}" + } + }, + "revokeAdditional": { + "title": "Відмовитися від додаткових дозволів", + "subtitle": "Бажаєте відмовитися від дозволів на це ім'я перед відмовою від права власності? Це можна зробити лише зараз.", + "action": { + "title": "Відмовитися від додаткових дозволів", + "description": "Якщо ви не є менеджером, ви не зможете відмовитися від додаткових дозволів після цього." + } + }, + "revokeUnwrap": { + "title": "Відмовитися від дозволів", + "subtitle": "Вам потрібно відмовитися від цього дозволу перед тим, як інші можуть бути відкликані. Це запобігає видаленню дозволів.", + "fuses": { + "CANNOT_UNWRAP": "Відмовитися від дозволу на: Розгорнути це ім'я" + } + }, + "revokePermissions": { + "title": "Відмовитися від дозволів", + "unwrapSubtitle": "Виберіть це, щоб активувати інші", + "fuses": { + "CAN_EXTEND_EXPIRY": "Надати дозвіл на: Подовження терміну дії.", + "CANNOT_UNWRAP": "Відмовитися від дозволу на: Розгорнути це ім'я", + "CANNOT_CREATE_SUBDOMAIN": "Відмовитися від дозволу на: Створення піддоменів", + "CANNOT_TRANSFER": "Відмовитися від дозволу на: Надсилання цього імені", + "CANNOT_SET_RESOLVER": "Відмовитися від дозволу на: Встановлення resolver", + "CANNOT_SET_TTL": "Відмовитися від дозволу на: Встановлення TTL", + "CANNOT_BURN_FUSES": "Відмовитися від дозволу на: Зміна дозволів", + "CANNOT_APPROVE": "Відмовитися від дозволу на: Зміна менеджера поновлення" + } + }, + "revokeChangeFuses": { + "title": "Відмовитися від дозволів", + "subtitle": "Відмовляючи від цього дозволу, ви назавжди втратите можливість змінювати будь-які залишкові запобіжники. Це буде скинуто лише якщо ім'я спливе.", + "fuses": { + "CANNOT_BURN_FUSES": "Відмовитися від дозволу на: Зміна дозволів" + } + }, + "revokeChangeFusesWarning": { + "title": "Залишкові дозволи будуть заблоковані", + "subtitle": "Дозволи та користувацькі запобіжники будуть назавжди заблоковані у своєму поточному стані після відкликання дозволу на зміну дозволів. Це буде скинуто лише якщо ім'я спливе." + }, + "lastWarning": { + "title": "Ви абсолютно впевнені?", + "subtitle": "Ви вносите зміни, які можуть бути скасовані тільки коли ім'я спливе ({{date}}).", + "message": "Будь ласка, введіть ваше ENS ім'я ({{name}}) для підтвердження." + } + }, + "action": { + "revoke": "Відмовитися" + } + }, + "unknownLabels": { + "title": "Підтвердіть ваше ім'я", + "subtitle": "Деякі етикетки у вашому імені невідомі. Будь ласка, введіть їх, щоб продовжити." + }, + "deleteEmancipatedSubnameWarning": { + "title": "Це підім'я не може бути відновлено", + "message": "Видалення цього підім'я завадить його використанню або відновленню до його терміну придатності {{date}}. Це не можна скасувати, оскільки права контролю батьківського імені були відкликані." + }, + "deleteSubnameNotParentWarning": { + "title": "Ви не можете відновити це підім'я", + "message": "Тільки {{ownershipTerm}} батьківського імені ({{parentOwner}}) може відновити це підім'я. Ви не зможете відновити це ім'я самостійно після його видалення." + }, + "selectPrimaryName": { + "title": "Виберіть основне ім'я", + "errors": { + "noNamesFound": "Імена не знайдено", + "noEligibleNames": "Немає придатних імен" + } + }, + "resetPrimaryName": { + "title": "Видалити основне ім'я", + "description": "Це ім'я більше не буде відображатися як ім'я для цієї адреси. Однак транзакції на це ім'я все ще будуть направлятися на цю адресу, якщо ви не видалите запис ETH." + }, + "sendName": { + "views": { + "error": { + "title": "Не можна надіслати ім'я", + "description": "У вас немає дозволу на відправлення цього імені." + }, + "search": { + "placeholder": "ENS ім'я або Ethereum адреса", + "views": { + "error": { + "message": "Щось пішло не так. Будь ласка, спробуйте ще раз." + }, + "intro": { + "message": "Шукайте ENS ім'я або ETH адресу" + }, + "noResults": { + "message": "Результатів не знайдено" + } + } + }, + "summary": { + "title": "Надіслати ім'я", + "fields": { + "name": { + "label": "Ім'я", + "expires": "Закінчується {{date}}" + }, + "recipient": "Одержувач", + "options": { + "label": "Опції", + "title": "Скинути профіль", + "description": "Видалити всі записи профілю. Це вимагає додаткових витрат газу." + }, + "summary": { + "title": "Резюме змін", + "updates": { + "role": "Оновити роль {{role}} на {{address}}", + "eth-record": "Оновити запис ETH на {{address}}" + }, + "remove": { + "profile": "Видалити записи профілю" + } + } + } + }, + "confirmation": { + "title": "Надсилання імені", + "description": "Надсилання цього імені передає право власності одержувачу, надаючи йому ваш контроль.", + "warning": "Ви втратите можливість змінювати, отримувати платежі або використовувати це як основне ім'я.", + "learnMore": "Дізнайтеся про надсилання імен" + } + } + }, + "syncManager": { + "title": "Синхронізація менеджера", + "description": "Синхронізація менеджера зробить вас новим менеджером цього імені. Поточний менеджер ({{manager}}) більше не зможе вносити зміни.", + "warning": "Синхронізація менеджера також розгорне це ім'я. Це спалить NFT і скине всі дозволи." + } + }, + "transaction": { + "extendNames": { + "actionValue": "Подовжити реєстрацію", + "costValue": "{{value}} + комісії", + "warning": "Подовження цього імені не дасть вам права власності на нього" + }, + "deleteSubname": { + "warning": "Привіт всім" + } + }, + "intro": { + "migrateAndUpdateResolver": { + "title": "Необхідна дія", + "heading": "Редагування, яке ви хочете зберегти у вашому профілі, потребує оновлення розв'язувача.", + "link": "Дізнайтеся більше про оновлення розв'язувача", + "warning": "Зверніть увагу, що якщо ви скасуєте це в будь-який момент, ваші зміни не будуть збережені." + }, + "syncManager": { + "description": "Синхронізація менеджера зробить вас новим менеджером цього імені. Поточний менеджер ({{manager}}) більше не зможе вносити зміни.", + "wrappedWarning": "Синхронізація менеджера також розгорне це ім'я. Це спалить NFT і скине всі дозволи." + }, + "selectPrimaryName": { + "updateEthAddress": { + "title": "Оновити ETH адресу", + "description": "ETH адреса для цього імені не відповідає цьому гаманцю. Щоб використовувати це як основне ім'я, спочатку потрібно оновити ETH адресу." + }, + "noResolver": { + "title": "Розв'язувач не встановлений", + "description": "Щоб використовувати це як основне ім'я, спочатку потрібно встановити розв'язувач та оновити ETH адресу." + }, + "invalidResolver": { + "title": "Невідповідний розв'язувач встановлений", + "description": "Щоб використовувати це як основне ім'я, спочатку потрібно встановити дійсний розв'язувач та оновити ETH адресу." + } + }, + "multiStepSubnameDelete": { + "title": "Видалити підім'я", + "description": "Видалення цього підім'я потребує кількох транзакцій" + } + }, + "errors": { + "duplicateKey": "{{value}} є дублікатом ключа" + } +} diff --git a/scripts/add-mm-ios-provider.mjs b/scripts/add-mm-ios-provider.mjs deleted file mode 100644 index 1f2b4e763..000000000 --- a/scripts/add-mm-ios-provider.mjs +++ /dev/null @@ -1,19 +0,0 @@ -import fs from 'fs' - -const metamaskMobileProvider = fs.readFileSync( - './node_modules/@metamask/mobile-provider/dist/index.js', - 'utf8', -) - -const transformed = metamaskMobileProvider.match(/'!function\(e\).*'/g) - -if (!transformed[0]) throw new Error('Could not find the metamask mobile provider script.') - -let unescaped = '' - -eval(`unescaped = ${transformed[0]}`) - -unescaped += - '!async function(){await async function(){["interactive","complete"].includes(document.readyState)||await new Promise((e=>window.addEventListener("DOMContentLoaded",e,{once:!0})))}(),window._metamaskSetupProvider()}();' - -fs.writeFileSync('./out/_next/static/chunks/initialise-metamask-ios.js', unescaped) diff --git a/src/assets/Dentity.svg b/src/assets/Dentity.svg new file mode 100644 index 000000000..f35b6e9c2 --- /dev/null +++ b/src/assets/Dentity.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/src/assets/NightSky.tsx b/src/assets/NightSky.tsx deleted file mode 100644 index 05202fb18..000000000 --- a/src/assets/NightSky.tsx +++ /dev/null @@ -1,63 +0,0 @@ -import { ReactNode, useEffect, useRef } from 'react' -import styled, { css } from 'styled-components' - -const Container = styled.div( - ({ theme }) => css` - position: relative; - width: 100%; - height: 100%; - overflow: hidden; - border-radius: ${theme.radii['2xLarge']}; - isolation: isolate; // Safari to clip svgs to border radius - - & > * { - position: relative; - z-index: 1; - background: transparent !important; - } - - canvas { - width: 100%; - height: 100%; - position: absolute; - top: 0; - left: 0; - z-index: 0; - } - `, -) - -export const NightSky = ({ children }: { children: ReactNode }) => { - const ref = useRef(null) - - useEffect(() => { - const canvas = ref.current! - const ctx = canvas.getContext('2d')! - canvas.width = canvas.clientWidth - canvas.height = canvas.clientHeight - const gradient = ctx.createLinearGradient(0, 0, canvas.width, canvas.height) - gradient.addColorStop(0, '#1B418B') - gradient.addColorStop(1, '#090754') - - ctx.fillStyle = gradient - ctx.fillRect(0, 0, canvas.width, canvas.height) - const starCount = 100 - for (let i = 0; i < starCount; i += 1) { - const x = Math.floor(Math.random() * canvas.width) - const y = Math.floor(Math.random() * canvas.height) - ctx.beginPath() - ctx.arc(x, y, 1, 0, Math.PI * 2, false) - ctx.fillStyle = '#fff' - ctx.globalAlpha = - Math.random() * ((x * y * 1.5) / (ctx.canvas.width * ctx.canvas.height)) + 0.2 - ctx.fill() - } - }, []) - - return ( - - {children} - - - ) -} diff --git a/src/assets/Trash.svg b/src/assets/Trash.svg new file mode 100644 index 000000000..080b8507a --- /dev/null +++ b/src/assets/Trash.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/VerifiedPerson.svg b/src/assets/VerifiedPerson.svg new file mode 100644 index 000000000..26de2cef8 --- /dev/null +++ b/src/assets/VerifiedPerson.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/VerifiedRecord.svg b/src/assets/VerifiedRecord.svg new file mode 100644 index 000000000..e0f247027 --- /dev/null +++ b/src/assets/VerifiedRecord.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/verification/Dentity.svg b/src/assets/verification/Dentity.svg new file mode 100644 index 000000000..f35b6e9c2 --- /dev/null +++ b/src/assets/verification/Dentity.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/src/assets/verification/DynamicVerificationIcon.tsx b/src/assets/verification/DynamicVerificationIcon.tsx new file mode 100644 index 000000000..653cdf10a --- /dev/null +++ b/src/assets/verification/DynamicVerificationIcon.tsx @@ -0,0 +1,17 @@ +import dynamic from 'next/dynamic' + +import { VerificationProtocol } from '../../transaction-flow/input/VerifyProfile/VerifyProfile-flow' + +export const verificationIconTypes: { + [key in VerificationProtocol]: any +} = { + dentity: dynamic(() => import('./Dentity.svg')), +} + +export const DynamicVerificationIcon = ({ name }: { name: VerificationProtocol }) => { + if (name in verificationIconTypes) { + const Icon = verificationIconTypes[name] + return + } + return null +} diff --git a/src/components/@atoms/Banner/Banner.tsx b/src/components/@atoms/Banner/Banner.tsx deleted file mode 100644 index b5a528912..000000000 --- a/src/components/@atoms/Banner/Banner.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import { PropsWithChildren } from 'react' -import styled, { css } from 'styled-components' - -const Container = styled.div<{ $zIndex?: number }>( - ({ $zIndex }) => css` - width: 100%; - aspect-ratio: 6/1; - position: relative; - ${$zIndex && `z-index: ${$zIndex};`} - `, -) - -const InnerContainer = styled.div( - ({ theme }) => css` - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-image: ${theme.colors.gradients.blue}; - `, -) - -type Props = { - zIndex?: number -} - -export const Banner = ({ zIndex, children }: PropsWithChildren) => { - return ( - - {children} - - ) -} diff --git a/src/components/@atoms/DisabledButton.tsx b/src/components/@atoms/DisabledButton.tsx deleted file mode 100644 index 609a77a52..000000000 --- a/src/components/@atoms/DisabledButton.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import styled, { css } from 'styled-components' - -import { Button } from '@ensdomains/thorin' - -export const DisabledButton = styled(Button)( - () => css` - filter: grayscale(100%); - opacity: 0.5; - pointer-events: none; - `, -) diff --git a/src/components/@atoms/NameDetailItem/NameDetailItem.tsx b/src/components/@atoms/NameDetailItem/NameDetailItem.tsx index 6878948d4..2bd429887 100644 --- a/src/components/@atoms/NameDetailItem/NameDetailItem.tsx +++ b/src/components/@atoms/NameDetailItem/NameDetailItem.tsx @@ -160,10 +160,19 @@ export const NameDetailItem = ({ $highlight={mode === 'select' && selected} as={mode !== 'select' ? 'a' : 'div'} data-testid={`name-item-${name}`} - onClick={name !== INVALID_NAME ? handleClick : undefined} + className="name-detail-item" > - + { + e.preventDefault() + + if (name !== INVALID_NAME && !disabled) { + handleClick() + } + }} + > ( - ({ theme, $isActive, disabled }) => css` - white-space: nowrap; - color: ${theme.colors.textTertiary}; - font-weight: ${theme.fontWeights.bold}; - font-size: ${theme.fontSizes.large}; - cursor: pointer; - transition: color 0.125s ease-in-out; - ${disabled - ? css` - color: ${theme.colors.greyPrimary}; - cursor: not-allowed; - ` - : css` - &:hover { - color: ${theme.colors.textPrimary}; - } - `} - ${$isActive && - css` - color: ${theme.colors.accent}; - `} - `, -) - -export const StyledNavLink = ({ - children, - disabled, - ...props -}: PropsWithChildren & { - disabled?: boolean -}) => { - const router = useRouter() - - return ( - ( - - {wrapperChildren} - - )} - > - - {children} - - - ) -} diff --git a/src/components/@atoms/Title.tsx b/src/components/@atoms/Title.tsx deleted file mode 100644 index c2b462fe3..000000000 --- a/src/components/@atoms/Title.tsx +++ /dev/null @@ -1,7 +0,0 @@ -import Head from 'next/head' - -export const Title = (title?: string) => ( - - {title}ENS - -) diff --git a/src/components/@atoms/TypographyWithAnimatedEllipses.tsx b/src/components/@atoms/TypographyWithAnimatedEllipses.tsx deleted file mode 100644 index 4cc920095..000000000 --- a/src/components/@atoms/TypographyWithAnimatedEllipses.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import styled, { css, DefaultTheme, keyframes } from 'styled-components' - -import { Typography } from '@ensdomains/thorin' - -const generateBgImg = (percent: number, theme: DefaultTheme) => css` - background-image: linear-gradient( - 90deg, - rgba(${theme.colors.greyPrimary}, 1) 0%, - rgba(${theme.colors.greyPrimary}, 1) ${percent}%, - rgba(${theme.colors.greyPrimary}, 0) ${percent}% - ); -` - -const ellipsesAnimation = ({ theme }: { theme: DefaultTheme }) => keyframes` - 33% { - ${generateBgImg(33, theme)} - } - 66% { - ${generateBgImg(66, theme)} - } - 100% { - ${generateBgImg(100, theme)} - } -` - -export const TypographyWithAnimatedEllipses = styled(Typography)( - ({ theme }) => css` - &::after { - content: '...'; - ${generateBgImg(100, theme)} - /* stylelint-disable-next-line property-no-vendor-prefix */ - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; - animation: ${ellipsesAnimation} 2s linear infinite; - } - `, -) diff --git a/src/components/@molecules/NameListView/NameListView.tsx b/src/components/@molecules/NameListView/NameListView.tsx index ef82331a2..0aae5fede 100644 --- a/src/components/@molecules/NameListView/NameListView.tsx +++ b/src/components/@molecules/NameListView/NameListView.tsx @@ -74,13 +74,6 @@ export const NameListView = ({ address, selfAddress, setError, setLoading }: Nam const [mode, setMode] = useState('view') const [selectedNames, setSelectedNames] = useState([]) - const handleClickName = (name: Name) => () => { - if (selectedNames.includes(name)) { - setSelectedNames(selectedNames.filter((n) => n !== name)) - } else { - setSelectedNames([...selectedNames, name]) - } - } const [sortType, setSortType] = useQueryParameterState('sort', 'expiryDate') const [sortDirection, setSortDirection] = useQueryParameterState( @@ -156,14 +149,28 @@ export const NameListView = ({ address, selfAddress, setError, setLoading }: Nam // eslint-disable-next-line react-hooks/exhaustive-deps }, [stage]) + const isNameExtendable = (name: Name) => name.parentName === 'eth' + const isNameDisabled = useCallback( (name: Name) => { if (mode !== 'select') return false - return name.parentName !== 'eth' + return !isNameExtendable(name) }, [mode], ) + const handleClickName = (name: Name) => () => { + if (!isNameExtendable(name)) return + + const isExists = selectedNames.find((n) => n.id === name.id) + + const _selectedNames = isExists + ? selectedNames.filter((n) => n.id !== name.id) + : [...selectedNames, name] + setSelectedNames(_selectedNames) + setMode(_selectedNames.length ? 'select' : 'view') + } + const isLoading = isNamesLoading || !address return ( @@ -175,9 +182,9 @@ export const NameListView = ({ address, selfAddress, setError, setLoading }: Nam sortDirection={sortDirection} searchQuery={searchInput} selectedCount={selectedNames.length} - onModeChange={(m) => { - setMode(m) - setSelectedNames([]) + onModeChange={(value) => { + setMode(value) + setSelectedNames(value === 'view' ? [] : [...names].filter(isNameExtendable)) }} onSortDirectionChange={setSortDirection} onSortTypeChange={setSortType} diff --git a/src/components/@molecules/NamePill.tsx b/src/components/@molecules/NamePill.tsx deleted file mode 100644 index 08cd42e23..000000000 --- a/src/components/@molecules/NamePill.tsx +++ /dev/null @@ -1,56 +0,0 @@ -import styled, { css } from 'styled-components' - -import { Typography } from '@ensdomains/thorin' - -import { NameAvatar } from '../AvatarWithZorb' - -const Container = styled.div( - ({ theme }) => css` - border-radius: ${theme.radii.full}; - border: 1px solid ${theme.colors.border}; - padding: ${theme.space['1']}; - padding-right: ${theme.space['4']}; - - height: ${theme.space['9']}; - - display: flex; - flex-direction: row; - align-items: center; - justify-content: flex-start; - gap: ${theme.space['2']}; - `, -) - -const AvatarWrapper = styled.div( - ({ theme }) => css` - flex: 0 0 ${theme.space['7']}; - width: ${theme.space['7']}; - height: ${theme.space['7']}; - `, -) - -const TypographyWrapper = styled.div( - () => css` - flex: 1; - overflow: hidden; - `, -) - -export const NamePill = ({ - name, - truncatedName = name, -}: { - name: string - truncatedName?: string -}) => { - return ( - - - - - - {truncatedName} - - - ) -} diff --git a/src/components/@molecules/NameTableFooter/NameTableFooter.tsx b/src/components/@molecules/NameTableFooter/NameTableFooter.tsx deleted file mode 100644 index ff6978c67..000000000 --- a/src/components/@molecules/NameTableFooter/NameTableFooter.tsx +++ /dev/null @@ -1,79 +0,0 @@ -import { ComponentProps } from 'react' -import { useTranslation } from 'react-i18next' -import styled, { css } from 'styled-components' - -import { PageButtons, Select } from '@ensdomains/thorin' - -import { useBreakpoint } from '@app/utils/BreakpointProvider' - -const Container = styled.div( - ({ theme }) => css` - width: 100%; - display: flex; - justify-content: space-between; - flex-direction: row; - align-items: center; - padding: ${theme.space['3']} ${theme.space['3']}; - border-top: 1px solid ${theme.colors.border}; - `, -) - -type PageButtonProps = ComponentProps - -type Props = { - pageSize: number - onPageSizeChange?: (results: number) => void -} & Omit - -export const NameTableFooter = ({ - pageSize, - onPageSizeChange, - max: _max, - alwaysShowFirst: _alwaysShowFirst, - alwaysShowLast: _alwaysShowLast, - ...props -}: Props) => { - const { t } = useTranslation('common') - const breakpoints = useBreakpoint() - - const pageSizeOptions = [5, 10, 25, 50, 100].map((value) => ({ - label: t('unit.perPage', { count: value }), - value: value.toString(), - })) - - /* eslint-disable no-nested-ternary */ - const max = typeof _max === 'number' ? _max : breakpoints.sm ? 5 : 3 - const alwaysShowFirst = typeof _alwaysShowFirst === 'boolean' ? _alwaysShowFirst : breakpoints.sm - const alwaysShowLast = typeof _alwaysShowLast === 'boolean' ? _alwaysShowLast : breakpoints.sm - - return ( - - -
-