diff --git a/docs/plans/vlrsr-self-appreciating-vaults.md b/docs/plans/vlrsr-self-appreciating-vaults.md new file mode 100644 index 000000000..9880d2770 --- /dev/null +++ b/docs/plans/vlrsr-self-appreciating-vaults.md @@ -0,0 +1,50 @@ +# vlRSR Self-Appreciating Vote-Lock Vault Support + +## Goal + +Register correctly quotes, unlocks, and displays self-appreciating StakingVaults (first: vlRSR `0xE744C8157c346B2931807F42552c8CBc0BB6D34f` on BSC): unlock tab operates in shares via `redeem`, lock tab shows real shares-out, governance and portfolio show exchange rate + redeemable underlying instead of assuming 1:1. Powered by dtf-sdk 0.5.1 (`prepareVoteLockRedeem`, `VoteLockState.shareBalance`/`exchangeRate`, preview hooks). + +## Current state + +- vlRSR streams tokenJar-converted RSR into the vault (half-life drip); rate ≈ 1.0188, `getAllRewardTokens() = []`. +- Drawer assumes 1:1: `vote-lock.tsx` echoes input as shares out; `vote-unlock.tsx` takes an asset-denominated input labeled as vlRSR (`unlockBalanceAtom` = maxWithdraw); tx = `withdraw(assets)`. +- Governance card: hardcoded `AUTO_ACCRUING_REWARD_VAULTS` Set; "Automatic" branch requires `otherDtfCount > 0`. +- Portfolio rows show API `amount` (shares) priced 1:1 (API bug, out of scope). +- `previewDeposit`/`previewRedeem` are exact and ≈1:1 for legacy vaults → quotes need no vault-type detection. +- Subgraph has no per-user cost basis → no "earned" number until subgraph slice (separate repo). + +## Non-goals + +- reserve-api share-pricing fix; earn-view "Your lock" valuation; per-user earned before subgraph deploy; tokenJar UI/SDK plumbing; `optimisticStakingVaultAddress` map. + +## Acceptance evidence + +| Criterion | Evidence | +| --- | --- | +| Unlock = shares → redeem for all vaults | e2e flow decodes `redeem(shares, account, account)` calldata from txLog; visual check bsc/photon + one legacy vault | +| Lock quote shows previewDeposit shares | visual check both vault types (vlRSR ≈ input/1.0188; legacy = input), light+dark | +| Governance card catalog-driven, Automatic decoupled from otherDtfCount, rate/redeemable line | smoke governance spec extended on bsc/photon; visual check | +| Portfolio flagged rows show redeemable + rate, fallback to API on RPC failure | portfolio partial-response spec green; visual check | +| Scoped verify green per slice | `scope.mjs --base ` output; `--gate` at closeout | + +## Test seams + +- e2e `e2e/helpers/rpc.ts` callOverrides: add `convertToAssets` (`0x07a2d13a`) + per-address `previewDeposit` (`0xef8b30f7`) / `previewRedeem` (`0x4cdad506`) with 1.0188-rate values on bsc/photon vlRSR fixture. +- Drawer submit buttons via wallet fixture + txLog decode. +- SDK-side behavior already unit-tested in dtf-sdk (`vote-lock.test.ts`). + +## Slices + +- Slice B: drawer shares-based unlock + lock quote (src/components/vote-lock/); blocked by: SDK 0.5.1 (local-linked during dev; pin bump before merge) +- Slice C: catalog in constants + governance card rate/redeemable; blocked by: B (drawer state carries exchangeRate) +- Slice D: portfolio redeemable for flagged rows; blocked by: SDK 0.5.1 only (parallel to C) + +## Follow-ups discovered during implementation + +- ~~Yield staking table stRSR share-vs-asset bug~~ FIXED same day: `YourStakeCell` reads per-row `exchangeRate()` and mirrors reserve-api portfolioService math (`shares × rate × rsrPrice`); display now RSR-denominated like the TVL column. Verified against portfolioService.ts:606-611. +- MetaMask + BSC EIP-7825 failure mode (documented 2026-07-31): a wallet-node lag on a fresh approval makes the wallet's estimate revert → MetaMask falls back to 35% of block gas limit (19.25M) → BSC's 2²⁴ per-tx cap rejects it. Pre-existing race, fatal only since the Apr 2026 Osaka/Mendel hardfork; not caused by app code (no `gas` is set). Staled by Luis — revisit only if reports recur. + +## Unresolved decisions + +- e2e preview mocks: central fixed-value vs per-address 1.0188 overrides — decide while writing the drawer flow spec (leaning per-address for a real-rate assertion). +- Engineer review required before ship: SDK calldata surface (dtf-sdk) + withdraw→redeem tx change + governance card (register). diff --git a/docs/wiki/progress.md b/docs/wiki/progress.md index 31b4dd56b..930c614c4 100644 --- a/docs/wiki/progress.md +++ b/docs/wiki/progress.md @@ -1,6 +1,6 @@ --- title: Progress -updated: 2026-07-28 +updated: 2026-07-31 type: ledger --- @@ -10,6 +10,7 @@ Stage ledger. One row per stage; keep entries short. Verifier = exact fresh comm | Stage | Status | Verifier | Review | Next | |---|---|---|---|---| +| vlRSR self-appreciating vaults: drawer shares/redeem + rate line · governance card · portfolio · earn rate-corrected + APY | human-review-required (base d0427a7cf; SDK local-linked) | gate green: typecheck+lint+847 unit · 72 helper · smoke 58 · drawer spec 2/2 · live BSC visual light+dark incl. earn TVL 261.5M RSR = totalAssets | Dark + Light on both diffs; all blockers fixed; details in git | PR #1072 open on SDK 0.5.1 (published, pinned exact; direct sdk dep dropped). Companions: dtf-interface#29, reserve-api#236 (deploy w/ daos CDN purge). **Engineer review**: withdraw→redeem for ALL vaults, governance card, api token.price×rate. [plan](../plans/vlrsr-self-appreciating-vaults.md) | | focused-tab automatic chain switching | human-review-required (base b2fcf72c6) | lint/typecheck · unit 840 incl. 8 focus/visibility · helpers 70 · smoke 56 + 1 skipped · wiki-lint | Dark + Light: stale Index target + mutation-boundary focus recheck fixed; automatic switching preserved, background tabs passive | Engineer review wallet/chain flow; then ship | | vote-lock APR unified on /dtf/daos list | done (base 771c92873) | gate-equivalent green (lint/typecheck/unit, 70 helper, 56 smoke, wiki-lint) · live visual: BUILDOUT + POWER overviews and earn all 46.83% from one list request | Dark + Light, per-claim verify — adopted: list-miss/error fallback gating, plain-data return, catalog mixed-case normalization; API re-key REVERTED by Luis (sdk `getVoteLockDao` needs the DTF-address key); accepted: unlisted DTFs keep per-DTF detail cache split | pre-existing reserve-api debt flagged, not shipped: maxAge-before-await caches 500s 24h; unguarded `underlyingPrice.price` deref can 500 whole list | | merge master RFQ into feature hardening | human-review-required (base 0237e747c; merged `origin/master` 981b634d7; observed CLS explicitly out of scope) | frozen install · scoped gate-equivalent: lint/typecheck, 832 unit, 70 helper, 56 smoke + 1 known fixme · zap 21 · production build · wiki-lint pending | Dark + Light pass; SDK 0.5.0 pin + zapper 2.7.1 reconciled; hardening guards preserved; engineer review required for live RFQ/intent execution | commit merge locally; do not push | @@ -42,6 +43,7 @@ Stage ledger. One row per stage; keep entries short. Verifier = exact fresh comm ### E2E coverage debt (fail-loud workarounds to pay down) - **Index/Arbitrum egress assertion owed**: a spec inspecting `boundaryRequests` asserting NO Index-domain call carries chainId 42161 (with a Yield-positive counterpart — dtf-yield keeps Arbitrum). A green smoke does NOT prove this: teardown only fails on unmocked calls and the RPC mock answers Arbitrum generically. +- **Vote-lock (vlRSR) uncovered paths** (Codex review 2026-07-31): external Earn/portfolio drawer first-open (the hook-order crash path — fixed, untested); portfolio live-zero + RPC-error fallback branches; governance card rate/redeemable presentation; a legacy 1:1 vault through the universal redeem path (drawer spec only covers vlRSR); earn cell RPC-failure fallback (skeleton→1:1). A mock strict enough that a spec routes AROUND its gap silently shrinks the covered surface. Every in-spec workaround belongs here as tracked debt — not a diff --git a/e2e/TEST_MAP.md b/e2e/TEST_MAP.md index bee747c4d..6bb5fe61d 100644 --- a/e2e/TEST_MAP.md +++ b/e2e/TEST_MAP.md @@ -42,6 +42,7 @@ the directory). | Issuance – Manual | [issuance/manual-write](tests/index-dtf/issuance/manual-write.spec.ts), [flows/issuance-manual](tests/flows/issuance-manual.spec.ts), [flows/issuance-manual-boundaries](tests/flows/issuance-manual-boundaries.spec.ts), [flows/issuance-deprecated](tests/flows/issuance-deprecated.spec.ts), [flows/failures-issuance](tests/flows/failures-issuance.spec.ts), [flows/compliance-surfaces](tests/flows/compliance-surfaces.spec.ts) | mint/redeem full tx flow; MAX/minSharesOut/decimal-truncation/disabled-input math boundaries; mint-twice no re-approve; deprecated forces sell-only; reject/revert recovery; per-DTF restriction disables mint, redeem stays open | none | no | fixme below (redeem zero-slippage leg) | | Issuance – Automated (CoW) | — | — | — | — | entirely uncovered, no testids yet | | Governance – list/overview | [governance/lifecycle](tests/index-dtf/governance/lifecycle.spec.ts), [governance/photon-featured](tests/index-dtf/governance/photon-featured.spec.ts) | list skeleton→proposals; real captured proposal history renders | partial | yes | — | +| Governance – vote-lock drawer | [flows/vote-lock-drawer](tests/flows/vote-lock-drawer.spec.ts) | unlock submits `redeem(shares, account, account)` with previewRedeem-quoted output (self-appreciating rate); lock tab shows previewDeposit shares-out quote | none | no | delegate tab; lock full tx (approve+deposit); reject/revert | | Governance – proposal (view/vote) | [flows/governance-states](tests/flows/governance-states.spec.ts), [flows/governance-multichain](tests/flows/governance-multichain.spec.ts), [flows/governance-permissions](tests/flows/governance-permissions.spec.ts), [flows/governance-support-variants](tests/flows/governance-support-variants.spec.ts), [flows/governance-vote](tests/flows/governance-vote.spec.ts), [flows/governance-queue-execute](tests/flows/governance-queue-execute.spec.ts), [flows/governance-writes-v4](tests/flows/governance-writes-v4.spec.ts), [flows/failures-governance](tests/flows/failures-governance.spec.ts), [flows/governance-description-render](tests/flows/governance-description-render.spec.ts) | PENDING/DEFEATED/QUORUM_NOT_REACHED/EXECUTED/QUEUED states (×chains, v4 governor); For/Against/Abstain vote encode; zero-power/already-voted/window-closed CTA gating; canceller-gated cancel; vote/queue/execute full tx + reject/revert; markdown sanitizer XSS hardening (script/iframe/img-onerror) | none | no | optimistic governance flow (see gaps) | | Governance – create Basket | [flows/governance-propose-basket](tests/flows/governance-propose-basket.spec.ts) | form renders current basket; empty-change guard blocks prepare | none | no | price/liquidity preview, submitted calldata assertion | | Governance – create DTF Settings | [flows/governance-propose-dtf-settings](tests/flows/governance-propose-dtf-settings.spec.ts) | TVL fee / Mint fee round-trip into setter calldata; no-change keeps confirm disabled | none | no | — | diff --git a/e2e/helpers/rpc.ts b/e2e/helpers/rpc.ts index ef4311d42..9cf1d8557 100644 --- a/e2e/helpers/rpc.ts +++ b/e2e/helpers/rpc.ts @@ -210,6 +210,12 @@ for (const address of [ '0x4200000000000000000000000000000000000006', // WETH '0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf', // cbBTC '0xaB36452DbAC151bE02b16Ca17d8919826072f64a', // RSR + // BSC — mirrors TokenBalancesUpdater's ZAP_TOKENS[BSC]; RSR bsc is already + // seeded via the photon fixture's basket metadata, but that's incidental + // (per-fixture), so list the chain's canonical set explicitly like the + // other chains above. + '0x2170Ed0880ac9A755fd29B2688956BD959F933F8', // WETH + '0x55d398326f99059fF775485246999027B3197955', // USDT ]) { knownTokenAddresses.add(address.toLowerCase()) } @@ -438,6 +444,30 @@ function seedChainState() { callOverrides[`${contract.toLowerCase()}:${selector}`] = ZERO_RETURN } } + // Vote-lock state multicall reads shares + rate off the vault. Baseline: + // zero share balance, identity (1:1) exchange rate — self-appreciating + // vault specs override convertToAssets per-address with a real rate. + if (metadata.stToken?.id) { + const vault = metadata.stToken.id.toLowerCase() + callOverrides[`${vault}:0x70a08231`] = ZERO_RETURN // balanceOf(account) + callOverrides[`${vault}:0x07a2d13a`] = encodeAbiParameters( + // convertToAssets(1e18) → 1e18 + [{ type: 'uint256' }], + [10n ** 18n] + ) + // The governance card's exchange-rate badge fires previewRedeem(1 share) + // UNCONDITIONALLY on every self-appreciating-vault DTF page view (no + // wallet needed) — every such page, not just vote-lock-drawer specs, + // needs an answer. Same identity baseline + same caveat as + // convertToAssets above: this answers ANY previewRedeem call on the + // vault (selector-only match), so a spec quoting a DIFFERENT share + // amount must still override it per-test with the real rate. + callOverrides[`${vault}:0x4cdad506`] = encodeAbiParameters( + // previewRedeem(1e18 shares) → 1e18 assets + [{ type: 'uint256' }], + [10n ** 18n] + ) + } } // These balances are polled by the wallet updater on every Base page and are diff --git a/e2e/helpers/tests/rpc.test.ts b/e2e/helpers/tests/rpc.test.ts index 84c343b1a..ddd45cb23 100644 --- a/e2e/helpers/tests/rpc.test.ts +++ b/e2e/helpers/tests/rpc.test.ts @@ -3,7 +3,8 @@ import { describe, expect, it, vi } from 'vitest' import { chainIdForUrl, handleRpcMethod, setYieldReplay, type RpcContext } from '../rpc' import { MockOverrides } from '../overrides' import type { TxRecord } from '../provider' -import { findDtfByAddress, TEST_ADDRESS } from '../registry' +import { findDtfByAddress, REGISTRY, TEST_ADDRESS } from '../registry' +import { loadSnapshot } from '../snapshots' const HASH = `0x${'1'.repeat(64)}` @@ -381,6 +382,34 @@ describe('connected-wallet yield defaults (KNOWN → silent zero, UNKNOWN → fa }) }) +// Non-yield (index) path: TokenBalancesUpdater polls balanceOf on the chain's +// ZAP_TOKENS + RSR_ADDRESS for every connected wallet, on every chain, +// regardless of which page is open. BSC's set (WETH, USDT) must be KNOWN +// centrally like Mainnet's and Base's, or the FIRST wallet-connected BSC spec +// fails loud on a boundary that has nothing to do with what it's testing. +describe('connected-wallet INDEX defaults (BSC ZAP tokens)', () => { + const call = (to: string, data: string, ctx: RpcContext, overrides?: MockOverrides) => + handleRpcMethod('eth_call', [{ to, data }], { ...ctx, overrides }) + const balanceOf = (owner: string) => + encodeFunctionData({ + abi: parseAbi(['function balanceOf(address)']), + functionName: 'balanceOf', + args: [owner as `0x${string}`], + }) + + it('BSC ZAP tokens (WETH, USDT): test-wallet balanceOf → 0, silently', () => { + const ctx = { ...context(), chainId: 56 } + for (const token of [ + '0x2170Ed0880ac9A755fd29B2688956BD959F933F8', // WETH + '0x55d398326f99059fF775485246999027B3197955', // USDT + ]) { + const r = call(token, balanceOf(TEST_ADDRESS), ctx) as `0x${string}` + expect(BigInt(r)).toBe(0n) + } + expect(ctx.log).not.toHaveBeenCalled() + }) +}) + describe('failure-oriented unmocked messages', () => { it('names the function and points at the helper for an uncaptured yield read', () => { setYieldReplay(1) @@ -402,6 +431,37 @@ describe('failure-oriented unmocked messages', () => { }) }) +describe('vote-lock vault identity defaults (convertToAssets / previewRedeem)', () => { + const photon = REGISTRY.find((d) => d.slug === 'photon')! + interface PhotonSnapshot { + dtf: { stToken: { id: string } } + } + const { dtf } = loadSnapshot(`${photon.snapshotDir}/dtf.json`) + const vault = dtf.stToken.id + + // The governance card's exchange-rate badge reads previewRedeem(1 share) + // UNCONDITIONALLY for a self-appreciating vault (no wallet, no per-test + // seed) — every DTF page view needs a default, not just vote-lock-drawer + // specs, or the whole page fails loud on a read it doesn't control. + it('convertToAssets(1e18) and previewRedeem(1e18) answer identity (1:1) with no override', () => { + const abi = parseAbi([ + 'function convertToAssets(uint256) view returns (uint256)', + 'function previewRedeem(uint256) view returns (uint256)', + ]) + const call = (functionName: 'convertToAssets' | 'previewRedeem') => { + const data = encodeFunctionData({ abi, functionName, args: [10n ** 18n] }) + const result = handleRpcMethod('eth_call', [{ to: vault, data }], { + ...context(), + chainId: photon.chainId, + }) as `0x${string}` + return decodeAbiParameters([{ type: 'uint256' }], result)[0] + } + + expect(call('convertToAssets')).toBe(10n ** 18n) + expect(call('previewRedeem')).toBe(10n ** 18n) + }) +}) + describe('address-specific protocol versions', () => { it('preserves captured v4 and v5 version gates', () => { const v5 = findDtfByAddress('0x4dA9A0f397dB1397902070f93a4D6ddBC0E0E6e8')! diff --git a/e2e/tests/flows/vote-lock-drawer.spec.ts b/e2e/tests/flows/vote-lock-drawer.spec.ts new file mode 100644 index 000000000..0dbcb5eaa --- /dev/null +++ b/e2e/tests/flows/vote-lock-drawer.spec.ts @@ -0,0 +1,230 @@ +/** + * Index DTF vote-lock drawer — WRITE flow for the shares-based unlock rework + * (src/components/vote-lock/): unlock now inputs vault SHARES (redeem, not + * withdraw) and lock shows a real previewDeposit shares-out quote instead of + * assuming 1:1. See docs/plans/vlrsr-self-appreciating-vaults.md. + * + * Fixture: bsc/photon — its stToken (vlRSR) is the registry's ONE + * self-appreciating vault (rate ~1.0188 underlying per share), so this is the + * fixture that actually exercises share/asset math instead of a 1:1 vault + * where the bug would be invisible. + */ +import { + decodeFunctionData, + encodeAbiParameters, + encodeFunctionData, + getAddress, + parseAbi, + parseUnits, + type Hex, +} from 'viem' +import { test, expect } from '../../harness' +import { REGISTRY, TEST_ADDRESS } from '../../helpers/registry' +import { loadSnapshot } from '../../helpers/snapshots' + +const dtf = REGISTRY.find((d) => d.slug === 'photon')! + +interface PhotonSnapshot { + dtf: { + stToken: { + id: string + token: { decimals: number } + underlying: { address: string; decimals: number } + } + } +} +const { dtf: photonData } = loadSnapshot( + `${dtf.snapshotDir}/dtf.json` +) +const VAULT = getAddress(photonData.stToken.id) +const RSR = getAddress(photonData.stToken.underlying.address) +const SHARE_DECIMALS = photonData.stToken.token.decimals +const UNDERLYING_DECIMALS = photonData.stToken.underlying.decimals + +const VAULT_ABI = parseAbi([ + 'function balanceOf(address) view returns (uint256)', + 'function convertToAssets(uint256) view returns (uint256)', + 'function previewRedeem(uint256) view returns (uint256)', + 'function previewDeposit(uint256) view returns (uint256)', + 'function maxWithdraw(address) view returns (uint256)', + 'function unstakingDelay() view returns (uint256)', + 'function redeem(uint256,address,address) returns (uint256)', +]) +const ERC20_BALANCE_ABI = parseAbi([ + 'function balanceOf(address) view returns (uint256)', +]) + +const ONE_SHARE = parseUnits('1', SHARE_DECIMALS) +const ONE_UNDERLYING = parseUnits('1', UNDERLYING_DECIMALS) + +// vlRSR's self-appreciating exchange rate (~1.0188 underlying per share, per +// the plan doc). ONE constant feeds convertToAssets, previewRedeem, AND the +// unlock-tab quote assertion, so the mock and the assertion can't drift apart. +const EXCHANGE_RATE = '1.0188' +const EXCHANGE_RATE_RAW = parseUnits(EXCHANGE_RATE, UNDERLYING_DECIMALS) + +// previewDeposit(1 underlying) at the same rate: 1 / 1.0188. +const LOCK_SHARES_OUT = '0.98155' +const LOCK_SHARES_OUT_RAW = parseUnits(LOCK_SHARES_OUT, SHARE_DECIMALS) + +function encodeUint(value: bigint): Hex { + return encodeAbiParameters([{ type: 'uint256' }], [value]) +} + +// bsc — the wallet must report the fixture's chain or the write path shows +// "Switch network" instead of a submit button. +test.use({ walletChain: 56 }) + +test('vote-lock drawer: unlock submits redeem() with share-denominated args @smoke', async ({ + harness, + overrides, +}) => { + const page = harness.page + + overrides.ethCall( + VAULT, + encodeFunctionData({ + abi: VAULT_ABI, + functionName: 'balanceOf', + args: [TEST_ADDRESS], + }), + encodeUint(parseUnits('1000', SHARE_DECIMALS)) + ) + overrides.ethCall( + VAULT, + encodeFunctionData({ + abi: VAULT_ABI, + functionName: 'convertToAssets', + args: [ONE_SHARE], + }), + encodeUint(EXCHANGE_RATE_RAW) + ) + // Fires twice for the same shares amount: the governance card's exchange- + // rate badge (unconditional) AND the unlock tab's quote — same calldata. + overrides.ethCall( + VAULT, + encodeFunctionData({ + abi: VAULT_ABI, + functionName: 'previewRedeem', + args: [ONE_SHARE], + }), + encodeUint(EXCHANGE_RATE_RAW) + ) + overrides.ethCall( + VAULT, + encodeFunctionData({ + abi: VAULT_ABI, + functionName: 'maxWithdraw', + args: [TEST_ADDRESS], + }), + encodeUint(parseUnits('1018.8', UNDERLYING_DECIMALS)) + ) + // 14-day delay so the submit button's copy reads "Begin 14-day unlock delay" + // instead of the central zero default. + overrides.ethCall( + VAULT, + encodeFunctionData({ abi: VAULT_ABI, functionName: 'unstakingDelay' }), + encodeUint(1_209_600n) + ) + + await harness.chain.freezeAt(Math.floor(Date.now() / 1000)) + await harness.goto(dtf, 'governance') + await harness.wallet.connect() + + await expect(async () => { + await harness.chain.advance(4_000) + await expect(page.getByTestId('vote-lock-open-btn')).toBeVisible() + }).toPass({ timeout: 20_000 }) + await page.getByTestId('vote-lock-open-btn').click() + await page.getByTestId('vote-lock-tab-unlock').click() + + await page.getByTestId('vote-unlock-input').fill('1') + // Pump past the 300ms debounce + react-query's notifyManager flush (a + // paused clock freezes both) so the previewRedeem quote reaches the DOM. + await expect(async () => { + await harness.chain.advance(4_000) + await expect(page.getByTestId('vote-unlock-output')).toHaveValue( + EXCHANGE_RATE + ) + }).toPass({ timeout: 20_000 }) + + const submit = page.getByTestId('vote-unlock-submit') + await expect(async () => { + await harness.chain.advance(4_000) + await expect(submit).toBeEnabled() + }).toPass({ timeout: 20_000 }) + + harness.tx.confirm() + await submit.click() + await harness.chain.advance(10_000) + + await expect.poll(() => harness.tx.log.length, { timeout: 15_000 }).toBe(1) + const sent = harness.tx.last()! + expect(sent.to.toLowerCase()).toBe(VAULT.toLowerCase()) + expect(sent.chainId).toBe(dtf.chainId) + const decoded = decodeFunctionData({ + abi: VAULT_ABI, + data: sent.data as Hex, + }) + expect(decoded.functionName).toBe('redeem') + expect(decoded.args).toEqual([ONE_SHARE, TEST_ADDRESS, TEST_ADDRESS]) +}) + +test('vote-lock drawer: lock tab shows previewDeposit shares-out quote @smoke', async ({ + harness, + overrides, +}) => { + const page = harness.page + + overrides.ethCall( + VAULT, + encodeFunctionData({ + abi: VAULT_ABI, + functionName: 'previewDeposit', + args: [ONE_UNDERLYING], + }), + encodeUint(LOCK_SHARES_OUT_RAW) + ) + // The governance card's exchange-rate badge fires previewRedeem(1 share) + // unconditionally for a self-appreciating vault, independent of which tab + // is open — must be mocked or the page itself fails teardown. + overrides.ethCall( + VAULT, + encodeFunctionData({ + abi: VAULT_ABI, + functionName: 'previewRedeem', + args: [ONE_SHARE], + }), + encodeUint(EXCHANGE_RATE_RAW) + ) + overrides.ethCall( + RSR, + encodeFunctionData({ + abi: ERC20_BALANCE_ABI, + functionName: 'balanceOf', + args: [TEST_ADDRESS], + }), + encodeUint(parseUnits('1000', UNDERLYING_DECIMALS)) + ) + + await harness.chain.freezeAt(Math.floor(Date.now() / 1000)) + await harness.goto(dtf, 'governance') + await harness.wallet.connect() + + await expect(async () => { + await harness.chain.advance(4_000) + await expect(page.getByTestId('vote-lock-open-btn')).toBeVisible() + }).toPass({ timeout: 20_000 }) + await page.getByTestId('vote-lock-open-btn').click() + // Lock is the drawer's default tab; click it explicitly so this doesn't + // silently start asserting the wrong tab if that default ever changes. + await page.getByTestId('vote-lock-tab-lock').click() + + await page.getByTestId('vote-lock-input').fill('1') + await expect(async () => { + await harness.chain.advance(4_000) + await expect(page.getByTestId('vote-lock-output')).toHaveValue( + LOCK_SHARES_OUT + ) + }).toPass({ timeout: 20_000 }) +}) diff --git a/package.json b/package.json index 185839638..288174d62 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,7 @@ "@reserve-protocol/dtf-catalog": "^0.1.3", "@reserve-protocol/dtf-chat": "^0.0.6", "@reserve-protocol/dtf-rebalance-lib": "^3.2.1", - "@reserve-protocol/react-sdk": "0.5.0", + "@reserve-protocol/react-sdk": "0.5.1", "@reserve-protocol/react-zapper": "2.8.0", "@reserve-protocol/rtokens": "^1.1.23", "@reserve-protocol/trusted-fillers-sdk": "^0.3.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 88b881b2b..12628a838 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -125,8 +125,8 @@ importers: specifier: ^3.2.1 version: 3.2.1(decimal.js-light@2.5.1) '@reserve-protocol/react-sdk': - specifier: 0.5.0 - version: 0.5.0(@tanstack/react-query@5.99.0(react@18.3.1))(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.52.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6)) + specifier: 0.5.1 + version: 0.5.1(@tanstack/react-query@5.99.0(react@18.3.1))(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.52.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6)) '@reserve-protocol/react-zapper': specifier: 2.8.0 version: 2.8.0(@babel/core@7.29.0)(@babel/template@7.28.6)(@tanstack/react-query@5.99.0(react@18.3.1))(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(ajv@8.18.0)(multiformats@14.0.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.52.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6))(wagmi@2.19.5(@tanstack/query-core@5.99.0)(@tanstack/react-query@5.99.0(react@18.3.1))(@types/react@18.3.28)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.52.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6))(zod@4.3.6)) @@ -3239,8 +3239,8 @@ packages: peerDependencies: decimal.js-light: ^2.5.1 - '@reserve-protocol/react-sdk@0.5.0': - resolution: {integrity: sha512-BMN8QxjN08BHN66uzW6dxm9zG9T6eb8wJ1zWMl5oyUgCy2mT9zy9TmRjHve0wO5eWrz6J39ZJ1WFZ/HPB0ROfg==} + '@reserve-protocol/react-sdk@0.5.1': + resolution: {integrity: sha512-5uGhNHTO7IvN7IBLjYDBFBqbwUIJObRM4Sd1azg12i3RK9d3D6CtpG1RcYhh5vwlGHDyVSj3kBPFto3xZliiMw==} engines: {node: '>=24'} peerDependencies: '@tanstack/react-query': ^5.99.0 @@ -3259,8 +3259,8 @@ packages: '@reserve-protocol/rtokens@1.1.23': resolution: {integrity: sha512-VYP0BNhULhFzAGpzaqe1pkuMpCvLmuNYsYHE0xkKgiqaMZdztSlnCNK2BRlsDbFD/HQZwcoAoYjFpEHQbq2GoA==} - '@reserve-protocol/sdk@0.5.0': - resolution: {integrity: sha512-PeXPNlMnXghTjd3T0pPH3Bg1uBXkuVm5AMwy3R8PjETLrJZ6AqCj2Ugjl8SHFSDZbC+nviBYzAMO+K4R05gABQ==} + '@reserve-protocol/sdk@0.5.1': + resolution: {integrity: sha512-N4cr4QZemqao7lViUrcgl7QaJHxpcDylI/XuPbQsi3Wn7CYJmr93fIVpei6tcD874XeRhtrLTzDG7U4XFrpDAA==} engines: {node: '>=24'} '@reserve-protocol/trusted-fillers-sdk@0.3.0': @@ -11882,9 +11882,9 @@ snapshots: dependencies: decimal.js-light: 2.5.1 - '@reserve-protocol/react-sdk@0.5.0(@tanstack/react-query@5.99.0(react@18.3.1))(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.52.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6))': + '@reserve-protocol/react-sdk@0.5.1(@tanstack/react-query@5.99.0(react@18.3.1))(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.52.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6))': dependencies: - '@reserve-protocol/sdk': 0.5.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@reserve-protocol/sdk': 0.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) '@tanstack/react-query': 5.99.0(react@18.3.1) react: 18.3.1 viem: 2.52.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6) @@ -11932,7 +11932,7 @@ snapshots: '@reserve-protocol/rtokens@1.1.23': {} - '@reserve-protocol/sdk@0.5.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': + '@reserve-protocol/sdk@0.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': dependencies: '@graphql-typed-document-node/core': 3.2.0(graphql@16.13.2) '@reserve-protocol/dtf-catalog': 0.1.3 diff --git a/public/svgs/vlrsr.svg b/public/svgs/vlrsr.svg new file mode 100644 index 000000000..ce72b70e2 --- /dev/null +++ b/public/svgs/vlrsr.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/src/components/token-logo/index.tsx b/src/components/token-logo/index.tsx index 8880b81e4..aac047801 100644 --- a/src/components/token-logo/index.tsx +++ b/src/components/token-logo/index.tsx @@ -7,6 +7,7 @@ import { useAtom, useAtomValue } from 'jotai' import * as React from 'react' import { routeCacheAtom } from './atoms' import { TOKEN_LOGO_MAPPINGS } from './token-logo-mappings' +import { getVoteLockTokenLogo } from './vote-lock-token-logo' type Sizes = 'sm' | 'md' | 'lg' | 'xl' @@ -80,6 +81,13 @@ const TokenLogo = React.forwardRef((props, ref) => { const loadImage = React.useCallback(async () => { try { + const voteLockTokenLogo = getVoteLockTokenLogo(symbol) + if (voteLockTokenLogo) { + cacheUrl(voteLockTokenLogo) + setCurrentSrc(voteLockTokenLogo) + return + } + // check cache first if (address && chain) { const cacheKey = `${address.toLowerCase()}-${chain}` @@ -392,17 +400,19 @@ const TRUST_WALLET_CHAINS: Record = { } function getKnownTokenLogo(symbol: string) { - if (SVGS.has(symbol.toLowerCase())) { - return `/svgs/${symbol.toLowerCase()}.svg` + const normalizedSymbol = symbol.toLowerCase() + + if (SVGS.has(normalizedSymbol)) { + return `/svgs/${normalizedSymbol}.svg` } - if (PNGS.has(symbol.toLowerCase())) { - return `/imgs/${symbol.toLowerCase()}.png` + if (PNGS.has(normalizedSymbol)) { + return `/imgs/${normalizedSymbol}.png` } - if (WEBP.has(symbol.toLowerCase())) { - return `/imgs/${symbol.toLowerCase()}.webp` + if (WEBP.has(normalizedSymbol)) { + return `/imgs/${normalizedSymbol}.webp` } - if (EXTERNAL_ASSETS[symbol.toLowerCase()]) { - return EXTERNAL_ASSETS[symbol.toLowerCase()] + if (EXTERNAL_ASSETS[normalizedSymbol]) { + return EXTERNAL_ASSETS[normalizedSymbol] } return '' } diff --git a/src/components/token-logo/tests/token-logo.test.ts b/src/components/token-logo/tests/token-logo.test.ts new file mode 100644 index 000000000..5c69a2935 --- /dev/null +++ b/src/components/token-logo/tests/token-logo.test.ts @@ -0,0 +1,49 @@ +import { createElement } from 'react' +import { render, waitFor } from '@testing-library/react' +import { describe, expect, it, vi } from 'vitest' +import TokenLogo from '..' +import { getVoteLockTokenLogo } from '../vote-lock-token-logo' + +vi.mock('jotai', () => ({ + useAtomValue: () => ({}), + useAtom: () => [{ '0xabc-56': '/wrong-cached-logo.svg' }, vi.fn()], +})) + +vi.mock('@/state/atoms', () => ({ + indexDTFIconsAtom: Symbol('indexDTFIconsAtom'), +})) + +vi.mock('../atoms', () => ({ + routeCacheAtom: Symbol('routeCacheAtom'), +})) + +describe('getVoteLockTokenLogo', () => { + it.each(['vlRSR', 'vlRSR-LCAP', 'VLRSR-CMCindex'])( + 'uses the shared vote-lock RSR logo for %s', + (symbol) => { + expect(getVoteLockTokenLogo(symbol)).toBe('/svgs/vlrsr.svg') + } + ) + + it('keeps non-RSR vote-lock symbols on their normal resolution path', () => { + expect(getVoteLockTokenLogo('vlETH')).toBe('') + }) + + it('takes priority over cached and explicit token logos', async () => { + const { getByAltText } = render( + createElement(TokenLogo, { + symbol: 'vlRSR-LCAP', + address: '0xabc', + chain: 56, + src: '/wrong-explicit-logo.svg', + alt: 'vlRSR-LCAP', + }) + ) + + await waitFor(() => { + expect(getByAltText('vlRSR-LCAP').getAttribute('src')).toBe( + '/svgs/vlrsr.svg' + ) + }) + }) +}) diff --git a/src/components/token-logo/vote-lock-token-logo.ts b/src/components/token-logo/vote-lock-token-logo.ts new file mode 100644 index 000000000..464b2bdec --- /dev/null +++ b/src/components/token-logo/vote-lock-token-logo.ts @@ -0,0 +1,4 @@ +const VOTE_LOCK_RSR_LOGO = '/svgs/vlrsr.svg' + +export const getVoteLockTokenLogo = (symbol?: string) => + symbol?.toLowerCase().startsWith('vlrsr') ? VOTE_LOCK_RSR_LOGO : '' diff --git a/src/components/ui/animated-number.tsx b/src/components/ui/animated-number.tsx new file mode 100644 index 000000000..11852f060 --- /dev/null +++ b/src/components/ui/animated-number.tsx @@ -0,0 +1,112 @@ +import { cn } from '@/lib/utils' +import { useEffect, useRef, useState } from 'react' + +const DURATION_MS = 1200 + +const easeOutCubic = (progress: number) => 1 - (1 - progress) ** 3 + +// Tweens toward the new value on change (no animation on first render) and +// renders formatter(current). tabular-nums keeps digits from shifting layout. +export const AnimatedNumber = ({ + value, + formatter = String, + className, +}: { + value: number + formatter?: (value: number) => string + className?: string +}) => { + const [display, setDisplay] = useState(value) + const fromRef = useRef(value) + + useEffect(() => { + const from = fromRef.current + if (from === value || !isFinite(value) || !isFinite(from)) { + fromRef.current = value + setDisplay(value) + return + } + + const start = performance.now() + let frame: number + const tick = (now: number) => { + const progress = Math.min((now - start) / DURATION_MS, 1) + if (progress < 1) { + setDisplay(from + (value - from) * easeOutCubic(progress)) + frame = requestAnimationFrame(tick) + } else { + setDisplay(value) + fromRef.current = value + } + } + frame = requestAnimationFrame(tick) + + return () => { + cancelAnimationFrame(frame) + fromRef.current = value + } + }, [value]) + + return {formatter(display)} +} + +// String variant for exact on-chain amounts (drawer quotes): tweens a numeric +// approximation while animating, then snaps to the exact full-precision string +// so no precision is lost at rest. +// +// Animates ONLY a refreshed quote for the SAME input (background refetch). +// A quote for a new input — signalled by `isStale` (placeholderData) flipping +// through true — snaps immediately: skeleton/dim → value, no tween. +export const useAnimatedAmount = (value: string, isStale = false): string => { + const [display, setDisplay] = useState(value) + const prevValue = useRef(value) + const prevStale = useRef(isStale) + + useEffect(() => { + const from = Number(prevValue.current) + const target = Number(value) + const cameFromStale = prevStale.current && !isStale + prevStale.current = isStale + + if (prevValue.current === value) return + const previous = prevValue.current + prevValue.current = value + + const shouldAnimate = + !isStale && + !cameFromStale && + previous !== '' && + value !== '' && + isFinite(from) && + isFinite(target) && + from !== target + + if (!shouldAnimate) { + setDisplay(value) + return + } + + // Keep the target's full decimal width during the tween — collapsing an + // 18-decimal quote to fewer digits mid-animation reads as a glitch. The + // tail digits are interpolation noise until the final exact-string snap. + const decimals = value.split('.')[1]?.length ?? 0 + const start = performance.now() + let frame: number + const tick = (now: number) => { + const progress = Math.min((now - start) / DURATION_MS, 1) + if (progress < 1) { + setDisplay( + (from + (target - from) * easeOutCubic(progress)).toFixed(decimals) + ) + frame = requestAnimationFrame(tick) + } else { + setDisplay(value) + } + } + frame = requestAnimationFrame(tick) + + return () => cancelAnimationFrame(frame) + }, [value, isStale]) + + return display +} diff --git a/src/components/ui/swap.tsx b/src/components/ui/swap.tsx index f9f9caf4c..679154b54 100644 --- a/src/components/ui/swap.tsx +++ b/src/components/ui/swap.tsx @@ -54,6 +54,7 @@ type SwapItem = { onMax?: () => void value?: string onChange?: (value: string) => void + inputTestId?: string tokens?: TokenWithBalance[] onTokenSelect?: (token: Token) => void disabled?: boolean @@ -71,8 +72,11 @@ type SwapProps = { const TokenInput = ({ value = '', onChange = () => {}, + inputTestId, disabled = false, -}: Pick & { disabled?: boolean }) => { +}: Pick & { + disabled?: boolean +}) => { const ref = useRef(null) const isDesktop = useMediaQuery('(min-width: 768px)') @@ -95,6 +99,7 @@ const TokenInput = ({ ref={ref} autoFocus={isDesktop} disabled={disabled} + data-testid={inputTestId} /> ) } @@ -373,6 +378,7 @@ export const TokenOutputBox = ({ autoFocus disabled className="disabled:cursor-auto disabled:opacity-100" + data-testid={to.inputTestId} /> )} get(voteLockStateAtom)?.underlyingBalance.raw ) -export const unlockBalanceRawAtom = atom( - (get) => get(voteLockStateAtom)?.maxWithdraw.raw +export const unlockShareBalanceRawAtom = atom( + (get) => get(voteLockStateAtom)?.shareBalance.raw ) export const unlockDelayAtom = atom((get) => { @@ -106,14 +108,19 @@ export const inputBalanceAtom = atom((get) => { return get(voteLockStateAtom)?.underlyingBalance.formatted ?? '0' }) -export const unlockBalanceAtom = atom((get) => { - const stToken = get(stTokenAtom) - const unlockBalanceRaw = get(unlockBalanceRawAtom) - const decimals = stToken?.underlying.decimals +export const unlockShareBalanceAtom = atom( + (get) => get(voteLockStateAtom)?.shareBalance.formatted ?? '0' +) + +// USD price of one vault share; legacy 1:1 vaults have rate 1 so this equals +// the underlying price there. +export const sharePriceAtom = atom((get) => { + const state = get(voteLockStateAtom) + const rate = Number(state?.exchangeRate.formatted ?? 1) - return decimals !== undefined && unlockBalanceRaw !== undefined - ? formatUnits(unlockBalanceRaw, decimals) - : '0' + return state?.underlyingPrice !== undefined + ? state.underlyingPrice * (rate || 1) + : undefined }) export const hasVoteLockedBalanceAtom = atom((get) => diff --git a/src/components/vote-lock/components/submit-lock-button.tsx b/src/components/vote-lock/components/submit-lock-button.tsx index 1e05e1359..2fdd1beb2 100644 --- a/src/components/vote-lock/components/submit-lock-button.tsx +++ b/src/components/vote-lock/components/submit-lock-button.tsx @@ -1,4 +1,3 @@ -import dtfIndexStakingVault from '@/abis/dtf-index-staking-vault' import TransactionButton from '@/components/ui/transaction-button' import { walletAtom } from '@/state/atoms' import { useLingui } from '@lingui/react/macro' @@ -11,11 +10,7 @@ import { useResetAtom } from 'jotai/utils' import { useEffect, useRef, useState } from 'react' import { toast } from 'sonner' import { parseUnits, zeroAddress } from 'viem' -import { - useReadContract, - useWaitForTransactionReceipt, - useWriteContract, -} from 'wagmi' +import { useWaitForTransactionReceipt, useWriteContract } from 'wagmi' import { closeDrawerAtom, lockCheckboxAtom, @@ -25,6 +20,7 @@ import { updateCurrentDtfStTokenSupplyAtom, voteLockStateAtom, } from '../atoms' +import { useLockQuote } from '../hooks/use-vote-lock-quotes' import { getWriteContractParams, isSameAddress } from '../utils' const PROCESSING_DELAY = 10_000 @@ -89,14 +85,11 @@ const SubmitLockButton = ({ onSuccess }: { onSuccess?: () => void }) => { const approvalCall = plan?.type === 'approval-required' ? plan.approvals[0] : undefined const lockCall = plan?.call - const { data: sharesToMint } = useReadContract({ - abi: dtfIndexStakingVault, - functionName: 'previewDeposit', - address: stToken?.id, - args: [amountToLock], - chainId: stToken?.chainId, - query: { enabled: amountToLock > 0n && stToken?.id !== undefined }, - }) + const { + data: sharesToMint, + quotedAmount, + isPlaceholderData: quoteIsStale, + } = useLockQuote() const { writeContract: writeApprove, @@ -130,7 +123,10 @@ const SubmitLockButton = ({ onSuccess }: { onSuccess?: () => void }) => { const write = (call: ContractCall | undefined) => { if (!account || !call) return - pendingSupplyDelta.current = sharesToMint ?? 0n + pendingSupplyDelta.current = + sharesToMint !== undefined && !quoteIsStale && quotedAmount === amountToLock + ? sharesToMint + : 0n writeContract(getWriteContractParams(call)) } @@ -227,6 +223,7 @@ const SubmitLockButton = ({ onSuccess }: { onSuccess?: () => void }) => { error={ readyToSubmit ? error || txError : approvalError || approvalTxError } + data-testid="vote-lock-submit" /> ) } diff --git a/src/components/vote-lock/components/submit-unlock-button.tsx b/src/components/vote-lock/components/submit-unlock-button.tsx index 107645c02..10adde290 100644 --- a/src/components/vote-lock/components/submit-unlock-button.tsx +++ b/src/components/vote-lock/components/submit-unlock-button.tsx @@ -1,24 +1,19 @@ -import dtfIndexStakingVault from '@/abis/dtf-index-staking-vault' import TransactionButton from '@/components/ui/transaction-button' import { walletAtom } from '@/state/atoms' import { useLingui } from '@lingui/react/macro' -import { prepareVoteLockWithdraw } from '@reserve-protocol/react-sdk' +import { prepareVoteLockRedeem } from '@reserve-protocol/react-sdk' import { useAtomValue, useSetAtom } from 'jotai' import { useResetAtom } from 'jotai/utils' import { useEffect, useRef, useState } from 'react' import { toast } from 'sonner' import { parseUnits } from 'viem' -import { - useReadContract, - useWaitForTransactionReceipt, - useWriteContract, -} from 'wagmi' +import { useWaitForTransactionReceipt, useWriteContract } from 'wagmi' import { closeDrawerAtom, stakingInputAtom, stTokenAtom, - unlockBalanceRawAtom, unlockDelayAtom, + unlockShareBalanceRawAtom, updateCurrentDtfStTokenSupplyAtom, } from '../atoms' import { getWriteContractParams } from '../utils' @@ -30,7 +25,7 @@ const SubmitUnlockButton = ({ onSuccess }: { onSuccess?: () => void }) => { const account = useAtomValue(walletAtom) const stToken = useAtomValue(stTokenAtom) const input = useAtomValue(stakingInputAtom) - const balance = useAtomValue(unlockBalanceRawAtom) + const balance = useAtomValue(unlockShareBalanceRawAtom) const unlockDelay = useAtomValue(unlockDelayAtom) const resetInput = useResetAtom(stakingInputAtom) const setShouldClose = useSetAtom(closeDrawerAtom) @@ -48,28 +43,20 @@ const SubmitUnlockButton = ({ onSuccess }: { onSuccess?: () => void }) => { } }, []) - const amountToUnlock = stToken - ? parseUnits(input || '0', stToken.underlying.decimals) + const sharesToUnlock = stToken + ? parseUnits(input || '0', stToken.token.decimals) : 0n const readyToSubmit = - !!account && !!balance && amountToUnlock > 0n && amountToUnlock <= balance + !!account && !!balance && sharesToUnlock > 0n && sharesToUnlock <= balance const call = stToken && account - ? prepareVoteLockWithdraw({ + ? prepareVoteLockRedeem({ chainId: stToken.chainId, stToken: stToken.id, - amount: amountToUnlock, + shares: sharesToUnlock, account, }) : undefined - const { data: sharesToBurn } = useReadContract({ - abi: dtfIndexStakingVault, - functionName: 'previewWithdraw', - address: stToken?.id, - args: [amountToUnlock], - chainId: stToken?.chainId, - query: { enabled: readyToSubmit && !!stToken?.id }, - }) const { writeContract, @@ -85,7 +72,7 @@ const SubmitUnlockButton = ({ onSuccess }: { onSuccess?: () => void }) => { const write = () => { if (!readyToSubmit || !call) return - pendingSupplyDelta.current = sharesToBurn ? -sharesToBurn : 0n + pendingSupplyDelta.current = -sharesToUnlock writeContract(getWriteContractParams(call)) } @@ -147,6 +134,7 @@ const SubmitUnlockButton = ({ onSuccess }: { onSuccess?: () => void }) => { } className="w-full" error={error || txError} + data-testid="vote-unlock-submit" /> ) } diff --git a/src/components/vote-lock/components/vault-exchange-rate.tsx b/src/components/vote-lock/components/vault-exchange-rate.tsx new file mode 100644 index 000000000..4e8c9230c --- /dev/null +++ b/src/components/vote-lock/components/vault-exchange-rate.tsx @@ -0,0 +1,42 @@ +import { AnimatedNumber } from '@/components/ui/animated-number' +import { formatCurrency } from '@/utils' +import { Trans } from '@lingui/react/macro' +import { useAtomValue } from 'jotai' +import { stTokenAtom } from '../atoms' +import { useVoteLockExchangeRate } from '../hooks/use-vote-lock-exchange-rate' + +// Renders for every vault (1:1 legacy vaults show rate 1) and without a +// connected wallet. +const VaultExchangeRate = () => { + const stToken = useAtomValue(stTokenAtom) + const { rate } = useVoteLockExchangeRate( + stToken + ? { + stToken: stToken.id, + chainId: stToken.chainId, + shareDecimals: stToken.token.decimals, + underlyingDecimals: stToken.underlying.decimals, + } + : undefined + ) + + if (!stToken || rate === undefined) return null + + return ( +
+ + Exchange rate + + + 1 {stToken.token.symbol} ={' '} + formatCurrency(value, 4)} + />{' '} + {stToken.underlying.symbol} + +
+ ) +} + +export default VaultExchangeRate diff --git a/src/components/vote-lock/components/vote-lock.tsx b/src/components/vote-lock/components/vote-lock.tsx index e3412e1c1..cd96c02f6 100644 --- a/src/components/vote-lock/components/vote-lock.tsx +++ b/src/components/vote-lock/components/vote-lock.tsx @@ -1,13 +1,17 @@ +import { useAnimatedAmount } from '@/components/ui/animated-number' import Swap from '@/components/ui/swap' import { formatCurrency } from '@/utils' import { useLingui } from '@lingui/react/macro' import { useAtom, useAtomValue } from 'jotai' +import { formatUnits } from 'viem' import { inputBalanceAtom, inputPriceAtom, stakingInputAtom, stTokenAtom, } from '../atoms' +import { useLockQuote } from '../hooks/use-vote-lock-quotes' +import VaultExchangeRate from './vault-exchange-rate' const VoteLock = () => { const { t } = useLingui() @@ -15,6 +19,20 @@ const VoteLock = () => { const [input, onChange] = useAtom(stakingInputAtom) const inputPrice = useAtomValue(inputPriceAtom) const inputBalance = useAtomValue(inputBalanceAtom) + const { + data: sharesOut, + isLoading: quoteLoading, + isPlaceholderData, + } = useLockQuote() + + // Hook must run unconditionally: the external drawer mounts before + // stTokenAtom is populated (synced in an effect), so no early return above. + const sharesOutFormatted = useAnimatedAmount( + stToken && sharesOut !== undefined + ? formatUnits(sharesOut, stToken.token.decimals) + : '', + isPlaceholderData + ) const onMax = () => { onChange(inputBalance) @@ -25,24 +43,31 @@ const VoteLock = () => { } return ( - + <> + 0} + from={{ + title: t`You lock:`, + address: stToken.underlying.address, + symbol: stToken.underlying.symbol, + value: input, + onChange, + inputTestId: 'vote-lock-input', + price: `$${formatCurrency(inputPrice)}`, + balance: `${formatCurrency(Number(inputBalance))}`, + onMax, + }} + to={{ + address: stToken.id, + symbol: stToken.token.symbol, + inputTestId: 'vote-lock-output', + price: `$${formatCurrency(inputPrice)}`, + value: sharesOutFormatted, + className: isPlaceholderData ? 'animate-pulse' : undefined, + }} + /> + + ) } diff --git a/src/components/vote-lock/components/vote-unlock.tsx b/src/components/vote-lock/components/vote-unlock.tsx index ef22c0da2..4f9f8d8c5 100644 --- a/src/components/vote-lock/components/vote-unlock.tsx +++ b/src/components/vote-lock/components/vote-unlock.tsx @@ -1,48 +1,81 @@ +import { useAnimatedAmount } from '@/components/ui/animated-number' import Swap from '@/components/ui/swap' import { formatCurrency } from '@/utils' import { useLingui } from '@lingui/react/macro' import { useAtom, useAtomValue } from 'jotai' +import { formatUnits } from 'viem' import { - inputPriceAtom, + sharePriceAtom, stTokenAtom, stakingInputAtom, - unlockBalanceAtom, + unlockShareBalanceAtom, + voteLockStateAtom, } from '../atoms' +import { useUnlockQuote } from '../hooks/use-vote-lock-quotes' +import VaultExchangeRate from './vault-exchange-rate' const VoteUnlock = () => { const { t } = useLingui() const stToken = useAtomValue(stTokenAtom) const [input, onChange] = useAtom(stakingInputAtom) - const inputPrice = useAtomValue(inputPriceAtom) - const unlockBalance = useAtomValue(unlockBalanceAtom) + const sharePrice = useAtomValue(sharePriceAtom) + const underlyingPrice = useAtomValue(voteLockStateAtom)?.underlyingPrice + const unlockShareBalance = useAtomValue(unlockShareBalanceAtom) + const { + data: assetsOut, + isLoading: quoteLoading, + isPlaceholderData, + } = useUnlockQuote() + + // Hook must run unconditionally: the external drawer mounts before + // stTokenAtom is populated (synced in an effect), so no early return above. + const assetsOutFormatted = useAnimatedAmount( + stToken && assetsOut !== undefined + ? formatUnits(assetsOut, stToken.underlying.decimals) + : '', + isPlaceholderData + ) const onMax = () => { - onChange(unlockBalance) + onChange(unlockShareBalance) } if (!stToken) { return null } + const inputPrice = sharePrice ? sharePrice * Number(input || '0') : 0 + const outputPrice = + underlyingPrice && assetsOutFormatted + ? underlyingPrice * Number(assetsOutFormatted) + : 0 + return ( - + <> + 0} + from={{ + title: t`You unlock:`, + address: stToken.id, + symbol: stToken.token.symbol, + value: input, + onChange, + inputTestId: 'vote-unlock-input', + price: `$${formatCurrency(inputPrice)}`, + balance: `${formatCurrency(Number(unlockShareBalance))}`, + onMax, + }} + to={{ + address: stToken.underlying.address, + symbol: stToken.underlying.symbol, + inputTestId: 'vote-unlock-output', + price: `$${formatCurrency(outputPrice)}`, + value: assetsOutFormatted, + className: isPlaceholderData ? 'animate-pulse' : undefined, + }} + /> + + ) } diff --git a/src/components/vote-lock/drawer.tsx b/src/components/vote-lock/drawer.tsx index 51319d17c..d0793249d 100644 --- a/src/components/vote-lock/drawer.tsx +++ b/src/components/vote-lock/drawer.tsx @@ -69,6 +69,7 @@ export const VoteLockDrawer = ({ {icon} diff --git a/src/components/vote-lock/hooks/use-vote-lock-exchange-rate.ts b/src/components/vote-lock/hooks/use-vote-lock-exchange-rate.ts new file mode 100644 index 000000000..5b5f3ec9a --- /dev/null +++ b/src/components/vote-lock/hooks/use-vote-lock-exchange-rate.ts @@ -0,0 +1,36 @@ +import { + useIndexDtfVoteLockPreviewRedeem, + type SupportedChainId, +} from '@reserve-protocol/react-sdk' +import { formatUnits, parseUnits, type Address } from 'viem' + +// Account-less assets-per-share rate via previewRedeem(1 share). Exact 1 for +// legacy vaults, >1 for self-appreciating ones (vlRSR). Display-only — exact +// conversions must use previewRedeem/maxWithdraw on the real amount. The drip +// moves slowly; a 30s interval keeps on-screen values ticking without spam. +export const useVoteLockExchangeRate = (params?: { + stToken: Address + chainId: SupportedChainId + shareDecimals: number + underlyingDecimals: number +}) => { + const { data: rateRaw, isError } = useIndexDtfVoteLockPreviewRedeem( + params + ? { + stToken: params.stToken, + chainId: params.chainId, + shares: parseUnits('1', params.shareDecimals), + } + : undefined, + { staleTime: 30_000, refetchInterval: 30_000 } + ) + + return { + rateRaw, + isError, + rate: + params && rateRaw !== undefined + ? Number(formatUnits(rateRaw, params.underlyingDecimals)) + : undefined, + } +} diff --git a/src/components/vote-lock/hooks/use-vote-lock-quotes.ts b/src/components/vote-lock/hooks/use-vote-lock-quotes.ts new file mode 100644 index 000000000..ca2ddfc78 --- /dev/null +++ b/src/components/vote-lock/hooks/use-vote-lock-quotes.ts @@ -0,0 +1,72 @@ +import useDebounce from '@/hooks/useDebounce' +import { + useIndexDtfVoteLockPreviewDeposit, + useIndexDtfVoteLockPreviewRedeem, +} from '@reserve-protocol/react-sdk' +import { keepPreviousData } from '@tanstack/react-query' +import { useAtomValue } from 'jotai' +import { parseUnits } from 'viem' +import { stakingInputAtom, stTokenAtom } from '../atoms' + +const QUOTE_DEBOUNCE_MS = 300 + +// ERC4626 previews are exact for every StakingVault: ~1:1 on legacy vaults, +// rate-adjusted on self-appreciating ones (vlRSR), so no vault-type branching. +// WHY share decimals: StakingVault has no ERC4626 decimals offset, so share +// decimals == underlying decimals — the SDK maps shareBalance/exchangeRate +// with underlying.decimals on the same assumption. +export const useLockQuote = () => { + const stToken = useAtomValue(stTokenAtom) + const input = useAtomValue(stakingInputAtom) + const debouncedInput = useDebounce(input, QUOTE_DEBOUNCE_MS) + const amount = stToken + ? parseUnits(debouncedInput || '0', stToken.underlying.decimals) + : 0n + + const active = !!stToken && amount > 0n + const query = useIndexDtfVoteLockPreviewDeposit( + active + ? { stToken: stToken.id, chainId: stToken.chainId, amount } + : undefined, + // Editing an amount keeps the previous quote visible (dimmed) instead of + // flashing a skeleton; isPlaceholderData marks it stale. The interval + // keeps an open drawer's quote live against the drip. + { placeholderData: keepPreviousData, refetchInterval: 15_000 } + ) + + // quotedAmount lets callers detect a quote that lags the live input + // (debounce window) — never trust sharesOut for an amount it wasn't quoted + // for. With keepPreviousData, also check isPlaceholderData: data may belong + // to the previous amount entirely. When inactive (cleared input) the query + // is disabled and would hold the old quote as a forever-stale placeholder — + // clear it so the UI empties instead of pulsing. + return { + ...query, + data: active ? query.data : undefined, + isPlaceholderData: active && query.isPlaceholderData, + quotedAmount: amount, + } +} + +export const useUnlockQuote = () => { + const stToken = useAtomValue(stTokenAtom) + const input = useAtomValue(stakingInputAtom) + const debouncedInput = useDebounce(input, QUOTE_DEBOUNCE_MS) + const shares = stToken + ? parseUnits(debouncedInput || '0', stToken.token.decimals) + : 0n + + const active = !!stToken && shares > 0n + const query = useIndexDtfVoteLockPreviewRedeem( + active + ? { stToken: stToken.id, chainId: stToken.chainId, shares } + : undefined, + { placeholderData: keepPreviousData, refetchInterval: 15_000 } + ) + + return { + ...query, + data: active ? query.data : undefined, + isPlaceholderData: active && query.isPlaceholderData, + } +} diff --git a/src/locales/en.po b/src/locales/en.po index d601b7dd4..2d90cb46d 100644 --- a/src/locales/en.po +++ b/src/locales/en.po @@ -34,7 +34,7 @@ msgstr "" msgid "(in their Github repository)" msgstr "" -#: src/views/index-dtf/overview/components/index-disclousure.tsx:361 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:348 msgid "(the “Website”), you expressly acknowledge that you have read and understood the" msgstr "" @@ -276,12 +276,12 @@ msgid "{0} selected" msgstr "" #. placeholder {0}: config.tokenName -#: src/views/index-dtf/overview/components/index-disclousure.tsx:157 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:144 msgid "{0} Token Whitepaper" msgstr "" #. placeholder {0}: config.tokenName -#: src/views/index-dtf/overview/components/index-disclousure.tsx:155 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:142 msgid "{0} Token Whitepapers" msgstr "" @@ -527,11 +527,16 @@ msgstr "" msgid "{unit} Token distribution" msgstr "" -#. placeholder {0}: apr?.toFixed(2) -#: src/views/index-dtf/overview/components/index-governance-overview.tsx:78 +#. placeholder {0}: displayRate?.toFixed(2) +#: src/views/index-dtf/overview/components/index-governance-overview.tsx:93 msgid "& Earn {0}% APR" msgstr "" +#. placeholder {0}: displayRate?.toFixed(2) +#: src/views/index-dtf/overview/components/index-governance-overview.tsx:91 +msgid "& Earn {0}% APY" +msgstr "" + #: src/components/rtoken-setup/token/BackingForm.tsx:102 msgid "% Acceptable" msgstr "" @@ -589,7 +594,7 @@ msgid "<0>Reserve Optimistic Governor upgrade introduces a new governor syst msgstr "" #: src/views/home/components/highlighted-dtfs/historical-price-disclaimer.tsx:5 -#: src/views/index-dtf/overview/components/index-disclousure.tsx:416 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:403 msgid "✱ Estimated historical price is a hypothetical illustration of how the DTF’s launch-day basket would have performed before the DTF was created, using historical prices for those assets. The basket did not actually exist during this period. The figure assumes a fixed basket — it does not reflect actual trading, management fees, slippage, or the rebalancing the DTF performs in practice — and is constructed with the benefit of hindsight. Hypothetical performance is not indicative of future results and is not investment advice." msgstr "" @@ -602,7 +607,7 @@ msgstr "" #. placeholder {1}: dtf.stToken?.underlying?.symbol #. placeholder {2}: dtf.stToken?.underlying?.symbol #. placeholder {3}: dtf.token.symbol -#: src/views/index-dtf/overview/components/index-governance-overview.tsx:141 +#: src/views/index-dtf/overview/components/index-governance-overview.tsx:156 msgid "${0} is governed by the ${1} token. {2} holders must vote-lock their tokens to become a governor of the ${3}. Governors can propose changes to the basket and vote on proposal by other governors. In exchange for locking their tokens and participating in governance, governors earn a portion of the TVL fee charged by the DTF." msgstr "" @@ -822,7 +827,7 @@ msgstr "" #: src/views/internal/dtf-list/components/dtf-table.tsx:201 #: src/views/portfolio-page/components/pending-withdrawals.tsx:370 #: src/views/portfolio-page/components/staked-positions.tsx:118 -#: src/views/portfolio-page/components/vote-locked-positions.tsx:151 +#: src/views/portfolio-page/components/vote-locked-positions.tsx:236 msgid "Action" msgstr "" @@ -1184,7 +1189,7 @@ msgstr "" msgid "and" msgstr "" -#: src/views/index-dtf/overview/components/index-disclousure.tsx:372 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:359 msgid "and agree to the terms therein. ABC Labs, LLC (\"ABC Labs\") created the Website to help facilitate interaction with the Reserve protocol, including the minting and redeeming of DTFs. However, the Website is only one of several ways in which you can interact with the Reserve protocol. ABC Labs has neither created nor deployed any DTF and your ability to interact with specific DTFs via the Website in no way suggests that a DTF is endorsed by ABC Labs. In fact, ABC Labs assumes no liability for your use of the Website and interaction with the Reserve protocol, as covered in the Terms and Conditions." msgstr "" @@ -1264,7 +1269,7 @@ msgstr "" #. placeholder {0}: stToken.underlying.symbol #. placeholder {0}: tokenIn.symbol #. placeholder {0}: usedToken.symbol || 'ERC20' -#: src/components/vote-lock/components/submit-lock-button.tsx:224 +#: src/components/vote-lock/components/submit-lock-button.tsx:220 #: src/views/index-dtf/deploy/steps/confirm-deploy/simple/simple-deploy-button.tsx:145 #: src/views/yield-dtf/issuance/components/zapV2/submit/ZapApprovalButton.tsx:60 msgid "Approve use of {0}" @@ -1293,7 +1298,7 @@ msgid "April 1" msgstr "" #: src/views/portfolio-page/components/staked-positions.tsx:68 -#: src/views/portfolio-page/components/vote-locked-positions.tsx:111 +#: src/views/portfolio-page/components/vote-locked-positions.tsx:201 msgid "APY" msgstr "" @@ -1339,7 +1344,7 @@ msgstr "" msgid "Ask Reserve AI" msgstr "" -#: src/components/ui/swap.tsx:266 +#: src/components/ui/swap.tsx:271 msgid "Assembling different routes" msgstr "" @@ -1497,7 +1502,7 @@ msgstr "" msgid "Automated minting is an advanced feature. For most people, simple swaps are recommended." msgstr "" -#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:331 +#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:419 msgid "Automatic" msgstr "" @@ -1550,8 +1555,8 @@ msgstr "" msgid "Avg Cost" msgstr "" -#: src/views/earn/views/index-dtf/components/vote-lock-positions.tsx:228 -#: src/views/earn/views/yield-dtf/components/staking-positions.tsx:119 +#: src/views/earn/views/index-dtf/components/vote-lock-positions.tsx:265 +#: src/views/earn/views/yield-dtf/components/staking-positions.tsx:159 msgid "Avg. 30d%" msgstr "" @@ -1634,14 +1639,14 @@ msgstr "" msgid "Backups" msgstr "" -#: src/components/ui/swap.tsx:213 +#: src/components/ui/swap.tsx:218 #: src/views/index-dtf/issuance/async-mint/steps/configure-mint.tsx:218 #: src/views/portfolio-page/components/available-rewards.tsx:122 #: src/views/portfolio-page/components/dtf-positions.tsx:134 #: src/views/portfolio-page/components/pending-withdrawals.tsx:338 #: src/views/portfolio-page/components/rsr-section.tsx:47 #: src/views/portfolio-page/components/staked-positions.tsx:85 -#: src/views/portfolio-page/components/vote-locked-positions.tsx:124 +#: src/views/portfolio-page/components/vote-locked-positions.tsx:223 #: src/views/yield-dtf/issuance/components/zapV2/input/ZapInputMaxButton.tsx:22 #: src/views/yield-dtf/issuance/components/zapV2/output/ZapOutputBalance.tsx:14 #: src/views/yield-dtf/staking/components/stake/stake-input.tsx:58 @@ -1704,12 +1709,12 @@ msgstr "" msgid "Basket composition" msgstr "" -#: src/views/index-dtf/overview/components/index-governance-overview.tsx:37 +#: src/views/index-dtf/overview/components/index-governance-overview.tsx:41 #: src/views/index-dtf/settings/components/index-settings-governance.tsx:170 msgid "Basket Governance" msgstr "" -#: src/views/index-dtf/overview/components/index-governance-overview.tsx:195 +#: src/views/index-dtf/overview/components/index-governance-overview.tsx:210 msgid "Basket governance settings" msgstr "" @@ -1798,7 +1803,7 @@ msgstr "" msgid "Before using automated minting" msgstr "" -#: src/components/vote-lock/components/submit-unlock-button.tsx:145 +#: src/components/vote-lock/components/submit-unlock-button.tsx:132 msgid "Begin {unlockDelay}-day unlock delay" msgstr "" @@ -1818,7 +1823,7 @@ msgstr "" msgid "Begin redemption of {0} {1}" msgstr "" -#: src/components/vote-lock/components/submit-unlock-button.tsx:146 +#: src/components/vote-lock/components/submit-unlock-button.tsx:133 msgid "Begin unlock delay" msgstr "" @@ -1839,12 +1844,12 @@ msgid "Best Quote" msgstr "" #: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:41 -msgid "Better price found" -msgstr "" +#~ msgid "Better price found" +#~ msgstr "" #: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:59 -msgid "Better price on PancakeSwap" -msgstr "" +#~ msgid "Better price on PancakeSwap" +#~ msgstr "" #. placeholder {0}: formatCurrency( +formatUnits(currentPrice, data.buyingTokenDecimals) ) #. placeholder {1}: data.buyingTokenSymbol @@ -2000,8 +2005,8 @@ msgid "Buy / Sell" msgstr "" #: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:252 -msgid "Buy on PancakeSwap" -msgstr "" +#~ msgid "Buy on PancakeSwap" +#~ msgstr "" #: src/views/index-dtf/auctions/views/rebalance/components/rebalance-action.tsx:37 msgid "Buy/sell tokens to move closer to proposed weights." @@ -2039,7 +2044,7 @@ msgstr "" msgid "By enabling this option, the zapper will only attempt to mint RTokens instead of trading for them. This can help you avoid trading fees and slippage." msgstr "" -#: src/views/index-dtf/overview/components/index-disclousure.tsx:353 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:340 msgid "By using" msgstr "" @@ -2293,7 +2298,7 @@ msgstr "" msgid "Claimed" msgstr "" -#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:224 +#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:298 msgid "Claiming" msgstr "" @@ -2332,8 +2337,8 @@ msgid "Closes" msgstr "" #: src/views/index-dtf/overview/components/index-disclousure.tsx:120 -msgid "CMC20 whitepaper documentation" -msgstr "" +#~ msgid "CMC20 whitepaper documentation" +#~ msgstr "" #: src/views/index-dtf/issuance/async-mint/steps/quote-summary.tsx:1644 #: src/views/index-dtf/issuance/async-mint/steps/quote-summary.tsx:1651 @@ -2587,8 +2592,8 @@ msgstr "" #: src/components/stake-drawer/components/submit-stake-button.tsx:217 #: src/components/stake-drawer/components/submit-unstake-button.tsx:104 -#: src/components/vote-lock/components/submit-lock-button.tsx:215 -#: src/components/vote-lock/components/submit-unlock-button.tsx:137 +#: src/components/vote-lock/components/submit-lock-button.tsx:211 +#: src/components/vote-lock/components/submit-unlock-button.tsx:124 #: src/views/index-dtf/deploy/steps/confirm-deploy/manual/components/confirm-manual-deploy-button.tsx:298 #: src/views/index-dtf/deploy/steps/confirm-deploy/simple/simple-deploy-button.tsx:133 #: src/views/index-dtf/overview/components/zap-mint/submit-zap.tsx:215 @@ -3025,8 +3030,8 @@ msgid "Current value in buffer:" msgstr "" #: src/views/index-dtf/overview/components/index-disclousure.tsx:117 -msgid "Current Version (v1)" -msgstr "" +#~ msgid "Current Version (v1)" +#~ msgstr "" #: src/views/index-dtf/overview/components/index-disclousure.tsx:58 msgid "Current Version (v2)" @@ -3037,11 +3042,11 @@ msgstr "" msgid "Current votes" msgstr "" -#: src/views/index-dtf/overview/components/index-disclousure.tsx:270 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:257 msgid "Custodial Risks: Ondo Tokenized Stocks represent claims on SPVs and other structures that hold underlying equity positions through custodians. DTF exposure therefore depends on the operational integrity and solvency of third parties. Any failure, suspension, error, insolvency, fraud, cyber incident, or transfer restriction affecting these parties could result in delayed settlement, blocked transfers, impaired redemptions, forced liquidation, or partial or total loss of value for the DTF’s holdings." msgstr "" -#: src/components/ui/swap.tsx:500 +#: src/components/ui/swap.tsx:506 #: src/views/index-dtf/deploy/components/toggle-group-preset.tsx:31 #: src/views/yield-dtf/issuance/components/zapV2/settings/ZapSettingsCustomSlippage.tsx:24 msgid "Custom" @@ -3079,7 +3084,7 @@ msgstr "" msgid "Dark" msgstr "" -#: src/views/portfolio-page/components/transactions.tsx:86 +#: src/views/portfolio-page/components/transactions.tsx:90 msgid "Date" msgstr "" @@ -3305,7 +3310,7 @@ msgstr "" #: src/views/explorer/components/governance/index.tsx:76 #: src/views/index-dtf/governance/views/proposal/components/proposal-detail-content.tsx:15 #: src/views/index-dtf/governance/views/proposal/components/proposal-detail-content.tsx:41 -#: src/views/portfolio-page/components/transactions.tsx:109 +#: src/views/portfolio-page/components/transactions.tsx:113 #: src/views/yield-dtf/governance/views/proposal-detail/components/ProposalDetailContent.tsx:45 #: src/views/yield-dtf/governance/views/proposal/components/ConfirmProposalForm.tsx:70 #: src/views/yield-dtf/overview/components/hero/token-mandate.tsx:25 @@ -3338,7 +3343,7 @@ msgstr "" msgid "Discard" msgstr "" -#: src/views/index-dtf/overview/components/index-disclousure.tsx:347 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:334 msgid "Disclosures" msgstr "" @@ -3374,7 +3379,7 @@ msgstr "" msgid "Dismiss invitation" msgstr "" -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:218 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:146 msgid "Dismiss suggestion" msgstr "" @@ -3576,7 +3581,7 @@ msgstr "" msgid "DTF V5.0.0 upgrade proposal created" msgstr "" -#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:92 +#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:99 msgid "DTFs governed by {voteLockSymbol}" msgstr "" @@ -4005,7 +4010,7 @@ msgstr "" msgid "ETH address" msgstr "" -#: src/components/ui/swap.tsx:267 +#: src/components/ui/swap.tsx:272 msgid "Evaluating slippage" msgstr "" @@ -4022,6 +4027,11 @@ msgstr "" msgid "Exceeds available balance" msgstr "" +#: src/components/vote-lock/components/vault-exchange-rate.tsx:28 +#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:248 +msgid "Exchange rate" +msgstr "" + #: src/views/yield-dtf/overview/components/charts/price-chart.tsx:133 msgid "Exchange Rate" msgstr "" @@ -4122,7 +4132,7 @@ msgstr "" msgid "Expanded J.1 to include energy usage data and the sources and methodologies used for its calculation." msgstr "" -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:63 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:43 msgid "Expect a worse price" msgstr "" @@ -4177,7 +4187,7 @@ msgstr "" msgid "Explore yield opportunities for {0}" msgstr "" -#: src/views/portfolio-page/components/transactions.tsx:128 +#: src/views/portfolio-page/components/transactions.tsx:132 msgid "Explorer" msgstr "" @@ -4438,13 +4448,13 @@ msgstr "" msgid "For approved governors to fast-track proposals." msgstr "" -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:158 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:93 msgid "For larger amounts, split your order into multiple transactions." msgstr "" #: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:115 -msgid "For larger orders, a DEX like PancakeSwap may get you a better price by routing your trade across multiple sources of liquidity." -msgstr "" +#~ msgid "For larger orders, a DEX like PancakeSwap may get you a better price by routing your trade across multiple sources of liquidity." +#~ msgstr "" #: src/views/index-dtf/components/compliance-alert.tsx:20 msgid "For more information, see our <0>Terms of Use." @@ -4558,13 +4568,13 @@ msgstr "" msgid "Gov Speed" msgstr "" -#: src/views/earn/views/index-dtf/components/vote-lock-positions.tsx:158 -#: src/views/earn/views/yield-dtf/components/staking-positions.tsx:45 +#: src/views/earn/views/index-dtf/components/vote-lock-positions.tsx:215 +#: src/views/earn/views/yield-dtf/components/staking-positions.tsx:88 msgid "Gov. Token" msgstr "" #. placeholder {0}: indexDTF.token.symbol -#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:312 +#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:392 msgid "Govern ${0}" msgstr "" @@ -4584,7 +4594,7 @@ msgstr "" #: src/views/index-dtf/governance/views/propose/views/propose-dao-settings/components/dao-settings-proposal-sections.tsx:64 #: src/views/index-dtf/governance/views/propose/views/propose-dtf-settings/components/dtf-settings-proposal-sections.tsx:174 #: src/views/index-dtf/governance/views/propose/views/propose-dtf-settings/components/sections/propose-revenue-distribution.tsx:247 -#: src/views/index-dtf/overview/components/index-governance-overview.tsx:35 +#: src/views/index-dtf/overview/components/index-governance-overview.tsx:39 #: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:28 #: src/views/yield-dtf/governance/views/proposal/components/ProposalNavigation.tsx:18 #: src/views/yield-dtf/overview/components/backing/risks.tsx:83 @@ -4636,7 +4646,7 @@ msgstr "" msgid "Governance roles" msgstr "" -#: src/views/index-dtf/overview/components/index-governance-overview.tsx:193 +#: src/views/index-dtf/overview/components/index-governance-overview.tsx:208 msgid "Governance settings" msgstr "" @@ -4649,8 +4659,8 @@ msgstr "" msgid "Governance Stats" msgstr "" -#: src/views/index-dtf/settings/components/index-settings-governance-token.tsx:17 -#: src/views/portfolio-page/components/vote-locked-positions.tsx:47 +#: src/views/index-dtf/settings/components/index-settings-governance-token.tsx:16 +#: src/views/portfolio-page/components/vote-locked-positions.tsx:137 #: src/views/portfolio-page/components/voting-power.tsx:47 msgid "Governance Token" msgstr "" @@ -4659,7 +4669,7 @@ msgstr "" msgid "Governance with an execution delay greater than 1 week unstaking delay" msgstr "" -#: src/views/earn/views/index-dtf/components/vote-lock-positions.tsx:120 +#: src/views/earn/views/index-dtf/components/vote-lock-positions.tsx:177 msgid "Governed DTFs" msgstr "" @@ -4675,10 +4685,10 @@ msgstr "" msgid "Governor mandate" msgstr "" -#: src/views/earn/views/index-dtf/components/vote-lock-positions.tsx:214 -#: src/views/earn/views/yield-dtf/components/staking-positions.tsx:101 +#: src/views/earn/views/index-dtf/components/vote-lock-positions.tsx:251 +#: src/views/earn/views/yield-dtf/components/staking-positions.tsx:141 #: src/views/portfolio-page/components/staked-positions.tsx:42 -#: src/views/portfolio-page/components/vote-locked-positions.tsx:102 +#: src/views/portfolio-page/components/vote-locked-positions.tsx:192 msgid "Governs" msgstr "" @@ -4757,7 +4767,7 @@ msgid "High liquidity" msgstr "" #: src/views/index-dtf/auctions/views/rebalance/components/rebalance-liquidity-checker.tsx:244 -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:48 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:30 #: src/views/index-dtf/governance/views/propose/basket/components/proposal-liquidity-checker.tsx:311 msgid "High price impact" msgstr "" @@ -5267,8 +5277,8 @@ msgid "Language" msgstr "" #: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:43 -msgid "Large Order" -msgstr "" +#~ msgid "Large Order" +#~ msgstr "" #. placeholder {0}: Math.ceil(amountUsd / ondo.capacityUsd) #: src/components/ondo-badge.tsx:156 @@ -5374,7 +5384,7 @@ msgstr "" msgid "Liquidity" msgstr "" -#: src/views/index-dtf/overview/components/index-disclousure.tsx:297 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:284 msgid "Liquidity Risk: Although on-chain trading is 24/7, primary minting/redeeming of Ondo Tokenized Stocks may be limited, permissioned, delayed, or available only during specific windows. In stressed markets, secondary market liquidity may deteriorate, spreads may widen, and token prices may deviate materially from the value of the referenced underlying equities. As a result, the DTF may experience tracking error versus its intended index composition and may be unable to dispose of or rebalance positions at or near observable net asset value." msgstr "" @@ -5394,7 +5404,7 @@ msgstr "" msgid "Loading current allowed actions..." msgstr "" -#: src/components/ui/swap.tsx:269 +#: src/components/ui/swap.tsx:274 msgid "Loading DTF" msgstr "" @@ -5470,7 +5480,7 @@ msgid "Location restricted" msgstr "" #. placeholder {0}: dtf.stToken?.underlying.symbol ?? 'Unknown' -#: src/views/index-dtf/overview/components/index-governance-overview.tsx:74 +#: src/views/index-dtf/overview/components/index-governance-overview.tsx:86 msgid "Lock ${0} to Govern" msgstr "" @@ -5573,7 +5583,7 @@ msgstr "" msgid "Mandate Update" msgstr "" -#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:351 +#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:421 msgid "Manual" msgstr "" @@ -5601,7 +5611,7 @@ msgstr "" msgid "Market" msgstr "" -#: src/views/index-dtf/overview/components/index-disclousure.tsx:310 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:297 msgid "Market Access and Redemption Risk: Minting and redemption for Ondo Tokenized Stocks may be permissioned, capacity-limited, subject to eligibility/whitelisting, and available only during defined windows or business-hour cutoffs tied to traditional market operations. These frictions can prevent arbitrage, impair exits at or near NAV, and amplify secondary-market dislocations, thereby resulting in a partial or total loss of the DTFs' holdings." msgstr "" @@ -5631,7 +5641,7 @@ msgstr "" msgid "Market closed" msgstr "" -#: src/components/ui/swap.tsx:223 +#: src/components/ui/swap.tsx:228 #: src/views/index-dtf/issuance/async-mint/steps/configure-mint.tsx:232 #: src/views/yield-dtf/issuance/components/zapV2/input/ZapInputMaxButton.tsx:39 #: src/views/yield-dtf/staking/components/stake/stake-input.tsx:67 @@ -5648,7 +5658,7 @@ msgstr "" msgid "Max precision is 0.01%" msgstr "" -#: src/components/ui/swap.tsx:473 +#: src/components/ui/swap.tsx:479 #: src/views/index-dtf/issuance/async-mint/steps/quote-summary.tsx:1284 msgid "Max slippage" msgstr "" @@ -5892,7 +5902,7 @@ msgstr "" msgid "Minted" msgstr "" -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:177 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:112 msgid "Minting {symbol} is currently unavailable and we couldn't find another route to buy it." msgstr "" @@ -5937,7 +5947,7 @@ msgid "Modified" msgstr "" #: src/views/portfolio-page/components/staked-positions.tsx:139 -#: src/views/portfolio-page/components/vote-locked-positions.tsx:38 +#: src/views/portfolio-page/components/vote-locked-positions.tsx:128 msgid "Modify" msgstr "" @@ -6281,8 +6291,8 @@ msgid "No results." msgstr "" #: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:45 -msgid "No route found" -msgstr "" +#~ msgid "No route found" +#~ msgstr "" #: src/views/yield-dtf/staking/components/withdraw/cooldown-unstake.tsx:90 msgid "No RSR in cooldown" @@ -6376,7 +6386,7 @@ msgstr "" msgid "Non-Basket Governance Settings" msgstr "" -#: src/views/earn/components/position-balance.tsx:65 +#: src/views/earn/components/position-balance.tsx:81 #: src/views/yield-dtf/governance/views/proposal-detail/components/ContractProposalDetails.tsx:103 #: src/views/yield-dtf/governance/views/proposal/components/SpellUpgrade3_4_0.tsx:66 #: src/views/yield-dtf/governance/views/proposal/components/SpellUpgrade4_2_0.tsx:67 @@ -6461,8 +6471,8 @@ msgid "Official documentation for the CFB LCAP token" msgstr "" #: src/views/index-dtf/overview/components/index-disclousure.tsx:113 -msgid "Official documentation for the CMC20 token" -msgstr "" +#~ msgid "Official documentation for the CMC20 token" +#~ msgstr "" #: src/views/index-dtf/governance/views/propose/basket/components/proposal-basket-setup/proposal-basket-table.tsx:54 msgid "Old units" @@ -6599,7 +6609,7 @@ msgstr "" msgid "or drag and drop it here" msgstr "" -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:61 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:41 msgid "Order too large" msgstr "" @@ -6622,6 +6632,10 @@ msgstr "" msgid "Original whitepaper documentation" msgstr "" +#: src/views/earn/views/index-dtf/components/vote-lock-positions.tsx:166 +msgid "other" +msgstr "" + #: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:24 msgid "Other" msgstr "" @@ -6632,13 +6646,11 @@ msgstr "" msgid "Other config" msgstr "" -#: src/views/earn/views/index-dtf/components/vote-lock-positions.tsx:106 -#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:78 +#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:85 msgid "other DTF" msgstr "" -#: src/views/earn/views/index-dtf/components/vote-lock-positions.tsx:108 -#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:80 +#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:87 msgid "other DTFs" msgstr "" @@ -6684,12 +6696,12 @@ msgid "Owners" msgstr "" #: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:103 -msgid "PancakeSwap is currently offering a better price for this exact order. We recommend buying {symbol} there instead." -msgstr "" +#~ msgid "PancakeSwap is currently offering a better price for this exact order. We recommend buying {symbol} there instead." +#~ msgstr "" #: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:108 -msgid "PancakeSwap is currently offering a better price for this exact order. We recommend selling {symbol} there instead." -msgstr "" +#~ msgid "PancakeSwap is currently offering a better price for this exact order. We recommend selling {symbol} there instead." +#~ msgstr "" #: src/views/index-dtf/governance/components/proposal-preview/raw-call-preview.tsx:28 #: src/views/index-dtf/governance/components/proposal-preview/rebalance-preview/legacy-basket-proposal-preview.tsx:305 @@ -6708,7 +6720,7 @@ msgstr "" msgid "Participate and earn" msgstr "" -#: src/views/portfolio-page/components/vote-locked-positions.tsx:176 +#: src/views/portfolio-page/components/vote-locked-positions.tsx:261 msgid "Participate in governance with any ERC-20 token and earn APY rewards. <0>Learn more." msgstr "" @@ -6792,8 +6804,8 @@ msgstr "" #: src/components/stake-drawer/components/submit-unstake-button.tsx:105 #: src/components/transaction-modal/index.tsx:159 #: src/components/vote-lock/components/submit-delegate-button.tsx:179 -#: src/components/vote-lock/components/submit-lock-button.tsx:216 -#: src/components/vote-lock/components/submit-unlock-button.tsx:138 +#: src/components/vote-lock/components/submit-lock-button.tsx:212 +#: src/components/vote-lock/components/submit-unlock-button.tsx:125 #: src/views/index-dtf/deploy/steps/confirm-deploy/manual/components/confirm-manual-deploy-button.tsx:298 #: src/views/index-dtf/deploy/steps/confirm-deploy/simple/simple-deploy-button.tsx:134 #: src/views/index-dtf/overview/components/zap-mint/submit-zap.tsx:216 @@ -6953,7 +6965,7 @@ msgstr "" msgid "Please read more about the different roles in Alexios and the Reserve protocol in the documentation." msgstr "" -#: src/views/index-dtf/overview/components/index-disclousure.tsx:410 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:397 msgid "please see here." msgstr "" @@ -7209,8 +7221,8 @@ msgstr "" #: src/components/stake-drawer/components/submit-stake-button.tsx:215 #: src/components/stake-drawer/components/submit-unstake-button.tsx:102 -#: src/components/vote-lock/components/submit-lock-button.tsx:213 -#: src/components/vote-lock/components/submit-unlock-button.tsx:135 +#: src/components/vote-lock/components/submit-lock-button.tsx:209 +#: src/components/vote-lock/components/submit-unlock-button.tsx:122 msgid "Processing transaction..." msgstr "" @@ -7421,7 +7433,7 @@ msgid "Provider" msgstr "" #. placeholder {0}: version.date -#: src/views/index-dtf/overview/components/index-disclousure.tsx:198 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:185 msgid "Published: {0}" msgstr "" @@ -7695,7 +7707,7 @@ msgstr "" msgid "Redeeming {0} for {1}." msgstr "" -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:182 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:117 msgid "Redeeming {symbol} is currently unavailable and we couldn't find another route to sell it." msgstr "" @@ -7733,7 +7745,7 @@ msgstr "" msgid "Reduce" msgstr "" -#: src/components/ui/swap.tsx:268 +#: src/components/ui/swap.tsx:273 msgid "Reducing potential dust" msgstr "" @@ -7782,7 +7794,7 @@ msgstr "" msgid "Regular minting " msgstr "" -#: src/views/index-dtf/overview/components/index-disclousure.tsx:282 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:269 msgid "Regulatory and Compliance Risk: Tokenized equities and related on-chain transfer mechanisms may be subject to evolving regulatory interpretations and enforcement actions. Ondo Tokenized Stocks may also be subject to contractual eligibility requirements, permissioning, whitelisting, jurisdictional limitations, sanctions screening, or other compliance gating that can be changed or applied with little notice. If regulations or compliance requirements change, the DTF may be forced to restrict access, halt mints/redemptions, rebalance away from affected components, or wind down positions under adverse market conditions, potentially causing tracking error, reduced liquidity, and losses." msgstr "" @@ -8086,7 +8098,7 @@ msgid "Revert All" msgstr "" #. placeholder {0}: config.tokenName -#: src/views/index-dtf/overview/components/index-disclousure.tsx:146 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:133 msgid "Review {0} Whitepaper" msgstr "" @@ -8164,7 +8176,7 @@ msgstr "" msgid "Reward Token" msgstr "" -#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:173 +#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:180 msgid "Reward tokens" msgstr "" @@ -8180,7 +8192,7 @@ msgstr "" msgid "Rewards claimed" msgstr "" -#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:217 +#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:291 msgid "Rewards in" msgstr "" @@ -8426,7 +8438,7 @@ msgstr "" msgid "Search pool" msgstr "" -#: src/components/ui/swap.tsx:265 +#: src/components/ui/swap.tsx:270 msgid "Searching DEX Liquidity" msgstr "" @@ -8510,8 +8522,8 @@ msgid "Sell collateral" msgstr "" #: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:254 -msgid "Sell on PancakeSwap" -msgstr "" +#~ msgid "Sell on PancakeSwap" +#~ msgstr "" #: src/views/index-dtf/auctions/views/rebalance/components/auction-bids-chart.tsx:334 #: src/views/index-dtf/auctions/views/rebalance/components/rebalance-liquidity-checker.tsx:278 @@ -8823,7 +8835,7 @@ msgstr "" msgid "Slashing Risk" msgstr "" -#: src/components/ui/swap.tsx:470 +#: src/components/ui/swap.tsx:476 msgid "Slippage" msgstr "" @@ -9339,11 +9351,11 @@ msgstr "" msgid "Telegram username" msgstr "" -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:65 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:45 msgid "Temporarily unavailable" msgstr "" -#: src/views/index-dtf/overview/components/index-disclousure.tsx:370 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:357 msgid "Terms and Conditions" msgstr "" @@ -9416,7 +9428,7 @@ msgstr "" msgid "The impact your trade has on the market price." msgstr "" -#: src/views/index-dtf/overview/components/index-disclousure.tsx:386 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:373 msgid "The information provided on the Website comes from on-chain sources. Past performance is not indicative of future results. Although index DTFs are intended to track indexes, their ability to successfully track indexes are dependent on the governance structure of the DTF and the governance’s ability to make appropriate trades. There is no guarantee that such trades will be successful or will track its corresponding index exactly. There are many risks associated with digital assets, including but not limited to security risk, counterparty risk, volatility risk, conflicts of interest, and many more. DTFs are no exception. By using the Website, you agree that your interaction with any DTFs is solely at your own risk and the Website and DTFs come as is, without any warranty or condition of any kind." msgstr "" @@ -9428,7 +9440,7 @@ msgstr "" msgid "The mandate describes what goals its governors should try to achieve. By briefly explaining the RToken's purpose and what the RToken is intended to do, it provides common ground for the governors to decide upon priorities and how to weigh tradeoffs." msgstr "" -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:79 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:57 msgid "The market reopens {nextOpenLabel}." msgstr "" @@ -9626,7 +9638,7 @@ msgstr "" msgid "There are a <0>handful of risks associated with any given RToken's collateral assets, including assets' redeemability, the health of their reserves, price volatility, etc. Likewise, because many RTokens leverage assets from external protocols, RToken holders assume all of the risks of its underlying protocols (smart contract, governance, or otherwise)." msgstr "" -#: src/views/index-dtf/overview/components/index-disclousure.tsx:263 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:250 msgid "There are potential risks associated with Ondo Tokenized Stocks, including but not limited to:" msgstr "" @@ -9818,7 +9830,7 @@ msgstr "" msgid "Title Update" msgstr "" -#: src/views/index-dtf/overview/components/index-disclousure.tsx:404 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:391 msgid "To learn more about the risks associated with DTFs," msgstr "" @@ -9826,7 +9838,7 @@ msgstr "" msgid "To verify eligibility, please leave us your name and email, and we will reach out to you personally." msgstr "" -#: src/components/ui/swap.tsx:489 +#: src/components/ui/swap.tsx:495 msgid "Toggle {option}" msgstr "" @@ -9843,7 +9855,7 @@ msgstr "" #: src/views/index-dtf/governance/views/propose/basket/components/proposal-basket-preview.tsx:160 #: src/views/index-dtf/governance/views/propose/basket/components/proposal-basket-setup/proposal-basket-table.tsx:49 #: src/views/portfolio-page/components/pending-withdrawals.tsx:307 -#: src/views/portfolio-page/components/transactions.tsx:95 +#: src/views/portfolio-page/components/transactions.tsx:99 #: src/views/tokens/components/UnlistedTokensTable.tsx:83 #: src/views/yield-dtf/overview/components/backing/collateral-exposure.tsx:245 msgid "Token" @@ -10065,7 +10077,7 @@ msgstr "" msgid "Trade remaining {0} into collateral" msgstr "" -#: src/views/index-dtf/components/zapper/large-mint-prompt.tsx:253 +#: src/views/index-dtf/components/zapper/large-mint-prompt.tsx:204 msgid "Trade suggestion" msgstr "" @@ -10142,7 +10154,7 @@ msgstr "" msgid "Trading Timelock" msgstr "" -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:50 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:32 msgid "Trading unavailable" msgstr "" @@ -10157,8 +10169,8 @@ msgstr "" #: src/components/stake-drawer/components/submit-stake-button.tsx:180 #: src/components/stake-drawer/components/submit-unstake-button.tsx:80 -#: src/components/vote-lock/components/submit-lock-button.tsx:221 -#: src/components/vote-lock/components/submit-unlock-button.tsx:143 +#: src/components/vote-lock/components/submit-lock-button.tsx:217 +#: src/components/vote-lock/components/submit-unlock-button.tsx:130 #: src/hooks/useWatchTransaction.ts:56 msgid "Transaction confirmed" msgstr "" @@ -10222,7 +10234,7 @@ msgstr "" #: src/views/explorer/index.tsx:33 #: src/views/index-dtf/overview/components/index-transaction-table-with-swaps/index.tsx:39 #: src/views/index-dtf/overview/components/index-transaction-table.tsx:152 -#: src/views/portfolio-page/components/transactions.tsx:162 +#: src/views/portfolio-page/components/transactions.tsx:166 #: src/views/yield-dtf/overview/components/rtoken-transactions.tsx:222 msgid "Transactions" msgstr "" @@ -10275,17 +10287,17 @@ msgstr "" msgid "Try again" msgstr "" -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:82 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:60 msgid "Try again during {nextSessionLabel} hours in the US." msgstr "" -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:84 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:62 msgid "Try again later when trading resumes." msgstr "" #: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:67 -msgid "Try PancakeSwap" -msgstr "" +#~ msgid "Try PancakeSwap" +#~ msgstr "" #: src/views/yield-dtf/issuance/components/zapV2/ZapToggle.tsx:23 msgid "Turn on Zaps to mint using 1 asset" @@ -10348,7 +10360,7 @@ msgstr "" #: src/views/index-dtf/overview/components/index-transaction-table-with-swaps/columns.tsx:41 #: src/views/index-dtf/overview/components/index-transaction-table.tsx:40 #: src/views/index-dtf/overview/components/yield-index/yield-index-composition-tabs.tsx:14 -#: src/views/portfolio-page/components/transactions.tsx:101 +#: src/views/portfolio-page/components/transactions.tsx:105 #: src/views/yield-dtf/overview/components/rtoken-transactions.tsx:98 msgid "Type" msgstr "" @@ -10368,7 +10380,7 @@ msgid "Unavailable" msgstr "" #: src/views/explorer/components/collaterals/index.tsx:100 -#: src/views/portfolio-page/components/vote-locked-positions.tsx:66 +#: src/views/portfolio-page/components/vote-locked-positions.tsx:156 msgid "Underlying" msgstr "" @@ -10376,7 +10388,7 @@ msgstr "" msgid "Underlying Platform Exposure" msgstr "" -#: src/views/index-dtf/settings/components/index-settings-governance-token.tsx:26 +#: src/views/index-dtf/settings/components/index-settings-governance-token.tsx:32 msgid "Underlying Token" msgstr "" @@ -10446,7 +10458,7 @@ msgstr "" msgid "Unlock" msgstr "" -#: src/components/vote-lock/components/submit-unlock-button.tsx:108 +#: src/components/vote-lock/components/submit-unlock-button.tsx:95 msgid "Unlock initiated successfully" msgstr "" @@ -10663,7 +10675,7 @@ msgstr "" msgid "Uploading files..." msgstr "" -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:232 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:160 msgid "US stock market hours are <0>9:30 AM to <1>4:00 PM Eastern Time. Current time is: <2>{currentTimeLabel} ET. Please try again in <3>{reopenInLabel}." msgstr "" @@ -10736,7 +10748,7 @@ msgstr "" msgid "Validating..." msgstr "" -#: src/views/index-dtf/overview/components/index-disclousure.tsx:321 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:308 msgid "Valuation & NAV Calculation Risk – The DTF’s NAV depends on accurate, timely marks for tokenized equities and any associated components. Pricing inputs may be derived from thinly traded on-chain markets, off-chain reference feeds, or oracle mechanisms that can be stale, interrupted, manipulated, or subject to methodology changes. Market-hour mismatches, delayed corporate action processing, and settlement lags can further distort marks. Misvaluation may cause incorrect mint/redeem pricing, unfair dilution among holders, and adverse or mistimed rebalances." msgstr "" @@ -10745,7 +10757,7 @@ msgstr "" #: src/views/portfolio-page/components/pending-withdrawals.tsx:351 #: src/views/portfolio-page/components/rsr-section.tsx:60 #: src/views/portfolio-page/components/staked-positions.tsx:102 -#: src/views/portfolio-page/components/vote-locked-positions.tsx:137 +#: src/views/portfolio-page/components/vote-locked-positions.tsx:229 #: src/views/yield-dtf/overview/components/backing/collateral-exposure.tsx:251 msgid "Value" msgstr "" @@ -10889,7 +10901,7 @@ msgstr "" msgid "View execute tx" msgstr "" -#: src/views/index-dtf/overview/components/index-governance-overview.tsx:103 +#: src/views/index-dtf/overview/components/index-governance-overview.tsx:118 msgid "View governance settings" msgstr "" @@ -10910,7 +10922,7 @@ msgstr "" msgid "View Merkl Campaign" msgstr "" -#: src/views/index-dtf/overview/components/index-governance-overview.tsx:105 +#: src/views/index-dtf/overview/components/index-governance-overview.tsx:120 msgid "View non-basket governance settings" msgstr "" @@ -10950,7 +10962,7 @@ msgstr "" msgid "View orders" msgstr "" -#: src/views/index-dtf/overview/components/index-disclousure.tsx:193 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:180 msgid "View PDF →" msgstr "" @@ -10971,7 +10983,7 @@ msgstr "" msgid "View quotes" msgstr "" -#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:147 +#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:154 msgid "View reward tokens" msgstr "" @@ -11007,7 +11019,7 @@ msgid "Vote" msgstr "" #. placeholder {0}: stToken.underlying.symbol -#: src/components/vote-lock/components/submit-lock-button.tsx:223 +#: src/components/vote-lock/components/submit-lock-button.tsx:219 msgid "Vote lock {0}" msgstr "" @@ -11023,7 +11035,7 @@ msgstr "" msgid "Vote Lock Frequently Asked Questions" msgstr "" -#: src/components/vote-lock/components/submit-lock-button.tsx:177 +#: src/components/vote-lock/components/submit-lock-button.tsx:173 msgid "Vote lock successful" msgstr "" @@ -11074,21 +11086,20 @@ msgstr "" msgid "Vote-lock" msgstr "" -#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:343 +#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:409 msgid "Vote-lock {underlyingSymbol} in {voteLockSymbol} to govern and earn from this DTF's TVL fee." msgstr "" -#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:324 -#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:338 +#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:404 msgid "Vote-lock {underlyingSymbol} in {voteLockSymbol} to govern and earn from TVL fees across all {voteLockGovernedLabel} DTFs." msgstr "" #. placeholder {0}: indexDTF.stToken.underlying.symbol -#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:368 +#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:455 msgid "Vote-lock ${0}" msgstr "" -#: src/views/index-dtf/settings/components/index-settings-governance-token.tsx:19 +#: src/views/index-dtf/settings/components/index-settings-governance-token.tsx:18 msgid "Vote-Lock DAO Token" msgstr "" @@ -11101,7 +11112,7 @@ msgstr "" msgid "Vote-locked" msgstr "" -#: src/views/portfolio-page/components/vote-locked-positions.tsx:174 +#: src/views/portfolio-page/components/vote-locked-positions.tsx:259 msgid "Vote-locked positions" msgstr "" @@ -11342,7 +11353,7 @@ msgstr "" msgid "Warmup period (s)" msgstr "" -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:52 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:34 #: src/views/yield-dtf/issuance/components/warnings/index.tsx:54 #: src/views/yield-dtf/issuance/components/warnings/index.tsx:87 msgid "Warning" @@ -11378,12 +11389,12 @@ msgid "We call these tokenized portfolios DTFs:" msgstr "" #: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:122 -msgid "We couldn't find a good price for this trade right now. We recommend using a DEX like PancakeSwap to buy {symbol}." -msgstr "" +#~ msgid "We couldn't find a good price for this trade right now. We recommend using a DEX like PancakeSwap to buy {symbol}." +#~ msgstr "" #: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:127 -msgid "We couldn't find a good price for this trade right now. We recommend using a DEX like PancakeSwap to sell {symbol}." -msgstr "" +#~ msgid "We couldn't find a good price for this trade right now. We recommend using a DEX like PancakeSwap to sell {symbol}." +#~ msgstr "" #: src/views/index-dtf/governance/components/proposal-preview/unknown-contract-preview.tsx:52 msgid "We couldn’t retrieve the contract’s ABI from Etherscan. This usually means the contract is not verified. Without its interface, we’re unable to decode any function calls or parameters." @@ -11645,7 +11656,7 @@ msgstr "" msgid "Yield:" msgstr "" -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:148 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:83 msgid "You can buy up to {maxAmountLabel} per transaction during {sessionLabel} hours in the US." msgstr "" @@ -11661,7 +11672,7 @@ msgstr "" msgid "You can proceed directly." msgstr "" -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:153 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:88 msgid "You can sell up to {maxAmountLabel} per transaction during {sessionLabel} hours in the US." msgstr "" @@ -11682,7 +11693,7 @@ msgstr "" msgid "You fund" msgstr "" -#: src/components/vote-lock/components/vote-lock.tsx:30 +#: src/components/vote-lock/components/vote-lock.tsx:50 msgid "You lock:" msgstr "" @@ -11720,7 +11731,7 @@ msgstr "" msgid "You receive" msgstr "" -#: src/components/ui/swap.tsx:363 +#: src/components/ui/swap.tsx:368 #: src/views/yield-dtf/issuance/components/zapV2/output/ZapOutputContainer.tsx:15 #: src/views/yield-dtf/issuance/components/zapV2/submit/ZapSubmitModal.tsx:41 #: src/views/yield-dtf/staking/components/stake/stake-output.tsx:36 @@ -11742,7 +11753,7 @@ msgstr "" msgid "You submit the transaction configuring your RToken design" msgstr "" -#: src/components/vote-lock/components/vote-unlock.tsx:30 +#: src/components/vote-lock/components/vote-unlock.tsx:58 msgid "You unlock:" msgstr "" @@ -11751,7 +11762,7 @@ msgstr "" msgid "You unstake:" msgstr "" -#: src/components/ui/swap.tsx:238 +#: src/components/ui/swap.tsx:243 #: src/views/yield-dtf/issuance/components/zapV2/input/ZapInputContainer.tsx:21 #: src/views/yield-dtf/issuance/components/zapV2/submit/ZapSubmitModal.tsx:29 #: src/views/yield-dtf/staking/components/stake/stake-modal.tsx:35 @@ -11780,7 +11791,7 @@ msgstr "" msgid "You'll receive:" msgstr "" -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:168 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:103 msgid "You're getting a worse price than usual because {symbol}'s underlying stocks aren't trading right now." msgstr "" @@ -11801,17 +11812,17 @@ msgstr "" msgid "Your DTF has been minted." msgstr "" -#: src/views/earn/views/index-dtf/components/vote-lock-positions.tsx:197 +#: src/views/earn/views/index-dtf/components/vote-lock-positions.tsx:242 msgid "Your lock" msgstr "" #: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:134 -msgid "Your order has unusually high price impact. We recommend buying {symbol} on PancakeSwap to get the best price possible." -msgstr "" +#~ msgid "Your order has unusually high price impact. We recommend buying {symbol} on PancakeSwap to get the best price possible." +#~ msgstr "" #: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:139 -msgid "Your order has unusually high price impact. We recommend selling {symbol} on PancakeSwap to get the best price possible." -msgstr "" +#~ msgid "Your order has unusually high price impact. We recommend selling {symbol} on PancakeSwap to get the best price possible." +#~ msgstr "" #: src/views/portfolio-page/index.tsx:41 msgid "Your portfolio brings together DTF holdings, staked and vote-locked governance positions, rewards, pending withdrawals, voting power, RSR balances, and recent transactions." @@ -11821,11 +11832,15 @@ msgstr "" msgid "Your privacy is protected. This confirmation is only ever associated with your wallet address - never your personal information. <0>Privacy Policy" msgstr "" -#: src/views/portfolio-page/components/transactions.tsx:163 +#: src/views/portfolio-page/components/transactions.tsx:167 msgid "Your recent on-chain activity." msgstr "" -#: src/views/earn/views/yield-dtf/components/staking-positions.tsx:82 +#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:263 +msgid "Your redeemable" +msgstr "" + +#: src/views/earn/views/yield-dtf/components/staking-positions.tsx:125 msgid "Your stake" msgstr "" diff --git a/src/locales/es.po b/src/locales/es.po index 3cc137a93..4d84fcbf7 100644 --- a/src/locales/es.po +++ b/src/locales/es.po @@ -34,7 +34,7 @@ msgstr "({outputVsInputDeltaLabel} vs. input original)" msgid "(in their Github repository)" msgstr "(en su repositorio de Github)" -#: src/views/index-dtf/overview/components/index-disclousure.tsx:361 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:348 msgid "(the “Website”), you expressly acknowledge that you have read and understood the" msgstr "(el “Sitio Web”), reconoces expresamente que has leído y comprendido los" @@ -133,7 +133,7 @@ msgstr "{0} {1} + ${2} de colateral existente" #. placeholder {1}: inputToken.symbol #: src/views/index-dtf/issuance/async-mint/steps/quote-summary.tsx:871 msgid "{0} {1} + existing collateral" -msgstr "" +msgstr "{0} {1} + colateral existente" #. placeholder {0}: formatCurrency(Number(amount)) #. placeholder {1}: indexDTF.token.symbol @@ -276,12 +276,12 @@ msgid "{0} selected" msgstr "{0} seleccionados" #. placeholder {0}: config.tokenName -#: src/views/index-dtf/overview/components/index-disclousure.tsx:157 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:144 msgid "{0} Token Whitepaper" msgstr "Whitepaper del token {0}" #. placeholder {0}: config.tokenName -#: src/views/index-dtf/overview/components/index-disclousure.tsx:155 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:142 msgid "{0} Token Whitepapers" msgstr "Whitepapers del token {0}" @@ -527,11 +527,16 @@ msgstr "{uniqueProjects, plural, one {# protocolo} other {# protocolos}}" msgid "{unit} Token distribution" msgstr "Distribución de tokens de {unit}" -#. placeholder {0}: apr?.toFixed(2) -#: src/views/index-dtf/overview/components/index-governance-overview.tsx:78 +#. placeholder {0}: displayRate?.toFixed(2) +#: src/views/index-dtf/overview/components/index-governance-overview.tsx:93 msgid "& Earn {0}% APR" msgstr "y gana {0}% de APR" +#. placeholder {0}: displayRate?.toFixed(2) +#: src/views/index-dtf/overview/components/index-governance-overview.tsx:91 +msgid "& Earn {0}% APY" +msgstr "& Gana {0}% APY" + #: src/components/rtoken-setup/token/BackingForm.tsx:102 msgid "% Acceptable" msgstr "% Aceptable" @@ -589,7 +594,7 @@ msgid "<0>Reserve Optimistic Governor upgrade introduces a new governor syst msgstr "<0>La actualización Reserve Optimistic Governor introduce un nuevo sistema de gobernador TBD COPY HERE!. <1/>Consulta el <2>changelog para más detalles." #: src/views/home/components/highlighted-dtfs/historical-price-disclaimer.tsx:5 -#: src/views/index-dtf/overview/components/index-disclousure.tsx:416 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:403 msgid "✱ Estimated historical price is a hypothetical illustration of how the DTF’s launch-day basket would have performed before the DTF was created, using historical prices for those assets. The basket did not actually exist during this period. The figure assumes a fixed basket — it does not reflect actual trading, management fees, slippage, or the rebalancing the DTF performs in practice — and is constructed with the benefit of hindsight. Hypothetical performance is not indicative of future results and is not investment advice." msgstr "✱ El precio histórico estimado es una ilustración hipotética de cómo se habría comportado la cesta del día de lanzamiento del DTF antes de su creación, utilizando los precios históricos de esos activos. La cesta no existió realmente durante ese período. La cifra asume una cesta fija — no refleja la negociación real, las comisiones de gestión, el deslizamiento ni el reequilibrio que el DTF realiza en la práctica — y se construye con el beneficio de la retrospectiva. El rendimiento hipotético no es indicativo de resultados futuros y no constituye asesoramiento de inversión." @@ -602,7 +607,7 @@ msgstr "DAO de ${0}" #. placeholder {1}: dtf.stToken?.underlying?.symbol #. placeholder {2}: dtf.stToken?.underlying?.symbol #. placeholder {3}: dtf.token.symbol -#: src/views/index-dtf/overview/components/index-governance-overview.tsx:141 +#: src/views/index-dtf/overview/components/index-governance-overview.tsx:156 msgid "${0} is governed by the ${1} token. {2} holders must vote-lock their tokens to become a governor of the ${3}. Governors can propose changes to the basket and vote on proposal by other governors. In exchange for locking their tokens and participating in governance, governors earn a portion of the TVL fee charged by the DTF." msgstr "${0} se gobierna mediante el token ${1}. Los titulares de ${2} deben hacer vote-lock de sus tokens para convertirse en gobernadores del ${3}. Los gobernadores pueden proponer cambios a la cesta y votar las propuestas de otros gobernadores. A cambio de bloquear sus tokens y participar en la gobernanza, los gobernadores ganan una parte de la comisión de TVL que cobra el DTF." @@ -822,7 +827,7 @@ msgstr "Adquirir activos antes del Mint" #: src/views/internal/dtf-list/components/dtf-table.tsx:201 #: src/views/portfolio-page/components/pending-withdrawals.tsx:370 #: src/views/portfolio-page/components/staked-positions.tsx:118 -#: src/views/portfolio-page/components/vote-locked-positions.tsx:151 +#: src/views/portfolio-page/components/vote-locked-positions.tsx:236 msgid "Action" msgstr "Acción" @@ -1184,7 +1189,7 @@ msgstr "Analizando liquidez..." msgid "and" msgstr "y" -#: src/views/index-dtf/overview/components/index-disclousure.tsx:372 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:359 msgid "and agree to the terms therein. ABC Labs, LLC (\"ABC Labs\") created the Website to help facilitate interaction with the Reserve protocol, including the minting and redeeming of DTFs. However, the Website is only one of several ways in which you can interact with the Reserve protocol. ABC Labs has neither created nor deployed any DTF and your ability to interact with specific DTFs via the Website in no way suggests that a DTF is endorsed by ABC Labs. In fact, ABC Labs assumes no liability for your use of the Website and interaction with the Reserve protocol, as covered in the Terms and Conditions." msgstr "y aceptas los términos allí establecidos. ABC Labs, LLC (\"ABC Labs\") creó el Sitio Web para facilitar la interacción con el protocolo Reserve, incluyendo el Mint y el Redeem de DTFs. Sin embargo, el Sitio Web es solo una de varias formas de interactuar con el protocolo Reserve. ABC Labs no ha creado ni desplegado ningún DTF, y tu capacidad de interactuar con DTFs específicos a través del Sitio Web no implica en modo alguno que un DTF esté respaldado por ABC Labs. De hecho, ABC Labs no asume ninguna responsabilidad por tu uso del Sitio Web ni por tu interacción con el protocolo Reserve, según se establece en los Términos y Condiciones." @@ -1264,7 +1269,7 @@ msgstr "Aprobar RSR" #. placeholder {0}: stToken.underlying.symbol #. placeholder {0}: tokenIn.symbol #. placeholder {0}: usedToken.symbol || 'ERC20' -#: src/components/vote-lock/components/submit-lock-button.tsx:224 +#: src/components/vote-lock/components/submit-lock-button.tsx:220 #: src/views/index-dtf/deploy/steps/confirm-deploy/simple/simple-deploy-button.tsx:145 #: src/views/yield-dtf/issuance/components/zapV2/submit/ZapApprovalButton.tsx:60 msgid "Approve use of {0}" @@ -1293,7 +1298,7 @@ msgid "April 1" msgstr "1 de abril" #: src/views/portfolio-page/components/staked-positions.tsx:68 -#: src/views/portfolio-page/components/vote-locked-positions.tsx:111 +#: src/views/portfolio-page/components/vote-locked-positions.tsx:201 msgid "APY" msgstr "APY" @@ -1339,7 +1344,7 @@ msgstr "Como RToken" msgid "Ask Reserve AI" msgstr "Pregúntale a Reserve AI" -#: src/components/ui/swap.tsx:266 +#: src/components/ui/swap.tsx:271 msgid "Assembling different routes" msgstr "Armando distintas rutas" @@ -1497,7 +1502,7 @@ msgstr "El Mint y el Redeem automatizados requieren una Wallet con soporte para msgid "Automated minting is an advanced feature. For most people, simple swaps are recommended." msgstr "El Mint automatizado es una función avanzada. Para la mayoría de las personas, se recomiendan los swaps simples." -#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:331 +#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:419 msgid "Automatic" msgstr "Automático" @@ -1550,8 +1555,8 @@ msgstr "Prom. {0} · rango {1}–{2} ({3})" msgid "Avg Cost" msgstr "Costo prom." -#: src/views/earn/views/index-dtf/components/vote-lock-positions.tsx:228 -#: src/views/earn/views/yield-dtf/components/staking-positions.tsx:119 +#: src/views/earn/views/index-dtf/components/vote-lock-positions.tsx:265 +#: src/views/earn/views/yield-dtf/components/staking-positions.tsx:159 msgid "Avg. 30d%" msgstr "Prom. 30d%" @@ -1634,14 +1639,14 @@ msgstr "La configuración de respaldo sigue los cambios de la cesta principal pa msgid "Backups" msgstr "Respaldos" -#: src/components/ui/swap.tsx:213 +#: src/components/ui/swap.tsx:218 #: src/views/index-dtf/issuance/async-mint/steps/configure-mint.tsx:218 #: src/views/portfolio-page/components/available-rewards.tsx:122 #: src/views/portfolio-page/components/dtf-positions.tsx:134 #: src/views/portfolio-page/components/pending-withdrawals.tsx:338 #: src/views/portfolio-page/components/rsr-section.tsx:47 #: src/views/portfolio-page/components/staked-positions.tsx:85 -#: src/views/portfolio-page/components/vote-locked-positions.tsx:124 +#: src/views/portfolio-page/components/vote-locked-positions.tsx:223 #: src/views/yield-dtf/issuance/components/zapV2/input/ZapInputMaxButton.tsx:22 #: src/views/yield-dtf/issuance/components/zapV2/output/ZapOutputBalance.tsx:14 #: src/views/yield-dtf/staking/components/stake/stake-input.tsx:58 @@ -1704,12 +1709,12 @@ msgstr "Propuesta de cambio de cesta" msgid "Basket composition" msgstr "Composición de la cesta" -#: src/views/index-dtf/overview/components/index-governance-overview.tsx:37 +#: src/views/index-dtf/overview/components/index-governance-overview.tsx:41 #: src/views/index-dtf/settings/components/index-settings-governance.tsx:170 msgid "Basket Governance" msgstr "Gobernanza de la cesta" -#: src/views/index-dtf/overview/components/index-governance-overview.tsx:195 +#: src/views/index-dtf/overview/components/index-governance-overview.tsx:210 msgid "Basket governance settings" msgstr "Configuración de gobernanza de la cesta" @@ -1798,7 +1803,7 @@ msgstr "Antes de continuar, confirma lo siguiente." msgid "Before using automated minting" msgstr "Antes de usar el Mint automatizado" -#: src/components/vote-lock/components/submit-unlock-button.tsx:145 +#: src/components/vote-lock/components/submit-unlock-button.tsx:132 msgid "Begin {unlockDelay}-day unlock delay" msgstr "Iniciar retraso de desbloqueo de {unlockDelay} días" @@ -1818,7 +1823,7 @@ msgstr "Comenzar minting de {0} {1}" msgid "Begin redemption of {0} {1}" msgstr "Comenzar redemption de {0} {1}" -#: src/components/vote-lock/components/submit-unlock-button.tsx:146 +#: src/components/vote-lock/components/submit-unlock-button.tsx:133 msgid "Begin unlock delay" msgstr "Iniciar retraso de desbloqueo" @@ -1839,12 +1844,12 @@ msgid "Best Quote" msgstr "Mejor cotización" #: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:41 -msgid "Better price found" -msgstr "Mejor precio encontrado" +#~ msgid "Better price found" +#~ msgstr "Mejor precio encontrado" #: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:59 -msgid "Better price on PancakeSwap" -msgstr "Mejor precio en PancakeSwap" +#~ msgid "Better price on PancakeSwap" +#~ msgstr "Mejor precio en PancakeSwap" #. placeholder {0}: formatCurrency( +formatUnits(currentPrice, data.buyingTokenDecimals) ) #. placeholder {1}: data.buyingTokenSymbol @@ -2000,8 +2005,8 @@ msgid "Buy / Sell" msgstr "Comprar / Vender" #: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:252 -msgid "Buy on PancakeSwap" -msgstr "Comprar en PancakeSwap" +#~ msgid "Buy on PancakeSwap" +#~ msgstr "Comprar en PancakeSwap" #: src/views/index-dtf/auctions/views/rebalance/components/rebalance-action.tsx:37 msgid "Buy/sell tokens to move closer to proposed weights." @@ -2039,7 +2044,7 @@ msgstr "por {0}" msgid "By enabling this option, the zapper will only attempt to mint RTokens instead of trading for them. This can help you avoid trading fees and slippage." msgstr "Al habilitar esta opción, el Zapper solo intentará hacer Mint de RTokens en lugar de operar para obtenerlos. Esto puede ayudarte a evitar comisiones de operación y slippage." -#: src/views/index-dtf/overview/components/index-disclousure.tsx:353 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:340 msgid "By using" msgstr "Al usar" @@ -2293,7 +2298,7 @@ msgstr "Emisiones reclamables" msgid "Claimed" msgstr "Reclamado" -#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:224 +#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:298 msgid "Claiming" msgstr "Reclamando" @@ -2332,8 +2337,8 @@ msgid "Closes" msgstr "Cierra" #: src/views/index-dtf/overview/components/index-disclousure.tsx:120 -msgid "CMC20 whitepaper documentation" -msgstr "Documentación del whitepaper de CMC20" +#~ msgid "CMC20 whitepaper documentation" +#~ msgstr "Documentación del whitepaper de CMC20" #: src/views/index-dtf/issuance/async-mint/steps/quote-summary.tsx:1644 #: src/views/index-dtf/issuance/async-mint/steps/quote-summary.tsx:1651 @@ -2587,8 +2592,8 @@ msgstr "Confirmando transacción..." #: src/components/stake-drawer/components/submit-stake-button.tsx:217 #: src/components/stake-drawer/components/submit-unstake-button.tsx:104 -#: src/components/vote-lock/components/submit-lock-button.tsx:215 -#: src/components/vote-lock/components/submit-unlock-button.tsx:137 +#: src/components/vote-lock/components/submit-lock-button.tsx:211 +#: src/components/vote-lock/components/submit-unlock-button.tsx:124 #: src/views/index-dtf/deploy/steps/confirm-deploy/manual/components/confirm-manual-deploy-button.tsx:298 #: src/views/index-dtf/deploy/steps/confirm-deploy/simple/simple-deploy-button.tsx:133 #: src/views/index-dtf/overview/components/zap-mint/submit-zap.tsx:215 @@ -3025,8 +3030,8 @@ msgid "Current value in buffer:" msgstr "Valor actual en el buffer:" #: src/views/index-dtf/overview/components/index-disclousure.tsx:117 -msgid "Current Version (v1)" -msgstr "Versión actual (v1)" +#~ msgid "Current Version (v1)" +#~ msgstr "Versión actual (v1)" #: src/views/index-dtf/overview/components/index-disclousure.tsx:58 msgid "Current Version (v2)" @@ -3037,11 +3042,11 @@ msgstr "Versión actual (v2)" msgid "Current votes" msgstr "Votos actuales" -#: src/views/index-dtf/overview/components/index-disclousure.tsx:270 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:257 msgid "Custodial Risks: Ondo Tokenized Stocks represent claims on SPVs and other structures that hold underlying equity positions through custodians. DTF exposure therefore depends on the operational integrity and solvency of third parties. Any failure, suspension, error, insolvency, fraud, cyber incident, or transfer restriction affecting these parties could result in delayed settlement, blocked transfers, impaired redemptions, forced liquidation, or partial or total loss of value for the DTF’s holdings." msgstr "Riesgos de custodia: las Ondo Tokenized Stocks representan derechos sobre SPVs y otras estructuras que mantienen posiciones en acciones subyacentes a través de custodios. Por lo tanto, la exposición del DTF depende de la integridad operativa y la solvencia de terceros. Cualquier fallo, suspensión, error, insolvencia, fraude, incidente cibernético o restricción de transferencia que afecte a estas partes podría resultar en liquidaciones retrasadas, transferencias bloqueadas, reembolsos afectados, liquidación forzosa o una pérdida parcial o total del valor de las posiciones del DTF." -#: src/components/ui/swap.tsx:500 +#: src/components/ui/swap.tsx:506 #: src/views/index-dtf/deploy/components/toggle-group-preset.tsx:31 #: src/views/yield-dtf/issuance/components/zapV2/settings/ZapSettingsCustomSlippage.tsx:24 msgid "Custom" @@ -3079,7 +3084,7 @@ msgstr "Propuesta de configuración del DAO" msgid "Dark" msgstr "Oscuro" -#: src/views/portfolio-page/components/transactions.tsx:86 +#: src/views/portfolio-page/components/transactions.tsx:90 msgid "Date" msgstr "Fecha" @@ -3305,7 +3310,7 @@ msgstr "OBSOLETO" #: src/views/explorer/components/governance/index.tsx:76 #: src/views/index-dtf/governance/views/proposal/components/proposal-detail-content.tsx:15 #: src/views/index-dtf/governance/views/proposal/components/proposal-detail-content.tsx:41 -#: src/views/portfolio-page/components/transactions.tsx:109 +#: src/views/portfolio-page/components/transactions.tsx:113 #: src/views/yield-dtf/governance/views/proposal-detail/components/ProposalDetailContent.tsx:45 #: src/views/yield-dtf/governance/views/proposal/components/ConfirmProposalForm.tsx:70 #: src/views/yield-dtf/overview/components/hero/token-mandate.tsx:25 @@ -3338,7 +3343,7 @@ msgstr "Deshabilitado" msgid "Discard" msgstr "Descartar" -#: src/views/index-dtf/overview/components/index-disclousure.tsx:347 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:334 msgid "Disclosures" msgstr "Divulgaciones" @@ -3374,7 +3379,7 @@ msgstr "Descartar" msgid "Dismiss invitation" msgstr "Descartar invitación" -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:218 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:146 msgid "Dismiss suggestion" msgstr "Descartar sugerencia" @@ -3576,7 +3581,7 @@ msgstr "Propuesta de actualización a DTF V4.0.0 creada" msgid "DTF V5.0.0 upgrade proposal created" msgstr "Propuesta de actualización a DTF V5.0.0 creada" -#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:92 +#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:99 msgid "DTFs governed by {voteLockSymbol}" msgstr "DTFs gobernados por {voteLockSymbol}" @@ -4005,7 +4010,7 @@ msgstr "Impacto total estimado" msgid "ETH address" msgstr "Dirección ETH" -#: src/components/ui/swap.tsx:267 +#: src/components/ui/swap.tsx:272 msgid "Evaluating slippage" msgstr "Evaluando slippage" @@ -4022,6 +4027,11 @@ msgstr "Distribución uniforme" msgid "Exceeds available balance" msgstr "Supera el balance disponible" +#: src/components/vote-lock/components/vault-exchange-rate.tsx:28 +#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:248 +msgid "Exchange rate" +msgstr "Tasa de cambio" + #: src/views/yield-dtf/overview/components/charts/price-chart.tsx:133 msgid "Exchange Rate" msgstr "Tasa de cambio" @@ -4111,7 +4121,7 @@ msgstr "Colateral existente · ${0} disponible" #: src/views/index-dtf/issuance/async-mint/steps/quote-summary.tsx:817 msgid "Existing collateral applied" -msgstr "" +msgstr "Colateral existente aplicado" #: src/components/rtoken-setup/components/BackButton.tsx:28 #: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:45 @@ -4122,7 +4132,7 @@ msgstr "Salir del Deployer" msgid "Expanded J.1 to include energy usage data and the sources and methodologies used for its calculation." msgstr "Se amplió J.1 para incluir datos de consumo energético y las fuentes y metodologías utilizadas para su cálculo." -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:63 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:43 msgid "Expect a worse price" msgstr "Espera un peor precio" @@ -4177,7 +4187,7 @@ msgstr "explora la documentación de Reserve para más detalles." msgid "Explore yield opportunities for {0}" msgstr "Explora oportunidades de rendimiento para {0}" -#: src/views/portfolio-page/components/transactions.tsx:128 +#: src/views/portfolio-page/components/transactions.tsx:132 msgid "Explorer" msgstr "Explorer" @@ -4438,13 +4448,13 @@ msgstr "A favor" msgid "For approved governors to fast-track proposals." msgstr "Para que los Governors aprobados agilicen propuestas." -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:158 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:93 msgid "For larger amounts, split your order into multiple transactions." msgstr "Para montos mayores, divide tu orden en varias transacciones." #: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:115 -msgid "For larger orders, a DEX like PancakeSwap may get you a better price by routing your trade across multiple sources of liquidity." -msgstr "Para órdenes más grandes, un DEX como PancakeSwap puede conseguirte un mejor precio al enrutar tu operación por varias fuentes de liquidez." +#~ msgid "For larger orders, a DEX like PancakeSwap may get you a better price by routing your trade across multiple sources of liquidity." +#~ msgstr "Para órdenes más grandes, un DEX como PancakeSwap puede conseguirte un mejor precio al enrutar tu operación por varias fuentes de liquidez." #: src/views/index-dtf/components/compliance-alert.tsx:20 msgid "For more information, see our <0>Terms of Use." @@ -4558,13 +4568,13 @@ msgstr "Ir al Deployer de RToken" msgid "Gov Speed" msgstr "Velocidad de gobernanza" -#: src/views/earn/views/index-dtf/components/vote-lock-positions.tsx:158 -#: src/views/earn/views/yield-dtf/components/staking-positions.tsx:45 +#: src/views/earn/views/index-dtf/components/vote-lock-positions.tsx:215 +#: src/views/earn/views/yield-dtf/components/staking-positions.tsx:88 msgid "Gov. Token" msgstr "Token de gob." #. placeholder {0}: indexDTF.token.symbol -#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:312 +#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:392 msgid "Govern ${0}" msgstr "Gobernar ${0}" @@ -4584,7 +4594,7 @@ msgstr "Gobierna, haz Stake y encuentra oportunidades de rendimiento" #: src/views/index-dtf/governance/views/propose/views/propose-dao-settings/components/dao-settings-proposal-sections.tsx:64 #: src/views/index-dtf/governance/views/propose/views/propose-dtf-settings/components/dtf-settings-proposal-sections.tsx:174 #: src/views/index-dtf/governance/views/propose/views/propose-dtf-settings/components/sections/propose-revenue-distribution.tsx:247 -#: src/views/index-dtf/overview/components/index-governance-overview.tsx:35 +#: src/views/index-dtf/overview/components/index-governance-overview.tsx:39 #: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:28 #: src/views/yield-dtf/governance/views/proposal/components/ProposalNavigation.tsx:18 #: src/views/yield-dtf/overview/components/backing/risks.tsx:83 @@ -4636,7 +4646,7 @@ msgstr "Parámetros de gobernanza" msgid "Governance roles" msgstr "Roles de gobernanza" -#: src/views/index-dtf/overview/components/index-governance-overview.tsx:193 +#: src/views/index-dtf/overview/components/index-governance-overview.tsx:208 msgid "Governance settings" msgstr "Configuración de gobernanza" @@ -4649,8 +4659,8 @@ msgstr "Participación de gobernanza" msgid "Governance Stats" msgstr "Estadísticas de gobernanza" -#: src/views/index-dtf/settings/components/index-settings-governance-token.tsx:17 -#: src/views/portfolio-page/components/vote-locked-positions.tsx:47 +#: src/views/index-dtf/settings/components/index-settings-governance-token.tsx:16 +#: src/views/portfolio-page/components/vote-locked-positions.tsx:137 #: src/views/portfolio-page/components/voting-power.tsx:47 msgid "Governance Token" msgstr "Token de gobernanza" @@ -4659,7 +4669,7 @@ msgstr "Token de gobernanza" msgid "Governance with an execution delay greater than 1 week unstaking delay" msgstr "Gobernanza con un retraso de ejecución mayor que el retraso de Unstake de 1 semana" -#: src/views/earn/views/index-dtf/components/vote-lock-positions.tsx:120 +#: src/views/earn/views/index-dtf/components/vote-lock-positions.tsx:177 msgid "Governed DTFs" msgstr "DTFs gobernados" @@ -4675,10 +4685,10 @@ msgstr "Dirección del Governor" msgid "Governor mandate" msgstr "Mandato del Governor" -#: src/views/earn/views/index-dtf/components/vote-lock-positions.tsx:214 -#: src/views/earn/views/yield-dtf/components/staking-positions.tsx:101 +#: src/views/earn/views/index-dtf/components/vote-lock-positions.tsx:251 +#: src/views/earn/views/yield-dtf/components/staking-positions.tsx:141 #: src/views/portfolio-page/components/staked-positions.tsx:42 -#: src/views/portfolio-page/components/vote-locked-positions.tsx:102 +#: src/views/portfolio-page/components/vote-locked-positions.tsx:192 msgid "Governs" msgstr "Gobierna" @@ -4757,7 +4767,7 @@ msgid "High liquidity" msgstr "Liquidez alta" #: src/views/index-dtf/auctions/views/rebalance/components/rebalance-liquidity-checker.tsx:244 -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:48 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:30 #: src/views/index-dtf/governance/views/propose/basket/components/proposal-liquidity-checker.tsx:311 msgid "High price impact" msgstr "Alto impacto en el precio" @@ -5267,8 +5277,8 @@ msgid "Language" msgstr "Idioma" #: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:43 -msgid "Large Order" -msgstr "Orden grande" +#~ msgid "Large Order" +#~ msgstr "Orden grande" #. placeholder {0}: Math.ceil(amountUsd / ondo.capacityUsd) #: src/components/ondo-badge.tsx:156 @@ -5374,7 +5384,7 @@ msgstr "Links a archivos que los holders pueden descargar desde la página de ov msgid "Liquidity" msgstr "Liquidez" -#: src/views/index-dtf/overview/components/index-disclousure.tsx:297 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:284 msgid "Liquidity Risk: Although on-chain trading is 24/7, primary minting/redeeming of Ondo Tokenized Stocks may be limited, permissioned, delayed, or available only during specific windows. In stressed markets, secondary market liquidity may deteriorate, spreads may widen, and token prices may deviate materially from the value of the referenced underlying equities. As a result, the DTF may experience tracking error versus its intended index composition and may be unable to dispose of or rebalance positions at or near observable net asset value." msgstr "Riesgo de liquidez: aunque el trading on-chain funciona 24/7, el Mint/Redeem primario de las Ondo Tokenized Stocks puede estar limitado, sujeto a permisos, retrasado o disponible solo durante ventanas específicas. En mercados bajo estrés, la liquidez del mercado secundario puede deteriorarse, los spreads pueden ampliarse y los precios de los tokens pueden desviarse sustancialmente del valor de las acciones subyacentes de referencia. Como resultado, el DTF puede experimentar un error de seguimiento respecto a la composición prevista de su índice y puede no ser capaz de vender o rebalancear posiciones a un valor igual o cercano al valor liquidativo observable." @@ -5394,7 +5404,7 @@ msgstr "Subasta de reequilibrio en vivo" msgid "Loading current allowed actions..." msgstr "Cargando las acciones permitidas actuales..." -#: src/components/ui/swap.tsx:269 +#: src/components/ui/swap.tsx:274 msgid "Loading DTF" msgstr "Cargando DTF" @@ -5470,7 +5480,7 @@ msgid "Location restricted" msgstr "Ubicación restringida" #. placeholder {0}: dtf.stToken?.underlying.symbol ?? 'Unknown' -#: src/views/index-dtf/overview/components/index-governance-overview.tsx:74 +#: src/views/index-dtf/overview/components/index-governance-overview.tsx:86 msgid "Lock ${0} to Govern" msgstr "Bloquea ${0} para gobernar" @@ -5573,7 +5583,7 @@ msgstr "El mandato es obligatorio" msgid "Mandate Update" msgstr "Actualización de mandato" -#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:351 +#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:421 msgid "Manual" msgstr "Manual" @@ -5601,7 +5611,7 @@ msgstr "Archivo Markdown para tu LLM" msgid "Market" msgstr "Mercado" -#: src/views/index-dtf/overview/components/index-disclousure.tsx:310 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:297 msgid "Market Access and Redemption Risk: Minting and redemption for Ondo Tokenized Stocks may be permissioned, capacity-limited, subject to eligibility/whitelisting, and available only during defined windows or business-hour cutoffs tied to traditional market operations. These frictions can prevent arbitrage, impair exits at or near NAV, and amplify secondary-market dislocations, thereby resulting in a partial or total loss of the DTFs' holdings." msgstr "Riesgo de acceso al mercado y de Redeem: el Mint y el Redeem de las Ondo Tokenized Stocks pueden requerir permisos, estar limitados en capacidad, sujetos a elegibilidad/listas blancas y disponibles solo durante ventanas definidas u horarios de corte ligados a la operativa de los mercados tradicionales. Estas fricciones pueden impedir el arbitraje, dificultar salidas al NAV o cerca de él y amplificar las dislocaciones del mercado secundario, resultando en una pérdida parcial o total de las posiciones de los DTFs." @@ -5631,7 +5641,7 @@ msgstr "Capitalización de mercado:" msgid "Market closed" msgstr "Mercado cerrado" -#: src/components/ui/swap.tsx:223 +#: src/components/ui/swap.tsx:228 #: src/views/index-dtf/issuance/async-mint/steps/configure-mint.tsx:232 #: src/views/yield-dtf/issuance/components/zapV2/input/ZapInputMaxButton.tsx:39 #: src/views/yield-dtf/staking/components/stake/stake-input.tsx:67 @@ -5648,7 +5658,7 @@ msgstr "Tamaño máximo de subasta por token" msgid "Max precision is 0.01%" msgstr "La precisión máxima es 0.01%" -#: src/components/ui/swap.tsx:473 +#: src/components/ui/swap.tsx:479 #: src/views/index-dtf/issuance/async-mint/steps/quote-summary.tsx:1284 msgid "Max slippage" msgstr "Slippage máximo" @@ -5892,7 +5902,7 @@ msgstr "Disponible para Mint ahora" msgid "Minted" msgstr "Minted" -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:177 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:112 msgid "Minting {symbol} is currently unavailable and we couldn't find another route to buy it." msgstr "El Mint de {symbol} no está disponible en este momento y no encontramos otra ruta para comprarlo." @@ -5937,7 +5947,7 @@ msgid "Modified" msgstr "Modificado" #: src/views/portfolio-page/components/staked-positions.tsx:139 -#: src/views/portfolio-page/components/vote-locked-positions.tsx:38 +#: src/views/portfolio-page/components/vote-locked-positions.tsx:128 msgid "Modify" msgstr "Modificar" @@ -6281,8 +6291,8 @@ msgid "No results." msgstr "Sin resultados." #: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:45 -msgid "No route found" -msgstr "No se encontró ninguna ruta" +#~ msgid "No route found" +#~ msgstr "No se encontró ninguna ruta" #: src/views/yield-dtf/staking/components/withdraw/cooldown-unstake.tsx:90 msgid "No RSR in cooldown" @@ -6376,7 +6386,7 @@ msgstr "No. Ganas recompensas mientras tus tokens ERC20 estén con bloqueo de vo msgid "Non-Basket Governance Settings" msgstr "Configuración de gobernanza ajena a la cesta" -#: src/views/earn/components/position-balance.tsx:65 +#: src/views/earn/components/position-balance.tsx:81 #: src/views/yield-dtf/governance/views/proposal-detail/components/ContractProposalDetails.tsx:103 #: src/views/yield-dtf/governance/views/proposal/components/SpellUpgrade3_4_0.tsx:66 #: src/views/yield-dtf/governance/views/proposal/components/SpellUpgrade4_2_0.tsx:67 @@ -6461,8 +6471,8 @@ msgid "Official documentation for the CFB LCAP token" msgstr "Documentación oficial del token CFB LCAP" #: src/views/index-dtf/overview/components/index-disclousure.tsx:113 -msgid "Official documentation for the CMC20 token" -msgstr "Documentación oficial del token CMC20" +#~ msgid "Official documentation for the CMC20 token" +#~ msgstr "Documentación oficial del token CMC20" #: src/views/index-dtf/governance/views/propose/basket/components/proposal-basket-setup/proposal-basket-table.tsx:54 msgid "Old units" @@ -6599,7 +6609,7 @@ msgstr "Proposers optimistas" msgid "or drag and drop it here" msgstr "o arrástralo y suéltalo aquí" -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:61 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:41 msgid "Order too large" msgstr "Orden demasiado grande" @@ -6622,6 +6632,10 @@ msgstr "Las órdenes expiran en {0}" msgid "Original whitepaper documentation" msgstr "Documentación original del whitepaper" +#: src/views/earn/views/index-dtf/components/vote-lock-positions.tsx:166 +msgid "other" +msgstr "otro" + #: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:24 msgid "Other" msgstr "Otro" @@ -6632,13 +6646,11 @@ msgstr "Otro" msgid "Other config" msgstr "Otra configuración" -#: src/views/earn/views/index-dtf/components/vote-lock-positions.tsx:106 -#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:78 +#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:85 msgid "other DTF" msgstr "otro DTF" -#: src/views/earn/views/index-dtf/components/vote-lock-positions.tsx:108 -#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:80 +#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:87 msgid "other DTFs" msgstr "otros DTFs" @@ -6684,12 +6696,12 @@ msgid "Owners" msgstr "Propietarios" #: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:103 -msgid "PancakeSwap is currently offering a better price for this exact order. We recommend buying {symbol} there instead." -msgstr "PancakeSwap está ofreciendo actualmente un mejor precio para esta misma orden. Te recomendamos comprar {symbol} allí." +#~ msgid "PancakeSwap is currently offering a better price for this exact order. We recommend buying {symbol} there instead." +#~ msgstr "PancakeSwap está ofreciendo actualmente un mejor precio para esta misma orden. Te recomendamos comprar {symbol} allí." #: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:108 -msgid "PancakeSwap is currently offering a better price for this exact order. We recommend selling {symbol} there instead." -msgstr "PancakeSwap está ofreciendo actualmente un mejor precio para esta misma orden. Te recomendamos vender {symbol} allí." +#~ msgid "PancakeSwap is currently offering a better price for this exact order. We recommend selling {symbol} there instead." +#~ msgstr "PancakeSwap está ofreciendo actualmente un mejor precio para esta misma orden. Te recomendamos vender {symbol} allí." #: src/views/index-dtf/governance/components/proposal-preview/raw-call-preview.tsx:28 #: src/views/index-dtf/governance/components/proposal-preview/rebalance-preview/legacy-basket-proposal-preview.tsx:305 @@ -6708,7 +6720,7 @@ msgstr "Participa y obtén rendimientos" msgid "Participate and earn" msgstr "Participa y gana" -#: src/views/portfolio-page/components/vote-locked-positions.tsx:176 +#: src/views/portfolio-page/components/vote-locked-positions.tsx:261 msgid "Participate in governance with any ERC-20 token and earn APY rewards. <0>Learn more." msgstr "Participa en la gobernanza con cualquier token ERC-20 y gana recompensas en APY. <0>Más información." @@ -6792,8 +6804,8 @@ msgstr "Retiros pendientes" #: src/components/stake-drawer/components/submit-unstake-button.tsx:105 #: src/components/transaction-modal/index.tsx:159 #: src/components/vote-lock/components/submit-delegate-button.tsx:179 -#: src/components/vote-lock/components/submit-lock-button.tsx:216 -#: src/components/vote-lock/components/submit-unlock-button.tsx:138 +#: src/components/vote-lock/components/submit-lock-button.tsx:212 +#: src/components/vote-lock/components/submit-unlock-button.tsx:125 #: src/views/index-dtf/deploy/steps/confirm-deploy/manual/components/confirm-manual-deploy-button.tsx:298 #: src/views/index-dtf/deploy/steps/confirm-deploy/simple/simple-deploy-button.tsx:134 #: src/views/index-dtf/overview/components/zap-mint/submit-zap.tsx:216 @@ -6953,7 +6965,7 @@ msgstr "Lee más sobre cómo Register gestiona los tokens en nuestro repositorio msgid "Please read more about the different roles in Alexios and the Reserve protocol in the documentation." msgstr "Lee más sobre los diferentes roles en Alexios y el Reserve Protocol en la documentación." -#: src/views/index-dtf/overview/components/index-disclousure.tsx:410 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:397 msgid "please see here." msgstr "consulta aquí." @@ -7139,7 +7151,7 @@ msgstr "Cambio de precio ({0})" #: src/views/index-dtf/auctions/views/rebalance/updaters/rebalance-metrics-updater.tsx:184 msgid "Price data unavailable — cannot launch auction." -msgstr "" +msgstr "Datos de precio no disponibles — no se puede lanzar la subasta." #: src/views/index-dtf/issuance/async-mint/steps/quote-summary.tsx:1259 msgid "Price impact" @@ -7163,23 +7175,23 @@ msgstr "Configuración de precios" #: src/views/index-dtf/issuance/async-mint/steps/quote-summary.tsx:239 #: src/views/index-dtf/issuance/async-mint/steps/quote-summary.tsx:305 msgid "Price unavailable" -msgstr "" +msgstr "Precio no disponible" #: src/views/index-dtf/auctions/views/rebalance/components/launch-auctions-button.tsx:180 msgid "Price unavailable — cannot launch" -msgstr "" +msgstr "Precio no disponible — no se puede lanzar" #: src/views/index-dtf/auctions/views/rebalance/updaters/rebalance-metrics-updater.tsx:137 msgid "Price unavailable for \"{symbol}\" — cannot launch auction." -msgstr "" +msgstr "Precio no disponible para \"{symbol}\" — no se puede lanzar la subasta." #: src/views/index-dtf/auctions/views/rebalance/components/launch-auctions-button.tsx:178 msgid "Price unavailable for {unavailableSymbol} — cannot launch" -msgstr "" +msgstr "Precio no disponible para {unavailableSymbol} — no se puede lanzar" #: src/views/index-dtf/auctions/views/rebalance/updaters/rebalance-metrics-updater.tsx:138 msgid "Price unavailable for a basket token — cannot launch auction." -msgstr "" +msgstr "Precio no disponible para un token de la canasta — no se puede lanzar la subasta." #: src/components/layout/navigation/TokenNavigation.tsx:215 #: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:20 @@ -7209,8 +7221,8 @@ msgstr "Continuar en la Wallet" #: src/components/stake-drawer/components/submit-stake-button.tsx:215 #: src/components/stake-drawer/components/submit-unstake-button.tsx:102 -#: src/components/vote-lock/components/submit-lock-button.tsx:213 -#: src/components/vote-lock/components/submit-unlock-button.tsx:135 +#: src/components/vote-lock/components/submit-lock-button.tsx:209 +#: src/components/vote-lock/components/submit-unlock-button.tsx:122 msgid "Processing transaction..." msgstr "Procesando transacción..." @@ -7421,7 +7433,7 @@ msgid "Provider" msgstr "Proveedor" #. placeholder {0}: version.date -#: src/views/index-dtf/overview/components/index-disclousure.tsx:198 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:185 msgid "Published: {0}" msgstr "Publicado: {0}" @@ -7695,7 +7707,7 @@ msgstr "Redeemed" msgid "Redeeming {0} for {1}." msgstr "Haciendo Redeem de {0} por {1}." -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:182 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:117 msgid "Redeeming {symbol} is currently unavailable and we couldn't find another route to sell it." msgstr "El Redeem de {symbol} no está disponible en este momento y no encontramos otra ruta para venderlo." @@ -7733,7 +7745,7 @@ msgstr "Tasa de límite de redención (%)" msgid "Reduce" msgstr "Reducir" -#: src/components/ui/swap.tsx:268 +#: src/components/ui/swap.tsx:273 msgid "Reducing potential dust" msgstr "Reduciendo posible dust" @@ -7782,7 +7794,7 @@ msgstr "El registro de un plugin de activo permite que el RToken fije el precio msgid "Regular minting " msgstr "Mint regular " -#: src/views/index-dtf/overview/components/index-disclousure.tsx:282 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:269 msgid "Regulatory and Compliance Risk: Tokenized equities and related on-chain transfer mechanisms may be subject to evolving regulatory interpretations and enforcement actions. Ondo Tokenized Stocks may also be subject to contractual eligibility requirements, permissioning, whitelisting, jurisdictional limitations, sanctions screening, or other compliance gating that can be changed or applied with little notice. If regulations or compliance requirements change, the DTF may be forced to restrict access, halt mints/redemptions, rebalance away from affected components, or wind down positions under adverse market conditions, potentially causing tracking error, reduced liquidity, and losses." msgstr "Riesgo regulatorio y de cumplimiento: las acciones tokenizadas y los mecanismos de transferencia on-chain relacionados pueden estar sujetos a interpretaciones regulatorias cambiantes y a acciones de aplicación de la ley. Las Ondo Tokenized Stocks también pueden estar sujetas a requisitos contractuales de elegibilidad, permisos, listas blancas, limitaciones jurisdiccionales, controles de sanciones u otras restricciones de cumplimiento que pueden cambiar o aplicarse con poca antelación. Si la regulación o los requisitos de cumplimiento cambian, el DTF podría verse obligado a restringir el acceso, detener los Mints/Redeems, rebalancear fuera de los componentes afectados o liquidar posiciones en condiciones de mercado adversas, lo que podría causar errores de seguimiento, menor liquidez y pérdidas." @@ -8032,7 +8044,7 @@ msgstr "Buffer de respaldo para la distribución de ingresos" #: src/views/index-dtf/governance/components/proposal-preview/dtf-settings-preview.tsx:264 msgid "Revenue distribution unavailable" -msgstr "" +msgstr "Distribución de ingresos no disponible" #: src/views/index-dtf/governance/views/propose/views/propose-dtf-settings/components/changes/revenue-changes.tsx:445 msgid "Revenue Settings" @@ -8086,7 +8098,7 @@ msgid "Revert All" msgstr "Revertir todo" #. placeholder {0}: config.tokenName -#: src/views/index-dtf/overview/components/index-disclousure.tsx:146 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:133 msgid "Review {0} Whitepaper" msgstr "Revisar el whitepaper de {0}" @@ -8164,7 +8176,7 @@ msgstr "Proporción de recompensa (decimales)" msgid "Reward Token" msgstr "Token de recompensa" -#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:173 +#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:180 msgid "Reward tokens" msgstr "Tokens de recompensa" @@ -8180,7 +8192,7 @@ msgstr "Recompensas disponibles" msgid "Rewards claimed" msgstr "Recompensas reclamadas" -#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:217 +#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:291 msgid "Rewards in" msgstr "Recompensas en" @@ -8426,7 +8438,7 @@ msgstr "Buscar token de gob. o DTF" msgid "Search pool" msgstr "Buscar pool" -#: src/components/ui/swap.tsx:265 +#: src/components/ui/swap.tsx:270 msgid "Searching DEX Liquidity" msgstr "Buscando liquidez en DEX" @@ -8473,7 +8485,7 @@ msgstr "Imagen seleccionada" #: src/views/index-dtf/settings/components/index-settings-governance.tsx:73 msgid "Selector Registry" -msgstr "" +msgstr "Registro de selectores" #: src/views/index-dtf/governance/views/propose/views/propose-dtf-settings/components/sections/propose-optimistic-parameters.tsx:51 msgid "Selector registry is not available for this optimistic governor." @@ -8510,8 +8522,8 @@ msgid "Sell collateral" msgstr "Vender colateral" #: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:254 -msgid "Sell on PancakeSwap" -msgstr "Vender en PancakeSwap" +#~ msgid "Sell on PancakeSwap" +#~ msgstr "Vender en PancakeSwap" #: src/views/index-dtf/auctions/views/rebalance/components/auction-bids-chart.tsx:334 #: src/views/index-dtf/auctions/views/rebalance/components/rebalance-liquidity-checker.tsx:278 @@ -8823,7 +8835,7 @@ msgstr "Simulación fallida ✘" msgid "Slashing Risk" msgstr "Riesgo de slashing" -#: src/components/ui/swap.tsx:470 +#: src/components/ui/swap.tsx:476 msgid "Slippage" msgstr "Slippage" @@ -9339,11 +9351,11 @@ msgstr "Enlace de Telegram" msgid "Telegram username" msgstr "Usuario de Telegram" -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:65 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:45 msgid "Temporarily unavailable" msgstr "No disponible temporalmente" -#: src/views/index-dtf/overview/components/index-disclousure.tsx:370 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:357 msgid "Terms and Conditions" msgstr "Términos y Condiciones" @@ -9416,7 +9428,7 @@ msgstr "El guardián tiene la capacidad de rechazar propuestas incluso si son ap msgid "The impact your trade has on the market price." msgstr "El impacto que tiene tu operación en el precio de mercado." -#: src/views/index-dtf/overview/components/index-disclousure.tsx:386 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:373 msgid "The information provided on the Website comes from on-chain sources. Past performance is not indicative of future results. Although index DTFs are intended to track indexes, their ability to successfully track indexes are dependent on the governance structure of the DTF and the governance’s ability to make appropriate trades. There is no guarantee that such trades will be successful or will track its corresponding index exactly. There are many risks associated with digital assets, including but not limited to security risk, counterparty risk, volatility risk, conflicts of interest, and many more. DTFs are no exception. By using the Website, you agree that your interaction with any DTFs is solely at your own risk and the Website and DTFs come as is, without any warranty or condition of any kind." msgstr "La información proporcionada en el Sitio Web proviene de fuentes on-chain. El rendimiento pasado no es indicativo de resultados futuros. Aunque los DTFs de índice están diseñados para seguir índices, su capacidad de hacerlo con éxito depende de la estructura de gobernanza del DTF y de la capacidad de dicha gobernanza para realizar las operaciones adecuadas. No hay garantía de que dichas operaciones tengan éxito o sigan exactamente su índice correspondiente. Existen muchos riesgos asociados a los activos digitales, incluidos, entre otros, el riesgo de seguridad, el riesgo de contraparte, el riesgo de volatilidad y los conflictos de interés, entre muchos otros. Los DTFs no son una excepción. Al usar el Sitio Web, aceptas que tu interacción con cualquier DTF es exclusivamente bajo tu propio riesgo y que el Sitio Web y los DTFs se ofrecen tal cual, sin garantía ni condición de ningún tipo." @@ -9428,7 +9440,7 @@ msgstr "El long freezer tiene la capacidad de congelar el sistema de un RToken d msgid "The mandate describes what goals its governors should try to achieve. By briefly explaining the RToken's purpose and what the RToken is intended to do, it provides common ground for the governors to decide upon priorities and how to weigh tradeoffs." msgstr "El mandato describe qué objetivos deben tratar de alcanzar sus gobernadores. Al explicar brevemente el propósito del RToken y para qué está pensado, ofrece una base común para que los gobernadores decidan las prioridades y cómo sopesar las concesiones." -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:79 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:57 msgid "The market reopens {nextOpenLabel}." msgstr "El mercado reabre el {nextOpenLabel}." @@ -9637,7 +9649,7 @@ msgstr "Tema" msgid "There are a <0>handful of risks associated with any given RToken's collateral assets, including assets' redeemability, the health of their reserves, price volatility, etc. Likewise, because many RTokens leverage assets from external protocols, RToken holders assume all of the risks of its underlying protocols (smart contract, governance, or otherwise)." msgstr "Existen <0>varios riesgos asociados a los activos de colateral de cualquier RToken, incluyendo la redimibilidad de los activos, la salud de sus reservas, la volatilidad de precios, etc. Asimismo, dado que muchos RTokens aprovechan activos de protocolos externos, los titulares de RToken asumen todos los riesgos de sus protocolos subyacentes (de contrato inteligente, de gobernanza o de cualquier otro tipo)." -#: src/views/index-dtf/overview/components/index-disclousure.tsx:263 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:250 msgid "There are potential risks associated with Ondo Tokenized Stocks, including but not limited to:" msgstr "Existen riesgos potenciales asociados a las Ondo Tokenized Stocks, incluidos, entre otros:" @@ -9829,7 +9841,7 @@ msgstr "Título" msgid "Title Update" msgstr "Actualización del título" -#: src/views/index-dtf/overview/components/index-disclousure.tsx:404 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:391 msgid "To learn more about the risks associated with DTFs," msgstr "Para saber más sobre los riesgos asociados a los DTFs," @@ -9837,7 +9849,7 @@ msgstr "Para saber más sobre los riesgos asociados a los DTFs," msgid "To verify eligibility, please leave us your name and email, and we will reach out to you personally." msgstr "Para verificar tu elegibilidad, déjanos tu nombre y email y nos pondremos en contacto contigo personalmente." -#: src/components/ui/swap.tsx:489 +#: src/components/ui/swap.tsx:495 msgid "Toggle {option}" msgstr "Alternar {option}" @@ -9854,7 +9866,7 @@ msgstr "Cambiar tema" #: src/views/index-dtf/governance/views/propose/basket/components/proposal-basket-preview.tsx:160 #: src/views/index-dtf/governance/views/propose/basket/components/proposal-basket-setup/proposal-basket-table.tsx:49 #: src/views/portfolio-page/components/pending-withdrawals.tsx:307 -#: src/views/portfolio-page/components/transactions.tsx:95 +#: src/views/portfolio-page/components/transactions.tsx:99 #: src/views/tokens/components/UnlistedTokensTable.tsx:83 #: src/views/yield-dtf/overview/components/backing/collateral-exposure.tsx:245 msgid "Token" @@ -10076,7 +10088,7 @@ msgstr "Intercambiar {0} por colateral" msgid "Trade remaining {0} into collateral" msgstr "Intercambiar {0} restante por colateral" -#: src/views/index-dtf/components/zapper/large-mint-prompt.tsx:253 +#: src/views/index-dtf/components/zapper/large-mint-prompt.tsx:204 msgid "Trade suggestion" msgstr "Sugerencia de operación" @@ -10153,7 +10165,7 @@ msgstr "El trading se reanuda {0}." msgid "Trading Timelock" msgstr "Timelock de trading" -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:50 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:32 msgid "Trading unavailable" msgstr "Trading no disponible" @@ -10168,8 +10180,8 @@ msgstr "Transacción 2" #: src/components/stake-drawer/components/submit-stake-button.tsx:180 #: src/components/stake-drawer/components/submit-unstake-button.tsx:80 -#: src/components/vote-lock/components/submit-lock-button.tsx:221 -#: src/components/vote-lock/components/submit-unlock-button.tsx:143 +#: src/components/vote-lock/components/submit-lock-button.tsx:217 +#: src/components/vote-lock/components/submit-unlock-button.tsx:130 #: src/hooks/useWatchTransaction.ts:56 msgid "Transaction confirmed" msgstr "Transacción confirmada" @@ -10233,7 +10245,7 @@ msgstr "¡Transacción exitosa!" #: src/views/explorer/index.tsx:33 #: src/views/index-dtf/overview/components/index-transaction-table-with-swaps/index.tsx:39 #: src/views/index-dtf/overview/components/index-transaction-table.tsx:152 -#: src/views/portfolio-page/components/transactions.tsx:162 +#: src/views/portfolio-page/components/transactions.tsx:166 #: src/views/yield-dtf/overview/components/rtoken-transactions.tsx:222 msgid "Transactions" msgstr "Transacciones" @@ -10286,17 +10298,17 @@ msgstr "Prueba ajustar los filtros o vuelve más tarde" msgid "Try again" msgstr "Intentar de nuevo" -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:82 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:60 msgid "Try again during {nextSessionLabel} hours in the US." msgstr "Inténtalo de nuevo durante las horas {nextSessionLabel} en EE. UU." -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:84 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:62 msgid "Try again later when trading resumes." msgstr "Inténtalo de nuevo más tarde, cuando se reanude el trading." #: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:67 -msgid "Try PancakeSwap" -msgstr "Probar PancakeSwap" +#~ msgid "Try PancakeSwap" +#~ msgstr "Probar PancakeSwap" #: src/views/yield-dtf/issuance/components/zapV2/ZapToggle.tsx:23 msgid "Turn on Zaps to mint using 1 asset" @@ -10359,7 +10371,7 @@ msgstr "Txs" #: src/views/index-dtf/overview/components/index-transaction-table-with-swaps/columns.tsx:41 #: src/views/index-dtf/overview/components/index-transaction-table.tsx:40 #: src/views/index-dtf/overview/components/yield-index/yield-index-composition-tabs.tsx:14 -#: src/views/portfolio-page/components/transactions.tsx:101 +#: src/views/portfolio-page/components/transactions.tsx:105 #: src/views/yield-dtf/overview/components/rtoken-transactions.tsx:98 msgid "Type" msgstr "Tipo" @@ -10379,7 +10391,7 @@ msgid "Unavailable" msgstr "No disponible" #: src/views/explorer/components/collaterals/index.tsx:100 -#: src/views/portfolio-page/components/vote-locked-positions.tsx:66 +#: src/views/portfolio-page/components/vote-locked-positions.tsx:156 msgid "Underlying" msgstr "Subyacente" @@ -10387,7 +10399,7 @@ msgstr "Subyacente" msgid "Underlying Platform Exposure" msgstr "Exposición a plataformas subyacentes" -#: src/views/index-dtf/settings/components/index-settings-governance-token.tsx:26 +#: src/views/index-dtf/settings/components/index-settings-governance-token.tsx:32 msgid "Underlying Token" msgstr "Token subyacente" @@ -10457,7 +10469,7 @@ msgstr "Ilimitado" msgid "Unlock" msgstr "Desbloquear" -#: src/components/vote-lock/components/submit-unlock-button.tsx:108 +#: src/components/vote-lock/components/submit-unlock-button.tsx:95 msgid "Unlock initiated successfully" msgstr "Desbloqueo iniciado correctamente" @@ -10674,7 +10686,7 @@ msgstr "Actualizar a" msgid "Uploading files..." msgstr "Subiendo archivos..." -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:232 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:160 msgid "US stock market hours are <0>9:30 AM to <1>4:00 PM Eastern Time. Current time is: <2>{currentTimeLabel} ET. Please try again in <3>{reopenInLabel}." msgstr "El horario del mercado de valores de EE. UU. es de <0>9:30 AM a <1>4:00 PM, hora del Este. Hora actual: <2>{currentTimeLabel} ET. Vuelve a intentarlo en <3>{reopenInLabel}." @@ -10747,7 +10759,7 @@ msgstr "Validando transacción" msgid "Validating..." msgstr "Validando..." -#: src/views/index-dtf/overview/components/index-disclousure.tsx:321 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:308 msgid "Valuation & NAV Calculation Risk – The DTF’s NAV depends on accurate, timely marks for tokenized equities and any associated components. Pricing inputs may be derived from thinly traded on-chain markets, off-chain reference feeds, or oracle mechanisms that can be stale, interrupted, manipulated, or subject to methodology changes. Market-hour mismatches, delayed corporate action processing, and settlement lags can further distort marks. Misvaluation may cause incorrect mint/redeem pricing, unfair dilution among holders, and adverse or mistimed rebalances." msgstr "Riesgo de valoración y cálculo del NAV: el NAV del DTF depende de valoraciones precisas y oportunas de las acciones tokenizadas y de cualquier componente asociado. Los datos de precios pueden derivarse de mercados on-chain con poca operativa, de fuentes de referencia off-chain o de mecanismos de oráculo que pueden quedar desactualizados, interrumpirse, manipularse o sufrir cambios de metodología. Los desfases entre horarios de mercado, el procesamiento retrasado de eventos corporativos y los retardos de liquidación pueden distorsionar aún más las valoraciones. Una valoración incorrecta puede causar precios de Mint/Redeem erróneos, dilución injusta entre titulares y rebalanceos adversos o inoportunos." @@ -10756,7 +10768,7 @@ msgstr "Riesgo de valoración y cálculo del NAV: el NAV del DTF depende de valo #: src/views/portfolio-page/components/pending-withdrawals.tsx:351 #: src/views/portfolio-page/components/rsr-section.tsx:60 #: src/views/portfolio-page/components/staked-positions.tsx:102 -#: src/views/portfolio-page/components/vote-locked-positions.tsx:137 +#: src/views/portfolio-page/components/vote-locked-positions.tsx:229 #: src/views/yield-dtf/overview/components/backing/collateral-exposure.tsx:251 msgid "Value" msgstr "Valor" @@ -10900,7 +10912,7 @@ msgstr "Ver cesta completa" msgid "View execute tx" msgstr "Ver tx de ejecución" -#: src/views/index-dtf/overview/components/index-governance-overview.tsx:103 +#: src/views/index-dtf/overview/components/index-governance-overview.tsx:118 msgid "View governance settings" msgstr "Ver ajustes de gobernanza" @@ -10921,7 +10933,7 @@ msgstr "Ver lista" msgid "View Merkl Campaign" msgstr "Ver la campaña de Merkl" -#: src/views/index-dtf/overview/components/index-governance-overview.tsx:105 +#: src/views/index-dtf/overview/components/index-governance-overview.tsx:120 msgid "View non-basket governance settings" msgstr "Ver la configuración de gobernanza ajena a la cesta" @@ -10961,7 +10973,7 @@ msgstr "Ver en Tenderly" msgid "View orders" msgstr "Ver órdenes" -#: src/views/index-dtf/overview/components/index-disclousure.tsx:193 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:180 msgid "View PDF →" msgstr "Ver PDF →" @@ -10982,7 +10994,7 @@ msgstr "Consulta propuestas de los distintos DTFs en los que hiciste bloqueo de msgid "View quotes" msgstr "Ver cotizaciones" -#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:147 +#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:154 msgid "View reward tokens" msgstr "Ver tokens de recompensa" @@ -11018,7 +11030,7 @@ msgid "Vote" msgstr "Votar" #. placeholder {0}: stToken.underlying.symbol -#: src/components/vote-lock/components/submit-lock-button.tsx:223 +#: src/components/vote-lock/components/submit-lock-button.tsx:219 msgid "Vote lock {0}" msgstr "Bloquear votos de {0}" @@ -11034,7 +11046,7 @@ msgstr "No se permite una dirección de Vote Lock para un nuevo DAO" msgid "Vote Lock Frequently Asked Questions" msgstr "Preguntas frecuentes sobre el bloqueo de votos" -#: src/components/vote-lock/components/submit-lock-button.tsx:177 +#: src/components/vote-lock/components/submit-lock-button.tsx:173 msgid "Vote lock successful" msgstr "Bloqueo de votos correcto" @@ -11085,21 +11097,20 @@ msgstr "Peso del voto" msgid "Vote-lock" msgstr "Vote-lock" -#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:343 +#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:409 msgid "Vote-lock {underlyingSymbol} in {voteLockSymbol} to govern and earn from this DTF's TVL fee." msgstr "Haz Vote-lock de {underlyingSymbol} en {voteLockSymbol} para gobernar y ganar parte de la comisión de TVL de este DTF." -#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:324 -#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:338 +#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:404 msgid "Vote-lock {underlyingSymbol} in {voteLockSymbol} to govern and earn from TVL fees across all {voteLockGovernedLabel} DTFs." msgstr "Haz Vote-lock de {underlyingSymbol} en {voteLockSymbol} para gobernar y ganar parte de las comisiones de TVL de todos los DTFs de {voteLockGovernedLabel}." #. placeholder {0}: indexDTF.stToken.underlying.symbol -#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:368 +#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:455 msgid "Vote-lock ${0}" msgstr "Bloquear votos de ${0}" -#: src/views/index-dtf/settings/components/index-settings-governance-token.tsx:19 +#: src/views/index-dtf/settings/components/index-settings-governance-token.tsx:18 msgid "Vote-Lock DAO Token" msgstr "Token de DAO con bloqueo de votos" @@ -11112,7 +11123,7 @@ msgstr "Vote-Lock en Index DTFs" msgid "Vote-locked" msgstr "Con bloqueo de votos" -#: src/views/portfolio-page/components/vote-locked-positions.tsx:174 +#: src/views/portfolio-page/components/vote-locked-positions.tsx:259 msgid "Vote-locked positions" msgstr "Posiciones con bloqueo de votos" @@ -11353,7 +11364,7 @@ msgstr "¿Quieres lanzar un nuevo ERC20 para gobernanza?" msgid "Warmup period (s)" msgstr "Período de calentamiento (s)" -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:52 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:34 #: src/views/yield-dtf/issuance/components/warnings/index.tsx:54 #: src/views/yield-dtf/issuance/components/warnings/index.tsx:87 msgid "Warning" @@ -11389,12 +11400,12 @@ msgid "We call these tokenized portfolios DTFs:" msgstr "A estos portafolios tokenizados los llamamos DTFs:" #: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:122 -msgid "We couldn't find a good price for this trade right now. We recommend using a DEX like PancakeSwap to buy {symbol}." -msgstr "No pudimos encontrar un buen precio para esta operación en este momento. Recomendamos usar un DEX como PancakeSwap para comprar {symbol}." +#~ msgid "We couldn't find a good price for this trade right now. We recommend using a DEX like PancakeSwap to buy {symbol}." +#~ msgstr "No pudimos encontrar un buen precio para esta operación en este momento. Recomendamos usar un DEX como PancakeSwap para comprar {symbol}." #: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:127 -msgid "We couldn't find a good price for this trade right now. We recommend using a DEX like PancakeSwap to sell {symbol}." -msgstr "No pudimos encontrar un buen precio para esta operación en este momento. Recomendamos usar un DEX como PancakeSwap para vender {symbol}." +#~ msgid "We couldn't find a good price for this trade right now. We recommend using a DEX like PancakeSwap to sell {symbol}." +#~ msgstr "No pudimos encontrar un buen precio para esta operación en este momento. Recomendamos usar un DEX como PancakeSwap para vender {symbol}." #: src/views/index-dtf/governance/components/proposal-preview/unknown-contract-preview.tsx:52 msgid "We couldn’t retrieve the contract’s ABI from Etherscan. This usually means the contract is not verified. Without its interface, we’re unable to decode any function calls or parameters." @@ -11656,7 +11667,7 @@ msgstr "Los Yield DTFs (creados en el Reserve Yield Protocol) incluyen sobrecola msgid "Yield:" msgstr "Rendimiento:" -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:148 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:83 msgid "You can buy up to {maxAmountLabel} per transaction during {sessionLabel} hours in the US." msgstr "Puedes comprar hasta {maxAmountLabel} por transacción durante las horas {sessionLabel} en EE. UU." @@ -11672,7 +11683,7 @@ msgstr "Puedes dejar tu RToken pausado y volver más tarde a configurar la gober msgid "You can proceed directly." msgstr "Puedes continuar directamente." -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:153 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:88 msgid "You can sell up to {maxAmountLabel} per transaction during {sessionLabel} hours in the US." msgstr "Puedes vender hasta {maxAmountLabel} por transacción durante las horas {sessionLabel} en EE. UU." @@ -11693,7 +11704,7 @@ msgstr "No tienes fondos suficientes para completar esta transacción. Intenta d msgid "You fund" msgstr "Tú aportas" -#: src/components/vote-lock/components/vote-lock.tsx:30 +#: src/components/vote-lock/components/vote-lock.tsx:50 msgid "You lock:" msgstr "Bloqueas:" @@ -11731,7 +11742,7 @@ msgstr "Tú proporcionas" msgid "You receive" msgstr "Tú recibes" -#: src/components/ui/swap.tsx:363 +#: src/components/ui/swap.tsx:368 #: src/views/yield-dtf/issuance/components/zapV2/output/ZapOutputContainer.tsx:15 #: src/views/yield-dtf/issuance/components/zapV2/submit/ZapSubmitModal.tsx:41 #: src/views/yield-dtf/staking/components/stake/stake-output.tsx:36 @@ -11753,7 +11764,7 @@ msgstr "Haces Stake:" msgid "You submit the transaction configuring your RToken design" msgstr "Envías la transacción que configura el diseño de tu RToken" -#: src/components/vote-lock/components/vote-unlock.tsx:30 +#: src/components/vote-lock/components/vote-unlock.tsx:58 msgid "You unlock:" msgstr "Desbloqueas:" @@ -11762,7 +11773,7 @@ msgstr "Desbloqueas:" msgid "You unstake:" msgstr "Haces Unstake:" -#: src/components/ui/swap.tsx:238 +#: src/components/ui/swap.tsx:243 #: src/views/yield-dtf/issuance/components/zapV2/input/ZapInputContainer.tsx:21 #: src/views/yield-dtf/issuance/components/zapV2/submit/ZapSubmitModal.tsx:29 #: src/views/yield-dtf/staking/components/stake/stake-modal.tsx:35 @@ -11791,7 +11802,7 @@ msgstr "Recibirás" msgid "You'll receive:" msgstr "Recibirás:" -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:168 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:103 msgid "You're getting a worse price than usual because {symbol}'s underlying stocks aren't trading right now." msgstr "Estás obteniendo un precio peor de lo habitual porque las acciones subyacentes de {symbol} no están operando en este momento." @@ -11812,17 +11823,17 @@ msgstr "Tus inversiones en Decentralized Token Fund." msgid "Your DTF has been minted." msgstr "Se ha hecho Mint de tu DTF." -#: src/views/earn/views/index-dtf/components/vote-lock-positions.tsx:197 +#: src/views/earn/views/index-dtf/components/vote-lock-positions.tsx:242 msgid "Your lock" msgstr "Tu Vote-lock" #: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:134 -msgid "Your order has unusually high price impact. We recommend buying {symbol} on PancakeSwap to get the best price possible." -msgstr "Tu orden tiene un impacto de precio inusualmente alto. Recomendamos comprar {symbol} en PancakeSwap para obtener el mejor precio posible." +#~ msgid "Your order has unusually high price impact. We recommend buying {symbol} on PancakeSwap to get the best price possible." +#~ msgstr "Tu orden tiene un impacto de precio inusualmente alto. Recomendamos comprar {symbol} en PancakeSwap para obtener el mejor precio posible." #: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:139 -msgid "Your order has unusually high price impact. We recommend selling {symbol} on PancakeSwap to get the best price possible." -msgstr "Tu orden tiene un impacto de precio inusualmente alto. Recomendamos vender {symbol} en PancakeSwap para obtener el mejor precio posible." +#~ msgid "Your order has unusually high price impact. We recommend selling {symbol} on PancakeSwap to get the best price possible." +#~ msgstr "Tu orden tiene un impacto de precio inusualmente alto. Recomendamos vender {symbol} en PancakeSwap para obtener el mejor precio posible." #: src/views/portfolio-page/index.tsx:41 msgid "Your portfolio brings together DTF holdings, staked and vote-locked governance positions, rewards, pending withdrawals, voting power, RSR balances, and recent transactions." @@ -11832,11 +11843,15 @@ msgstr "Tu portafolio reúne posiciones en DTFs, posiciones de gobernanza en Sta msgid "Your privacy is protected. This confirmation is only ever associated with your wallet address - never your personal information. <0>Privacy Policy" msgstr "Tu privacidad está protegida. Esta confirmación solo se asocia con la dirección de tu Wallet, nunca con tu información personal. <0>Política de Privacidad" -#: src/views/portfolio-page/components/transactions.tsx:163 +#: src/views/portfolio-page/components/transactions.tsx:167 msgid "Your recent on-chain activity." msgstr "Tu actividad on-chain reciente." -#: src/views/earn/views/yield-dtf/components/staking-positions.tsx:82 +#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:263 +msgid "Your redeemable" +msgstr "Tu monto canjeable" + +#: src/views/earn/views/yield-dtf/components/staking-positions.tsx:125 msgid "Your stake" msgstr "Tu Stake" diff --git a/src/locales/ko.po b/src/locales/ko.po index b54d852cc..e590371c5 100644 --- a/src/locales/ko.po +++ b/src/locales/ko.po @@ -34,7 +34,7 @@ msgstr "({outputVsInputDeltaLabel} 원래 입력 대비)" msgid "(in their Github repository)" msgstr "(해당 Github 저장소에서)" -#: src/views/index-dtf/overview/components/index-disclousure.tsx:361 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:348 msgid "(the “Website”), you expressly acknowledge that you have read and understood the" msgstr "(이하 “웹사이트”)를 이용함으로써 귀하는 다음 문서를 읽고 이해했음을 명시적으로 인정합니다:" @@ -133,7 +133,7 @@ msgstr "{0} {1} + ${2} 기존 담보" #. placeholder {1}: inputToken.symbol #: src/views/index-dtf/issuance/async-mint/steps/quote-summary.tsx:871 msgid "{0} {1} + existing collateral" -msgstr "" +msgstr "{0} {1} + 기존 담보" #. placeholder {0}: formatCurrency(Number(amount)) #. placeholder {1}: indexDTF.token.symbol @@ -276,12 +276,12 @@ msgid "{0} selected" msgstr "{0}개 선택됨" #. placeholder {0}: config.tokenName -#: src/views/index-dtf/overview/components/index-disclousure.tsx:157 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:144 msgid "{0} Token Whitepaper" msgstr "{0} 토큰 백서" #. placeholder {0}: config.tokenName -#: src/views/index-dtf/overview/components/index-disclousure.tsx:155 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:142 msgid "{0} Token Whitepapers" msgstr "{0} 토큰 백서" @@ -527,11 +527,16 @@ msgstr "{uniqueProjects, plural, one {# 프로토콜} other {# 프로토콜}}" msgid "{unit} Token distribution" msgstr "{unit} 토큰 분배" -#. placeholder {0}: apr?.toFixed(2) -#: src/views/index-dtf/overview/components/index-governance-overview.tsx:78 +#. placeholder {0}: displayRate?.toFixed(2) +#: src/views/index-dtf/overview/components/index-governance-overview.tsx:93 msgid "& Earn {0}% APR" msgstr "& {0}% APR 수익 획득" +#. placeholder {0}: displayRate?.toFixed(2) +#: src/views/index-dtf/overview/components/index-governance-overview.tsx:91 +msgid "& Earn {0}% APY" +msgstr "& {0}% APY 획득" + #: src/components/rtoken-setup/token/BackingForm.tsx:102 msgid "% Acceptable" msgstr "% 허용치" @@ -589,7 +594,7 @@ msgid "<0>Reserve Optimistic Governor upgrade introduces a new governor syst msgstr "<0>Reserve Optimistic Governor 업그레이드는 새로운 거버너 시스템을 도입합니다 TBD COPY HERE!. <1/>자세한 내용은 <2>변경 로그를 참조하세요." #: src/views/home/components/highlighted-dtfs/historical-price-disclaimer.tsx:5 -#: src/views/index-dtf/overview/components/index-disclousure.tsx:416 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:403 msgid "✱ Estimated historical price is a hypothetical illustration of how the DTF’s launch-day basket would have performed before the DTF was created, using historical prices for those assets. The basket did not actually exist during this period. The figure assumes a fixed basket — it does not reflect actual trading, management fees, slippage, or the rebalancing the DTF performs in practice — and is constructed with the benefit of hindsight. Hypothetical performance is not indicative of future results and is not investment advice." msgstr "✱ 추정 과거 가격은 DTF가 생성되기 전에 해당 자산들의 과거 가격을 사용하여 DTF의 출시일 바스켓이 어떻게 움직였을지를 보여주는 가상의 예시입니다. 이 바스켓은 해당 기간 동안 실제로 존재하지 않았습니다. 이 수치는 고정된 바스켓을 가정하며, 실제 거래, 운용 수수료, 슬리피지 또는 DTF가 실제로 수행하는 리밸런싱을 반영하지 않고 사후적 관점에서 구성된 것입니다. 가상의 성과는 미래의 결과를 보장하지 않으며 투자 자문이 아닙니다." @@ -602,7 +607,7 @@ msgstr "${0} DAO" #. placeholder {1}: dtf.stToken?.underlying?.symbol #. placeholder {2}: dtf.stToken?.underlying?.symbol #. placeholder {3}: dtf.token.symbol -#: src/views/index-dtf/overview/components/index-governance-overview.tsx:141 +#: src/views/index-dtf/overview/components/index-governance-overview.tsx:156 msgid "${0} is governed by the ${1} token. {2} holders must vote-lock their tokens to become a governor of the ${3}. Governors can propose changes to the basket and vote on proposal by other governors. In exchange for locking their tokens and participating in governance, governors earn a portion of the TVL fee charged by the DTF." msgstr "${0}은(는) ${1} 토큰으로 거버넌스가 이루어집니다. ${3}의 거버너가 되려면 {2} 보유자는 토큰을 투표 잠금해야 합니다. 거버너는 바스켓 변경을 제안하고 다른 거버너의 제안에 투표할 수 있습니다. 토큰을 잠그고 거버넌스에 참여하는 대가로, 거버너는 DTF가 부과하는 TVL 수수료의 일부를 획득합니다." @@ -822,7 +827,7 @@ msgstr "Mint 전에 자산 확보" #: src/views/internal/dtf-list/components/dtf-table.tsx:201 #: src/views/portfolio-page/components/pending-withdrawals.tsx:370 #: src/views/portfolio-page/components/staked-positions.tsx:118 -#: src/views/portfolio-page/components/vote-locked-positions.tsx:151 +#: src/views/portfolio-page/components/vote-locked-positions.tsx:236 msgid "Action" msgstr "작업" @@ -1184,7 +1189,7 @@ msgstr "유동성 분석 중..." msgid "and" msgstr "및" -#: src/views/index-dtf/overview/components/index-disclousure.tsx:372 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:359 msgid "and agree to the terms therein. ABC Labs, LLC (\"ABC Labs\") created the Website to help facilitate interaction with the Reserve protocol, including the minting and redeeming of DTFs. However, the Website is only one of several ways in which you can interact with the Reserve protocol. ABC Labs has neither created nor deployed any DTF and your ability to interact with specific DTFs via the Website in no way suggests that a DTF is endorsed by ABC Labs. In fact, ABC Labs assumes no liability for your use of the Website and interaction with the Reserve protocol, as covered in the Terms and Conditions." msgstr "및 그에 포함된 조건에 동의합니다. ABC Labs, LLC(\"ABC Labs\")는 DTF의 Mint와 Redeem을 포함하여 Reserve 프로토콜과의 상호작용을 돕기 위해 웹사이트를 만들었습니다. 그러나 웹사이트는 Reserve 프로토콜과 상호작용할 수 있는 여러 방법 중 하나일 뿐입니다. ABC Labs는 어떠한 DTF도 생성하거나 배포하지 않았으며, 웹사이트를 통해 특정 DTF와 상호작용할 수 있다는 것이 해당 DTF가 ABC Labs의 보증을 받았음을 의미하지 않습니다. 실제로 ABC Labs는 이용약관에 명시된 바와 같이 귀하의 웹사이트 사용 및 Reserve 프로토콜과의 상호작용에 대해 어떠한 책임도 지지 않습니다." @@ -1264,7 +1269,7 @@ msgstr "RSR 승인" #. placeholder {0}: stToken.underlying.symbol #. placeholder {0}: tokenIn.symbol #. placeholder {0}: usedToken.symbol || 'ERC20' -#: src/components/vote-lock/components/submit-lock-button.tsx:224 +#: src/components/vote-lock/components/submit-lock-button.tsx:220 #: src/views/index-dtf/deploy/steps/confirm-deploy/simple/simple-deploy-button.tsx:145 #: src/views/yield-dtf/issuance/components/zapV2/submit/ZapApprovalButton.tsx:60 msgid "Approve use of {0}" @@ -1293,7 +1298,7 @@ msgid "April 1" msgstr "4월 1일" #: src/views/portfolio-page/components/staked-positions.tsx:68 -#: src/views/portfolio-page/components/vote-locked-positions.tsx:111 +#: src/views/portfolio-page/components/vote-locked-positions.tsx:201 msgid "APY" msgstr "APY" @@ -1339,7 +1344,7 @@ msgstr "RToken으로" msgid "Ask Reserve AI" msgstr "Reserve AI에게 질문" -#: src/components/ui/swap.tsx:266 +#: src/components/ui/swap.tsx:271 msgid "Assembling different routes" msgstr "다양한 경로 구성 중" @@ -1497,7 +1502,7 @@ msgstr "자동 Mint와 Redeem에는 스마트 계정을 지원하는 Wallet이 msgid "Automated minting is an advanced feature. For most people, simple swaps are recommended." msgstr "자동 Mint는 고급 기능입니다. 대부분의 사용자에게는 간단한 Swap을 권장합니다." -#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:331 +#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:419 msgid "Automatic" msgstr "자동" @@ -1550,8 +1555,8 @@ msgstr "평균 {0} · 범위 {1}–{2} ({3})" msgid "Avg Cost" msgstr "평균 단가" -#: src/views/earn/views/index-dtf/components/vote-lock-positions.tsx:228 -#: src/views/earn/views/yield-dtf/components/staking-positions.tsx:119 +#: src/views/earn/views/index-dtf/components/vote-lock-positions.tsx:265 +#: src/views/earn/views/yield-dtf/components/staking-positions.tsx:159 msgid "Avg. 30d%" msgstr "평균 30일%" @@ -1634,14 +1639,14 @@ msgstr "백업 구성은 기본 바스켓 변경 사항을 추적하여 값을 msgid "Backups" msgstr "백업" -#: src/components/ui/swap.tsx:213 +#: src/components/ui/swap.tsx:218 #: src/views/index-dtf/issuance/async-mint/steps/configure-mint.tsx:218 #: src/views/portfolio-page/components/available-rewards.tsx:122 #: src/views/portfolio-page/components/dtf-positions.tsx:134 #: src/views/portfolio-page/components/pending-withdrawals.tsx:338 #: src/views/portfolio-page/components/rsr-section.tsx:47 #: src/views/portfolio-page/components/staked-positions.tsx:85 -#: src/views/portfolio-page/components/vote-locked-positions.tsx:124 +#: src/views/portfolio-page/components/vote-locked-positions.tsx:223 #: src/views/yield-dtf/issuance/components/zapV2/input/ZapInputMaxButton.tsx:22 #: src/views/yield-dtf/issuance/components/zapV2/output/ZapOutputBalance.tsx:14 #: src/views/yield-dtf/staking/components/stake/stake-input.tsx:58 @@ -1704,12 +1709,12 @@ msgstr "바스켓 변경 제안" msgid "Basket composition" msgstr "바스켓 구성" -#: src/views/index-dtf/overview/components/index-governance-overview.tsx:37 +#: src/views/index-dtf/overview/components/index-governance-overview.tsx:41 #: src/views/index-dtf/settings/components/index-settings-governance.tsx:170 msgid "Basket Governance" msgstr "바스켓 거버넌스" -#: src/views/index-dtf/overview/components/index-governance-overview.tsx:195 +#: src/views/index-dtf/overview/components/index-governance-overview.tsx:210 msgid "Basket governance settings" msgstr "바스켓 거버넌스 설정" @@ -1798,7 +1803,7 @@ msgstr "계속하기 전에 다음 사항을 확인해 주세요." msgid "Before using automated minting" msgstr "자동 Mint를 사용하기 전에" -#: src/components/vote-lock/components/submit-unlock-button.tsx:145 +#: src/components/vote-lock/components/submit-unlock-button.tsx:132 msgid "Begin {unlockDelay}-day unlock delay" msgstr "{unlockDelay}일 잠금 해제 지연 시작" @@ -1818,7 +1823,7 @@ msgstr "{0} {1} Mint 시작" msgid "Begin redemption of {0} {1}" msgstr "{0} {1} Redemption 시작" -#: src/components/vote-lock/components/submit-unlock-button.tsx:146 +#: src/components/vote-lock/components/submit-unlock-button.tsx:133 msgid "Begin unlock delay" msgstr "잠금 해제 지연 시작" @@ -1839,12 +1844,12 @@ msgid "Best Quote" msgstr "최적 견적" #: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:41 -msgid "Better price found" -msgstr "더 나은 가격 발견" +#~ msgid "Better price found" +#~ msgstr "더 나은 가격 발견" #: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:59 -msgid "Better price on PancakeSwap" -msgstr "PancakeSwap에서 더 나은 가격" +#~ msgid "Better price on PancakeSwap" +#~ msgstr "PancakeSwap에서 더 나은 가격" #. placeholder {0}: formatCurrency( +formatUnits(currentPrice, data.buyingTokenDecimals) ) #. placeholder {1}: data.buyingTokenSymbol @@ -2000,8 +2005,8 @@ msgid "Buy / Sell" msgstr "매수 / 매도" #: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:252 -msgid "Buy on PancakeSwap" -msgstr "PancakeSwap에서 구매" +#~ msgid "Buy on PancakeSwap" +#~ msgstr "PancakeSwap에서 구매" #: src/views/index-dtf/auctions/views/rebalance/components/rebalance-action.tsx:37 msgid "Buy/sell tokens to move closer to proposed weights." @@ -2039,7 +2044,7 @@ msgstr "제공: {0}" msgid "By enabling this option, the zapper will only attempt to mint RTokens instead of trading for them. This can help you avoid trading fees and slippage." msgstr "이 옵션을 활성화하면 zapper가 RToken을 거래하는 대신 Mint만 시도합니다. 이를 통해 거래 수수료와 슬리피지를 피할 수 있습니다." -#: src/views/index-dtf/overview/components/index-disclousure.tsx:353 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:340 msgid "By using" msgstr "귀하는" @@ -2293,7 +2298,7 @@ msgstr "청구 가능한 배출량" msgid "Claimed" msgstr "청구 완료" -#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:224 +#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:298 msgid "Claiming" msgstr "수령 중" @@ -2332,8 +2337,8 @@ msgid "Closes" msgstr "마감" #: src/views/index-dtf/overview/components/index-disclousure.tsx:120 -msgid "CMC20 whitepaper documentation" -msgstr "CMC20 백서 문서" +#~ msgid "CMC20 whitepaper documentation" +#~ msgstr "CMC20 백서 문서" #: src/views/index-dtf/issuance/async-mint/steps/quote-summary.tsx:1644 #: src/views/index-dtf/issuance/async-mint/steps/quote-summary.tsx:1651 @@ -2587,8 +2592,8 @@ msgstr "트랜잭션 확인 중..." #: src/components/stake-drawer/components/submit-stake-button.tsx:217 #: src/components/stake-drawer/components/submit-unstake-button.tsx:104 -#: src/components/vote-lock/components/submit-lock-button.tsx:215 -#: src/components/vote-lock/components/submit-unlock-button.tsx:137 +#: src/components/vote-lock/components/submit-lock-button.tsx:211 +#: src/components/vote-lock/components/submit-unlock-button.tsx:124 #: src/views/index-dtf/deploy/steps/confirm-deploy/manual/components/confirm-manual-deploy-button.tsx:298 #: src/views/index-dtf/deploy/steps/confirm-deploy/simple/simple-deploy-button.tsx:133 #: src/views/index-dtf/overview/components/zap-mint/submit-zap.tsx:215 @@ -3025,8 +3030,8 @@ msgid "Current value in buffer:" msgstr "버퍼의 현재 가치:" #: src/views/index-dtf/overview/components/index-disclousure.tsx:117 -msgid "Current Version (v1)" -msgstr "현재 버전 (v1)" +#~ msgid "Current Version (v1)" +#~ msgstr "현재 버전 (v1)" #: src/views/index-dtf/overview/components/index-disclousure.tsx:58 msgid "Current Version (v2)" @@ -3037,11 +3042,11 @@ msgstr "현재 버전 (v2)" msgid "Current votes" msgstr "현재 투표" -#: src/views/index-dtf/overview/components/index-disclousure.tsx:270 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:257 msgid "Custodial Risks: Ondo Tokenized Stocks represent claims on SPVs and other structures that hold underlying equity positions through custodians. DTF exposure therefore depends on the operational integrity and solvency of third parties. Any failure, suspension, error, insolvency, fraud, cyber incident, or transfer restriction affecting these parties could result in delayed settlement, blocked transfers, impaired redemptions, forced liquidation, or partial or total loss of value for the DTF’s holdings." msgstr "수탁 위험: Ondo Tokenized Stocks는 수탁 기관을 통해 기초 주식 포지션을 보유하는 SPV 및 기타 구조에 대한 청구권을 나타냅니다. 따라서 DTF의 익스포저는 제3자의 운영 건전성과 지급 능력에 좌우됩니다. 이러한 당사자에게 영향을 미치는 장애, 중단, 오류, 지급불능, 사기, 사이버 사고 또는 이전 제한은 결제 지연, 이체 차단, 상환 제한, 강제 청산 또는 DTF 보유 자산 가치의 부분적 또는 전체적 손실로 이어질 수 있습니다." -#: src/components/ui/swap.tsx:500 +#: src/components/ui/swap.tsx:506 #: src/views/index-dtf/deploy/components/toggle-group-preset.tsx:31 #: src/views/yield-dtf/issuance/components/zapV2/settings/ZapSettingsCustomSlippage.tsx:24 msgid "Custom" @@ -3079,7 +3084,7 @@ msgstr "DAO 설정 제안" msgid "Dark" msgstr "다크" -#: src/views/portfolio-page/components/transactions.tsx:86 +#: src/views/portfolio-page/components/transactions.tsx:90 msgid "Date" msgstr "날짜" @@ -3305,7 +3310,7 @@ msgstr "DEPRECATED" #: src/views/explorer/components/governance/index.tsx:76 #: src/views/index-dtf/governance/views/proposal/components/proposal-detail-content.tsx:15 #: src/views/index-dtf/governance/views/proposal/components/proposal-detail-content.tsx:41 -#: src/views/portfolio-page/components/transactions.tsx:109 +#: src/views/portfolio-page/components/transactions.tsx:113 #: src/views/yield-dtf/governance/views/proposal-detail/components/ProposalDetailContent.tsx:45 #: src/views/yield-dtf/governance/views/proposal/components/ConfirmProposalForm.tsx:70 #: src/views/yield-dtf/overview/components/hero/token-mandate.tsx:25 @@ -3338,7 +3343,7 @@ msgstr "비활성화됨" msgid "Discard" msgstr "취소" -#: src/views/index-dtf/overview/components/index-disclousure.tsx:347 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:334 msgid "Disclosures" msgstr "공시" @@ -3374,7 +3379,7 @@ msgstr "닫기" msgid "Dismiss invitation" msgstr "초대 닫기" -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:218 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:146 msgid "Dismiss suggestion" msgstr "제안 닫기" @@ -3576,7 +3581,7 @@ msgstr "DTF V4.0.0 업그레이드 제안이 생성되었습니다" msgid "DTF V5.0.0 upgrade proposal created" msgstr "DTF V5.0.0 업그레이드 제안이 생성되었습니다" -#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:92 +#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:99 msgid "DTFs governed by {voteLockSymbol}" msgstr "{voteLockSymbol}이(가) 거버넌스하는 DTF" @@ -4005,7 +4010,7 @@ msgstr "예상 총 영향" msgid "ETH address" msgstr "ETH 주소" -#: src/components/ui/swap.tsx:267 +#: src/components/ui/swap.tsx:272 msgid "Evaluating slippage" msgstr "슬리피지 평가 중" @@ -4022,6 +4027,11 @@ msgstr "균등 분배" msgid "Exceeds available balance" msgstr "사용 가능한 잔액 초과" +#: src/components/vote-lock/components/vault-exchange-rate.tsx:28 +#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:248 +msgid "Exchange rate" +msgstr "교환 비율" + #: src/views/yield-dtf/overview/components/charts/price-chart.tsx:133 msgid "Exchange Rate" msgstr "환율" @@ -4111,7 +4121,7 @@ msgstr "기존 담보 · ${0} 사용 가능" #: src/views/index-dtf/issuance/async-mint/steps/quote-summary.tsx:817 msgid "Existing collateral applied" -msgstr "" +msgstr "기존 담보 적용됨" #: src/components/rtoken-setup/components/BackButton.tsx:28 #: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:45 @@ -4122,7 +4132,7 @@ msgstr "Deployer 종료" msgid "Expanded J.1 to include energy usage data and the sources and methodologies used for its calculation." msgstr "J.1을 확장하여 에너지 사용 데이터와 그 계산에 사용된 출처 및 방법론을 포함했습니다." -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:63 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:43 msgid "Expect a worse price" msgstr "불리한 가격 예상" @@ -4177,7 +4187,7 @@ msgstr "자세한 내용은 Reserve Documentation을 참고하세요." msgid "Explore yield opportunities for {0}" msgstr "{0}의 수익 기회 살펴보기" -#: src/views/portfolio-page/components/transactions.tsx:128 +#: src/views/portfolio-page/components/transactions.tsx:132 msgid "Explorer" msgstr "Explorer" @@ -4438,13 +4448,13 @@ msgstr "찬성" msgid "For approved governors to fast-track proposals." msgstr "승인된 거버너가 제안을 신속 처리할 수 있도록 합니다." -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:158 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:93 msgid "For larger amounts, split your order into multiple transactions." msgstr "더 큰 금액은 주문을 여러 건의 거래로 나누어 진행하세요." #: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:115 -msgid "For larger orders, a DEX like PancakeSwap may get you a better price by routing your trade across multiple sources of liquidity." -msgstr "대규모 주문의 경우 PancakeSwap 같은 DEX가 여러 유동성 소스로 거래를 라우팅해 더 나은 가격을 제공할 수 있습니다." +#~ msgid "For larger orders, a DEX like PancakeSwap may get you a better price by routing your trade across multiple sources of liquidity." +#~ msgstr "대규모 주문의 경우 PancakeSwap 같은 DEX가 여러 유동성 소스로 거래를 라우팅해 더 나은 가격을 제공할 수 있습니다." #: src/views/index-dtf/components/compliance-alert.tsx:20 msgid "For more information, see our <0>Terms of Use." @@ -4558,13 +4568,13 @@ msgstr "RToken Deployer로 이동" msgid "Gov Speed" msgstr "거버넌스 속도" -#: src/views/earn/views/index-dtf/components/vote-lock-positions.tsx:158 -#: src/views/earn/views/yield-dtf/components/staking-positions.tsx:45 +#: src/views/earn/views/index-dtf/components/vote-lock-positions.tsx:215 +#: src/views/earn/views/yield-dtf/components/staking-positions.tsx:88 msgid "Gov. Token" msgstr "거버넌스 토큰" #. placeholder {0}: indexDTF.token.symbol -#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:312 +#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:392 msgid "Govern ${0}" msgstr "${0} 거버넌스" @@ -4584,7 +4594,7 @@ msgstr "거버넌스에 참여하고, Stake하고, 수익 기회를 찾아보세 #: src/views/index-dtf/governance/views/propose/views/propose-dao-settings/components/dao-settings-proposal-sections.tsx:64 #: src/views/index-dtf/governance/views/propose/views/propose-dtf-settings/components/dtf-settings-proposal-sections.tsx:174 #: src/views/index-dtf/governance/views/propose/views/propose-dtf-settings/components/sections/propose-revenue-distribution.tsx:247 -#: src/views/index-dtf/overview/components/index-governance-overview.tsx:35 +#: src/views/index-dtf/overview/components/index-governance-overview.tsx:39 #: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:28 #: src/views/yield-dtf/governance/views/proposal/components/ProposalNavigation.tsx:18 #: src/views/yield-dtf/overview/components/backing/risks.tsx:83 @@ -4636,7 +4646,7 @@ msgstr "거버넌스 매개변수" msgid "Governance roles" msgstr "거버넌스 역할" -#: src/views/index-dtf/overview/components/index-governance-overview.tsx:193 +#: src/views/index-dtf/overview/components/index-governance-overview.tsx:208 msgid "Governance settings" msgstr "거버넌스 설정" @@ -4649,8 +4659,8 @@ msgstr "거버넌스 지분" msgid "Governance Stats" msgstr "거버넌스 통계" -#: src/views/index-dtf/settings/components/index-settings-governance-token.tsx:17 -#: src/views/portfolio-page/components/vote-locked-positions.tsx:47 +#: src/views/index-dtf/settings/components/index-settings-governance-token.tsx:16 +#: src/views/portfolio-page/components/vote-locked-positions.tsx:137 #: src/views/portfolio-page/components/voting-power.tsx:47 msgid "Governance Token" msgstr "거버넌스 토큰" @@ -4659,7 +4669,7 @@ msgstr "거버넌스 토큰" msgid "Governance with an execution delay greater than 1 week unstaking delay" msgstr "Unstaking 지연이 1주를 초과하는 실행 지연이 있는 거버넌스" -#: src/views/earn/views/index-dtf/components/vote-lock-positions.tsx:120 +#: src/views/earn/views/index-dtf/components/vote-lock-positions.tsx:177 msgid "Governed DTFs" msgstr "거버넌스 중인 DTF" @@ -4675,10 +4685,10 @@ msgstr "Governor 주소" msgid "Governor mandate" msgstr "Governor 위임 사항" -#: src/views/earn/views/index-dtf/components/vote-lock-positions.tsx:214 -#: src/views/earn/views/yield-dtf/components/staking-positions.tsx:101 +#: src/views/earn/views/index-dtf/components/vote-lock-positions.tsx:251 +#: src/views/earn/views/yield-dtf/components/staking-positions.tsx:141 #: src/views/portfolio-page/components/staked-positions.tsx:42 -#: src/views/portfolio-page/components/vote-locked-positions.tsx:102 +#: src/views/portfolio-page/components/vote-locked-positions.tsx:192 msgid "Governs" msgstr "거버넌스 대상" @@ -4757,7 +4767,7 @@ msgid "High liquidity" msgstr "높은 유동성" #: src/views/index-dtf/auctions/views/rebalance/components/rebalance-liquidity-checker.tsx:244 -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:48 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:30 #: src/views/index-dtf/governance/views/propose/basket/components/proposal-liquidity-checker.tsx:311 msgid "High price impact" msgstr "높은 가격 영향" @@ -5267,8 +5277,8 @@ msgid "Language" msgstr "언어" #: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:43 -msgid "Large Order" -msgstr "대규모 주문" +#~ msgid "Large Order" +#~ msgstr "대규모 주문" #. placeholder {0}: Math.ceil(amountUsd / ondo.capacityUsd) #: src/components/ondo-badge.tsx:156 @@ -5374,7 +5384,7 @@ msgstr "보유자가 DTF 개요 페이지에서 다운로드할 수 있는 파 msgid "Liquidity" msgstr "유동성" -#: src/views/index-dtf/overview/components/index-disclousure.tsx:297 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:284 msgid "Liquidity Risk: Although on-chain trading is 24/7, primary minting/redeeming of Ondo Tokenized Stocks may be limited, permissioned, delayed, or available only during specific windows. In stressed markets, secondary market liquidity may deteriorate, spreads may widen, and token prices may deviate materially from the value of the referenced underlying equities. As a result, the DTF may experience tracking error versus its intended index composition and may be unable to dispose of or rebalance positions at or near observable net asset value." msgstr "유동성 위험: 온체인 거래는 연중무휴로 이루어지지만, Ondo Tokenized Stocks의 1차 Mint/Redeem은 제한되거나, 허가가 필요하거나, 지연되거나, 특정 시간대에만 가능할 수 있습니다. 시장이 불안정할 때는 2차 시장의 유동성이 악화되고 스프레드가 확대되며 토큰 가격이 참조 기초 주식의 가치에서 크게 벗어날 수 있습니다. 그 결과 DTF는 의도한 지수 구성 대비 추적 오차를 겪을 수 있으며, 관측 가능한 순자산가치(NAV) 또는 그에 근접한 가격으로 포지션을 처분하거나 리밸런싱하지 못할 수 있습니다." @@ -5394,7 +5404,7 @@ msgstr "실시간 리밸런싱 경매" msgid "Loading current allowed actions..." msgstr "현재 허용된 액션 불러오는 중..." -#: src/components/ui/swap.tsx:269 +#: src/components/ui/swap.tsx:274 msgid "Loading DTF" msgstr "DTF 로딩 중" @@ -5470,7 +5480,7 @@ msgid "Location restricted" msgstr "위치 제한" #. placeholder {0}: dtf.stToken?.underlying.symbol ?? 'Unknown' -#: src/views/index-dtf/overview/components/index-governance-overview.tsx:74 +#: src/views/index-dtf/overview/components/index-governance-overview.tsx:86 msgid "Lock ${0} to Govern" msgstr "거버넌스 참여를 위해 ${0} 잠금" @@ -5573,7 +5583,7 @@ msgstr "Mandate는 필수입니다" msgid "Mandate Update" msgstr "권한 업데이트" -#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:351 +#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:421 msgid "Manual" msgstr "수동" @@ -5601,7 +5611,7 @@ msgstr "LLM용 Markdown 파일" msgid "Market" msgstr "시장" -#: src/views/index-dtf/overview/components/index-disclousure.tsx:310 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:297 msgid "Market Access and Redemption Risk: Minting and redemption for Ondo Tokenized Stocks may be permissioned, capacity-limited, subject to eligibility/whitelisting, and available only during defined windows or business-hour cutoffs tied to traditional market operations. These frictions can prevent arbitrage, impair exits at or near NAV, and amplify secondary-market dislocations, thereby resulting in a partial or total loss of the DTFs' holdings." msgstr "시장 접근 및 상환 위험: Ondo Tokenized Stocks의 Mint와 Redeem은 허가제이거나, 한도가 제한되거나, 적격성/화이트리스트 요건이 적용되거나, 전통 시장 운영에 연동된 특정 시간대 또는 영업시간 마감에만 가능할 수 있습니다. 이러한 마찰은 차익거래를 막고, NAV 또는 그 부근에서의 청산을 어렵게 하며, 2차 시장의 왜곡을 증폭시켜 DTF 보유 자산의 부분적 또는 전체적 손실로 이어질 수 있습니다." @@ -5631,7 +5641,7 @@ msgstr "시가총액:" msgid "Market closed" msgstr "시장 마감" -#: src/components/ui/swap.tsx:223 +#: src/components/ui/swap.tsx:228 #: src/views/index-dtf/issuance/async-mint/steps/configure-mint.tsx:232 #: src/views/yield-dtf/issuance/components/zapV2/input/ZapInputMaxButton.tsx:39 #: src/views/yield-dtf/staking/components/stake/stake-input.tsx:67 @@ -5648,7 +5658,7 @@ msgstr "토큰당 최대 경매 규모" msgid "Max precision is 0.01%" msgstr "최대 정밀도는 0.01%입니다" -#: src/components/ui/swap.tsx:473 +#: src/components/ui/swap.tsx:479 #: src/views/index-dtf/issuance/async-mint/steps/quote-summary.tsx:1284 msgid "Max slippage" msgstr "최대 슬리피지" @@ -5892,7 +5902,7 @@ msgstr "현재 Mint 가능" msgid "Minted" msgstr "Mint됨" -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:177 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:112 msgid "Minting {symbol} is currently unavailable and we couldn't find another route to buy it." msgstr "현재 {symbol} Mint를 이용할 수 없으며 매수할 다른 경로를 찾지 못했습니다." @@ -5937,7 +5947,7 @@ msgid "Modified" msgstr "수정됨" #: src/views/portfolio-page/components/staked-positions.tsx:139 -#: src/views/portfolio-page/components/vote-locked-positions.tsx:38 +#: src/views/portfolio-page/components/vote-locked-positions.tsx:128 msgid "Modify" msgstr "수정" @@ -6281,8 +6291,8 @@ msgid "No results." msgstr "결과 없음." #: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:45 -msgid "No route found" -msgstr "경로를 찾을 수 없음" +#~ msgid "No route found" +#~ msgstr "경로를 찾을 수 없음" #: src/views/yield-dtf/staking/components/withdraw/cooldown-unstake.tsx:90 msgid "No RSR in cooldown" @@ -6376,7 +6386,7 @@ msgstr "아니요. 모든 제안에 참여하지 않더라도 ERC20 토큰이 msgid "Non-Basket Governance Settings" msgstr "바스켓 외 거버넌스 설정" -#: src/views/earn/components/position-balance.tsx:65 +#: src/views/earn/components/position-balance.tsx:81 #: src/views/yield-dtf/governance/views/proposal-detail/components/ContractProposalDetails.tsx:103 #: src/views/yield-dtf/governance/views/proposal/components/SpellUpgrade3_4_0.tsx:66 #: src/views/yield-dtf/governance/views/proposal/components/SpellUpgrade4_2_0.tsx:67 @@ -6461,8 +6471,8 @@ msgid "Official documentation for the CFB LCAP token" msgstr "CFB LCAP 토큰 공식 문서" #: src/views/index-dtf/overview/components/index-disclousure.tsx:113 -msgid "Official documentation for the CMC20 token" -msgstr "CMC20 토큰 공식 문서" +#~ msgid "Official documentation for the CMC20 token" +#~ msgstr "CMC20 토큰 공식 문서" #: src/views/index-dtf/governance/views/propose/basket/components/proposal-basket-setup/proposal-basket-table.tsx:54 msgid "Old units" @@ -6599,7 +6609,7 @@ msgstr "Optimistic 제안자" msgid "or drag and drop it here" msgstr "또는 여기에 드래그 앤 드롭하세요" -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:61 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:41 msgid "Order too large" msgstr "주문이 너무 큽니다" @@ -6622,6 +6632,10 @@ msgstr "주문이 {0} 후 만료됩니다" msgid "Original whitepaper documentation" msgstr "원본 백서 문서" +#: src/views/earn/views/index-dtf/components/vote-lock-positions.tsx:166 +msgid "other" +msgstr "기타" + #: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:24 msgid "Other" msgstr "기타" @@ -6632,13 +6646,11 @@ msgstr "기타" msgid "Other config" msgstr "기타 설정" -#: src/views/earn/views/index-dtf/components/vote-lock-positions.tsx:106 -#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:78 +#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:85 msgid "other DTF" msgstr "기타 DTF" -#: src/views/earn/views/index-dtf/components/vote-lock-positions.tsx:108 -#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:80 +#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:87 msgid "other DTFs" msgstr "기타 DTF" @@ -6684,12 +6696,12 @@ msgid "Owners" msgstr "Owners" #: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:103 -msgid "PancakeSwap is currently offering a better price for this exact order. We recommend buying {symbol} there instead." -msgstr "PancakeSwap에서 현재 이와 동일한 주문에 대해 더 나은 가격을 제공하고 있습니다. 대신 PancakeSwap에서 {symbol}을(를) 구매하는 것을 권장합니다." +#~ msgid "PancakeSwap is currently offering a better price for this exact order. We recommend buying {symbol} there instead." +#~ msgstr "PancakeSwap에서 현재 이와 동일한 주문에 대해 더 나은 가격을 제공하고 있습니다. 대신 PancakeSwap에서 {symbol}을(를) 구매하는 것을 권장합니다." #: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:108 -msgid "PancakeSwap is currently offering a better price for this exact order. We recommend selling {symbol} there instead." -msgstr "PancakeSwap에서 현재 이와 동일한 주문에 대해 더 나은 가격을 제공하고 있습니다. 대신 PancakeSwap에서 {symbol}을(를) 판매하는 것을 권장합니다." +#~ msgid "PancakeSwap is currently offering a better price for this exact order. We recommend selling {symbol} there instead." +#~ msgstr "PancakeSwap에서 현재 이와 동일한 주문에 대해 더 나은 가격을 제공하고 있습니다. 대신 PancakeSwap에서 {symbol}을(를) 판매하는 것을 권장합니다." #: src/views/index-dtf/governance/components/proposal-preview/raw-call-preview.tsx:28 #: src/views/index-dtf/governance/components/proposal-preview/rebalance-preview/legacy-basket-proposal-preview.tsx:305 @@ -6708,7 +6720,7 @@ msgstr "참여하고 수익 얻기" msgid "Participate and earn" msgstr "참여하고 보상을 받으세요" -#: src/views/portfolio-page/components/vote-locked-positions.tsx:176 +#: src/views/portfolio-page/components/vote-locked-positions.tsx:261 msgid "Participate in governance with any ERC-20 token and earn APY rewards. <0>Learn more." msgstr "ERC-20 토큰으로 거버넌스에 참여하고 APY 리워드를 받으세요. <0>자세히 보기." @@ -6792,8 +6804,8 @@ msgstr "대기 중인 출금" #: src/components/stake-drawer/components/submit-unstake-button.tsx:105 #: src/components/transaction-modal/index.tsx:159 #: src/components/vote-lock/components/submit-delegate-button.tsx:179 -#: src/components/vote-lock/components/submit-lock-button.tsx:216 -#: src/components/vote-lock/components/submit-unlock-button.tsx:138 +#: src/components/vote-lock/components/submit-lock-button.tsx:212 +#: src/components/vote-lock/components/submit-unlock-button.tsx:125 #: src/views/index-dtf/deploy/steps/confirm-deploy/manual/components/confirm-manual-deploy-button.tsx:298 #: src/views/index-dtf/deploy/steps/confirm-deploy/simple/simple-deploy-button.tsx:134 #: src/views/index-dtf/overview/components/zap-mint/submit-zap.tsx:216 @@ -6953,7 +6965,7 @@ msgstr "Register가 토큰을 관리하는 방식에 대한 자세한 내용은 msgid "Please read more about the different roles in Alexios and the Reserve protocol in the documentation." msgstr "Alexios 및 Reserve 프로토콜의 다양한 역할에 대한 자세한 내용은 문서를 참고하세요." -#: src/views/index-dtf/overview/components/index-disclousure.tsx:410 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:397 msgid "please see here." msgstr "여기를 참조하세요." @@ -7139,7 +7151,7 @@ msgstr "가격 변동 ({0})" #: src/views/index-dtf/auctions/views/rebalance/updaters/rebalance-metrics-updater.tsx:184 msgid "Price data unavailable — cannot launch auction." -msgstr "" +msgstr "가격 데이터를 사용할 수 없음 — 경매를 시작할 수 없습니다." #: src/views/index-dtf/issuance/async-mint/steps/quote-summary.tsx:1259 msgid "Price impact" @@ -7163,23 +7175,23 @@ msgstr "가격 설정" #: src/views/index-dtf/issuance/async-mint/steps/quote-summary.tsx:239 #: src/views/index-dtf/issuance/async-mint/steps/quote-summary.tsx:305 msgid "Price unavailable" -msgstr "" +msgstr "가격 정보 없음" #: src/views/index-dtf/auctions/views/rebalance/components/launch-auctions-button.tsx:180 msgid "Price unavailable — cannot launch" -msgstr "" +msgstr "가격 정보 없음 — 시작할 수 없음" #: src/views/index-dtf/auctions/views/rebalance/updaters/rebalance-metrics-updater.tsx:137 msgid "Price unavailable for \"{symbol}\" — cannot launch auction." -msgstr "" +msgstr "\"{symbol}\"의 가격 정보 없음 — 경매를 시작할 수 없습니다." #: src/views/index-dtf/auctions/views/rebalance/components/launch-auctions-button.tsx:178 msgid "Price unavailable for {unavailableSymbol} — cannot launch" -msgstr "" +msgstr "{unavailableSymbol}의 가격 정보 없음 — 시작할 수 없음" #: src/views/index-dtf/auctions/views/rebalance/updaters/rebalance-metrics-updater.tsx:138 msgid "Price unavailable for a basket token — cannot launch auction." -msgstr "" +msgstr "바스켓 토큰의 가격 정보 없음 — 경매를 시작할 수 없습니다." #: src/components/layout/navigation/TokenNavigation.tsx:215 #: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:20 @@ -7209,8 +7221,8 @@ msgstr "Wallet에서 진행" #: src/components/stake-drawer/components/submit-stake-button.tsx:215 #: src/components/stake-drawer/components/submit-unstake-button.tsx:102 -#: src/components/vote-lock/components/submit-lock-button.tsx:213 -#: src/components/vote-lock/components/submit-unlock-button.tsx:135 +#: src/components/vote-lock/components/submit-lock-button.tsx:209 +#: src/components/vote-lock/components/submit-unlock-button.tsx:122 msgid "Processing transaction..." msgstr "트랜잭션 처리 중..." @@ -7421,7 +7433,7 @@ msgid "Provider" msgstr "제공자" #. placeholder {0}: version.date -#: src/views/index-dtf/overview/components/index-disclousure.tsx:198 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:185 msgid "Published: {0}" msgstr "게시일: {0}" @@ -7695,7 +7707,7 @@ msgstr "Redeem됨" msgid "Redeeming {0} for {1}." msgstr "{0}을(를) {1}(으)로 Redeem하는 중입니다." -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:182 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:117 msgid "Redeeming {symbol} is currently unavailable and we couldn't find another route to sell it." msgstr "현재 {symbol} Redeem을 이용할 수 없으며 매도할 다른 경로를 찾지 못했습니다." @@ -7733,7 +7745,7 @@ msgstr "Redemption 스로틀 비율 (%)" msgid "Reduce" msgstr "감소" -#: src/components/ui/swap.tsx:268 +#: src/components/ui/swap.tsx:273 msgid "Reducing potential dust" msgstr "잠재적 더스트 감소 중" @@ -7782,7 +7794,7 @@ msgstr "자산 플러그인을 등록하면 RToken이 기초 ERC20 토큰의 가 msgid "Regular minting " msgstr "일반 Mint " -#: src/views/index-dtf/overview/components/index-disclousure.tsx:282 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:269 msgid "Regulatory and Compliance Risk: Tokenized equities and related on-chain transfer mechanisms may be subject to evolving regulatory interpretations and enforcement actions. Ondo Tokenized Stocks may also be subject to contractual eligibility requirements, permissioning, whitelisting, jurisdictional limitations, sanctions screening, or other compliance gating that can be changed or applied with little notice. If regulations or compliance requirements change, the DTF may be forced to restrict access, halt mints/redemptions, rebalance away from affected components, or wind down positions under adverse market conditions, potentially causing tracking error, reduced liquidity, and losses." msgstr "규제 및 컴플라이언스 위험: 토큰화 주식 및 관련 온체인 이전 메커니즘은 변화하는 규제 해석과 집행 조치의 대상이 될 수 있습니다. Ondo Tokenized Stocks는 또한 계약상의 적격성 요건, 허가, 화이트리스트, 관할권 제한, 제재 심사 또는 기타 컴플라이언스 게이트의 적용을 받을 수 있으며, 이는 예고 없이 변경되거나 적용될 수 있습니다. 규제 또는 컴플라이언스 요건이 변경되면 DTF는 접근 제한, Mint/Redeem 중단, 영향을 받는 구성 요소에서의 리밸런싱 또는 불리한 시장 상황에서의 포지션 청산을 강요받을 수 있으며, 이는 추적 오차, 유동성 감소 및 손실을 초래할 수 있습니다." @@ -8032,7 +8044,7 @@ msgstr "수익 분배 백킹 버퍼" #: src/views/index-dtf/governance/components/proposal-preview/dtf-settings-preview.tsx:264 msgid "Revenue distribution unavailable" -msgstr "" +msgstr "수익 분배 정보 없음" #: src/views/index-dtf/governance/views/propose/views/propose-dtf-settings/components/changes/revenue-changes.tsx:445 msgid "Revenue Settings" @@ -8086,7 +8098,7 @@ msgid "Revert All" msgstr "모두 되돌리기" #. placeholder {0}: config.tokenName -#: src/views/index-dtf/overview/components/index-disclousure.tsx:146 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:133 msgid "Review {0} Whitepaper" msgstr "{0} 백서 검토" @@ -8164,7 +8176,7 @@ msgstr "리워드 비율 (소수)" msgid "Reward Token" msgstr "리워드 토큰" -#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:173 +#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:180 msgid "Reward tokens" msgstr "보상 토큰" @@ -8180,7 +8192,7 @@ msgstr "사용 가능한 리워드" msgid "Rewards claimed" msgstr "청구된 리워드" -#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:217 +#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:291 msgid "Rewards in" msgstr "보상 토큰" @@ -8426,7 +8438,7 @@ msgstr "거버넌스 토큰 또는 DTF 검색" msgid "Search pool" msgstr "Pool 검색" -#: src/components/ui/swap.tsx:265 +#: src/components/ui/swap.tsx:270 msgid "Searching DEX Liquidity" msgstr "DEX 유동성 검색 중" @@ -8473,7 +8485,7 @@ msgstr "선택한 이미지" #: src/views/index-dtf/settings/components/index-settings-governance.tsx:73 msgid "Selector Registry" -msgstr "" +msgstr "셀렉터 레지스트리" #: src/views/index-dtf/governance/views/propose/views/propose-dtf-settings/components/sections/propose-optimistic-parameters.tsx:51 msgid "Selector registry is not available for this optimistic governor." @@ -8510,8 +8522,8 @@ msgid "Sell collateral" msgstr "담보 매도" #: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:254 -msgid "Sell on PancakeSwap" -msgstr "PancakeSwap에서 판매" +#~ msgid "Sell on PancakeSwap" +#~ msgstr "PancakeSwap에서 판매" #: src/views/index-dtf/auctions/views/rebalance/components/auction-bids-chart.tsx:334 #: src/views/index-dtf/auctions/views/rebalance/components/rebalance-liquidity-checker.tsx:278 @@ -8823,7 +8835,7 @@ msgstr "시뮬레이션 실패 ✘" msgid "Slashing Risk" msgstr "슬래싱 리스크" -#: src/components/ui/swap.tsx:470 +#: src/components/ui/swap.tsx:476 msgid "Slippage" msgstr "슬리피지" @@ -9339,11 +9351,11 @@ msgstr "Telegram 링크" msgid "Telegram username" msgstr "Telegram 사용자명" -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:65 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:45 msgid "Temporarily unavailable" msgstr "일시적으로 이용 불가" -#: src/views/index-dtf/overview/components/index-disclousure.tsx:370 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:357 msgid "Terms and Conditions" msgstr "이용약관" @@ -9416,7 +9428,7 @@ msgstr "가디언은 제안이 통과되더라도 이를 거부할 수 있는 msgid "The impact your trade has on the market price." msgstr "거래가 시장 가격에 미치는 영향입니다." -#: src/views/index-dtf/overview/components/index-disclousure.tsx:386 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:373 msgid "The information provided on the Website comes from on-chain sources. Past performance is not indicative of future results. Although index DTFs are intended to track indexes, their ability to successfully track indexes are dependent on the governance structure of the DTF and the governance’s ability to make appropriate trades. There is no guarantee that such trades will be successful or will track its corresponding index exactly. There are many risks associated with digital assets, including but not limited to security risk, counterparty risk, volatility risk, conflicts of interest, and many more. DTFs are no exception. By using the Website, you agree that your interaction with any DTFs is solely at your own risk and the Website and DTFs come as is, without any warranty or condition of any kind." msgstr "웹사이트에서 제공되는 정보는 온체인 소스에서 가져옵니다. 과거의 성과가 미래의 결과를 보장하지 않습니다. 인덱스 DTF는 지수를 추종하도록 설계되었지만, 지수를 성공적으로 추종할 수 있는지는 DTF의 거버넌스 구조와 거버넌스가 적절한 거래를 수행할 수 있는 능력에 달려 있습니다. 그러한 거래가 성공하거나 해당 지수를 정확히 추종한다는 보장은 없습니다. 디지털 자산에는 보안 위험, 거래상대방 위험, 변동성 위험, 이해 상충 등 수많은 위험이 존재합니다. DTF도 예외가 아닙니다. 웹사이트를 사용함으로써 귀하는 DTF와의 모든 상호작용이 전적으로 귀하의 책임이며, 웹사이트와 DTF가 어떠한 종류의 보증이나 조건 없이 있는 그대로 제공된다는 데 동의합니다." @@ -9428,7 +9440,7 @@ msgstr "long freezer는 RToken 시스템을 장기간 동결할 수 있는 권 msgid "The mandate describes what goals its governors should try to achieve. By briefly explaining the RToken's purpose and what the RToken is intended to do, it provides common ground for the governors to decide upon priorities and how to weigh tradeoffs." msgstr "맨데이트는 거버너가 달성해야 할 목표를 설명합니다. RToken의 목적과 RToken이 의도하는 바를 간략히 설명함으로써, 거버너가 우선순위를 정하고 트레이드오프를 어떻게 따져볼지 결정하는 데 공통의 기반을 제공합니다." -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:79 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:57 msgid "The market reopens {nextOpenLabel}." msgstr "시장은 {nextOpenLabel}에 다시 열립니다." @@ -9637,7 +9649,7 @@ msgstr "테마" msgid "There are a <0>handful of risks associated with any given RToken's collateral assets, including assets' redeemability, the health of their reserves, price volatility, etc. Likewise, because many RTokens leverage assets from external protocols, RToken holders assume all of the risks of its underlying protocols (smart contract, governance, or otherwise)." msgstr "특정 RToken의 담보 자산에는 자산의 Redeem 가능성, 준비금 건전성, 가격 변동성 등 <0>여러 리스크가 따릅니다. 마찬가지로 많은 RTokens가 외부 프로토콜의 자산을 활용하기 때문에, RToken 보유자는 기초 프로토콜의 모든 리스크(스마트 컨트랙트, 거버넌스 등)를 부담합니다." -#: src/views/index-dtf/overview/components/index-disclousure.tsx:263 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:250 msgid "There are potential risks associated with Ondo Tokenized Stocks, including but not limited to:" msgstr "Ondo Tokenized Stocks에는 다음을 포함하되 이에 국한되지 않는 잠재적 위험이 있습니다:" @@ -9829,7 +9841,7 @@ msgstr "제목" msgid "Title Update" msgstr "제목 업데이트" -#: src/views/index-dtf/overview/components/index-disclousure.tsx:404 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:391 msgid "To learn more about the risks associated with DTFs," msgstr "DTF와 관련된 위험에 대해 자세히 알아보려면" @@ -9837,7 +9849,7 @@ msgstr "DTF와 관련된 위험에 대해 자세히 알아보려면" msgid "To verify eligibility, please leave us your name and email, and we will reach out to you personally." msgstr "자격 확인을 위해 이름과 이메일을 남겨 주시면 직접 연락드리겠습니다." -#: src/components/ui/swap.tsx:489 +#: src/components/ui/swap.tsx:495 msgid "Toggle {option}" msgstr "{option} 토글" @@ -9854,7 +9866,7 @@ msgstr "테마 전환" #: src/views/index-dtf/governance/views/propose/basket/components/proposal-basket-preview.tsx:160 #: src/views/index-dtf/governance/views/propose/basket/components/proposal-basket-setup/proposal-basket-table.tsx:49 #: src/views/portfolio-page/components/pending-withdrawals.tsx:307 -#: src/views/portfolio-page/components/transactions.tsx:95 +#: src/views/portfolio-page/components/transactions.tsx:99 #: src/views/tokens/components/UnlistedTokensTable.tsx:83 #: src/views/yield-dtf/overview/components/backing/collateral-exposure.tsx:245 msgid "Token" @@ -10076,7 +10088,7 @@ msgstr "{0}을(를) 담보로 거래" msgid "Trade remaining {0} into collateral" msgstr "남은 {0}을(를) 담보로 거래" -#: src/views/index-dtf/components/zapper/large-mint-prompt.tsx:253 +#: src/views/index-dtf/components/zapper/large-mint-prompt.tsx:204 msgid "Trade suggestion" msgstr "거래 제안" @@ -10153,7 +10165,7 @@ msgstr "{0}에 거래가 재개됩니다." msgid "Trading Timelock" msgstr "Trading Timelock" -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:50 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:32 msgid "Trading unavailable" msgstr "거래 불가" @@ -10168,8 +10180,8 @@ msgstr "트랜잭션 2" #: src/components/stake-drawer/components/submit-stake-button.tsx:180 #: src/components/stake-drawer/components/submit-unstake-button.tsx:80 -#: src/components/vote-lock/components/submit-lock-button.tsx:221 -#: src/components/vote-lock/components/submit-unlock-button.tsx:143 +#: src/components/vote-lock/components/submit-lock-button.tsx:217 +#: src/components/vote-lock/components/submit-unlock-button.tsx:130 #: src/hooks/useWatchTransaction.ts:56 msgid "Transaction confirmed" msgstr "트랜잭션이 확인되었습니다" @@ -10233,7 +10245,7 @@ msgstr "트랜잭션 성공!" #: src/views/explorer/index.tsx:33 #: src/views/index-dtf/overview/components/index-transaction-table-with-swaps/index.tsx:39 #: src/views/index-dtf/overview/components/index-transaction-table.tsx:152 -#: src/views/portfolio-page/components/transactions.tsx:162 +#: src/views/portfolio-page/components/transactions.tsx:166 #: src/views/yield-dtf/overview/components/rtoken-transactions.tsx:222 msgid "Transactions" msgstr "트랜잭션" @@ -10286,17 +10298,17 @@ msgstr "필터를 조정하거나 나중에 다시 확인해 보세요" msgid "Try again" msgstr "다시 시도" -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:82 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:60 msgid "Try again during {nextSessionLabel} hours in the US." msgstr "미국 {nextSessionLabel} 시간대에 다시 시도해 주세요." -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:84 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:62 msgid "Try again later when trading resumes." msgstr "거래가 재개되면 나중에 다시 시도해 주세요." #: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:67 -msgid "Try PancakeSwap" -msgstr "PancakeSwap 시도" +#~ msgid "Try PancakeSwap" +#~ msgstr "PancakeSwap 시도" #: src/views/yield-dtf/issuance/components/zapV2/ZapToggle.tsx:23 msgid "Turn on Zaps to mint using 1 asset" @@ -10359,7 +10371,7 @@ msgstr "Txs" #: src/views/index-dtf/overview/components/index-transaction-table-with-swaps/columns.tsx:41 #: src/views/index-dtf/overview/components/index-transaction-table.tsx:40 #: src/views/index-dtf/overview/components/yield-index/yield-index-composition-tabs.tsx:14 -#: src/views/portfolio-page/components/transactions.tsx:101 +#: src/views/portfolio-page/components/transactions.tsx:105 #: src/views/yield-dtf/overview/components/rtoken-transactions.tsx:98 msgid "Type" msgstr "유형" @@ -10379,7 +10391,7 @@ msgid "Unavailable" msgstr "사용 불가" #: src/views/explorer/components/collaterals/index.tsx:100 -#: src/views/portfolio-page/components/vote-locked-positions.tsx:66 +#: src/views/portfolio-page/components/vote-locked-positions.tsx:156 msgid "Underlying" msgstr "기초 자산" @@ -10387,7 +10399,7 @@ msgstr "기초 자산" msgid "Underlying Platform Exposure" msgstr "기초 플랫폼 노출" -#: src/views/index-dtf/settings/components/index-settings-governance-token.tsx:26 +#: src/views/index-dtf/settings/components/index-settings-governance-token.tsx:32 msgid "Underlying Token" msgstr "기초 토큰" @@ -10457,7 +10469,7 @@ msgstr "무제한" msgid "Unlock" msgstr "잠금 해제" -#: src/components/vote-lock/components/submit-unlock-button.tsx:108 +#: src/components/vote-lock/components/submit-unlock-button.tsx:95 msgid "Unlock initiated successfully" msgstr "잠금 해제가 성공적으로 시작되었습니다" @@ -10674,7 +10686,7 @@ msgstr "업그레이드 대상" msgid "Uploading files..." msgstr "파일 업로드 중..." -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:232 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:160 msgid "US stock market hours are <0>9:30 AM to <1>4:00 PM Eastern Time. Current time is: <2>{currentTimeLabel} ET. Please try again in <3>{reopenInLabel}." msgstr "미국 주식 시장 시간은 동부 시간 기준 <0>9:30 AM부터 <1>4:00 PM까지입니다. 현재 시간: <2>{currentTimeLabel} ET. <3>{reopenInLabel} 후 다시 시도하세요." @@ -10747,7 +10759,7 @@ msgstr "트랜잭션 검증 중" msgid "Validating..." msgstr "검증 중..." -#: src/views/index-dtf/overview/components/index-disclousure.tsx:321 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:308 msgid "Valuation & NAV Calculation Risk – The DTF’s NAV depends on accurate, timely marks for tokenized equities and any associated components. Pricing inputs may be derived from thinly traded on-chain markets, off-chain reference feeds, or oracle mechanisms that can be stale, interrupted, manipulated, or subject to methodology changes. Market-hour mismatches, delayed corporate action processing, and settlement lags can further distort marks. Misvaluation may cause incorrect mint/redeem pricing, unfair dilution among holders, and adverse or mistimed rebalances." msgstr "평가 및 NAV 산정 위험 – DTF의 NAV는 토큰화 주식 및 관련 구성 요소에 대한 정확하고 시의적절한 가격 산정에 의존합니다. 가격 입력값은 거래가 적은 온체인 시장, 오프체인 참조 피드 또는 오라클 메커니즘에서 파생될 수 있으며, 이는 오래되거나, 중단되거나, 조작되거나, 방법론이 변경될 수 있습니다. 시장 시간 불일치, 기업 행위 처리 지연 및 결제 지연은 가격 산정을 더욱 왜곡할 수 있습니다. 잘못된 평가로 인해 부정확한 Mint/Redeem 가격, 보유자 간의 불공정한 희석, 불리하거나 시기가 어긋난 리밸런싱이 발생할 수 있습니다." @@ -10756,7 +10768,7 @@ msgstr "평가 및 NAV 산정 위험 – DTF의 NAV는 토큰화 주식 및 관 #: src/views/portfolio-page/components/pending-withdrawals.tsx:351 #: src/views/portfolio-page/components/rsr-section.tsx:60 #: src/views/portfolio-page/components/staked-positions.tsx:102 -#: src/views/portfolio-page/components/vote-locked-positions.tsx:137 +#: src/views/portfolio-page/components/vote-locked-positions.tsx:229 #: src/views/yield-dtf/overview/components/backing/collateral-exposure.tsx:251 msgid "Value" msgstr "가치" @@ -10900,7 +10912,7 @@ msgstr "전체 바스켓 보기" msgid "View execute tx" msgstr "실행 트랜잭션 보기" -#: src/views/index-dtf/overview/components/index-governance-overview.tsx:103 +#: src/views/index-dtf/overview/components/index-governance-overview.tsx:118 msgid "View governance settings" msgstr "거버넌스 설정 보기" @@ -10921,7 +10933,7 @@ msgstr "목록 보기" msgid "View Merkl Campaign" msgstr "Merkl 캠페인 보기" -#: src/views/index-dtf/overview/components/index-governance-overview.tsx:105 +#: src/views/index-dtf/overview/components/index-governance-overview.tsx:120 msgid "View non-basket governance settings" msgstr "바스켓 외 거버넌스 설정 보기" @@ -10961,7 +10973,7 @@ msgstr "Tenderly에서 보기" msgid "View orders" msgstr "주문 보기" -#: src/views/index-dtf/overview/components/index-disclousure.tsx:193 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:180 msgid "View PDF →" msgstr "PDF 보기 →" @@ -10982,7 +10994,7 @@ msgstr "투표 잠금한 여러 DTF의 제안을 확인하세요." msgid "View quotes" msgstr "견적 보기" -#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:147 +#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:154 msgid "View reward tokens" msgstr "보상 토큰 보기" @@ -11018,7 +11030,7 @@ msgid "Vote" msgstr "투표" #. placeholder {0}: stToken.underlying.symbol -#: src/components/vote-lock/components/submit-lock-button.tsx:223 +#: src/components/vote-lock/components/submit-lock-button.tsx:219 msgid "Vote lock {0}" msgstr "{0} 투표 잠금" @@ -11034,7 +11046,7 @@ msgstr "새 DAO에는 Vote Lock 주소가 허용되지 않습니다" msgid "Vote Lock Frequently Asked Questions" msgstr "투표 잠금 자주 묻는 질문" -#: src/components/vote-lock/components/submit-lock-button.tsx:177 +#: src/components/vote-lock/components/submit-lock-button.tsx:173 msgid "Vote lock successful" msgstr "투표 잠금 완료" @@ -11085,21 +11097,20 @@ msgstr "투표 가중치" msgid "Vote-lock" msgstr "Vote-lock" -#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:343 +#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:409 msgid "Vote-lock {underlyingSymbol} in {voteLockSymbol} to govern and earn from this DTF's TVL fee." msgstr "{underlyingSymbol}을(를) {voteLockSymbol}에 Vote-lock하여 이 DTF를 거버넌스하고 TVL 수수료 수익을 받아보세요." -#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:324 -#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:338 +#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:404 msgid "Vote-lock {underlyingSymbol} in {voteLockSymbol} to govern and earn from TVL fees across all {voteLockGovernedLabel} DTFs." msgstr "{underlyingSymbol}을(를) {voteLockSymbol}에 Vote-lock하여 {voteLockGovernedLabel} DTF 전체를 거버넌스하고 TVL 수수료 수익을 받아보세요." #. placeholder {0}: indexDTF.stToken.underlying.symbol -#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:368 +#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:455 msgid "Vote-lock ${0}" msgstr "${0} 투표 잠금" -#: src/views/index-dtf/settings/components/index-settings-governance-token.tsx:19 +#: src/views/index-dtf/settings/components/index-settings-governance-token.tsx:18 msgid "Vote-Lock DAO Token" msgstr "투표 잠금 DAO 토큰" @@ -11112,7 +11123,7 @@ msgstr "Index DTF의 투표 잠금" msgid "Vote-locked" msgstr "투표 잠금됨" -#: src/views/portfolio-page/components/vote-locked-positions.tsx:174 +#: src/views/portfolio-page/components/vote-locked-positions.tsx:259 msgid "Vote-locked positions" msgstr "투표 잠금 포지션" @@ -11353,7 +11364,7 @@ msgstr "거버넌스용 새 ERC20을 출시하시겠습니까?" msgid "Warmup period (s)" msgstr "워밍업 기간 (초)" -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:52 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:34 #: src/views/yield-dtf/issuance/components/warnings/index.tsx:54 #: src/views/yield-dtf/issuance/components/warnings/index.tsx:87 msgid "Warning" @@ -11389,12 +11400,12 @@ msgid "We call these tokenized portfolios DTFs:" msgstr "이러한 토큰화된 포트폴리오를 DTF라고 부릅니다:" #: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:122 -msgid "We couldn't find a good price for this trade right now. We recommend using a DEX like PancakeSwap to buy {symbol}." -msgstr "현재 이 거래에 좋은 가격을 찾을 수 없습니다. {symbol} 구매에는 PancakeSwap 같은 DEX 사용을 권장합니다." +#~ msgid "We couldn't find a good price for this trade right now. We recommend using a DEX like PancakeSwap to buy {symbol}." +#~ msgstr "현재 이 거래에 좋은 가격을 찾을 수 없습니다. {symbol} 구매에는 PancakeSwap 같은 DEX 사용을 권장합니다." #: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:127 -msgid "We couldn't find a good price for this trade right now. We recommend using a DEX like PancakeSwap to sell {symbol}." -msgstr "현재 이 거래에 좋은 가격을 찾을 수 없습니다. {symbol} 판매에는 PancakeSwap 같은 DEX 사용을 권장합니다." +#~ msgid "We couldn't find a good price for this trade right now. We recommend using a DEX like PancakeSwap to sell {symbol}." +#~ msgstr "현재 이 거래에 좋은 가격을 찾을 수 없습니다. {symbol} 판매에는 PancakeSwap 같은 DEX 사용을 권장합니다." #: src/views/index-dtf/governance/components/proposal-preview/unknown-contract-preview.tsx:52 msgid "We couldn’t retrieve the contract’s ABI from Etherscan. This usually means the contract is not verified. Without its interface, we’re unable to decode any function calls or parameters." @@ -11656,7 +11667,7 @@ msgstr "Yield DTF(Reserve Yield Protocol에서 생성)는 백킹 자산이 디 msgid "Yield:" msgstr "수익:" -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:148 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:83 msgid "You can buy up to {maxAmountLabel} per transaction during {sessionLabel} hours in the US." msgstr "미국 {sessionLabel} 시간 동안 거래당 최대 {maxAmountLabel}까지 매수할 수 있습니다." @@ -11672,7 +11683,7 @@ msgstr "RToken을 일시중지 상태로 두고 나중에 거버넌스 설정으 msgid "You can proceed directly." msgstr "바로 진행할 수 있습니다." -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:153 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:88 msgid "You can sell up to {maxAmountLabel} per transaction during {sessionLabel} hours in the US." msgstr "미국 {sessionLabel} 시간 동안 거래당 최대 {maxAmountLabel}까지 매도할 수 있습니다." @@ -11693,7 +11704,7 @@ msgstr "이 트랜잭션을 완료하기에 자금이 충분하지 않습니다. msgid "You fund" msgstr "투입 금액" -#: src/components/vote-lock/components/vote-lock.tsx:30 +#: src/components/vote-lock/components/vote-lock.tsx:50 msgid "You lock:" msgstr "잠금 금액:" @@ -11731,7 +11742,7 @@ msgstr "제공 금액" msgid "You receive" msgstr "수령 금액" -#: src/components/ui/swap.tsx:363 +#: src/components/ui/swap.tsx:368 #: src/views/yield-dtf/issuance/components/zapV2/output/ZapOutputContainer.tsx:15 #: src/views/yield-dtf/issuance/components/zapV2/submit/ZapSubmitModal.tsx:41 #: src/views/yield-dtf/staking/components/stake/stake-output.tsx:36 @@ -11753,7 +11764,7 @@ msgstr "Stake 금액:" msgid "You submit the transaction configuring your RToken design" msgstr "RToken 설계를 구성하는 트랜잭션을 제출합니다" -#: src/components/vote-lock/components/vote-unlock.tsx:30 +#: src/components/vote-lock/components/vote-unlock.tsx:58 msgid "You unlock:" msgstr "잠금 해제 금액:" @@ -11762,7 +11773,7 @@ msgstr "잠금 해제 금액:" msgid "You unstake:" msgstr "Unstake 금액:" -#: src/components/ui/swap.tsx:238 +#: src/components/ui/swap.tsx:243 #: src/views/yield-dtf/issuance/components/zapV2/input/ZapInputContainer.tsx:21 #: src/views/yield-dtf/issuance/components/zapV2/submit/ZapSubmitModal.tsx:29 #: src/views/yield-dtf/staking/components/stake/stake-modal.tsx:35 @@ -11791,7 +11802,7 @@ msgstr "받게 될 수량" msgid "You'll receive:" msgstr "받게 될 금액:" -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:168 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:103 msgid "You're getting a worse price than usual because {symbol}'s underlying stocks aren't trading right now." msgstr "{symbol}의 기초 주식이 현재 거래되지 않아 평소보다 불리한 가격이 적용되고 있습니다." @@ -11812,17 +11823,17 @@ msgstr "보유 중인 Decentralized Token Fund 투자." msgid "Your DTF has been minted." msgstr "DTF가 Mint되었습니다." -#: src/views/earn/views/index-dtf/components/vote-lock-positions.tsx:197 +#: src/views/earn/views/index-dtf/components/vote-lock-positions.tsx:242 msgid "Your lock" msgstr "나의 Vote-lock" #: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:134 -msgid "Your order has unusually high price impact. We recommend buying {symbol} on PancakeSwap to get the best price possible." -msgstr "주문에 비정상적으로 높은 가격 영향이 있습니다. 가능한 최적의 가격을 위해 PancakeSwap에서 {symbol} 구매를 권장합니다." +#~ msgid "Your order has unusually high price impact. We recommend buying {symbol} on PancakeSwap to get the best price possible." +#~ msgstr "주문에 비정상적으로 높은 가격 영향이 있습니다. 가능한 최적의 가격을 위해 PancakeSwap에서 {symbol} 구매를 권장합니다." #: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:139 -msgid "Your order has unusually high price impact. We recommend selling {symbol} on PancakeSwap to get the best price possible." -msgstr "주문에 비정상적으로 높은 가격 영향이 있습니다. 가능한 최적의 가격을 위해 PancakeSwap에서 {symbol} 판매를 권장합니다." +#~ msgid "Your order has unusually high price impact. We recommend selling {symbol} on PancakeSwap to get the best price possible." +#~ msgstr "주문에 비정상적으로 높은 가격 영향이 있습니다. 가능한 최적의 가격을 위해 PancakeSwap에서 {symbol} 판매를 권장합니다." #: src/views/portfolio-page/index.tsx:41 msgid "Your portfolio brings together DTF holdings, staked and vote-locked governance positions, rewards, pending withdrawals, voting power, RSR balances, and recent transactions." @@ -11832,11 +11843,15 @@ msgstr "포트폴리오에서는 DTF 보유량, Stake 및 Vote-lock된 거버넌 msgid "Your privacy is protected. This confirmation is only ever associated with your wallet address - never your personal information. <0>Privacy Policy" msgstr "귀하의 개인정보는 보호됩니다. 이 확인은 오직 지갑 주소에만 연결되며, 개인 정보와는 절대 연결되지 않습니다. <0>개인정보 처리방침" -#: src/views/portfolio-page/components/transactions.tsx:163 +#: src/views/portfolio-page/components/transactions.tsx:167 msgid "Your recent on-chain activity." msgstr "최근 온체인 활동." -#: src/views/earn/views/yield-dtf/components/staking-positions.tsx:82 +#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:263 +msgid "Your redeemable" +msgstr "상환 가능 금액" + +#: src/views/earn/views/yield-dtf/components/staking-positions.tsx:125 msgid "Your stake" msgstr "나의 Stake" diff --git a/src/locales/zh.po b/src/locales/zh.po index 03b512bfb..841e7565b 100644 --- a/src/locales/zh.po +++ b/src/locales/zh.po @@ -34,7 +34,7 @@ msgstr "({outputVsInputDeltaLabel} 对比原始输入)" msgid "(in their Github repository)" msgstr "(在其 Github 仓库中)" -#: src/views/index-dtf/overview/components/index-disclousure.tsx:361 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:348 msgid "(the “Website”), you expressly acknowledge that you have read and understood the" msgstr "(以下简称“网站”),即表示您明确确认已阅读并理解" @@ -133,7 +133,7 @@ msgstr "{0} {1} + ${2} 现有抵押品" #. placeholder {1}: inputToken.symbol #: src/views/index-dtf/issuance/async-mint/steps/quote-summary.tsx:871 msgid "{0} {1} + existing collateral" -msgstr "" +msgstr "{0} {1} + 现有抵押品" #. placeholder {0}: formatCurrency(Number(amount)) #. placeholder {1}: indexDTF.token.symbol @@ -276,12 +276,12 @@ msgid "{0} selected" msgstr "已选择 {0} 项" #. placeholder {0}: config.tokenName -#: src/views/index-dtf/overview/components/index-disclousure.tsx:157 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:144 msgid "{0} Token Whitepaper" msgstr "{0} 代币白皮书" #. placeholder {0}: config.tokenName -#: src/views/index-dtf/overview/components/index-disclousure.tsx:155 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:142 msgid "{0} Token Whitepapers" msgstr "{0} 代币白皮书" @@ -527,11 +527,16 @@ msgstr "{uniqueProjects, plural, one {# 个协议} other {# 个协议}}" msgid "{unit} Token distribution" msgstr "{unit} 代币分配" -#. placeholder {0}: apr?.toFixed(2) -#: src/views/index-dtf/overview/components/index-governance-overview.tsx:78 +#. placeholder {0}: displayRate?.toFixed(2) +#: src/views/index-dtf/overview/components/index-governance-overview.tsx:93 msgid "& Earn {0}% APR" msgstr "并赚取 {0}% APR" +#. placeholder {0}: displayRate?.toFixed(2) +#: src/views/index-dtf/overview/components/index-governance-overview.tsx:91 +msgid "& Earn {0}% APY" +msgstr "& 赚取 {0}% APY" + #: src/components/rtoken-setup/token/BackingForm.tsx:102 msgid "% Acceptable" msgstr "% 可接受" @@ -589,7 +594,7 @@ msgid "<0>Reserve Optimistic Governor upgrade introduces a new governor syst msgstr "<0>Reserve Optimistic Governor 升级引入了全新的治理者系统 TBD COPY HERE!。<1/>详情请参阅<2>更新日志。" #: src/views/home/components/highlighted-dtfs/historical-price-disclaimer.tsx:5 -#: src/views/index-dtf/overview/components/index-disclousure.tsx:416 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:403 msgid "✱ Estimated historical price is a hypothetical illustration of how the DTF’s launch-day basket would have performed before the DTF was created, using historical prices for those assets. The basket did not actually exist during this period. The figure assumes a fixed basket — it does not reflect actual trading, management fees, slippage, or the rebalancing the DTF performs in practice — and is constructed with the benefit of hindsight. Hypothetical performance is not indicative of future results and is not investment advice." msgstr "✱ 估算历史价格是一种假设性示例,用于说明在该 DTF 创建之前,其上线当日的篮子若按这些资产的历史价格计算将会有怎样的表现。该篮子在此期间实际上并不存在。该数字假设篮子固定不变,并不反映实际交易、管理费、滑点或 DTF 在实际操作中执行的再平衡,且是借助事后视角构建的。假设性表现并不代表未来结果,也不构成投资建议。" @@ -602,7 +607,7 @@ msgstr "${0} DAO" #. placeholder {1}: dtf.stToken?.underlying?.symbol #. placeholder {2}: dtf.stToken?.underlying?.symbol #. placeholder {3}: dtf.token.symbol -#: src/views/index-dtf/overview/components/index-governance-overview.tsx:141 +#: src/views/index-dtf/overview/components/index-governance-overview.tsx:156 msgid "${0} is governed by the ${1} token. {2} holders must vote-lock their tokens to become a governor of the ${3}. Governors can propose changes to the basket and vote on proposal by other governors. In exchange for locking their tokens and participating in governance, governors earn a portion of the TVL fee charged by the DTF." msgstr "${0} 由 ${1} 代币治理。${2} 持有者必须对其代币进行 vote-lock 才能成为 ${3} 的治理者。治理者可以对篮子提出更改,并对其他治理者的提案进行投票。作为锁定代币并参与治理的回报,治理者可赚取该 DTF 收取的 TVL 费用的一部分。" @@ -822,7 +827,7 @@ msgstr "在 Mint 之前获取资产" #: src/views/internal/dtf-list/components/dtf-table.tsx:201 #: src/views/portfolio-page/components/pending-withdrawals.tsx:370 #: src/views/portfolio-page/components/staked-positions.tsx:118 -#: src/views/portfolio-page/components/vote-locked-positions.tsx:151 +#: src/views/portfolio-page/components/vote-locked-positions.tsx:236 msgid "Action" msgstr "操作" @@ -1184,7 +1189,7 @@ msgstr "正在分析流动性……" msgid "and" msgstr "和" -#: src/views/index-dtf/overview/components/index-disclousure.tsx:372 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:359 msgid "and agree to the terms therein. ABC Labs, LLC (\"ABC Labs\") created the Website to help facilitate interaction with the Reserve protocol, including the minting and redeeming of DTFs. However, the Website is only one of several ways in which you can interact with the Reserve protocol. ABC Labs has neither created nor deployed any DTF and your ability to interact with specific DTFs via the Website in no way suggests that a DTF is endorsed by ABC Labs. In fact, ABC Labs assumes no liability for your use of the Website and interaction with the Reserve protocol, as covered in the Terms and Conditions." msgstr "并同意其中的条款。ABC Labs, LLC(\"ABC Labs\")创建本网站是为了帮助用户与 Reserve 协议进行交互,包括 DTF 的 Mint 和 Redeem。然而,本网站只是您与 Reserve 协议交互的多种方式之一。ABC Labs 从未创建或部署任何 DTF,您能够通过本网站与特定 DTF 交互并不意味着该 DTF 获得了 ABC Labs 的认可。事实上,如条款与条件所述,ABC Labs 对您使用本网站以及与 Reserve 协议的交互不承担任何责任。" @@ -1264,7 +1269,7 @@ msgstr "授权 RSR" #. placeholder {0}: stToken.underlying.symbol #. placeholder {0}: tokenIn.symbol #. placeholder {0}: usedToken.symbol || 'ERC20' -#: src/components/vote-lock/components/submit-lock-button.tsx:224 +#: src/components/vote-lock/components/submit-lock-button.tsx:220 #: src/views/index-dtf/deploy/steps/confirm-deploy/simple/simple-deploy-button.tsx:145 #: src/views/yield-dtf/issuance/components/zapV2/submit/ZapApprovalButton.tsx:60 msgid "Approve use of {0}" @@ -1293,7 +1298,7 @@ msgid "April 1" msgstr "4 月 1 日" #: src/views/portfolio-page/components/staked-positions.tsx:68 -#: src/views/portfolio-page/components/vote-locked-positions.tsx:111 +#: src/views/portfolio-page/components/vote-locked-positions.tsx:201 msgid "APY" msgstr "APY" @@ -1339,7 +1344,7 @@ msgstr "以 RToken 形式" msgid "Ask Reserve AI" msgstr "询问 Reserve AI" -#: src/components/ui/swap.tsx:266 +#: src/components/ui/swap.tsx:271 msgid "Assembling different routes" msgstr "正在组合不同路由" @@ -1497,7 +1502,7 @@ msgstr "自动 Mint 和 Redeem 需要支持智能账户的 Wallet。不支持硬 msgid "Automated minting is an advanced feature. For most people, simple swaps are recommended." msgstr "自动 Mint 是一项高级功能。对大多数人而言,推荐使用简单的 Swap。" -#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:331 +#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:419 msgid "Automatic" msgstr "自动" @@ -1550,8 +1555,8 @@ msgstr "平均 {0} · 范围 {1}–{2}({3})" msgid "Avg Cost" msgstr "平均成本" -#: src/views/earn/views/index-dtf/components/vote-lock-positions.tsx:228 -#: src/views/earn/views/yield-dtf/components/staking-positions.tsx:119 +#: src/views/earn/views/index-dtf/components/vote-lock-positions.tsx:265 +#: src/views/earn/views/yield-dtf/components/staking-positions.tsx:159 msgid "Avg. 30d%" msgstr "30 天平均%" @@ -1634,14 +1639,14 @@ msgstr "备用配置会跟踪主篮子的变化以更新其数值。这在某个 msgid "Backups" msgstr "备用项" -#: src/components/ui/swap.tsx:213 +#: src/components/ui/swap.tsx:218 #: src/views/index-dtf/issuance/async-mint/steps/configure-mint.tsx:218 #: src/views/portfolio-page/components/available-rewards.tsx:122 #: src/views/portfolio-page/components/dtf-positions.tsx:134 #: src/views/portfolio-page/components/pending-withdrawals.tsx:338 #: src/views/portfolio-page/components/rsr-section.tsx:47 #: src/views/portfolio-page/components/staked-positions.tsx:85 -#: src/views/portfolio-page/components/vote-locked-positions.tsx:124 +#: src/views/portfolio-page/components/vote-locked-positions.tsx:223 #: src/views/yield-dtf/issuance/components/zapV2/input/ZapInputMaxButton.tsx:22 #: src/views/yield-dtf/issuance/components/zapV2/output/ZapOutputBalance.tsx:14 #: src/views/yield-dtf/staking/components/stake/stake-input.tsx:58 @@ -1704,12 +1709,12 @@ msgstr "篮子变更提案" msgid "Basket composition" msgstr "篮子构成" -#: src/views/index-dtf/overview/components/index-governance-overview.tsx:37 +#: src/views/index-dtf/overview/components/index-governance-overview.tsx:41 #: src/views/index-dtf/settings/components/index-settings-governance.tsx:170 msgid "Basket Governance" msgstr "篮子治理" -#: src/views/index-dtf/overview/components/index-governance-overview.tsx:195 +#: src/views/index-dtf/overview/components/index-governance-overview.tsx:210 msgid "Basket governance settings" msgstr "篮子治理设置" @@ -1798,7 +1803,7 @@ msgstr "继续之前,请确认以下内容。" msgid "Before using automated minting" msgstr "在使用自动 Mint 之前" -#: src/components/vote-lock/components/submit-unlock-button.tsx:145 +#: src/components/vote-lock/components/submit-unlock-button.tsx:132 msgid "Begin {unlockDelay}-day unlock delay" msgstr "开始 {unlockDelay} 天解锁延迟" @@ -1818,7 +1823,7 @@ msgstr "开始 Mint {0} {1}" msgid "Begin redemption of {0} {1}" msgstr "开始 Redeem {0} {1}" -#: src/components/vote-lock/components/submit-unlock-button.tsx:146 +#: src/components/vote-lock/components/submit-unlock-button.tsx:133 msgid "Begin unlock delay" msgstr "开始解锁延迟" @@ -1839,12 +1844,12 @@ msgid "Best Quote" msgstr "最优报价" #: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:41 -msgid "Better price found" -msgstr "发现更优价格" +#~ msgid "Better price found" +#~ msgstr "发现更优价格" #: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:59 -msgid "Better price on PancakeSwap" -msgstr "PancakeSwap 上价格更优" +#~ msgid "Better price on PancakeSwap" +#~ msgstr "PancakeSwap 上价格更优" #. placeholder {0}: formatCurrency( +formatUnits(currentPrice, data.buyingTokenDecimals) ) #. placeholder {1}: data.buyingTokenSymbol @@ -2000,8 +2005,8 @@ msgid "Buy / Sell" msgstr "买入 / 卖出" #: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:252 -msgid "Buy on PancakeSwap" -msgstr "在 PancakeSwap 上买入" +#~ msgid "Buy on PancakeSwap" +#~ msgstr "在 PancakeSwap 上买入" #: src/views/index-dtf/auctions/views/rebalance/components/rebalance-action.tsx:37 msgid "Buy/sell tokens to move closer to proposed weights." @@ -2039,7 +2044,7 @@ msgstr "由 {0} 提供" msgid "By enabling this option, the zapper will only attempt to mint RTokens instead of trading for them. This can help you avoid trading fees and slippage." msgstr "启用此选项后,zapper 将仅尝试 Mint RToken,而不会进行交易兑换。这有助于你避免交易费用和滑点。" -#: src/views/index-dtf/overview/components/index-disclousure.tsx:353 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:340 msgid "By using" msgstr "使用" @@ -2293,7 +2298,7 @@ msgstr "可领取的发放" msgid "Claimed" msgstr "已领取" -#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:224 +#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:298 msgid "Claiming" msgstr "领取中" @@ -2332,8 +2337,8 @@ msgid "Closes" msgstr "收盘" #: src/views/index-dtf/overview/components/index-disclousure.tsx:120 -msgid "CMC20 whitepaper documentation" -msgstr "CMC20 白皮书文档" +#~ msgid "CMC20 whitepaper documentation" +#~ msgstr "CMC20 白皮书文档" #: src/views/index-dtf/issuance/async-mint/steps/quote-summary.tsx:1644 #: src/views/index-dtf/issuance/async-mint/steps/quote-summary.tsx:1651 @@ -2587,8 +2592,8 @@ msgstr "确认交易中……" #: src/components/stake-drawer/components/submit-stake-button.tsx:217 #: src/components/stake-drawer/components/submit-unstake-button.tsx:104 -#: src/components/vote-lock/components/submit-lock-button.tsx:215 -#: src/components/vote-lock/components/submit-unlock-button.tsx:137 +#: src/components/vote-lock/components/submit-lock-button.tsx:211 +#: src/components/vote-lock/components/submit-unlock-button.tsx:124 #: src/views/index-dtf/deploy/steps/confirm-deploy/manual/components/confirm-manual-deploy-button.tsx:298 #: src/views/index-dtf/deploy/steps/confirm-deploy/simple/simple-deploy-button.tsx:133 #: src/views/index-dtf/overview/components/zap-mint/submit-zap.tsx:215 @@ -3025,8 +3030,8 @@ msgid "Current value in buffer:" msgstr "缓冲中的当前价值:" #: src/views/index-dtf/overview/components/index-disclousure.tsx:117 -msgid "Current Version (v1)" -msgstr "当前版本(v1)" +#~ msgid "Current Version (v1)" +#~ msgstr "当前版本(v1)" #: src/views/index-dtf/overview/components/index-disclousure.tsx:58 msgid "Current Version (v2)" @@ -3037,11 +3042,11 @@ msgstr "当前版本(v2)" msgid "Current votes" msgstr "当前投票" -#: src/views/index-dtf/overview/components/index-disclousure.tsx:270 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:257 msgid "Custodial Risks: Ondo Tokenized Stocks represent claims on SPVs and other structures that hold underlying equity positions through custodians. DTF exposure therefore depends on the operational integrity and solvency of third parties. Any failure, suspension, error, insolvency, fraud, cyber incident, or transfer restriction affecting these parties could result in delayed settlement, blocked transfers, impaired redemptions, forced liquidation, or partial or total loss of value for the DTF’s holdings." msgstr "托管风险:Ondo Tokenized Stocks 代表对通过托管人持有基础股票头寸的 SPV 及其他结构的求偿权。因此,DTF 的敞口取决于第三方的运营完整性和偿付能力。影响这些主体的任何故障、暂停、错误、破产、欺诈、网络事件或转账限制,都可能导致结算延迟、转账受阻、赎回受损、强制清算,或 DTF 持仓价值的部分或全部损失。" -#: src/components/ui/swap.tsx:500 +#: src/components/ui/swap.tsx:506 #: src/views/index-dtf/deploy/components/toggle-group-preset.tsx:31 #: src/views/yield-dtf/issuance/components/zapV2/settings/ZapSettingsCustomSlippage.tsx:24 msgid "Custom" @@ -3079,7 +3084,7 @@ msgstr "DAO 设置提案" msgid "Dark" msgstr "深色" -#: src/views/portfolio-page/components/transactions.tsx:86 +#: src/views/portfolio-page/components/transactions.tsx:90 msgid "Date" msgstr "日期" @@ -3305,7 +3310,7 @@ msgstr "已弃用" #: src/views/explorer/components/governance/index.tsx:76 #: src/views/index-dtf/governance/views/proposal/components/proposal-detail-content.tsx:15 #: src/views/index-dtf/governance/views/proposal/components/proposal-detail-content.tsx:41 -#: src/views/portfolio-page/components/transactions.tsx:109 +#: src/views/portfolio-page/components/transactions.tsx:113 #: src/views/yield-dtf/governance/views/proposal-detail/components/ProposalDetailContent.tsx:45 #: src/views/yield-dtf/governance/views/proposal/components/ConfirmProposalForm.tsx:70 #: src/views/yield-dtf/overview/components/hero/token-mandate.tsx:25 @@ -3338,7 +3343,7 @@ msgstr "已禁用" msgid "Discard" msgstr "放弃" -#: src/views/index-dtf/overview/components/index-disclousure.tsx:347 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:334 msgid "Disclosures" msgstr "披露" @@ -3374,7 +3379,7 @@ msgstr "忽略" msgid "Dismiss invitation" msgstr "忽略邀请" -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:218 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:146 msgid "Dismiss suggestion" msgstr "关闭建议" @@ -3576,7 +3581,7 @@ msgstr "DTF V4.0.0 升级提案已创建" msgid "DTF V5.0.0 upgrade proposal created" msgstr "DTF V5.0.0 升级提案已创建" -#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:92 +#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:99 msgid "DTFs governed by {voteLockSymbol}" msgstr "由 {voteLockSymbol} 治理的 DTF" @@ -4005,7 +4010,7 @@ msgstr "预计总影响" msgid "ETH address" msgstr "ETH 地址" -#: src/components/ui/swap.tsx:267 +#: src/components/ui/swap.tsx:272 msgid "Evaluating slippage" msgstr "正在评估滑点" @@ -4022,6 +4027,11 @@ msgstr "平均分配" msgid "Exceeds available balance" msgstr "超出可用余额" +#: src/components/vote-lock/components/vault-exchange-rate.tsx:28 +#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:248 +msgid "Exchange rate" +msgstr "兑换率" + #: src/views/yield-dtf/overview/components/charts/price-chart.tsx:133 msgid "Exchange Rate" msgstr "兑换率" @@ -4111,7 +4121,7 @@ msgstr "现有抵押品 · 可用 ${0}" #: src/views/index-dtf/issuance/async-mint/steps/quote-summary.tsx:817 msgid "Existing collateral applied" -msgstr "" +msgstr "已应用现有抵押品" #: src/components/rtoken-setup/components/BackButton.tsx:28 #: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:45 @@ -4122,7 +4132,7 @@ msgstr "退出 Deployer" msgid "Expanded J.1 to include energy usage data and the sources and methodologies used for its calculation." msgstr "扩充了 J.1,纳入了能源使用数据及其计算所采用的来源和方法。" -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:63 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:43 msgid "Expect a worse price" msgstr "预计价格较差" @@ -4177,7 +4187,7 @@ msgstr "查阅 Reserve Documentation 了解更多详情。" msgid "Explore yield opportunities for {0}" msgstr "探索 {0} 的收益机会" -#: src/views/portfolio-page/components/transactions.tsx:128 +#: src/views/portfolio-page/components/transactions.tsx:132 msgid "Explorer" msgstr "浏览器" @@ -4438,13 +4448,13 @@ msgstr "赞成" msgid "For approved governors to fast-track proposals." msgstr "供已批准的治理者快速处理提案。" -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:158 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:93 msgid "For larger amounts, split your order into multiple transactions." msgstr "如需更大金额,请将订单拆分为多笔交易。" #: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:115 -msgid "For larger orders, a DEX like PancakeSwap may get you a better price by routing your trade across multiple sources of liquidity." -msgstr "对于较大订单,PancakeSwap 这样的 DEX 可以通过多种流动性来源路由交易,帮你获得更好的价格。" +#~ msgid "For larger orders, a DEX like PancakeSwap may get you a better price by routing your trade across multiple sources of liquidity." +#~ msgstr "对于较大订单,PancakeSwap 这样的 DEX 可以通过多种流动性来源路由交易,帮你获得更好的价格。" #: src/views/index-dtf/components/compliance-alert.tsx:20 msgid "For more information, see our <0>Terms of Use." @@ -4558,13 +4568,13 @@ msgstr "前往 RToken Deployer" msgid "Gov Speed" msgstr "治理速度" -#: src/views/earn/views/index-dtf/components/vote-lock-positions.tsx:158 -#: src/views/earn/views/yield-dtf/components/staking-positions.tsx:45 +#: src/views/earn/views/index-dtf/components/vote-lock-positions.tsx:215 +#: src/views/earn/views/yield-dtf/components/staking-positions.tsx:88 msgid "Gov. Token" msgstr "治理代币" #. placeholder {0}: indexDTF.token.symbol -#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:312 +#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:392 msgid "Govern ${0}" msgstr "治理 ${0}" @@ -4584,7 +4594,7 @@ msgstr "参与治理、Stake 并发现收益机会" #: src/views/index-dtf/governance/views/propose/views/propose-dao-settings/components/dao-settings-proposal-sections.tsx:64 #: src/views/index-dtf/governance/views/propose/views/propose-dtf-settings/components/dtf-settings-proposal-sections.tsx:174 #: src/views/index-dtf/governance/views/propose/views/propose-dtf-settings/components/sections/propose-revenue-distribution.tsx:247 -#: src/views/index-dtf/overview/components/index-governance-overview.tsx:35 +#: src/views/index-dtf/overview/components/index-governance-overview.tsx:39 #: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:28 #: src/views/yield-dtf/governance/views/proposal/components/ProposalNavigation.tsx:18 #: src/views/yield-dtf/overview/components/backing/risks.tsx:83 @@ -4636,7 +4646,7 @@ msgstr "治理参数" msgid "Governance roles" msgstr "治理角色" -#: src/views/index-dtf/overview/components/index-governance-overview.tsx:193 +#: src/views/index-dtf/overview/components/index-governance-overview.tsx:208 msgid "Governance settings" msgstr "治理设置" @@ -4649,8 +4659,8 @@ msgstr "治理份额" msgid "Governance Stats" msgstr "治理统计" -#: src/views/index-dtf/settings/components/index-settings-governance-token.tsx:17 -#: src/views/portfolio-page/components/vote-locked-positions.tsx:47 +#: src/views/index-dtf/settings/components/index-settings-governance-token.tsx:16 +#: src/views/portfolio-page/components/vote-locked-positions.tsx:137 #: src/views/portfolio-page/components/voting-power.tsx:47 msgid "Governance Token" msgstr "治理代币" @@ -4659,7 +4669,7 @@ msgstr "治理代币" msgid "Governance with an execution delay greater than 1 week unstaking delay" msgstr "执行延迟大于 1 周 Unstake 延迟的治理" -#: src/views/earn/views/index-dtf/components/vote-lock-positions.tsx:120 +#: src/views/earn/views/index-dtf/components/vote-lock-positions.tsx:177 msgid "Governed DTFs" msgstr "治理中的 DTF" @@ -4675,10 +4685,10 @@ msgstr "Governor 地址" msgid "Governor mandate" msgstr "Governor 授权声明" -#: src/views/earn/views/index-dtf/components/vote-lock-positions.tsx:214 -#: src/views/earn/views/yield-dtf/components/staking-positions.tsx:101 +#: src/views/earn/views/index-dtf/components/vote-lock-positions.tsx:251 +#: src/views/earn/views/yield-dtf/components/staking-positions.tsx:141 #: src/views/portfolio-page/components/staked-positions.tsx:42 -#: src/views/portfolio-page/components/vote-locked-positions.tsx:102 +#: src/views/portfolio-page/components/vote-locked-positions.tsx:192 msgid "Governs" msgstr "治理" @@ -4757,7 +4767,7 @@ msgid "High liquidity" msgstr "高流动性" #: src/views/index-dtf/auctions/views/rebalance/components/rebalance-liquidity-checker.tsx:244 -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:48 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:30 #: src/views/index-dtf/governance/views/propose/basket/components/proposal-liquidity-checker.tsx:311 msgid "High price impact" msgstr "价格影响过高" @@ -5267,8 +5277,8 @@ msgid "Language" msgstr "语言" #: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:43 -msgid "Large Order" -msgstr "大额订单" +#~ msgid "Large Order" +#~ msgstr "大额订单" #. placeholder {0}: Math.ceil(amountUsd / ondo.capacityUsd) #: src/components/ondo-badge.tsx:156 @@ -5374,7 +5384,7 @@ msgstr "持有者可从 DTF 概览页面下载的文件链接,例如简报或 msgid "Liquidity" msgstr "流动性" -#: src/views/index-dtf/overview/components/index-disclousure.tsx:297 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:284 msgid "Liquidity Risk: Although on-chain trading is 24/7, primary minting/redeeming of Ondo Tokenized Stocks may be limited, permissioned, delayed, or available only during specific windows. In stressed markets, secondary market liquidity may deteriorate, spreads may widen, and token prices may deviate materially from the value of the referenced underlying equities. As a result, the DTF may experience tracking error versus its intended index composition and may be unable to dispose of or rebalance positions at or near observable net asset value." msgstr "流动性风险:尽管链上交易全天候进行,Ondo Tokenized Stocks 的一级 Mint/Redeem 可能受到限制、需要许可、出现延迟,或仅在特定时间窗口内可用。在市场承压时,二级市场流动性可能恶化,价差可能扩大,代币价格可能大幅偏离所参照基础股票的价值。因此,DTF 可能出现相对其目标指数构成的跟踪误差,并且可能无法以可观察净资产价值或接近该价值的价格处置或再平衡头寸。" @@ -5394,7 +5404,7 @@ msgstr "实时再平衡拍卖" msgid "Loading current allowed actions..." msgstr "正在加载当前允许的操作..." -#: src/components/ui/swap.tsx:269 +#: src/components/ui/swap.tsx:274 msgid "Loading DTF" msgstr "正在加载 DTF" @@ -5470,7 +5480,7 @@ msgid "Location restricted" msgstr "地区受限" #. placeholder {0}: dtf.stToken?.underlying.symbol ?? 'Unknown' -#: src/views/index-dtf/overview/components/index-governance-overview.tsx:74 +#: src/views/index-dtf/overview/components/index-governance-overview.tsx:86 msgid "Lock ${0} to Govern" msgstr "锁定 ${0} 以参与治理" @@ -5573,7 +5583,7 @@ msgstr "Mandate 为必填项" msgid "Mandate Update" msgstr "使命更新" -#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:351 +#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:421 msgid "Manual" msgstr "手动" @@ -5601,7 +5611,7 @@ msgstr "适用于 LLM 的 Markdown 文件" msgid "Market" msgstr "市场" -#: src/views/index-dtf/overview/components/index-disclousure.tsx:310 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:297 msgid "Market Access and Redemption Risk: Minting and redemption for Ondo Tokenized Stocks may be permissioned, capacity-limited, subject to eligibility/whitelisting, and available only during defined windows or business-hour cutoffs tied to traditional market operations. These frictions can prevent arbitrage, impair exits at or near NAV, and amplify secondary-market dislocations, thereby resulting in a partial or total loss of the DTFs' holdings." msgstr "市场准入与赎回风险:Ondo Tokenized Stocks 的 Mint 和 Redeem 可能需要许可、受容量限制、受资格/白名单约束,且仅在与传统市场运作挂钩的特定时间窗口或营业时间截止前可用。这些摩擦可能阻碍套利、影响以净资产价值(NAV)或接近该价值退出,并放大二级市场的错位,从而导致 DTF 持仓的部分或全部损失。" @@ -5631,7 +5641,7 @@ msgstr "市值:" msgid "Market closed" msgstr "市场休市" -#: src/components/ui/swap.tsx:223 +#: src/components/ui/swap.tsx:228 #: src/views/index-dtf/issuance/async-mint/steps/configure-mint.tsx:232 #: src/views/yield-dtf/issuance/components/zapV2/input/ZapInputMaxButton.tsx:39 #: src/views/yield-dtf/staking/components/stake/stake-input.tsx:67 @@ -5648,7 +5658,7 @@ msgstr "每个代币的最大拍卖规模" msgid "Max precision is 0.01%" msgstr "最大精度为 0.01%" -#: src/components/ui/swap.tsx:473 +#: src/components/ui/swap.tsx:479 #: src/views/index-dtf/issuance/async-mint/steps/quote-summary.tsx:1284 msgid "Max slippage" msgstr "最大滑点" @@ -5892,7 +5902,7 @@ msgstr "当前可 Mint 量" msgid "Minted" msgstr "已 Mint" -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:177 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:112 msgid "Minting {symbol} is currently unavailable and we couldn't find another route to buy it." msgstr "{symbol} 的 Mint 当前不可用,且我们未能找到其他买入路径。" @@ -5937,7 +5947,7 @@ msgid "Modified" msgstr "已修改" #: src/views/portfolio-page/components/staked-positions.tsx:139 -#: src/views/portfolio-page/components/vote-locked-positions.tsx:38 +#: src/views/portfolio-page/components/vote-locked-positions.tsx:128 msgid "Modify" msgstr "修改" @@ -6281,8 +6291,8 @@ msgid "No results." msgstr "无结果。" #: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:45 -msgid "No route found" -msgstr "未找到路径" +#~ msgid "No route found" +#~ msgstr "未找到路径" #: src/views/yield-dtf/staking/components/withdraw/cooldown-unstake.tsx:90 msgid "No RSR in cooldown" @@ -6376,7 +6386,7 @@ msgstr "不需要。只要你的 ERC2O 代币处于 vote-locked 状态,你即 msgid "Non-Basket Governance Settings" msgstr "非篮子治理设置" -#: src/views/earn/components/position-balance.tsx:65 +#: src/views/earn/components/position-balance.tsx:81 #: src/views/yield-dtf/governance/views/proposal-detail/components/ContractProposalDetails.tsx:103 #: src/views/yield-dtf/governance/views/proposal/components/SpellUpgrade3_4_0.tsx:66 #: src/views/yield-dtf/governance/views/proposal/components/SpellUpgrade4_2_0.tsx:67 @@ -6461,8 +6471,8 @@ msgid "Official documentation for the CFB LCAP token" msgstr "CFB LCAP 代币官方文档" #: src/views/index-dtf/overview/components/index-disclousure.tsx:113 -msgid "Official documentation for the CMC20 token" -msgstr "CMC20 代币官方文档" +#~ msgid "Official documentation for the CMC20 token" +#~ msgstr "CMC20 代币官方文档" #: src/views/index-dtf/governance/views/propose/basket/components/proposal-basket-setup/proposal-basket-table.tsx:54 msgid "Old units" @@ -6599,7 +6609,7 @@ msgstr "Optimistic 提案人" msgid "or drag and drop it here" msgstr "或拖放到此处" -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:61 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:41 msgid "Order too large" msgstr "订单过大" @@ -6622,6 +6632,10 @@ msgstr "Orders 将于 {0} 后过期" msgid "Original whitepaper documentation" msgstr "原始白皮书文档" +#: src/views/earn/views/index-dtf/components/vote-lock-positions.tsx:166 +msgid "other" +msgstr "其他" + #: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:24 msgid "Other" msgstr "其他" @@ -6632,13 +6646,11 @@ msgstr "其他" msgid "Other config" msgstr "其他配置" -#: src/views/earn/views/index-dtf/components/vote-lock-positions.tsx:106 -#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:78 +#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:85 msgid "other DTF" msgstr "其他 DTF" -#: src/views/earn/views/index-dtf/components/vote-lock-positions.tsx:108 -#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:80 +#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:87 msgid "other DTFs" msgstr "其他 DTF" @@ -6684,12 +6696,12 @@ msgid "Owners" msgstr "Owners" #: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:103 -msgid "PancakeSwap is currently offering a better price for this exact order. We recommend buying {symbol} there instead." -msgstr "PancakeSwap 目前为这笔相同的订单提供更优价格。我们建议改为在 PancakeSwap 买入 {symbol}。" +#~ msgid "PancakeSwap is currently offering a better price for this exact order. We recommend buying {symbol} there instead." +#~ msgstr "PancakeSwap 目前为这笔相同的订单提供更优价格。我们建议改为在 PancakeSwap 买入 {symbol}。" #: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:108 -msgid "PancakeSwap is currently offering a better price for this exact order. We recommend selling {symbol} there instead." -msgstr "PancakeSwap 目前为这笔相同的订单提供更优价格。我们建议改为在 PancakeSwap 卖出 {symbol}。" +#~ msgid "PancakeSwap is currently offering a better price for this exact order. We recommend selling {symbol} there instead." +#~ msgstr "PancakeSwap 目前为这笔相同的订单提供更优价格。我们建议改为在 PancakeSwap 卖出 {symbol}。" #: src/views/index-dtf/governance/components/proposal-preview/raw-call-preview.tsx:28 #: src/views/index-dtf/governance/components/proposal-preview/rebalance-preview/legacy-basket-proposal-preview.tsx:305 @@ -6708,7 +6720,7 @@ msgstr "赚取收益" msgid "Participate and earn" msgstr "参与并赚取收益" -#: src/views/portfolio-page/components/vote-locked-positions.tsx:176 +#: src/views/portfolio-page/components/vote-locked-positions.tsx:261 msgid "Participate in governance with any ERC-20 token and earn APY rewards. <0>Learn more." msgstr "使用任意 ERC-20 代币参与治理并赚取 APY 奖励。<0>了解更多。" @@ -6792,8 +6804,8 @@ msgstr "待处理的提取" #: src/components/stake-drawer/components/submit-unstake-button.tsx:105 #: src/components/transaction-modal/index.tsx:159 #: src/components/vote-lock/components/submit-delegate-button.tsx:179 -#: src/components/vote-lock/components/submit-lock-button.tsx:216 -#: src/components/vote-lock/components/submit-unlock-button.tsx:138 +#: src/components/vote-lock/components/submit-lock-button.tsx:212 +#: src/components/vote-lock/components/submit-unlock-button.tsx:125 #: src/views/index-dtf/deploy/steps/confirm-deploy/manual/components/confirm-manual-deploy-button.tsx:298 #: src/views/index-dtf/deploy/steps/confirm-deploy/simple/simple-deploy-button.tsx:134 #: src/views/index-dtf/overview/components/zap-mint/submit-zap.tsx:216 @@ -6953,7 +6965,7 @@ msgstr "请在我们的代码仓库中阅读更多关于 Register 如何管理 msgid "Please read more about the different roles in Alexios and the Reserve protocol in the documentation." msgstr "请在文档中阅读更多关于 Alexios 和 Reserve Protocol 中不同角色的信息。" -#: src/views/index-dtf/overview/components/index-disclousure.tsx:410 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:397 msgid "please see here." msgstr "请参阅此处。" @@ -7139,7 +7151,7 @@ msgstr "涨跌幅({0})" #: src/views/index-dtf/auctions/views/rebalance/updaters/rebalance-metrics-updater.tsx:184 msgid "Price data unavailable — cannot launch auction." -msgstr "" +msgstr "价格数据不可用 — 无法启动拍卖。" #: src/views/index-dtf/issuance/async-mint/steps/quote-summary.tsx:1259 msgid "Price impact" @@ -7163,23 +7175,23 @@ msgstr "价格设置" #: src/views/index-dtf/issuance/async-mint/steps/quote-summary.tsx:239 #: src/views/index-dtf/issuance/async-mint/steps/quote-summary.tsx:305 msgid "Price unavailable" -msgstr "" +msgstr "价格不可用" #: src/views/index-dtf/auctions/views/rebalance/components/launch-auctions-button.tsx:180 msgid "Price unavailable — cannot launch" -msgstr "" +msgstr "价格不可用 — 无法启动" #: src/views/index-dtf/auctions/views/rebalance/updaters/rebalance-metrics-updater.tsx:137 msgid "Price unavailable for \"{symbol}\" — cannot launch auction." -msgstr "" +msgstr "\"{symbol}\" 的价格不可用 — 无法启动拍卖。" #: src/views/index-dtf/auctions/views/rebalance/components/launch-auctions-button.tsx:178 msgid "Price unavailable for {unavailableSymbol} — cannot launch" -msgstr "" +msgstr "{unavailableSymbol} 的价格不可用 — 无法启动" #: src/views/index-dtf/auctions/views/rebalance/updaters/rebalance-metrics-updater.tsx:138 msgid "Price unavailable for a basket token — cannot launch auction." -msgstr "" +msgstr "篮子代币价格不可用 — 无法启动拍卖。" #: src/components/layout/navigation/TokenNavigation.tsx:215 #: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:20 @@ -7209,8 +7221,8 @@ msgstr "在 Wallet 中继续" #: src/components/stake-drawer/components/submit-stake-button.tsx:215 #: src/components/stake-drawer/components/submit-unstake-button.tsx:102 -#: src/components/vote-lock/components/submit-lock-button.tsx:213 -#: src/components/vote-lock/components/submit-unlock-button.tsx:135 +#: src/components/vote-lock/components/submit-lock-button.tsx:209 +#: src/components/vote-lock/components/submit-unlock-button.tsx:122 msgid "Processing transaction..." msgstr "正在处理交易..." @@ -7421,7 +7433,7 @@ msgid "Provider" msgstr "提供方" #. placeholder {0}: version.date -#: src/views/index-dtf/overview/components/index-disclousure.tsx:198 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:185 msgid "Published: {0}" msgstr "发布于:{0}" @@ -7695,7 +7707,7 @@ msgstr "已 Redeem" msgid "Redeeming {0} for {1}." msgstr "正在将 {0} Redeem 为 {1}。" -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:182 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:117 msgid "Redeeming {symbol} is currently unavailable and we couldn't find another route to sell it." msgstr "{symbol} 的 Redeem 当前不可用,且我们未能找到其他卖出路径。" @@ -7733,7 +7745,7 @@ msgstr "Redemption 限流比率 (%)" msgid "Reduce" msgstr "减少" -#: src/components/ui/swap.tsx:268 +#: src/components/ui/swap.tsx:273 msgid "Reducing potential dust" msgstr "正在减少潜在尘埃" @@ -7782,7 +7794,7 @@ msgstr "注册资产插件可让 RToken 为底层 ERC20 代币定价。如果底 msgid "Regular minting " msgstr "常规 Minting " -#: src/views/index-dtf/overview/components/index-disclousure.tsx:282 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:269 msgid "Regulatory and Compliance Risk: Tokenized equities and related on-chain transfer mechanisms may be subject to evolving regulatory interpretations and enforcement actions. Ondo Tokenized Stocks may also be subject to contractual eligibility requirements, permissioning, whitelisting, jurisdictional limitations, sanctions screening, or other compliance gating that can be changed or applied with little notice. If regulations or compliance requirements change, the DTF may be forced to restrict access, halt mints/redemptions, rebalance away from affected components, or wind down positions under adverse market conditions, potentially causing tracking error, reduced liquidity, and losses." msgstr "监管与合规风险:代币化股票及相关链上转移机制可能面临不断变化的监管解释和执法行动。Ondo Tokenized Stocks 还可能受到合约资格要求、许可、白名单、司法管辖区限制、制裁筛查或其他合规限制的约束,且这些限制可能在几乎没有通知的情况下被更改或实施。如果监管或合规要求发生变化,DTF 可能被迫限制访问、暂停 Mint/Redeem、调仓移出受影响的成分,或在不利的市场条件下平仓,这可能导致跟踪误差、流动性下降和损失。" @@ -8032,7 +8044,7 @@ msgstr "收入分配支撑缓冲" #: src/views/index-dtf/governance/components/proposal-preview/dtf-settings-preview.tsx:264 msgid "Revenue distribution unavailable" -msgstr "" +msgstr "收益分配不可用" #: src/views/index-dtf/governance/views/propose/views/propose-dtf-settings/components/changes/revenue-changes.tsx:445 msgid "Revenue Settings" @@ -8086,7 +8098,7 @@ msgid "Revert All" msgstr "全部还原" #. placeholder {0}: config.tokenName -#: src/views/index-dtf/overview/components/index-disclousure.tsx:146 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:133 msgid "Review {0} Whitepaper" msgstr "查看 {0} 白皮书" @@ -8164,7 +8176,7 @@ msgstr "奖励比率(小数)" msgid "Reward Token" msgstr "奖励代币" -#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:173 +#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:180 msgid "Reward tokens" msgstr "奖励代币" @@ -8180,7 +8192,7 @@ msgstr "可用奖励" msgid "Rewards claimed" msgstr "已领取奖励" -#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:217 +#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:291 msgid "Rewards in" msgstr "奖励币种" @@ -8426,7 +8438,7 @@ msgstr "搜索治理代币或 DTF" msgid "Search pool" msgstr "搜索 pool" -#: src/components/ui/swap.tsx:265 +#: src/components/ui/swap.tsx:270 msgid "Searching DEX Liquidity" msgstr "正在搜索 DEX 流动性" @@ -8473,7 +8485,7 @@ msgstr "已选图片" #: src/views/index-dtf/settings/components/index-settings-governance.tsx:73 msgid "Selector Registry" -msgstr "" +msgstr "选择器注册表" #: src/views/index-dtf/governance/views/propose/views/propose-dtf-settings/components/sections/propose-optimistic-parameters.tsx:51 msgid "Selector registry is not available for this optimistic governor." @@ -8510,8 +8522,8 @@ msgid "Sell collateral" msgstr "出售抵押品" #: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:254 -msgid "Sell on PancakeSwap" -msgstr "在 PancakeSwap 上卖出" +#~ msgid "Sell on PancakeSwap" +#~ msgstr "在 PancakeSwap 上卖出" #: src/views/index-dtf/auctions/views/rebalance/components/auction-bids-chart.tsx:334 #: src/views/index-dtf/auctions/views/rebalance/components/rebalance-liquidity-checker.tsx:278 @@ -8823,7 +8835,7 @@ msgstr "模拟失败 ✘" msgid "Slashing Risk" msgstr "Slashing 风险" -#: src/components/ui/swap.tsx:470 +#: src/components/ui/swap.tsx:476 msgid "Slippage" msgstr "滑点" @@ -9339,11 +9351,11 @@ msgstr "Telegram 链接" msgid "Telegram username" msgstr "Telegram 用户名" -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:65 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:45 msgid "Temporarily unavailable" msgstr "暂时不可用" -#: src/views/index-dtf/overview/components/index-disclousure.tsx:370 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:357 msgid "Terms and Conditions" msgstr "条款与条件" @@ -9416,7 +9428,7 @@ msgstr "守护者有权拒绝提案,即使提案已通过。应将其分配给 msgid "The impact your trade has on the market price." msgstr "你的交易对市场价格的影响。" -#: src/views/index-dtf/overview/components/index-disclousure.tsx:386 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:373 msgid "The information provided on the Website comes from on-chain sources. Past performance is not indicative of future results. Although index DTFs are intended to track indexes, their ability to successfully track indexes are dependent on the governance structure of the DTF and the governance’s ability to make appropriate trades. There is no guarantee that such trades will be successful or will track its corresponding index exactly. There are many risks associated with digital assets, including but not limited to security risk, counterparty risk, volatility risk, conflicts of interest, and many more. DTFs are no exception. By using the Website, you agree that your interaction with any DTFs is solely at your own risk and the Website and DTFs come as is, without any warranty or condition of any kind." msgstr "本网站提供的信息来自链上数据源。过往表现并不预示未来结果。尽管指数 DTF 旨在跟踪指数,但其能否成功跟踪取决于 DTF 的治理结构以及治理方进行适当交易的能力。无法保证此类交易会成功或精确跟踪相应指数。数字资产存在诸多风险,包括但不限于安全风险、交易对手风险、波动性风险、利益冲突等。DTF 也不例外。使用本网站即表示您同意,您与任何 DTF 的交互完全由您自行承担风险,且本网站和 DTF 均按“现状”提供,不附带任何形式的保证或条件。" @@ -9428,7 +9440,7 @@ msgstr "long freezer 有权将 RToken 系统冻结较长一段时间。LONG_FREE msgid "The mandate describes what goals its governors should try to achieve. By briefly explaining the RToken's purpose and what the RToken is intended to do, it provides common ground for the governors to decide upon priorities and how to weigh tradeoffs." msgstr "该宗旨描述了其治理者应努力实现的目标。通过简要说明 RToken 的用途及其预期功能,它为治理者确定优先事项以及如何权衡取舍提供了共同基础。" -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:79 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:57 msgid "The market reopens {nextOpenLabel}." msgstr "市场将于 {nextOpenLabel} 重新开市。" @@ -9637,7 +9649,7 @@ msgstr "主题" msgid "There are a <0>handful of risks associated with any given RToken's collateral assets, including assets' redeemability, the health of their reserves, price volatility, etc. Likewise, because many RTokens leverage assets from external protocols, RToken holders assume all of the risks of its underlying protocols (smart contract, governance, or otherwise)." msgstr "任何特定 RToken 的抵押品资产都存在<0>若干风险,包括资产的可 Redeem 性、其储备的健康状况、价格波动等。同样,由于许多 RTokens 使用来自外部协议的资产,RToken 持有者承担其底层协议的所有风险(智能合约、治理或其他风险)。" -#: src/views/index-dtf/overview/components/index-disclousure.tsx:263 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:250 msgid "There are potential risks associated with Ondo Tokenized Stocks, including but not limited to:" msgstr "Ondo Tokenized Stocks 存在潜在风险,包括但不限于:" @@ -9829,7 +9841,7 @@ msgstr "标题" msgid "Title Update" msgstr "标题更新" -#: src/views/index-dtf/overview/components/index-disclousure.tsx:404 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:391 msgid "To learn more about the risks associated with DTFs," msgstr "如需进一步了解与 DTF 相关的风险," @@ -9837,7 +9849,7 @@ msgstr "如需进一步了解与 DTF 相关的风险," msgid "To verify eligibility, please leave us your name and email, and we will reach out to you personally." msgstr "如需验证资格,请留下您的姓名和邮箱,我们将与您本人联系。" -#: src/components/ui/swap.tsx:489 +#: src/components/ui/swap.tsx:495 msgid "Toggle {option}" msgstr "切换 {option}" @@ -9854,7 +9866,7 @@ msgstr "切换主题" #: src/views/index-dtf/governance/views/propose/basket/components/proposal-basket-preview.tsx:160 #: src/views/index-dtf/governance/views/propose/basket/components/proposal-basket-setup/proposal-basket-table.tsx:49 #: src/views/portfolio-page/components/pending-withdrawals.tsx:307 -#: src/views/portfolio-page/components/transactions.tsx:95 +#: src/views/portfolio-page/components/transactions.tsx:99 #: src/views/tokens/components/UnlistedTokensTable.tsx:83 #: src/views/yield-dtf/overview/components/backing/collateral-exposure.tsx:245 msgid "Token" @@ -10076,7 +10088,7 @@ msgstr "将 {0} 交易为抵押品" msgid "Trade remaining {0} into collateral" msgstr "将剩余的 {0} 交易为抵押品" -#: src/views/index-dtf/components/zapper/large-mint-prompt.tsx:253 +#: src/views/index-dtf/components/zapper/large-mint-prompt.tsx:204 msgid "Trade suggestion" msgstr "交易建议" @@ -10153,7 +10165,7 @@ msgstr "交易将于 {0} 恢复。" msgid "Trading Timelock" msgstr "交易 Timelock" -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:50 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:32 msgid "Trading unavailable" msgstr "交易不可用" @@ -10168,8 +10180,8 @@ msgstr "交易 2" #: src/components/stake-drawer/components/submit-stake-button.tsx:180 #: src/components/stake-drawer/components/submit-unstake-button.tsx:80 -#: src/components/vote-lock/components/submit-lock-button.tsx:221 -#: src/components/vote-lock/components/submit-unlock-button.tsx:143 +#: src/components/vote-lock/components/submit-lock-button.tsx:217 +#: src/components/vote-lock/components/submit-unlock-button.tsx:130 #: src/hooks/useWatchTransaction.ts:56 msgid "Transaction confirmed" msgstr "交易已确认" @@ -10233,7 +10245,7 @@ msgstr "交易成功!" #: src/views/explorer/index.tsx:33 #: src/views/index-dtf/overview/components/index-transaction-table-with-swaps/index.tsx:39 #: src/views/index-dtf/overview/components/index-transaction-table.tsx:152 -#: src/views/portfolio-page/components/transactions.tsx:162 +#: src/views/portfolio-page/components/transactions.tsx:166 #: src/views/yield-dtf/overview/components/rtoken-transactions.tsx:222 msgid "Transactions" msgstr "交易" @@ -10286,17 +10298,17 @@ msgstr "尝试调整筛选条件或稍后再查看" msgid "Try again" msgstr "重试" -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:82 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:60 msgid "Try again during {nextSessionLabel} hours in the US." msgstr "请在美国 {nextSessionLabel} 时段重试。" -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:84 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:62 msgid "Try again later when trading resumes." msgstr "请稍后在交易恢复后重试。" #: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:67 -msgid "Try PancakeSwap" -msgstr "试试 PancakeSwap" +#~ msgid "Try PancakeSwap" +#~ msgstr "试试 PancakeSwap" #: src/views/yield-dtf/issuance/components/zapV2/ZapToggle.tsx:23 msgid "Turn on Zaps to mint using 1 asset" @@ -10359,7 +10371,7 @@ msgstr "交易数" #: src/views/index-dtf/overview/components/index-transaction-table-with-swaps/columns.tsx:41 #: src/views/index-dtf/overview/components/index-transaction-table.tsx:40 #: src/views/index-dtf/overview/components/yield-index/yield-index-composition-tabs.tsx:14 -#: src/views/portfolio-page/components/transactions.tsx:101 +#: src/views/portfolio-page/components/transactions.tsx:105 #: src/views/yield-dtf/overview/components/rtoken-transactions.tsx:98 msgid "Type" msgstr "类型" @@ -10379,7 +10391,7 @@ msgid "Unavailable" msgstr "不可用" #: src/views/explorer/components/collaterals/index.tsx:100 -#: src/views/portfolio-page/components/vote-locked-positions.tsx:66 +#: src/views/portfolio-page/components/vote-locked-positions.tsx:156 msgid "Underlying" msgstr "底层资产" @@ -10387,7 +10399,7 @@ msgstr "底层资产" msgid "Underlying Platform Exposure" msgstr "底层平台敞口" -#: src/views/index-dtf/settings/components/index-settings-governance-token.tsx:26 +#: src/views/index-dtf/settings/components/index-settings-governance-token.tsx:32 msgid "Underlying Token" msgstr "底层代币" @@ -10457,7 +10469,7 @@ msgstr "无限制" msgid "Unlock" msgstr "解锁" -#: src/components/vote-lock/components/submit-unlock-button.tsx:108 +#: src/components/vote-lock/components/submit-unlock-button.tsx:95 msgid "Unlock initiated successfully" msgstr "解锁已成功发起" @@ -10674,7 +10686,7 @@ msgstr "升级至" msgid "Uploading files..." msgstr "正在上传文件……" -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:232 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:160 msgid "US stock market hours are <0>9:30 AM to <1>4:00 PM Eastern Time. Current time is: <2>{currentTimeLabel} ET. Please try again in <3>{reopenInLabel}." msgstr "美国股市交易时间为美国东部时间 <0>9:30 AM 至 <1>4:00 PM。当前时间:<2>{currentTimeLabel} ET。请在 <3>{reopenInLabel} 后重试。" @@ -10747,7 +10759,7 @@ msgstr "正在验证交易" msgid "Validating..." msgstr "验证中..." -#: src/views/index-dtf/overview/components/index-disclousure.tsx:321 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:308 msgid "Valuation & NAV Calculation Risk – The DTF’s NAV depends on accurate, timely marks for tokenized equities and any associated components. Pricing inputs may be derived from thinly traded on-chain markets, off-chain reference feeds, or oracle mechanisms that can be stale, interrupted, manipulated, or subject to methodology changes. Market-hour mismatches, delayed corporate action processing, and settlement lags can further distort marks. Misvaluation may cause incorrect mint/redeem pricing, unfair dilution among holders, and adverse or mistimed rebalances." msgstr "估值与 NAV 计算风险——DTF 的 NAV 依赖于对代币化股票及相关组成部分的准确、及时定价。定价输入可能来自交易稀少的链上市场、链下参考数据源或预言机机制,这些来源可能过时、中断、被操纵或发生方法论变更。市场时间错配、公司行动处理延迟和结算滞后可能进一步扭曲估值。错误估值可能导致 Mint/Redeem 定价不准确、持有人之间的不公平稀释,以及不利或时机不当的再平衡。" @@ -10756,7 +10768,7 @@ msgstr "估值与 NAV 计算风险——DTF 的 NAV 依赖于对代币化股票 #: src/views/portfolio-page/components/pending-withdrawals.tsx:351 #: src/views/portfolio-page/components/rsr-section.tsx:60 #: src/views/portfolio-page/components/staked-positions.tsx:102 -#: src/views/portfolio-page/components/vote-locked-positions.tsx:137 +#: src/views/portfolio-page/components/vote-locked-positions.tsx:229 #: src/views/yield-dtf/overview/components/backing/collateral-exposure.tsx:251 msgid "Value" msgstr "价值" @@ -10900,7 +10912,7 @@ msgstr "查看完整篮子" msgid "View execute tx" msgstr "查看执行交易" -#: src/views/index-dtf/overview/components/index-governance-overview.tsx:103 +#: src/views/index-dtf/overview/components/index-governance-overview.tsx:118 msgid "View governance settings" msgstr "查看治理设置" @@ -10921,7 +10933,7 @@ msgstr "查看列表" msgid "View Merkl Campaign" msgstr "查看 Merkl 活动" -#: src/views/index-dtf/overview/components/index-governance-overview.tsx:105 +#: src/views/index-dtf/overview/components/index-governance-overview.tsx:120 msgid "View non-basket governance settings" msgstr "查看非篮子治理设置" @@ -10961,7 +10973,7 @@ msgstr "在 Tenderly 上查看" msgid "View orders" msgstr "查看 Orders" -#: src/views/index-dtf/overview/components/index-disclousure.tsx:193 +#: src/views/index-dtf/overview/components/index-disclousure.tsx:180 msgid "View PDF →" msgstr "查看 PDF →" @@ -10982,7 +10994,7 @@ msgstr "查看你已 vote-lock 的不同 DTF 的提案。" msgid "View quotes" msgstr "查看报价" -#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:147 +#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:154 msgid "View reward tokens" msgstr "查看奖励代币" @@ -11018,7 +11030,7 @@ msgid "Vote" msgstr "投票" #. placeholder {0}: stToken.underlying.symbol -#: src/components/vote-lock/components/submit-lock-button.tsx:223 +#: src/components/vote-lock/components/submit-lock-button.tsx:219 msgid "Vote lock {0}" msgstr "投票锁定 {0}" @@ -11034,7 +11046,7 @@ msgstr "新 DAO 不允许使用投票锁定地址" msgid "Vote Lock Frequently Asked Questions" msgstr "投票锁定常见问题" -#: src/components/vote-lock/components/submit-lock-button.tsx:177 +#: src/components/vote-lock/components/submit-lock-button.tsx:173 msgid "Vote lock successful" msgstr "投票锁定成功" @@ -11085,21 +11097,20 @@ msgstr "投票权重" msgid "Vote-lock" msgstr "Vote-lock" -#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:343 +#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:409 msgid "Vote-lock {underlyingSymbol} in {voteLockSymbol} to govern and earn from this DTF's TVL fee." msgstr "将 {underlyingSymbol} Vote-lock 为 {voteLockSymbol},参与治理并赚取此 DTF 的 TVL 费用收益。" -#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:324 -#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:338 +#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:404 msgid "Vote-lock {underlyingSymbol} in {voteLockSymbol} to govern and earn from TVL fees across all {voteLockGovernedLabel} DTFs." msgstr "将 {underlyingSymbol} Vote-lock 为 {voteLockSymbol},参与治理并赚取全部 {voteLockGovernedLabel} 个 DTF 的 TVL 费用收益。" #. placeholder {0}: indexDTF.stToken.underlying.symbol -#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:368 +#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:455 msgid "Vote-lock ${0}" msgstr "投票锁定 ${0}" -#: src/views/index-dtf/settings/components/index-settings-governance-token.tsx:19 +#: src/views/index-dtf/settings/components/index-settings-governance-token.tsx:18 msgid "Vote-Lock DAO Token" msgstr "投票锁定 DAO 代币" @@ -11112,7 +11123,7 @@ msgstr "在 Index DTF 上进行投票锁定" msgid "Vote-locked" msgstr "Vote-locked" -#: src/views/portfolio-page/components/vote-locked-positions.tsx:174 +#: src/views/portfolio-page/components/vote-locked-positions.tsx:259 msgid "Vote-locked positions" msgstr "Vote-locked 仓位" @@ -11353,7 +11364,7 @@ msgstr "想为治理发行新的 ERC20 吗?" msgid "Warmup period (s)" msgstr "预热期 (s)" -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:52 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:34 #: src/views/yield-dtf/issuance/components/warnings/index.tsx:54 #: src/views/yield-dtf/issuance/components/warnings/index.tsx:87 msgid "Warning" @@ -11389,12 +11400,12 @@ msgid "We call these tokenized portfolios DTFs:" msgstr "我们将这些代币化的投资组合称为 DTFs:" #: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:122 -msgid "We couldn't find a good price for this trade right now. We recommend using a DEX like PancakeSwap to buy {symbol}." -msgstr "我们目前无法为这笔交易找到合适的价格。建议使用 PancakeSwap 这样的 DEX 购买 {symbol}。" +#~ msgid "We couldn't find a good price for this trade right now. We recommend using a DEX like PancakeSwap to buy {symbol}." +#~ msgstr "我们目前无法为这笔交易找到合适的价格。建议使用 PancakeSwap 这样的 DEX 购买 {symbol}。" #: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:127 -msgid "We couldn't find a good price for this trade right now. We recommend using a DEX like PancakeSwap to sell {symbol}." -msgstr "我们目前无法为这笔交易找到合适的价格。建议使用 PancakeSwap 这样的 DEX 出售 {symbol}。" +#~ msgid "We couldn't find a good price for this trade right now. We recommend using a DEX like PancakeSwap to sell {symbol}." +#~ msgstr "我们目前无法为这笔交易找到合适的价格。建议使用 PancakeSwap 这样的 DEX 出售 {symbol}。" #: src/views/index-dtf/governance/components/proposal-preview/unknown-contract-preview.tsx:52 msgid "We couldn’t retrieve the contract’s ABI from Etherscan. This usually means the contract is not verified. Without its interface, we’re unable to decode any function calls or parameters." @@ -11656,7 +11667,7 @@ msgstr "Yield DTF(在 Reserve Yield Protocol 上创建)内置超额抵押机 msgid "Yield:" msgstr "收益:" -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:148 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:83 msgid "You can buy up to {maxAmountLabel} per transaction during {sessionLabel} hours in the US." msgstr "在美国{sessionLabel}时段内,每笔交易最多可买入 {maxAmountLabel}。" @@ -11672,7 +11683,7 @@ msgstr "你可以让 RToken 保持暂停状态,稍后再回来设置治理。" msgid "You can proceed directly." msgstr "你可以直接继续。" -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:153 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:88 msgid "You can sell up to {maxAmountLabel} per transaction during {sessionLabel} hours in the US." msgstr "在美国{sessionLabel}时段内,每笔交易最多可卖出 {maxAmountLabel}。" @@ -11693,7 +11704,7 @@ msgstr "你的资金不足以完成本次交易。请使用更小的金额重试 msgid "You fund" msgstr "你出资" -#: src/components/vote-lock/components/vote-lock.tsx:30 +#: src/components/vote-lock/components/vote-lock.tsx:50 msgid "You lock:" msgstr "你锁定:" @@ -11731,7 +11742,7 @@ msgstr "你提供" msgid "You receive" msgstr "你收到" -#: src/components/ui/swap.tsx:363 +#: src/components/ui/swap.tsx:368 #: src/views/yield-dtf/issuance/components/zapV2/output/ZapOutputContainer.tsx:15 #: src/views/yield-dtf/issuance/components/zapV2/submit/ZapSubmitModal.tsx:41 #: src/views/yield-dtf/staking/components/stake/stake-output.tsx:36 @@ -11753,7 +11764,7 @@ msgstr "你 Stake:" msgid "You submit the transaction configuring your RToken design" msgstr "你提交配置 RToken 设计的交易" -#: src/components/vote-lock/components/vote-unlock.tsx:30 +#: src/components/vote-lock/components/vote-unlock.tsx:58 msgid "You unlock:" msgstr "你解锁:" @@ -11762,7 +11773,7 @@ msgstr "你解锁:" msgid "You unstake:" msgstr "你 Unstake:" -#: src/components/ui/swap.tsx:238 +#: src/components/ui/swap.tsx:243 #: src/views/yield-dtf/issuance/components/zapV2/input/ZapInputContainer.tsx:21 #: src/views/yield-dtf/issuance/components/zapV2/submit/ZapSubmitModal.tsx:29 #: src/views/yield-dtf/staking/components/stake/stake-modal.tsx:35 @@ -11791,7 +11802,7 @@ msgstr "你将收到" msgid "You'll receive:" msgstr "您将收到:" -#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:168 +#: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:103 msgid "You're getting a worse price than usual because {symbol}'s underlying stocks aren't trading right now." msgstr "由于 {symbol} 的基础股票当前未在交易,您获得的价格比平时更差。" @@ -11812,17 +11823,17 @@ msgstr "你的 Decentralized Token Fund 投资。" msgid "Your DTF has been minted." msgstr "你的 DTF 已被 Mint。" -#: src/views/earn/views/index-dtf/components/vote-lock-positions.tsx:197 +#: src/views/earn/views/index-dtf/components/vote-lock-positions.tsx:242 msgid "Your lock" msgstr "您的 Vote-lock" #: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:134 -msgid "Your order has unusually high price impact. We recommend buying {symbol} on PancakeSwap to get the best price possible." -msgstr "你的订单价格影响异常高。建议在 PancakeSwap 上购买 {symbol},以尽可能获得最佳价格。" +#~ msgid "Your order has unusually high price impact. We recommend buying {symbol} on PancakeSwap to get the best price possible." +#~ msgstr "你的订单价格影响异常高。建议在 PancakeSwap 上购买 {symbol},以尽可能获得最佳价格。" #: src/views/index-dtf/components/zapper/large-mint-prompt-body.tsx:139 -msgid "Your order has unusually high price impact. We recommend selling {symbol} on PancakeSwap to get the best price possible." -msgstr "你的订单价格影响异常高。建议在 PancakeSwap 上出售 {symbol},以尽可能获得最佳价格。" +#~ msgid "Your order has unusually high price impact. We recommend selling {symbol} on PancakeSwap to get the best price possible." +#~ msgstr "你的订单价格影响异常高。建议在 PancakeSwap 上出售 {symbol},以尽可能获得最佳价格。" #: src/views/portfolio-page/index.tsx:41 msgid "Your portfolio brings together DTF holdings, staked and vote-locked governance positions, rewards, pending withdrawals, voting power, RSR balances, and recent transactions." @@ -11832,11 +11843,15 @@ msgstr "您的投资组合汇总了 DTF 持仓、Stake 和 Vote-lock 的治理 msgid "Your privacy is protected. This confirmation is only ever associated with your wallet address - never your personal information. <0>Privacy Policy" msgstr "您的隐私受到保护。此确认仅与您的钱包地址相关联,绝不涉及您的个人信息。<0>隐私政策" -#: src/views/portfolio-page/components/transactions.tsx:163 +#: src/views/portfolio-page/components/transactions.tsx:167 msgid "Your recent on-chain activity." msgstr "你近期的链上活动。" -#: src/views/earn/views/yield-dtf/components/staking-positions.tsx:82 +#: src/views/index-dtf/governance/components/governance-vote-lock.tsx:263 +msgid "Your redeemable" +msgstr "您的可赎回金额" + +#: src/views/earn/views/yield-dtf/components/staking-positions.tsx:125 msgid "Your stake" msgstr "您的 Stake" diff --git a/src/utils/constants.ts b/src/utils/constants.ts index 5715a30eb..926f0a0e7 100644 --- a/src/utils/constants.ts +++ b/src/utils/constants.ts @@ -612,3 +612,29 @@ export const HIDDEN_DTF_SYMBOLS = new Set(['COMPUTE', 'ENERGY', 'QUANTUM']) export const isHiddenDtfSymbol = (symbol: string) => HIDDEN_DTF_SYMBOLS.has(symbol) + +// Vote-lock vaults whose rewards are converted to the underlying by a tokenJar +// and stream back into the vault (exchange rate > 1, no claimable reward +// tokens) — like stRSR, unlike legacy 1:1 StakingVaults. Long-term this can be +// replaced by an on-chain tokenJar() probe. +export const SELF_APPRECIATING_VOTE_LOCK_VAULTS: Record< + number, + readonly string[] +> = { + [ChainId.BSC]: ['0xe744c8157c346b2931807f42552c8cbc0bb6d34f'], +} + +export const isSelfAppreciatingVoteLock = ( + chainId: number, + address?: string +) => + !!address && + (SELF_APPRECIATING_VOTE_LOCK_VAULTS[chainId] ?? []).includes( + address.toLowerCase() + ) + +// /dtf/daos returns simple annualized yield (dailyYield × 365). Self- +// appreciating vaults auto-compound, so their honest APY is the daily- +// compounded figure. +export const toCompoundApy = (simpleApr: number) => + ((1 + simpleApr / 100 / 365) ** 365 - 1) * 100 diff --git a/src/views/earn/components/position-balance.tsx b/src/views/earn/components/position-balance.tsx index ac0ecd502..cbe298859 100644 --- a/src/views/earn/components/position-balance.tsx +++ b/src/views/earn/components/position-balance.tsx @@ -1,3 +1,4 @@ +import { AnimatedNumber } from '@/components/ui/animated-number' import { cn } from '@/lib/utils' import { walletAtom } from '@/state/atoms' import { formatCurrency } from '@/utils' @@ -14,12 +15,16 @@ const PositionBalance = ({ symbol, price, decimals, + conversionRate = 1, }: { address: Address chain: number price: number decimals: number symbol: string + // Assets-per-share rate for appreciating vaults: converts the raw share + // balance into the symbol's denomination. Defaults to 1 (legacy 1:1 vaults). + conversionRate?: number }) => { const account = useAtomValue(walletAtom) @@ -43,8 +48,9 @@ const PositionBalance = ({ }, [blockNumber, refetch, account]) const hasBalance = data && data?.value > 0n - const amount = formatUnits(data?.value ?? 0n, decimals) - const usdAmount = Number(amount) * price + const amount = + Number(formatUnits(data?.value ?? 0n, decimals)) * conversionRate + const usdAmount = amount * price return (
: } {hasBalance ? (
- ${formatCurrency(usdAmount, 2)} + + $ + formatCurrency(value, 2)} + /> + - {formatCurrency(Number(amount), 2)} {symbol} + formatCurrency(value, 2)} + />{' '} + {symbol}
) : ( diff --git a/src/views/earn/views/index-dtf/components/vote-lock-positions.tsx b/src/views/earn/views/index-dtf/components/vote-lock-positions.tsx index a088684e1..8c38830d7 100644 --- a/src/views/earn/views/index-dtf/components/vote-lock-positions.tsx +++ b/src/views/earn/views/index-dtf/components/vote-lock-positions.tsx @@ -1,3 +1,4 @@ +import { AnimatedNumber } from '@/components/ui/animated-number' import DecimalDisplay from '@/components/decimal-display' import { cn } from '@/lib/utils' import DataTable, { SorteableButton } from '@/components/ui/data-table' @@ -14,6 +15,7 @@ import { } from '@/components/vote-lock' import { walletAtom } from '@/state/atoms' import { formatCurrency, getFolioRoute } from '@/utils' +import { isSelfAppreciatingVoteLock, toCompoundApy } from '@/utils/constants' import { EarnGovernanceTokenCell, EarnGovernanceTokenSkeleton, @@ -30,6 +32,8 @@ import { earnWalletColumnClassName, } from '@/views/earn/components/earn-table-styles' import PositionBalance from '@/views/earn/components/position-balance' +import { useVoteLockExchangeRate } from '@/components/vote-lock/hooks/use-vote-lock-exchange-rate' +import { type SupportedChainId } from '@reserve-protocol/react-sdk' import { Trans, useLingui } from '@lingui/react/macro' import { createColumnHelper } from '@tanstack/react-table' import { useAtomValue } from 'jotai' @@ -42,6 +46,66 @@ import TableFilters from './table-filters' const columnHelper = createColumnHelper() +// /dtf/daos reports lockedAmount in SHARES and prices shares 1:1 with the +// underlying — wrong denomination and undervalued for self-appreciating vaults +// (vlRSR). Convert to assets with the vault rate; rate is exactly 1 for legacy +// vaults so their display is unchanged. +const usePositionExchangeRate = (position: VoteLockPosition) => + useVoteLockExchangeRate({ + stToken: position.token.address as Address, + chainId: position.chainId as SupportedChainId, + shareDecimals: position.token.decimals, + underlyingDecimals: position.underlying.token.decimals, + }) + +// TVL comes rate-corrected from /dtf/daos (reserve-api converts share supply +// to underlying via convertToAssets) — do NOT multiply by the rate here. +const TvlCell = ({ position }: { position: VoteLockPosition }) => ( +
+ + $ + formatCurrency(value, 0)} + /> + + + {' '} + {position.underlying.token.symbol} + +
+) + +const YourLockCell = ({ position }: { position: VoteLockPosition }) => { + const { rate, isError } = usePositionExchangeRate(position) + + // Skeleton only while the rate is genuinely loading — on RPC error fall + // back to 1:1 (legacy behavior) instead of a permanent skeleton. + if (rate === undefined && !isError) { + return ( +
+ + +
+ ) + } + + return ( + + ) +} + const GovernedDtfsCell = ({ dtfs, chainId, @@ -80,17 +144,15 @@ const GovernedDtfsCell = ({ } return ( -
+
${largestDtf.symbol} {otherDtfs.length > 0 && ( - <> - + +
+ +
- +
)}
) @@ -177,19 +234,7 @@ const useColumns = () => { meta: { className: earnTvlColumnClassName, }, - cell: (data) => ( -
- ${formatCurrency(data.row.original.lockedAmountUsd, 0)} - - {' '} - {data.row.original.underlying.token.symbol} - -
- ), + cell: (data) => , }), ...(wallet ? [ @@ -198,15 +243,7 @@ const useColumns = () => { meta: { className: earnWalletColumnClassName, }, - cell: (data) => ( - - ), + cell: (data) => , }), ] : []), @@ -232,7 +269,23 @@ const useColumns = () => { className: earnMetricColumnClassName, }, cell: (data) => { - return + // Self-appreciating vaults compound into the exchange rate → show + // the daily-compounded APY instead of the API's simple APR. + const selfAppreciating = isSelfAppreciatingVoteLock( + data.row.original.chainId, + data.row.original.token.address + ) + + return ( + + ) }, }), ] diff --git a/src/views/earn/views/yield-dtf/components/staking-positions.tsx b/src/views/earn/views/yield-dtf/components/staking-positions.tsx index 5f7fcfa61..f700b48a6 100644 --- a/src/views/earn/views/yield-dtf/components/staking-positions.tsx +++ b/src/views/earn/views/yield-dtf/components/staking-positions.tsx @@ -24,16 +24,59 @@ import { earnWalletColumnClassName, } from '@/views/earn/components/earn-table-styles' import PositionBalance from '@/views/earn/components/position-balance' +import StRSR from '@/abis/StRSR' import { Trans, useLingui } from '@lingui/react/macro' import { createColumnHelper } from '@tanstack/react-table' import { useAtomValue } from 'jotai' import { useMemo, useState } from 'react' -import { Address } from 'viem' +import { Address, formatEther } from 'viem' +import { useReadContract } from 'wagmi' import { filteredYieldDTFListAtom } from '../atoms' import TableFilters from './table-filters' const columnHelper = createColumnHelper() +// Same math as reserve-api portfolioService: rsrEquivalent = shares × +// exchangeRate, value = rsrEquivalent × rsrPrice. The raw stRSR balance × +// rsrPrice understates by the exchange rate (~1.25 on eUSD). +const YourStakeCell = ({ + dtf, + rsrPrice, +}: { + dtf: ListedToken + rsrPrice: number +}) => { + const { data: rateRaw, isError } = useReadContract({ + abi: StRSR, + address: dtf.stToken.address as Address, + functionName: 'exchangeRate', + chainId: dtf.chain, + query: { staleTime: 30_000, refetchInterval: 30_000 }, + }) + + // No 1:1 first paint: wait for the rate so the first number is the real one. + // On RPC error fall back to 1:1 instead of a permanent skeleton. + if (rateRaw === undefined && !isError) { + return ( +
+ + +
+ ) + } + + return ( + + ) +} + const useColumns = () => { const { t } = useLingui() const rsrPrice = useAtomValue(rsrPriceAtom) @@ -84,12 +127,9 @@ const useColumns = () => { className: earnWalletColumnClassName, }, cell: (data) => ( - ), }), diff --git a/src/views/index-dtf/governance/CLAUDE.md b/src/views/index-dtf/governance/CLAUDE.md index 3ed47e734..d990352e9 100644 --- a/src/views/index-dtf/governance/CLAUDE.md +++ b/src/views/index-dtf/governance/CLAUDE.md @@ -30,6 +30,7 @@ time. | Queue/execute CTAs | `e2e/tests/flows/governance-queue-execute.spec.ts` + `flows/failures-governance.spec.ts` | | Chain/version-gated behavior | `e2e/tests/flows/governance-multichain.spec.ts` (bsc v5 + mainnet v4) + `flows/governance-writes-v4.spec.ts` (v4 castVote/queue/execute calldata) | | Delegation UI | `e2e/tests/smoke/governance.spec.ts` (delegates section) | +| Vote-lock card (claiming label, exchange rate) or drawer (lock/unlock quotes, redeem tx) | `e2e/tests/flows/vote-lock-drawer.spec.ts` + `governance/photon-featured.spec.ts` (card renders on the self-appreciating fixture) | | Anything in hooks/updaters/atoms here | all of the above: `pnpm exec playwright test --project=full e2e/tests/flows/governance-*.spec.ts` + smoke | Quick loop: `pnpm exec playwright test e2e/tests/smoke/governance.spec.ts` @@ -98,6 +99,13 @@ mapper dereferences — serve proposals ONLY through it or the list breaks). governance branch. Renaming it requires updating `e2e/helpers/subgraph.ts`. - Vote weights come from RPC (`getVotes`), proposals/history from the subgraph. Don't "fix" a test by moving live state into the subgraph mock. +- Self-appreciating vote-lock vaults (catalog: `SELF_APPRECIATING_VOTE_LOCK_VAULTS` + in `src/utils/constants.ts`; bsc/photon's vlRSR is one): the card fires an + account-less `previewRedeem(1 share)` on page load. The central mock answers + identity-rate (1:1) defaults for vault `previewRedeem`/`convertToAssets`/ + `balanceOf`; specs asserting a real rate override per-address (see + `flows/vote-lock-drawer.spec.ts`). The unlock tx is `redeem(shares)` for ALL + vaults — assert decoded share args, not asset amounts. - ERC-6372 `clock()` is mocked (timestamp mode); governor deadline math breaks silently if a new read bypasses the frozen clock. - Threshold change-detection MUST go through the shared diff --git a/src/views/index-dtf/governance/components/governance-vote-lock.tsx b/src/views/index-dtf/governance/components/governance-vote-lock.tsx index 208fd7c3f..fec6bdf14 100644 --- a/src/views/index-dtf/governance/components/governance-vote-lock.tsx +++ b/src/views/index-dtf/governance/components/governance-vote-lock.tsx @@ -7,25 +7,32 @@ import { HoverCardTrigger, } from '@/components/ui/hover-card' import { Skeleton } from '@/components/ui/skeleton' +import { AnimatedNumber } from '@/components/ui/animated-number' import { CurrentDtfVoteLock } from '@/components/vote-lock' +import { useVoteLockExchangeRate } from '@/components/vote-lock/hooks/use-vote-lock-exchange-rate' import { isInactiveDTF } from '@/hooks/use-dtf-status' import useIndexDTFList from '@/hooks/useIndexDTFList' -import { chainIdAtom } from '@/state/atoms' +import { chainIdAtom, walletAtom } from '@/state/atoms' import { indexDTFAtom } from '@/state/dtf/atoms' -import { getFolioRoute } from '@/utils' -import { isHiddenDtfSymbol } from '@/utils/constants' +import { formatCurrency, getFolioRoute } from '@/utils' +import { + isHiddenDtfSymbol, + isSelfAppreciatingVoteLock, + toCompoundApy, +} from '@/utils/constants' import { Trans } from '@lingui/react/macro' +import { + useIndexDtfVoteLockState, + type SupportedChainId, +} from '@reserve-protocol/react-sdk' import { useAtomValue } from 'jotai' import { ChevronDown } from 'lucide-react' import { ReactNode, useMemo, useState } from 'react' +import { type Address } from 'viem' import { useVoteLockAPR } from '../../overview/hooks/use-staking-vault-apy' import useGovernedDtfs, { GovernedDtf } from '../hooks/use-governed-dtfs' import RSRBNBHelp from './rsr-bnb-help' -const AUTO_ACCRUING_REWARD_VAULTS = new Set([ - '0xe744c8157c346b2931807f42552c8cbc0bb6d34f', -]) - const Placeholder = () => (
@@ -202,6 +209,73 @@ const RewardTokensHoverCard = ({ ) } +// Rate is an account-less previewRedeem(1 share); redeemable is the connected +// account's maxWithdraw — both appreciation-aware, no fabricated "earned". +const SelfAppreciatingFacts = ({ + stToken, + underlyingSymbol, + voteLockSymbol, + chainId, + dtfAddress, +}: { + stToken: { id: Address; decimals: number; underlyingDecimals: number } + underlyingSymbol: string + voteLockSymbol: string + chainId: SupportedChainId + dtfAddress: Address +}) => { + const account = useAtomValue(walletAtom) + const { rate } = useVoteLockExchangeRate({ + stToken: stToken.id, + chainId, + shareDecimals: stToken.decimals, + underlyingDecimals: stToken.underlyingDecimals, + }) + const { data: voteLockState } = useIndexDtfVoteLockState( + account ? { address: dtfAddress, chainId, account } : undefined + ) + const redeemable = voteLockState?.maxWithdraw + + if (rate === undefined && !redeemable) return null + + return ( + <> +
+
+ {rate !== undefined && ( +
+
+ Exchange rate +
+
+ 1 {voteLockSymbol} ={' '} + formatCurrency(value, 4)} + />{' '} + {underlyingSymbol} +
+
+ )} + {!!redeemable && redeemable.raw > 0n && ( +
+
+ Your redeemable +
+
+ formatCurrency(value)} + />{' '} + {underlyingSymbol} +
+
+ )} +
+ + ) +} + const RewardFacts = ({ rewardsIn, claiming, @@ -276,10 +350,16 @@ const GovernanceVoteLock = () => { const voteLockGovernedLabel = `${voteLockSymbol}-governed` const underlyingSymbol = `$${indexDTF.stToken.underlying.symbol}` const rewardLabel = rewardSymbols.map((symbol) => `$${symbol}`).join(', ') - const rewardsAccrueAutomatically = AUTO_ACCRUING_REWARD_VAULTS.has( - indexDTF.stToken.id.toLowerCase() + const rewardsAccrueAutomatically = isSelfAppreciatingVoteLock( + indexDTF.chainId, + indexDTF.stToken.id ) - const aprLabel = apr && apr >= 0.01 ? `${apr.toFixed(2)}% APR` : '' + const aprLabel = + apr && apr >= 0.01 + ? rewardsAccrueAutomatically + ? `${toCompoundApy(apr).toFixed(2)}% APY` + : `${apr.toFixed(2)}% APR` + : '' const rewardsInLabel = rewardLabel || (rewardsAccrueAutomatically @@ -298,8 +378,8 @@ const GovernanceVoteLock = () => {
{!!aprLabel && ( @@ -318,44 +398,51 @@ const GovernanceVoteLock = () => { /> )} - {otherDtfCount > 0 && rewardsAccrueAutomatically ? ( -
-

+

+

+ {otherDtfCount > 0 ? ( Vote-lock {underlyingSymbol} in {voteLockSymbol} to govern and earn from TVL fees across all {voteLockGovernedLabel} DTFs. -

- Automatic} - /> -
- ) : ( -
-

- {otherDtfCount > 0 ? ( - - Vote-lock {underlyingSymbol} in {voteLockSymbol} to govern and - earn from TVL fees across all {voteLockGovernedLabel} DTFs. - + ) : ( + + Vote-lock {underlyingSymbol} in {voteLockSymbol} to govern and + earn from this DTF's TVL fee. + + )} +

+ Automatic ) : ( - - Vote-lock {underlyingSymbol} in {voteLockSymbol} to govern and - earn from this DTF's TVL fee. - - )} -

- Manual} + Manual + ) + } + /> + {rewardsAccrueAutomatically && ( + -
- )} + )} +
- ) diff --git a/src/views/index-dtf/settings/components/index-settings-governance-token.tsx b/src/views/index-dtf/settings/components/index-settings-governance-token.tsx index fc59758f4..27cb316ed 100644 --- a/src/views/index-dtf/settings/components/index-settings-governance-token.tsx +++ b/src/views/index-dtf/settings/components/index-settings-governance-token.tsx @@ -3,8 +3,7 @@ import { chainIdAtom } from '@/state/atoms' import { indexDTFAtom } from '@/state/dtf/atoms' import { useLingui } from '@lingui/react/macro' import { useAtomValue } from 'jotai' -import { Hash } from 'lucide-react' -import { IconWrapper, InfoCard, InfoCardItem } from './settings-info-card' +import { InfoCard, InfoCardItem } from './settings-info-card' const GovernanceTokenInfo = () => { const { t } = useLingui() @@ -17,7 +16,14 @@ const GovernanceTokenInfo = () => { } + icon={ + + } value={indexDTF?.stToken?.token.symbol} address={indexDTF?.stToken?.id} border={false} diff --git a/src/views/portfolio-page/components/transactions.tsx b/src/views/portfolio-page/components/transactions.tsx index 52c52200d..2b797db85 100644 --- a/src/views/portfolio-page/components/transactions.tsx +++ b/src/views/portfolio-page/components/transactions.tsx @@ -29,9 +29,13 @@ const TokenCell = ({ tx }: { tx: PortfolioTransaction }) => { if (!tx.token) return const underlying = tx.token.underlying - const logoSymbol = underlying?.symbol ?? tx.token.symbol - const logoAddress = (underlying?.address ?? tx.token.address) as Address const isIndexStToken = tx.protocol === 'index' && !!underlying + const logoSymbol = isIndexStToken + ? tx.token.symbol + : (underlying?.symbol ?? tx.token.symbol) + const logoAddress = (isIndexStToken + ? tx.token.address + : (underlying?.address ?? tx.token.address)) as Address const handleStTokenClick = (e: React.MouseEvent) => { e.stopPropagation() diff --git a/src/views/portfolio-page/components/vote-locked-positions.tsx b/src/views/portfolio-page/components/vote-locked-positions.tsx index 17a6402c2..4754132b0 100644 --- a/src/views/portfolio-page/components/vote-locked-positions.tsx +++ b/src/views/portfolio-page/components/vote-locked-positions.tsx @@ -1,19 +1,109 @@ +import { AnimatedNumber } from '@/components/ui/animated-number' import TokenLogo from '@/components/token-logo' import TokenLogoWithChain from '@/components/token-logo/TokenLogoWithChain' import { Button } from '@/components/ui/button' import DataTable from '@/components/ui/data-table' import { formatCurrency, formatToSignificantDigits, formatUSD } from '@/utils' +import { isSelfAppreciatingVoteLock, toCompoundApy } from '@/utils/constants' import { ExplorerDataType, getExplorerLink } from '@/utils/getExplorerLink' +import { + useIndexDtfVoteLockVaultState, + type SupportedChainId, +} from '@reserve-protocol/react-sdk' import { ColumnDef } from '@tanstack/react-table' import { Trans } from '@lingui/react/macro' import { useAtomValue, useSetAtom } from 'jotai' import { ExternalLink, Lock } from 'lucide-react' -import { openStakingSidebarAtom, portfolioVoteLocksAtom } from '../atoms' +import { Address } from 'viem' +import { + openStakingSidebarAtom, + portfolioAddressAtom, + portfolioVoteLocksAtom, +} from '../atoms' import { PortfolioVoteLock } from '../types' import { ExpandToggle, useExpandable } from './expand-toggle' import GovernsCell from './governs-cell' import SectionHeader from './section-header' +// Self-appreciating vaults (vlRSR): the API's `amount` is shares priced 1:1 +// with the underlying, which hides appreciation. Read the live redeemable +// (maxWithdraw) + rate via RPC for flagged rows only; fall back to API values +// while loading or on RPC failure so a row never blanks. +const useSelfAppreciatingVaultState = (voteLock: PortfolioVoteLock) => { + const account = useAtomValue(portfolioAddressAtom) + const flagged = isSelfAppreciatingVoteLock( + voteLock.chainId, + voteLock.stTokenAddress + ) + + return useIndexDtfVoteLockVaultState( + flagged && account + ? { + chainId: voteLock.chainId as SupportedChainId, + stToken: voteLock.stTokenAddress as Address, + account, + } + : undefined, + { refetchInterval: 30_000 } + ) +} + +const BalanceCell = ({ voteLock }: { voteLock: PortfolioVoteLock }) => { + const { data } = useSelfAppreciatingVaultState(voteLock) + const redeemable = data?.maxWithdraw + + // Trust a successful live read even when it's zero (fully redeemed) — the + // API lags up to 60s and would show a phantom position. Fall back to API + // values only while loading or on RPC error. + if (redeemable) { + return ( +
+

+ {' '} + {voteLock.underlying.symbol} +

+

+ 1 {voteLock.symbol} ={' '} + formatCurrency(value, 4)} + />{' '} + {voteLock.underlying.symbol} +

+
+ ) + } + + const val = Number(voteLock.amount) + return ( + + {!isNaN(val) ? formatToSignificantDigits(val) : '—'} + + ) +} + +const ValueCell = ({ voteLock }: { voteLock: PortfolioVoteLock }) => { + const { data } = useSelfAppreciatingVaultState(voteLock) + const liveValue = + data?.underlyingPrice !== undefined && data.maxWithdraw + ? data.underlyingPrice * Number(data.maxWithdraw.formatted) + : undefined + const val = liveValue ?? voteLock.value + + return ( + + {val != null && !isNaN(val) ? ( + + ) : ( + '—' + )} + + ) +} + const ModifyButton = ({ voteLock }: { voteLock: PortfolioVoteLock }) => { const openStakingSidebar = useSetAtom(openStakingSidebarAtom) @@ -48,8 +138,8 @@ const columns: ColumnDef[] = [ cell: ({ row }) => (
@@ -110,7 +200,16 @@ const columns: ColumnDef[] = [ accessorKey: 'apy', header: () => APY, cell: ({ row }) => { - const val = row.original.apy + const raw = row.original.apy + // Self-appreciating vaults auto-compound → daily-compounded APY. + const val = + raw != null && + isSelfAppreciatingVoteLock( + row.original.chainId, + row.original.stTokenAddress + ) + ? toCompoundApy(raw) + : raw return ( {val != null && !isNaN(val) ? `${formatCurrency(val)}%` : '—'} @@ -122,27 +221,13 @@ const columns: ColumnDef[] = [ id: 'balance', accessorKey: 'amount', header: () => Balance, - cell: ({ row }) => { - const val = Number(row.original.amount) - return ( - - {!isNaN(val) ? formatToSignificantDigits(val) : '—'} - - ) - }, + cell: ({ row }) => , }, { id: 'value', accessorKey: 'value', header: () => Value, - cell: ({ row }) => { - const val = row.original.value - return ( - - {val != null && !isNaN(val) ? formatUSD(val) : '—'} - - ) - }, + cell: ({ row }) => , }, { id: 'action', diff --git a/src/views/portfolio-page/components/voting-power.tsx b/src/views/portfolio-page/components/voting-power.tsx index f26d26c3f..47b9d786f 100644 --- a/src/views/portfolio-page/components/voting-power.tsx +++ b/src/views/portfolio-page/components/voting-power.tsx @@ -51,8 +51,8 @@ const columns: ColumnDef[] = [ return (