diff --git a/.claude/commands/review-file.md b/.claude/commands/review-file.md new file mode 100644 index 000000000..9919bcffb --- /dev/null +++ b/.claude/commands/review-file.md @@ -0,0 +1,40 @@ +--- +description: Review a specific file for code quality +model: sonnet +argument-hint: +--- + +# Code Review: $ARGUMENTS + +Review the specified file for code quality, patterns, and potential bugs. + +## Review Focus + +### TypeScript +- Check for type errors +- Verify imports are correct and used +- Look for `any` types that should be typed + +### React +- Hook dependency arrays +- Component size and composition +- Proper state management + +### Styling +- TailwindCSS class usage +- No inline styles +- Use of cn() for conditional classes +- No theme-ui or emotion remnants + +### Best Practices +- No console.log statements +- Proper error handling +- Loading states for async operations + +## Instructions + +1. Read the file at: $ARGUMENTS +2. Analyze against the review focus areas +3. Report any issues found with line numbers +4. Provide specific suggestions for fixes +5. If the file looks good, confirm it passes review diff --git a/.claude/commands/review-ui.md b/.claude/commands/review-ui.md new file mode 100644 index 000000000..23c4c43fc --- /dev/null +++ b/.claude/commands/review-ui.md @@ -0,0 +1,41 @@ +--- +description: Review UI components with visual validation via Chrome extension +model: sonnet +argument-hint: +--- + +# UI Review: $ARGUMENTS + +Review the UI component for visual correctness and code quality. + +## Code Review + +1. Read the component file at: $ARGUMENTS +2. Check for: + - Correct TailwindCSS classes + - Proper use of shadcn/ui components + - Responsive design (sm:, md:, lg: breakpoints) + - Accessibility (aria labels, semantic HTML) + - Animation classes match tailwind.config.ts + +## Visual Validation + +After code review, request a screenshot from the user: + +"Please provide a screenshot of this component in the browser. You can: +1. Use the Claude Code Chrome extension to capture the current tab +2. Or paste a screenshot directly + +I'll validate that the rendered UI matches the expected styling from the code." + +## When Screenshot is Provided + +Analyze the screenshot for: +1. Layout matches flex/grid classes in code +2. Colors match theme variables (primary, secondary, muted, etc.) +3. Spacing looks correct (padding, margins, gaps) +4. Text styling (font weights, sizes) +5. Interactive states if visible (hover, focus, disabled) +6. Any visual bugs or misalignments + +Report findings with specific code references and visual observations. diff --git a/.claude/commands/review.md b/.claude/commands/review.md new file mode 100644 index 000000000..f6bee16ed --- /dev/null +++ b/.claude/commands/review.md @@ -0,0 +1,61 @@ +--- +description: Review code changes for quality, patterns, and potential bugs +model: sonnet +--- + +# Code Review + +You are a code reviewer for a React/TypeScript project. Review the recent code changes with a focus on: + +## Review Checklist + +### 1. TypeScript & Imports +- Missing or incorrect imports +- Type errors or any usage +- Unused imports or variables + +### 2. React Patterns +- Proper hook dependencies in useEffect/useMemo/useCallback +- Missing keys in lists +- State updates that could cause infinite loops +- Component composition and size (prefer < 150 lines) + +### 3. Styling (TailwindCSS) +- Verify className usage follows Tailwind patterns +- Check for hardcoded values that should use theme variables +- Ensure cn() helper is used for conditional classes +- No inline styles or emotion/theme-ui remnants + +### 4. State Management (Jotai) +- Small, focused atoms +- Derived atoms for computed values +- No useEffect for atom synchronization + +### 5. Error Handling +- Loading states for async operations +- Error boundaries where needed +- Proper try/catch for async code + +## Instructions + +1. Get the list of modified files: +```bash +git diff --name-only HEAD~1 +``` + +2. Read each modified file and analyze against the checklist + +3. Report findings in this format: + +**File: `path/to/file.tsx`** +- [ ] Issue: Description of the problem + - Line X: `code snippet` + - Suggestion: How to fix it + +4. If no issues found, confirm the code looks good + +5. Pay special attention to: +- Missing dependencies in hooks +- Incorrect Tailwind classes +- Components that are too large +- Console.log statements left in code diff --git a/CLAUDE.md b/CLAUDE.md index f0637d2b5..5a162c80c 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -764,25 +764,46 @@ VITE_INFURA_KEY=your_key ```bash npm install # Install dependencies -npm run dev # Start dev server -npm run build # Build for production -npm run lint # Run linter -npm run format # Format code +npm run start # Start dev server (port 3000) +npm run build # Build for production +npm run typecheck # TypeScript validation +npm run test # Run tests (watch mode) +npm run test:run # Run tests (single run) ``` ### Testing -- **Current**: Manual testing on Base network -- **Planned**: Jest for unit tests, E2E with wallet integration -- **Note**: No current test coverage requirements +- **Framework**: Vitest with jsdom environment +- **Location**: `src/**/tests/**/*.test.{ts,tsx}` +- **Run**: `npm run test` (watch) or `npm run test:run` (single) +- **Current coverage**: Critical hooks (useQuery, useDebounce, useTimeRemaining) + +## Active Migration: theme-ui → Tailwind + +**IMPORTANT**: We are actively migrating from theme-ui to Tailwind/shadcn. See `docs/migration-plan.md` for full details. + +### Migration Rules + +1. **Update the migration doc** (`docs/migration-plan.md`) after any migration work +2. **Record learnings** - decisions, gotchas, patterns that worked +3. **Don't mix patterns** - new components use Tailwind only, no theme-ui +4. **Test before/after** - run `npm run typecheck && npm run test:run` after changes +5. **Bottom-up approach** - start with `components/old/*`, then shared, then views + +### Current Status + +- 284 files still import theme-ui +- `@emotion/react` removed (animations now in Tailwind) +- `swr` removed (replaced with React Query wrapper) +- Tailwind v3.4 (v4 upgrade planned before full migration) ## Known Issues & Tech Debt ### High Priority -1. **Testing Infrastructure**: No automated tests -2. **Bundle Size**: Large SPA bundle -3. **Legacy UI**: Yield DTFs use old theme-ui components +1. **theme-ui Migration**: 284 files need conversion to Tailwind +2. **Bundle Size**: Large SPA bundle (theme-ui removal will help) +3. **Tailwind v4**: Upgrade needed before migration completes ### Complex Areas Needing Attention diff --git a/docs/migration-plan.md b/docs/migration-plan.md new file mode 100644 index 000000000..0adc3ff0a --- /dev/null +++ b/docs/migration-plan.md @@ -0,0 +1,259 @@ +# Migration Plan: Technical Debt Payoff + +Branch: `feature/remove-themeui` + +This document tracks our incremental migration from legacy patterns to modern stack. Each phase builds on the previous, reducing friction for subsequent changes. + +--- + +## Current State (Jan 2025) + +### Stack Health + +| Area | Status | Details | +|------|--------|---------| +| TypeScript | ✅ Solid | Strict mode, clean typecheck | +| React Query | ✅ Migrated | SWR removed, wrapper with compatible interface | +| Vitest | ✅ Set up | 20 tests, ~1s run time | +| Tailwind | ⚠️ v3.4 | v4 available (breaking changes) | +| theme-ui | ❌ Legacy | 284 files still importing | +| shadcn/ui | ✅ Partial | New components use it, old don't | + +### Dependency Cleanup Done + +- [x] Removed `swr` (replaced with React Query) +- [x] Removed `@emotion/react` (replaced with Tailwind animations) +- [x] Removed `@types/jest` (using vitest/globals) +- [x] Removed duplicate `setupTests.ts` + +### Files by Area + +| Location | theme-ui imports | Priority | +|----------|-----------------|----------| +| `components/old/*` | 34 files | Low (replace entirely) | +| `components/*` (non-old) | 59 files | Medium | +| `views/yield-dtf/*` | 150+ files | High (active feature) | +| `views/home/*` | 6 files | Medium | +| `views/explorer/*` | 12 files | Medium | +| `views/discover/*` | 10 files | Low | + +--- + +## Phase 1: Testing Foundation (Current) + +**Goal**: Solid test coverage for core logic before UI changes. + +### Completed + +- [x] Vitest + jsdom configured +- [x] Test utilities with providers (`test-utils.tsx`) +- [x] `useQuery` hook tests (6 tests) +- [x] `useDebounce` hook tests (5 tests) +- [x] `useTimeRemaining` hook tests (9 tests) + +### Next: Critical Hook Tests + +Priority hooks to test (pure logic, high usage): + +``` +src/hooks/ +├── useTokensAllowance.ts # Approval logic +├── useHasAllowance.ts # Approval checks +├── useApproveAndExecute.ts # Transaction flow +├── useContractWrite.ts # Write transactions +├── useERC20Balance.ts # Balance fetching +└── useGasEstimate.ts # Gas calculations +``` + +### Test Strategy + +1. **Utility hooks** - Pure logic, easy to test +2. **Data hooks** - Mock blockchain calls, test transformations +3. **Transaction hooks** - Test state machine (pending → success/error) + +--- + +## Phase 2: Tailwind v4 Upgrade + +**Goal**: Upgrade Tailwind before migrating theme-ui (use latest features). + +### Breaking Changes in v4 + +1. **Config format** - `tailwind.config.ts` → `@tailwind` directives in CSS +2. **Color system** - `bg-red-500` → `bg-red-500` (same, but internals changed) +3. **Plugin API** - `tailwindcss-animate` needs v4-compatible version +4. **PostCSS** - New `@tailwindcss/postcss` plugin + +### Migration Steps + +1. [ ] Read [Tailwind v4 upgrade guide](https://tailwindcss.com/docs/upgrade-guide) +2. [ ] Check `tailwindcss-animate` v4 compatibility +3. [ ] Update `postcss.config.js` +4. [ ] Migrate `tailwind.config.ts` to CSS-based config +5. [ ] Run build, fix any breaking styles +6. [ ] Update shadcn components if needed + +### Rollback Plan + +Keep branch, test thoroughly before merging. v3 → v4 is a major change. + +--- + +## Phase 3: shadcn/ui Component Refresh + +**Goal**: Update shadcn components to latest, ensure Tailwind v4 compatibility. + +### Current shadcn Components + +``` +src/components/ui/ +├── accordion.tsx +├── alert.tsx +├── avatar.tsx +├── badge.tsx +├── button.tsx +├── card.tsx +├── checkbox.tsx +├── dialog.tsx +├── dropdown-menu.tsx +├── input.tsx +├── label.tsx +├── popover.tsx +├── scroll-area.tsx +├── select.tsx +├── separator.tsx +├── skeleton.tsx +├── slider.tsx +├── switch.tsx +├── table.tsx +├── tabs.tsx +├── textarea.tsx +├── toggle.tsx +├── toggle-group.tsx +└── tooltip.tsx +``` + +### Steps + +1. [ ] Check shadcn CLI version +2. [ ] Run `npx shadcn@latest diff` to see changes +3. [ ] Update components one by one +4. [ ] Test each component in isolation + +--- + +## Phase 4: theme-ui Migration Strategy + +**Goal**: Remove 284 theme-ui imports incrementally. + +### Approach: Bottom-Up + +1. **Start with `components/old/*`** (34 files) + - These are already marked as legacy + - Many are small, self-contained + - Replace with shadcn equivalents or delete + +2. **Migrate shared components** (59 files) + - Higher impact, more careful migration + - Create Tailwind versions alongside + - Swap imports gradually + +3. **Migrate views** (150+ files) + - Feature by feature + - Test each view after migration + +### Common Patterns to Replace + +| theme-ui | Tailwind/shadcn | +|----------|-----------------| +| `` | `
` | +| `` | `` or `

` | +| `` | `

` | +| `sx={{ ... }}` | `className="..."` | +| `variant="..."` | Custom component or utility classes | + +### Migration Script Idea + +```typescript +// Could create a codemod for simple Box → div conversions +// But manual review is safer for complex sx props +``` + +--- + +## Phase 5: Final Cleanup + +**Goal**: Remove theme-ui entirely. + +### Steps + +1. [ ] Delete `src/theme.ts` (661 lines) +2. [ ] Remove `theme-ui` from package.json +3. [ ] Remove ThemeProvider from app +4. [ ] Clean up any remaining `sx` props +5. [ ] Verify all styles work + +### Expected Bundle Reduction + +- `theme-ui`: ~50KB gzipped +- `@emotion/react`: ~11KB gzipped (already removed) +- Total savings: ~60KB+ gzipped + +--- + +## Testing Checklist (Per Phase) + +Before merging any phase: + +- [ ] `npm run typecheck` passes +- [ ] `npm run test:run` passes +- [ ] `npm run build` succeeds +- [ ] Manual smoke test on Base network +- [ ] Key flows work: + - [ ] Connect wallet + - [ ] View DTF details + - [ ] Mint/Redeem (if applicable) + - [ ] Governance voting (if applicable) + +--- + +## Decisions Log + +| Date | Decision | Rationale | +|------|----------|-----------| +| Jan 2025 | Use React Query wrapper with SWR interface | Minimize consumer changes during migration | +| Jan 2025 | Vitest over Jest | Faster, native ESM, Vite integration | +| Jan 2025 | jsdom over happy-dom | Better React Testing Library support | +| Jan 2025 | Replace @emotion with Tailwind animations | Eliminate dependency, Tailwind already in use | +| Jan 2025 | Bottom-up theme-ui migration | Start with isolated components, reduce risk | + +--- + +## Commands Reference + +```bash +# Development +npm run start # Dev server +npm run typecheck # Type validation +npm run typecheck:watch # Continuous type checking +npm run test # Watch mode tests +npm run test:run # Single run tests + +# Build & Deploy +npm run build # Full production build +npm run build:no-seo # Build without SEO pages +npm run analyze # Bundle analysis +``` + +--- + +## Notes + +- **Don't rush**: Each phase should be stable before moving to next +- **Test visually**: UI changes need manual verification +- **Keep commits atomic**: One logical change per commit +- **Document decisions**: Update this file as we learn + +--- + +*Last updated: January 2025* diff --git a/index.html b/index.html index 21ab4200f..f11fea38d 100644 --- a/index.html +++ b/index.html @@ -56,6 +56,10 @@ + + + + =20.0.0" } }, + "node_modules/@acemir/cssom": { + "version": "0.9.31", + "resolved": "https://registry.npmjs.org/@acemir/cssom/-/cssom-0.9.31.tgz", + "integrity": "sha512-ZnR3GSaH+/vJ0YlHau21FjfLYjMpYVIzTD8M8vIEQvIGxeOXyXdzCI140rrCY862p/C/BbzWsjc1dgnM9mkoTA==", + "dev": true, + "license": "MIT" + }, "node_modules/@adobe/css-tools": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.2.tgz", @@ -153,58 +150,100 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "license": "Apache-2.0", + "node_modules/@asamuzakjp/css-color": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-4.1.1.tgz", + "integrity": "sha512-B0Hv6G3gWGMn0xKJ0txEi/jM5iFpT3MfDxmhZFb4W047GvytCf1DHQ1D69W3zHI4yWe2aTZAA0JnbMZ7Xc8DuQ==", + "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, + "@csstools/css-calc": "^2.1.4", + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "lru-cache": "^11.2.4" + } + }, + "node_modules/@asamuzakjp/css-color/node_modules/lru-cache": { + "version": "11.2.4", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", + "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", + "dev": true, + "license": "BlueOak-1.0.0", "engines": { - "node": ">=6.0.0" + "node": "20 || >=22" + } + }, + "node_modules/@asamuzakjp/dom-selector": { + "version": "6.7.6", + "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-6.7.6.tgz", + "integrity": "sha512-hBaJER6A9MpdG3WgdlOolHmbOYvSk46y7IQN/1+iqiCuUu6iWdQrs9DGKF8ocqsEqWujWf/V7b7vaDgiUmIvUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/nwsapi": "^2.3.9", + "bidi-js": "^1.0.3", + "css-tree": "^3.1.0", + "is-potential-custom-element-name": "^1.0.1", + "lru-cache": "^11.2.4" } }, + "node_modules/@asamuzakjp/dom-selector/node_modules/lru-cache": { + "version": "11.2.4", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", + "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@asamuzakjp/nwsapi": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/@asamuzakjp/nwsapi/-/nwsapi-2.3.9.tgz", + "integrity": "sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==", + "dev": true, + "license": "MIT" + }, "node_modules/@babel/code-frame": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", - "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz", + "integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==", "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", + "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.26.8", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", - "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.6.tgz", + "integrity": "sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", - "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.10", - "@babel/helper-compilation-targets": "^7.26.5", - "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.10", - "@babel/parser": "^7.26.10", - "@babel/template": "^7.26.9", - "@babel/traverse": "^7.26.10", - "@babel/types": "^7.26.10", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.6.tgz", + "integrity": "sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/generator": "^7.28.6", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6", + "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -226,15 +265,15 @@ "license": "MIT" }, "node_modules/@babel/generator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.0.tgz", - "integrity": "sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.6.tgz", + "integrity": "sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.27.0", - "@babel/types": "^7.27.0", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" }, "engines": { @@ -255,13 +294,13 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.0.tgz", - "integrity": "sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.26.8", - "@babel/helper-validator-option": "^7.25.9", + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -327,6 +366,15 @@ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-member-expression-to-functions": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", @@ -342,27 +390,27 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", - "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", "license": "MIT", "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", - "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -385,9 +433,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", - "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", "dev": true, "license": "MIT", "engines": { @@ -445,27 +493,27 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", - "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -487,25 +535,25 @@ } }, "node_modules/@babel/helpers": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.0.tgz", - "integrity": "sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", + "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", "license": "MIT", "dependencies": { - "@babel/template": "^7.27.0", - "@babel/types": "^7.27.0" + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz", - "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.6.tgz", + "integrity": "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==", "license": "MIT", "dependencies": { - "@babel/types": "^7.27.0" + "@babel/types": "^7.28.6" }, "bin": { "parser": "bin/babel-parser.js" @@ -1384,13 +1432,13 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz", - "integrity": "sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1400,13 +1448,13 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz", - "integrity": "sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1803,56 +1851,57 @@ } }, "node_modules/@babel/template": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz", - "integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.26.2", - "@babel/parser": "^7.27.0", - "@babel/types": "^7.27.0" + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.0.tgz", - "integrity": "sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.6.tgz", + "integrity": "sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.27.0", - "@babel/parser": "^7.27.0", - "@babel/template": "^7.27.0", - "@babel/types": "^7.27.0", - "debug": "^4.3.1", - "globals": "^11.1.0" + "@babel/code-frame": "^7.28.6", + "@babel/generator": "^7.28.6", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.6", + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6", + "debug": "^4.3.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/types": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz", - "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz", + "integrity": "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==", "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@base-org/account": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@base-org/account/-/account-1.1.1.tgz", - "integrity": "sha512-IfVJPrDPhHfqXRDb89472hXkpvJuQQR7FDI9isLPHEqSYt/45whIoBxSPgZ0ssTt379VhQo4+87PWI1DoLSfAQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@base-org/account/-/account-2.4.0.tgz", + "integrity": "sha512-A4Umpi8B9/pqR78D1Yoze4xHyQaujioVRqqO3d6xuDFw9VRtjg6tK3bPlwE0aW+nVH/ntllCpPa2PbI8Rnjcug==", "license": "Apache-2.0", "dependencies": { + "@coinbase/cdp-sdk": "^1.0.0", "@noble/hashes": "1.4.0", "clsx": "1.2.1", "eventemitter3": "5.0.1", @@ -1926,30 +1975,28 @@ } }, "node_modules/@binance/w3w-core": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@binance/w3w-core/-/w3w-core-1.1.7.tgz", - "integrity": "sha512-Aipavg2sc8JyBsgvmdbpna0RmS1EVmaIIgZO3lQr+OV0Q2EKabAIZ5nZNQOEmhxAzOxcrCZAUaNu/tW17JfcGg==", + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/@binance/w3w-core/-/w3w-core-1.1.10.tgz", + "integrity": "sha512-kHOHXJWEjkV+5Uua7hZS28JkwKvRXwiziPl/0NsPEAf10AocEiB+jv2BnIswHRhLHkNX35AZhQqZBIda1j2SMw==", "license": "ISC", "dependencies": { - "@binance/w3w-qrcode-modal": "1.1.5", + "@binance/w3w-qrcode-modal": "1.1.7", "@binance/w3w-socket-transport": "1.1.4", "@binance/w3w-types": "1.1.4", - "@binance/w3w-utils": "1.1.4", - "@ethersproject/abi": "^5.7.0", - "axios": "^1.3.5", + "@binance/w3w-utils": "1.1.8", "js-base64": "^3.7.5" } }, "node_modules/@binance/w3w-ethereum-provider": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@binance/w3w-ethereum-provider/-/w3w-ethereum-provider-1.1.7.tgz", - "integrity": "sha512-fHHifGDidtYaXoboe1FzLZ5wKk0FzIvgq8SCuEtibXZK3d+iITF28gmCKZnp7BCuCjvuNvOCp3GNHcvY4ARPJg==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/@binance/w3w-ethereum-provider/-/w3w-ethereum-provider-1.1.13.tgz", + "integrity": "sha512-U56ycWg+GttnYWMpfQSBJyn4ZgsV+S6Hg7yFrG2l22rgx1NPiwfULY56bG6xdC4lMk7TfSlW3LbKBruYd4c05w==", "license": "ISC", "dependencies": { "@binance/w3w-http-client": "1.1.4", - "@binance/w3w-sign-client": "1.1.7", + "@binance/w3w-sign-client": "1.1.11", "@binance/w3w-types": "1.1.4", - "@binance/w3w-utils": "1.1.4", + "@binance/w3w-utils": "1.1.8", "eip1193-provider": "^1.0.1", "eventemitter3": "^5.0.0" } @@ -1966,14 +2013,26 @@ "eventemitter3": "^5.0.0" } }, + "node_modules/@binance/w3w-http-client/node_modules/@binance/w3w-utils": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@binance/w3w-utils/-/w3w-utils-1.1.4.tgz", + "integrity": "sha512-lWpxCj5IB8XNKmFotZ2MLsK4rP5ECyC5jHxbDuvjseMlZchEaWKRXViUcwIz3XdJPVM3DDArqqweLEyxCcsDtQ==", + "license": "ISC", + "dependencies": { + "@binance/w3w-types": "1.1.4", + "eventemitter3": "^5.0.0", + "hash.js": "^1.1.7", + "js-base64": "^3.7.5" + } + }, "node_modules/@binance/w3w-qrcode-modal": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@binance/w3w-qrcode-modal/-/w3w-qrcode-modal-1.1.5.tgz", - "integrity": "sha512-SFwA9PeCAlPBjfgLf9chLoia3D5pWpDjDZOZ6wD3G3Xspd4XKrtQl4UvFpAm6hkrgw6fShtI2zis9PQYAxQjiA==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@binance/w3w-qrcode-modal/-/w3w-qrcode-modal-1.1.7.tgz", + "integrity": "sha512-asrFKFWE/HOfgC+R2IsWwIebV6Db3Bk7l3R+2bDB5O0tXYnTgQg8YgzSU1JnwNc7rnbnGs/6BN7gxIeTRT2zeQ==", "license": "ISC", "dependencies": { "@binance/w3w-types": "1.1.4", - "@binance/w3w-utils": "1.1.4", + "@binance/w3w-utils": "1.1.7", "qrcode": "^1.5.1", "qrcode.react": "^3.1.0", "react": "18.2.0", @@ -1981,6 +2040,18 @@ "tailwindcss": "^3.3.1" } }, + "node_modules/@binance/w3w-qrcode-modal/node_modules/@binance/w3w-utils": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@binance/w3w-utils/-/w3w-utils-1.1.7.tgz", + "integrity": "sha512-dAP/Rh/kYH3D5hwJDvbeD7Zt0lysKyEulmFjCmfN0vcXsoaSFeo3tYQ97bkiJURzhatFRYYGxr7rhw5lr7foWA==", + "license": "ISC", + "dependencies": { + "@binance/w3w-types": "1.1.4", + "eventemitter3": "^5.0.0", + "hash.js": "^1.1.7", + "js-base64": "^3.7.5" + } + }, "node_modules/@binance/w3w-qrcode-modal/node_modules/react": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", @@ -2007,14 +2078,14 @@ } }, "node_modules/@binance/w3w-rainbow-connector-v2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@binance/w3w-rainbow-connector-v2/-/w3w-rainbow-connector-v2-1.0.2.tgz", - "integrity": "sha512-wzMXwKxCXMbJyxa3xhXS/yD5spnCDxVPb6w+JeJm+HyiynZAVEoFrKMExozKdFeCVxTzIwiCSe5sy1AtzTBGVA==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@binance/w3w-rainbow-connector-v2/-/w3w-rainbow-connector-v2-1.0.8.tgz", + "integrity": "sha512-pH8Ok9O2FW30MCYWt3urNTlnEGlt7Cp8WU/J4F4PQ9CaNozHiSnV2Gv9WI3PcUPS1KsTTawDIVhCsoZvntX37A==", "license": "ISC", "dependencies": { "@binance/w3w-types": "1.1.4", - "@binance/w3w-utils": "1.1.4", - "@binance/w3w-wagmi-connector-v2": "1.2.5" + "@binance/w3w-utils": "1.1.8", + "@binance/w3w-wagmi-connector-v2": "1.2.11" }, "peerDependencies": { "@rainbow-me/rainbowkit": "^2.1.1", @@ -2023,14 +2094,14 @@ } }, "node_modules/@binance/w3w-sign-client": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@binance/w3w-sign-client/-/w3w-sign-client-1.1.7.tgz", - "integrity": "sha512-KmuQCJ6g0L2LS0LEUQWbugqWiB6Nx+GMCEVuyRhl1AxzAiDybolpx8bIYAIinUeWoO2NcDJdzn971tX+QkhjoQ==", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@binance/w3w-sign-client/-/w3w-sign-client-1.1.11.tgz", + "integrity": "sha512-iSYiQen0+W8u7UFWKhrfKdz+tqg68KZe/uXgFeY656sCR74S7CW//zPRA4kLR1E62+O6vHImj4On03aVA4O1NQ==", "license": "ISC", "dependencies": { - "@binance/w3w-core": "1.1.7", + "@binance/w3w-core": "1.1.10", "@binance/w3w-types": "1.1.4", - "@binance/w3w-utils": "1.1.4" + "@binance/w3w-utils": "1.1.8" } }, "node_modules/@binance/w3w-socket-transport": { @@ -2044,6 +2115,18 @@ "ws": "^8.13.0" } }, + "node_modules/@binance/w3w-socket-transport/node_modules/@binance/w3w-utils": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@binance/w3w-utils/-/w3w-utils-1.1.4.tgz", + "integrity": "sha512-lWpxCj5IB8XNKmFotZ2MLsK4rP5ECyC5jHxbDuvjseMlZchEaWKRXViUcwIz3XdJPVM3DDArqqweLEyxCcsDtQ==", + "license": "ISC", + "dependencies": { + "@binance/w3w-types": "1.1.4", + "eventemitter3": "^5.0.0", + "hash.js": "^1.1.7", + "js-base64": "^3.7.5" + } + }, "node_modules/@binance/w3w-types": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/@binance/w3w-types/-/w3w-types-1.1.4.tgz", @@ -2054,9 +2137,9 @@ } }, "node_modules/@binance/w3w-utils": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@binance/w3w-utils/-/w3w-utils-1.1.4.tgz", - "integrity": "sha512-lWpxCj5IB8XNKmFotZ2MLsK4rP5ECyC5jHxbDuvjseMlZchEaWKRXViUcwIz3XdJPVM3DDArqqweLEyxCcsDtQ==", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@binance/w3w-utils/-/w3w-utils-1.1.8.tgz", + "integrity": "sha512-dImFqeqfOHmrZNo0qmyn4G9uMWGzR8jjjRUfesA7zRh6EmR1gpbnQNBUTtw7NZfJ5SEBzDJMwResxzU5ACwkpQ==", "license": "ISC", "dependencies": { "@binance/w3w-types": "1.1.4", @@ -2066,56 +2149,38 @@ } }, "node_modules/@binance/w3w-wagmi-connector-v2": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@binance/w3w-wagmi-connector-v2/-/w3w-wagmi-connector-v2-1.2.5.tgz", - "integrity": "sha512-h6P7qVT+BoTvFAGn1twACrZc4v0MAGRNpFweeb+wYtV54tktxDFg8I9AZC7SnKMaXC9jazX0mLBDbWYz1S3vhg==", + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@binance/w3w-wagmi-connector-v2/-/w3w-wagmi-connector-v2-1.2.11.tgz", + "integrity": "sha512-xCrMntKpzYAS01U3mkeUwOLQw7GzRD4RjJWYar2Lb0UtptXqxUNt/KS0gehZiNYFTRcTZlLA4sMmEmSwxepRQw==", "license": "ISC", "dependencies": { - "@binance/w3w-ethereum-provider": "1.1.7", - "@binance/w3w-utils": "1.1.4" + "@binance/w3w-ethereum-provider": "1.1.13", + "@binance/w3w-utils": "1.1.8" }, "peerDependencies": { "viem": "2.x", "wagmi": "2.x" } }, - "node_modules/@chainsafe/is-ip": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@chainsafe/is-ip/-/is-ip-2.1.0.tgz", - "integrity": "sha512-KIjt+6IfysQ4GCv66xihEitBjvhU/bixbbbFxdJ1sqCp4uJ0wuZiYBPhksZoy4lfaF0k9cwNzY5upEW/VWdw3w==", - "license": "MIT" - }, - "node_modules/@chainsafe/netmask": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@chainsafe/netmask/-/netmask-2.0.0.tgz", - "integrity": "sha512-I3Z+6SWUoaljh3TBzCnCxjlUyN8tA+NAk5L6m9IxvCf1BENQTePzPMis97CoN/iMW1St3WN+AWCCRp+TTBRiDg==", - "license": "MIT", - "dependencies": { - "@chainsafe/is-ip": "^2.0.1" - } - }, "node_modules/@cloudflare/kv-asset-handler": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.4.1.tgz", - "integrity": "sha512-Nu8ahitGFFJztxUml9oD/DLb7Z28C8cd8F46IVQ7y5Btz575pvMY8AqZsXkX7Gds29eCKdMgIHjIvzskHgPSFg==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.4.2.tgz", + "integrity": "sha512-SIOD2DxrRRwQ+jgzlXCqoEFiKOFqaPjhnNTGKXSRLvp1HiOvapLaFG2kEr9dYQTYe8rKrd9uvDUzmAITeNyaHQ==", "dev": true, "license": "MIT OR Apache-2.0", - "dependencies": { - "mime": "^3.0.0" - }, "engines": { "node": ">=18.0.0" } }, "node_modules/@cloudflare/unenv-preset": { - "version": "2.7.11", - "resolved": "https://registry.npmjs.org/@cloudflare/unenv-preset/-/unenv-preset-2.7.11.tgz", - "integrity": "sha512-se23f1D4PxKrMKOq+Stz+Yn7AJ9ITHcEecXo2Yjb+UgbUDCEBch1FXQC6hx6uT5fNA3kmX3mfzeZiUmpK1W9IQ==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@cloudflare/unenv-preset/-/unenv-preset-2.10.0.tgz", + "integrity": "sha512-/uII4vLQXhzCAZzEVeYAjFLBNg2nqTJ1JGzd2lRF6ItYe6U2zVoYGfeKpGx/EkBF6euiU+cyBXgMdtJih+nQ6g==", "dev": true, "license": "MIT OR Apache-2.0", "peerDependencies": { "unenv": "2.0.0-rc.24", - "workerd": "^1.20251106.1" + "workerd": "^1.20251221.0" }, "peerDependenciesMeta": { "workerd": { @@ -2124,9 +2189,9 @@ } }, "node_modules/@cloudflare/workerd-darwin-64": { - "version": "1.20251125.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20251125.0.tgz", - "integrity": "sha512-xDIVJi8fPxBseRoEIzLiUJb0N+DXnah/ynS+Unzn58HEoKLetUWiV/T1Fhned//lo5krnToG9KRgVRs0SOOTpw==", + "version": "1.20260116.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20260116.0.tgz", + "integrity": "sha512-0LF2jR/5bfCIMYsqtCXHqaZRlXEMgnz4NzG/8KVmHROlKb06SJezYYoNKw+7s6ji4fgi1BcYAJBmWbC4nzMbqw==", "cpu": [ "x64" ], @@ -2141,9 +2206,9 @@ } }, "node_modules/@cloudflare/workerd-darwin-arm64": { - "version": "1.20251125.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20251125.0.tgz", - "integrity": "sha512-k5FQET5PXnWjeDqZUpl4Ah/Rn0bH6mjfUtTyeAy6ky7QB3AZpwIhgWQD0vOFB3OvJaK4J/K4cUtNChYXB9mY/A==", + "version": "1.20260116.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20260116.0.tgz", + "integrity": "sha512-a9OHts4jMoOkPedc4CnuHPeo9XRG3VCMMgr0ER5HtSfEDRQhh7MwIuPEmqI27KKrYj+DeoCazIgbp3gW9bFTAg==", "cpu": [ "arm64" ], @@ -2158,9 +2223,9 @@ } }, "node_modules/@cloudflare/workerd-linux-64": { - "version": "1.20251125.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20251125.0.tgz", - "integrity": "sha512-at6n/FomkftykWx0EqVLUZ0juUFz3ORtEPeBbW9ZZ3BQEyfVUtYfdcz/f1cN8Yyb7TE9ovF071P0mBRkx83ODw==", + "version": "1.20260116.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20260116.0.tgz", + "integrity": "sha512-nCMy7D7BeH/feGiD7C5Z1LG19Wvs3qmHSRe3cwz6HYRQHdDXUHTjXwEVid7Vejf9QFNe3iAn49Sy/h2XY2Rqeg==", "cpu": [ "x64" ], @@ -2175,9 +2240,9 @@ } }, "node_modules/@cloudflare/workerd-linux-arm64": { - "version": "1.20251125.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20251125.0.tgz", - "integrity": "sha512-EiRn+jrNaIs1QveabXGHFoyn3s/l02ui6Yp3nssyNhtmtgviddtt8KObBfM1jQKjXTpZlunhwdN4Bxf4jhlOMw==", + "version": "1.20260116.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20260116.0.tgz", + "integrity": "sha512-Hve4ciPI69aIzwfSD12PVZJoEnKIkdR3Vd0w8rD1hDVxk75xAA65KqVYf5qW+8KOYrYkU3pg7hBTMjeyDF//IQ==", "cpu": [ "arm64" ], @@ -2192,9 +2257,9 @@ } }, "node_modules/@cloudflare/workerd-windows-64": { - "version": "1.20251125.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20251125.0.tgz", - "integrity": "sha512-6fdIsSeu65g++k8Y2DKzNKs0BkoU+KKI6GAAVBOLh2vvVWWnCP1OgMdVb5JAdjDrjDT5i0GSQu0bgQ8fPsW6zw==", + "version": "1.20260116.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20260116.0.tgz", + "integrity": "sha512-7QA6OTXQtBdszkXw3rzxpkk1RoINZJY1ADQjF0vFNAbVXD1VEXLZnk0jc505tqARI8w/0DdVjaJszqL7K5k00w==", "cpu": [ "x64" ], @@ -2209,12 +2274,62 @@ } }, "node_modules/@cloudflare/workers-types": { - "version": "4.20251126.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-4.20251126.0.tgz", - "integrity": "sha512-DSeI1Q7JYmh5/D/tw5eZCjrKY34v69rwj63hHt60nSQW5QLwWCbj/lLtNz9f2EPa+JCACwpLXHgCXfzJ29x66w==", + "version": "4.20260120.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-4.20260120.0.tgz", + "integrity": "sha512-B8pueG+a5S+mdK3z8oKu1ShcxloZ7qWb68IEyLLaepvdryIbNC7JVPcY0bWsjS56UQVKc5fnyRge3yZIwc9bxw==", "dev": true, "license": "MIT OR Apache-2.0" }, + "node_modules/@coinbase/cdp-sdk": { + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/@coinbase/cdp-sdk/-/cdp-sdk-1.43.0.tgz", + "integrity": "sha512-Fre1tvoIi4HAoC8/PgBoLsuZ9mt7K0R50EEC6i+6FaipW7oO3MABCx+vGAcM7EpcbVa7E6hTFe2/a0UdoajvYQ==", + "license": "MIT", + "dependencies": { + "@solana-program/system": "^0.10.0", + "@solana-program/token": "^0.9.0", + "@solana/kit": "^5.1.0", + "@solana/web3.js": "^1.98.1", + "abitype": "1.0.6", + "axios": "^1.12.2", + "axios-retry": "^4.5.0", + "jose": "^6.0.8", + "md5": "^2.3.0", + "uncrypto": "^0.1.3", + "viem": "^2.21.26", + "zod": "^3.24.4" + } + }, + "node_modules/@coinbase/cdp-sdk/node_modules/abitype": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.0.6.tgz", + "integrity": "sha512-MMSqYh4+C/aVqI2RQaWqbvI4Kxo5cQV40WQ4QFtDnNzCkqChm8MuENhElmynZlO0qUy/ObkEUaXtKqYnx1Kp3A==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/wevm" + }, + "peerDependencies": { + "typescript": ">=5.0.4", + "zod": "^3 >=3.22.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, + "node_modules/@coinbase/cdp-sdk/node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, "node_modules/@coinbase/wallet-sdk": { "version": "4.3.6", "resolved": "https://registry.npmjs.org/@coinbase/wallet-sdk/-/wallet-sdk-4.3.6.tgz", @@ -2317,6 +2432,141 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "node_modules/@csstools/color-helpers": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", + "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/css-calc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", + "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", + "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^5.1.0", + "@csstools/css-calc": "^2.1.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-syntax-patches-for-csstree": { + "version": "1.0.25", + "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.0.25.tgz", + "integrity": "sha512-g0Kw9W3vjx5BEBAF8c5Fm2NcB/Fs8jJXh85aXqwEXiL+tqtOut07TWgyaGzAAfTM+gKckrrncyeGEZPcaRgm2Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/@dnd-kit/accessibility": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/@dnd-kit/accessibility/-/accessibility-3.1.1.tgz", @@ -2371,9 +2621,9 @@ } }, "node_modules/@ecies/ciphers": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@ecies/ciphers/-/ciphers-0.2.4.tgz", - "integrity": "sha512-t+iX+Wf5nRKyNzk8dviW3Ikb/280+aEJAnw9YXvCp2tYGPSkMki+NRY+8aNLmVFv3eNtMdvViPNOPxS8SZNP+w==", + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@ecies/ciphers/-/ciphers-0.2.5.tgz", + "integrity": "sha512-GalEZH4JgOMHYYcYmVqnFirFsjZHeoGMDt9IxEnM9F7GRUUyUksJ7Ou53L83WHJq3RWKD3AcBpo0iQh0oMpf8A==", "license": "MIT", "engines": { "bun": ">=1", @@ -2385,9 +2635,10 @@ } }, "node_modules/@emnapi/runtime": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.1.tgz", - "integrity": "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", + "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", + "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -2432,21 +2683,6 @@ "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==", "license": "MIT" }, - "node_modules/@emotion/is-prop-valid": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", - "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==", - "license": "MIT", - "dependencies": { - "@emotion/memoize": "0.7.4" - } - }, - "node_modules/@emotion/is-prop-valid/node_modules/@emotion/memoize": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", - "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==", - "license": "MIT" - }, "node_modules/@emotion/memoize": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", @@ -2524,9 +2760,9 @@ "license": "MIT" }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", + "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", "cpu": [ "ppc64" ], @@ -2537,13 +2773,13 @@ "aix" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-arm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", - "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", "cpu": [ "arm" ], @@ -2554,13 +2790,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", - "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", "cpu": [ "arm64" ], @@ -2571,13 +2807,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", - "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", "cpu": [ "x64" ], @@ -2588,13 +2824,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", - "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", "cpu": [ "arm64" ], @@ -2605,13 +2841,13 @@ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", - "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", "cpu": [ "x64" ], @@ -2622,13 +2858,13 @@ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", - "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", "cpu": [ "arm64" ], @@ -2639,13 +2875,13 @@ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", - "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", "cpu": [ "x64" ], @@ -2656,13 +2892,13 @@ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-arm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", - "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", "cpu": [ "arm" ], @@ -2673,13 +2909,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", - "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", "cpu": [ "arm64" ], @@ -2690,13 +2926,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", - "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", "cpu": [ "ia32" ], @@ -2707,13 +2943,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", - "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", "cpu": [ "loong64" ], @@ -2724,13 +2960,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", - "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", "cpu": [ "mips64el" ], @@ -2741,13 +2977,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", - "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", "cpu": [ "ppc64" ], @@ -2758,13 +2994,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", - "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", "cpu": [ "riscv64" ], @@ -2775,13 +3011,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", - "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", "cpu": [ "s390x" ], @@ -2792,13 +3028,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", - "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", "cpu": [ "x64" ], @@ -2809,13 +3045,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.4.tgz", - "integrity": "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.0.tgz", + "integrity": "sha512-6m0sfQfxfQfy1qRuecMkJlf1cIzTOgyaeXaiVaaki8/v+WB+U4hc6ik15ZW6TAllRlg/WuQXxWj1jx6C+dfy3w==", "cpu": [ "arm64" ], @@ -2830,9 +3066,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", - "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", "cpu": [ "x64" ], @@ -2843,13 +3079,13 @@ "netbsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.4.tgz", - "integrity": "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.0.tgz", + "integrity": "sha512-fWgqR8uNbCQ/GGv0yhzttj6sU/9Z5/Sv/VGU3F5OuXK6J6SlriONKrQ7tNlwBrJZXRYk5jUhuWvF7GYzGguBZQ==", "cpu": [ "arm64" ], @@ -2864,9 +3100,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", - "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", "cpu": [ "x64" ], @@ -2877,13 +3113,30 @@ "openbsd" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.0.tgz", + "integrity": "sha512-nyvsBccxNAsNYz2jVFYwEGuRRomqZ149A39SHWk4hV0jWxKM0hjBPm3AmdxcbHiFLbBSwG6SbpIcUbXjgyECfA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", - "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", "cpu": [ "x64" ], @@ -2894,13 +3147,13 @@ "sunos" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", - "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", "cpu": [ "arm64" ], @@ -2911,13 +3164,13 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", - "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", "cpu": [ "ia32" ], @@ -2928,13 +3181,13 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", - "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", "cpu": [ "x64" ], @@ -2945,7 +3198,7 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@ethereumjs/common": { @@ -2999,507 +3252,135 @@ "node": ">=14" } }, - "node_modules/@ethersproject/abi": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.8.0.tgz", - "integrity": "sha512-b9YS/43ObplgyV6SlyQsG53/vkSal0MNA1fskSC4mbnCMi8R+NkcH8K9FPYNESf6jUefBUniE4SOKms0E/KK1Q==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "node_modules/@exodus/bytes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.8.0.tgz", + "integrity": "sha512-8JPn18Bcp8Uo1T82gR8lh2guEOa5KKU/IEKvvdp0sgmi7coPBWf1Doi1EXsGZb2ehc8ym/StJCjffYV+ne7sXQ==", + "dev": true, "license": "MIT", - "dependencies": { - "@ethersproject/address": "^5.8.0", - "@ethersproject/bignumber": "^5.8.0", - "@ethersproject/bytes": "^5.8.0", - "@ethersproject/constants": "^5.8.0", - "@ethersproject/hash": "^5.8.0", - "@ethersproject/keccak256": "^5.8.0", - "@ethersproject/logger": "^5.8.0", - "@ethersproject/properties": "^5.8.0", - "@ethersproject/strings": "^5.8.0" - } - }, - "node_modules/@ethersproject/abstract-provider": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.8.0.tgz", - "integrity": "sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@exodus/crypto": "^1.0.0-rc.4" + }, + "peerDependenciesMeta": { + "@exodus/crypto": { + "optional": true } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bignumber": "^5.8.0", - "@ethersproject/bytes": "^5.8.0", - "@ethersproject/logger": "^5.8.0", - "@ethersproject/networks": "^5.8.0", - "@ethersproject/properties": "^5.8.0", - "@ethersproject/transactions": "^5.8.0", - "@ethersproject/web": "^5.8.0" } }, - "node_modules/@ethersproject/abstract-signer": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.8.0.tgz", - "integrity": "sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "node_modules/@floating-ui/core": { + "version": "1.6.9", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.9.tgz", + "integrity": "sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==", "license": "MIT", "dependencies": { - "@ethersproject/abstract-provider": "^5.8.0", - "@ethersproject/bignumber": "^5.8.0", - "@ethersproject/bytes": "^5.8.0", - "@ethersproject/logger": "^5.8.0", - "@ethersproject/properties": "^5.8.0" + "@floating-ui/utils": "^0.2.9" } }, - "node_modules/@ethersproject/address": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.8.0.tgz", - "integrity": "sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "node_modules/@floating-ui/dom": { + "version": "1.6.13", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.13.tgz", + "integrity": "sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==", "license": "MIT", "dependencies": { - "@ethersproject/bignumber": "^5.8.0", - "@ethersproject/bytes": "^5.8.0", - "@ethersproject/keccak256": "^5.8.0", - "@ethersproject/logger": "^5.8.0", - "@ethersproject/rlp": "^5.8.0" + "@floating-ui/core": "^1.6.0", + "@floating-ui/utils": "^0.2.9" } }, - "node_modules/@ethersproject/base64": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.8.0.tgz", - "integrity": "sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "node_modules/@floating-ui/react-dom": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.2.tgz", + "integrity": "sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==", "license": "MIT", "dependencies": { - "@ethersproject/bytes": "^5.8.0" + "@floating-ui/dom": "^1.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" } }, - "node_modules/@ethersproject/bignumber": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.8.0.tgz", - "integrity": "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "node_modules/@floating-ui/utils": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.9.tgz", + "integrity": "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==", + "license": "MIT" + }, + "node_modules/@gemini-wallet/core": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@gemini-wallet/core/-/core-0.3.2.tgz", + "integrity": "sha512-Z4aHi3ECFf5oWYWM3F1rW83GJfB9OvhBYPTmb5q+VyK3uvzvS48lwo+jwh2eOoCRWEuT/crpb9Vwp2QaS5JqgQ==", "license": "MIT", "dependencies": { - "@ethersproject/bytes": "^5.8.0", - "@ethersproject/logger": "^5.8.0", - "bn.js": "^5.2.1" + "@metamask/rpc-errors": "7.0.2", + "eventemitter3": "5.0.1" + }, + "peerDependencies": { + "viem": ">=2.0.0" } }, - "node_modules/@ethersproject/bytes": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.8.0.tgz", - "integrity": "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "node_modules/@graphql-typed-document-node/core": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz", + "integrity": "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==", "license": "MIT", - "dependencies": { - "@ethersproject/logger": "^5.8.0" + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/@ethersproject/constants": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.8.0.tgz", - "integrity": "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "node_modules/@hookform/resolvers": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-5.2.2.tgz", + "integrity": "sha512-A/IxlMLShx3KjV/HeTcTfaMxdwy690+L/ZADoeaTltLx+CVuzkeVIPuybK3jrRfw7YZnmdKsVVHAlEPIAEUNlA==", "license": "MIT", "dependencies": { - "@ethersproject/bignumber": "^5.8.0" + "@standard-schema/utils": "^0.3.0" + }, + "peerDependencies": { + "react-hook-form": "^7.55.0" } }, - "node_modules/@ethersproject/hash": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.8.0.tgz", - "integrity": "sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfvWmFEi8RcXtlNwp2jv6ozWOsooA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "node_modules/@img/colour": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz", + "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", + "devOptional": true, "license": "MIT", - "dependencies": { - "@ethersproject/abstract-signer": "^5.8.0", - "@ethersproject/address": "^5.8.0", - "@ethersproject/base64": "^5.8.0", - "@ethersproject/bignumber": "^5.8.0", - "@ethersproject/bytes": "^5.8.0", - "@ethersproject/keccak256": "^5.8.0", - "@ethersproject/logger": "^5.8.0", - "@ethersproject/properties": "^5.8.0", - "@ethersproject/strings": "^5.8.0" + "engines": { + "node": ">=18" } }, - "node_modules/@ethersproject/keccak256": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.8.0.tgz", - "integrity": "sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", + "cpu": [ + "arm64" ], - "license": "MIT", - "dependencies": { - "@ethersproject/bytes": "^5.8.0", - "js-sha3": "0.8.0" + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.4" } }, - "node_modules/@ethersproject/logger": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.8.0.tgz", - "integrity": "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT" - }, - "node_modules/@ethersproject/networks": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.8.0.tgz", - "integrity": "sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/logger": "^5.8.0" - } - }, - "node_modules/@ethersproject/properties": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.8.0.tgz", - "integrity": "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/logger": "^5.8.0" - } - }, - "node_modules/@ethersproject/rlp": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.8.0.tgz", - "integrity": "sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bytes": "^5.8.0", - "@ethersproject/logger": "^5.8.0" - } - }, - "node_modules/@ethersproject/signing-key": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.8.0.tgz", - "integrity": "sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bytes": "^5.8.0", - "@ethersproject/logger": "^5.8.0", - "@ethersproject/properties": "^5.8.0", - "bn.js": "^5.2.1", - "elliptic": "6.6.1", - "hash.js": "1.1.7" - } - }, - "node_modules/@ethersproject/strings": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.8.0.tgz", - "integrity": "sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/bytes": "^5.8.0", - "@ethersproject/constants": "^5.8.0", - "@ethersproject/logger": "^5.8.0" - } - }, - "node_modules/@ethersproject/transactions": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.8.0.tgz", - "integrity": "sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/address": "^5.8.0", - "@ethersproject/bignumber": "^5.8.0", - "@ethersproject/bytes": "^5.8.0", - "@ethersproject/constants": "^5.8.0", - "@ethersproject/keccak256": "^5.8.0", - "@ethersproject/logger": "^5.8.0", - "@ethersproject/properties": "^5.8.0", - "@ethersproject/rlp": "^5.8.0", - "@ethersproject/signing-key": "^5.8.0" - } - }, - "node_modules/@ethersproject/web": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.8.0.tgz", - "integrity": "sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/base64": "^5.8.0", - "@ethersproject/bytes": "^5.8.0", - "@ethersproject/logger": "^5.8.0", - "@ethersproject/properties": "^5.8.0", - "@ethersproject/strings": "^5.8.0" - } - }, - "node_modules/@floating-ui/core": { - "version": "1.6.9", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.9.tgz", - "integrity": "sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==", - "license": "MIT", - "dependencies": { - "@floating-ui/utils": "^0.2.9" - } - }, - "node_modules/@floating-ui/dom": { - "version": "1.6.13", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.13.tgz", - "integrity": "sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==", - "license": "MIT", - "dependencies": { - "@floating-ui/core": "^1.6.0", - "@floating-ui/utils": "^0.2.9" - } - }, - "node_modules/@floating-ui/react-dom": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.2.tgz", - "integrity": "sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==", - "license": "MIT", - "dependencies": { - "@floating-ui/dom": "^1.0.0" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@floating-ui/utils": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.9.tgz", - "integrity": "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==", - "license": "MIT" - }, - "node_modules/@gemini-wallet/core": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@gemini-wallet/core/-/core-0.2.0.tgz", - "integrity": "sha512-vv9aozWnKrrPWQ3vIFcWk7yta4hQW1Ie0fsNNPeXnjAxkbXr2hqMagEptLuMxpEP2W3mnRu05VDNKzcvAuuZDw==", - "license": "MIT", - "dependencies": { - "@metamask/rpc-errors": "7.0.2", - "eventemitter3": "5.0.1" - }, - "peerDependencies": { - "viem": ">=2.0.0" - } - }, - "node_modules/@graphql-typed-document-node/core": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz", - "integrity": "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==", - "license": "MIT", - "peerDependencies": { - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@hookform/resolvers": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-3.10.0.tgz", - "integrity": "sha512-79Dv+3mDF7i+2ajj7SkypSKHhl1cbln1OGavqrsF7p6mbUv11xpqpacPsGDCTRvCSjEEIez2ef1NveSVL3b0Ag==", - "license": "MIT", - "peerDependencies": { - "react-hook-form": "^7.0.0" - } - }, - "node_modules/@img/colour": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz", - "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@img/sharp-darwin-arm64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", - "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.0.4" - } - }, - "node_modules/@img/sharp-darwin-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz", - "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==", - "cpu": [ - "x64" + "node_modules/@img/sharp-darwin-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", + "cpu": [ + "x64" ], "dev": true, "license": "Apache-2.0", @@ -3514,13 +3395,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.0.4" + "@img/sharp-libvips-darwin-x64": "1.2.4" } }, "node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz", - "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", "cpu": [ "arm64" ], @@ -3535,9 +3416,9 @@ } }, "node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", - "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", "cpu": [ "x64" ], @@ -3552,9 +3433,9 @@ } }, "node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz", - "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", "cpu": [ "arm" ], @@ -3569,9 +3450,9 @@ } }, "node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz", - "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", "cpu": [ "arm64" ], @@ -3592,12 +3473,12 @@ "cpu": [ "ppc64" ], + "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" ], - "peer": true, "funding": { "url": "https://opencollective.com/libvips" } @@ -3609,20 +3490,20 @@ "cpu": [ "riscv64" ], + "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" ], - "peer": true, "funding": { "url": "https://opencollective.com/libvips" } }, "node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", - "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", "cpu": [ "s390x" ], @@ -3637,9 +3518,9 @@ } }, "node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", - "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", "cpu": [ "x64" ], @@ -3654,9 +3535,9 @@ } }, "node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz", - "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", "cpu": [ "arm64" ], @@ -3671,9 +3552,9 @@ } }, "node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz", - "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", "cpu": [ "x64" ], @@ -3688,9 +3569,9 @@ } }, "node_modules/@img/sharp-linux-arm": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz", - "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", "cpu": [ "arm" ], @@ -3707,13 +3588,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.0.5" + "@img/sharp-libvips-linux-arm": "1.2.4" } }, "node_modules/@img/sharp-linux-arm64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz", - "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", "cpu": [ "arm64" ], @@ -3730,7 +3611,7 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.0.4" + "@img/sharp-libvips-linux-arm64": "1.2.4" } }, "node_modules/@img/sharp-linux-ppc64": { @@ -3740,12 +3621,12 @@ "cpu": [ "ppc64" ], + "dev": true, "license": "Apache-2.0", "optional": true, "os": [ "linux" ], - "peer": true, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, @@ -3763,12 +3644,12 @@ "cpu": [ "riscv64" ], + "dev": true, "license": "Apache-2.0", "optional": true, "os": [ "linux" ], - "peer": true, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, @@ -3780,9 +3661,9 @@ } }, "node_modules/@img/sharp-linux-s390x": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz", - "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", "cpu": [ "s390x" ], @@ -3799,13 +3680,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.0.4" + "@img/sharp-libvips-linux-s390x": "1.2.4" } }, "node_modules/@img/sharp-linux-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", - "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", "cpu": [ "x64" ], @@ -3822,13 +3703,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.0.4" + "@img/sharp-libvips-linux-x64": "1.2.4" } }, "node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz", - "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", "cpu": [ "arm64" ], @@ -3845,13 +3726,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" } }, "node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz", - "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", "cpu": [ "x64" ], @@ -3868,21 +3749,21 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.0.4" + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" } }, "node_modules/@img/sharp-wasm32": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz", - "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==", - "cpu": [ + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", + "cpu": [ "wasm32" ], "dev": true, "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", "optional": true, "dependencies": { - "@emnapi/runtime": "^1.2.0" + "@emnapi/runtime": "^1.7.0" }, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" @@ -3898,12 +3779,12 @@ "cpu": [ "arm64" ], + "dev": true, "license": "Apache-2.0 AND LGPL-3.0-or-later", "optional": true, "os": [ "win32" ], - "peer": true, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, @@ -3912,9 +3793,9 @@ } }, "node_modules/@img/sharp-win32-ia32": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz", - "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", "cpu": [ "ia32" ], @@ -3932,9 +3813,9 @@ } }, "node_modules/@img/sharp-win32-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", - "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", "cpu": [ "x64" ], @@ -3951,45 +3832,27 @@ "url": "https://opencollective.com/libvips" } }, - "node_modules/@ipld/dag-cbor": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/@ipld/dag-cbor/-/dag-cbor-9.2.2.tgz", - "integrity": "sha512-uIEOuruCqKTP50OBWwgz4Js2+LhiBQaxc57cnP71f45b1mHEAo1OCR1Zn/TbvSW/mV1x+JqhacIktkKyaYqhCw==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "cborg": "^4.0.0", - "multiformats": "^13.1.0" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/@ipld/dag-json": { - "version": "10.2.3", - "resolved": "https://registry.npmjs.org/@ipld/dag-json/-/dag-json-10.2.3.tgz", - "integrity": "sha512-itacv1j1hvYgLox2B42Msn70QLzcr0MEo5yGIENuw2SM/lQzq9bmBiMky+kDsIrsqqblKTXcHBZnnmK7D4a6ZQ==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "cborg": "^4.0.0", - "multiformats": "^13.1.0" - }, + "node_modules/@isaacs/balanced-match": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", + "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" + "node": "20 || >=22" } }, - "node_modules/@ipld/dag-pb": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@ipld/dag-pb/-/dag-pb-4.1.3.tgz", - "integrity": "sha512-ueULCaaSCcD+dQga6nKiRr+RSeVgdiYiEPKVUu5iQMNYDN+9osd0KpR3UDd9uQQ+6RWuv9L34SchfEwj7YIbOA==", - "license": "Apache-2.0 OR MIT", + "node_modules/@isaacs/brace-expansion": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", + "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", + "dev": true, + "license": "MIT", "dependencies": { - "multiformats": "^13.1.0" + "@isaacs/balanced-match": "^4.0.1" }, "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" + "node": "20 || >=22" } }, "node_modules/@isaacs/cliui": { @@ -4105,6 +3968,7 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "devOptional": true, "license": "MIT", "dependencies": { "@sinclair/typebox": "^0.27.8" @@ -4117,6 +3981,7 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "devOptional": true, "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", @@ -4131,17 +3996,23 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", - "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { @@ -4153,15 +4024,6 @@ "node": ">=6.0.0" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", @@ -4169,9 +4031,9 @@ "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -4242,80 +4104,46 @@ "@pedrouid/environment": "^1.0.1" } }, - "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", - "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", - "license": "MIT" - }, - "node_modules/@libp2p/crypto": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/@libp2p/crypto/-/crypto-5.0.15.tgz", - "integrity": "sha512-28xYMOn3fs8flsNgCVVxp27gEmDTtZHbz+qEVv3v7cWfGRipaVhNXFV9tQJHWXHQ8mN8v/PQvgcfCcWu5jkrTg==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@libp2p/interface": "^2.7.0", - "@noble/curves": "^1.7.0", - "@noble/hashes": "^1.6.1", - "multiformats": "^13.3.1", - "protons-runtime": "^5.5.0", - "uint8arraylist": "^2.4.8", - "uint8arrays": "^5.1.0" - } - }, - "node_modules/@libp2p/interface": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@libp2p/interface/-/interface-2.7.0.tgz", - "integrity": "sha512-lWmfIGzbSaw//yoEWWJh8dXNDGSCwUyXwC7P1Q6jCFWNoEtCaB1pvwOGBtri7Db/aNFZryMzN5covoq5ulldnA==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@multiformats/multiaddr": "^12.3.3", - "it-pushable": "^3.2.3", - "it-stream-types": "^2.0.2", - "multiformats": "^13.3.1", - "progress-events": "^1.0.1", - "uint8arraylist": "^2.4.8" - } - }, - "node_modules/@libp2p/logger": { - "version": "5.1.13", - "resolved": "https://registry.npmjs.org/@libp2p/logger/-/logger-5.1.13.tgz", - "integrity": "sha512-JKyMlySG8T+LpItsj9Vma57yap/A0HqJ8ZdaHvgdoThhSOfqcRs8oRWO/2EG0Q5hUXugw//EAT+Ptj8MyNdbjQ==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@libp2p/interface": "^2.7.0", - "@multiformats/multiaddr": "^12.3.3", - "interface-datastore": "^8.3.1", - "multiformats": "^13.3.1", - "weald": "^1.0.4" - } - }, - "node_modules/@libp2p/peer-id": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@libp2p/peer-id/-/peer-id-5.1.0.tgz", - "integrity": "sha512-9Xob9DDg1uBboM2QvJ5nyPbsjxsNS9obmGAYeAtLSx5aHAIC4AweJQFHssUUCfW7mufkzX/s3zyR62XPR4SYyQ==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@libp2p/crypto": "^5.0.15", - "@libp2p/interface": "^2.7.0", - "multiformats": "^13.3.1", - "uint8arrays": "^5.1.0" - } - }, "node_modules/@lingui/babel-plugin-extract-messages": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@lingui/babel-plugin-extract-messages/-/babel-plugin-extract-messages-4.14.0.tgz", - "integrity": "sha512-lLabYkUsiF0un4ezColFm9Yf23c+efPR/5DRM9cFwW9uZJ5ajN4Ic00dBxJK9HOpy6fpaANnaHFmrm4NScijvQ==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@lingui/babel-plugin-extract-messages/-/babel-plugin-extract-messages-5.8.0.tgz", + "integrity": "sha512-r+3yBdkqW3/JeTOYjzQpN0JQMW5aJBDy9ZYzkK6qHefezPgp8APbvnfL1yL6QIS5HhaPOYOAV6wAMoy5ocVaOQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=16.0.0" + "node": ">=20.0.0" + } + }, + "node_modules/@lingui/babel-plugin-lingui-macro": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@lingui/babel-plugin-lingui-macro/-/babel-plugin-lingui-macro-5.8.0.tgz", + "integrity": "sha512-g1Jtrnn9VbHMdVHwMfhvRsUEav/HTkW6JwnQT1386aClI06ZCN3CGnO4mEcCtf12n6cObK345x2BnaZF+MiRcg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.20.12", + "@babel/runtime": "^7.20.13", + "@babel/types": "^7.20.7", + "@lingui/conf": "5.8.0", + "@lingui/core": "5.8.0", + "@lingui/message-utils": "5.8.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "babel-plugin-macros": "2 || 3" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } } }, "node_modules/@lingui/cli": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@lingui/cli/-/cli-4.14.0.tgz", - "integrity": "sha512-g9aJ76wpl6Fj06SEGiGnilAErEuZG6/woAU1HM81E0ZZ8ib1DF+cf81PJE+8Lwoxc0yMqY8qMScwhwcUhnR0aA==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@lingui/cli/-/cli-5.8.0.tgz", + "integrity": "sha512-uJX3hq/wxifCfQs6x0PkaJd+MhoQHoXg9YtOuqSGsrCivmcBf0z5gP0Um6eHgrJIbFB6YHqKayzfGqfJ6jqBfg==", "dev": true, "license": "MIT", "dependencies": { @@ -4324,36 +4152,34 @@ "@babel/parser": "^7.22.0", "@babel/runtime": "^7.21.0", "@babel/types": "^7.21.2", - "@lingui/babel-plugin-extract-messages": "4.14.0", - "@lingui/conf": "4.14.0", - "@lingui/core": "4.14.0", - "@lingui/format-po": "4.14.0", - "@lingui/message-utils": "4.14.0", - "babel-plugin-macros": "^3.0.1", - "chalk": "^4.1.0", + "@lingui/babel-plugin-extract-messages": "5.8.0", + "@lingui/babel-plugin-lingui-macro": "5.8.0", + "@lingui/conf": "5.8.0", + "@lingui/core": "5.8.0", + "@lingui/format-po": "5.8.0", + "@lingui/message-utils": "5.8.0", "chokidar": "3.5.1", "cli-table": "^0.3.11", "commander": "^10.0.0", "convert-source-map": "^2.0.0", "date-fns": "^3.6.0", - "esbuild": "^0.17.10", - "glob": "^7.1.4", - "inquirer": "^7.3.3", - "micromatch": "^4.0.2", + "esbuild": "^0.25.1", + "glob": "^11.0.0", + "micromatch": "^4.0.7", + "ms": "^2.1.3", "normalize-path": "^3.0.0", "ora": "^5.1.0", - "pathe": "^1.1.0", - "pkg-up": "^3.1.0", + "picocolors": "^1.1.1", "pofile": "^1.1.4", "pseudolocale": "^2.0.0", - "ramda": "^0.27.1", - "source-map": "^0.8.0-beta.0" + "source-map": "^0.7.6", + "threads": "^1.7.0" }, "bin": { "lingui": "dist/lingui.js" }, "engines": { - "node": ">=16.0.0" + "node": ">=20.0.0" } }, "node_modules/@lingui/cli/node_modules/convert-source-map": { @@ -4364,173 +4190,177 @@ "license": "MIT" }, "node_modules/@lingui/cli/node_modules/source-map": { - "version": "0.8.0-beta.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", - "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", "dev": true, "license": "BSD-3-Clause", - "dependencies": { - "whatwg-url": "^7.0.0" - }, "engines": { - "node": ">= 8" - } - }, - "node_modules/@lingui/cli/node_modules/tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", - "dev": true, - "license": "MIT", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/@lingui/cli/node_modules/webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/@lingui/cli/node_modules/whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "dev": true, - "license": "MIT", - "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" + "node": ">= 12" } }, "node_modules/@lingui/conf": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@lingui/conf/-/conf-4.14.0.tgz", - "integrity": "sha512-wHZ4s79wqPnROa3xEoUTNep7sjqwbDHCMLBhsHbcvk/3ACDKgm0TMvDnIRjMRwrPRsK98yxSmWaE+NKhT0Ggyw==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@lingui/conf/-/conf-5.8.0.tgz", + "integrity": "sha512-4paMnxAtZEvuKmqmEvrPKjDBxMepTxDkYcN30snrUc5aIErr/cZQX0HO0sa1vdu1Xy7RMt6LCzpvBpcKnWNpXw==", + "devOptional": true, "license": "MIT", "dependencies": { "@babel/runtime": "^7.20.13", - "chalk": "^4.1.0", "cosmiconfig": "^8.0.0", "jest-validate": "^29.4.3", - "jiti": "^1.17.1", - "lodash.get": "^4.4.2" + "jiti": "^2.5.1", + "picocolors": "^1.1.1" }, "engines": { - "node": ">=16.0.0" + "node": ">=20.0.0" + } + }, + "node_modules/@lingui/conf/node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "devOptional": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" } }, "node_modules/@lingui/core": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@lingui/core/-/core-4.14.0.tgz", - "integrity": "sha512-rsuBKG3mupWpfP5RYacufu0ToavrqgFPnEI/zOcuvMNL24IlZ38O2/P3POZCEA8XCyhON70FICy8xs3ZvQ+uWg==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@lingui/core/-/core-5.8.0.tgz", + "integrity": "sha512-YHl7ej5jgQqCjvFWVQBWZY46SSROycHDx760KE1iOxp4dpzAAwHeKbXxERz3Tgu+o+aIIY2Pg3G9GLeOGiFaWA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.20.13", - "@lingui/message-utils": "4.14.0", - "unraw": "^3.0.0" + "@lingui/message-utils": "5.8.0" }, "engines": { - "node": ">=16.0.0" + "node": ">=20.0.0" + }, + "peerDependencies": { + "@lingui/babel-plugin-lingui-macro": "5.8.0", + "babel-plugin-macros": "2 || 3" + }, + "peerDependenciesMeta": { + "@lingui/babel-plugin-lingui-macro": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } } }, "node_modules/@lingui/format-po": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@lingui/format-po/-/format-po-4.14.0.tgz", - "integrity": "sha512-3Bmk9f7lRuBoZsBG5c5hq5ipgAqeux+nDVnAIXSfsp4f8jj+z+cHwW0xuHcW48mHQFwfcTGAYZcKnwhuwwut6Q==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@lingui/format-po/-/format-po-5.8.0.tgz", + "integrity": "sha512-7/nf1dccWia+qz+1uVvzB5ov/+6YOg4rYXwRfVi1uoVk1D0002slGaytk9rva17g/ENH8poJgf/pJ0tey3ngKw==", "dev": true, "license": "MIT", "dependencies": { - "@lingui/conf": "4.14.0", - "@lingui/message-utils": "4.14.0", + "@lingui/conf": "5.8.0", + "@lingui/message-utils": "5.8.0", "date-fns": "^3.6.0", "pofile": "^1.1.4" }, "engines": { - "node": ">=16.0.0" + "node": ">=20.0.0" } }, "node_modules/@lingui/macro": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@lingui/macro/-/macro-4.14.0.tgz", - "integrity": "sha512-zZNPYVwCMvKcDtaPzYDhkfogbUMEKCsCEIqvXrKI2DujLjV7DWGJ97U99h9iGDeBrEIZqFHnimsAwbb2lfRPaQ==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@lingui/macro/-/macro-5.8.0.tgz", + "integrity": "sha512-7VGhw7ADQxy1z78VS9DH1I1yA9ihsC3r3Jq+UDkgbCZGDKxrSgCUI9Cw/5IvvqIzxUkA/ZIa7zYOLGn1HvMhUA==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.20.13", - "@babel/types": "^7.20.7", - "@lingui/conf": "4.14.0", - "@lingui/core": "4.14.0", - "@lingui/message-utils": "4.14.0" + "@lingui/core": "5.8.0", + "@lingui/react": "5.8.0" }, "engines": { - "node": ">=16.0.0" + "node": ">=20.0.0" }, "peerDependencies": { - "@lingui/react": "^4.0.0", + "@lingui/babel-plugin-lingui-macro": "5.8.0", "babel-plugin-macros": "2 || 3" + }, + "peerDependenciesMeta": { + "@lingui/babel-plugin-lingui-macro": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } } }, "node_modules/@lingui/message-utils": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@lingui/message-utils/-/message-utils-4.14.0.tgz", - "integrity": "sha512-izZod/6P2cXtqZt06r+VcbG3oCskPY8A1dVA8hyx0UZBCaufrZk6NgzCMYTMRXyOuXt6MafQyUfBJSrE4n3FIw==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@lingui/message-utils/-/message-utils-5.8.0.tgz", + "integrity": "sha512-w6GtFPnd3QDsRHFvsITcflueeB/lLusB7tmwhXt9Vo3RV1ffRmCraAbVS1+iuRYTDC/Yq35UyweHwMG7Q2nAYw==", "license": "MIT", "dependencies": { "@messageformat/parser": "^5.0.0", "js-sha256": "^0.10.1" }, "engines": { - "node": ">=16.0.0" + "node": ">=20.0.0" } }, "node_modules/@lingui/react": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@lingui/react/-/react-4.14.0.tgz", - "integrity": "sha512-20gk22E3RZar4Wcdt/gBtHfi1UZTQvEX5XaCDZF9iAyIlwIWxA+eTquNwg08tYl4Ne6o8jjUGEWcNBJ3ZnlXhg==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@lingui/react/-/react-5.8.0.tgz", + "integrity": "sha512-AHlXR12D6b6JDYcsTr7raWXlB6+tc8W/IJsQJDUXtfbLebR5IADrC94B0dKVAXwHiOh6rDGvAUTecFJbP7F3YA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.20.13", - "@lingui/core": "4.14.0" + "@lingui/core": "5.8.0" }, "engines": { - "node": ">=16.0.0" + "node": ">=20.0.0" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + "@lingui/babel-plugin-lingui-macro": "5.8.0", + "babel-plugin-macros": "2 || 3", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@lingui/babel-plugin-lingui-macro": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } } }, "node_modules/@lingui/vite-plugin": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@lingui/vite-plugin/-/vite-plugin-4.14.0.tgz", - "integrity": "sha512-1UilkYXIA8xfexlndsbsfS7AQi0Qm0VRSf92DWw5YCACFuk8Exb1su/CYrQu/YWk0MfcDY6/7rJDEOPWGgBRWA==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@lingui/vite-plugin/-/vite-plugin-5.8.0.tgz", + "integrity": "sha512-rtFuyoZmUKyT6NVwkrSGJz8fdrgmNHCXn6KWRwqPE3/4PH+9MQnFy9LbgLB2uu4QuusX4gP5vEaeG/yM3JD8xw==", "dev": true, "license": "MIT", "dependencies": { - "@lingui/cli": "4.14.0", - "@lingui/conf": "4.14.0" + "@lingui/cli": "5.8.0", + "@lingui/conf": "5.8.0" }, "engines": { - "node": ">=16.0.0" + "node": ">=20.0.0" }, "peerDependencies": { - "vite": "^3 || ^4 || ^5.0.9" + "vite": "^3 || ^4 || ^5.0.9 || ^6 || ^7" } }, "node_modules/@lit-labs/ssr-dom-shim": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.4.0.tgz", - "integrity": "sha512-ficsEARKnmmW5njugNYKipTm4SFnbik7CXtoencDZzmzo/dQ+2Q0bgkzJuoJP20Aj0F+izzJjOqsnkd6F/o1bw==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.5.1.tgz", + "integrity": "sha512-Aou5UdlSpr5whQe8AA/bZG0jMj96CoJIWbGfZ91qieWu5AWUMKw8VR/pAkQkJYvBNhmCcWnZlyyk5oze8JIqYA==", "license": "BSD-3-Clause" }, "node_modules/@lit/reactive-element": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-2.1.1.tgz", - "integrity": "sha512-N+dm5PAYdQ8e6UlywyyrgI2t++wFGXfHx+dSJ1oBrg6FAxUj40jId++EaRm80MKX5JnlH1sBsyZ5h0bcZKemCg==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-2.1.2.tgz", + "integrity": "sha512-pbCDiVMnne1lYUIaYNN5wrwQXDtHaYtg7YEFPeW+hws6U47WeFvISGUWekPGKWOP1ygrs0ef0o1VJMk1exos5A==", "license": "BSD-3-Clause", "dependencies": { - "@lit-labs/ssr-dom-shim": "^1.4.0" + "@lit-labs/ssr-dom-shim": "^1.5.0" } }, "node_modules/@locator/babel-jsx": { @@ -4699,9 +4529,9 @@ } }, "node_modules/@metamask/eth-json-rpc-provider/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -4710,6 +4540,15 @@ "node": ">=10" } }, + "node_modules/@metamask/eth-json-rpc-provider/node_modules/superstruct": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-1.0.4.tgz", + "integrity": "sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@metamask/eth-json-rpc-provider/node_modules/uuid": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", @@ -4791,9 +4630,9 @@ } }, "node_modules/@metamask/json-rpc-engine/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -4851,9 +4690,9 @@ } }, "node_modules/@metamask/json-rpc-middleware-stream/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -4986,9 +4825,9 @@ } }, "node_modules/@metamask/providers/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -5154,9 +4993,9 @@ } }, "node_modules/@metamask/utils": { - "version": "11.8.1", - "resolved": "https://registry.npmjs.org/@metamask/utils/-/utils-11.8.1.tgz", - "integrity": "sha512-DIbsNUyqWLFgqJlZxi1OOCMYvI23GqFCvNJAtzv8/WXWzJfnJnvp1M24j7VvUe3URBi3S86UgQ7+7aWU9p/cnQ==", + "version": "11.9.0", + "resolved": "https://registry.npmjs.org/@metamask/utils/-/utils-11.9.0.tgz", + "integrity": "sha512-wRnoSDD9jTWOge/+reFviJQANhS+uy8Y+OEwRanp5mQeGTjBFmK1r2cTOnei2UCZRV1crXHzeJVSFEoDDcgRbA==", "license": "ISC", "dependencies": { "@ethereumjs/tx": "^4.2.0", @@ -5176,9 +5015,9 @@ } }, "node_modules/@metamask/utils/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -5200,44 +5039,6 @@ "uuid": "dist/bin/uuid" } }, - "node_modules/@multiformats/dns": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@multiformats/dns/-/dns-1.0.6.tgz", - "integrity": "sha512-nt/5UqjMPtyvkG9BQYdJ4GfLK3nMqGpFZOzf4hAmIa0sJh2LlS9YKXZ4FgwBDsaHvzZqR/rUFIywIc7pkHNNuw==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@types/dns-packet": "^5.6.5", - "buffer": "^6.0.3", - "dns-packet": "^5.6.1", - "hashlru": "^2.3.0", - "p-queue": "^8.0.1", - "progress-events": "^1.0.0", - "uint8arrays": "^5.0.2" - } - }, - "node_modules/@multiformats/multiaddr": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.4.0.tgz", - "integrity": "sha512-FL7yBTLijJ5JkO044BGb2msf+uJLrwpD6jD6TkXlbjA9N12+18HT40jvd4o5vL4LOJMc86dPX6tGtk/uI9kYKg==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@chainsafe/is-ip": "^2.0.1", - "@chainsafe/netmask": "^2.0.0", - "@multiformats/dns": "^1.0.3", - "multiformats": "^13.0.0", - "uint8-varint": "^2.0.1", - "uint8arrays": "^5.0.0" - } - }, - "node_modules/@multiformats/multiaddr-to-uri": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@multiformats/multiaddr-to-uri/-/multiaddr-to-uri-11.0.0.tgz", - "integrity": "sha512-9RNmlIGwZbBLsHekT50dbt4o4u8Iciw9kGjv+WHiGxQdsJ6xKKjU1+C0Vbas6RilMbaVOAOnEyfNcXbUmTkLxQ==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@multiformats/multiaddr": "^12.3.0" - } - }, "node_modules/@next/env": { "version": "15.3.5", "resolved": "https://registry.npmjs.org/@next/env/-/env-15.3.5.tgz", @@ -5482,13 +5283,13 @@ } }, "node_modules/@playwright/test": { - "version": "1.51.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.51.1.tgz", - "integrity": "sha512-nM+kEaTSAoVlXmMPH10017vn3FSiFqr/bh4fKg9vmAdMfd9SDqRZNvPSiAHADc/itWak+qPvMPZQOPwCBW7k7Q==", + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.57.0.tgz", + "integrity": "sha512-6TyEnHgd6SArQO8UO2OMTxshln3QMWBtPGrOCgs3wVEmQmwyuNtB10IZMfmYDE0riwNR1cu4q+pPcxMVtaG3TA==", "devOptional": true, "license": "Apache-2.0", "dependencies": { - "playwright": "1.51.1" + "playwright": "1.57.0" }, "bin": { "playwright": "cli.js" @@ -5508,9 +5309,9 @@ } }, "node_modules/@poppinss/colors": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@poppinss/colors/-/colors-4.1.5.tgz", - "integrity": "sha512-FvdDqtcRCtz6hThExcFOgW0cWX+xwSMWcRuQe5ZEb2m7cVQOAVZOIMt+/v9RxGiD9/OY16qJBXK4CVKWAPalBw==", + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@poppinss/colors/-/colors-4.1.6.tgz", + "integrity": "sha512-H9xkIdFswbS8n1d6vmRd8+c10t2Qe+rZITbbDHHkQixH5+2x1FDGmi/0K+WgWiqQFKPSlIYB7jlH6Kpfn6Fleg==", "dev": true, "license": "MIT", "dependencies": { @@ -5543,32 +5344,32 @@ } }, "node_modules/@poppinss/exception": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@poppinss/exception/-/exception-1.2.2.tgz", - "integrity": "sha512-m7bpKCD4QMlFCjA/nKTs23fuvoVFoA83brRKmObCUNmi/9tVu8Ve3w4YQAnJu4q3Tjf5fr685HYIC/IA2zHRSg==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@poppinss/exception/-/exception-1.2.3.tgz", + "integrity": "sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw==", "dev": true, "license": "MIT" }, "node_modules/@radix-ui/number": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.0.tgz", - "integrity": "sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz", + "integrity": "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==", "license": "MIT" }, "node_modules/@radix-ui/primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.1.tgz", - "integrity": "sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", + "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", "license": "MIT" }, "node_modules/@radix-ui/react-accordion": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.11.tgz", - "integrity": "sha512-l3W5D54emV2ues7jjeG1xcyN7S3jnK3zE2zHqgn0CmMsy9lNJwmgcrmaxS+7ipw15FAivzKNzH3d5EcGoFKw0A==", + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.12.tgz", + "integrity": "sha512-T4nygeh9YE9dLRPhAHSeOZi7HBXo+0kYIPJXayZfvWOWA0+n3dESrZbjfDPUABkUNym6Hd+f2IR113To8D2GPA==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-collapsible": "1.1.11", + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collapsible": "1.1.12", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", @@ -5592,22 +5393,28 @@ } } }, - "node_modules/@radix-ui/react-accordion/node_modules/@radix-ui/primitive": { + "node_modules/@radix-ui/react-accordion/node_modules/@radix-ui/react-context": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.2.tgz", - "integrity": "sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA==", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", + "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } }, - "node_modules/@radix-ui/react-accordion/node_modules/@radix-ui/react-collection": { + "node_modules/@radix-ui/react-arrow": { "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz", - "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz", + "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==", "license": "MIT", "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3" + "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", @@ -5624,76 +5431,70 @@ } } }, - "node_modules/@radix-ui/react-accordion/node_modules/@radix-ui/react-compose-refs": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", - "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", + "node_modules/@radix-ui/react-avatar": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.1.11.tgz", + "integrity": "sha512-0Qk603AHGV28BOBO34p7IgD5m+V5Sg/YovfayABkoDDBM5d3NCx0Mp4gGrjzLGes1jV5eNOE1r3itqOR33VC6Q==", "license": "MIT", + "dependencies": { + "@radix-ui/react-context": "1.1.3", + "@radix-ui/react-primitive": "2.1.4", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-is-hydrated": "0.1.0", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, "peerDependencies": { "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { "optional": true - } - } - }, - "node_modules/@radix-ui/react-accordion/node_modules/@radix-ui/react-context": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", - "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-accordion/node_modules/@radix-ui/react-direction": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz", - "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { + }, + "@types/react-dom": { "optional": true } } }, - "node_modules/@radix-ui/react-accordion/node_modules/@radix-ui/react-id": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", - "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", + "node_modules/@radix-ui/react-avatar/node_modules/@radix-ui/react-primitive": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", + "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", "license": "MIT", "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.1" + "@radix-ui/react-slot": "1.2.4" }, "peerDependencies": { "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { "optional": true + }, + "@types/react-dom": { + "optional": true } } }, - "node_modules/@radix-ui/react-accordion/node_modules/@radix-ui/react-primitive": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", - "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "node_modules/@radix-ui/react-checkbox": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.3.3.tgz", + "integrity": "sha512-wBbpv+NQftHDdG86Qc0pIyXk5IR3tM8Vd0nWLKDcX8nNn4nXFOFwsKuqw2okA/1D/mpaAkmuyndrPJTYDNZtFw==", "license": "MIT", "dependencies": { - "@radix-ui/react-slot": "1.2.3" + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-use-size": "1.1.1" }, "peerDependencies": { "@types/react": "*", @@ -5710,14 +5511,11 @@ } } }, - "node_modules/@radix-ui/react-accordion/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "node_modules/@radix-ui/react-checkbox/node_modules/@radix-ui/react-context": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", + "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" @@ -5728,29 +5526,40 @@ } } }, - "node_modules/@radix-ui/react-accordion/node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", - "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", + "node_modules/@radix-ui/react-collapsible": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.12.tgz", + "integrity": "sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA==", "license": "MIT", "dependencies": { - "@radix-ui/react-use-effect-event": "0.0.2", + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { "optional": true + }, + "@types/react-dom": { + "optional": true } } }, - "node_modules/@radix-ui/react-accordion/node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", - "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", + "node_modules/@radix-ui/react-collapsible/node_modules/@radix-ui/react-context": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", + "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -5762,13 +5571,16 @@ } } }, - "node_modules/@radix-ui/react-arrow": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.2.tgz", - "integrity": "sha512-G+KcpzXHq24iH0uGG/pF8LyzpFJYGD4RfLjCIBfGdSLXvjLHST31RUiRVrupIBMvIppMgSzQ6l66iAxl03tdlg==", + "node_modules/@radix-ui/react-collection": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz", + "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.0.2" + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", @@ -5785,69 +5597,40 @@ } } }, - "node_modules/@radix-ui/react-avatar": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.1.3.tgz", - "integrity": "sha512-Paen00T4P8L8gd9bNsRMw7Cbaz85oxiv+hzomsRZgFm2byltPFDtfcoqlWJ8GyZlIBWgLssJlzLCnKU0G0302g==", + "node_modules/@radix-ui/react-collection/node_modules/@radix-ui/react-context": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", + "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", "license": "MIT", - "dependencies": { - "@radix-ui/react-context": "1.1.1", - "@radix-ui/react-primitive": "2.0.2", - "@radix-ui/react-use-callback-ref": "1.1.0", - "@radix-ui/react-use-layout-effect": "1.1.0" - }, "peerDependencies": { "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { "optional": true - }, - "@types/react-dom": { - "optional": true } } }, - "node_modules/@radix-ui/react-checkbox": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.3.2.tgz", - "integrity": "sha512-yd+dI56KZqawxKZrJ31eENUwqc1QSqg4OZ15rybGjF2ZNwMO+wCyHzAVLRp9qoYJf7kYy0YpZ2b0JCzJ42HZpA==", + "node_modules/@radix-ui/react-collection/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-presence": "1.1.4", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-previous": "1.1.1", - "@radix-ui/react-use-size": "1.1.1" + "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { "optional": true - }, - "@types/react-dom": { - "optional": true } } }, - "node_modules/@radix-ui/react-checkbox/node_modules/@radix-ui/primitive": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.2.tgz", - "integrity": "sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA==", - "license": "MIT" - }, - "node_modules/@radix-ui/react-checkbox/node_modules/@radix-ui/react-compose-refs": { + "node_modules/@radix-ui/react-compose-refs": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", @@ -5862,10 +5645,10 @@ } } }, - "node_modules/@radix-ui/react-checkbox/node_modules/@radix-ui/react-context": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", - "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", + "node_modules/@radix-ui/react-context": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.3.tgz", + "integrity": "sha512-ieIFACdMpYfMEjF0rEf5KLvfVyIkOz6PDGyNnP+u+4xQ6jny3VCgA4OgXOwNx2aUkxn8zx9fiVcM8CfFYv9Lxw==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -5877,14 +5660,26 @@ } } }, - "node_modules/@radix-ui/react-checkbox/node_modules/@radix-ui/react-presence": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.4.tgz", - "integrity": "sha512-ueDqRbdc4/bkaQT3GIpLQssRlFgWaL/U2z/S31qRwwLWoxHLgry3SIfCwhxeQNbirEUXFa+lq3RL3oBYXtcmIA==", + "node_modules/@radix-ui/react-dialog": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz", + "integrity": "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==", "license": "MIT", "dependencies": { + "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-use-layout-effect": "1.1.1" + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", @@ -5901,30 +5696,22 @@ } } }, - "node_modules/@radix-ui/react-checkbox/node_modules/@radix-ui/react-primitive": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", - "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-context": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", + "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.3" - }, "peerDependencies": { "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { "optional": true - }, - "@types/react-dom": { - "optional": true } } }, - "node_modules/@radix-ui/react-checkbox/node_modules/@radix-ui/react-slot": { + "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-slot": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", @@ -5942,44 +5729,10 @@ } } }, - "node_modules/@radix-ui/react-checkbox/node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", - "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-effect-event": "0.0.2", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-checkbox/node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", - "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-checkbox/node_modules/@radix-ui/react-use-previous": { + "node_modules/@radix-ui/react-direction": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.1.tgz", - "integrity": "sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz", + "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -5991,38 +5744,46 @@ } } }, - "node_modules/@radix-ui/react-checkbox/node_modules/@radix-ui/react-use-size": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz", - "integrity": "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==", + "node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz", + "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==", "license": "MIT", "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.1" + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-escape-keydown": "1.1.1" }, "peerDependencies": { "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { "optional": true + }, + "@types/react-dom": { + "optional": true } } }, - "node_modules/@radix-ui/react-collapsible": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.11.tgz", - "integrity": "sha512-2qrRsVGSCYasSz1RFOorXwl0H7g7J1frQtgpQgYrt+MOidtPAINHn9CPovQXb83r8ahapdx3Tu0fa/pdFFSdPg==", + "node_modules/@radix-ui/react-dropdown-menu": { + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.16.tgz", + "integrity": "sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.2", + "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-presence": "1.1.4", + "@radix-ui/react-menu": "2.1.16", "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-layout-effect": "1.1.1" + "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", @@ -6039,16 +5800,10 @@ } } }, - "node_modules/@radix-ui/react-collapsible/node_modules/@radix-ui/primitive": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.2.tgz", - "integrity": "sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA==", - "license": "MIT" - }, - "node_modules/@radix-ui/react-collapsible/node_modules/@radix-ui/react-compose-refs": { + "node_modules/@radix-ui/react-dropdown-menu/node_modules/@radix-ui/react-context": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", - "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", + "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -6060,10 +5815,10 @@ } } }, - "node_modules/@radix-ui/react-collapsible/node_modules/@radix-ui/react-context": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", - "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz", + "integrity": "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -6075,32 +5830,46 @@ } } }, - "node_modules/@radix-ui/react-collapsible/node_modules/@radix-ui/react-id": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", - "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", + "node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz", + "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==", "license": "MIT", "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.1" + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1" }, "peerDependencies": { "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { "optional": true + }, + "@types/react-dom": { + "optional": true } } }, - "node_modules/@radix-ui/react-collapsible/node_modules/@radix-ui/react-presence": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.4.tgz", - "integrity": "sha512-ueDqRbdc4/bkaQT3GIpLQssRlFgWaL/U2z/S31qRwwLWoxHLgry3SIfCwhxeQNbirEUXFa+lq3RL3oBYXtcmIA==", + "node_modules/@radix-ui/react-hover-card": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-hover-card/-/react-hover-card-1.1.15.tgz", + "integrity": "sha512-qgTkjNT1CfKMoP0rcasmlH2r1DAiYicWsDsufxl940sT2wHNEWWv6FMWIQXWhVdmC1d/HYfbhQx60KYyAtKxjg==", "license": "MIT", "dependencies": { + "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-use-layout-effect": "1.1.1" + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", @@ -6117,36 +5886,28 @@ } } }, - "node_modules/@radix-ui/react-collapsible/node_modules/@radix-ui/react-primitive": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", - "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "node_modules/@radix-ui/react-hover-card/node_modules/@radix-ui/react-context": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", + "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.3" - }, "peerDependencies": { "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { "optional": true - }, - "@types/react-dom": { - "optional": true } } }, - "node_modules/@radix-ui/react-collapsible/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "node_modules/@radix-ui/react-id": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", + "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", "license": "MIT", "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" + "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", @@ -6158,50 +5919,76 @@ } } }, - "node_modules/@radix-ui/react-collapsible/node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", - "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", + "node_modules/@radix-ui/react-label": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.8.tgz", + "integrity": "sha512-FmXs37I6hSBVDlO4y764TNz1rLgKwjJMQ0EGte6F3Cb3f4bIuHB/iLa/8I9VKkmOy+gNHq8rql3j686ACVV21A==", "license": "MIT", "dependencies": { - "@radix-ui/react-use-effect-event": "0.0.2", - "@radix-ui/react-use-layout-effect": "1.1.1" + "@radix-ui/react-primitive": "2.1.4" }, "peerDependencies": { "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { "optional": true + }, + "@types/react-dom": { + "optional": true } } }, - "node_modules/@radix-ui/react-collapsible/node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", - "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", + "node_modules/@radix-ui/react-label/node_modules/@radix-ui/react-primitive": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", + "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.4" + }, "peerDependencies": { "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { "optional": true + }, + "@types/react-dom": { + "optional": true } } }, - "node_modules/@radix-ui/react-collection": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.2.tgz", - "integrity": "sha512-9z54IEKRxIa9VityapoEYMuByaG42iSy1ZXlY2KcuLSEtq8x4987/N6m15ppoMffgZX72gER2uHe1D9Y6Unlcw==", + "node_modules/@radix-ui/react-menu": { + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.16.tgz", + "integrity": "sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg==", "license": "MIT", "dependencies": { - "@radix-ui/react-compose-refs": "1.1.1", - "@radix-ui/react-context": "1.1.1", - "@radix-ui/react-primitive": "2.0.2", - "@radix-ui/react-slot": "1.1.2" + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", @@ -6218,10 +6005,10 @@ } } }, - "node_modules/@radix-ui/react-compose-refs": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.1.tgz", - "integrity": "sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw==", + "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-context": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", + "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -6233,11 +6020,14 @@ } } }, - "node_modules/@radix-ui/react-context": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.1.tgz", - "integrity": "sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==", + "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" @@ -6248,26 +6038,26 @@ } } }, - "node_modules/@radix-ui/react-dialog": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.14.tgz", - "integrity": "sha512-+CpweKjqpzTmwRwcYECQcNYbI8V9VSQt0SNFKeEBLgfucbsLssU6Ppq7wUdNXEGb573bMjFhVjKVll8rmV6zMw==", + "node_modules/@radix-ui/react-navigation-menu": { + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.14.tgz", + "integrity": "sha512-YB9mTFQvCOAQMHU+C/jVl96WmuWeltyUEpRJJky51huhds5W2FQr1J8D/16sQlf0ozxkPK8uF3niQMdUwZPv5w==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.2", + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.10", - "@radix-ui/react-focus-guards": "1.1.2", - "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.11", "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.4", + "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2", - "aria-hidden": "^1.2.4", - "react-remove-scroll": "^2.6.3" + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-visually-hidden": "1.2.3" }, "peerDependencies": { "@types/react": "*", @@ -6284,28 +6074,7 @@ } } }, - "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/primitive": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.2.tgz", - "integrity": "sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA==", - "license": "MIT" - }, - "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-compose-refs": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", - "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-context": { + "node_modules/@radix-ui/react-navigation-menu/node_modules/@radix-ui/react-context": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", @@ -6320,17 +6089,27 @@ } } }, - "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.10.tgz", - "integrity": "sha512-IM1zzRV4W3HtVgftdQiiOmA0AdJlCtMLe00FXaHwgt3rAnNsIyDqshvkIW3hj/iu5hu8ERP7KIYki6NkqDxAwQ==", + "node_modules/@radix-ui/react-popover": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.15.tgz", + "integrity": "sha512-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.2", + "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-escape-keydown": "1.1.1" + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", @@ -6347,10 +6126,10 @@ } } }, - "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-focus-guards": { + "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-context": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.2.tgz", - "integrity": "sha512-fyjAACV62oPV925xFCrH8DR5xWhg9KYtJT4s3u54jxp+L/hbpTY2kIeEFFbFe+a/HCE94zGQMZLIpVTPVZDhaA==", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", + "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -6362,15 +6141,40 @@ } } }, - "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-focus-scope": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz", - "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==", + "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popper": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.8.tgz", + "integrity": "sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==", "license": "MIT", "dependencies": { + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1" + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-rect": "1.1.1", + "@radix-ui/react-use-size": "1.1.1", + "@radix-ui/rect": "1.1.1" }, "peerDependencies": { "@types/react": "*", @@ -6387,14 +6191,11 @@ } } }, - "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-id": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", - "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", + "node_modules/@radix-ui/react-popper/node_modules/@radix-ui/react-context": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", + "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.1" - }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" @@ -6405,7 +6206,7 @@ } } }, - "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-portal": { + "node_modules/@radix-ui/react-portal": { "version": "1.1.9", "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", @@ -6429,10 +6230,10 @@ } } }, - "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-presence": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.4.tgz", - "integrity": "sha512-ueDqRbdc4/bkaQT3GIpLQssRlFgWaL/U2z/S31qRwwLWoxHLgry3SIfCwhxeQNbirEUXFa+lq3RL3oBYXtcmIA==", + "node_modules/@radix-ui/react-presence": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz", + "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==", "license": "MIT", "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", @@ -6453,7 +6254,7 @@ } } }, - "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-primitive": { + "node_modules/@radix-ui/react-primitive": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", @@ -6476,7 +6277,7 @@ } } }, - "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-slot": { + "node_modules/@radix-ui/react-primitive/node_modules/@radix-ui/react-slot": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", @@ -6494,62 +6295,88 @@ } } }, - "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-callback-ref": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", - "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", + "node_modules/@radix-ui/react-progress": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.1.8.tgz", + "integrity": "sha512-+gISHcSPUJ7ktBy9RnTqbdKW78bcGke3t6taawyZ71pio1JewwGSJizycs7rLhGTvMJYCQB1DBK4KQsxs7U8dA==", "license": "MIT", + "dependencies": { + "@radix-ui/react-context": "1.1.3", + "@radix-ui/react-primitive": "2.1.4" + }, "peerDependencies": { "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { "optional": true + }, + "@types/react-dom": { + "optional": true } } }, - "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", - "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", + "node_modules/@radix-ui/react-progress/node_modules/@radix-ui/react-primitive": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", + "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", "license": "MIT", "dependencies": { - "@radix-ui/react-use-effect-event": "0.0.2", - "@radix-ui/react-use-layout-effect": "1.1.1" + "@radix-ui/react-slot": "1.2.4" }, "peerDependencies": { "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { "optional": true + }, + "@types/react-dom": { + "optional": true } } }, - "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-escape-keydown": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz", - "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==", + "node_modules/@radix-ui/react-roving-focus": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.11.tgz", + "integrity": "sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==", "license": "MIT", "dependencies": { - "@radix-ui/react-use-callback-ref": "1.1.1" + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { "optional": true + }, + "@types/react-dom": { + "optional": true } } }, - "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", - "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", + "node_modules/@radix-ui/react-roving-focus/node_modules/@radix-ui/react-context": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", + "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -6561,61 +6388,79 @@ } } }, - "node_modules/@radix-ui/react-direction": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.0.tgz", - "integrity": "sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==", + "node_modules/@radix-ui/react-scroll-area": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.10.tgz", + "integrity": "sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A==", "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.1", + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, "peerDependencies": { "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { "optional": true + }, + "@types/react-dom": { + "optional": true } } }, - "node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.5.tgz", - "integrity": "sha512-E4TywXY6UsXNRhFrECa5HAvE5/4BFcGyfTyK36gP+pAW1ed7UTK4vKwdr53gAJYwqbfCWC6ATvJa3J3R/9+Qrg==", + "node_modules/@radix-ui/react-scroll-area/node_modules/@radix-ui/react-context": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", + "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.1", - "@radix-ui/react-compose-refs": "1.1.1", - "@radix-ui/react-primitive": "2.0.2", - "@radix-ui/react-use-callback-ref": "1.1.0", - "@radix-ui/react-use-escape-keydown": "1.1.0" - }, "peerDependencies": { "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { "optional": true - }, - "@types/react-dom": { - "optional": true } } }, - "node_modules/@radix-ui/react-dropdown-menu": { - "version": "2.1.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.15.tgz", - "integrity": "sha512-mIBnOjgwo9AH3FyKaSWoSu/dYj6VdhJ7frEPiGTeXCdUFHjl9h3mFh2wwhEtINOmYXWhdpf1rY2minFsmaNgVQ==", + "node_modules/@radix-ui/react-select": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.2.6.tgz", + "integrity": "sha512-I30RydO+bnn2PQztvo25tswPH+wFBjehVGtmagkU78yMdwTwVf12wnAOF+AeP8S2N8xD+5UPbGhkUfPyvT+mwQ==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.2", + "@radix-ui/number": "1.1.1", + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-menu": "2.1.15", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2" + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-visually-hidden": "1.2.3", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", @@ -6632,28 +6477,7 @@ } } }, - "node_modules/@radix-ui/react-dropdown-menu/node_modules/@radix-ui/primitive": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.2.tgz", - "integrity": "sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA==", - "license": "MIT" - }, - "node_modules/@radix-ui/react-dropdown-menu/node_modules/@radix-ui/react-compose-refs": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", - "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dropdown-menu/node_modules/@radix-ui/react-context": { + "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-context": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", @@ -6668,13 +6492,13 @@ } } }, - "node_modules/@radix-ui/react-dropdown-menu/node_modules/@radix-ui/react-id": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", - "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", + "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", "license": "MIT", "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.1" + "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", @@ -6686,13 +6510,13 @@ } } }, - "node_modules/@radix-ui/react-dropdown-menu/node_modules/@radix-ui/react-primitive": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", - "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "node_modules/@radix-ui/react-separator": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.8.tgz", + "integrity": "sha512-sDvqVY4itsKwwSMEe0jtKgfTh+72Sy3gPmQpjqcQneqQ4PFmr/1I0YA+2/puilhggCe2gJcx5EBAYFkWkdpa5g==", "license": "MIT", "dependencies": { - "@radix-ui/react-slot": "1.2.3" + "@radix-ui/react-primitive": "2.1.4" }, "peerDependencies": { "@types/react": "*", @@ -6709,47 +6533,66 @@ } } }, - "node_modules/@radix-ui/react-dropdown-menu/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-primitive": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", + "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", "license": "MIT", "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" + "@radix-ui/react-slot": "1.2.4" }, "peerDependencies": { "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { "optional": true + }, + "@types/react-dom": { + "optional": true } } }, - "node_modules/@radix-ui/react-dropdown-menu/node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", - "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", + "node_modules/@radix-ui/react-slider": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.3.6.tgz", + "integrity": "sha512-JPYb1GuM1bxfjMRlNLE+BcmBC8onfCi60Blk7OBqi2MLTFdS+8401U4uFjnwkOr49BLmXxLC6JHkvAsx5OJvHw==", "license": "MIT", "dependencies": { - "@radix-ui/react-use-effect-event": "0.0.2", - "@radix-ui/react-use-layout-effect": "1.1.1" + "@radix-ui/number": "1.1.1", + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-use-size": "1.1.1" }, "peerDependencies": { "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { "optional": true + }, + "@types/react-dom": { + "optional": true } } }, - "node_modules/@radix-ui/react-dropdown-menu/node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", - "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", + "node_modules/@radix-ui/react-slider/node_modules/@radix-ui/react-context": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", + "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -6761,11 +6604,14 @@ } } }, - "node_modules/@radix-ui/react-focus-guards": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.2.tgz", - "integrity": "sha512-fyjAACV62oPV925xFCrH8DR5xWhg9KYtJT4s3u54jxp+L/hbpTY2kIeEFFbFe+a/HCE94zGQMZLIpVTPVZDhaA==", + "node_modules/@radix-ui/react-slot": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.4.tgz", + "integrity": "sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==", "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" @@ -6776,15 +6622,19 @@ } } }, - "node_modules/@radix-ui/react-focus-scope": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz", - "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==", + "node_modules/@radix-ui/react-switch": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.2.6.tgz", + "integrity": "sha512-bByzr1+ep1zk4VubeEVViV592vu2lHE2BZY5OnzehZqOOgogN80+mNtCqPkhn2gklJqOpxWgPoYTSnhBCqpOXQ==", "license": "MIT", "dependencies": { + "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1" + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-use-size": "1.1.1" }, "peerDependencies": { "@types/react": "*", @@ -6801,10 +6651,10 @@ } } }, - "node_modules/@radix-ui/react-focus-scope/node_modules/@radix-ui/react-compose-refs": { + "node_modules/@radix-ui/react-switch/node_modules/@radix-ui/react-context": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", - "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", + "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -6816,13 +6666,20 @@ } } }, - "node_modules/@radix-ui/react-focus-scope/node_modules/@radix-ui/react-primitive": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", - "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "node_modules/@radix-ui/react-tabs": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.13.tgz", + "integrity": "sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==", "license": "MIT", "dependencies": { - "@radix-ui/react-slot": "1.2.3" + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", @@ -6839,14 +6696,11 @@ } } }, - "node_modules/@radix-ui/react-focus-scope/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "node_modules/@radix-ui/react-tabs/node_modules/@radix-ui/react-context": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", + "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" @@ -6857,36 +6711,44 @@ } } }, - "node_modules/@radix-ui/react-focus-scope/node_modules/@radix-ui/react-use-callback-ref": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", - "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", + "node_modules/@radix-ui/react-toggle": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.1.10.tgz", + "integrity": "sha512-lS1odchhFTeZv3xwHH31YPObmJn8gOg7Lq12inrr0+BH/l3Tsq32VfjqH1oh80ARM3mlkfMic15n0kg4sD1poQ==", "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, "peerDependencies": { "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { "optional": true + }, + "@types/react-dom": { + "optional": true } } }, - "node_modules/@radix-ui/react-hover-card": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-hover-card/-/react-hover-card-1.1.6.tgz", - "integrity": "sha512-E4ozl35jq0VRlrdc4dhHrNSV0JqBb4Jy73WAhBEK7JoYnQ83ED5r0Rb/XdVKw89ReAJN38N492BAPBZQ57VmqQ==", + "node_modules/@radix-ui/react-toggle-group": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.1.11.tgz", + "integrity": "sha512-5umnS0T8JQzQT6HbPyO7Hh9dgd82NmS36DQr+X/YJ9ctFNCiiQd6IJAYYZ33LUwm8M+taCz5t2ui29fHZc4Y6Q==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.1", - "@radix-ui/react-compose-refs": "1.1.1", - "@radix-ui/react-context": "1.1.1", - "@radix-ui/react-dismissable-layer": "1.1.5", - "@radix-ui/react-popper": "1.2.2", - "@radix-ui/react-portal": "1.1.4", - "@radix-ui/react-presence": "1.1.2", - "@radix-ui/react-primitive": "2.0.2", - "@radix-ui/react-use-controllable-state": "1.1.0" + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-toggle": "1.1.10", + "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", @@ -6903,14 +6765,11 @@ } } }, - "node_modules/@radix-ui/react-id": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.0.tgz", - "integrity": "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==", + "node_modules/@radix-ui/react-toggle-group/node_modules/@radix-ui/react-context": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", + "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.0" - }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" @@ -6921,13 +6780,24 @@ } } }, - "node_modules/@radix-ui/react-label": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.2.tgz", - "integrity": "sha512-zo1uGMTaNlHehDyFQcDZXRJhUPDuukcnHz0/jnrup0JA6qL+AFpAnty+7VKa9esuU5xTblAZzTGYJKSKaBxBhw==", + "node_modules/@radix-ui/react-tooltip": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.8.tgz", + "integrity": "sha512-tY7sVt1yL9ozIxvmbtN5qtmH2krXcBCfjEiCgKGLqunJHvgvZG2Pcl2oQ3kbcZARb1BGEHdkLzcYGO8ynVlieg==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.0.2" + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-visually-hidden": "1.2.3" }, "peerDependencies": { "@types/react": "*", @@ -6944,117 +6814,7 @@ } } }, - "node_modules/@radix-ui/react-menu": { - "version": "2.1.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.15.tgz", - "integrity": "sha512-tVlmA3Vb9n8SZSd+YSbuFR66l87Wiy4du+YE+0hzKQEANA+7cWKH1WgqcEX4pXqxUFQKrWQGHdvEfw00TjFiew==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-dismissable-layer": "1.1.10", - "@radix-ui/react-focus-guards": "1.1.2", - "@radix-ui/react-focus-scope": "1.1.7", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-popper": "1.2.7", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.4", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.10", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "aria-hidden": "^1.2.4", - "react-remove-scroll": "^2.6.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/primitive": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.2.tgz", - "integrity": "sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA==", - "license": "MIT" - }, - "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-arrow": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz", - "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-collection": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz", - "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-compose-refs": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", - "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-context": { + "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-context": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", @@ -7069,56 +6829,29 @@ } } }, - "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-direction": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz", - "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.10.tgz", - "integrity": "sha512-IM1zzRV4W3HtVgftdQiiOmA0AdJlCtMLe00FXaHwgt3rAnNsIyDqshvkIW3hj/iu5hu8ERP7KIYki6NkqDxAwQ==", + "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-escape-keydown": "1.1.1" + "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { "optional": true - }, - "@types/react-dom": { - "optional": true } } }, - "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-id": { + "node_modules/@radix-ui/react-use-callback-ref": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", - "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", + "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.1" - }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" @@ -7129,116 +6862,68 @@ } } }, - "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-popper": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.7.tgz", - "integrity": "sha512-IUFAccz1JyKcf/RjB552PlWwxjeCJB8/4KxT7EhBHOJM+mN7LdW+B3kacJXILm32xawcMMjb2i0cIZpo+f9kiQ==", - "license": "MIT", - "dependencies": { - "@floating-ui/react-dom": "^2.0.0", - "@radix-ui/react-arrow": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-use-rect": "1.1.1", - "@radix-ui/react-use-size": "1.1.1", - "@radix-ui/rect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-portal": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", - "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", + "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-effect-event": "0.0.2", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { "optional": true - }, - "@types/react-dom": { - "optional": true } } }, - "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-presence": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.4.tgz", - "integrity": "sha512-ueDqRbdc4/bkaQT3GIpLQssRlFgWaL/U2z/S31qRwwLWoxHLgry3SIfCwhxeQNbirEUXFa+lq3RL3oBYXtcmIA==", + "node_modules/@radix-ui/react-use-effect-event": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz", + "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==", "license": "MIT", "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { "optional": true - }, - "@types/react-dom": { - "optional": true } } }, - "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-primitive": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", - "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz", + "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==", "license": "MIT", "dependencies": { - "@radix-ui/react-slot": "1.2.3" + "@radix-ui/react-use-callback-ref": "1.1.1" }, "peerDependencies": { "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { "optional": true - }, - "@types/react-dom": { - "optional": true } } }, - "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "node_modules/@radix-ui/react-use-is-hydrated": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-is-hydrated/-/react-use-is-hydrated-0.1.0.tgz", + "integrity": "sha512-U+UORVEq+cTnRIaostJv9AGdV3G6Y+zbVd+12e18jQ5A3c0xL03IhnHuiU4UV69wolOQp5GfR58NW/EgdQhwOA==", "license": "MIT", "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" + "use-sync-external-store": "^1.5.0" }, "peerDependencies": { "@types/react": "*", @@ -7250,29 +6935,20 @@ } } }, - "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-use-callback-ref": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", - "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", + "node_modules/@radix-ui/react-use-is-hydrated/node_modules/use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", "license": "MIT", "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, - "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-use-escape-keydown": { + "node_modules/@radix-ui/react-use-layout-effect": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz", - "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", + "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", "license": "MIT", - "dependencies": { - "@radix-ui/react-use-callback-ref": "1.1.1" - }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" @@ -7283,10 +6959,10 @@ } } }, - "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-use-layout-effect": { + "node_modules/@radix-ui/react-use-previous": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", - "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.1.tgz", + "integrity": "sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -7298,7 +6974,7 @@ } } }, - "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-use-rect": { + "node_modules/@radix-ui/react-use-rect": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.1.tgz", "integrity": "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==", @@ -7316,7 +6992,7 @@ } } }, - "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-use-size": { + "node_modules/@radix-ui/react-use-size": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz", "integrity": "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==", @@ -7334,32 +7010,13 @@ } } }, - "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/rect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz", - "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==", - "license": "MIT" - }, - "node_modules/@radix-ui/react-navigation-menu": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.5.tgz", - "integrity": "sha512-myMHHQUZ3ZLTi8W381/Vu43Ia0NqakkQZ2vzynMmTUtQQ9kNkjzhOwkZC9TAM5R07OZUVIQyHC06f/9JZJpvvA==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.1", - "@radix-ui/react-collection": "1.1.2", - "@radix-ui/react-compose-refs": "1.1.1", - "@radix-ui/react-context": "1.1.1", - "@radix-ui/react-direction": "1.1.0", - "@radix-ui/react-dismissable-layer": "1.1.5", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-presence": "1.1.2", - "@radix-ui/react-primitive": "2.0.2", - "@radix-ui/react-use-callback-ref": "1.1.0", - "@radix-ui/react-use-controllable-state": "1.1.0", - "@radix-ui/react-use-layout-effect": "1.1.0", - "@radix-ui/react-use-previous": "1.1.0", - "@radix-ui/react-visually-hidden": "1.1.2" + "node_modules/@radix-ui/react-visually-hidden": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.3.tgz", + "integrity": "sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", @@ -7376,5030 +7033,3765 @@ } } }, - "node_modules/@radix-ui/react-popover": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.15.tgz", - "integrity": "sha512-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA==", + "node_modules/@radix-ui/rect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz", + "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==", + "license": "MIT" + }, + "node_modules/@rainbow-me/rainbowkit": { + "version": "2.2.10", + "resolved": "https://registry.npmjs.org/@rainbow-me/rainbowkit/-/rainbowkit-2.2.10.tgz", + "integrity": "sha512-8+E4die1A2ovN9t3lWxWnwqTGEdFqThXDQRj+E4eDKuUKyymYD+66Gzm6S9yfg8E95c6hmGlavGUfYPtl1EagA==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.11", - "@radix-ui/react-focus-guards": "1.1.3", - "@radix-ui/react-focus-scope": "1.1.7", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-popper": "1.2.8", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "aria-hidden": "^1.2.4", - "react-remove-scroll": "^2.6.3" + "@vanilla-extract/css": "1.17.3", + "@vanilla-extract/dynamic": "2.1.4", + "@vanilla-extract/sprinkles": "1.6.4", + "clsx": "2.1.1", + "cuer": "0.0.3", + "react-remove-scroll": "2.6.2", + "ua-parser-js": "^1.0.37" }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "engines": { + "node": ">=12.4" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "peerDependencies": { + "@tanstack/react-query": ">=5.0.0", + "react": ">=18", + "react-dom": ">=18", + "viem": "2.x", + "wagmi": "^2.9.0" } }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/primitive": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", - "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", - "license": "MIT" - }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-arrow": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz", - "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==", + "node_modules/@rainbow-me/rainbowkit/node_modules/react-remove-scroll": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.6.2.tgz", + "integrity": "sha512-KmONPx5fnlXYJQqC62Q+lwIeAk64ws/cUw6omIumRzMRPqgnYqhSSti99nbj0Ry13bv7dF+BKn7NB+OqkdZGTw==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.1.3" + "react-remove-scroll-bar": "^2.3.7", + "react-style-singleton": "^2.2.1", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.3", + "use-sidecar": "^1.1.2" + }, + "engines": { + "node": ">=10" }, "peerDependencies": { "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "peerDependenciesMeta": { "@types/react": { "optional": true - }, - "@types/react-dom": { - "optional": true } } }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-compose-refs": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", - "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "node_modules/@reown/appkit": { + "version": "1.7.8", + "resolved": "https://registry.npmjs.org/@reown/appkit/-/appkit-1.7.8.tgz", + "integrity": "sha512-51kTleozhA618T1UvMghkhKfaPcc9JlKwLJ5uV+riHyvSoWPKPRIa5A6M1Wano5puNyW0s3fwywhyqTHSilkaA==", + "license": "Apache-2.0", + "dependencies": { + "@reown/appkit-common": "1.7.8", + "@reown/appkit-controllers": "1.7.8", + "@reown/appkit-pay": "1.7.8", + "@reown/appkit-polyfills": "1.7.8", + "@reown/appkit-scaffold-ui": "1.7.8", + "@reown/appkit-ui": "1.7.8", + "@reown/appkit-utils": "1.7.8", + "@reown/appkit-wallet": "1.7.8", + "@walletconnect/types": "2.21.0", + "@walletconnect/universal-provider": "2.21.0", + "bs58": "6.0.0", + "valtio": "1.13.2", + "viem": ">=2.29.0" } }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-context": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", - "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "node_modules/@reown/appkit-common": { + "version": "1.7.8", + "resolved": "https://registry.npmjs.org/@reown/appkit-common/-/appkit-common-1.7.8.tgz", + "integrity": "sha512-ridIhc/x6JOp7KbDdwGKY4zwf8/iK8EYBl+HtWrruutSLwZyVi5P8WaZa+8iajL6LcDcDF7LoyLwMTym7SRuwQ==", + "license": "Apache-2.0", + "dependencies": { + "big.js": "6.2.2", + "dayjs": "1.11.13", + "viem": ">=2.29.0" } }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz", - "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==", - "license": "MIT", + "node_modules/@reown/appkit-common/node_modules/dayjs": { + "version": "1.11.13", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", + "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", + "license": "MIT" + }, + "node_modules/@reown/appkit-controllers": { + "version": "1.7.8", + "resolved": "https://registry.npmjs.org/@reown/appkit-controllers/-/appkit-controllers-1.7.8.tgz", + "integrity": "sha512-IdXlJlivrlj6m63VsGLsjtPHHsTWvKGVzWIP1fXZHVqmK+rZCBDjCi9j267Rb9/nYRGHWBtlFQhO8dK35WfeDA==", + "license": "Apache-2.0", "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-escape-keydown": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "@reown/appkit-common": "1.7.8", + "@reown/appkit-wallet": "1.7.8", + "@walletconnect/universal-provider": "2.21.0", + "valtio": "1.13.2", + "viem": ">=2.29.0" } }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-focus-guards": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz", - "integrity": "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==", + "node_modules/@reown/appkit-controllers/node_modules/@noble/ciphers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.2.1.tgz", + "integrity": "sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA==", "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "engines": { + "node": "^14.21.3 || >=16" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-id": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", - "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", + "node_modules/@reown/appkit-controllers/node_modules/@noble/curves": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.8.1.tgz", + "integrity": "sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ==", "license": "MIT", "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.1" + "@noble/hashes": "1.7.1" }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "engines": { + "node": "^14.21.3 || >=16" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-popper": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.8.tgz", - "integrity": "sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==", + "node_modules/@reown/appkit-controllers/node_modules/@noble/hashes": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.7.1.tgz", + "integrity": "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==", "license": "MIT", - "dependencies": { - "@floating-ui/react-dom": "^2.0.0", - "@radix-ui/react-arrow": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-use-rect": "1.1.1", - "@radix-ui/react-use-size": "1.1.1", - "@radix-ui/rect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "engines": { + "node": "^14.21.3 || >=16" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-portal": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", - "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", + "node_modules/@reown/appkit-controllers/node_modules/@scure/bip32": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.6.2.tgz", + "integrity": "sha512-t96EPDMbtGgtb7onKKqxRLfE5g05k7uHnHRM2xdE6BP/ZmxaLtPek4J4KfVn/90IQNrU1IOAqMgiDtUdtbe3nw==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-layout-effect": "1.1.1" + "@noble/curves": "~1.8.1", + "@noble/hashes": "~1.7.1", + "@scure/base": "~1.2.2" }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-presence": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz", - "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==", + "node_modules/@reown/appkit-controllers/node_modules/@scure/bip39": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.5.4.tgz", + "integrity": "sha512-TFM4ni0vKvCfBpohoh+/lY05i9gRbSwXWngAsF4CABQxoaOHijxuaZ2R6cStDQ5CHtHO9aGJTr4ksVJASRRyMA==", "license": "MIT", "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@noble/hashes": "~1.7.1", + "@scure/base": "~1.2.4" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-primitive": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", - "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", - "license": "MIT", + "node_modules/@reown/appkit-controllers/node_modules/@walletconnect/core": { + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/@walletconnect/core/-/core-2.21.0.tgz", + "integrity": "sha512-o6R7Ua4myxR8aRUAJ1z3gT9nM+jd2B2mfamu6arzy1Cc6vi10fIwFWb6vg3bC8xJ6o9H3n/cN5TOW3aA9Y1XVw==", + "license": "Apache-2.0", "dependencies": { - "@radix-ui/react-slot": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@walletconnect/heartbeat": "1.2.2", + "@walletconnect/jsonrpc-provider": "1.0.14", + "@walletconnect/jsonrpc-types": "1.0.4", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/jsonrpc-ws-connection": "1.0.16", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/logger": "2.1.2", + "@walletconnect/relay-api": "1.0.11", + "@walletconnect/relay-auth": "1.1.0", + "@walletconnect/safe-json": "1.0.2", + "@walletconnect/time": "1.0.2", + "@walletconnect/types": "2.21.0", + "@walletconnect/utils": "2.21.0", + "@walletconnect/window-getters": "1.0.1", + "es-toolkit": "1.33.0", + "events": "3.3.0", + "uint8arrays": "3.1.0" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "engines": { + "node": ">=18" } }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "node_modules/@reown/appkit-controllers/node_modules/@walletconnect/keyvaluestorage": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@walletconnect/keyvaluestorage/-/keyvaluestorage-1.1.1.tgz", + "integrity": "sha512-V7ZQq2+mSxAq7MrRqDxanTzu2RcElfK1PfNYiaVnJgJ7Q7G7hTVwF8voIBx92qsRyGHZihrwNPHuZd1aKkd0rA==", "license": "MIT", "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" + "@walletconnect/safe-json": "^1.0.1", + "idb-keyval": "^6.2.1", + "unstorage": "^1.9.0" }, "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@react-native-async-storage/async-storage": "1.x" }, "peerDependenciesMeta": { - "@types/react": { + "@react-native-async-storage/async-storage": { "optional": true } } }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-use-callback-ref": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", - "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "node_modules/@reown/appkit-controllers/node_modules/@walletconnect/sign-client": { + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/@walletconnect/sign-client/-/sign-client-2.21.0.tgz", + "integrity": "sha512-z7h+PeLa5Au2R591d/8ZlziE0stJvdzP9jNFzFolf2RG/OiXulgFKum8PrIyXy+Rg2q95U9nRVUF9fWcn78yBA==", + "deprecated": "Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases", + "license": "Apache-2.0", + "dependencies": { + "@walletconnect/core": "2.21.0", + "@walletconnect/events": "1.0.1", + "@walletconnect/heartbeat": "1.2.2", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/logger": "2.1.2", + "@walletconnect/time": "1.0.2", + "@walletconnect/types": "2.21.0", + "@walletconnect/utils": "2.21.0", + "events": "3.3.0" } }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", - "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", - "license": "MIT", + "node_modules/@reown/appkit-controllers/node_modules/@walletconnect/types": { + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/@walletconnect/types/-/types-2.21.0.tgz", + "integrity": "sha512-ll+9upzqt95ZBWcfkOszXZkfnpbJJ2CmxMfGgE5GmhdxxxCcO5bGhXkI+x8OpiS555RJ/v/sXJYMSOLkmu4fFw==", + "license": "Apache-2.0", "dependencies": { - "@radix-ui/react-use-effect-event": "0.0.2", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "@walletconnect/events": "1.0.1", + "@walletconnect/heartbeat": "1.2.2", + "@walletconnect/jsonrpc-types": "1.0.4", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/logger": "2.1.2", + "events": "3.3.0" } }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-use-escape-keydown": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz", - "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==", - "license": "MIT", + "node_modules/@reown/appkit-controllers/node_modules/@walletconnect/universal-provider": { + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/@walletconnect/universal-provider/-/universal-provider-2.21.0.tgz", + "integrity": "sha512-mtUQvewt+X0VBQay/xOJBvxsB3Xsm1lTwFjZ6WUwSOTR1X+FNb71hSApnV5kbsdDIpYPXeQUbGt2se1n5E5UBg==", + "deprecated": "Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases", + "license": "Apache-2.0", "dependencies": { - "@radix-ui/react-use-callback-ref": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "@walletconnect/events": "1.0.1", + "@walletconnect/jsonrpc-http-connection": "1.0.8", + "@walletconnect/jsonrpc-provider": "1.0.14", + "@walletconnect/jsonrpc-types": "1.0.4", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/logger": "2.1.2", + "@walletconnect/sign-client": "2.21.0", + "@walletconnect/types": "2.21.0", + "@walletconnect/utils": "2.21.0", + "es-toolkit": "1.33.0", + "events": "3.3.0" } }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", - "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", + "node_modules/@reown/appkit-controllers/node_modules/@walletconnect/utils": { + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/@walletconnect/utils/-/utils-2.21.0.tgz", + "integrity": "sha512-zfHLiUoBrQ8rP57HTPXW7rQMnYxYI4gT9yTACxVW6LhIFROTF6/ytm5SKNoIvi4a5nX5dfXG4D9XwQUCu8Ilig==", + "license": "Apache-2.0", + "dependencies": { + "@noble/ciphers": "1.2.1", + "@noble/curves": "1.8.1", + "@noble/hashes": "1.7.1", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/relay-api": "1.0.11", + "@walletconnect/relay-auth": "1.1.0", + "@walletconnect/safe-json": "1.0.2", + "@walletconnect/time": "1.0.2", + "@walletconnect/types": "2.21.0", + "@walletconnect/window-getters": "1.0.1", + "@walletconnect/window-metadata": "1.0.1", + "bs58": "6.0.0", + "detect-browser": "5.3.0", + "query-string": "7.1.3", + "uint8arrays": "3.1.0", + "viem": "2.23.2" + } + }, + "node_modules/@reown/appkit-controllers/node_modules/@walletconnect/utils/node_modules/viem": { + "version": "2.23.2", + "resolved": "https://registry.npmjs.org/viem/-/viem-2.23.2.tgz", + "integrity": "sha512-NVmW/E0c5crMOtbEAqMF0e3NmvQykFXhLOc/CkLIXOlzHSA6KXVz3CYVmaKqBF8/xtjsjHAGjdJN3Ru1kFJLaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], "license": "MIT", + "dependencies": { + "@noble/curves": "1.8.1", + "@noble/hashes": "1.7.1", + "@scure/bip32": "1.6.2", + "@scure/bip39": "1.5.4", + "abitype": "1.0.8", + "isows": "1.0.6", + "ox": "0.6.7", + "ws": "8.18.0" + }, "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "typescript": ">=5.0.4" }, "peerDependenciesMeta": { - "@types/react": { + "typescript": { "optional": true } } }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-use-rect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.1.tgz", - "integrity": "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==", + "node_modules/@reown/appkit-controllers/node_modules/abitype": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.0.8.tgz", + "integrity": "sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg==", "license": "MIT", - "dependencies": { - "@radix-ui/rect": "1.1.1" + "funding": { + "url": "https://github.com/sponsors/wevm" }, "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "typescript": ">=5.0.4", + "zod": "^3 >=3.22.0" }, "peerDependenciesMeta": { - "@types/react": { + "typescript": { + "optional": true + }, + "zod": { "optional": true } } }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-use-size": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz", - "integrity": "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==", + "node_modules/@reown/appkit-controllers/node_modules/base-x": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-5.0.1.tgz", + "integrity": "sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==", + "license": "MIT" + }, + "node_modules/@reown/appkit-controllers/node_modules/bs58": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-6.0.0.tgz", + "integrity": "sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==", "license": "MIT", "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.1" + "base-x": "^5.0.0" + } + }, + "node_modules/@reown/appkit-controllers/node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "license": "MIT", + "dependencies": { + "readdirp": "^5.0.0" }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "engines": { + "node": ">= 20.19.0" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@reown/appkit-controllers/node_modules/isows": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.6.tgz", + "integrity": "sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" } + ], + "license": "MIT", + "peerDependencies": { + "ws": "*" } }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/rect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz", - "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==", - "license": "MIT" + "node_modules/@reown/appkit-controllers/node_modules/lru-cache": { + "version": "11.2.4", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", + "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } }, - "node_modules/@radix-ui/react-popper": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.2.tgz", - "integrity": "sha512-Rvqc3nOpwseCyj/rgjlJDYAgyfw7OC1tTkKn2ivhaMGcYt8FSBlahHOZak2i3QwkRXUXgGgzeEe2RuqeEHuHgA==", + "node_modules/@reown/appkit-controllers/node_modules/multiformats": { + "version": "9.9.0", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", + "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==", + "license": "(Apache-2.0 AND MIT)" + }, + "node_modules/@reown/appkit-controllers/node_modules/ox": { + "version": "0.6.7", + "resolved": "https://registry.npmjs.org/ox/-/ox-0.6.7.tgz", + "integrity": "sha512-17Gk/eFsFRAZ80p5eKqv89a57uXjd3NgIf1CaXojATPBuujVc/fQSVhBeAU9JCRB+k7J50WQAyWTxK19T9GgbA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], "license": "MIT", "dependencies": { - "@floating-ui/react-dom": "^2.0.0", - "@radix-ui/react-arrow": "1.1.2", - "@radix-ui/react-compose-refs": "1.1.1", - "@radix-ui/react-context": "1.1.1", - "@radix-ui/react-primitive": "2.0.2", - "@radix-ui/react-use-callback-ref": "1.1.0", - "@radix-ui/react-use-layout-effect": "1.1.0", - "@radix-ui/react-use-rect": "1.1.0", - "@radix-ui/react-use-size": "1.1.0", - "@radix-ui/rect": "1.1.0" + "@adraffy/ens-normalize": "^1.10.1", + "@noble/curves": "^1.6.0", + "@noble/hashes": "^1.5.0", + "@scure/bip32": "^1.5.0", + "@scure/bip39": "^1.4.0", + "abitype": "^1.0.6", + "eventemitter3": "5.0.1" }, "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "typescript": ">=5.4.0" }, "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { + "typescript": { "optional": true } } }, - "node_modules/@radix-ui/react-portal": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.4.tgz", - "integrity": "sha512-sn2O9k1rPFYVyKd5LAJfo96JlSGVFpa1fS6UuBJfrZadudiw5tAmru+n1x7aMRQ84qDM71Zh1+SzK5QwU0tJfA==", + "node_modules/@reown/appkit-controllers/node_modules/readdirp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.0.2", - "@radix-ui/react-use-layout-effect": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "engines": { + "node": ">= 20.19.0" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@radix-ui/react-presence": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.2.tgz", - "integrity": "sha512-18TFr80t5EVgL9x1SwF/YGtfG+l0BS0PRAlCWBDoBEiDQjeKgnNZRVJp/oVBl24sr3Gbfwc/Qpj4OcWTQMsAEg==", + "node_modules/@reown/appkit-controllers/node_modules/uint8arrays": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.0.tgz", + "integrity": "sha512-ei5rfKtoRO8OyOIor2Rz5fhzjThwIHJZ3uyDPnDHTXbP0aMQ1RN/6AI5B5d9dBxJOU+BvOAk7ZQ1xphsX8Lrog==", "license": "MIT", "dependencies": { - "@radix-ui/react-compose-refs": "1.1.1", - "@radix-ui/react-use-layout-effect": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "multiformats": "^9.4.2" } }, - "node_modules/@radix-ui/react-primitive": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.2.tgz", - "integrity": "sha512-Ec/0d38EIuvDF+GZjcMU/Ze6MxntVJYO/fRlCPhCaVUyPY9WTalHJw54tp9sXeJo3tlShWpy41vQRgLRGOuz+w==", + "node_modules/@reown/appkit-controllers/node_modules/unstorage": { + "version": "1.17.4", + "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.17.4.tgz", + "integrity": "sha512-fHK0yNg38tBiJKp/Vgsq4j0JEsCmgqH58HAn707S7zGkArbZsVr/CwINoi+nh3h98BRCwKvx1K3Xg9u3VV83sw==", "license": "MIT", "dependencies": { - "@radix-ui/react-slot": "1.1.2" + "anymatch": "^3.1.3", + "chokidar": "^5.0.0", + "destr": "^2.0.5", + "h3": "^1.15.5", + "lru-cache": "^11.2.0", + "node-fetch-native": "^1.6.7", + "ofetch": "^1.5.1", + "ufo": "^1.6.3" }, "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@azure/app-configuration": "^1.8.0", + "@azure/cosmos": "^4.2.0", + "@azure/data-tables": "^13.3.0", + "@azure/identity": "^4.6.0", + "@azure/keyvault-secrets": "^4.9.0", + "@azure/storage-blob": "^12.26.0", + "@capacitor/preferences": "^6 || ^7 || ^8", + "@deno/kv": ">=0.9.0", + "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", + "@planetscale/database": "^1.19.0", + "@upstash/redis": "^1.34.3", + "@vercel/blob": ">=0.27.1", + "@vercel/functions": "^2.2.12 || ^3.0.0", + "@vercel/kv": "^1 || ^2 || ^3", + "aws4fetch": "^1.0.20", + "db0": ">=0.2.1", + "idb-keyval": "^6.2.1", + "ioredis": "^5.4.2", + "uploadthing": "^7.4.4" }, "peerDependenciesMeta": { - "@types/react": { + "@azure/app-configuration": { "optional": true }, - "@types/react-dom": { + "@azure/cosmos": { + "optional": true + }, + "@azure/data-tables": { + "optional": true + }, + "@azure/identity": { + "optional": true + }, + "@azure/keyvault-secrets": { + "optional": true + }, + "@azure/storage-blob": { + "optional": true + }, + "@capacitor/preferences": { + "optional": true + }, + "@deno/kv": { + "optional": true + }, + "@netlify/blobs": { + "optional": true + }, + "@planetscale/database": { + "optional": true + }, + "@upstash/redis": { + "optional": true + }, + "@vercel/blob": { + "optional": true + }, + "@vercel/functions": { + "optional": true + }, + "@vercel/kv": { + "optional": true + }, + "aws4fetch": { + "optional": true + }, + "db0": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "ioredis": { + "optional": true + }, + "uploadthing": { "optional": true } } }, - "node_modules/@radix-ui/react-roving-focus": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.10.tgz", - "integrity": "sha512-dT9aOXUen9JSsxnMPv/0VqySQf5eDQ6LCk5Sw28kamz8wSOW2bJdlX2Bg5VUIIcV+6XlHpWTIuTPCf/UNIyq8Q==", + "node_modules/@reown/appkit-controllers/node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.2.2" + "engines": { + "node": ">=10.0.0" }, "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" }, "peerDependenciesMeta": { - "@types/react": { + "bufferutil": { "optional": true }, - "@types/react-dom": { + "utf-8-validate": { "optional": true } } }, - "node_modules/@radix-ui/react-roving-focus/node_modules/@radix-ui/primitive": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.2.tgz", - "integrity": "sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA==", - "license": "MIT" - }, - "node_modules/@radix-ui/react-roving-focus/node_modules/@radix-ui/react-collection": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz", - "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==", + "node_modules/@reown/appkit-controllers/node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", "license": "MIT", + "optional": true, + "peer": true, + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/@reown/appkit-pay": { + "version": "1.7.8", + "resolved": "https://registry.npmjs.org/@reown/appkit-pay/-/appkit-pay-1.7.8.tgz", + "integrity": "sha512-OSGQ+QJkXx0FEEjlpQqIhT8zGJKOoHzVnyy/0QFrl3WrQTjCzg0L6+i91Ad5Iy1zb6V5JjqtfIFpRVRWN4M3pw==", + "license": "Apache-2.0", "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-roving-focus/node_modules/@radix-ui/react-compose-refs": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", - "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "@reown/appkit-common": "1.7.8", + "@reown/appkit-controllers": "1.7.8", + "@reown/appkit-ui": "1.7.8", + "@reown/appkit-utils": "1.7.8", + "lit": "3.3.0", + "valtio": "1.13.2" } }, - "node_modules/@radix-ui/react-roving-focus/node_modules/@radix-ui/react-context": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", - "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "node_modules/@reown/appkit-polyfills": { + "version": "1.7.8", + "resolved": "https://registry.npmjs.org/@reown/appkit-polyfills/-/appkit-polyfills-1.7.8.tgz", + "integrity": "sha512-W/kq786dcHHAuJ3IV2prRLEgD/2iOey4ueMHf1sIFjhhCGMynMkhsOhQMUH0tzodPqUgAC494z4bpIDYjwWXaA==", + "license": "Apache-2.0", + "dependencies": { + "buffer": "6.0.3" } }, - "node_modules/@radix-ui/react-roving-focus/node_modules/@radix-ui/react-direction": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz", - "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "node_modules/@reown/appkit-scaffold-ui": { + "version": "1.7.8", + "resolved": "https://registry.npmjs.org/@reown/appkit-scaffold-ui/-/appkit-scaffold-ui-1.7.8.tgz", + "integrity": "sha512-RCeHhAwOrIgcvHwYlNWMcIDibdI91waaoEYBGw71inE0kDB8uZbE7tE6DAXJmDkvl0qPh+DqlC4QbJLF1FVYdQ==", + "license": "Apache-2.0", + "dependencies": { + "@reown/appkit-common": "1.7.8", + "@reown/appkit-controllers": "1.7.8", + "@reown/appkit-ui": "1.7.8", + "@reown/appkit-utils": "1.7.8", + "@reown/appkit-wallet": "1.7.8", + "lit": "3.3.0" } }, - "node_modules/@radix-ui/react-roving-focus/node_modules/@radix-ui/react-id": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", - "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", - "license": "MIT", + "node_modules/@reown/appkit-ui": { + "version": "1.7.8", + "resolved": "https://registry.npmjs.org/@reown/appkit-ui/-/appkit-ui-1.7.8.tgz", + "integrity": "sha512-1hjCKjf6FLMFzrulhl0Y9Vb9Fu4royE+SXCPSWh4VhZhWqlzUFc7kutnZKx8XZFVQH4pbBvY62SpRC93gqoHow==", + "license": "Apache-2.0", "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "@reown/appkit-common": "1.7.8", + "@reown/appkit-controllers": "1.7.8", + "@reown/appkit-wallet": "1.7.8", + "lit": "3.3.0", + "qrcode": "1.5.3" } }, - "node_modules/@radix-ui/react-roving-focus/node_modules/@radix-ui/react-primitive": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", - "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "node_modules/@reown/appkit-ui/node_modules/qrcode": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.3.tgz", + "integrity": "sha512-puyri6ApkEHYiVl4CFzo1tDkAZ+ATcnbJrJ6RiBM1Fhctdn/ix9MTE3hRph33omisEbC/2fcfemsseiKgBPKZg==", "license": "MIT", "dependencies": { - "@radix-ui/react-slot": "1.2.3" + "dijkstrajs": "^1.0.1", + "encode-utf8": "^1.0.3", + "pngjs": "^5.0.0", + "yargs": "^15.3.1" }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "bin": { + "qrcode": "bin/qrcode" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "engines": { + "node": ">=10.13.0" } }, - "node_modules/@radix-ui/react-roving-focus/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "license": "MIT", + "node_modules/@reown/appkit-utils": { + "version": "1.7.8", + "resolved": "https://registry.npmjs.org/@reown/appkit-utils/-/appkit-utils-1.7.8.tgz", + "integrity": "sha512-8X7UvmE8GiaoitCwNoB86pttHgQtzy4ryHZM9kQpvjQ0ULpiER44t1qpVLXNM4X35O0v18W0Dk60DnYRMH2WRw==", + "license": "Apache-2.0", "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" + "@reown/appkit-common": "1.7.8", + "@reown/appkit-controllers": "1.7.8", + "@reown/appkit-polyfills": "1.7.8", + "@reown/appkit-wallet": "1.7.8", + "@walletconnect/logger": "2.1.2", + "@walletconnect/universal-provider": "2.21.0", + "valtio": "1.13.2", + "viem": ">=2.29.0" }, "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "valtio": "1.13.2" } }, - "node_modules/@radix-ui/react-roving-focus/node_modules/@radix-ui/react-use-callback-ref": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", - "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", + "node_modules/@reown/appkit-utils/node_modules/@noble/ciphers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.2.1.tgz", + "integrity": "sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA==", "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "engines": { + "node": "^14.21.3 || >=16" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@radix-ui/react-roving-focus/node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", - "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", + "node_modules/@reown/appkit-utils/node_modules/@noble/curves": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.8.1.tgz", + "integrity": "sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ==", "license": "MIT", "dependencies": { - "@radix-ui/react-use-effect-event": "0.0.2", - "@radix-ui/react-use-layout-effect": "1.1.1" + "@noble/hashes": "1.7.1" }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "engines": { + "node": "^14.21.3 || >=16" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@radix-ui/react-roving-focus/node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", - "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", + "node_modules/@reown/appkit-utils/node_modules/@noble/hashes": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.7.1.tgz", + "integrity": "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==", "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "engines": { + "node": "^14.21.3 || >=16" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@radix-ui/react-scroll-area": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.3.tgz", - "integrity": "sha512-l7+NNBfBYYJa9tNqVcP2AGvxdE3lmE6kFTBXdvHgUaZuy+4wGCL1Cl2AfaR7RKyimj7lZURGLwFO59k4eBnDJQ==", + "node_modules/@reown/appkit-utils/node_modules/@scure/bip32": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.6.2.tgz", + "integrity": "sha512-t96EPDMbtGgtb7onKKqxRLfE5g05k7uHnHRM2xdE6BP/ZmxaLtPek4J4KfVn/90IQNrU1IOAqMgiDtUdtbe3nw==", "license": "MIT", "dependencies": { - "@radix-ui/number": "1.1.0", - "@radix-ui/primitive": "1.1.1", - "@radix-ui/react-compose-refs": "1.1.1", - "@radix-ui/react-context": "1.1.1", - "@radix-ui/react-direction": "1.1.0", - "@radix-ui/react-presence": "1.1.2", - "@radix-ui/react-primitive": "2.0.2", - "@radix-ui/react-use-callback-ref": "1.1.0", - "@radix-ui/react-use-layout-effect": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@noble/curves": "~1.8.1", + "@noble/hashes": "~1.7.1", + "@scure/base": "~1.2.2" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@radix-ui/react-select": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.1.7.tgz", - "integrity": "sha512-exzGIRtc7S8EIM2KjFg+7lJZsH7O7tpaBaJbBNVDnOZNhtoQ2iV+iSNfi2Wth0m6h3trJkMVvzAehB3c6xj/3Q==", + "node_modules/@reown/appkit-utils/node_modules/@scure/bip39": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.5.4.tgz", + "integrity": "sha512-TFM4ni0vKvCfBpohoh+/lY05i9gRbSwXWngAsF4CABQxoaOHijxuaZ2R6cStDQ5CHtHO9aGJTr4ksVJASRRyMA==", "license": "MIT", "dependencies": { - "@radix-ui/number": "1.1.1", - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-collection": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-dismissable-layer": "1.1.6", - "@radix-ui/react-focus-guards": "1.1.2", - "@radix-ui/react-focus-scope": "1.1.3", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-popper": "1.2.3", - "@radix-ui/react-portal": "1.1.5", - "@radix-ui/react-primitive": "2.0.3", - "@radix-ui/react-slot": "1.2.0", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.1.1", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-use-previous": "1.1.1", - "@radix-ui/react-visually-hidden": "1.1.3", - "aria-hidden": "^1.2.4", - "react-remove-scroll": "^2.6.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@noble/hashes": "~1.7.1", + "@scure/base": "~1.2.4" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@radix-ui/react-select/node_modules/@radix-ui/number": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz", - "integrity": "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==", - "license": "MIT" - }, - "node_modules/@radix-ui/react-select/node_modules/@radix-ui/primitive": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.2.tgz", - "integrity": "sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA==", - "license": "MIT" - }, - "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-arrow": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.3.tgz", - "integrity": "sha512-2dvVU4jva0qkNZH6HHWuSz5FN5GeU5tymvCgutF8WaXz9WnD1NgUhy73cqzkjkN4Zkn8lfTPv5JIfrC221W+Nw==", - "license": "MIT", + "node_modules/@reown/appkit-utils/node_modules/@walletconnect/core": { + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/@walletconnect/core/-/core-2.21.0.tgz", + "integrity": "sha512-o6R7Ua4myxR8aRUAJ1z3gT9nM+jd2B2mfamu6arzy1Cc6vi10fIwFWb6vg3bC8xJ6o9H3n/cN5TOW3aA9Y1XVw==", + "license": "Apache-2.0", "dependencies": { - "@radix-ui/react-primitive": "2.0.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@walletconnect/heartbeat": "1.2.2", + "@walletconnect/jsonrpc-provider": "1.0.14", + "@walletconnect/jsonrpc-types": "1.0.4", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/jsonrpc-ws-connection": "1.0.16", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/logger": "2.1.2", + "@walletconnect/relay-api": "1.0.11", + "@walletconnect/relay-auth": "1.1.0", + "@walletconnect/safe-json": "1.0.2", + "@walletconnect/time": "1.0.2", + "@walletconnect/types": "2.21.0", + "@walletconnect/utils": "2.21.0", + "@walletconnect/window-getters": "1.0.1", + "es-toolkit": "1.33.0", + "events": "3.3.0", + "uint8arrays": "3.1.0" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "engines": { + "node": ">=18" } }, - "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-collection": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.3.tgz", - "integrity": "sha512-mM2pxoQw5HJ49rkzwOs7Y6J4oYH22wS8BfK2/bBxROlI4xuR0c4jEenQP63LlTlDkO6Buj2Vt+QYAYcOgqtrXA==", + "node_modules/@reown/appkit-utils/node_modules/@walletconnect/keyvaluestorage": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@walletconnect/keyvaluestorage/-/keyvaluestorage-1.1.1.tgz", + "integrity": "sha512-V7ZQq2+mSxAq7MrRqDxanTzu2RcElfK1PfNYiaVnJgJ7Q7G7hTVwF8voIBx92qsRyGHZihrwNPHuZd1aKkd0rA==", "license": "MIT", "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.0.3", - "@radix-ui/react-slot": "1.2.0" + "@walletconnect/safe-json": "^1.0.1", + "idb-keyval": "^6.2.1", + "unstorage": "^1.9.0" }, "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@react-native-async-storage/async-storage": "1.x" }, "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { + "@react-native-async-storage/async-storage": { "optional": true } } }, - "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-compose-refs": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", - "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "node_modules/@reown/appkit-utils/node_modules/@walletconnect/sign-client": { + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/@walletconnect/sign-client/-/sign-client-2.21.0.tgz", + "integrity": "sha512-z7h+PeLa5Au2R591d/8ZlziE0stJvdzP9jNFzFolf2RG/OiXulgFKum8PrIyXy+Rg2q95U9nRVUF9fWcn78yBA==", + "deprecated": "Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases", + "license": "Apache-2.0", + "dependencies": { + "@walletconnect/core": "2.21.0", + "@walletconnect/events": "1.0.1", + "@walletconnect/heartbeat": "1.2.2", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/logger": "2.1.2", + "@walletconnect/time": "1.0.2", + "@walletconnect/types": "2.21.0", + "@walletconnect/utils": "2.21.0", + "events": "3.3.0" } }, - "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-context": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", - "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "node_modules/@reown/appkit-utils/node_modules/@walletconnect/types": { + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/@walletconnect/types/-/types-2.21.0.tgz", + "integrity": "sha512-ll+9upzqt95ZBWcfkOszXZkfnpbJJ2CmxMfGgE5GmhdxxxCcO5bGhXkI+x8OpiS555RJ/v/sXJYMSOLkmu4fFw==", + "license": "Apache-2.0", + "dependencies": { + "@walletconnect/events": "1.0.1", + "@walletconnect/heartbeat": "1.2.2", + "@walletconnect/jsonrpc-types": "1.0.4", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/logger": "2.1.2", + "events": "3.3.0" } }, - "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-direction": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz", - "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "node_modules/@reown/appkit-utils/node_modules/@walletconnect/universal-provider": { + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/@walletconnect/universal-provider/-/universal-provider-2.21.0.tgz", + "integrity": "sha512-mtUQvewt+X0VBQay/xOJBvxsB3Xsm1lTwFjZ6WUwSOTR1X+FNb71hSApnV5kbsdDIpYPXeQUbGt2se1n5E5UBg==", + "deprecated": "Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases", + "license": "Apache-2.0", + "dependencies": { + "@walletconnect/events": "1.0.1", + "@walletconnect/jsonrpc-http-connection": "1.0.8", + "@walletconnect/jsonrpc-provider": "1.0.14", + "@walletconnect/jsonrpc-types": "1.0.4", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/logger": "2.1.2", + "@walletconnect/sign-client": "2.21.0", + "@walletconnect/types": "2.21.0", + "@walletconnect/utils": "2.21.0", + "es-toolkit": "1.33.0", + "events": "3.3.0" } }, - "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.6.tgz", - "integrity": "sha512-7gpgMT2gyKym9Jz2ZhlRXSg2y6cNQIK8d/cqBZ0RBCaps8pFryCWXiUKI+uHGFrhMrbGUP7U6PWgiXzIxoyF3Q==", + "node_modules/@reown/appkit-utils/node_modules/@walletconnect/utils": { + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/@walletconnect/utils/-/utils-2.21.0.tgz", + "integrity": "sha512-zfHLiUoBrQ8rP57HTPXW7rQMnYxYI4gT9yTACxVW6LhIFROTF6/ytm5SKNoIvi4a5nX5dfXG4D9XwQUCu8Ilig==", + "license": "Apache-2.0", + "dependencies": { + "@noble/ciphers": "1.2.1", + "@noble/curves": "1.8.1", + "@noble/hashes": "1.7.1", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/relay-api": "1.0.11", + "@walletconnect/relay-auth": "1.1.0", + "@walletconnect/safe-json": "1.0.2", + "@walletconnect/time": "1.0.2", + "@walletconnect/types": "2.21.0", + "@walletconnect/window-getters": "1.0.1", + "@walletconnect/window-metadata": "1.0.1", + "bs58": "6.0.0", + "detect-browser": "5.3.0", + "query-string": "7.1.3", + "uint8arrays": "3.1.0", + "viem": "2.23.2" + } + }, + "node_modules/@reown/appkit-utils/node_modules/@walletconnect/utils/node_modules/viem": { + "version": "2.23.2", + "resolved": "https://registry.npmjs.org/viem/-/viem-2.23.2.tgz", + "integrity": "sha512-NVmW/E0c5crMOtbEAqMF0e3NmvQykFXhLOc/CkLIXOlzHSA6KXVz3CYVmaKqBF8/xtjsjHAGjdJN3Ru1kFJLaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-primitive": "2.0.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-escape-keydown": "1.1.1" + "@noble/curves": "1.8.1", + "@noble/hashes": "1.7.1", + "@scure/bip32": "1.6.2", + "@scure/bip39": "1.5.4", + "abitype": "1.0.8", + "isows": "1.0.6", + "ox": "0.6.7", + "ws": "8.18.0" }, "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "typescript": ">=5.0.4" }, "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { + "typescript": { "optional": true } } }, - "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-focus-scope": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.3.tgz", - "integrity": "sha512-4XaDlq0bPt7oJwR+0k0clCiCO/7lO7NKZTAaJBYxDNQT/vj4ig0/UvctrRscZaFREpRvUTkpKR96ov1e6jptQg==", + "node_modules/@reown/appkit-utils/node_modules/abitype": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.0.8.tgz", + "integrity": "sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg==", "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-primitive": "2.0.3", - "@radix-ui/react-use-callback-ref": "1.1.1" + "funding": { + "url": "https://github.com/sponsors/wevm" }, "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "typescript": ">=5.0.4", + "zod": "^3 >=3.22.0" }, "peerDependenciesMeta": { - "@types/react": { + "typescript": { "optional": true }, - "@types/react-dom": { + "zod": { "optional": true } } }, - "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-id": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", - "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", + "node_modules/@reown/appkit-utils/node_modules/base-x": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-5.0.1.tgz", + "integrity": "sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==", + "license": "MIT" + }, + "node_modules/@reown/appkit-utils/node_modules/bs58": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-6.0.0.tgz", + "integrity": "sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==", "license": "MIT", "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "base-x": "^5.0.0" } }, - "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-popper": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.3.tgz", - "integrity": "sha512-iNb9LYUMkne9zIahukgQmHlSBp9XWGeQQ7FvUGNk45ywzOb6kQa+Ca38OphXlWDiKvyneo9S+KSJsLfLt8812A==", + "node_modules/@reown/appkit-utils/node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", "license": "MIT", "dependencies": { - "@floating-ui/react-dom": "^2.0.0", - "@radix-ui/react-arrow": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.0.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-use-rect": "1.1.1", - "@radix-ui/react-use-size": "1.1.1", - "@radix-ui/rect": "1.1.1" + "readdirp": "^5.0.0" }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "engines": { + "node": ">= 20.19.0" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-portal": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.5.tgz", - "integrity": "sha512-ps/67ZqsFm+Mb6lSPJpfhRLrVL2i2fntgCmGMqqth4eaGUf+knAuuRtWVJrNjUhExgmdRqftSgzpf0DF0n6yXA==", + "node_modules/@reown/appkit-utils/node_modules/isows": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.6.tgz", + "integrity": "sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.0.3", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "ws": "*" } }, - "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-primitive": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.3.tgz", - "integrity": "sha512-Pf/t/GkndH7CQ8wE2hbkXA+WyZ83fhQQn5DDmwDiDo6AwN/fhaH8oqZ0jRjMrO2iaMhDi6P1HRx6AZwyMinY1g==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "node_modules/@reown/appkit-utils/node_modules/lru-cache": { + "version": "11.2.4", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", + "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" } }, - "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-slot": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.0.tgz", - "integrity": "sha512-ujc+V6r0HNDviYqIK3rW4ffgYiZ8g5DEHrGJVk4x7kTlLXRDILnKX9vAUYeIsLOoDpDJ0ujpqMkjH4w2ofuo6w==", + "node_modules/@reown/appkit-utils/node_modules/multiformats": { + "version": "9.9.0", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", + "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==", + "license": "(Apache-2.0 AND MIT)" + }, + "node_modules/@reown/appkit-utils/node_modules/ox": { + "version": "0.6.7", + "resolved": "https://registry.npmjs.org/ox/-/ox-0.6.7.tgz", + "integrity": "sha512-17Gk/eFsFRAZ80p5eKqv89a57uXjd3NgIf1CaXojATPBuujVc/fQSVhBeAU9JCRB+k7J50WQAyWTxK19T9GgbA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], "license": "MIT", "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" + "@adraffy/ens-normalize": "^1.10.1", + "@noble/curves": "^1.6.0", + "@noble/hashes": "^1.5.0", + "@scure/bip32": "^1.5.0", + "@scure/bip39": "^1.4.0", + "abitype": "^1.0.6", + "eventemitter3": "5.0.1" }, "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "typescript": ">=5.4.0" }, "peerDependenciesMeta": { - "@types/react": { + "typescript": { "optional": true } } }, - "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-use-callback-ref": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", - "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", + "node_modules/@reown/appkit-utils/node_modules/readdirp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "engines": { + "node": ">= 20.19.0" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.1.tgz", - "integrity": "sha512-YnEXIy8/ga01Y1PN0VfaNH//MhA91JlEGVBDxDzROqwrAtG5Yr2QGEPz8A/rJA3C7ZAHryOYGaUv8fLSW2H/mg==", + "node_modules/@reown/appkit-utils/node_modules/uint8arrays": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.0.tgz", + "integrity": "sha512-ei5rfKtoRO8OyOIor2Rz5fhzjThwIHJZ3uyDPnDHTXbP0aMQ1RN/6AI5B5d9dBxJOU+BvOAk7ZQ1xphsX8Lrog==", "license": "MIT", "dependencies": { - "@radix-ui/react-use-callback-ref": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "multiformats": "^9.4.2" } }, - "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-use-escape-keydown": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz", - "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==", + "node_modules/@reown/appkit-utils/node_modules/unstorage": { + "version": "1.17.4", + "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.17.4.tgz", + "integrity": "sha512-fHK0yNg38tBiJKp/Vgsq4j0JEsCmgqH58HAn707S7zGkArbZsVr/CwINoi+nh3h98BRCwKvx1K3Xg9u3VV83sw==", "license": "MIT", "dependencies": { - "@radix-ui/react-use-callback-ref": "1.1.1" + "anymatch": "^3.1.3", + "chokidar": "^5.0.0", + "destr": "^2.0.5", + "h3": "^1.15.5", + "lru-cache": "^11.2.0", + "node-fetch-native": "^1.6.7", + "ofetch": "^1.5.1", + "ufo": "^1.6.3" }, "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@azure/app-configuration": "^1.8.0", + "@azure/cosmos": "^4.2.0", + "@azure/data-tables": "^13.3.0", + "@azure/identity": "^4.6.0", + "@azure/keyvault-secrets": "^4.9.0", + "@azure/storage-blob": "^12.26.0", + "@capacitor/preferences": "^6 || ^7 || ^8", + "@deno/kv": ">=0.9.0", + "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", + "@planetscale/database": "^1.19.0", + "@upstash/redis": "^1.34.3", + "@vercel/blob": ">=0.27.1", + "@vercel/functions": "^2.2.12 || ^3.0.0", + "@vercel/kv": "^1 || ^2 || ^3", + "aws4fetch": "^1.0.20", + "db0": ">=0.2.1", + "idb-keyval": "^6.2.1", + "ioredis": "^5.4.2", + "uploadthing": "^7.4.4" }, "peerDependenciesMeta": { - "@types/react": { + "@azure/app-configuration": { + "optional": true + }, + "@azure/cosmos": { + "optional": true + }, + "@azure/data-tables": { + "optional": true + }, + "@azure/identity": { + "optional": true + }, + "@azure/keyvault-secrets": { + "optional": true + }, + "@azure/storage-blob": { + "optional": true + }, + "@capacitor/preferences": { + "optional": true + }, + "@deno/kv": { + "optional": true + }, + "@netlify/blobs": { + "optional": true + }, + "@planetscale/database": { + "optional": true + }, + "@upstash/redis": { + "optional": true + }, + "@vercel/blob": { + "optional": true + }, + "@vercel/functions": { + "optional": true + }, + "@vercel/kv": { + "optional": true + }, + "aws4fetch": { + "optional": true + }, + "db0": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "ioredis": { + "optional": true + }, + "uploadthing": { "optional": true } } }, - "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", - "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", + "node_modules/@reown/appkit-utils/node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" }, "peerDependenciesMeta": { - "@types/react": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { "optional": true } } }, - "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-use-previous": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.1.tgz", - "integrity": "sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==", + "node_modules/@reown/appkit-utils/node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "optional": true, + "peer": true, + "funding": { + "url": "https://github.com/sponsors/colinhacks" } }, - "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-use-rect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.1.tgz", - "integrity": "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==", - "license": "MIT", + "node_modules/@reown/appkit-wallet": { + "version": "1.7.8", + "resolved": "https://registry.npmjs.org/@reown/appkit-wallet/-/appkit-wallet-1.7.8.tgz", + "integrity": "sha512-kspz32EwHIOT/eg/ZQbFPxgXq0B/olDOj3YMu7gvLEFz4xyOFd/wgzxxAXkp5LbG4Cp++s/elh79rVNmVFdB9A==", + "license": "Apache-2.0", "dependencies": { - "@radix-ui/rect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "@reown/appkit-common": "1.7.8", + "@reown/appkit-polyfills": "1.7.8", + "@walletconnect/logger": "2.1.2", + "zod": "3.22.4" } }, - "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-use-size": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz", - "integrity": "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==", + "node_modules/@reown/appkit-wallet/node_modules/zod": { + "version": "3.22.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", + "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==", "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/colinhacks" } }, - "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-visually-hidden": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.1.3.tgz", - "integrity": "sha512-oXSF3ZQRd5fvomd9hmUCb2EHSZbPp3ZSHAHJJU/DlF9XoFkJBBW8RHU/E8WEH+RbSfJd/QFA0sl8ClJXknBwHQ==", + "node_modules/@reown/appkit/node_modules/@noble/ciphers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.2.1.tgz", + "integrity": "sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA==", "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.0.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "engines": { + "node": "^14.21.3 || >=16" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@radix-ui/react-select/node_modules/@radix-ui/rect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz", - "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==", - "license": "MIT" - }, - "node_modules/@radix-ui/react-separator": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.7.tgz", - "integrity": "sha512-0HEb8R9E8A+jZjvmFCy/J4xhbXy3TV+9XSnGJ3KvTtjlIUy/YQ/p6UYZvi7YbeoeXdyU9+Y3scizK6hkY37baA==", + "node_modules/@reown/appkit/node_modules/@noble/curves": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.8.1.tgz", + "integrity": "sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.1.3" + "@noble/hashes": "1.7.1" }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "engines": { + "node": "^14.21.3 || >=16" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-compose-refs": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", - "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", + "node_modules/@reown/appkit/node_modules/@noble/hashes": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.7.1.tgz", + "integrity": "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==", "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "engines": { + "node": "^14.21.3 || >=16" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-primitive": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", - "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "node_modules/@reown/appkit/node_modules/@scure/bip32": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.6.2.tgz", + "integrity": "sha512-t96EPDMbtGgtb7onKKqxRLfE5g05k7uHnHRM2xdE6BP/ZmxaLtPek4J4KfVn/90IQNrU1IOAqMgiDtUdtbe3nw==", "license": "MIT", "dependencies": { - "@radix-ui/react-slot": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@noble/curves": "~1.8.1", + "@noble/hashes": "~1.7.1", + "@scure/base": "~1.2.2" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "node_modules/@reown/appkit/node_modules/@scure/bip39": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.5.4.tgz", + "integrity": "sha512-TFM4ni0vKvCfBpohoh+/lY05i9gRbSwXWngAsF4CABQxoaOHijxuaZ2R6cStDQ5CHtHO9aGJTr4ksVJASRRyMA==", "license": "MIT", "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@noble/hashes": "~1.7.1", + "@scure/base": "~1.2.4" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@radix-ui/react-slider": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.2.3.tgz", - "integrity": "sha512-nNrLAWLjGESnhqBqcCNW4w2nn7LxudyMzeB6VgdyAnFLC6kfQgnAjSL2v6UkQTnDctJBlxrmxfplWS4iYjdUTw==", - "license": "MIT", + "node_modules/@reown/appkit/node_modules/@walletconnect/core": { + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/@walletconnect/core/-/core-2.21.0.tgz", + "integrity": "sha512-o6R7Ua4myxR8aRUAJ1z3gT9nM+jd2B2mfamu6arzy1Cc6vi10fIwFWb6vg3bC8xJ6o9H3n/cN5TOW3aA9Y1XVw==", + "license": "Apache-2.0", "dependencies": { - "@radix-ui/number": "1.1.0", - "@radix-ui/primitive": "1.1.1", - "@radix-ui/react-collection": "1.1.2", - "@radix-ui/react-compose-refs": "1.1.1", - "@radix-ui/react-context": "1.1.1", - "@radix-ui/react-direction": "1.1.0", - "@radix-ui/react-primitive": "2.0.2", - "@radix-ui/react-use-controllable-state": "1.1.0", - "@radix-ui/react-use-layout-effect": "1.1.0", - "@radix-ui/react-use-previous": "1.1.0", - "@radix-ui/react-use-size": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@walletconnect/heartbeat": "1.2.2", + "@walletconnect/jsonrpc-provider": "1.0.14", + "@walletconnect/jsonrpc-types": "1.0.4", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/jsonrpc-ws-connection": "1.0.16", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/logger": "2.1.2", + "@walletconnect/relay-api": "1.0.11", + "@walletconnect/relay-auth": "1.1.0", + "@walletconnect/safe-json": "1.0.2", + "@walletconnect/time": "1.0.2", + "@walletconnect/types": "2.21.0", + "@walletconnect/utils": "2.21.0", + "@walletconnect/window-getters": "1.0.1", + "es-toolkit": "1.33.0", + "events": "3.3.0", + "uint8arrays": "3.1.0" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "engines": { + "node": ">=18" } }, - "node_modules/@radix-ui/react-slot": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.2.tgz", - "integrity": "sha512-YAKxaiGsSQJ38VzKH86/BPRC4rh+b1Jpa+JneA5LRE7skmLPNAyeG8kPJj/oo4STLvlrs8vkf/iYyc3A5stYCQ==", + "node_modules/@reown/appkit/node_modules/@walletconnect/keyvaluestorage": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@walletconnect/keyvaluestorage/-/keyvaluestorage-1.1.1.tgz", + "integrity": "sha512-V7ZQq2+mSxAq7MrRqDxanTzu2RcElfK1PfNYiaVnJgJ7Q7G7hTVwF8voIBx92qsRyGHZihrwNPHuZd1aKkd0rA==", "license": "MIT", "dependencies": { - "@radix-ui/react-compose-refs": "1.1.1" + "@walletconnect/safe-json": "^1.0.1", + "idb-keyval": "^6.2.1", + "unstorage": "^1.9.0" }, "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@react-native-async-storage/async-storage": "1.x" }, "peerDependenciesMeta": { - "@types/react": { + "@react-native-async-storage/async-storage": { "optional": true } } }, - "node_modules/@radix-ui/react-switch": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.1.3.tgz", - "integrity": "sha512-1nc+vjEOQkJVsJtWPSiISGT6OKm4SiOdjMo+/icLxo2G4vxz1GntC5MzfL4v8ey9OEfw787QCD1y3mUv0NiFEQ==", - "license": "MIT", + "node_modules/@reown/appkit/node_modules/@walletconnect/sign-client": { + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/@walletconnect/sign-client/-/sign-client-2.21.0.tgz", + "integrity": "sha512-z7h+PeLa5Au2R591d/8ZlziE0stJvdzP9jNFzFolf2RG/OiXulgFKum8PrIyXy+Rg2q95U9nRVUF9fWcn78yBA==", + "deprecated": "Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases", + "license": "Apache-2.0", "dependencies": { - "@radix-ui/primitive": "1.1.1", - "@radix-ui/react-compose-refs": "1.1.1", - "@radix-ui/react-context": "1.1.1", - "@radix-ui/react-primitive": "2.0.2", - "@radix-ui/react-use-controllable-state": "1.1.0", - "@radix-ui/react-use-previous": "1.1.0", - "@radix-ui/react-use-size": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "@walletconnect/core": "2.21.0", + "@walletconnect/events": "1.0.1", + "@walletconnect/heartbeat": "1.2.2", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/logger": "2.1.2", + "@walletconnect/time": "1.0.2", + "@walletconnect/types": "2.21.0", + "@walletconnect/utils": "2.21.0", + "events": "3.3.0" } }, - "node_modules/@radix-ui/react-tabs": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.12.tgz", - "integrity": "sha512-GTVAlRVrQrSw3cEARM0nAx73ixrWDPNZAruETn3oHCNP6SbZ/hNxdxp+u7VkIEv3/sFoLq1PfcHrl7Pnp0CDpw==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-presence": "1.1.4", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.10", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "node_modules/@reown/appkit/node_modules/@walletconnect/types": { + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/@walletconnect/types/-/types-2.21.0.tgz", + "integrity": "sha512-ll+9upzqt95ZBWcfkOszXZkfnpbJJ2CmxMfGgE5GmhdxxxCcO5bGhXkI+x8OpiS555RJ/v/sXJYMSOLkmu4fFw==", + "license": "Apache-2.0", + "dependencies": { + "@walletconnect/events": "1.0.1", + "@walletconnect/heartbeat": "1.2.2", + "@walletconnect/jsonrpc-types": "1.0.4", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/logger": "2.1.2", + "events": "3.3.0" } }, - "node_modules/@radix-ui/react-tabs/node_modules/@radix-ui/primitive": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.2.tgz", - "integrity": "sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA==", - "license": "MIT" - }, - "node_modules/@radix-ui/react-tabs/node_modules/@radix-ui/react-compose-refs": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", - "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "node_modules/@reown/appkit/node_modules/@walletconnect/universal-provider": { + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/@walletconnect/universal-provider/-/universal-provider-2.21.0.tgz", + "integrity": "sha512-mtUQvewt+X0VBQay/xOJBvxsB3Xsm1lTwFjZ6WUwSOTR1X+FNb71hSApnV5kbsdDIpYPXeQUbGt2se1n5E5UBg==", + "deprecated": "Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases", + "license": "Apache-2.0", + "dependencies": { + "@walletconnect/events": "1.0.1", + "@walletconnect/jsonrpc-http-connection": "1.0.8", + "@walletconnect/jsonrpc-provider": "1.0.14", + "@walletconnect/jsonrpc-types": "1.0.4", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/logger": "2.1.2", + "@walletconnect/sign-client": "2.21.0", + "@walletconnect/types": "2.21.0", + "@walletconnect/utils": "2.21.0", + "es-toolkit": "1.33.0", + "events": "3.3.0" } }, - "node_modules/@radix-ui/react-tabs/node_modules/@radix-ui/react-context": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", - "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "node_modules/@reown/appkit/node_modules/@walletconnect/utils": { + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/@walletconnect/utils/-/utils-2.21.0.tgz", + "integrity": "sha512-zfHLiUoBrQ8rP57HTPXW7rQMnYxYI4gT9yTACxVW6LhIFROTF6/ytm5SKNoIvi4a5nX5dfXG4D9XwQUCu8Ilig==", + "license": "Apache-2.0", + "dependencies": { + "@noble/ciphers": "1.2.1", + "@noble/curves": "1.8.1", + "@noble/hashes": "1.7.1", + "@walletconnect/jsonrpc-utils": "1.0.8", + "@walletconnect/keyvaluestorage": "1.1.1", + "@walletconnect/relay-api": "1.0.11", + "@walletconnect/relay-auth": "1.1.0", + "@walletconnect/safe-json": "1.0.2", + "@walletconnect/time": "1.0.2", + "@walletconnect/types": "2.21.0", + "@walletconnect/window-getters": "1.0.1", + "@walletconnect/window-metadata": "1.0.1", + "bs58": "6.0.0", + "detect-browser": "5.3.0", + "query-string": "7.1.3", + "uint8arrays": "3.1.0", + "viem": "2.23.2" } }, - "node_modules/@radix-ui/react-tabs/node_modules/@radix-ui/react-direction": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz", - "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true + "node_modules/@reown/appkit/node_modules/@walletconnect/utils/node_modules/viem": { + "version": "2.23.2", + "resolved": "https://registry.npmjs.org/viem/-/viem-2.23.2.tgz", + "integrity": "sha512-NVmW/E0c5crMOtbEAqMF0e3NmvQykFXhLOc/CkLIXOlzHSA6KXVz3CYVmaKqBF8/xtjsjHAGjdJN3Ru1kFJLaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" } - } - }, - "node_modules/@radix-ui/react-tabs/node_modules/@radix-ui/react-id": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", - "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", + ], "license": "MIT", "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.1" + "@noble/curves": "1.8.1", + "@noble/hashes": "1.7.1", + "@scure/bip32": "1.6.2", + "@scure/bip39": "1.5.4", + "abitype": "1.0.8", + "isows": "1.0.6", + "ox": "0.6.7", + "ws": "8.18.0" }, "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "typescript": ">=5.0.4" }, "peerDependenciesMeta": { - "@types/react": { + "typescript": { "optional": true } } }, - "node_modules/@radix-ui/react-tabs/node_modules/@radix-ui/react-presence": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.4.tgz", - "integrity": "sha512-ueDqRbdc4/bkaQT3GIpLQssRlFgWaL/U2z/S31qRwwLWoxHLgry3SIfCwhxeQNbirEUXFa+lq3RL3oBYXtcmIA==", + "node_modules/@reown/appkit/node_modules/abitype": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.0.8.tgz", + "integrity": "sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg==", "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-use-layout-effect": "1.1.1" + "funding": { + "url": "https://github.com/sponsors/wevm" }, "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "typescript": ">=5.0.4", + "zod": "^3 >=3.22.0" }, "peerDependenciesMeta": { - "@types/react": { + "typescript": { "optional": true }, - "@types/react-dom": { + "zod": { "optional": true } } }, - "node_modules/@radix-ui/react-tabs/node_modules/@radix-ui/react-primitive": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", - "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "node_modules/@reown/appkit/node_modules/base-x": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-5.0.1.tgz", + "integrity": "sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==", + "license": "MIT" + }, + "node_modules/@reown/appkit/node_modules/bs58": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-6.0.0.tgz", + "integrity": "sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==", "license": "MIT", "dependencies": { - "@radix-ui/react-slot": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "base-x": "^5.0.0" } }, - "node_modules/@radix-ui/react-tabs/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "node_modules/@reown/appkit/node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", "license": "MIT", "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" + "readdirp": "^5.0.0" }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "engines": { + "node": ">= 20.19.0" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@reown/appkit/node_modules/isows": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.6.tgz", + "integrity": "sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" } + ], + "license": "MIT", + "peerDependencies": { + "ws": "*" } }, - "node_modules/@radix-ui/react-tabs/node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", - "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", + "node_modules/@reown/appkit/node_modules/lru-cache": { + "version": "11.2.4", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", + "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@reown/appkit/node_modules/multiformats": { + "version": "9.9.0", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", + "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==", + "license": "(Apache-2.0 AND MIT)" + }, + "node_modules/@reown/appkit/node_modules/ox": { + "version": "0.6.7", + "resolved": "https://registry.npmjs.org/ox/-/ox-0.6.7.tgz", + "integrity": "sha512-17Gk/eFsFRAZ80p5eKqv89a57uXjd3NgIf1CaXojATPBuujVc/fQSVhBeAU9JCRB+k7J50WQAyWTxK19T9GgbA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], "license": "MIT", "dependencies": { - "@radix-ui/react-use-effect-event": "0.0.2", - "@radix-ui/react-use-layout-effect": "1.1.1" + "@adraffy/ens-normalize": "^1.10.1", + "@noble/curves": "^1.6.0", + "@noble/hashes": "^1.5.0", + "@scure/bip32": "^1.5.0", + "@scure/bip39": "^1.4.0", + "abitype": "^1.0.6", + "eventemitter3": "5.0.1" }, "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "typescript": ">=5.4.0" }, "peerDependenciesMeta": { - "@types/react": { + "typescript": { "optional": true } } }, - "node_modules/@radix-ui/react-tabs/node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", - "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", + "node_modules/@reown/appkit/node_modules/readdirp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "engines": { + "node": ">= 20.19.0" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@radix-ui/react-toggle": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.1.9.tgz", - "integrity": "sha512-ZoFkBBz9zv9GWer7wIjvdRxmh2wyc2oKWw6C6CseWd6/yq1DK/l5lJ+wnsmFwJZbBYqr02mrf8A2q/CVCuM3ZA==", + "node_modules/@reown/appkit/node_modules/uint8arrays": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.0.tgz", + "integrity": "sha512-ei5rfKtoRO8OyOIor2Rz5fhzjThwIHJZ3uyDPnDHTXbP0aMQ1RN/6AI5B5d9dBxJOU+BvOAk7ZQ1xphsX8Lrog==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "multiformats": "^9.4.2" } }, - "node_modules/@radix-ui/react-toggle-group": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.1.10.tgz", - "integrity": "sha512-kiU694Km3WFLTC75DdqgM/3Jauf3rD9wxeS9XtyWFKsBUeZA337lC+6uUazT7I1DhanZ5gyD5Stf8uf2dbQxOQ==", + "node_modules/@reown/appkit/node_modules/unstorage": { + "version": "1.17.4", + "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.17.4.tgz", + "integrity": "sha512-fHK0yNg38tBiJKp/Vgsq4j0JEsCmgqH58HAn707S7zGkArbZsVr/CwINoi+nh3h98BRCwKvx1K3Xg9u3VV83sw==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.10", - "@radix-ui/react-toggle": "1.1.9", - "@radix-ui/react-use-controllable-state": "1.2.2" + "anymatch": "^3.1.3", + "chokidar": "^5.0.0", + "destr": "^2.0.5", + "h3": "^1.15.5", + "lru-cache": "^11.2.0", + "node-fetch-native": "^1.6.7", + "ofetch": "^1.5.1", + "ufo": "^1.6.3" }, "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@azure/app-configuration": "^1.8.0", + "@azure/cosmos": "^4.2.0", + "@azure/data-tables": "^13.3.0", + "@azure/identity": "^4.6.0", + "@azure/keyvault-secrets": "^4.9.0", + "@azure/storage-blob": "^12.26.0", + "@capacitor/preferences": "^6 || ^7 || ^8", + "@deno/kv": ">=0.9.0", + "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", + "@planetscale/database": "^1.19.0", + "@upstash/redis": "^1.34.3", + "@vercel/blob": ">=0.27.1", + "@vercel/functions": "^2.2.12 || ^3.0.0", + "@vercel/kv": "^1 || ^2 || ^3", + "aws4fetch": "^1.0.20", + "db0": ">=0.2.1", + "idb-keyval": "^6.2.1", + "ioredis": "^5.4.2", + "uploadthing": "^7.4.4" }, "peerDependenciesMeta": { - "@types/react": { + "@azure/app-configuration": { "optional": true }, - "@types/react-dom": { + "@azure/cosmos": { "optional": true - } - } - }, - "node_modules/@radix-ui/react-toggle-group/node_modules/@radix-ui/primitive": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.2.tgz", - "integrity": "sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA==", - "license": "MIT" - }, - "node_modules/@radix-ui/react-toggle-group/node_modules/@radix-ui/react-compose-refs": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", - "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { + }, + "@azure/data-tables": { "optional": true - } - } - }, - "node_modules/@radix-ui/react-toggle-group/node_modules/@radix-ui/react-context": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", - "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { + }, + "@azure/identity": { "optional": true - } - } - }, - "node_modules/@radix-ui/react-toggle-group/node_modules/@radix-ui/react-direction": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz", - "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { + }, + "@azure/keyvault-secrets": { + "optional": true + }, + "@azure/storage-blob": { + "optional": true + }, + "@capacitor/preferences": { + "optional": true + }, + "@deno/kv": { + "optional": true + }, + "@netlify/blobs": { + "optional": true + }, + "@planetscale/database": { + "optional": true + }, + "@upstash/redis": { + "optional": true + }, + "@vercel/blob": { + "optional": true + }, + "@vercel/functions": { + "optional": true + }, + "@vercel/kv": { + "optional": true + }, + "aws4fetch": { + "optional": true + }, + "db0": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "ioredis": { + "optional": true + }, + "uploadthing": { "optional": true } } }, - "node_modules/@radix-ui/react-toggle-group/node_modules/@radix-ui/react-primitive": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", - "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "node_modules/@reown/appkit/node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.3" + "engines": { + "node": ">=10.0.0" }, "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" }, "peerDependenciesMeta": { - "@types/react": { + "bufferutil": { "optional": true }, - "@types/react-dom": { + "utf-8-validate": { "optional": true } } }, - "node_modules/@radix-ui/react-toggle-group/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "node_modules/@reown/appkit/node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, + "optional": true, + "peer": true, + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/@reserve-protocol/dtf-rebalance-lib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/@reserve-protocol/dtf-rebalance-lib/-/dtf-rebalance-lib-2.6.3.tgz", + "integrity": "sha512-/c/SQ/VeyIUV9OA1pfnDILk6yIsKYnKnzPY5tcnwfeAarZPQdK370F4t9uGUv8LGuCkn+dEGmpifhmNiyMueCw==", "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "decimal.js-light": "^2.5.1" } }, - "node_modules/@radix-ui/react-toggle-group/node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", - "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", + "node_modules/@reserve-protocol/react-zapper": { + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/@reserve-protocol/react-zapper/-/react-zapper-1.5.8.tgz", + "integrity": "sha512-nWa439qun2BRQKPIHcoqiv+3WATT0cI/thcnDVuRIKzbUxK11/jttotx6WxUc5APBvJGYusJoix1fJ6ki1MkMA==", "license": "MIT", "dependencies": { - "@radix-ui/react-use-effect-event": "0.0.2", - "@radix-ui/react-use-layout-effect": "1.1.1" + "@lucide/lab": "^0.1.2", + "@radix-ui/react-accordion": "^1.2.11", + "@radix-ui/react-checkbox": "^1.3.2", + "@radix-ui/react-dialog": "^1.1.14", + "@radix-ui/react-dropdown-menu": "^2.1.15", + "@radix-ui/react-separator": "^1.1.7", + "@radix-ui/react-tabs": "^1.1.12", + "@radix-ui/react-toggle": "^1.1.9", + "@radix-ui/react-toggle-group": "^1.1.10", + "@radix-ui/react-tooltip": "^1.2.7", + "@tanstack/query-core": "^5.87.1", + "clsx": "^2.1.1", + "decimal.js-light": "^2.5.1", + "jotai": "^1.12.0", + "lucide-react": "^0.461.0", + "mixpanel-browser": "^2.56.0", + "next-themes": "^0.2.1", + "react": "^18.0.0", + "react-dom": "18.3.1", + "sonner": "^1.4.0", + "tailwind-merge": "^2.5.5", + "uuid": "^13.0.0" }, "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "@tanstack/react-query": "^5.87.4", + "react": "^18.0.0", + "wagmi": "^2.15.14" } }, - "node_modules/@radix-ui/react-toggle-group/node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", - "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", + "node_modules/@reserve-protocol/react-zapper/node_modules/jotai": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/jotai/-/jotai-1.13.1.tgz", + "integrity": "sha512-RUmH1S4vLsG3V6fbGlKzGJnLrDcC/HNb5gH2AeA9DzuJknoVxSGvvg8OBB7lke+gDc4oXmdVsaKn/xDUhWZ0vw==", "license": "MIT", + "engines": { + "node": ">=12.20.0" + }, "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@babel/core": "*", + "@babel/template": "*", + "jotai-devtools": "*", + "jotai-immer": "*", + "jotai-optics": "*", + "jotai-redux": "*", + "jotai-tanstack-query": "*", + "jotai-urql": "*", + "jotai-valtio": "*", + "jotai-xstate": "*", + "jotai-zustand": "*", + "react": ">=16.8" }, "peerDependenciesMeta": { - "@types/react": { + "@babel/core": { "optional": true - } - } - }, - "node_modules/@radix-ui/react-toggle/node_modules/@radix-ui/primitive": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.2.tgz", - "integrity": "sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA==", - "license": "MIT" - }, - "node_modules/@radix-ui/react-toggle/node_modules/@radix-ui/react-compose-refs": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", - "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { + }, + "@babel/template": { "optional": true - } - } - }, - "node_modules/@radix-ui/react-toggle/node_modules/@radix-ui/react-primitive": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", - "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { + }, + "jotai-devtools": { "optional": true }, - "@types/react-dom": { + "jotai-immer": { "optional": true - } - } - }, - "node_modules/@radix-ui/react-toggle/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { + }, + "jotai-optics": { "optional": true - } - } - }, - "node_modules/@radix-ui/react-toggle/node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", - "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-effect-event": "0.0.2", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { + }, + "jotai-redux": { "optional": true - } - } - }, - "node_modules/@radix-ui/react-toggle/node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", - "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { + }, + "jotai-tanstack-query": { "optional": true - } - } - }, - "node_modules/@radix-ui/react-tooltip": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.7.tgz", - "integrity": "sha512-Ap+fNYwKTYJ9pzqW+Xe2HtMRbQ/EeWkj2qykZ6SuEV4iS/o1bZI5ssJbk4D2r8XuDuOBVz/tIx2JObtuqU+5Zw==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.10", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-popper": "1.2.7", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.4", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-visually-hidden": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { + }, + "jotai-urql": { "optional": true }, - "@types/react-dom": { + "jotai-valtio": { "optional": true - } - } - }, - "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/primitive": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.2.tgz", - "integrity": "sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA==", - "license": "MIT" - }, - "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-arrow": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz", - "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { + }, + "jotai-xstate": { "optional": true }, - "@types/react-dom": { + "jotai-zustand": { "optional": true } } }, - "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-compose-refs": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", - "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", + "node_modules/@reserve-protocol/react-zapper/node_modules/next-themes": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.2.1.tgz", + "integrity": "sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A==", "license": "MIT", "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "next": "*", + "react": "*", + "react-dom": "*" } }, - "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-context": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", - "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", + "node_modules/@reserve-protocol/react-zapper/node_modules/uuid": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-13.0.0.tgz", + "integrity": "sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "bin": { + "uuid": "dist-node/bin/uuid" } }, - "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.10.tgz", - "integrity": "sha512-IM1zzRV4W3HtVgftdQiiOmA0AdJlCtMLe00FXaHwgt3rAnNsIyDqshvkIW3hj/iu5hu8ERP7KIYki6NkqDxAwQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-escape-keydown": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } + "node_modules/@reserve-protocol/rtokens": { + "version": "1.1.23", + "resolved": "https://registry.npmjs.org/@reserve-protocol/rtokens/-/rtokens-1.1.23.tgz", + "integrity": "sha512-VYP0BNhULhFzAGpzaqe1pkuMpCvLmuNYsYHE0xkKgiqaMZdztSlnCNK2BRlsDbFD/HQZwcoAoYjFpEHQbq2GoA==", + "license": "ISC" }, - "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-id": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", - "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.53", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.53.tgz", + "integrity": "sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ==", + "dev": true, + "license": "MIT" }, - "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-popper": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.7.tgz", - "integrity": "sha512-IUFAccz1JyKcf/RjB552PlWwxjeCJB8/4KxT7EhBHOJM+mN7LdW+B3kacJXILm32xawcMMjb2i0cIZpo+f9kiQ==", + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.55.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.55.3.tgz", + "integrity": "sha512-qyX8+93kK/7R5BEXPC2PjUt0+fS/VO2BVHjEHyIEWiYn88rcRBHmdLgoJjktBltgAf+NY7RfCGB1SoyKS/p9kg==", + "cpu": [ + "arm" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@floating-ui/react-dom": "^2.0.0", - "@radix-ui/react-arrow": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-use-rect": "1.1.1", - "@radix-ui/react-use-size": "1.1.1", - "@radix-ui/rect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } + "optional": true, + "os": [ + "android" + ] }, - "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-portal": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", - "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.55.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.55.3.tgz", + "integrity": "sha512-6sHrL42bjt5dHQzJ12Q4vMKfN+kUnZ0atHHnv4V0Wd9JMTk7FDzSY35+7qbz3ypQYMBPANbpGK7JpnWNnhGt8g==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } + "optional": true, + "os": [ + "android" + ] }, - "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-presence": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.4.tgz", - "integrity": "sha512-ueDqRbdc4/bkaQT3GIpLQssRlFgWaL/U2z/S31qRwwLWoxHLgry3SIfCwhxeQNbirEUXFa+lq3RL3oBYXtcmIA==", + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.55.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.55.3.tgz", + "integrity": "sha512-1ht2SpGIjEl2igJ9AbNpPIKzb1B5goXOcmtD0RFxnwNuMxqkR6AUaaErZz+4o+FKmzxcSNBOLrzsICZVNYa1Rw==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-primitive": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", - "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.55.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.55.3.tgz", + "integrity": "sha512-FYZ4iVunXxtT+CZqQoPVwPhH7549e/Gy7PIRRtq4t5f/vt54pX6eG9ebttRH6QSH7r/zxAFA4EZGlQ0h0FvXiA==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.55.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.55.3.tgz", + "integrity": "sha512-M/mwDCJ4wLsIgyxv2Lj7Len+UMHd4zAXu4GQ2UaCdksStglWhP61U3uowkaYBQBhVoNpwx5Hputo8eSqM7K82Q==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } + "optional": true, + "os": [ + "freebsd" + ] }, - "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-use-callback-ref": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", - "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.55.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.55.3.tgz", + "integrity": "sha512-5jZT2c7jBCrMegKYTYTpni8mg8y3uY8gzeq2ndFOANwNuC/xJbVAoGKR9LhMDA0H3nIhvaqUoBEuJoICBudFrA==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } + "optional": true, + "os": [ + "freebsd" + ] }, - "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", - "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.55.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.55.3.tgz", + "integrity": "sha512-YeGUhkN1oA+iSPzzhEjVPS29YbViOr8s4lSsFaZKLHswgqP911xx25fPOyE9+khmN6W4VeM0aevbDp4kkEoHiA==", + "cpu": [ + "arm" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@radix-ui/react-use-effect-event": "0.0.2", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-use-escape-keydown": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz", - "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==", + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.55.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.55.3.tgz", + "integrity": "sha512-eo0iOIOvcAlWB3Z3eh8pVM8hZ0oVkK3AjEM9nSrkSug2l15qHzF3TOwT0747omI6+CJJvl7drwZepT+re6Fy/w==", + "cpu": [ + "arm" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@radix-ui/react-use-callback-ref": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", - "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.55.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.55.3.tgz", + "integrity": "sha512-DJay3ep76bKUDImmn//W5SvpjRN5LmK/ntWyeJs/dcnwiiHESd3N4uteK9FDLf0S0W8E6Y0sVRXpOCoQclQqNg==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-use-rect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.1.tgz", - "integrity": "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==", + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.55.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.55.3.tgz", + "integrity": "sha512-BKKWQkY2WgJ5MC/ayvIJTHjy0JUGb5efaHCUiG/39sSUvAYRBaO3+/EK0AZT1RF3pSj86O24GLLik9mAYu0IJg==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@radix-ui/rect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-use-size": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz", - "integrity": "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-visually-hidden": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.3.tgz", - "integrity": "sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==", + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.55.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.55.3.tgz", + "integrity": "sha512-Q9nVlWtKAG7ISW80OiZGxTr6rYtyDSkauHUtvkQI6TNOJjFvpj4gcH+KaJihqYInnAzEEUetPQubRwHef4exVg==", + "cpu": [ + "loong64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/rect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz", - "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==", - "license": "MIT" + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.55.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.55.3.tgz", + "integrity": "sha512-2H5LmhzrpC4fFRNwknzmmTvvyJPHwESoJgyReXeFoYYuIDfBhP29TEXOkCJE/KxHi27mj7wDUClNq78ue3QEBQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@radix-ui/react-use-callback-ref": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", - "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.55.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.55.3.tgz", + "integrity": "sha512-9S542V0ie9LCTznPYlvaeySwBeIEa7rDBgLHKZ5S9DBgcqdJYburabm8TqiqG6mrdTzfV5uttQRHcbKff9lWtA==", + "cpu": [ + "ppc64" + ], + "dev": true, "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz", - "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==", + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.55.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.55.3.tgz", + "integrity": "sha512-ukxw+YH3XXpcezLgbJeasgxyTbdpnNAkrIlFGDl7t+pgCxZ89/6n1a+MxlY7CegU+nDgrgdqDelPRNQ/47zs0g==", + "cpu": [ + "ppc64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@radix-ui/react-use-callback-ref": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@radix-ui/react-use-effect-event": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz", - "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==", + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.55.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.55.3.tgz", + "integrity": "sha512-Iauw9UsTTvlF++FhghFJjqYxyXdggXsOqGpFBylaRopVpcbfyIIsNvkf9oGwfgIcf57z3m8+/oSYTo6HutBFNw==", + "cpu": [ + "riscv64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@radix-ui/react-use-effect-event/node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", - "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.55.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.55.3.tgz", + "integrity": "sha512-3OqKAHSEQXKdq9mQ4eajqUgNIK27VZPW3I26EP8miIzuKzCJ3aW3oEn2pzF+4/Hj/Moc0YDsOtBgT5bZ56/vcA==", + "cpu": [ + "riscv64" + ], + "dev": true, "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@radix-ui/react-use-escape-keydown": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.0.tgz", - "integrity": "sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==", + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.55.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.55.3.tgz", + "integrity": "sha512-0CM8dSVzVIaqMcXIFej8zZrSFLnGrAE8qlNbbHfTw1EEPnFTg1U1ekI0JdzjPyzSfUsHWtodilQQG/RA55berA==", + "cpu": [ + "s390x" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@radix-ui/react-use-callback-ref": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", - "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.55.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.55.3.tgz", + "integrity": "sha512-+fgJE12FZMIgBaKIAGd45rxf+5ftcycANJRWk8Vz0NnMTM5rADPGuRFTYar+Mqs560xuART7XsX2lSACa1iOmQ==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@radix-ui/react-use-previous": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.0.tgz", - "integrity": "sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==", + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.55.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.55.3.tgz", + "integrity": "sha512-tMD7NnbAolWPzQlJQJjVFh/fNH3K/KnA7K8gv2dJWCwwnaK6DFCYST1QXYWfu5V0cDwarWC8Sf/cfMHniNq21A==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@radix-ui/react-use-rect": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.0.tgz", - "integrity": "sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==", + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.55.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.55.3.tgz", + "integrity": "sha512-u5KsqxOxjEeIbn7bUK1MPM34jrnPwjeqgyin4/N6e/KzXKfpE9Mi0nCxcQjaM9lLmPcHmn/xx1yOjgTMtu1jWQ==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@radix-ui/rect": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } + "optional": true, + "os": [ + "openbsd" + ] }, - "node_modules/@radix-ui/react-use-size": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.0.tgz", - "integrity": "sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==", + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.55.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.55.3.tgz", + "integrity": "sha512-vo54aXwjpTtsAnb3ca7Yxs9t2INZg7QdXN/7yaoG7nPGbOBXYXQY41Km+S1Ov26vzOAzLcAjmMdjyEqS1JkVhw==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } + "optional": true, + "os": [ + "openharmony" + ] }, - "node_modules/@radix-ui/react-visually-hidden": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.1.2.tgz", - "integrity": "sha512-1SzA4ns2M1aRlvxErqhLHsBHoS5eI5UUcI2awAMgGUp4LoaoWOKYmvqDY2s/tltuPkh3Yk77YF/r3IRj+Amx4Q==", + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.55.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.55.3.tgz", + "integrity": "sha512-HI+PIVZ+m+9AgpnY3pt6rinUdRYrGHvmVdsNQ4odNqQ/eRF78DVpMR7mOq7nW06QxpczibwBmeQzB68wJ+4W4A==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.0.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/rect": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.0.tgz", - "integrity": "sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==", - "license": "MIT" - }, - "node_modules/@rainbow-me/rainbowkit": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/@rainbow-me/rainbowkit/-/rainbowkit-2.2.8.tgz", - "integrity": "sha512-EdNIK2cdAT6GJ9G11wx7nCVfjqBfxh7dx/1DhPYrB+yg+VFrII6cM1PiMFVC9evD4mqVHe9mmLAt3nvlwDdiPQ==", - "license": "MIT", - "dependencies": { - "@vanilla-extract/css": "1.17.3", - "@vanilla-extract/dynamic": "2.1.4", - "@vanilla-extract/sprinkles": "1.6.4", - "clsx": "2.1.1", - "cuer": "0.0.2", - "react-remove-scroll": "2.6.2", - "ua-parser-js": "^1.0.37" - }, - "engines": { - "node": ">=12.4" - }, - "peerDependencies": { - "@tanstack/react-query": ">=5.0.0", - "react": ">=18", - "react-dom": ">=18", - "viem": "2.x", - "wagmi": "^2.9.0" - } - }, - "node_modules/@rainbow-me/rainbowkit/node_modules/react-remove-scroll": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.6.2.tgz", - "integrity": "sha512-KmONPx5fnlXYJQqC62Q+lwIeAk64ws/cUw6omIumRzMRPqgnYqhSSti99nbj0Ry13bv7dF+BKn7NB+OqkdZGTw==", - "license": "MIT", - "dependencies": { - "react-remove-scroll-bar": "^2.3.7", - "react-style-singleton": "^2.2.1", - "tslib": "^2.1.0", - "use-callback-ref": "^1.3.3", - "use-sidecar": "^1.1.2" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@react-spring/animated": { - "version": "9.7.5", - "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.7.5.tgz", - "integrity": "sha512-Tqrwz7pIlsSDITzxoLS3n/v/YCUHQdOIKtOJf4yL6kYVSDTSmVK1LI1Q3M/uu2Sx4X3pIWF3xLUhlsA6SPNTNg==", - "license": "MIT", - "dependencies": { - "@react-spring/shared": "~9.7.5", - "@react-spring/types": "~9.7.5" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@react-spring/core": { - "version": "9.7.5", - "resolved": "https://registry.npmjs.org/@react-spring/core/-/core-9.7.5.tgz", - "integrity": "sha512-rmEqcxRcu7dWh7MnCcMXLvrf6/SDlSokLaLTxiPlAYi11nN3B5oiCUAblO72o+9z/87j2uzxa2Inm8UbLjXA+w==", - "license": "MIT", - "dependencies": { - "@react-spring/animated": "~9.7.5", - "@react-spring/shared": "~9.7.5", - "@react-spring/types": "~9.7.5" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/react-spring/donate" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@react-spring/rafz": { - "version": "9.7.5", - "resolved": "https://registry.npmjs.org/@react-spring/rafz/-/rafz-9.7.5.tgz", - "integrity": "sha512-5ZenDQMC48wjUzPAm1EtwQ5Ot3bLIAwwqP2w2owG5KoNdNHpEJV263nGhCeKKmuA3vG2zLLOdu3or6kuDjA6Aw==", - "license": "MIT" - }, - "node_modules/@react-spring/shared": { - "version": "9.7.5", - "resolved": "https://registry.npmjs.org/@react-spring/shared/-/shared-9.7.5.tgz", - "integrity": "sha512-wdtoJrhUeeyD/PP/zo+np2s1Z820Ohr/BbuVYv+3dVLW7WctoiN7std8rISoYoHpUXtbkpesSKuPIw/6U1w1Pw==", - "license": "MIT", - "dependencies": { - "@react-spring/rafz": "~9.7.5", - "@react-spring/types": "~9.7.5" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@react-spring/types": { - "version": "9.7.5", - "resolved": "https://registry.npmjs.org/@react-spring/types/-/types-9.7.5.tgz", - "integrity": "sha512-HVj7LrZ4ReHWBimBvu2SKND3cDVUPWKLqRTmWe/fNY6o1owGOX0cAHbdPDTMelgBlVbrTKrre6lFkhqGZErK/g==", - "license": "MIT" - }, - "node_modules/@react-spring/web": { - "version": "9.7.5", - "resolved": "https://registry.npmjs.org/@react-spring/web/-/web-9.7.5.tgz", - "integrity": "sha512-lmvqGwpe+CSttsWNZVr+Dg62adtKhauGwLyGE/RRyZ8AAMLgb9x3NDMA5RMElXo+IMyTkPp7nxTB8ZQlmhb6JQ==", - "license": "MIT", - "dependencies": { - "@react-spring/animated": "~9.7.5", - "@react-spring/core": "~9.7.5", - "@react-spring/shared": "~9.7.5", - "@react-spring/types": "~9.7.5" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@reown/appkit": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@reown/appkit/-/appkit-1.7.8.tgz", - "integrity": "sha512-51kTleozhA618T1UvMghkhKfaPcc9JlKwLJ5uV+riHyvSoWPKPRIa5A6M1Wano5puNyW0s3fwywhyqTHSilkaA==", - "license": "Apache-2.0", - "dependencies": { - "@reown/appkit-common": "1.7.8", - "@reown/appkit-controllers": "1.7.8", - "@reown/appkit-pay": "1.7.8", - "@reown/appkit-polyfills": "1.7.8", - "@reown/appkit-scaffold-ui": "1.7.8", - "@reown/appkit-ui": "1.7.8", - "@reown/appkit-utils": "1.7.8", - "@reown/appkit-wallet": "1.7.8", - "@walletconnect/types": "2.21.0", - "@walletconnect/universal-provider": "2.21.0", - "bs58": "6.0.0", - "valtio": "1.13.2", - "viem": ">=2.29.0" - } - }, - "node_modules/@reown/appkit-common": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@reown/appkit-common/-/appkit-common-1.7.8.tgz", - "integrity": "sha512-ridIhc/x6JOp7KbDdwGKY4zwf8/iK8EYBl+HtWrruutSLwZyVi5P8WaZa+8iajL6LcDcDF7LoyLwMTym7SRuwQ==", - "license": "Apache-2.0", - "dependencies": { - "big.js": "6.2.2", - "dayjs": "1.11.13", - "viem": ">=2.29.0" - } - }, - "node_modules/@reown/appkit-controllers": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@reown/appkit-controllers/-/appkit-controllers-1.7.8.tgz", - "integrity": "sha512-IdXlJlivrlj6m63VsGLsjtPHHsTWvKGVzWIP1fXZHVqmK+rZCBDjCi9j267Rb9/nYRGHWBtlFQhO8dK35WfeDA==", - "license": "Apache-2.0", - "dependencies": { - "@reown/appkit-common": "1.7.8", - "@reown/appkit-wallet": "1.7.8", - "@walletconnect/universal-provider": "2.21.0", - "valtio": "1.13.2", - "viem": ">=2.29.0" - } - }, - "node_modules/@reown/appkit-controllers/node_modules/@noble/ciphers": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.2.1.tgz", - "integrity": "sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA==", - "license": "MIT", - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@reown/appkit-controllers/node_modules/@noble/curves": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.8.1.tgz", - "integrity": "sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ==", - "license": "MIT", - "dependencies": { - "@noble/hashes": "1.7.1" - }, - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@reown/appkit-controllers/node_modules/@noble/hashes": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.7.1.tgz", - "integrity": "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==", - "license": "MIT", - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@reown/appkit-controllers/node_modules/@scure/bip32": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.6.2.tgz", - "integrity": "sha512-t96EPDMbtGgtb7onKKqxRLfE5g05k7uHnHRM2xdE6BP/ZmxaLtPek4J4KfVn/90IQNrU1IOAqMgiDtUdtbe3nw==", - "license": "MIT", - "dependencies": { - "@noble/curves": "~1.8.1", - "@noble/hashes": "~1.7.1", - "@scure/base": "~1.2.2" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@reown/appkit-controllers/node_modules/@scure/bip39": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.5.4.tgz", - "integrity": "sha512-TFM4ni0vKvCfBpohoh+/lY05i9gRbSwXWngAsF4CABQxoaOHijxuaZ2R6cStDQ5CHtHO9aGJTr4ksVJASRRyMA==", - "license": "MIT", - "dependencies": { - "@noble/hashes": "~1.7.1", - "@scure/base": "~1.2.4" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@reown/appkit-controllers/node_modules/@walletconnect/core": { - "version": "2.21.0", - "resolved": "https://registry.npmjs.org/@walletconnect/core/-/core-2.21.0.tgz", - "integrity": "sha512-o6R7Ua4myxR8aRUAJ1z3gT9nM+jd2B2mfamu6arzy1Cc6vi10fIwFWb6vg3bC8xJ6o9H3n/cN5TOW3aA9Y1XVw==", - "license": "Apache-2.0", - "dependencies": { - "@walletconnect/heartbeat": "1.2.2", - "@walletconnect/jsonrpc-provider": "1.0.14", - "@walletconnect/jsonrpc-types": "1.0.4", - "@walletconnect/jsonrpc-utils": "1.0.8", - "@walletconnect/jsonrpc-ws-connection": "1.0.16", - "@walletconnect/keyvaluestorage": "1.1.1", - "@walletconnect/logger": "2.1.2", - "@walletconnect/relay-api": "1.0.11", - "@walletconnect/relay-auth": "1.1.0", - "@walletconnect/safe-json": "1.0.2", - "@walletconnect/time": "1.0.2", - "@walletconnect/types": "2.21.0", - "@walletconnect/utils": "2.21.0", - "@walletconnect/window-getters": "1.0.1", - "es-toolkit": "1.33.0", - "events": "3.3.0", - "uint8arrays": "3.1.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@reown/appkit-controllers/node_modules/@walletconnect/keyvaluestorage": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@walletconnect/keyvaluestorage/-/keyvaluestorage-1.1.1.tgz", - "integrity": "sha512-V7ZQq2+mSxAq7MrRqDxanTzu2RcElfK1PfNYiaVnJgJ7Q7G7hTVwF8voIBx92qsRyGHZihrwNPHuZd1aKkd0rA==", - "license": "MIT", - "dependencies": { - "@walletconnect/safe-json": "^1.0.1", - "idb-keyval": "^6.2.1", - "unstorage": "^1.9.0" - }, - "peerDependencies": { - "@react-native-async-storage/async-storage": "1.x" - }, - "peerDependenciesMeta": { - "@react-native-async-storage/async-storage": { - "optional": true - } - } - }, - "node_modules/@reown/appkit-controllers/node_modules/@walletconnect/sign-client": { - "version": "2.21.0", - "resolved": "https://registry.npmjs.org/@walletconnect/sign-client/-/sign-client-2.21.0.tgz", - "integrity": "sha512-z7h+PeLa5Au2R591d/8ZlziE0stJvdzP9jNFzFolf2RG/OiXulgFKum8PrIyXy+Rg2q95U9nRVUF9fWcn78yBA==", - "license": "Apache-2.0", - "dependencies": { - "@walletconnect/core": "2.21.0", - "@walletconnect/events": "1.0.1", - "@walletconnect/heartbeat": "1.2.2", - "@walletconnect/jsonrpc-utils": "1.0.8", - "@walletconnect/logger": "2.1.2", - "@walletconnect/time": "1.0.2", - "@walletconnect/types": "2.21.0", - "@walletconnect/utils": "2.21.0", - "events": "3.3.0" - } - }, - "node_modules/@reown/appkit-controllers/node_modules/@walletconnect/types": { - "version": "2.21.0", - "resolved": "https://registry.npmjs.org/@walletconnect/types/-/types-2.21.0.tgz", - "integrity": "sha512-ll+9upzqt95ZBWcfkOszXZkfnpbJJ2CmxMfGgE5GmhdxxxCcO5bGhXkI+x8OpiS555RJ/v/sXJYMSOLkmu4fFw==", - "license": "Apache-2.0", - "dependencies": { - "@walletconnect/events": "1.0.1", - "@walletconnect/heartbeat": "1.2.2", - "@walletconnect/jsonrpc-types": "1.0.4", - "@walletconnect/keyvaluestorage": "1.1.1", - "@walletconnect/logger": "2.1.2", - "events": "3.3.0" - } - }, - "node_modules/@reown/appkit-controllers/node_modules/@walletconnect/universal-provider": { - "version": "2.21.0", - "resolved": "https://registry.npmjs.org/@walletconnect/universal-provider/-/universal-provider-2.21.0.tgz", - "integrity": "sha512-mtUQvewt+X0VBQay/xOJBvxsB3Xsm1lTwFjZ6WUwSOTR1X+FNb71hSApnV5kbsdDIpYPXeQUbGt2se1n5E5UBg==", - "license": "Apache-2.0", - "dependencies": { - "@walletconnect/events": "1.0.1", - "@walletconnect/jsonrpc-http-connection": "1.0.8", - "@walletconnect/jsonrpc-provider": "1.0.14", - "@walletconnect/jsonrpc-types": "1.0.4", - "@walletconnect/jsonrpc-utils": "1.0.8", - "@walletconnect/keyvaluestorage": "1.1.1", - "@walletconnect/logger": "2.1.2", - "@walletconnect/sign-client": "2.21.0", - "@walletconnect/types": "2.21.0", - "@walletconnect/utils": "2.21.0", - "es-toolkit": "1.33.0", - "events": "3.3.0" - } - }, - "node_modules/@reown/appkit-controllers/node_modules/@walletconnect/utils": { - "version": "2.21.0", - "resolved": "https://registry.npmjs.org/@walletconnect/utils/-/utils-2.21.0.tgz", - "integrity": "sha512-zfHLiUoBrQ8rP57HTPXW7rQMnYxYI4gT9yTACxVW6LhIFROTF6/ytm5SKNoIvi4a5nX5dfXG4D9XwQUCu8Ilig==", - "license": "Apache-2.0", - "dependencies": { - "@noble/ciphers": "1.2.1", - "@noble/curves": "1.8.1", - "@noble/hashes": "1.7.1", - "@walletconnect/jsonrpc-utils": "1.0.8", - "@walletconnect/keyvaluestorage": "1.1.1", - "@walletconnect/relay-api": "1.0.11", - "@walletconnect/relay-auth": "1.1.0", - "@walletconnect/safe-json": "1.0.2", - "@walletconnect/time": "1.0.2", - "@walletconnect/types": "2.21.0", - "@walletconnect/window-getters": "1.0.1", - "@walletconnect/window-metadata": "1.0.1", - "bs58": "6.0.0", - "detect-browser": "5.3.0", - "query-string": "7.1.3", - "uint8arrays": "3.1.0", - "viem": "2.23.2" - } - }, - "node_modules/@reown/appkit-controllers/node_modules/@walletconnect/utils/node_modules/viem": { - "version": "2.23.2", - "resolved": "https://registry.npmjs.org/viem/-/viem-2.23.2.tgz", - "integrity": "sha512-NVmW/E0c5crMOtbEAqMF0e3NmvQykFXhLOc/CkLIXOlzHSA6KXVz3CYVmaKqBF8/xtjsjHAGjdJN3Ru1kFJLaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/wevm" - } - ], - "license": "MIT", - "dependencies": { - "@noble/curves": "1.8.1", - "@noble/hashes": "1.7.1", - "@scure/bip32": "1.6.2", - "@scure/bip39": "1.5.4", - "abitype": "1.0.8", - "isows": "1.0.6", - "ox": "0.6.7", - "ws": "8.18.0" - }, - "peerDependencies": { - "typescript": ">=5.0.4" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@reown/appkit-controllers/node_modules/abitype": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.0.8.tgz", - "integrity": "sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/wevm" - }, - "peerDependencies": { - "typescript": ">=5.0.4", - "zod": "^3 >=3.22.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - }, - "zod": { - "optional": true - } - } - }, - "node_modules/@reown/appkit-controllers/node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "license": "MIT", - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@reown/appkit-controllers/node_modules/isows": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.6.tgz", - "integrity": "sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/wevm" - } - ], - "license": "MIT", - "peerDependencies": { - "ws": "*" - } - }, - "node_modules/@reown/appkit-controllers/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" - }, - "node_modules/@reown/appkit-controllers/node_modules/multiformats": { - "version": "9.9.0", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", - "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==", - "license": "(Apache-2.0 AND MIT)" - }, - "node_modules/@reown/appkit-controllers/node_modules/ox": { - "version": "0.6.7", - "resolved": "https://registry.npmjs.org/ox/-/ox-0.6.7.tgz", - "integrity": "sha512-17Gk/eFsFRAZ80p5eKqv89a57uXjd3NgIf1CaXojATPBuujVc/fQSVhBeAU9JCRB+k7J50WQAyWTxK19T9GgbA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/wevm" - } - ], - "license": "MIT", - "dependencies": { - "@adraffy/ens-normalize": "^1.10.1", - "@noble/curves": "^1.6.0", - "@noble/hashes": "^1.5.0", - "@scure/bip32": "^1.5.0", - "@scure/bip39": "^1.4.0", - "abitype": "^1.0.6", - "eventemitter3": "5.0.1" - }, - "peerDependencies": { - "typescript": ">=5.4.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@reown/appkit-controllers/node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", - "license": "MIT", - "engines": { - "node": ">= 14.18.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@reown/appkit-controllers/node_modules/uint8arrays": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.0.tgz", - "integrity": "sha512-ei5rfKtoRO8OyOIor2Rz5fhzjThwIHJZ3uyDPnDHTXbP0aMQ1RN/6AI5B5d9dBxJOU+BvOAk7ZQ1xphsX8Lrog==", - "license": "MIT", - "dependencies": { - "multiformats": "^9.4.2" - } - }, - "node_modules/@reown/appkit-controllers/node_modules/unstorage": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.17.1.tgz", - "integrity": "sha512-KKGwRTT0iVBCErKemkJCLs7JdxNVfqTPc/85ae1XES0+bsHbc/sFBfVi5kJp156cc51BHinIH2l3k0EZ24vOBQ==", - "license": "MIT", - "dependencies": { - "anymatch": "^3.1.3", - "chokidar": "^4.0.3", - "destr": "^2.0.5", - "h3": "^1.15.4", - "lru-cache": "^10.4.3", - "node-fetch-native": "^1.6.7", - "ofetch": "^1.4.1", - "ufo": "^1.6.1" - }, - "peerDependencies": { - "@azure/app-configuration": "^1.8.0", - "@azure/cosmos": "^4.2.0", - "@azure/data-tables": "^13.3.0", - "@azure/identity": "^4.6.0", - "@azure/keyvault-secrets": "^4.9.0", - "@azure/storage-blob": "^12.26.0", - "@capacitor/preferences": "^6.0.3 || ^7.0.0", - "@deno/kv": ">=0.9.0", - "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", - "@planetscale/database": "^1.19.0", - "@upstash/redis": "^1.34.3", - "@vercel/blob": ">=0.27.1", - "@vercel/functions": "^2.2.12 || ^3.0.0", - "@vercel/kv": "^1.0.1", - "aws4fetch": "^1.0.20", - "db0": ">=0.2.1", - "idb-keyval": "^6.2.1", - "ioredis": "^5.4.2", - "uploadthing": "^7.4.4" - }, - "peerDependenciesMeta": { - "@azure/app-configuration": { - "optional": true - }, - "@azure/cosmos": { - "optional": true - }, - "@azure/data-tables": { - "optional": true - }, - "@azure/identity": { - "optional": true - }, - "@azure/keyvault-secrets": { - "optional": true - }, - "@azure/storage-blob": { - "optional": true - }, - "@capacitor/preferences": { - "optional": true - }, - "@deno/kv": { - "optional": true - }, - "@netlify/blobs": { - "optional": true - }, - "@planetscale/database": { - "optional": true - }, - "@upstash/redis": { - "optional": true - }, - "@vercel/blob": { - "optional": true - }, - "@vercel/functions": { - "optional": true - }, - "@vercel/kv": { - "optional": true - }, - "aws4fetch": { - "optional": true - }, - "db0": { - "optional": true - }, - "idb-keyval": { - "optional": true - }, - "ioredis": { - "optional": true - }, - "uploadthing": { - "optional": true - } - } - }, - "node_modules/@reown/appkit-controllers/node_modules/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/@reown/appkit-pay": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@reown/appkit-pay/-/appkit-pay-1.7.8.tgz", - "integrity": "sha512-OSGQ+QJkXx0FEEjlpQqIhT8zGJKOoHzVnyy/0QFrl3WrQTjCzg0L6+i91Ad5Iy1zb6V5JjqtfIFpRVRWN4M3pw==", - "license": "Apache-2.0", - "dependencies": { - "@reown/appkit-common": "1.7.8", - "@reown/appkit-controllers": "1.7.8", - "@reown/appkit-ui": "1.7.8", - "@reown/appkit-utils": "1.7.8", - "lit": "3.3.0", - "valtio": "1.13.2" - } - }, - "node_modules/@reown/appkit-polyfills": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@reown/appkit-polyfills/-/appkit-polyfills-1.7.8.tgz", - "integrity": "sha512-W/kq786dcHHAuJ3IV2prRLEgD/2iOey4ueMHf1sIFjhhCGMynMkhsOhQMUH0tzodPqUgAC494z4bpIDYjwWXaA==", - "license": "Apache-2.0", - "dependencies": { - "buffer": "6.0.3" - } - }, - "node_modules/@reown/appkit-scaffold-ui": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@reown/appkit-scaffold-ui/-/appkit-scaffold-ui-1.7.8.tgz", - "integrity": "sha512-RCeHhAwOrIgcvHwYlNWMcIDibdI91waaoEYBGw71inE0kDB8uZbE7tE6DAXJmDkvl0qPh+DqlC4QbJLF1FVYdQ==", - "license": "Apache-2.0", - "dependencies": { - "@reown/appkit-common": "1.7.8", - "@reown/appkit-controllers": "1.7.8", - "@reown/appkit-ui": "1.7.8", - "@reown/appkit-utils": "1.7.8", - "@reown/appkit-wallet": "1.7.8", - "lit": "3.3.0" - } - }, - "node_modules/@reown/appkit-ui": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@reown/appkit-ui/-/appkit-ui-1.7.8.tgz", - "integrity": "sha512-1hjCKjf6FLMFzrulhl0Y9Vb9Fu4royE+SXCPSWh4VhZhWqlzUFc7kutnZKx8XZFVQH4pbBvY62SpRC93gqoHow==", - "license": "Apache-2.0", - "dependencies": { - "@reown/appkit-common": "1.7.8", - "@reown/appkit-controllers": "1.7.8", - "@reown/appkit-wallet": "1.7.8", - "lit": "3.3.0", - "qrcode": "1.5.3" - } - }, - "node_modules/@reown/appkit-ui/node_modules/qrcode": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.3.tgz", - "integrity": "sha512-puyri6ApkEHYiVl4CFzo1tDkAZ+ATcnbJrJ6RiBM1Fhctdn/ix9MTE3hRph33omisEbC/2fcfemsseiKgBPKZg==", - "license": "MIT", - "dependencies": { - "dijkstrajs": "^1.0.1", - "encode-utf8": "^1.0.3", - "pngjs": "^5.0.0", - "yargs": "^15.3.1" - }, - "bin": { - "qrcode": "bin/qrcode" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/@reown/appkit-utils": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@reown/appkit-utils/-/appkit-utils-1.7.8.tgz", - "integrity": "sha512-8X7UvmE8GiaoitCwNoB86pttHgQtzy4ryHZM9kQpvjQ0ULpiER44t1qpVLXNM4X35O0v18W0Dk60DnYRMH2WRw==", - "license": "Apache-2.0", - "dependencies": { - "@reown/appkit-common": "1.7.8", - "@reown/appkit-controllers": "1.7.8", - "@reown/appkit-polyfills": "1.7.8", - "@reown/appkit-wallet": "1.7.8", - "@walletconnect/logger": "2.1.2", - "@walletconnect/universal-provider": "2.21.0", - "valtio": "1.13.2", - "viem": ">=2.29.0" - }, - "peerDependencies": { - "valtio": "1.13.2" - } - }, - "node_modules/@reown/appkit-utils/node_modules/@noble/ciphers": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.2.1.tgz", - "integrity": "sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA==", - "license": "MIT", - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@reown/appkit-utils/node_modules/@noble/curves": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.8.1.tgz", - "integrity": "sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ==", - "license": "MIT", - "dependencies": { - "@noble/hashes": "1.7.1" - }, - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@reown/appkit-utils/node_modules/@noble/hashes": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.7.1.tgz", - "integrity": "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==", - "license": "MIT", - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@reown/appkit-utils/node_modules/@scure/bip32": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.6.2.tgz", - "integrity": "sha512-t96EPDMbtGgtb7onKKqxRLfE5g05k7uHnHRM2xdE6BP/ZmxaLtPek4J4KfVn/90IQNrU1IOAqMgiDtUdtbe3nw==", - "license": "MIT", - "dependencies": { - "@noble/curves": "~1.8.1", - "@noble/hashes": "~1.7.1", - "@scure/base": "~1.2.2" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@reown/appkit-utils/node_modules/@scure/bip39": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.5.4.tgz", - "integrity": "sha512-TFM4ni0vKvCfBpohoh+/lY05i9gRbSwXWngAsF4CABQxoaOHijxuaZ2R6cStDQ5CHtHO9aGJTr4ksVJASRRyMA==", - "license": "MIT", - "dependencies": { - "@noble/hashes": "~1.7.1", - "@scure/base": "~1.2.4" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@reown/appkit-utils/node_modules/@walletconnect/core": { - "version": "2.21.0", - "resolved": "https://registry.npmjs.org/@walletconnect/core/-/core-2.21.0.tgz", - "integrity": "sha512-o6R7Ua4myxR8aRUAJ1z3gT9nM+jd2B2mfamu6arzy1Cc6vi10fIwFWb6vg3bC8xJ6o9H3n/cN5TOW3aA9Y1XVw==", - "license": "Apache-2.0", - "dependencies": { - "@walletconnect/heartbeat": "1.2.2", - "@walletconnect/jsonrpc-provider": "1.0.14", - "@walletconnect/jsonrpc-types": "1.0.4", - "@walletconnect/jsonrpc-utils": "1.0.8", - "@walletconnect/jsonrpc-ws-connection": "1.0.16", - "@walletconnect/keyvaluestorage": "1.1.1", - "@walletconnect/logger": "2.1.2", - "@walletconnect/relay-api": "1.0.11", - "@walletconnect/relay-auth": "1.1.0", - "@walletconnect/safe-json": "1.0.2", - "@walletconnect/time": "1.0.2", - "@walletconnect/types": "2.21.0", - "@walletconnect/utils": "2.21.0", - "@walletconnect/window-getters": "1.0.1", - "es-toolkit": "1.33.0", - "events": "3.3.0", - "uint8arrays": "3.1.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@reown/appkit-utils/node_modules/@walletconnect/keyvaluestorage": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@walletconnect/keyvaluestorage/-/keyvaluestorage-1.1.1.tgz", - "integrity": "sha512-V7ZQq2+mSxAq7MrRqDxanTzu2RcElfK1PfNYiaVnJgJ7Q7G7hTVwF8voIBx92qsRyGHZihrwNPHuZd1aKkd0rA==", - "license": "MIT", - "dependencies": { - "@walletconnect/safe-json": "^1.0.1", - "idb-keyval": "^6.2.1", - "unstorage": "^1.9.0" - }, - "peerDependencies": { - "@react-native-async-storage/async-storage": "1.x" - }, - "peerDependenciesMeta": { - "@react-native-async-storage/async-storage": { - "optional": true - } - } - }, - "node_modules/@reown/appkit-utils/node_modules/@walletconnect/sign-client": { - "version": "2.21.0", - "resolved": "https://registry.npmjs.org/@walletconnect/sign-client/-/sign-client-2.21.0.tgz", - "integrity": "sha512-z7h+PeLa5Au2R591d/8ZlziE0stJvdzP9jNFzFolf2RG/OiXulgFKum8PrIyXy+Rg2q95U9nRVUF9fWcn78yBA==", - "license": "Apache-2.0", - "dependencies": { - "@walletconnect/core": "2.21.0", - "@walletconnect/events": "1.0.1", - "@walletconnect/heartbeat": "1.2.2", - "@walletconnect/jsonrpc-utils": "1.0.8", - "@walletconnect/logger": "2.1.2", - "@walletconnect/time": "1.0.2", - "@walletconnect/types": "2.21.0", - "@walletconnect/utils": "2.21.0", - "events": "3.3.0" - } - }, - "node_modules/@reown/appkit-utils/node_modules/@walletconnect/types": { - "version": "2.21.0", - "resolved": "https://registry.npmjs.org/@walletconnect/types/-/types-2.21.0.tgz", - "integrity": "sha512-ll+9upzqt95ZBWcfkOszXZkfnpbJJ2CmxMfGgE5GmhdxxxCcO5bGhXkI+x8OpiS555RJ/v/sXJYMSOLkmu4fFw==", - "license": "Apache-2.0", - "dependencies": { - "@walletconnect/events": "1.0.1", - "@walletconnect/heartbeat": "1.2.2", - "@walletconnect/jsonrpc-types": "1.0.4", - "@walletconnect/keyvaluestorage": "1.1.1", - "@walletconnect/logger": "2.1.2", - "events": "3.3.0" - } - }, - "node_modules/@reown/appkit-utils/node_modules/@walletconnect/universal-provider": { - "version": "2.21.0", - "resolved": "https://registry.npmjs.org/@walletconnect/universal-provider/-/universal-provider-2.21.0.tgz", - "integrity": "sha512-mtUQvewt+X0VBQay/xOJBvxsB3Xsm1lTwFjZ6WUwSOTR1X+FNb71hSApnV5kbsdDIpYPXeQUbGt2se1n5E5UBg==", - "license": "Apache-2.0", - "dependencies": { - "@walletconnect/events": "1.0.1", - "@walletconnect/jsonrpc-http-connection": "1.0.8", - "@walletconnect/jsonrpc-provider": "1.0.14", - "@walletconnect/jsonrpc-types": "1.0.4", - "@walletconnect/jsonrpc-utils": "1.0.8", - "@walletconnect/keyvaluestorage": "1.1.1", - "@walletconnect/logger": "2.1.2", - "@walletconnect/sign-client": "2.21.0", - "@walletconnect/types": "2.21.0", - "@walletconnect/utils": "2.21.0", - "es-toolkit": "1.33.0", - "events": "3.3.0" - } - }, - "node_modules/@reown/appkit-utils/node_modules/@walletconnect/utils": { - "version": "2.21.0", - "resolved": "https://registry.npmjs.org/@walletconnect/utils/-/utils-2.21.0.tgz", - "integrity": "sha512-zfHLiUoBrQ8rP57HTPXW7rQMnYxYI4gT9yTACxVW6LhIFROTF6/ytm5SKNoIvi4a5nX5dfXG4D9XwQUCu8Ilig==", - "license": "Apache-2.0", - "dependencies": { - "@noble/ciphers": "1.2.1", - "@noble/curves": "1.8.1", - "@noble/hashes": "1.7.1", - "@walletconnect/jsonrpc-utils": "1.0.8", - "@walletconnect/keyvaluestorage": "1.1.1", - "@walletconnect/relay-api": "1.0.11", - "@walletconnect/relay-auth": "1.1.0", - "@walletconnect/safe-json": "1.0.2", - "@walletconnect/time": "1.0.2", - "@walletconnect/types": "2.21.0", - "@walletconnect/window-getters": "1.0.1", - "@walletconnect/window-metadata": "1.0.1", - "bs58": "6.0.0", - "detect-browser": "5.3.0", - "query-string": "7.1.3", - "uint8arrays": "3.1.0", - "viem": "2.23.2" - } - }, - "node_modules/@reown/appkit-utils/node_modules/@walletconnect/utils/node_modules/viem": { - "version": "2.23.2", - "resolved": "https://registry.npmjs.org/viem/-/viem-2.23.2.tgz", - "integrity": "sha512-NVmW/E0c5crMOtbEAqMF0e3NmvQykFXhLOc/CkLIXOlzHSA6KXVz3CYVmaKqBF8/xtjsjHAGjdJN3Ru1kFJLaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/wevm" - } - ], - "license": "MIT", - "dependencies": { - "@noble/curves": "1.8.1", - "@noble/hashes": "1.7.1", - "@scure/bip32": "1.6.2", - "@scure/bip39": "1.5.4", - "abitype": "1.0.8", - "isows": "1.0.6", - "ox": "0.6.7", - "ws": "8.18.0" - }, - "peerDependencies": { - "typescript": ">=5.0.4" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@reown/appkit-utils/node_modules/abitype": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.0.8.tgz", - "integrity": "sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/wevm" - }, - "peerDependencies": { - "typescript": ">=5.0.4", - "zod": "^3 >=3.22.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - }, - "zod": { - "optional": true - } - } - }, - "node_modules/@reown/appkit-utils/node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "license": "MIT", - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@reown/appkit-utils/node_modules/isows": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.6.tgz", - "integrity": "sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/wevm" - } - ], - "license": "MIT", - "peerDependencies": { - "ws": "*" - } - }, - "node_modules/@reown/appkit-utils/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" - }, - "node_modules/@reown/appkit-utils/node_modules/multiformats": { - "version": "9.9.0", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", - "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==", - "license": "(Apache-2.0 AND MIT)" - }, - "node_modules/@reown/appkit-utils/node_modules/ox": { - "version": "0.6.7", - "resolved": "https://registry.npmjs.org/ox/-/ox-0.6.7.tgz", - "integrity": "sha512-17Gk/eFsFRAZ80p5eKqv89a57uXjd3NgIf1CaXojATPBuujVc/fQSVhBeAU9JCRB+k7J50WQAyWTxK19T9GgbA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/wevm" - } - ], - "license": "MIT", - "dependencies": { - "@adraffy/ens-normalize": "^1.10.1", - "@noble/curves": "^1.6.0", - "@noble/hashes": "^1.5.0", - "@scure/bip32": "^1.5.0", - "@scure/bip39": "^1.4.0", - "abitype": "^1.0.6", - "eventemitter3": "5.0.1" - }, - "peerDependencies": { - "typescript": ">=5.4.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@reown/appkit-utils/node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", - "license": "MIT", - "engines": { - "node": ">= 14.18.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@reown/appkit-utils/node_modules/uint8arrays": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.0.tgz", - "integrity": "sha512-ei5rfKtoRO8OyOIor2Rz5fhzjThwIHJZ3uyDPnDHTXbP0aMQ1RN/6AI5B5d9dBxJOU+BvOAk7ZQ1xphsX8Lrog==", - "license": "MIT", - "dependencies": { - "multiformats": "^9.4.2" - } - }, - "node_modules/@reown/appkit-utils/node_modules/unstorage": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.17.1.tgz", - "integrity": "sha512-KKGwRTT0iVBCErKemkJCLs7JdxNVfqTPc/85ae1XES0+bsHbc/sFBfVi5kJp156cc51BHinIH2l3k0EZ24vOBQ==", - "license": "MIT", - "dependencies": { - "anymatch": "^3.1.3", - "chokidar": "^4.0.3", - "destr": "^2.0.5", - "h3": "^1.15.4", - "lru-cache": "^10.4.3", - "node-fetch-native": "^1.6.7", - "ofetch": "^1.4.1", - "ufo": "^1.6.1" - }, - "peerDependencies": { - "@azure/app-configuration": "^1.8.0", - "@azure/cosmos": "^4.2.0", - "@azure/data-tables": "^13.3.0", - "@azure/identity": "^4.6.0", - "@azure/keyvault-secrets": "^4.9.0", - "@azure/storage-blob": "^12.26.0", - "@capacitor/preferences": "^6.0.3 || ^7.0.0", - "@deno/kv": ">=0.9.0", - "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", - "@planetscale/database": "^1.19.0", - "@upstash/redis": "^1.34.3", - "@vercel/blob": ">=0.27.1", - "@vercel/functions": "^2.2.12 || ^3.0.0", - "@vercel/kv": "^1.0.1", - "aws4fetch": "^1.0.20", - "db0": ">=0.2.1", - "idb-keyval": "^6.2.1", - "ioredis": "^5.4.2", - "uploadthing": "^7.4.4" - }, - "peerDependenciesMeta": { - "@azure/app-configuration": { - "optional": true - }, - "@azure/cosmos": { - "optional": true - }, - "@azure/data-tables": { - "optional": true - }, - "@azure/identity": { - "optional": true - }, - "@azure/keyvault-secrets": { - "optional": true - }, - "@azure/storage-blob": { - "optional": true - }, - "@capacitor/preferences": { - "optional": true - }, - "@deno/kv": { - "optional": true - }, - "@netlify/blobs": { - "optional": true - }, - "@planetscale/database": { - "optional": true - }, - "@upstash/redis": { - "optional": true - }, - "@vercel/blob": { - "optional": true - }, - "@vercel/functions": { - "optional": true - }, - "@vercel/kv": { - "optional": true - }, - "aws4fetch": { - "optional": true - }, - "db0": { - "optional": true - }, - "idb-keyval": { - "optional": true - }, - "ioredis": { - "optional": true - }, - "uploadthing": { - "optional": true - } - } - }, - "node_modules/@reown/appkit-utils/node_modules/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/@reown/appkit-wallet": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@reown/appkit-wallet/-/appkit-wallet-1.7.8.tgz", - "integrity": "sha512-kspz32EwHIOT/eg/ZQbFPxgXq0B/olDOj3YMu7gvLEFz4xyOFd/wgzxxAXkp5LbG4Cp++s/elh79rVNmVFdB9A==", - "license": "Apache-2.0", - "dependencies": { - "@reown/appkit-common": "1.7.8", - "@reown/appkit-polyfills": "1.7.8", - "@walletconnect/logger": "2.1.2", - "zod": "3.22.4" - } - }, - "node_modules/@reown/appkit-wallet/node_modules/zod": { - "version": "3.22.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", - "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/@reown/appkit/node_modules/@noble/ciphers": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.2.1.tgz", - "integrity": "sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA==", - "license": "MIT", - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@reown/appkit/node_modules/@noble/curves": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.8.1.tgz", - "integrity": "sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ==", - "license": "MIT", - "dependencies": { - "@noble/hashes": "1.7.1" - }, - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@reown/appkit/node_modules/@noble/hashes": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.7.1.tgz", - "integrity": "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==", - "license": "MIT", - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/@reown/appkit/node_modules/@scure/bip32": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.6.2.tgz", - "integrity": "sha512-t96EPDMbtGgtb7onKKqxRLfE5g05k7uHnHRM2xdE6BP/ZmxaLtPek4J4KfVn/90IQNrU1IOAqMgiDtUdtbe3nw==", + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.55.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.55.3.tgz", + "integrity": "sha512-vRByotbdMo3Wdi+8oC2nVxtc3RkkFKrGaok+a62AT8lz/YBuQjaVYAS5Zcs3tPzW43Vsf9J0wehJbUY5xRSekA==", + "cpu": [ + "ia32" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@noble/curves": "~1.8.1", - "@noble/hashes": "~1.7.1", - "@scure/base": "~1.2.2" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/@reown/appkit/node_modules/@scure/bip39": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.5.4.tgz", - "integrity": "sha512-TFM4ni0vKvCfBpohoh+/lY05i9gRbSwXWngAsF4CABQxoaOHijxuaZ2R6cStDQ5CHtHO9aGJTr4ksVJASRRyMA==", + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.55.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.55.3.tgz", + "integrity": "sha512-POZHq7UeuzMJljC5NjKi8vKMFN6/5EOqcX1yGntNLp7rUTpBAXQ1hW8kWPFxYLv07QMcNM75xqVLGPWQq6TKFA==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@noble/hashes": "~1.7.1", - "@scure/base": "~1.2.4" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@reown/appkit/node_modules/@walletconnect/core": { - "version": "2.21.0", - "resolved": "https://registry.npmjs.org/@walletconnect/core/-/core-2.21.0.tgz", - "integrity": "sha512-o6R7Ua4myxR8aRUAJ1z3gT9nM+jd2B2mfamu6arzy1Cc6vi10fIwFWb6vg3bC8xJ6o9H3n/cN5TOW3aA9Y1XVw==", - "license": "Apache-2.0", - "dependencies": { - "@walletconnect/heartbeat": "1.2.2", - "@walletconnect/jsonrpc-provider": "1.0.14", - "@walletconnect/jsonrpc-types": "1.0.4", - "@walletconnect/jsonrpc-utils": "1.0.8", - "@walletconnect/jsonrpc-ws-connection": "1.0.16", - "@walletconnect/keyvaluestorage": "1.1.1", - "@walletconnect/logger": "2.1.2", - "@walletconnect/relay-api": "1.0.11", - "@walletconnect/relay-auth": "1.1.0", - "@walletconnect/safe-json": "1.0.2", - "@walletconnect/time": "1.0.2", - "@walletconnect/types": "2.21.0", - "@walletconnect/utils": "2.21.0", - "@walletconnect/window-getters": "1.0.1", - "es-toolkit": "1.33.0", - "events": "3.3.0", - "uint8arrays": "3.1.0" - }, - "engines": { - "node": ">=18" - } + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/@reown/appkit/node_modules/@walletconnect/keyvaluestorage": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@walletconnect/keyvaluestorage/-/keyvaluestorage-1.1.1.tgz", - "integrity": "sha512-V7ZQq2+mSxAq7MrRqDxanTzu2RcElfK1PfNYiaVnJgJ7Q7G7hTVwF8voIBx92qsRyGHZihrwNPHuZd1aKkd0rA==", + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.55.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.55.3.tgz", + "integrity": "sha512-aPFONczE4fUFKNXszdvnd2GqKEYQdV5oEsIbKPujJmWlCI9zEsv1Otig8RKK+X9bed9gFUN6LAeN4ZcNuu4zjg==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@walletconnect/safe-json": "^1.0.1", - "idb-keyval": "^6.2.1", - "unstorage": "^1.9.0" - }, - "peerDependencies": { - "@react-native-async-storage/async-storage": "1.x" - }, - "peerDependenciesMeta": { - "@react-native-async-storage/async-storage": { - "optional": true - } - } - }, - "node_modules/@reown/appkit/node_modules/@walletconnect/sign-client": { - "version": "2.21.0", - "resolved": "https://registry.npmjs.org/@walletconnect/sign-client/-/sign-client-2.21.0.tgz", - "integrity": "sha512-z7h+PeLa5Au2R591d/8ZlziE0stJvdzP9jNFzFolf2RG/OiXulgFKum8PrIyXy+Rg2q95U9nRVUF9fWcn78yBA==", - "license": "Apache-2.0", - "dependencies": { - "@walletconnect/core": "2.21.0", - "@walletconnect/events": "1.0.1", - "@walletconnect/heartbeat": "1.2.2", - "@walletconnect/jsonrpc-utils": "1.0.8", - "@walletconnect/logger": "2.1.2", - "@walletconnect/time": "1.0.2", - "@walletconnect/types": "2.21.0", - "@walletconnect/utils": "2.21.0", - "events": "3.3.0" - } - }, - "node_modules/@reown/appkit/node_modules/@walletconnect/types": { - "version": "2.21.0", - "resolved": "https://registry.npmjs.org/@walletconnect/types/-/types-2.21.0.tgz", - "integrity": "sha512-ll+9upzqt95ZBWcfkOszXZkfnpbJJ2CmxMfGgE5GmhdxxxCcO5bGhXkI+x8OpiS555RJ/v/sXJYMSOLkmu4fFw==", - "license": "Apache-2.0", - "dependencies": { - "@walletconnect/events": "1.0.1", - "@walletconnect/heartbeat": "1.2.2", - "@walletconnect/jsonrpc-types": "1.0.4", - "@walletconnect/keyvaluestorage": "1.1.1", - "@walletconnect/logger": "2.1.2", - "events": "3.3.0" - } - }, - "node_modules/@reown/appkit/node_modules/@walletconnect/universal-provider": { - "version": "2.21.0", - "resolved": "https://registry.npmjs.org/@walletconnect/universal-provider/-/universal-provider-2.21.0.tgz", - "integrity": "sha512-mtUQvewt+X0VBQay/xOJBvxsB3Xsm1lTwFjZ6WUwSOTR1X+FNb71hSApnV5kbsdDIpYPXeQUbGt2se1n5E5UBg==", - "license": "Apache-2.0", - "dependencies": { - "@walletconnect/events": "1.0.1", - "@walletconnect/jsonrpc-http-connection": "1.0.8", - "@walletconnect/jsonrpc-provider": "1.0.14", - "@walletconnect/jsonrpc-types": "1.0.4", - "@walletconnect/jsonrpc-utils": "1.0.8", - "@walletconnect/keyvaluestorage": "1.1.1", - "@walletconnect/logger": "2.1.2", - "@walletconnect/sign-client": "2.21.0", - "@walletconnect/types": "2.21.0", - "@walletconnect/utils": "2.21.0", - "es-toolkit": "1.33.0", - "events": "3.3.0" - } - }, - "node_modules/@reown/appkit/node_modules/@walletconnect/utils": { - "version": "2.21.0", - "resolved": "https://registry.npmjs.org/@walletconnect/utils/-/utils-2.21.0.tgz", - "integrity": "sha512-zfHLiUoBrQ8rP57HTPXW7rQMnYxYI4gT9yTACxVW6LhIFROTF6/ytm5SKNoIvi4a5nX5dfXG4D9XwQUCu8Ilig==", - "license": "Apache-2.0", - "dependencies": { - "@noble/ciphers": "1.2.1", - "@noble/curves": "1.8.1", - "@noble/hashes": "1.7.1", - "@walletconnect/jsonrpc-utils": "1.0.8", - "@walletconnect/keyvaluestorage": "1.1.1", - "@walletconnect/relay-api": "1.0.11", - "@walletconnect/relay-auth": "1.1.0", - "@walletconnect/safe-json": "1.0.2", - "@walletconnect/time": "1.0.2", - "@walletconnect/types": "2.21.0", - "@walletconnect/window-getters": "1.0.1", - "@walletconnect/window-metadata": "1.0.1", - "bs58": "6.0.0", - "detect-browser": "5.3.0", - "query-string": "7.1.3", - "uint8arrays": "3.1.0", - "viem": "2.23.2" - } + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/@reown/appkit/node_modules/@walletconnect/utils/node_modules/viem": { - "version": "2.23.2", - "resolved": "https://registry.npmjs.org/viem/-/viem-2.23.2.tgz", - "integrity": "sha512-NVmW/E0c5crMOtbEAqMF0e3NmvQykFXhLOc/CkLIXOlzHSA6KXVz3CYVmaKqBF8/xtjsjHAGjdJN3Ru1kFJLaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/wevm" - } - ], + "node_modules/@rrweb/types": { + "version": "2.0.0-alpha.18", + "resolved": "https://registry.npmjs.org/@rrweb/types/-/types-2.0.0-alpha.18.tgz", + "integrity": "sha512-iMH3amHthJZ9x3gGmBPmdfim7wLGygC2GciIkw2A6SO8giSn8PHYtRT8OKNH4V+k3SZ6RSnYHcTQxBA7pSWZ3Q==", + "license": "MIT" + }, + "node_modules/@safe-global/safe-apps-provider": { + "version": "0.18.6", + "resolved": "https://registry.npmjs.org/@safe-global/safe-apps-provider/-/safe-apps-provider-0.18.6.tgz", + "integrity": "sha512-4LhMmjPWlIO8TTDC2AwLk44XKXaK6hfBTWyljDm0HQ6TWlOEijVWNrt2s3OCVMSxlXAcEzYfqyu1daHZooTC2Q==", "license": "MIT", "dependencies": { - "@noble/curves": "1.8.1", - "@noble/hashes": "1.7.1", - "@scure/bip32": "1.6.2", - "@scure/bip39": "1.5.4", - "abitype": "1.0.8", - "isows": "1.0.6", - "ox": "0.6.7", - "ws": "8.18.0" - }, - "peerDependencies": { - "typescript": ">=5.0.4" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "@safe-global/safe-apps-sdk": "^9.1.0", + "events": "^3.3.0" } }, - "node_modules/@reown/appkit/node_modules/abitype": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.0.8.tgz", - "integrity": "sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg==", + "node_modules/@safe-global/safe-apps-sdk": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@safe-global/safe-apps-sdk/-/safe-apps-sdk-9.1.0.tgz", + "integrity": "sha512-N5p/ulfnnA2Pi2M3YeWjULeWbjo7ei22JwU/IXnhoHzKq3pYCN6ynL9mJBOlvDVv892EgLPCWCOwQk/uBT2v0Q==", "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/wevm" - }, - "peerDependencies": { - "typescript": ">=5.0.4", - "zod": "^3 >=3.22.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - }, - "zod": { - "optional": true - } + "dependencies": { + "@safe-global/safe-gateway-typescript-sdk": "^3.5.3", + "viem": "^2.1.1" } }, - "node_modules/@reown/appkit/node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "node_modules/@safe-global/safe-gateway-typescript-sdk": { + "version": "3.23.1", + "resolved": "https://registry.npmjs.org/@safe-global/safe-gateway-typescript-sdk/-/safe-gateway-typescript-sdk-3.23.1.tgz", + "integrity": "sha512-6ORQfwtEJYpalCeVO21L4XXGSdbEMfyp2hEv6cP82afKXSwvse6d3sdelgaPWUxHIsFRkWvHDdzh8IyyKHZKxw==", "license": "MIT", - "dependencies": { - "readdirp": "^4.0.1" - }, "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" + "node": ">=16" } }, - "node_modules/@reown/appkit/node_modules/isows": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.6.tgz", - "integrity": "sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/wevm" - } - ], + "node_modules/@scure/base": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.2.6.tgz", + "integrity": "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==", "license": "MIT", - "peerDependencies": { - "ws": "*" + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@reown/appkit/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" - }, - "node_modules/@reown/appkit/node_modules/multiformats": { - "version": "9.9.0", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", - "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==", - "license": "(Apache-2.0 AND MIT)" - }, - "node_modules/@reown/appkit/node_modules/ox": { - "version": "0.6.7", - "resolved": "https://registry.npmjs.org/ox/-/ox-0.6.7.tgz", - "integrity": "sha512-17Gk/eFsFRAZ80p5eKqv89a57uXjd3NgIf1CaXojATPBuujVc/fQSVhBeAU9JCRB+k7J50WQAyWTxK19T9GgbA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/wevm" - } - ], + "node_modules/@scure/bip32": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.7.0.tgz", + "integrity": "sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==", "license": "MIT", "dependencies": { - "@adraffy/ens-normalize": "^1.10.1", - "@noble/curves": "^1.6.0", - "@noble/hashes": "^1.5.0", - "@scure/bip32": "^1.5.0", - "@scure/bip39": "^1.4.0", - "abitype": "^1.0.6", - "eventemitter3": "5.0.1" - }, - "peerDependencies": { - "typescript": ">=5.4.0" + "@noble/curves": "~1.9.0", + "@noble/hashes": "~1.8.0", + "@scure/base": "~1.2.5" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@reown/appkit/node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "node_modules/@scure/bip39": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.6.0.tgz", + "integrity": "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==", "license": "MIT", - "engines": { - "node": ">= 14.18.0" + "dependencies": { + "@noble/hashes": "~1.8.0", + "@scure/base": "~1.2.5" }, "funding": { - "type": "individual", "url": "https://paulmillr.com/funding/" } }, - "node_modules/@reown/appkit/node_modules/uint8arrays": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.0.tgz", - "integrity": "sha512-ei5rfKtoRO8OyOIor2Rz5fhzjThwIHJZ3uyDPnDHTXbP0aMQ1RN/6AI5B5d9dBxJOU+BvOAk7ZQ1xphsX8Lrog==", + "node_modules/@sentry-internal/browser-utils": { + "version": "9.16.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-9.16.0.tgz", + "integrity": "sha512-+gHs/FQAdccCQPAGBmaYj37Em9QT4knbYGQfnr+yPBnEIdWWEkWfPq6KHOYbP0gQ2In52qTm1yRkfcBxieSkvA==", "license": "MIT", "dependencies": { - "multiformats": "^9.4.2" + "@sentry/core": "9.16.0" + }, + "engines": { + "node": ">=18" } }, - "node_modules/@reown/appkit/node_modules/unstorage": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.17.1.tgz", - "integrity": "sha512-KKGwRTT0iVBCErKemkJCLs7JdxNVfqTPc/85ae1XES0+bsHbc/sFBfVi5kJp156cc51BHinIH2l3k0EZ24vOBQ==", + "node_modules/@sentry-internal/feedback": { + "version": "9.16.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-9.16.0.tgz", + "integrity": "sha512-GsULlnyJze2yWe+7SLTrhY9cVty3s2oulTAqecGHIMrszmRg6gcuZExFwTFosnh68zrgzgW4fKz7BtCB7cDQxw==", "license": "MIT", "dependencies": { - "anymatch": "^3.1.3", - "chokidar": "^4.0.3", - "destr": "^2.0.5", - "h3": "^1.15.4", - "lru-cache": "^10.4.3", - "node-fetch-native": "^1.6.7", - "ofetch": "^1.4.1", - "ufo": "^1.6.1" + "@sentry/core": "9.16.0" }, - "peerDependencies": { - "@azure/app-configuration": "^1.8.0", - "@azure/cosmos": "^4.2.0", - "@azure/data-tables": "^13.3.0", - "@azure/identity": "^4.6.0", - "@azure/keyvault-secrets": "^4.9.0", - "@azure/storage-blob": "^12.26.0", - "@capacitor/preferences": "^6.0.3 || ^7.0.0", - "@deno/kv": ">=0.9.0", - "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", - "@planetscale/database": "^1.19.0", - "@upstash/redis": "^1.34.3", - "@vercel/blob": ">=0.27.1", - "@vercel/functions": "^2.2.12 || ^3.0.0", - "@vercel/kv": "^1.0.1", - "aws4fetch": "^1.0.20", - "db0": ">=0.2.1", - "idb-keyval": "^6.2.1", - "ioredis": "^5.4.2", - "uploadthing": "^7.4.4" + "engines": { + "node": ">=18" + } + }, + "node_modules/@sentry-internal/replay": { + "version": "9.16.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/replay/-/replay-9.16.0.tgz", + "integrity": "sha512-momO6485qEc0s9YPXW2l7Du7qNnrj+hAJkOkMKEzrEjlwUEFtUCDjMhJ9S/KGESowFnYbObZ3vc/Ji3G1opJfA==", + "license": "MIT", + "dependencies": { + "@sentry-internal/browser-utils": "9.16.0", + "@sentry/core": "9.16.0" }, - "peerDependenciesMeta": { - "@azure/app-configuration": { - "optional": true - }, - "@azure/cosmos": { - "optional": true - }, - "@azure/data-tables": { - "optional": true - }, - "@azure/identity": { - "optional": true - }, - "@azure/keyvault-secrets": { - "optional": true - }, - "@azure/storage-blob": { - "optional": true - }, - "@capacitor/preferences": { - "optional": true - }, - "@deno/kv": { - "optional": true - }, - "@netlify/blobs": { - "optional": true - }, - "@planetscale/database": { - "optional": true - }, - "@upstash/redis": { - "optional": true - }, - "@vercel/blob": { - "optional": true - }, - "@vercel/functions": { - "optional": true - }, - "@vercel/kv": { - "optional": true - }, - "aws4fetch": { - "optional": true - }, - "db0": { - "optional": true - }, - "idb-keyval": { - "optional": true - }, - "ioredis": { - "optional": true - }, - "uploadthing": { - "optional": true - } + "engines": { + "node": ">=18" + } + }, + "node_modules/@sentry-internal/replay-canvas": { + "version": "9.16.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-9.16.0.tgz", + "integrity": "sha512-qddNvbt8DFmv89dPgABJbfj5PrmdG9sLI6VZyWDBCXm2wwQREtuGrQZjrCx7gTe/52dVGYraffdqZJ/7mrh0jg==", + "license": "MIT", + "dependencies": { + "@sentry-internal/replay": "9.16.0", + "@sentry/core": "9.16.0" + }, + "engines": { + "node": ">=18" } }, - "node_modules/@reown/appkit/node_modules/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "node_modules/@sentry/babel-plugin-component-annotate": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@sentry/babel-plugin-component-annotate/-/babel-plugin-component-annotate-3.4.0.tgz", + "integrity": "sha512-tSzfc3aE7m0PM0Aj7HBDet5llH9AB9oc+tBQ8AvOqUSnWodLrNCuWeQszJ7mIBovD3figgCU3h0cvI6U5cDtsg==", "license": "MIT", "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "node": ">= 14" } }, - "node_modules/@reserve-protocol/dtf-rebalance-lib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/@reserve-protocol/dtf-rebalance-lib/-/dtf-rebalance-lib-2.6.3.tgz", - "integrity": "sha512-/c/SQ/VeyIUV9OA1pfnDILk6yIsKYnKnzPY5tcnwfeAarZPQdK370F4t9uGUv8LGuCkn+dEGmpifhmNiyMueCw==", - "peerDependencies": { - "decimal.js-light": "^2.5.1" + "node_modules/@sentry/browser": { + "version": "9.16.0", + "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-9.16.0.tgz", + "integrity": "sha512-Fw9WgoQRb6XViBAix40P7EmWp2n8zdRgvIWojhN3aOYM+ZdpcCiCburNOVtJ+bbWVRSpil4RbEG8QTGyu6mQ+g==", + "license": "MIT", + "dependencies": { + "@sentry-internal/browser-utils": "9.16.0", + "@sentry-internal/feedback": "9.16.0", + "@sentry-internal/replay": "9.16.0", + "@sentry-internal/replay-canvas": "9.16.0", + "@sentry/core": "9.16.0" + }, + "engines": { + "node": ">=18" } }, - "node_modules/@reserve-protocol/react-zapper": { - "version": "1.5.6", - "resolved": "https://registry.npmjs.org/@reserve-protocol/react-zapper/-/react-zapper-1.5.6.tgz", - "integrity": "sha512-zBhujdVIqGE9psAkhfjCCnTE9ovVYSfLE8cCekPZGobT1bd0KrDMu7w/T9vJVI08PpETLNm6CIAG6uLtRTvNuQ==", + "node_modules/@sentry/bundler-plugin-core": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@sentry/bundler-plugin-core/-/bundler-plugin-core-3.4.0.tgz", + "integrity": "sha512-X1Q41AsQ6xcT6hB4wYmBDBukndKM/inT4IsR7pdKLi7ICpX2Qq6lisamBAEPCgEvnLpazSFguaiC0uiwMKAdqw==", "license": "MIT", "dependencies": { - "@lucide/lab": "^0.1.2", - "@radix-ui/react-accordion": "^1.2.11", - "@radix-ui/react-checkbox": "^1.3.2", - "@radix-ui/react-dialog": "^1.1.14", - "@radix-ui/react-dropdown-menu": "^2.1.15", - "@radix-ui/react-separator": "^1.1.7", - "@radix-ui/react-tabs": "^1.1.12", - "@radix-ui/react-toggle": "^1.1.9", - "@radix-ui/react-toggle-group": "^1.1.10", - "@radix-ui/react-tooltip": "^1.2.7", - "@tanstack/query-core": "^5.87.1", - "clsx": "^2.1.1", - "decimal.js-light": "^2.5.1", - "jotai": "^1.12.0", - "lucide-react": "^0.461.0", - "mixpanel-browser": "^2.56.0", - "next-themes": "^0.2.1", - "react": "^18.0.0", - "react-dom": "18.3.1", - "sonner": "^1.4.0", - "tailwind-merge": "^2.5.5", - "uuid": "^13.0.0" + "@babel/core": "^7.18.5", + "@sentry/babel-plugin-component-annotate": "3.4.0", + "@sentry/cli": "2.42.2", + "dotenv": "^16.3.1", + "find-up": "^5.0.0", + "glob": "^9.3.2", + "magic-string": "0.30.8", + "unplugin": "1.0.1" }, - "peerDependencies": { - "@tanstack/react-query": "^5.87.4", - "react": "^18.0.0", - "wagmi": "^2.15.14" + "engines": { + "node": ">= 14" } }, - "node_modules/@reserve-protocol/react-zapper/node_modules/next-themes": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.2.1.tgz", - "integrity": "sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A==", + "node_modules/@sentry/bundler-plugin-core/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "license": "MIT", - "peerDependencies": { - "next": "*", - "react": "*", - "react-dom": "*" + "dependencies": { + "balanced-match": "^1.0.0" } }, - "node_modules/@reserve-protocol/react-zapper/node_modules/uuid": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-13.0.0.tgz", - "integrity": "sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], + "node_modules/@sentry/bundler-plugin-core/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "license": "MIT", - "bin": { - "uuid": "dist-node/bin/uuid" + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@reserve-protocol/rtokens": { - "version": "1.1.23", - "resolved": "https://registry.npmjs.org/@reserve-protocol/rtokens/-/rtokens-1.1.23.tgz", - "integrity": "sha512-VYP0BNhULhFzAGpzaqe1pkuMpCvLmuNYsYHE0xkKgiqaMZdztSlnCNK2BRlsDbFD/HQZwcoAoYjFpEHQbq2GoA==", - "license": "ISC" + "node_modules/@sentry/bundler-plugin-core/node_modules/glob": { + "version": "9.3.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", + "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "minimatch": "^8.0.2", + "minipass": "^4.2.4", + "path-scurry": "^1.6.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.38.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.38.0.tgz", - "integrity": "sha512-ldomqc4/jDZu/xpYU+aRxo3V4mGCV9HeTgUBANI3oIQMOL+SsxB+S2lxMpkFp5UamSS3XuTMQVbsS24R4J4Qjg==", - "cpu": [ - "arm" - ], - "dev": true, + "node_modules/@sentry/bundler-plugin-core/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "license": "MIT", - "optional": true, - "os": [ - "android" - ] + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.38.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.38.0.tgz", - "integrity": "sha512-VUsgcy4GhhT7rokwzYQP+aV9XnSLkkhlEJ0St8pbasuWO/vwphhZQxYEKUP3ayeCYLhk6gEtacRpYP/cj3GjyQ==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@sentry/bundler-plugin-core/node_modules/magic-string": { + "version": "0.30.8", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz", + "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==", "license": "MIT", - "optional": true, - "os": [ - "android" - ] + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.38.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.38.0.tgz", - "integrity": "sha512-buA17AYXlW9Rn091sWMq1xGUvWQFOH4N1rqUxGJtEQzhChxWjldGCCup7r/wUnaI6Au8sKXpoh0xg58a7cgcpg==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@sentry/bundler-plugin-core/node_modules/minimatch": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", + "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@sentry/bundler-plugin-core/node_modules/minipass": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", + "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/bundler-plugin-core/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.38.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.38.0.tgz", - "integrity": "sha512-Mgcmc78AjunP1SKXl624vVBOF2bzwNWFPMP4fpOu05vS0amnLcX8gHIge7q/lDAHy3T2HeR0TqrriZDQS2Woeg==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@sentry/bundler-plugin-core/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.38.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.38.0.tgz", - "integrity": "sha512-zzJACgjLbQTsscxWqvrEQAEh28hqhebpRz5q/uUd1T7VTwUNZ4VIXQt5hE7ncs0GrF+s7d3S4on4TiXUY8KoQA==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@sentry/bundler-plugin-core/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] + "engines": { + "node": ">=8" + } }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.38.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.38.0.tgz", - "integrity": "sha512-hCY/KAeYMCyDpEE4pTETam0XZS4/5GXzlLgpi5f0IaPExw9kuB+PDTOTLuPtM10TlRG0U9OSmXJ+Wq9J39LvAg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] + "node_modules/@sentry/cli": { + "version": "2.42.2", + "resolved": "https://registry.npmjs.org/@sentry/cli/-/cli-2.42.2.tgz", + "integrity": "sha512-spb7S/RUumCGyiSTg8DlrCX4bivCNmU/A1hcfkwuciTFGu8l5CDc2I6jJWWZw8/0enDGxuj5XujgXvU5tr4bxg==", + "hasInstallScript": true, + "license": "BSD-3-Clause", + "dependencies": { + "https-proxy-agent": "^5.0.0", + "node-fetch": "^2.6.7", + "progress": "^2.0.3", + "proxy-from-env": "^1.1.0", + "which": "^2.0.2" + }, + "bin": { + "sentry-cli": "bin/sentry-cli" + }, + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@sentry/cli-darwin": "2.42.2", + "@sentry/cli-linux-arm": "2.42.2", + "@sentry/cli-linux-arm64": "2.42.2", + "@sentry/cli-linux-i686": "2.42.2", + "@sentry/cli-linux-x64": "2.42.2", + "@sentry/cli-win32-i686": "2.42.2", + "@sentry/cli-win32-x64": "2.42.2" + } }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.38.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.38.0.tgz", - "integrity": "sha512-mimPH43mHl4JdOTD7bUMFhBdrg6f9HzMTOEnzRmXbOZqjijCw8LA5z8uL6LCjxSa67H2xiLFvvO67PT05PRKGg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", + "node_modules/@sentry/cli-darwin": { + "version": "2.42.2", + "resolved": "https://registry.npmjs.org/@sentry/cli-darwin/-/cli-darwin-2.42.2.tgz", + "integrity": "sha512-GtJSuxER7Vrp1IpxdUyRZzcckzMnb4N5KTW7sbTwUiwqARRo+wxS+gczYrS8tdgtmXs5XYhzhs+t4d52ITHMIg==", + "license": "BSD-3-Clause", "optional": true, "os": [ - "linux" - ] + "darwin" + ], + "engines": { + "node": ">=10" + } }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.38.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.38.0.tgz", - "integrity": "sha512-tPiJtiOoNuIH8XGG8sWoMMkAMm98PUwlriOFCCbZGc9WCax+GLeVRhmaxjJtz6WxrPKACgrwoZ5ia/uapq3ZVg==", + "node_modules/@sentry/cli-linux-arm": { + "version": "2.42.2", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm/-/cli-linux-arm-2.42.2.tgz", + "integrity": "sha512-7udCw+YL9lwq+9eL3WLspvnuG+k5Icg92YE7zsteTzWLwgPVzaxeZD2f8hwhsu+wmL+jNqbpCRmktPteh3i2mg==", "cpu": [ "arm" ], - "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "optional": true, "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.38.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.38.0.tgz", - "integrity": "sha512-wZco59rIVuB0tjQS0CSHTTUcEde+pXQWugZVxWaQFdQQ1VYub/sTrNdY76D1MKdN2NB48JDuGABP6o6fqos8mA==", - "cpu": [ - "arm64" + "linux", + "freebsd" ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "engines": { + "node": ">=10" + } }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.38.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.38.0.tgz", - "integrity": "sha512-fQgqwKmW0REM4LomQ+87PP8w8xvU9LZfeLBKybeli+0yHT7VKILINzFEuggvnV9M3x1Ed4gUBmGUzCo/ikmFbQ==", + "node_modules/@sentry/cli-linux-arm64": { + "version": "2.42.2", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm64/-/cli-linux-arm64-2.42.2.tgz", + "integrity": "sha512-BOxzI7sgEU5Dhq3o4SblFXdE9zScpz6EXc5Zwr1UDZvzgXZGosUtKVc7d1LmkrHP8Q2o18HcDWtF3WvJRb5Zpw==", "cpu": [ "arm64" ], - "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "optional": true, "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.38.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.38.0.tgz", - "integrity": "sha512-hz5oqQLXTB3SbXpfkKHKXLdIp02/w3M+ajp8p4yWOWwQRtHWiEOCKtc9U+YXahrwdk+3qHdFMDWR5k+4dIlddg==", - "cpu": [ - "loong64" + "linux", + "freebsd" ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "engines": { + "node": ">=10" + } }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.38.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.38.0.tgz", - "integrity": "sha512-NXqygK/dTSibQ+0pzxsL3r4Xl8oPqVoWbZV9niqOnIHV/J92fe65pOir0xjkUZDRSPyFRvu+4YOpJF9BZHQImw==", + "node_modules/@sentry/cli-linux-i686": { + "version": "2.42.2", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-i686/-/cli-linux-i686-2.42.2.tgz", + "integrity": "sha512-Sw/dQp5ZPvKnq3/y7wIJyxTUJYPGoTX/YeMbDs8BzDlu9to2LWV3K3r7hE7W1Lpbaw4tSquUHiQjP5QHCOS7aQ==", "cpu": [ - "ppc64" + "x86", + "ia32" ], - "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "optional": true, "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.38.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.38.0.tgz", - "integrity": "sha512-GEAIabR1uFyvf/jW/5jfu8gjM06/4kZ1W+j1nWTSSB3w6moZEBm7iBtzwQ3a1Pxos2F7Gz+58aVEnZHU295QTg==", - "cpu": [ - "riscv64" + "linux", + "freebsd" ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "engines": { + "node": ">=10" + } }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.38.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.38.0.tgz", - "integrity": "sha512-9EYTX+Gus2EGPbfs+fh7l95wVADtSQyYw4DfSBcYdUEAmP2lqSZY0Y17yX/3m5VKGGJ4UmIH5LHLkMJft3bYoA==", + "node_modules/@sentry/cli-linux-x64": { + "version": "2.42.2", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-x64/-/cli-linux-x64-2.42.2.tgz", + "integrity": "sha512-mU4zUspAal6TIwlNLBV5oq6yYqiENnCWSxtSQVzWs0Jyq97wtqGNG9U+QrnwjJZ+ta/hvye9fvL2X25D/RxHQw==", "cpu": [ - "riscv64" + "x64" ], - "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "optional": true, "os": [ - "linux" - ] + "linux", + "freebsd" + ], + "engines": { + "node": ">=10" + } }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.38.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.38.0.tgz", - "integrity": "sha512-Mpp6+Z5VhB9VDk7RwZXoG2qMdERm3Jw07RNlXHE0bOnEeX+l7Fy4bg+NxfyN15ruuY3/7Vrbpm75J9QHFqj5+Q==", + "node_modules/@sentry/cli-win32-i686": { + "version": "2.42.2", + "resolved": "https://registry.npmjs.org/@sentry/cli-win32-i686/-/cli-win32-i686-2.42.2.tgz", + "integrity": "sha512-iHvFHPGqgJMNqXJoQpqttfsv2GI3cGodeTq4aoVLU/BT3+hXzbV0x1VpvvEhncJkDgDicJpFLM8sEPHb3b8abw==", "cpu": [ - "s390x" + "x86", + "ia32" ], - "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "optional": true, "os": [ - "linux" - ] + "win32" + ], + "engines": { + "node": ">=10" + } }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.38.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.38.0.tgz", - "integrity": "sha512-vPvNgFlZRAgO7rwncMeE0+8c4Hmc+qixnp00/Uv3ht2x7KYrJ6ERVd3/R0nUtlE6/hu7/HiiNHJ/rP6knRFt1w==", + "node_modules/@sentry/cli-win32-x64": { + "version": "2.42.2", + "resolved": "https://registry.npmjs.org/@sentry/cli-win32-x64/-/cli-win32-x64-2.42.2.tgz", + "integrity": "sha512-vPPGHjYoaGmfrU7xhfFxG7qlTBacroz5NdT+0FmDn6692D8IvpNXl1K+eV3Kag44ipJBBeR8g1HRJyx/F/9ACw==", "cpu": [ "x64" ], - "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "optional": true, "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.38.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.38.0.tgz", - "integrity": "sha512-q5Zv+goWvQUGCaL7fU8NuTw8aydIL/C9abAVGCzRReuj5h30TPx4LumBtAidrVOtXnlB+RZkBtExMsfqkMfb8g==", - "cpu": [ - "x64" + "win32" ], - "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/core": { + "version": "9.16.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-9.16.0.tgz", + "integrity": "sha512-CECfs2HI4CAXJ9zusXw5Aa740TXe6w2n8WiiF9b+V3c5Prufl32oZZj9LL8Cqrc56ozlASLdPjWIo76ApoxTlQ==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "engines": { + "node": ">=18" + } }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.38.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.38.0.tgz", - "integrity": "sha512-u/Jbm1BU89Vftqyqbmxdq14nBaQjQX1HhmsdBWqSdGClNaKwhjsg5TpW+5Ibs1mb8Es9wJiMdl86BcmtUVXNZg==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@sentry/react": { + "version": "9.16.0", + "resolved": "https://registry.npmjs.org/@sentry/react/-/react-9.16.0.tgz", + "integrity": "sha512-FHvdCTM9vIaPUWhwUyCKHBlvA2FSrxjcTMRPTdB+KL1dsLtvKTZfd5rUrbRNDHvfMAC6EPXDvhwsmlHce9klRg==", "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "dependencies": { + "@sentry/browser": "9.16.0", + "@sentry/core": "9.16.0", + "hoist-non-react-statics": "^3.3.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react": "^16.14.0 || 17.x || 18.x || 19.x" + } }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.38.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.38.0.tgz", - "integrity": "sha512-mqu4PzTrlpNHHbu5qleGvXJoGgHpChBlrBx/mEhTPpnAL1ZAYFlvHD7rLK839LLKQzqEQMFJfGrrOHItN4ZQqA==", - "cpu": [ - "ia32" - ], - "dev": true, + "node_modules/@sentry/vite-plugin": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@sentry/vite-plugin/-/vite-plugin-3.4.0.tgz", + "integrity": "sha512-pUFBGrKsHuc8K6A7B1wU2nx65n9aIzvTlcHX9yZ1qvjEO0cZFih0JCwu1Fcav/yrtT9RMN44L/ugu/kMBHQhjQ==", "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "dependencies": { + "@sentry/bundler-plugin-core": "3.4.0", + "unplugin": "1.0.1" + }, + "engines": { + "node": ">= 14" + } }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.38.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.38.0.tgz", - "integrity": "sha512-jjqy3uWlecfB98Psxb5cD6Fny9Fupv9LrDSPTQZUROqjvZmcCqNu4UMl7qqhlUUGpwiAkotj6GYu4SZdcr/nLw==", - "cpu": [ - "x64" - ], + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@sindresorhus/is": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-7.2.0.tgz", + "integrity": "sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } }, - "node_modules/@rrweb/types": { - "version": "2.0.0-alpha.18", - "resolved": "https://registry.npmjs.org/@rrweb/types/-/types-2.0.0-alpha.18.tgz", - "integrity": "sha512-iMH3amHthJZ9x3gGmBPmdfim7wLGygC2GciIkw2A6SO8giSn8PHYtRT8OKNH4V+k3SZ6RSnYHcTQxBA7pSWZ3Q==", + "node_modules/@socket.io/component-emitter": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", "license": "MIT" }, - "node_modules/@safe-global/safe-apps-provider": { - "version": "0.18.6", - "resolved": "https://registry.npmjs.org/@safe-global/safe-apps-provider/-/safe-apps-provider-0.18.6.tgz", - "integrity": "sha512-4LhMmjPWlIO8TTDC2AwLk44XKXaK6hfBTWyljDm0HQ6TWlOEijVWNrt2s3OCVMSxlXAcEzYfqyu1daHZooTC2Q==", + "node_modules/@solana-program/system": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@solana-program/system/-/system-0.10.0.tgz", + "integrity": "sha512-Go+LOEZmqmNlfr+Gjy5ZWAdY5HbYzk2RBewD9QinEU/bBSzpFfzqDRT55JjFRBGJUvMgf3C2vfXEGT4i8DSI4g==", + "license": "Apache-2.0", + "peerDependencies": { + "@solana/kit": "^5.0" + } + }, + "node_modules/@solana-program/token": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@solana-program/token/-/token-0.9.0.tgz", + "integrity": "sha512-vnZxndd4ED4Fc56sw93cWZ2djEeeOFxtaPS8SPf5+a+JZjKA/EnKqzbE1y04FuMhIVrLERQ8uR8H2h72eZzlsA==", + "license": "Apache-2.0", + "peerDependencies": { + "@solana/kit": "^5.0" + } + }, + "node_modules/@solana/accounts": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@solana/accounts/-/accounts-5.4.0.tgz", + "integrity": "sha512-qHtAtwCcCFTXcya6JOOG1nzYicivivN/JkcYNHr10qOp9b4MVRkfW1ZAAG1CNzjMe5+mwtEl60RwdsY9jXNb+Q==", "license": "MIT", "dependencies": { - "@safe-global/safe-apps-sdk": "^9.1.0", - "events": "^3.3.0" + "@solana/addresses": "5.4.0", + "@solana/codecs-core": "5.4.0", + "@solana/codecs-strings": "5.4.0", + "@solana/errors": "5.4.0", + "@solana/rpc-spec": "5.4.0", + "@solana/rpc-types": "5.4.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@safe-global/safe-apps-sdk": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@safe-global/safe-apps-sdk/-/safe-apps-sdk-9.1.0.tgz", - "integrity": "sha512-N5p/ulfnnA2Pi2M3YeWjULeWbjo7ei22JwU/IXnhoHzKq3pYCN6ynL9mJBOlvDVv892EgLPCWCOwQk/uBT2v0Q==", + "node_modules/@solana/addresses": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@solana/addresses/-/addresses-5.4.0.tgz", + "integrity": "sha512-YRHiH30S8qDV4bZ+mtEk589PGfBuXHzD/fK2Z+YI5f/+s+yi/5le/fVw7PN6LxnnmVQKiRCDUiNF+WmFFKi6QQ==", "license": "MIT", "dependencies": { - "@safe-global/safe-gateway-typescript-sdk": "^3.5.3", - "viem": "^2.1.1" + "@solana/assertions": "5.4.0", + "@solana/codecs-core": "5.4.0", + "@solana/codecs-strings": "5.4.0", + "@solana/errors": "5.4.0", + "@solana/nominal-types": "5.4.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@safe-global/safe-gateway-typescript-sdk": { - "version": "3.23.1", - "resolved": "https://registry.npmjs.org/@safe-global/safe-gateway-typescript-sdk/-/safe-gateway-typescript-sdk-3.23.1.tgz", - "integrity": "sha512-6ORQfwtEJYpalCeVO21L4XXGSdbEMfyp2hEv6cP82afKXSwvse6d3sdelgaPWUxHIsFRkWvHDdzh8IyyKHZKxw==", + "node_modules/@solana/assertions": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@solana/assertions/-/assertions-5.4.0.tgz", + "integrity": "sha512-8EP7mkdnrPc9y67FqWeAPzdWq2qAOkxsuo+ZBIXNWtIixDtXIdHrgjZ/wqbWxLgSTtXEfBCjpZU55Xw2Qfbwyg==", "license": "MIT", + "dependencies": { + "@solana/errors": "5.4.0" + }, "engines": { - "node": ">=16" + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@scure/base": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.2.6.tgz", - "integrity": "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==", + "node_modules/@solana/buffer-layout": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@solana/buffer-layout/-/buffer-layout-4.0.1.tgz", + "integrity": "sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==", "license": "MIT", - "funding": { - "url": "https://paulmillr.com/funding/" + "dependencies": { + "buffer": "~6.0.3" + }, + "engines": { + "node": ">=5.10" } }, - "node_modules/@scure/bip32": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.7.0.tgz", - "integrity": "sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==", + "node_modules/@solana/codecs": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@solana/codecs/-/codecs-5.4.0.tgz", + "integrity": "sha512-IbDCUvNX0MrkQahxiXj9rHzkd/fYfp1F2nTJkHGH8v+vPfD+YPjl007ZBM38EnCeXj/Xn+hxqBBivPvIHP29dA==", "license": "MIT", "dependencies": { - "@noble/curves": "~1.9.0", - "@noble/hashes": "~1.8.0", - "@scure/base": "~1.2.5" + "@solana/codecs-core": "5.4.0", + "@solana/codecs-data-structures": "5.4.0", + "@solana/codecs-numbers": "5.4.0", + "@solana/codecs-strings": "5.4.0", + "@solana/options": "5.4.0" }, - "funding": { - "url": "https://paulmillr.com/funding/" + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@scure/bip39": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.6.0.tgz", - "integrity": "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==", + "node_modules/@solana/codecs-core": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@solana/codecs-core/-/codecs-core-5.4.0.tgz", + "integrity": "sha512-rQ5jXgiDe2vIU+mYCHDjgwMd9WdzZfh4sc5H6JgYleAUjeTUX6mx8hTV2+pcXvvn27LPrgrt9jfxswbDb8O8ww==", "license": "MIT", "dependencies": { - "@noble/hashes": "~1.8.0", - "@scure/base": "~1.2.5" + "@solana/errors": "5.4.0" }, - "funding": { - "url": "https://paulmillr.com/funding/" + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@sentry-internal/browser-utils": { - "version": "9.16.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-9.16.0.tgz", - "integrity": "sha512-+gHs/FQAdccCQPAGBmaYj37Em9QT4knbYGQfnr+yPBnEIdWWEkWfPq6KHOYbP0gQ2In52qTm1yRkfcBxieSkvA==", + "node_modules/@solana/codecs-data-structures": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@solana/codecs-data-structures/-/codecs-data-structures-5.4.0.tgz", + "integrity": "sha512-LVssbdQ1GfY6upnxW3mufYsNfvTWKnHNk5Hx2gHuOYJhm3HZlp+Y8zvuoY65G1d1xAXkPz5YVGxaSeVIRWLGWg==", "license": "MIT", "dependencies": { - "@sentry/core": "9.16.0" + "@solana/codecs-core": "5.4.0", + "@solana/codecs-numbers": "5.4.0", + "@solana/errors": "5.4.0" }, "engines": { - "node": ">=18" + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@sentry-internal/feedback": { - "version": "9.16.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-9.16.0.tgz", - "integrity": "sha512-GsULlnyJze2yWe+7SLTrhY9cVty3s2oulTAqecGHIMrszmRg6gcuZExFwTFosnh68zrgzgW4fKz7BtCB7cDQxw==", + "node_modules/@solana/codecs-numbers": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@solana/codecs-numbers/-/codecs-numbers-5.4.0.tgz", + "integrity": "sha512-z6LMkY+kXWx1alrvIDSAxexY5QLhsso638CjM7XI1u6dB7drTLWKhifyjnm1vOQc1VPVFmbYxTgKKpds8TY8tg==", "license": "MIT", "dependencies": { - "@sentry/core": "9.16.0" + "@solana/codecs-core": "5.4.0", + "@solana/errors": "5.4.0" }, "engines": { - "node": ">=18" + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@sentry-internal/replay": { - "version": "9.16.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/replay/-/replay-9.16.0.tgz", - "integrity": "sha512-momO6485qEc0s9YPXW2l7Du7qNnrj+hAJkOkMKEzrEjlwUEFtUCDjMhJ9S/KGESowFnYbObZ3vc/Ji3G1opJfA==", + "node_modules/@solana/codecs-strings": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@solana/codecs-strings/-/codecs-strings-5.4.0.tgz", + "integrity": "sha512-w0trrjfQDhkCVz7O1GTmHBk9m+MkljKx2uNBbQAD3/yW2Qn9dYiTrZ1/jDVq0/+lPPAUkbT3s3Yo7HUZ2QFmHw==", "license": "MIT", "dependencies": { - "@sentry-internal/browser-utils": "9.16.0", - "@sentry/core": "9.16.0" + "@solana/codecs-core": "5.4.0", + "@solana/codecs-numbers": "5.4.0", + "@solana/errors": "5.4.0" }, "engines": { - "node": ">=18" + "node": ">=20.18.0" + }, + "peerDependencies": { + "fastestsmallesttextencoderdecoder": "^1.0.22", + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "fastestsmallesttextencoderdecoder": { + "optional": true + }, + "typescript": { + "optional": true + } } }, - "node_modules/@sentry-internal/replay-canvas": { - "version": "9.16.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-9.16.0.tgz", - "integrity": "sha512-qddNvbt8DFmv89dPgABJbfj5PrmdG9sLI6VZyWDBCXm2wwQREtuGrQZjrCx7gTe/52dVGYraffdqZJ/7mrh0jg==", + "node_modules/@solana/errors": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@solana/errors/-/errors-5.4.0.tgz", + "integrity": "sha512-hNoAOmlZAszaVBrAy1Jf7amHJ8wnUnTU0BqhNQXknbSvirvsYr81yEud2iq18YiCqhyJ9SuQ5kWrSAT0x7S0oA==", "license": "MIT", "dependencies": { - "@sentry-internal/replay": "9.16.0", - "@sentry/core": "9.16.0" + "chalk": "5.6.2", + "commander": "14.0.2" + }, + "bin": { + "errors": "bin/cli.mjs" }, "engines": { - "node": ">=18" + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@sentry/babel-plugin-component-annotate": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@sentry/babel-plugin-component-annotate/-/babel-plugin-component-annotate-3.4.0.tgz", - "integrity": "sha512-tSzfc3aE7m0PM0Aj7HBDet5llH9AB9oc+tBQ8AvOqUSnWodLrNCuWeQszJ7mIBovD3figgCU3h0cvI6U5cDtsg==", + "node_modules/@solana/errors/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", "license": "MIT", "engines": { - "node": ">= 14" + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@sentry/browser": { - "version": "9.16.0", - "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-9.16.0.tgz", - "integrity": "sha512-Fw9WgoQRb6XViBAix40P7EmWp2n8zdRgvIWojhN3aOYM+ZdpcCiCburNOVtJ+bbWVRSpil4RbEG8QTGyu6mQ+g==", + "node_modules/@solana/errors/node_modules/commander": { + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.2.tgz", + "integrity": "sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==", "license": "MIT", - "dependencies": { - "@sentry-internal/browser-utils": "9.16.0", - "@sentry-internal/feedback": "9.16.0", - "@sentry-internal/replay": "9.16.0", - "@sentry-internal/replay-canvas": "9.16.0", - "@sentry/core": "9.16.0" - }, "engines": { - "node": ">=18" + "node": ">=20" } }, - "node_modules/@sentry/bundler-plugin-core": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@sentry/bundler-plugin-core/-/bundler-plugin-core-3.4.0.tgz", - "integrity": "sha512-X1Q41AsQ6xcT6hB4wYmBDBukndKM/inT4IsR7pdKLi7ICpX2Qq6lisamBAEPCgEvnLpazSFguaiC0uiwMKAdqw==", + "node_modules/@solana/fast-stable-stringify": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@solana/fast-stable-stringify/-/fast-stable-stringify-5.4.0.tgz", + "integrity": "sha512-KB7PUL7yalPvbWCezzyUDVRDp39eHLPH7OJ6S8VFT8YNIFUANwwj5ctui50Fim76kvSYDdYJOclXV45O2gfQ8Q==", "license": "MIT", - "dependencies": { - "@babel/core": "^7.18.5", - "@sentry/babel-plugin-component-annotate": "3.4.0", - "@sentry/cli": "2.42.2", - "dotenv": "^16.3.1", - "find-up": "^5.0.0", - "glob": "^9.3.2", - "magic-string": "0.30.8", - "unplugin": "1.0.1" - }, "engines": { - "node": ">= 14" + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@sentry/bundler-plugin-core/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "node_modules/@solana/functional": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@solana/functional/-/functional-5.4.0.tgz", + "integrity": "sha512-32ghHO0bg6GgX/7++0/7Lps6RgeXD2gKF1okiuyEGuVfKENIapgaQdcGhUwb3q6D6fv6MRAVn/Yve4jopGVNMQ==", "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@sentry/bundler-plugin-core/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "node_modules/@solana/instruction-plans": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@solana/instruction-plans/-/instruction-plans-5.4.0.tgz", + "integrity": "sha512-5xbJ+I/pP2aWECmK75bEM1zCnIITlohAK83dVN+t5X2vBFrr6M9gifo8r4Opdnibsgo6QVVkKPxRo5zow5j0ig==", "license": "MIT", "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "@solana/errors": "5.4.0", + "@solana/instructions": "5.4.0", + "@solana/keys": "5.4.0", + "@solana/promises": "5.4.0", + "@solana/transaction-messages": "5.4.0", + "@solana/transactions": "5.4.0" }, "engines": { - "node": ">=10" + "node": ">=20.18.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@sentry/bundler-plugin-core/node_modules/glob": { - "version": "9.3.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", - "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", - "license": "ISC", + "node_modules/@solana/instructions": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@solana/instructions/-/instructions-5.4.0.tgz", + "integrity": "sha512-//a7jpHbNoAgTqy3YyqG1X6QhItJLKzJa6zuYJGCwaAAJye7BxS9pxJBgb2mUt7CGidhUksf+U8pmLlxCNWYyg==", + "license": "MIT", "dependencies": { - "fs.realpath": "^1.0.0", - "minimatch": "^8.0.2", - "minipass": "^4.2.4", - "path-scurry": "^1.6.1" + "@solana/codecs-core": "5.4.0", + "@solana/errors": "5.4.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=20.18.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@sentry/bundler-plugin-core/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "node_modules/@solana/keys": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@solana/keys/-/keys-5.4.0.tgz", + "integrity": "sha512-zQVbAwdoXorgXjlhlVTZaymFG6N8n1zn2NT+xI6S8HtbrKIB/42xPdXFh+zIihGzRw+9k8jzU7Axki/IPm6qWQ==", "license": "MIT", "dependencies": { - "p-locate": "^5.0.0" + "@solana/assertions": "5.4.0", + "@solana/codecs-core": "5.4.0", + "@solana/codecs-strings": "5.4.0", + "@solana/errors": "5.4.0", + "@solana/nominal-types": "5.4.0" }, "engines": { - "node": ">=10" + "node": ">=20.18.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@sentry/bundler-plugin-core/node_modules/magic-string": { - "version": "0.30.8", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz", - "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==", + "node_modules/@solana/kit": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@solana/kit/-/kit-5.4.0.tgz", + "integrity": "sha512-aVjN26jOEzJA6UBYxSTQciZPXgTxWnO/WysHrw+yeBL/5AaTZnXEgb4j5xV6cUFzOlVxhJBrx51xtoxSqJ0u3g==", "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" + "@solana/accounts": "5.4.0", + "@solana/addresses": "5.4.0", + "@solana/codecs": "5.4.0", + "@solana/errors": "5.4.0", + "@solana/functional": "5.4.0", + "@solana/instruction-plans": "5.4.0", + "@solana/instructions": "5.4.0", + "@solana/keys": "5.4.0", + "@solana/offchain-messages": "5.4.0", + "@solana/plugin-core": "5.4.0", + "@solana/programs": "5.4.0", + "@solana/rpc": "5.4.0", + "@solana/rpc-api": "5.4.0", + "@solana/rpc-parsed-types": "5.4.0", + "@solana/rpc-spec-types": "5.4.0", + "@solana/rpc-subscriptions": "5.4.0", + "@solana/rpc-types": "5.4.0", + "@solana/signers": "5.4.0", + "@solana/sysvars": "5.4.0", + "@solana/transaction-confirmation": "5.4.0", + "@solana/transaction-messages": "5.4.0", + "@solana/transactions": "5.4.0" }, "engines": { - "node": ">=12" + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@sentry/bundler-plugin-core/node_modules/minimatch": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", - "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, + "node_modules/@solana/nominal-types": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@solana/nominal-types/-/nominal-types-5.4.0.tgz", + "integrity": "sha512-h4dTRQwTerzksE5B1WmObN6TvLo8dYUd7kpUUynGd8WJjK0zz3zkDhq0MkA3aF6A1C2C82BSGqSsN9EN0E6Exg==", + "license": "MIT", "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=20.18.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@sentry/bundler-plugin-core/node_modules/minipass": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", - "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", - "license": "ISC", + "node_modules/@solana/offchain-messages": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@solana/offchain-messages/-/offchain-messages-5.4.0.tgz", + "integrity": "sha512-DjdlYJCcKfgh4dkdk+owH1bP+Q4BRqCs55mgWWp9PTwm/HHy/a5vcMtCi1GyIQXfhtNNvKBLbXrUE0Fxej8qlg==", + "license": "MIT", + "dependencies": { + "@solana/addresses": "5.4.0", + "@solana/codecs-core": "5.4.0", + "@solana/codecs-data-structures": "5.4.0", + "@solana/codecs-numbers": "5.4.0", + "@solana/codecs-strings": "5.4.0", + "@solana/errors": "5.4.0", + "@solana/keys": "5.4.0", + "@solana/nominal-types": "5.4.0" + }, "engines": { - "node": ">=8" + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@sentry/bundler-plugin-core/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "node_modules/@solana/options": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@solana/options/-/options-5.4.0.tgz", + "integrity": "sha512-h4vTWRChEXPhaHo9i1pCyQBWWs+NqYPQRXSAApqpUYvHb9Kct/C6KbHjfyaRMyqNQnDHLcJCX7oW9tk0iRDzIg==", "license": "MIT", "dependencies": { - "yocto-queue": "^0.1.0" + "@solana/codecs-core": "5.4.0", + "@solana/codecs-data-structures": "5.4.0", + "@solana/codecs-numbers": "5.4.0", + "@solana/codecs-strings": "5.4.0", + "@solana/errors": "5.4.0" }, "engines": { - "node": ">=10" + "node": ">=20.18.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@sentry/bundler-plugin-core/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "node_modules/@solana/plugin-core": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@solana/plugin-core/-/plugin-core-5.4.0.tgz", + "integrity": "sha512-e1aLGLldW7C5113qTOjFYSGq95a4QC9TWb77iq+8l6h085DcNj+195r4E2zKaINrevQjQTwvxo00oUyHP7hSJA==", + "license": "MIT", + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@solana/programs": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@solana/programs/-/programs-5.4.0.tgz", + "integrity": "sha512-Sc90WK9ZZ7MghOflIvkrIm08JwsFC99yqSJy28/K+hDP2tcx+1x+H6OFP9cumW9eUA1+JVRDeKAhA8ak7e/kUA==", "license": "MIT", "dependencies": { - "p-limit": "^3.0.2" + "@solana/addresses": "5.4.0", + "@solana/errors": "5.4.0" }, "engines": { - "node": ">=10" + "node": ">=20.18.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@sentry/bundler-plugin-core/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "node_modules/@solana/promises": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@solana/promises/-/promises-5.4.0.tgz", + "integrity": "sha512-23mfgNBbuP6Q+4vsixGy+GkyZ7wBLrxTBNXqrG/XWrJhjuuSkjEUGaK4Fx5o7LIrBi6KGqPknKxmTlvqnJhy2Q==", "license": "MIT", "engines": { - "node": ">=8" + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@sentry/cli": { - "version": "2.42.2", - "resolved": "https://registry.npmjs.org/@sentry/cli/-/cli-2.42.2.tgz", - "integrity": "sha512-spb7S/RUumCGyiSTg8DlrCX4bivCNmU/A1hcfkwuciTFGu8l5CDc2I6jJWWZw8/0enDGxuj5XujgXvU5tr4bxg==", - "hasInstallScript": true, - "license": "BSD-3-Clause", + "node_modules/@solana/rpc": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@solana/rpc/-/rpc-5.4.0.tgz", + "integrity": "sha512-S6GRG+usnubDs0JSpgc0ZWEh9IPL5KPWMuBoD8ggGVOIVWntp53FpvhYslNzbxWBXlTvJecr2todBipGVM/AqQ==", + "license": "MIT", "dependencies": { - "https-proxy-agent": "^5.0.0", - "node-fetch": "^2.6.7", - "progress": "^2.0.3", - "proxy-from-env": "^1.1.0", - "which": "^2.0.2" - }, - "bin": { - "sentry-cli": "bin/sentry-cli" + "@solana/errors": "5.4.0", + "@solana/fast-stable-stringify": "5.4.0", + "@solana/functional": "5.4.0", + "@solana/rpc-api": "5.4.0", + "@solana/rpc-spec": "5.4.0", + "@solana/rpc-spec-types": "5.4.0", + "@solana/rpc-transformers": "5.4.0", + "@solana/rpc-transport-http": "5.4.0", + "@solana/rpc-types": "5.4.0" }, "engines": { - "node": ">= 10" + "node": ">=20.18.0" }, - "optionalDependencies": { - "@sentry/cli-darwin": "2.42.2", - "@sentry/cli-linux-arm": "2.42.2", - "@sentry/cli-linux-arm64": "2.42.2", - "@sentry/cli-linux-i686": "2.42.2", - "@sentry/cli-linux-x64": "2.42.2", - "@sentry/cli-win32-i686": "2.42.2", - "@sentry/cli-win32-x64": "2.42.2" + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@sentry/cli-darwin": { - "version": "2.42.2", - "resolved": "https://registry.npmjs.org/@sentry/cli-darwin/-/cli-darwin-2.42.2.tgz", - "integrity": "sha512-GtJSuxER7Vrp1IpxdUyRZzcckzMnb4N5KTW7sbTwUiwqARRo+wxS+gczYrS8tdgtmXs5XYhzhs+t4d52ITHMIg==", - "license": "BSD-3-Clause", - "optional": true, - "os": [ - "darwin" - ], + "node_modules/@solana/rpc-api": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-api/-/rpc-api-5.4.0.tgz", + "integrity": "sha512-FJL6KaAsQ4DhfhLKKMcqbTpToNFwHlABCemIpOunE3OSqJFDrmc/NbsEaLIoeHyIg3d1Imo49GIUOn2TEouFUA==", + "license": "MIT", + "dependencies": { + "@solana/addresses": "5.4.0", + "@solana/codecs-core": "5.4.0", + "@solana/codecs-strings": "5.4.0", + "@solana/errors": "5.4.0", + "@solana/keys": "5.4.0", + "@solana/rpc-parsed-types": "5.4.0", + "@solana/rpc-spec": "5.4.0", + "@solana/rpc-transformers": "5.4.0", + "@solana/rpc-types": "5.4.0", + "@solana/transaction-messages": "5.4.0", + "@solana/transactions": "5.4.0" + }, "engines": { - "node": ">=10" + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@sentry/cli-linux-arm": { - "version": "2.42.2", - "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm/-/cli-linux-arm-2.42.2.tgz", - "integrity": "sha512-7udCw+YL9lwq+9eL3WLspvnuG+k5Icg92YE7zsteTzWLwgPVzaxeZD2f8hwhsu+wmL+jNqbpCRmktPteh3i2mg==", - "cpu": [ - "arm" - ], - "license": "BSD-3-Clause", - "optional": true, - "os": [ - "linux", - "freebsd" - ], + "node_modules/@solana/rpc-parsed-types": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-parsed-types/-/rpc-parsed-types-5.4.0.tgz", + "integrity": "sha512-IRQuSzx+Sj1A3XGiIzguNZlMjMMybXTTjV/RnTwBgnJQPd/H4us4pfPD94r+/yolWDVfGjJRm04hnKVMjJU8Rg==", + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@sentry/cli-linux-arm64": { - "version": "2.42.2", - "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm64/-/cli-linux-arm64-2.42.2.tgz", - "integrity": "sha512-BOxzI7sgEU5Dhq3o4SblFXdE9zScpz6EXc5Zwr1UDZvzgXZGosUtKVc7d1LmkrHP8Q2o18HcDWtF3WvJRb5Zpw==", - "cpu": [ - "arm64" - ], - "license": "BSD-3-Clause", - "optional": true, - "os": [ - "linux", - "freebsd" - ], + "node_modules/@solana/rpc-spec": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-spec/-/rpc-spec-5.4.0.tgz", + "integrity": "sha512-XMhxBb1GuZ3Kaeu5WNHB5KteCQ/aVuMByZmUKPqaanD+gs5MQZr0g62CvN7iwRlFU7GC18Q73ROWR3/JjzbXTA==", + "license": "MIT", + "dependencies": { + "@solana/errors": "5.4.0", + "@solana/rpc-spec-types": "5.4.0" + }, "engines": { - "node": ">=10" + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@sentry/cli-linux-i686": { - "version": "2.42.2", - "resolved": "https://registry.npmjs.org/@sentry/cli-linux-i686/-/cli-linux-i686-2.42.2.tgz", - "integrity": "sha512-Sw/dQp5ZPvKnq3/y7wIJyxTUJYPGoTX/YeMbDs8BzDlu9to2LWV3K3r7hE7W1Lpbaw4tSquUHiQjP5QHCOS7aQ==", - "cpu": [ - "x86", - "ia32" - ], - "license": "BSD-3-Clause", - "optional": true, - "os": [ - "linux", - "freebsd" - ], + "node_modules/@solana/rpc-spec-types": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-spec-types/-/rpc-spec-types-5.4.0.tgz", + "integrity": "sha512-JU9hC5/iyJx30ym17gpoXDtT9rCbO6hLpB6UDhSFFoNeirxtTVb4OdnKtsjJDfXAiXsynJRsZRwfj3vGxRLgQw==", + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@sentry/cli-linux-x64": { - "version": "2.42.2", - "resolved": "https://registry.npmjs.org/@sentry/cli-linux-x64/-/cli-linux-x64-2.42.2.tgz", - "integrity": "sha512-mU4zUspAal6TIwlNLBV5oq6yYqiENnCWSxtSQVzWs0Jyq97wtqGNG9U+QrnwjJZ+ta/hvye9fvL2X25D/RxHQw==", - "cpu": [ - "x64" - ], - "license": "BSD-3-Clause", - "optional": true, - "os": [ - "linux", - "freebsd" - ], + "node_modules/@solana/rpc-subscriptions": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-subscriptions/-/rpc-subscriptions-5.4.0.tgz", + "integrity": "sha512-051t1CEjjAzM9ohjj2zb3ED70yeS3ZY8J5wSytL6tthTGImw/JB2a0D9DWMOKriFKt496n95IC+IdpJ35CpBWA==", + "license": "MIT", + "dependencies": { + "@solana/errors": "5.4.0", + "@solana/fast-stable-stringify": "5.4.0", + "@solana/functional": "5.4.0", + "@solana/promises": "5.4.0", + "@solana/rpc-spec-types": "5.4.0", + "@solana/rpc-subscriptions-api": "5.4.0", + "@solana/rpc-subscriptions-channel-websocket": "5.4.0", + "@solana/rpc-subscriptions-spec": "5.4.0", + "@solana/rpc-transformers": "5.4.0", + "@solana/rpc-types": "5.4.0", + "@solana/subscribable": "5.4.0" + }, "engines": { - "node": ">=10" + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@sentry/cli-win32-i686": { - "version": "2.42.2", - "resolved": "https://registry.npmjs.org/@sentry/cli-win32-i686/-/cli-win32-i686-2.42.2.tgz", - "integrity": "sha512-iHvFHPGqgJMNqXJoQpqttfsv2GI3cGodeTq4aoVLU/BT3+hXzbV0x1VpvvEhncJkDgDicJpFLM8sEPHb3b8abw==", - "cpu": [ - "x86", - "ia32" - ], - "license": "BSD-3-Clause", - "optional": true, - "os": [ - "win32" - ], + "node_modules/@solana/rpc-subscriptions-api": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-subscriptions-api/-/rpc-subscriptions-api-5.4.0.tgz", + "integrity": "sha512-euAFIG6ruEsqK+MsrL1tGSMbbOumm8UAyGzlD/kmXsAqqhcVsSeZdv5+BMIHIBsQ93GHcloA8UYw1BTPhpgl9w==", + "license": "MIT", + "dependencies": { + "@solana/addresses": "5.4.0", + "@solana/keys": "5.4.0", + "@solana/rpc-subscriptions-spec": "5.4.0", + "@solana/rpc-transformers": "5.4.0", + "@solana/rpc-types": "5.4.0", + "@solana/transaction-messages": "5.4.0", + "@solana/transactions": "5.4.0" + }, "engines": { - "node": ">=10" + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@sentry/cli-win32-x64": { - "version": "2.42.2", - "resolved": "https://registry.npmjs.org/@sentry/cli-win32-x64/-/cli-win32-x64-2.42.2.tgz", - "integrity": "sha512-vPPGHjYoaGmfrU7xhfFxG7qlTBacroz5NdT+0FmDn6692D8IvpNXl1K+eV3Kag44ipJBBeR8g1HRJyx/F/9ACw==", - "cpu": [ - "x64" - ], - "license": "BSD-3-Clause", - "optional": true, - "os": [ - "win32" - ], + "node_modules/@solana/rpc-subscriptions-channel-websocket": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-subscriptions-channel-websocket/-/rpc-subscriptions-channel-websocket-5.4.0.tgz", + "integrity": "sha512-kWCmlW65MccxqXwKsIz+LkXUYQizgvBrrgYOkyclJHPa+zx4gqJjam87+wzvO9cfbDZRer3wtJBaRm61gTHNbw==", + "license": "MIT", + "dependencies": { + "@solana/errors": "5.4.0", + "@solana/functional": "5.4.0", + "@solana/rpc-subscriptions-spec": "5.4.0", + "@solana/subscribable": "5.4.0", + "ws": "^8.19.0" + }, "engines": { - "node": ">=10" + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@sentry/core": { - "version": "9.16.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-9.16.0.tgz", - "integrity": "sha512-CECfs2HI4CAXJ9zusXw5Aa740TXe6w2n8WiiF9b+V3c5Prufl32oZZj9LL8Cqrc56ozlASLdPjWIo76ApoxTlQ==", + "node_modules/@solana/rpc-subscriptions-channel-websocket/node_modules/ws": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", + "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", "license": "MIT", "engines": { - "node": ">=18" + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, - "node_modules/@sentry/react": { - "version": "9.16.0", - "resolved": "https://registry.npmjs.org/@sentry/react/-/react-9.16.0.tgz", - "integrity": "sha512-FHvdCTM9vIaPUWhwUyCKHBlvA2FSrxjcTMRPTdB+KL1dsLtvKTZfd5rUrbRNDHvfMAC6EPXDvhwsmlHce9klRg==", + "node_modules/@solana/rpc-subscriptions-spec": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-subscriptions-spec/-/rpc-subscriptions-spec-5.4.0.tgz", + "integrity": "sha512-ELaV9Z39GtKyUO0++he00ymWleb07QXYJhSfA0e1N5Q9hXu/Y366kgXHDcbZ/oUJkT3ylNgTupkrsdtiy8Ryow==", "license": "MIT", "dependencies": { - "@sentry/browser": "9.16.0", - "@sentry/core": "9.16.0", - "hoist-non-react-statics": "^3.3.2" + "@solana/errors": "5.4.0", + "@solana/promises": "5.4.0", + "@solana/rpc-spec-types": "5.4.0", + "@solana/subscribable": "5.4.0" }, "engines": { - "node": ">=18" + "node": ">=20.18.0" }, "peerDependencies": { - "react": "^16.14.0 || 17.x || 18.x || 19.x" + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@sentry/vite-plugin": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@sentry/vite-plugin/-/vite-plugin-3.4.0.tgz", - "integrity": "sha512-pUFBGrKsHuc8K6A7B1wU2nx65n9aIzvTlcHX9yZ1qvjEO0cZFih0JCwu1Fcav/yrtT9RMN44L/ugu/kMBHQhjQ==", + "node_modules/@solana/rpc-transformers": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-transformers/-/rpc-transformers-5.4.0.tgz", + "integrity": "sha512-dZ8keYloLW+eRAwAPb471uWCFs58yHloLoI+QH0FulYpsSJ7F2BNWYcdnjSS/WiggsNcU6DhpWzYAzlEY66lGQ==", "license": "MIT", "dependencies": { - "@sentry/bundler-plugin-core": "3.4.0", - "unplugin": "1.0.1" + "@solana/errors": "5.4.0", + "@solana/functional": "5.4.0", + "@solana/nominal-types": "5.4.0", + "@solana/rpc-spec-types": "5.4.0", + "@solana/rpc-types": "5.4.0" }, "engines": { - "node": ">= 14" + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "license": "MIT" - }, - "node_modules/@sindresorhus/is": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-7.1.1.tgz", - "integrity": "sha512-rO92VvpgMc3kfiTjGT52LEtJ8Yc5kCWhZjLQ3LwlA4pSgPpQO7bVpYXParOD8Jwf+cVQECJo3yP/4I8aZtUQTQ==", - "dev": true, + "node_modules/@solana/rpc-transport-http": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-transport-http/-/rpc-transport-http-5.4.0.tgz", + "integrity": "sha512-vidA+Qtqrnqp3QSVumWHdWJ/986yCr5+qX3fbc9KPm9Ofoto88OMWB/oLJvi2Tfges1UBu/jl+lJdsVckCM1bA==", "license": "MIT", + "dependencies": { + "@solana/errors": "5.4.0", + "@solana/rpc-spec": "5.4.0", + "@solana/rpc-spec-types": "5.4.0", + "undici-types": "^7.18.2" + }, "engines": { - "node": ">=18" + "node": ">=20.18.0" }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@socket.io/component-emitter": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", - "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", + "node_modules/@solana/rpc-transport-http/node_modules/undici-types": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", "license": "MIT" }, - "node_modules/@speed-highlight/core": { - "version": "1.2.12", - "resolved": "https://registry.npmjs.org/@speed-highlight/core/-/core-1.2.12.tgz", - "integrity": "sha512-uilwrK0Ygyri5dToHYdZSjcvpS2ZwX0w5aSt3GCEN9hrjxWCoeV4Z2DTXuxjwbntaLQIEEAlCeNQss5SoHvAEA==", - "dev": true, - "license": "CC0-1.0" - }, - "node_modules/@styled-system/background": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@styled-system/background/-/background-5.1.2.tgz", - "integrity": "sha512-jtwH2C/U6ssuGSvwTN3ri/IyjdHb8W9X/g8Y0JLcrH02G+BW3OS8kZdHphF1/YyRklnrKrBT2ngwGUK6aqqV3A==", + "node_modules/@solana/rpc-types": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@solana/rpc-types/-/rpc-types-5.4.0.tgz", + "integrity": "sha512-+C4N4/5AYzBdt3Y2yzkScknScy/jTx6wfvuJIY9XjOXtdDyZ8TmrnMwdPMTZPGLdLuHplJwlwy1acu/4hqmrBQ==", "license": "MIT", "dependencies": { - "@styled-system/core": "^5.1.2" + "@solana/addresses": "5.4.0", + "@solana/codecs-core": "5.4.0", + "@solana/codecs-numbers": "5.4.0", + "@solana/codecs-strings": "5.4.0", + "@solana/errors": "5.4.0", + "@solana/nominal-types": "5.4.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@styled-system/border": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/@styled-system/border/-/border-5.1.5.tgz", - "integrity": "sha512-JvddhNrnhGigtzWRCVuAHepniyVi6hBlimxWDVAdcTuk7aRn9BYJUwfHslURtwYFsF5FoEs8Zmr1oZq2M1AP0A==", + "node_modules/@solana/signers": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@solana/signers/-/signers-5.4.0.tgz", + "integrity": "sha512-s+fZxpi6UPr6XNk2pH/R84WjNRoSktrgG8AGNfsj/V8MJ++eKX7hhIf4JsHZtnnQXXrHmS3ozB2oHlc8yEJvCQ==", "license": "MIT", "dependencies": { - "@styled-system/core": "^5.1.2" + "@solana/addresses": "5.4.0", + "@solana/codecs-core": "5.4.0", + "@solana/errors": "5.4.0", + "@solana/instructions": "5.4.0", + "@solana/keys": "5.4.0", + "@solana/nominal-types": "5.4.0", + "@solana/offchain-messages": "5.4.0", + "@solana/transaction-messages": "5.4.0", + "@solana/transactions": "5.4.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@styled-system/color": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@styled-system/color/-/color-5.1.2.tgz", - "integrity": "sha512-1kCkeKDZkt4GYkuFNKc7vJQMcOmTl3bJY3YBUs7fCNM6mMYJeT1pViQ2LwBSBJytj3AB0o4IdLBoepgSgGl5MA==", + "node_modules/@solana/subscribable": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@solana/subscribable/-/subscribable-5.4.0.tgz", + "integrity": "sha512-72LmfNX7UENgA24sn/xjlWpPAOsrxkWb9DQhuPZxly/gq8rl/rvr7Xu9qBkvFF2po9XpdUrKlccqY4awvfpltA==", "license": "MIT", "dependencies": { - "@styled-system/core": "^5.1.2" + "@solana/errors": "5.4.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@styled-system/core": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@styled-system/core/-/core-5.1.2.tgz", - "integrity": "sha512-XclBDdNIy7OPOsN4HBsawG2eiWfCcuFt6gxKn1x4QfMIgeO6TOlA2pZZ5GWZtIhCUqEPTgIBta6JXsGyCkLBYw==", + "node_modules/@solana/sysvars": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@solana/sysvars/-/sysvars-5.4.0.tgz", + "integrity": "sha512-A5NES7sOlFmpnsiEts5vgyL3NXrt/tGGVSEjlEGvsgwl5EDZNv+xWnNA400uMDqd9O3a5PmH7p/6NsgR+kUzSg==", "license": "MIT", "dependencies": { - "object-assign": "^4.1.1" + "@solana/accounts": "5.4.0", + "@solana/codecs": "5.4.0", + "@solana/errors": "5.4.0", + "@solana/rpc-types": "5.4.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@styled-system/css": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/@styled-system/css/-/css-5.1.5.tgz", - "integrity": "sha512-XkORZdS5kypzcBotAMPBoeckDs9aSZVkvrAlq5K3xP8IMAUek+x2O4NtwoSgkYkWWzVBu6DGdFZLR790QWGG+A==", - "license": "MIT" - }, - "node_modules/@styled-system/flexbox": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@styled-system/flexbox/-/flexbox-5.1.2.tgz", - "integrity": "sha512-6hHV52+eUk654Y1J2v77B8iLeBNtc+SA3R4necsu2VVinSD7+XY5PCCEzBFaWs42dtOEDIa2lMrgL0YBC01mDQ==", + "node_modules/@solana/transaction-confirmation": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@solana/transaction-confirmation/-/transaction-confirmation-5.4.0.tgz", + "integrity": "sha512-EdSDgxs84/4gkjQw2r7N+Kgus8x9U+NFo0ufVG+48V8Hzy2t0rlBuXgIxwx0zZwUuTIgaKhpIutJgVncwZ5koA==", "license": "MIT", "dependencies": { - "@styled-system/core": "^5.1.2" + "@solana/addresses": "5.4.0", + "@solana/codecs-strings": "5.4.0", + "@solana/errors": "5.4.0", + "@solana/keys": "5.4.0", + "@solana/promises": "5.4.0", + "@solana/rpc": "5.4.0", + "@solana/rpc-subscriptions": "5.4.0", + "@solana/rpc-types": "5.4.0", + "@solana/transaction-messages": "5.4.0", + "@solana/transactions": "5.4.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@styled-system/grid": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@styled-system/grid/-/grid-5.1.2.tgz", - "integrity": "sha512-K3YiV1KyHHzgdNuNlaw8oW2ktMuGga99o1e/NAfTEi5Zsa7JXxzwEnVSDSBdJC+z6R8WYTCYRQC6bkVFcvdTeg==", + "node_modules/@solana/transaction-messages": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@solana/transaction-messages/-/transaction-messages-5.4.0.tgz", + "integrity": "sha512-qd/3kZDaPiHM0amhn3vXnupfcsFTVz6CYuHXvq9HFv/fq32+5Kp1FMLnmHwoSxQxdTMDghPdOhC4vhNhuWmuVQ==", "license": "MIT", "dependencies": { - "@styled-system/core": "^5.1.2" + "@solana/addresses": "5.4.0", + "@solana/codecs-core": "5.4.0", + "@solana/codecs-data-structures": "5.4.0", + "@solana/codecs-numbers": "5.4.0", + "@solana/errors": "5.4.0", + "@solana/functional": "5.4.0", + "@solana/instructions": "5.4.0", + "@solana/nominal-types": "5.4.0", + "@solana/rpc-types": "5.4.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@styled-system/layout": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@styled-system/layout/-/layout-5.1.2.tgz", - "integrity": "sha512-wUhkMBqSeacPFhoE9S6UF3fsMEKFv91gF4AdDWp0Aym1yeMPpqz9l9qS/6vjSsDPF7zOb5cOKC3tcKKOMuDCPw==", + "node_modules/@solana/transactions": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@solana/transactions/-/transactions-5.4.0.tgz", + "integrity": "sha512-OuY4M4x/xna8KZQIrz8tSrI9EEul9Od97XejqFmGGkEjbRsUOfJW8705TveTW8jU3bd5RGecFYscPgS2F+m7jQ==", "license": "MIT", "dependencies": { - "@styled-system/core": "^5.1.2" + "@solana/addresses": "5.4.0", + "@solana/codecs-core": "5.4.0", + "@solana/codecs-data-structures": "5.4.0", + "@solana/codecs-numbers": "5.4.0", + "@solana/codecs-strings": "5.4.0", + "@solana/errors": "5.4.0", + "@solana/functional": "5.4.0", + "@solana/instructions": "5.4.0", + "@solana/keys": "5.4.0", + "@solana/nominal-types": "5.4.0", + "@solana/rpc-types": "5.4.0", + "@solana/transaction-messages": "5.4.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@styled-system/position": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@styled-system/position/-/position-5.1.2.tgz", - "integrity": "sha512-60IZfMXEOOZe3l1mCu6sj/2NAyUmES2kR9Kzp7s2D3P4qKsZWxD1Se1+wJvevb+1TP+ZMkGPEYYXRyU8M1aF5A==", + "node_modules/@solana/web3.js": { + "version": "1.98.4", + "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.98.4.tgz", + "integrity": "sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==", "license": "MIT", "dependencies": { - "@styled-system/core": "^5.1.2" + "@babel/runtime": "^7.25.0", + "@noble/curves": "^1.4.2", + "@noble/hashes": "^1.4.0", + "@solana/buffer-layout": "^4.0.1", + "@solana/codecs-numbers": "^2.1.0", + "agentkeepalive": "^4.5.0", + "bn.js": "^5.2.1", + "borsh": "^0.7.0", + "bs58": "^4.0.1", + "buffer": "6.0.3", + "fast-stable-stringify": "^1.0.0", + "jayson": "^4.1.1", + "node-fetch": "^2.7.0", + "rpc-websockets": "^9.0.2", + "superstruct": "^2.0.2" } }, - "node_modules/@styled-system/shadow": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@styled-system/shadow/-/shadow-5.1.2.tgz", - "integrity": "sha512-wqniqYb7XuZM7K7C0d1Euxc4eGtqEe/lvM0WjuAFsQVImiq6KGT7s7is+0bNI8O4Dwg27jyu4Lfqo/oIQXNzAg==", + "node_modules/@solana/web3.js/node_modules/@solana/codecs-core": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@solana/codecs-core/-/codecs-core-2.3.0.tgz", + "integrity": "sha512-oG+VZzN6YhBHIoSKgS5ESM9VIGzhWjEHEGNPSibiDTxFhsFWxNaz8LbMDPjBUE69r9wmdGLkrQ+wVPbnJcZPvw==", "license": "MIT", "dependencies": { - "@styled-system/core": "^5.1.2" + "@solana/errors": "2.3.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" } }, - "node_modules/@styled-system/should-forward-prop": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/@styled-system/should-forward-prop/-/should-forward-prop-5.1.5.tgz", - "integrity": "sha512-+rPRomgCGYnUIaFabDoOgpSDc4UUJ1KsmlnzcEp0tu5lFrBQKgZclSo18Z1URhaZm7a6agGtS5Xif7tuC2s52Q==", + "node_modules/@solana/web3.js/node_modules/@solana/codecs-numbers": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@solana/codecs-numbers/-/codecs-numbers-2.3.0.tgz", + "integrity": "sha512-jFvvwKJKffvG7Iz9dmN51OGB7JBcy2CJ6Xf3NqD/VP90xak66m/Lg48T01u5IQ/hc15mChVHiBm+HHuOFDUrQg==", "license": "MIT", "dependencies": { - "@emotion/is-prop-valid": "^0.8.1", - "@emotion/memoize": "^0.7.1", - "styled-system": "^5.1.5" + "@solana/codecs-core": "2.3.0", + "@solana/errors": "2.3.0" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" } }, - "node_modules/@styled-system/should-forward-prop/node_modules/@emotion/memoize": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.5.tgz", - "integrity": "sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ==", - "license": "MIT" - }, - "node_modules/@styled-system/space": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@styled-system/space/-/space-5.1.2.tgz", - "integrity": "sha512-+zzYpR8uvfhcAbaPXhH8QgDAV//flxqxSjHiS9cDFQQUSznXMQmxJegbhcdEF7/eNnJgHeIXv1jmny78kipgBA==", + "node_modules/@solana/web3.js/node_modules/@solana/errors": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@solana/errors/-/errors-2.3.0.tgz", + "integrity": "sha512-66RI9MAbwYV0UtP7kGcTBVLxJgUxoZGm8Fbc0ah+lGiAw17Gugco6+9GrJCV83VyF2mDWyYnYM9qdI3yjgpnaQ==", "license": "MIT", "dependencies": { - "@styled-system/core": "^5.1.2" + "chalk": "^5.4.1", + "commander": "^14.0.0" + }, + "bin": { + "errors": "bin/cli.mjs" + }, + "engines": { + "node": ">=20.18.0" + }, + "peerDependencies": { + "typescript": ">=5.3.3" } }, - "node_modules/@styled-system/typography": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@styled-system/typography/-/typography-5.1.2.tgz", - "integrity": "sha512-BxbVUnN8N7hJ4aaPOd7wEsudeT7CxarR+2hns8XCX1zp0DFfbWw4xYa/olA0oQaqx7F1hzDg+eRaGzAJbF+jOg==", + "node_modules/@solana/web3.js/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", "license": "MIT", - "dependencies": { - "@styled-system/core": "^5.1.2" + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@styled-system/variant": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/@styled-system/variant/-/variant-5.1.5.tgz", - "integrity": "sha512-Yn8hXAFoWIro8+Q5J8YJd/mP85Teiut3fsGVR9CAxwgNfIAiqlYxsk5iHU7VHJks/0KjL4ATSjmbtCDC/4l1qw==", + "node_modules/@solana/web3.js/node_modules/commander": { + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.2.tgz", + "integrity": "sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==", "license": "MIT", - "dependencies": { - "@styled-system/core": "^5.1.2", - "@styled-system/css": "^5.1.5" + "engines": { + "node": ">=20" } }, + "node_modules/@speed-highlight/core": { + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/@speed-highlight/core/-/core-1.2.14.tgz", + "integrity": "sha512-G4ewlBNhUtlLvrJTb88d2mdy2KRijzs4UhnlrOSRT4bmjh/IqNElZa3zkrZ+TC47TwtlDWzVLFADljF1Ijp5hA==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/@standard-schema/utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@standard-schema/utils/-/utils-0.3.0.tgz", + "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==", + "license": "MIT" + }, "node_modules/@swc/counter": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", @@ -12412,15 +10804,14 @@ "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", "license": "Apache-2.0", - "peer": true, "dependencies": { "tslib": "^2.8.0" } }, "node_modules/@tanstack/query-core": { - "version": "5.89.0", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.89.0.tgz", - "integrity": "sha512-joFV1MuPhSLsKfTzwjmPDrp8ENfZ9N23ymFu07nLfn3JCkSHy0CFgsyhHTJOmWaumC/WiNIKM0EJyduCF/Ih/Q==", + "version": "5.90.19", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.90.19.tgz", + "integrity": "sha512-GLW5sjPVIvH491VV1ufddnfldyVB+teCnpPIvweEfkpRx7CfUmUGhoh9cdcUKBh/KwVxk22aNEDxeTsvmyB/WA==", "license": "MIT", "funding": { "type": "github", @@ -12428,12 +10819,12 @@ } }, "node_modules/@tanstack/react-query": { - "version": "5.89.0", - "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.89.0.tgz", - "integrity": "sha512-SXbtWSTSRXyBOe80mszPxpEbaN4XPRUp/i0EfQK1uyj3KCk/c8FuPJNIRwzOVe/OU3rzxrYtiNabsAmk1l714A==", + "version": "5.90.19", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.90.19.tgz", + "integrity": "sha512-qTZRZ4QyTzQc+M0IzrbKHxSeISUmRB3RPGmao5bT+sI6ayxSRhn0FXEnT5Hg3as8SBFcRosrXXRFB+yAcxVxJQ==", "license": "MIT", "dependencies": { - "@tanstack/query-core": "5.89.0" + "@tanstack/query-core": "5.90.19" }, "funding": { "type": "github", @@ -12597,95 +10988,6 @@ "@testing-library/dom": ">=7.21.4" } }, - "node_modules/@theme-ui/color-modes": { - "version": "0.17.2", - "resolved": "https://registry.npmjs.org/@theme-ui/color-modes/-/color-modes-0.17.2.tgz", - "integrity": "sha512-VSycDWzmEPZwZyJGbA83yKPzjzWzE88FQPRKT3QMHsvoD5dUXlF5tFOg0gEPu2cMhKbSWLCFi/Rtj7ANJDSF/w==", - "license": "MIT", - "dependencies": { - "@theme-ui/core": "^0.17.2", - "@theme-ui/css": "^0.17.2", - "deepmerge": "^4.2.2" - }, - "peerDependencies": { - "@emotion/react": "^11.13.3", - "react": ">=18" - } - }, - "node_modules/@theme-ui/components": { - "version": "0.17.2", - "resolved": "https://registry.npmjs.org/@theme-ui/components/-/components-0.17.2.tgz", - "integrity": "sha512-CJeflLU2P6g+B7xn0NsAaWBiRlN3BknYX8lozTBlRwg53sHlHsbQzumtVerlWUlIa+muMx8kCxJYypYBAiaHhg==", - "license": "MIT", - "dependencies": { - "@styled-system/color": "^5.1.2", - "@styled-system/should-forward-prop": "^5.1.2", - "@styled-system/space": "^5.1.2", - "@theme-ui/core": "^0.17.2", - "@theme-ui/css": "^0.17.2", - "@types/styled-system": "^5.1.13" - }, - "peerDependencies": { - "@emotion/react": "^11.13.3", - "@theme-ui/theme-provider": "^0.17.2", - "react": ">=18" - } - }, - "node_modules/@theme-ui/core": { - "version": "0.17.2", - "resolved": "https://registry.npmjs.org/@theme-ui/core/-/core-0.17.2.tgz", - "integrity": "sha512-PMBaFCh/9HTlUZJFZRxZJoy+w/SVOJCr7v3s7XF5qyGcCuAB5tLv+fjcKpALaZ6QBT1SkHWd07AyTHrs0V2uRw==", - "license": "MIT", - "dependencies": { - "@theme-ui/css": "^0.17.2", - "deepmerge": "^4.2.2" - }, - "peerDependencies": { - "@emotion/react": "^11.13.3", - "react": ">=18" - } - }, - "node_modules/@theme-ui/css": { - "version": "0.17.2", - "resolved": "https://registry.npmjs.org/@theme-ui/css/-/css-0.17.2.tgz", - "integrity": "sha512-sYeurC8WbZBLumt8qO7rM6ZDyvneMh6JojeZov3uwu4Ty2iis8rhqGGK8LD1SfwsWcV8pu3AivQ9xyvWZeaQrw==", - "license": "MIT", - "dependencies": { - "csstype": "^3.0.10" - }, - "peerDependencies": { - "@emotion/react": "^11.11.1" - } - }, - "node_modules/@theme-ui/global": { - "version": "0.17.2", - "resolved": "https://registry.npmjs.org/@theme-ui/global/-/global-0.17.2.tgz", - "integrity": "sha512-yH4Gv/ESDKlxDLz0u5lR3EWAZLfnb4T0Zn1d1LnO7mHv/9dVbF+MA/ogCWLi8Xvs5/u1+RMSJkPfHWfw+Xp5AQ==", - "license": "MIT", - "dependencies": { - "@theme-ui/core": "^0.17.2", - "@theme-ui/css": "^0.17.2" - }, - "peerDependencies": { - "@emotion/react": "^11.13.3", - "react": ">=18" - } - }, - "node_modules/@theme-ui/theme-provider": { - "version": "0.17.2", - "resolved": "https://registry.npmjs.org/@theme-ui/theme-provider/-/theme-provider-0.17.2.tgz", - "integrity": "sha512-Y454eONQU42xHaA6oyWmc3+ViRnKjpi0SAh9zFcz+WmJ2SJVZQ4A8XWXnJHjpq38DFju/AyeEfI4puZRHTkgjQ==", - "license": "MIT", - "dependencies": { - "@theme-ui/color-modes": "^0.17.2", - "@theme-ui/core": "^0.17.2", - "@theme-ui/css": "^0.17.2" - }, - "peerDependencies": { - "@emotion/react": "^11.13.3", - "react": ">=18" - } - }, "node_modules/@types/aria-query": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", @@ -12738,6 +11040,15 @@ "@babel/types": "^7.20.7" } }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/cookie": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", @@ -12822,19 +11133,10 @@ "@types/ms": "*" } }, - "node_modules/@types/dns-packet": { - "version": "5.6.5", - "resolved": "https://registry.npmjs.org/@types/dns-packet/-/dns-packet-5.6.5.tgz", - "integrity": "sha512-qXOC7XLOEe43ehtWJCMnQXvgcIpv6rPmQ1jXT98Ad8A3TB1Ue50jsCbSSSyuazScEuZ/Q026vHbrOTVkmwA+7Q==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/estree": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", - "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "dev": true, "license": "MIT" }, @@ -12858,12 +11160,14 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "devOptional": true, "license": "MIT" }, "node_modules/@types/istanbul-lib-report": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "devOptional": true, "license": "MIT", "dependencies": { "@types/istanbul-lib-coverage": "*" @@ -12873,6 +11177,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "devOptional": true, "license": "MIT", "dependencies": { "@types/istanbul-lib-report": "*" @@ -12925,9 +11230,9 @@ "license": "MIT" }, "node_modules/@types/lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==", + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-RDvF6wTulMPjrNdCoYRC8gNR880JNGT8uB+REUpC2Ns4pRqQJhGz90wh7rgdXDPpCczF3VGktDuFGVnz8zP7HA==", "license": "MIT" }, "node_modules/@types/mdast": { @@ -12939,13 +11244,6 @@ "@types/unist": "^2" } }, - "node_modules/@types/mixpanel-browser": { - "version": "2.54.0", - "resolved": "https://registry.npmjs.org/@types/mixpanel-browser/-/mixpanel-browser-2.54.0.tgz", - "integrity": "sha512-7DMzIH0M9TlpCTMZidaeXris+aMUyAgMMEZtV1xeD6fSQgpCGklUKqyRgidq5hKPKuNEOWBp73549Gusig/xBA==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/ms": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", @@ -12953,12 +11251,12 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.9.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.9.1.tgz", - "integrity": "sha512-p8Yy/8sw1caA8CdRIQBG5tiLHmxtQKObCijiAa9Ez+d4+PRffM4054xbju0msf+cvhJpnFEeNjxmVT/0ipktrg==", + "version": "22.15.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.0.tgz", + "integrity": "sha512-99S8dWD2DkeE6PBaEDw+In3aar7hdoBvjyJMR6vaKBTzpvR0P00ClzJMOoVrj9D2+Sy/YCwACYHnBTpMhg1UCA==", "license": "MIT", "dependencies": { - "undici-types": "~6.19.8" + "undici-types": "~6.21.0" } }, "node_modules/@types/parse-json": { @@ -13031,15 +11329,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/styled-system": { - "version": "5.1.23", - "resolved": "https://registry.npmjs.org/@types/styled-system/-/styled-system-5.1.23.tgz", - "integrity": "sha512-mIwCCdhDa2ifdQCEm8ZeD8m4UEbFsokqEoT9YNOUv4alUJ8jbMKxvpr+oOwfuZgwqLh5HjWuEzwnX7DzWvjFBg==", - "license": "MIT", - "dependencies": { - "csstype": "^3.0.2" - } - }, "node_modules/@types/testing-library__jest-dom": { "version": "5.14.9", "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.9.tgz", @@ -13062,10 +11351,26 @@ "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", "license": "MIT" }, + "node_modules/@types/uuid": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", + "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", + "license": "MIT" + }, + "node_modules/@types/ws": { + "version": "7.4.7", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", + "integrity": "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/yargs": { "version": "17.0.33", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "devOptional": true, "license": "MIT", "dependencies": { "@types/yargs-parser": "*" @@ -13075,6 +11380,7 @@ "version": "21.0.3", "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "devOptional": true, "license": "MIT" }, "node_modules/@uiw/copy-to-clipboard": { @@ -13190,23 +11496,24 @@ } }, "node_modules/@vitejs/plugin-react": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.3.tgz", - "integrity": "sha512-NooDe9GpHGqNns1i8XDERg0Vsg5SSYRhRxxyTGogUdkdNt47jal+fbuYi+Yfq6pzRCKXyoPcWisfxE6RIM3GKA==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.1.2.tgz", + "integrity": "sha512-EcA07pHJouywpzsoTUqNh5NwGayl2PPVEJKUSinGGSxFGYn+shYbqMGBg6FXDqgXum9Ou/ecb+411ssw8HImJQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/core": "^7.25.2", - "@babel/plugin-transform-react-jsx-self": "^7.24.7", - "@babel/plugin-transform-react-jsx-source": "^7.24.7", + "@babel/core": "^7.28.5", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.53", "@types/babel__core": "^7.20.5", - "react-refresh": "^0.14.2" + "react-refresh": "^0.18.0" }, "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": "^20.19.0 || >=22.12.0" }, "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0" + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" } }, "node_modules/@vitest/expect": { @@ -13224,41 +11531,6 @@ "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/mocker": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.1.3.tgz", - "integrity": "sha512-PJbLjonJK82uCWHjzgBJZuR7zmAOrSvKk1QBxrennDIgtH4uK0TB1PvYmc0XBCigxxtiAVPfWtAdy4lpz8SQGQ==", - "dev": true, - "dependencies": { - "@vitest/spy": "3.1.3", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.17" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^5.0.0 || ^6.0.0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, - "node_modules/@vitest/mocker/node_modules/magic-string": { - "version": "0.30.17", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", - "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", - "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" - } - }, "node_modules/@vitest/pretty-format": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.1.3.tgz", @@ -13346,26 +11618,26 @@ } }, "node_modules/@wagmi/connectors": { - "version": "5.11.2", - "resolved": "https://registry.npmjs.org/@wagmi/connectors/-/connectors-5.11.2.tgz", - "integrity": "sha512-OkiElOI8xXGPDZE5UdG6NgDT3laSkEh9llX1DDapUnfnKecK3Tr/HUf5YzgwDhEoox8mdxp+8ZCjtnTKz56SdA==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@wagmi/connectors/-/connectors-6.2.0.tgz", + "integrity": "sha512-2NfkbqhNWdjfibb4abRMrn7u6rPjEGolMfApXss6HCDVt9AW2oVC6k8Q5FouzpJezElxLJSagWz9FW1zaRlanA==", "license": "MIT", "dependencies": { - "@base-org/account": "1.1.1", + "@base-org/account": "2.4.0", "@coinbase/wallet-sdk": "4.3.6", - "@gemini-wallet/core": "0.2.0", + "@gemini-wallet/core": "0.3.2", "@metamask/sdk": "0.33.1", "@safe-global/safe-apps-provider": "0.18.6", "@safe-global/safe-apps-sdk": "9.1.0", "@walletconnect/ethereum-provider": "2.21.1", "cbw-sdk": "npm:@coinbase/wallet-sdk@3.9.3", - "porto": "0.2.19" + "porto": "0.2.35" }, "funding": { "url": "https://github.com/sponsors/wevm" }, "peerDependencies": { - "@wagmi/core": "2.21.2", + "@wagmi/core": "2.22.1", "typescript": ">=5.0.4", "viem": "2.x" }, @@ -13375,10 +11647,95 @@ } } }, + "node_modules/@wagmi/connectors/node_modules/ox": { + "version": "0.9.17", + "resolved": "https://registry.npmjs.org/ox/-/ox-0.9.17.tgz", + "integrity": "sha512-rKAnhzhRU3Xh3hiko+i1ZxywZ55eWQzeS/Q4HRKLx2PqfHOolisZHErSsJVipGlmQKHW5qwOED/GighEw9dbLg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "license": "MIT", + "dependencies": { + "@adraffy/ens-normalize": "^1.11.0", + "@noble/ciphers": "^1.3.0", + "@noble/curves": "1.9.1", + "@noble/hashes": "^1.8.0", + "@scure/bip32": "^1.7.0", + "@scure/bip39": "^1.6.0", + "abitype": "^1.0.9", + "eventemitter3": "5.0.1" + }, + "peerDependencies": { + "typescript": ">=5.4.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@wagmi/connectors/node_modules/porto": { + "version": "0.2.35", + "resolved": "https://registry.npmjs.org/porto/-/porto-0.2.35.tgz", + "integrity": "sha512-gu9FfjjvvYBgQXUHWTp6n3wkTxVtEcqFotM7i3GEZeoQbvLGbssAicCz6hFZ8+xggrJWwi/RLmbwNra50SMmUQ==", + "license": "MIT", + "dependencies": { + "hono": "^4.10.3", + "idb-keyval": "^6.2.1", + "mipd": "^0.0.7", + "ox": "^0.9.6", + "zod": "^4.1.5", + "zustand": "^5.0.1" + }, + "bin": { + "porto": "dist/cli/bin/index.js" + }, + "peerDependencies": { + "@tanstack/react-query": ">=5.59.0", + "@wagmi/core": ">=2.16.3", + "expo-auth-session": ">=7.0.8", + "expo-crypto": ">=15.0.7", + "expo-web-browser": ">=15.0.8", + "react": ">=18", + "react-native": ">=0.81.4", + "typescript": ">=5.4.0", + "viem": ">=2.37.0", + "wagmi": ">=2.0.0" + }, + "peerDependenciesMeta": { + "@tanstack/react-query": { + "optional": true + }, + "expo-auth-session": { + "optional": true + }, + "expo-crypto": { + "optional": true + }, + "expo-web-browser": { + "optional": true + }, + "react": { + "optional": true + }, + "react-native": { + "optional": true + }, + "typescript": { + "optional": true + }, + "wagmi": { + "optional": true + } + } + }, "node_modules/@wagmi/core": { - "version": "2.21.2", - "resolved": "https://registry.npmjs.org/@wagmi/core/-/core-2.21.2.tgz", - "integrity": "sha512-Rp4waam2z0FQUDINkJ91jq38PI5wFUHCv1YBL2LXzAQswaEk1ZY8d6+WG3vYGhFHQ22DXy2AlQ8IWmj+2EG3zQ==", + "version": "2.22.1", + "resolved": "https://registry.npmjs.org/@wagmi/core/-/core-2.22.1.tgz", + "integrity": "sha512-cG/xwQWsBEcKgRTkQVhH29cbpbs/TdcUJVFXCyri3ZknxhMyGv0YEjTcrNpRgt2SaswL1KrvslSNYKKo+5YEAg==", "license": "MIT", "dependencies": { "eventemitter3": "5.0.1", @@ -13479,25 +11836,28 @@ } }, "node_modules/@walletconnect/core/node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", "license": "MIT", "dependencies": { - "readdirp": "^4.0.1" + "readdirp": "^5.0.0" }, "engines": { - "node": ">= 14.16.0" + "node": ">= 20.19.0" }, "funding": { "url": "https://paulmillr.com/funding/" } }, "node_modules/@walletconnect/core/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" + "version": "11.2.4", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", + "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } }, "node_modules/@walletconnect/core/node_modules/multiformats": { "version": "9.9.0", @@ -13506,12 +11866,12 @@ "license": "(Apache-2.0 AND MIT)" }, "node_modules/@walletconnect/core/node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", "license": "MIT", "engines": { - "node": ">= 14.18.0" + "node": ">= 20.19.0" }, "funding": { "type": "individual", @@ -13528,19 +11888,19 @@ } }, "node_modules/@walletconnect/core/node_modules/unstorage": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.17.1.tgz", - "integrity": "sha512-KKGwRTT0iVBCErKemkJCLs7JdxNVfqTPc/85ae1XES0+bsHbc/sFBfVi5kJp156cc51BHinIH2l3k0EZ24vOBQ==", + "version": "1.17.4", + "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.17.4.tgz", + "integrity": "sha512-fHK0yNg38tBiJKp/Vgsq4j0JEsCmgqH58HAn707S7zGkArbZsVr/CwINoi+nh3h98BRCwKvx1K3Xg9u3VV83sw==", "license": "MIT", "dependencies": { "anymatch": "^3.1.3", - "chokidar": "^4.0.3", + "chokidar": "^5.0.0", "destr": "^2.0.5", - "h3": "^1.15.4", - "lru-cache": "^10.4.3", + "h3": "^1.15.5", + "lru-cache": "^11.2.0", "node-fetch-native": "^1.6.7", - "ofetch": "^1.4.1", - "ufo": "^1.6.1" + "ofetch": "^1.5.1", + "ufo": "^1.6.3" }, "peerDependencies": { "@azure/app-configuration": "^1.8.0", @@ -13549,14 +11909,14 @@ "@azure/identity": "^4.6.0", "@azure/keyvault-secrets": "^4.9.0", "@azure/storage-blob": "^12.26.0", - "@capacitor/preferences": "^6.0.3 || ^7.0.0", + "@capacitor/preferences": "^6 || ^7 || ^8", "@deno/kv": ">=0.9.0", "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", "@planetscale/database": "^1.19.0", "@upstash/redis": "^1.34.3", "@vercel/blob": ">=0.27.1", "@vercel/functions": "^2.2.12 || ^3.0.0", - "@vercel/kv": "^1.0.1", + "@vercel/kv": "^1 || ^2 || ^3", "aws4fetch": "^1.0.20", "db0": ">=0.2.1", "idb-keyval": "^6.2.1", @@ -13642,6 +12002,7 @@ "version": "2.21.1", "resolved": "https://registry.npmjs.org/@walletconnect/ethereum-provider/-/ethereum-provider-2.21.1.tgz", "integrity": "sha512-SSlIG6QEVxClgl1s0LMk4xr2wg4eT3Zn/Hb81IocyqNSGfXpjtawWxKxiC5/9Z95f1INyBD6MctJbL/R1oBwIw==", + "deprecated": "Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases", "license": "Apache-2.0", "dependencies": { "@reown/appkit": "1.7.8", @@ -13677,33 +12038,36 @@ } }, "node_modules/@walletconnect/ethereum-provider/node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", "license": "MIT", "dependencies": { - "readdirp": "^4.0.1" + "readdirp": "^5.0.0" }, "engines": { - "node": ">= 14.16.0" + "node": ">= 20.19.0" }, "funding": { "url": "https://paulmillr.com/funding/" } }, "node_modules/@walletconnect/ethereum-provider/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" + "version": "11.2.4", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", + "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } }, "node_modules/@walletconnect/ethereum-provider/node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", "license": "MIT", "engines": { - "node": ">= 14.18.0" + "node": ">= 20.19.0" }, "funding": { "type": "individual", @@ -13711,19 +12075,19 @@ } }, "node_modules/@walletconnect/ethereum-provider/node_modules/unstorage": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.17.1.tgz", - "integrity": "sha512-KKGwRTT0iVBCErKemkJCLs7JdxNVfqTPc/85ae1XES0+bsHbc/sFBfVi5kJp156cc51BHinIH2l3k0EZ24vOBQ==", + "version": "1.17.4", + "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.17.4.tgz", + "integrity": "sha512-fHK0yNg38tBiJKp/Vgsq4j0JEsCmgqH58HAn707S7zGkArbZsVr/CwINoi+nh3h98BRCwKvx1K3Xg9u3VV83sw==", "license": "MIT", "dependencies": { "anymatch": "^3.1.3", - "chokidar": "^4.0.3", + "chokidar": "^5.0.0", "destr": "^2.0.5", - "h3": "^1.15.4", - "lru-cache": "^10.4.3", + "h3": "^1.15.5", + "lru-cache": "^11.2.0", "node-fetch-native": "^1.6.7", - "ofetch": "^1.4.1", - "ufo": "^1.6.1" + "ofetch": "^1.5.1", + "ufo": "^1.6.3" }, "peerDependencies": { "@azure/app-configuration": "^1.8.0", @@ -13732,14 +12096,14 @@ "@azure/identity": "^4.6.0", "@azure/keyvault-secrets": "^4.9.0", "@azure/storage-blob": "^12.26.0", - "@capacitor/preferences": "^6.0.3 || ^7.0.0", + "@capacitor/preferences": "^6 || ^7 || ^8", "@deno/kv": ">=0.9.0", "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", "@planetscale/database": "^1.19.0", "@upstash/redis": "^1.34.3", "@vercel/blob": ">=0.27.1", "@vercel/functions": "^2.2.12 || ^3.0.0", - "@vercel/kv": "^1.0.1", + "@vercel/kv": "^1 || ^2 || ^3", "aws4fetch": "^1.0.20", "db0": ">=0.2.1", "idb-keyval": "^6.2.1", @@ -14009,6 +12373,7 @@ "version": "2.21.1", "resolved": "https://registry.npmjs.org/@walletconnect/sign-client/-/sign-client-2.21.1.tgz", "integrity": "sha512-QaXzmPsMnKGV6tc4UcdnQVNOz4zyXgarvdIQibJ4L3EmLat73r5ZVl4c0cCOcoaV7rgM9Wbphgu5E/7jNcd3Zg==", + "deprecated": "Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases", "license": "Apache-2.0", "dependencies": { "@walletconnect/core": "2.21.1", @@ -14071,33 +12436,36 @@ } }, "node_modules/@walletconnect/types/node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", "license": "MIT", "dependencies": { - "readdirp": "^4.0.1" + "readdirp": "^5.0.0" }, "engines": { - "node": ">= 14.16.0" + "node": ">= 20.19.0" }, "funding": { "url": "https://paulmillr.com/funding/" } }, "node_modules/@walletconnect/types/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" + "version": "11.2.4", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", + "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } }, "node_modules/@walletconnect/types/node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", "license": "MIT", "engines": { - "node": ">= 14.18.0" + "node": ">= 20.19.0" }, "funding": { "type": "individual", @@ -14105,19 +12473,19 @@ } }, "node_modules/@walletconnect/types/node_modules/unstorage": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.17.1.tgz", - "integrity": "sha512-KKGwRTT0iVBCErKemkJCLs7JdxNVfqTPc/85ae1XES0+bsHbc/sFBfVi5kJp156cc51BHinIH2l3k0EZ24vOBQ==", + "version": "1.17.4", + "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.17.4.tgz", + "integrity": "sha512-fHK0yNg38tBiJKp/Vgsq4j0JEsCmgqH58HAn707S7zGkArbZsVr/CwINoi+nh3h98BRCwKvx1K3Xg9u3VV83sw==", "license": "MIT", "dependencies": { "anymatch": "^3.1.3", - "chokidar": "^4.0.3", + "chokidar": "^5.0.0", "destr": "^2.0.5", - "h3": "^1.15.4", - "lru-cache": "^10.4.3", + "h3": "^1.15.5", + "lru-cache": "^11.2.0", "node-fetch-native": "^1.6.7", - "ofetch": "^1.4.1", - "ufo": "^1.6.1" + "ofetch": "^1.5.1", + "ufo": "^1.6.3" }, "peerDependencies": { "@azure/app-configuration": "^1.8.0", @@ -14126,14 +12494,14 @@ "@azure/identity": "^4.6.0", "@azure/keyvault-secrets": "^4.9.0", "@azure/storage-blob": "^12.26.0", - "@capacitor/preferences": "^6.0.3 || ^7.0.0", + "@capacitor/preferences": "^6 || ^7 || ^8", "@deno/kv": ">=0.9.0", "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", "@planetscale/database": "^1.19.0", "@upstash/redis": "^1.34.3", "@vercel/blob": ">=0.27.1", "@vercel/functions": "^2.2.12 || ^3.0.0", - "@vercel/kv": "^1.0.1", + "@vercel/kv": "^1 || ^2 || ^3", "aws4fetch": "^1.0.20", "db0": ">=0.2.1", "idb-keyval": "^6.2.1", @@ -14204,6 +12572,7 @@ "version": "2.21.1", "resolved": "https://registry.npmjs.org/@walletconnect/universal-provider/-/universal-provider-2.21.1.tgz", "integrity": "sha512-Wjx9G8gUHVMnYfxtasC9poGm8QMiPCpXpbbLFT+iPoQskDDly8BwueWnqKs4Mx2SdIAWAwuXeZ5ojk5qQOxJJg==", + "deprecated": "Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases", "license": "Apache-2.0", "dependencies": { "@walletconnect/events": "1.0.1", @@ -14240,33 +12609,36 @@ } }, "node_modules/@walletconnect/universal-provider/node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", "license": "MIT", "dependencies": { - "readdirp": "^4.0.1" + "readdirp": "^5.0.0" }, "engines": { - "node": ">= 14.16.0" + "node": ">= 20.19.0" }, "funding": { "url": "https://paulmillr.com/funding/" } }, "node_modules/@walletconnect/universal-provider/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" + "version": "11.2.4", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", + "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } }, "node_modules/@walletconnect/universal-provider/node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", "license": "MIT", "engines": { - "node": ">= 14.18.0" + "node": ">= 20.19.0" }, "funding": { "type": "individual", @@ -14274,19 +12646,19 @@ } }, "node_modules/@walletconnect/universal-provider/node_modules/unstorage": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.17.1.tgz", - "integrity": "sha512-KKGwRTT0iVBCErKemkJCLs7JdxNVfqTPc/85ae1XES0+bsHbc/sFBfVi5kJp156cc51BHinIH2l3k0EZ24vOBQ==", + "version": "1.17.4", + "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.17.4.tgz", + "integrity": "sha512-fHK0yNg38tBiJKp/Vgsq4j0JEsCmgqH58HAn707S7zGkArbZsVr/CwINoi+nh3h98BRCwKvx1K3Xg9u3VV83sw==", "license": "MIT", "dependencies": { "anymatch": "^3.1.3", - "chokidar": "^4.0.3", + "chokidar": "^5.0.0", "destr": "^2.0.5", - "h3": "^1.15.4", - "lru-cache": "^10.4.3", + "h3": "^1.15.5", + "lru-cache": "^11.2.0", "node-fetch-native": "^1.6.7", - "ofetch": "^1.4.1", - "ufo": "^1.6.1" + "ofetch": "^1.5.1", + "ufo": "^1.6.3" }, "peerDependencies": { "@azure/app-configuration": "^1.8.0", @@ -14295,14 +12667,14 @@ "@azure/identity": "^4.6.0", "@azure/keyvault-secrets": "^4.9.0", "@azure/storage-blob": "^12.26.0", - "@capacitor/preferences": "^6.0.3 || ^7.0.0", + "@capacitor/preferences": "^6 || ^7 || ^8", "@deno/kv": ">=0.9.0", "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", "@planetscale/database": "^1.19.0", "@upstash/redis": "^1.34.3", "@vercel/blob": ">=0.27.1", "@vercel/functions": "^2.2.12 || ^3.0.0", - "@vercel/kv": "^1.0.1", + "@vercel/kv": "^1 || ^2 || ^3", "aws4fetch": "^1.0.20", "db0": ">=0.2.1", "idb-keyval": "^6.2.1", @@ -14500,16 +12872,31 @@ } } }, + "node_modules/@walletconnect/utils/node_modules/base-x": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-5.0.1.tgz", + "integrity": "sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==", + "license": "MIT" + }, + "node_modules/@walletconnect/utils/node_modules/bs58": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-6.0.0.tgz", + "integrity": "sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==", + "license": "MIT", + "dependencies": { + "base-x": "^5.0.0" + } + }, "node_modules/@walletconnect/utils/node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", "license": "MIT", "dependencies": { - "readdirp": "^4.0.1" + "readdirp": "^5.0.0" }, "engines": { - "node": ">= 14.16.0" + "node": ">= 20.19.0" }, "funding": { "url": "https://paulmillr.com/funding/" @@ -14531,10 +12918,13 @@ } }, "node_modules/@walletconnect/utils/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" + "version": "11.2.4", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", + "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } }, "node_modules/@walletconnect/utils/node_modules/multiformats": { "version": "9.9.0", @@ -14572,12 +12962,12 @@ } }, "node_modules/@walletconnect/utils/node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", "license": "MIT", "engines": { - "node": ">= 14.18.0" + "node": ">= 20.19.0" }, "funding": { "type": "individual", @@ -14594,19 +12984,19 @@ } }, "node_modules/@walletconnect/utils/node_modules/unstorage": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.17.1.tgz", - "integrity": "sha512-KKGwRTT0iVBCErKemkJCLs7JdxNVfqTPc/85ae1XES0+bsHbc/sFBfVi5kJp156cc51BHinIH2l3k0EZ24vOBQ==", + "version": "1.17.4", + "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.17.4.tgz", + "integrity": "sha512-fHK0yNg38tBiJKp/Vgsq4j0JEsCmgqH58HAn707S7zGkArbZsVr/CwINoi+nh3h98BRCwKvx1K3Xg9u3VV83sw==", "license": "MIT", "dependencies": { "anymatch": "^3.1.3", - "chokidar": "^4.0.3", + "chokidar": "^5.0.0", "destr": "^2.0.5", - "h3": "^1.15.4", - "lru-cache": "^10.4.3", + "h3": "^1.15.5", + "lru-cache": "^11.2.0", "node-fetch-native": "^1.6.7", - "ofetch": "^1.4.1", - "ufo": "^1.6.1" + "ofetch": "^1.5.1", + "ufo": "^1.6.3" }, "peerDependencies": { "@azure/app-configuration": "^1.8.0", @@ -14615,14 +13005,14 @@ "@azure/identity": "^4.6.0", "@azure/keyvault-secrets": "^4.9.0", "@azure/storage-blob": "^12.26.0", - "@capacitor/preferences": "^6.0.3 || ^7.0.0", + "@capacitor/preferences": "^6 || ^7 || ^8", "@deno/kv": ">=0.9.0", "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", "@planetscale/database": "^1.19.0", "@upstash/redis": "^1.34.3", "@vercel/blob": ">=0.27.1", "@vercel/functions": "^2.2.12 || ^3.0.0", - "@vercel/kv": "^1.0.1", + "@vercel/kv": "^1 || ^2 || ^3", "aws4fetch": "^1.0.20", "db0": ">=0.2.1", "idb-keyval": "^6.2.1", @@ -14740,6 +13130,17 @@ } } }, + "node_modules/@walletconnect/utils/node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "optional": true, + "peer": true, + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, "node_modules/@walletconnect/window-getters": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@walletconnect/window-getters/-/window-getters-1.0.1.tgz", @@ -14778,9 +13179,9 @@ "license": "MIT" }, "node_modules/abitype": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.1.0.tgz", - "integrity": "sha512-6Vh4HcRxNMLA0puzPjM5GBgT4aAcFGKZzSgAXvuZ27shJP6NEpielTuqbBmZILR5/xd0PizkBGy5hReKz9jl5A==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.2.3.tgz", + "integrity": "sha512-Ofer5QUnuUdTFsBRwARMoWKOH1ND5ehwYhJ3OJ/BQO+StkwQjHw0XyVh4vDttzHB7QOFhPHa/o413PJ82gU/Tg==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/wevm" @@ -14810,16 +13211,6 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-walk": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", - "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", @@ -14832,20 +13223,16 @@ "node": ">= 6.0.0" } }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, + "node_modules/agentkeepalive": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz", + "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", "license": "MIT", "dependencies": { - "type-fest": "^0.21.3" + "humanize-ms": "^1.2.1" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 8.0.0" } }, "node_modules/ansi-regex": { @@ -14878,16 +13265,6 @@ "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", "license": "MIT" }, - "node_modules/any-signal": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/any-signal/-/any-signal-4.1.1.tgz", - "integrity": "sha512-iADenERppdC+A2YKbOXXB2WUeABLaM6qnpZ70kZbPZ1cZMMJ7eF+3CaYm+/PhBizgkzlvssC7QuHS30oOiQYWA==", - "license": "Apache-2.0 OR MIT", - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -14911,6 +13288,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "devOptional": true, "license": "Python-2.0" }, "node_modules/aria-hidden": { @@ -14995,9 +13373,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.21", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", - "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", + "version": "10.4.23", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.23.tgz", + "integrity": "sha512-YYTXSFulfwytnjAPlw8QHncHJmlvFKtczb8InXaAx9Q0LbfDnfEYDE55omerIJKihhmU61Ft+cAOSzQVaBUmeA==", "dev": true, "funding": [ { @@ -15015,10 +13393,9 @@ ], "license": "MIT", "dependencies": { - "browserslist": "^4.24.4", - "caniuse-lite": "^1.0.30001702", - "fraction.js": "^4.3.7", - "normalize-range": "^0.1.2", + "browserslist": "^4.28.1", + "caniuse-lite": "^1.0.30001760", + "fraction.js": "^5.3.4", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, @@ -15048,16 +13425,28 @@ } }, "node_modules/axios": { - "version": "1.8.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.4.tgz", - "integrity": "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", + "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", + "form-data": "^4.0.4", "proxy-from-env": "^1.1.0" } }, + "node_modules/axios-retry": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/axios-retry/-/axios-retry-4.5.0.tgz", + "integrity": "sha512-aR99oXhpEDGo0UuAlYcn2iGRds30k366Zfa05XWScR9QaQD4JYiP3/1Qt1u7YlefUOK+cn0CcwoL1oefavQUlQ==", + "license": "Apache-2.0", + "dependencies": { + "is-retry-allowed": "^2.2.0" + }, + "peerDependencies": { + "axios": "0.x || 1.x" + } + }, "node_modules/babel-plugin-macros": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", @@ -15175,10 +13564,13 @@ "license": "MIT" }, "node_modules/base-x": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-5.0.1.tgz", - "integrity": "sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==", - "license": "MIT" + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.11.tgz", + "integrity": "sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.0.1" + } }, "node_modules/base64-arraybuffer": { "version": "1.0.2", @@ -15209,6 +13601,15 @@ ], "license": "MIT" }, + "node_modules/baseline-browser-mapping": { + "version": "2.9.17", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.17.tgz", + "integrity": "sha512-agD0MgJFUP/4nvjqzIB29zRPUuCF7Ge6mEv9s8dHrtYD7QWXRcx75rOADE/d5ah1NI+0vkDl0yorDd5U852IQQ==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, "node_modules/bcp-47-match": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/bcp-47-match/-/bcp-47-match-2.0.3.tgz", @@ -15219,6 +13620,16 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/bidi-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", + "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "require-from-string": "^2.0.2" + } + }, "node_modules/big.js": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-6.2.2.tgz", @@ -15288,15 +13699,6 @@ "dev": true, "license": "MIT" }, - "node_modules/blob-to-it": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/blob-to-it/-/blob-to-it-2.0.8.tgz", - "integrity": "sha512-1MKnG2ul1DtSgrxFHqhdJgIJODJbNj7alOLSJRD7O9S2iCJ72ZWU6j8+CVpjIdLueqwpWhy4ouvpanYlFLqkRw==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "browser-readablestream-to-it": "^2.0.0" - } - }, "node_modules/blockies-ts": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/blockies-ts/-/blockies-ts-1.0.0.tgz", @@ -15315,23 +13717,23 @@ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", "license": "ISC" }, - "node_modules/bowser": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.12.1.tgz", - "integrity": "sha512-z4rE2Gxh7tvshQ4hluIT7XcFrgLIQaw9X3A+kTTRdovCz5PMukm/0QC/BKSYPj3omF5Qfypn9O/c5kgpmvYUCw==", - "license": "MIT" - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", + "node_modules/borsh": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/borsh/-/borsh-0.7.0.tgz", + "integrity": "sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==", + "license": "Apache-2.0", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "bn.js": "^5.2.0", + "bs58": "^4.0.0", + "text-encoding-utf-8": "^1.0.2" } }, + "node_modules/bowser": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.13.1.tgz", + "integrity": "sha512-OHawaAbjwx6rqICCKgSG0SAnT05bzd7ppyKLVUITZpANBaaMFBAsaNkto3LoQ31tyFP5kNujE8Cdx85G9VzOkw==", + "license": "MIT" + }, "node_modules/braces": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", @@ -15344,22 +13746,10 @@ "node": ">=8" } }, - "node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", - "license": "MIT" - }, - "node_modules/browser-readablestream-to-it": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/browser-readablestream-to-it/-/browser-readablestream-to-it-2.0.8.tgz", - "integrity": "sha512-+aDq+8QoTxIklc9m21oVg96Bm18EpeVke4/8vWPNu+9Ktd+G4PYavitE4gv/pjIndw1q+vxE/Rcnv1zYHrEQbQ==", - "license": "Apache-2.0 OR MIT" - }, "node_modules/browserslist": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", - "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", "funding": [ { "type": "opencollective", @@ -15376,10 +13766,11 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001688", - "electron-to-chromium": "^1.5.73", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.1" + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" }, "bin": { "browserslist": "cli.js" @@ -15389,12 +13780,12 @@ } }, "node_modules/bs58": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-6.0.0.tgz", - "integrity": "sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", "license": "MIT", "dependencies": { - "base-x": "^5.0.0" + "base-x": "^3.0.2" } }, "node_modules/buffer": { @@ -15516,6 +13907,7 @@ "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "devOptional": true, "license": "MIT", "engines": { "node": ">=10" @@ -15534,9 +13926,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001745", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001745.tgz", - "integrity": "sha512-ywt6i8FzvdgrrrGbr1jZVObnVv6adj+0if2/omv9cmR2oiZs30zL4DIyaptKcbOrBdOIc74QTMoJvSE2QHh5UQ==", + "version": "1.0.30001765", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001765.tgz", + "integrity": "sha512-LWcNtSyZrakjECqmpP4qdg0MMGdN368D7X8XvvAqOcqMv0RxnlqVKZl2V6/mBR68oYMxOZPLw/gO7DuisMHUvQ==", "funding": [ { "type": "opencollective", @@ -15553,15 +13945,6 @@ ], "license": "CC-BY-4.0" }, - "node_modules/cborg": { - "version": "4.2.9", - "resolved": "https://registry.npmjs.org/cborg/-/cborg-4.2.9.tgz", - "integrity": "sha512-HG8GprGhfzkbzDAIQApqYcN1BJAyf8vDQbzclAwaqrm3ATFnB7ygiWLr+YID+GBdfTJ+yHtzPi06218xULpZrg==", - "license": "Apache-2.0", - "bin": { - "cborg": "lib/bin.js" - } - }, "node_modules/cbw-sdk": { "name": "@coinbase/wallet-sdk", "version": "3.9.3", @@ -15619,6 +14002,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "devOptional": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -15671,12 +14055,14 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true, - "license": "MIT" + "node_modules/charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", + "license": "BSD-3-Clause", + "engines": { + "node": "*" + } }, "node_modules/check-error": { "version": "2.1.1", @@ -15775,16 +14161,6 @@ "node": ">= 0.2.0" } }, - "node_modules/cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 10" - } - }, "node_modules/client-only": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", @@ -15838,20 +14214,6 @@ "react-dom": "^18 || ^19 || ^19.0.0-rc" } }, - "node_modules/color": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", - "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1", - "color-string": "^1.9.0" - }, - "engines": { - "node": ">=12.5.0" - } - }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -15870,17 +14232,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, - "node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, "node_modules/colors": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", @@ -15923,13 +14274,6 @@ "node": ">=14" } }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, "node_modules/convert-source-map": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", @@ -15975,6 +14319,7 @@ "version": "8.3.6", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "devOptional": true, "license": "MIT", "dependencies": { "import-fresh": "^3.3.0", @@ -16041,12 +14386,35 @@ "uncrypto": "^0.1.3" } }, + "node_modules/crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", + "license": "BSD-3-Clause", + "engines": { + "node": "*" + } + }, "node_modules/css-selector-parser": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-1.4.1.tgz", "integrity": "sha512-HYPSb7y/Z7BNDCOrakL4raGO2zltZkbeXyAd6Tg9obzix6QhzxCotdBl6VT0Dv4vZfJGVz3WL/xaEI9Ly3ul0g==", "license": "MIT" }, + "node_modules/css-tree": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", + "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.12.2", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, "node_modules/css-what": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", @@ -16078,6 +14446,32 @@ "node": ">=4" } }, + "node_modules/cssstyle": { + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-5.3.7.tgz", + "integrity": "sha512-7D2EPVltRrsTkhpQmksIu+LxeWAIEk6wRDMJ1qljlv+CKHJM+cJLlfhWIzNA44eAsHXSNe3+vO6DW1yCYx8SuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/css-color": "^4.1.1", + "@csstools/css-syntax-patches-for-csstree": "^1.0.21", + "css-tree": "^3.1.0", + "lru-cache": "^11.2.4" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cssstyle/node_modules/lru-cache": { + "version": "11.2.4", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", + "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, "node_modules/csstype": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", @@ -16085,9 +14479,9 @@ "license": "MIT" }, "node_modules/cuer": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/cuer/-/cuer-0.0.2.tgz", - "integrity": "sha512-MG1BYnnSLqBnO0dOBS1Qm/TEc9DnFa9Sz2jMA24OF4hGzs8UuPjpKBMkRPF3lrpC+7b3EzULwooX9djcvsM8IA==", + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/cuer/-/cuer-0.0.3.tgz", + "integrity": "sha512-f/UNxRMRCYtfLEGECAViByA3JNflZImOk11G9hwSd+44jvzrc99J35u5l+fbdQ2+ZG441GvOpaeGYBmWquZsbQ==", "funding": [ { "type": "github", @@ -16230,21 +14624,56 @@ "node": ">=12" } }, - "node_modules/dag-jose": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/dag-jose/-/dag-jose-5.1.1.tgz", - "integrity": "sha512-9alfZ8Wh1XOOMel8bMpDqWsDT72ojFQCJPtwZSev9qh4f8GoCV9qrJW8jcOUhcstO8Kfm09FHGo//jqiZq3z9w==", - "license": "(Apache-2.0 OR MIT)", + "node_modules/data-urls": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-6.0.0.tgz", + "integrity": "sha512-BnBS08aLUM+DKamupXs3w2tJJoqU+AkaE/+6vQxi/G/DPmIZFJJp9Dkb1kM03AZx8ADehDUZgsNxju3mPXZYIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^15.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/data-urls/node_modules/tr46": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-6.0.0.tgz", + "integrity": "sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==", + "dev": true, + "license": "MIT", "dependencies": { - "@ipld/dag-cbor": "^9.0.0", - "multiformats": "~13.1.3" + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/data-urls/node_modules/webidl-conversions": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-8.0.1.tgz", + "integrity": "sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=20" } }, - "node_modules/dag-jose/node_modules/multiformats": { - "version": "13.1.3", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.1.3.tgz", - "integrity": "sha512-CZPi9lFZCM/+7oRolWYsvalsyWQGFo+GpdaTmjxXXomC+nP/W1Rnxb9sUgjvmNmRZ5bOPqRAl4nuK+Ydw/4tGw==", - "license": "Apache-2.0 OR MIT" + "node_modules/data-urls/node_modules/whatwg-url": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-15.1.0.tgz", + "integrity": "sha512-2ytDk0kiEj/yu90JOAp44PVPUkO9+jVhyf+SybKlRHSDlvOOZhdPIrr7xTH64l4WixO2cP+wQIcgujkGBPPz6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "^6.0.0", + "webidl-conversions": "^8.0.0" + }, + "engines": { + "node": ">=20" + } }, "node_modules/date-fns": { "version": "3.6.0", @@ -16258,15 +14687,15 @@ } }, "node_modules/dayjs": { - "version": "1.11.13", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", - "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", + "version": "1.11.19", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.19.tgz", + "integrity": "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==", "license": "MIT" }, "node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -16289,6 +14718,13 @@ "node": ">=0.10.0" } }, + "node_modules/decimal.js": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "dev": true, + "license": "MIT" + }, "node_modules/decimal.js-light": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", @@ -16452,6 +14888,18 @@ "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", "license": "MIT" }, + "node_modules/delay": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz", + "integrity": "sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -16557,18 +15005,6 @@ "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", "license": "MIT" }, - "node_modules/dns-packet": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", - "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", - "license": "MIT", - "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/dom-accessibility-api": { "version": "0.5.16", "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", @@ -16631,14 +15067,14 @@ "license": "MIT" }, "node_modules/eciesjs": { - "version": "0.4.15", - "resolved": "https://registry.npmjs.org/eciesjs/-/eciesjs-0.4.15.tgz", - "integrity": "sha512-r6kEJXDKecVOCj2nLMuXK/FCPeurW33+3JRpfXVbjLja3XUYFfD9I/JBreH6sUyzcm3G/YQboBjMla6poKeSdA==", + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/eciesjs/-/eciesjs-0.4.16.tgz", + "integrity": "sha512-dS5cbA9rA2VR4Ybuvhg6jvdmp46ubLn3E+px8cG/35aEDNclrqoCjg6mt0HYZ/M+OoESS3jSkCrqk1kWAEhWAw==", "license": "MIT", "dependencies": { - "@ecies/ciphers": "^0.2.3", + "@ecies/ciphers": "^0.2.4", "@noble/ciphers": "^1.3.0", - "@noble/curves": "^1.9.1", + "@noble/curves": "^1.9.7", "@noble/hashes": "^1.8.0" }, "engines": { @@ -16647,54 +15083,36 @@ "node": ">=16" } }, - "node_modules/eip1193-provider": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/eip1193-provider/-/eip1193-provider-1.0.1.tgz", - "integrity": "sha512-kSuqwQ26d7CzuS/t3yRXo2Su2cVH0QfvyKbr2H7Be7O5YDyIq4hQGCNTo5wRdP07bt+E2R/8nPCzey4ojBHf7g==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "license": "MIT", - "dependencies": { - "@json-rpc-tools/provider": "^1.5.5" - } - }, - "node_modules/electron-fetch": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/electron-fetch/-/electron-fetch-1.9.1.tgz", - "integrity": "sha512-M9qw6oUILGVrcENMSRRefE1MbHPIz0h79EKIeJWK9v563aT9Qkh8aEHPO1H5vi970wPirNY+jO9OpFoLiMsMGA==", + "node_modules/eciesjs/node_modules/@noble/curves": { + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz", + "integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==", "license": "MIT", "dependencies": { - "encoding": "^0.1.13" + "@noble/hashes": "1.8.0" }, "engines": { - "node": ">=6" + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/electron-to-chromium": { - "version": "1.5.129", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.129.tgz", - "integrity": "sha512-JlXUemX4s0+9f8mLqib/bHH8gOHf5elKS6KeWG3sk3xozb/JTq/RLXIv8OKUWiK4Ah00Wm88EFj5PYkFr4RUPA==", - "license": "ISC" - }, - "node_modules/elliptic": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", - "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", + "node_modules/eip1193-provider": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/eip1193-provider/-/eip1193-provider-1.0.1.tgz", + "integrity": "sha512-kSuqwQ26d7CzuS/t3yRXo2Su2cVH0QfvyKbr2H7Be7O5YDyIq4hQGCNTo5wRdP07bt+E2R/8nPCzey4ojBHf7g==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", "license": "MIT", "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" + "@json-rpc-tools/provider": "^1.5.5" } }, - "node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz", - "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==", - "license": "MIT" + "node_modules/electron-to-chromium": { + "version": "1.5.267", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", + "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==", + "license": "ISC" }, "node_modules/emoji-regex": { "version": "8.0.0", @@ -16713,6 +15131,8 @@ "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "iconv-lite": "^0.6.2" } @@ -16722,6 +15142,8 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -16739,56 +15161,18 @@ } }, "node_modules/engine.io-client": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.6.3.tgz", - "integrity": "sha512-T0iLjnyNWahNyv/lcjS2y4oE358tVS/SYQNxYXGAJ9/GLgH4VCvOQ/mhTjqU88mLZCQgiG8RIegFHYCdVC+j5w==", + "version": "6.6.4", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.6.4.tgz", + "integrity": "sha512-+kjUJnZGwzewFDw951CDWcwj35vMNf2fcj7xQWOctq1F2i1jkDdVvdFG9kM/BEChymCH36KgjnW0NsL58JYRxw==", "license": "MIT", "dependencies": { "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1", + "debug": "~4.4.1", "engine.io-parser": "~5.2.1", - "ws": "~8.17.1", + "ws": "~8.18.3", "xmlhttprequest-ssl": "~2.1.1" } }, - "node_modules/engine.io-client/node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/engine.io-client/node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/engine.io-parser": { "version": "5.2.3", "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", @@ -16798,11 +15182,18 @@ "node": ">=10.0.0" } }, - "node_modules/err-code": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-3.0.1.tgz", - "integrity": "sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==", - "license": "MIT" + "node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } }, "node_modules/error-ex": { "version": "1.3.2", @@ -16905,10 +15296,25 @@ "benchmarks" ] }, + "node_modules/es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "license": "MIT" + }, + "node_modules/es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==", + "license": "MIT", + "dependencies": { + "es6-promise": "^4.0.3" + } + }, "node_modules/esbuild": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", - "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -16916,31 +15322,103 @@ "esbuild": "bin/esbuild" }, "engines": { - "node": ">=12" + "node": ">=18" }, "optionalDependencies": { - "@esbuild/android-arm": "0.17.19", - "@esbuild/android-arm64": "0.17.19", - "@esbuild/android-x64": "0.17.19", - "@esbuild/darwin-arm64": "0.17.19", - "@esbuild/darwin-x64": "0.17.19", - "@esbuild/freebsd-arm64": "0.17.19", - "@esbuild/freebsd-x64": "0.17.19", - "@esbuild/linux-arm": "0.17.19", - "@esbuild/linux-arm64": "0.17.19", - "@esbuild/linux-ia32": "0.17.19", - "@esbuild/linux-loong64": "0.17.19", - "@esbuild/linux-mips64el": "0.17.19", - "@esbuild/linux-ppc64": "0.17.19", - "@esbuild/linux-riscv64": "0.17.19", - "@esbuild/linux-s390x": "0.17.19", - "@esbuild/linux-x64": "0.17.19", - "@esbuild/netbsd-x64": "0.17.19", - "@esbuild/openbsd-x64": "0.17.19", - "@esbuild/sunos-x64": "0.17.19", - "@esbuild/win32-arm64": "0.17.19", - "@esbuild/win32-ia32": "0.17.19", - "@esbuild/win32-x64": "0.17.19" + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/esbuild/node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" } }, "node_modules/escalade": { @@ -16964,11 +15442,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/esm": { + "version": "3.2.25", + "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", + "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=6" + } + }, "node_modules/estree-walker": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0" } @@ -17025,9 +15515,9 @@ } }, "node_modules/eth-block-tracker/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -17036,6 +15526,15 @@ "node": ">=10" } }, + "node_modules/eth-block-tracker/node_modules/superstruct": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-1.0.4.tgz", + "integrity": "sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/eth-json-rpc-filters": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/eth-json-rpc-filters/-/eth-json-rpc-filters-6.0.1.tgz", @@ -17200,19 +15699,6 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/exit-hook": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-2.2.1.tgz", - "integrity": "sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/expect": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", @@ -17258,31 +15744,12 @@ "node": ">=12.0.0" } }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "license": "MIT", - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/extract-files": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/extract-files/-/extract-files-9.0.0.tgz", - "integrity": "sha512-CvdFfHkC95B4bBBk36hcEmvdR2awOdhhVUYH6S/zrVj3477zven/fJMYg7121h4T1xHZC+tetUpubpAhxwI7hQ==", - "license": "MIT", + "node_modules/eyes": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", + "integrity": "sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==", "engines": { - "node": "^10.17.0 || ^12.0.0 || >= 13.7.0" - }, - "funding": { - "url": "https://github.com/sponsors/jaydenseric" + "node": "> 0.1.90" } }, "node_modules/fast-deep-equal": { @@ -17300,12 +15767,6 @@ "node": ">=6.0.0" } }, - "node_modules/fast-fifo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", - "license": "MIT" - }, "node_modules/fast-glob": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", @@ -17337,6 +15798,12 @@ "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", "license": "MIT" }, + "node_modules/fast-stable-stringify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-stable-stringify/-/fast-stable-stringify-1.0.0.tgz", + "integrity": "sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==", + "license": "MIT" + }, "node_modules/fastq": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", @@ -17352,32 +15819,6 @@ "integrity": "sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA==", "license": "MIT" }, - "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/figures/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/file-selector": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-2.1.2.tgz", @@ -17417,19 +15858,6 @@ "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", "license": "MIT" }, - "node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/follow-redirects": { "version": "1.15.9", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", @@ -17494,14 +15922,15 @@ } }, "node_modules/form-data": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", - "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", "mime-types": "^2.1.12" }, "engines": { @@ -17509,34 +15938,19 @@ } }, "node_modules/fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", "dev": true, "license": "MIT", "engines": { "node": "*" }, "funding": { - "type": "patreon", + "type": "github", "url": "https://github.com/sponsors/rawify" } }, - "node_modules/fs-extra": { - "version": "11.3.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", - "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -17627,12 +16041,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-iterator": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-iterator/-/get-iterator-1.0.2.tgz", - "integrity": "sha512-v+dm9bNVfOYsY1OrhaCrmyOcYoSeVvbt+hHZ0Au+T+p1y+0Uyj9aMaGIeUTT6xdpRbWzDeYKvfOslPhggQMcsg==", - "license": "MIT" - }, "node_modules/get-nonce": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", @@ -17688,22 +16096,24 @@ "license": "ISC" }, "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.1.0.tgz", + "integrity": "sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "foreground-child": "^3.3.1", + "jackspeak": "^4.1.1", + "minimatch": "^10.1.1", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" }, "engines": { - "node": "*" + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -17721,17 +16131,54 @@ "node": ">= 6" } }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "node_modules/glob/node_modules/jackspeak": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", + "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", "dev": true, - "license": "BSD-2-Clause" + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob/node_modules/lru-cache": { + "version": "11.2.4", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", + "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/glob/node_modules/path-scurry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", + "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, "node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, "license": "MIT", "engines": { "node": ">=4" @@ -17744,15 +16191,6 @@ "dev": true, "license": "MIT" }, - "node_modules/goober": { - "version": "2.1.16", - "resolved": "https://registry.npmjs.org/goober/-/goober-2.1.16.tgz", - "integrity": "sha512-erjk19y1U33+XAMe1VTvIONHYoSqE4iS7BYUZfHaqeohLmnC0FdxEh7rQU+6MZ4OajItzjZFSRtVANrQwNq6/g==", - "license": "MIT", - "peerDependencies": { - "csstype": "^3.0.10" - } - }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -17773,48 +16211,30 @@ "license": "ISC" }, "node_modules/graphql": { - "version": "16.10.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.10.0.tgz", - "integrity": "sha512-AjqGKbDGUFRKIRCP9tCKiIGHyriz2oHEbPIbEtcSLSs4YjReZOIPQQWek4+6hjw62H9QShXHyaGivGiYVLeYFQ==", + "version": "16.12.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.12.0.tgz", + "integrity": "sha512-DKKrynuQRne0PNpEbzuEdHlYOMksHSUI8Zc9Unei5gTsMNA2/vMpoMz/yKba50pejK56qj98qM0SjYxAKi13gQ==", "license": "MIT", "engines": { "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" } }, "node_modules/graphql-request": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/graphql-request/-/graphql-request-5.1.0.tgz", - "integrity": "sha512-0OeRVYigVwIiXhNmqnPDt+JhMzsjinxHE7TVy3Lm6jUzav0guVcL0lfSbi6jVTRAxcbwgyr6yrZioSHxf9gHzw==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/graphql-request/-/graphql-request-7.4.0.tgz", + "integrity": "sha512-xfr+zFb/QYbs4l4ty0dltqiXIp07U6sl+tOKAb0t50/EnQek6CVVBLjETXi+FghElytvgaAWtIOt3EV7zLzIAQ==", "license": "MIT", "dependencies": { - "@graphql-typed-document-node/core": "^3.1.1", - "cross-fetch": "^3.1.5", - "extract-files": "^9.0.0", - "form-data": "^3.0.0" + "@graphql-typed-document-node/core": "^3.2.0" }, "peerDependencies": { "graphql": "14 - 16" } }, - "node_modules/graphql-request/node_modules/form-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.3.tgz", - "integrity": "sha512-q5YBMeWy6E2Un0nMGWMgI65MAKtaylxfNJGJxpGh45YDciZB4epbWpaAfImil6CPAPTYB4sh0URQNDRIZG5F2w==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "mime-types": "^2.1.35" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/h3": { - "version": "1.15.4", - "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.4.tgz", - "integrity": "sha512-z5cFQWDffyOe4vQ9xIqNfCZdV4p//vy6fBnr8Q1AWnVZ0teurKMG66rLj++TKwKPUP3u7iMUvrvKaEUiQw2QWQ==", + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.5.tgz", + "integrity": "sha512-xEyq3rSl+dhGX2Lm0+eFQIAzlDN6Fs0EcC4f7BNUmzaRX/PTzeuM+Tr2lHB8FoXggsQIeXLj8EDVgs5ywxyxmg==", "license": "MIT", "dependencies": { "cookie-es": "^1.2.2", @@ -17822,9 +16242,9 @@ "defu": "^6.1.4", "destr": "^2.0.5", "iron-webcrypto": "^1.2.1", - "node-mock-http": "^1.0.2", + "node-mock-http": "^1.0.4", "radix3": "^1.1.2", - "ufo": "^1.6.1", + "ufo": "^1.6.3", "uncrypto": "^0.1.3" } }, @@ -17845,6 +16265,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "devOptional": true, "license": "MIT", "engines": { "node": ">=8" @@ -17897,13 +16318,7 @@ "dependencies": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.1" - } - }, - "node_modules/hashlru": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/hashlru/-/hashlru-2.3.0.tgz", - "integrity": "sha512-0cMsjjIC8I+D3M44pOQdsy0OHXGLVz6Z0beRuufhKa0KfaD2wGwAev6jILzXsd3/vpnNQJmWyZtIILqM1N+n5A==", - "license": "MIT" + } }, "node_modules/hasown": { "version": "2.0.2", @@ -18117,17 +16532,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", - "license": "MIT", - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, "node_modules/hoist-non-react-statics": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", @@ -18138,14 +16542,27 @@ } }, "node_modules/hono": { - "version": "4.9.9", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.9.9.tgz", - "integrity": "sha512-Hxw4wT6zjJGZJdkJzAx9PyBdf7ZpxaTSA0NfxqjLghwMrLBX8p33hJBzoETRakF3UJu6OdNQBZAlNSkGqKFukw==", + "version": "4.11.4", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.11.4.tgz", + "integrity": "sha512-U7tt8JsyrxSRKspfhtLET79pU8K+tInj5QZXs1jSugO1Vq5dFj3kmZsRldo29mTBfcjDRVRXrEZ6LS63Cog9ZA==", "license": "MIT", "engines": { "node": ">=16.9.0" } }, + "node_modules/html-encoding-sniffer": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-6.0.0.tgz", + "integrity": "sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@exodus/bytes": "^1.6.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, "node_modules/html-void-elements": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-2.0.1.tgz", @@ -18171,6 +16588,30 @@ "node": ">=8.0.0" } }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/http-proxy-agent/node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, "node_modules/http-proxy/node_modules/eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", @@ -18202,22 +16643,21 @@ } }, "node_modules/humanize-duration": { - "version": "3.32.1", - "resolved": "https://registry.npmjs.org/humanize-duration/-/humanize-duration-3.32.1.tgz", - "integrity": "sha512-inh5wue5XdfObhu/IGEMiA1nUXigSGcaKNemcbLRKa7jXYGDZXr3LoT9pTIzq2hPEbld7w/qv9h+ikWGz8fL1g==", - "license": "Unlicense" + "version": "3.33.2", + "resolved": "https://registry.npmjs.org/humanize-duration/-/humanize-duration-3.33.2.tgz", + "integrity": "sha512-K7Ny/ULO1hDm2nnhvAY+SJV1skxFb61fd073SG1IWJl+D44ULrruCuTyjHKjBVVcSuTlnY99DKtgEG39CM5QOQ==", + "license": "Unlicense", + "funding": { + "url": "https://github.com/sponsors/EvanHahn" + } }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", "license": "MIT", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" + "ms": "^2.0.0" } }, "node_modules/idb-keyval": { @@ -18297,18 +16737,6 @@ "node": ">=8" } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -18321,47 +16749,6 @@ "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==", "license": "MIT" }, - "node_modules/inquirer": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", - "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.19", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.6.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/interface-datastore": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/interface-datastore/-/interface-datastore-8.3.1.tgz", - "integrity": "sha512-3r0ETmHIi6HmvM5sc09QQiCD3gUfwtEM/AAChOyAd/UAKT69uk8LXfTSUBufbUIO/dU65Vj8nb9O6QjwW8vDSQ==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "interface-store": "^6.0.0", - "uint8arrays": "^5.1.0" - } - }, - "node_modules/interface-store": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/interface-store/-/interface-store-6.0.2.tgz", - "integrity": "sha512-KSFCXtBlNoG0hzwNa0RmhHtrdhzexp+S+UY2s0rWTBJyfdEIgn6i6Zl9otVqrcFYbYrneBT7hbmHQ8gE0C3umA==", - "license": "Apache-2.0 OR MIT" - }, "node_modules/internal-slot": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", @@ -18395,16 +16782,6 @@ "loose-envify": "^1.0.0" } }, - "node_modules/ipfs-unixfs": { - "version": "11.2.1", - "resolved": "https://registry.npmjs.org/ipfs-unixfs/-/ipfs-unixfs-11.2.1.tgz", - "integrity": "sha512-gUeeX63EFgiaMgcs0cUs2ZUPvlOeEZ38okjK8twdWGZX2jYd2rCk8k/TJ3DSRIDZ2t/aZMv6I23guxHaofZE3w==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "protons-runtime": "^5.5.0", - "uint8arraylist": "^2.4.8" - } - }, "node_modules/iron-webcrypto": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz", @@ -18616,12 +16993,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-electron": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-electron/-/is-electron-2.2.2.tgz", - "integrity": "sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg==", - "license": "MIT" - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -18730,15 +17101,26 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-plain-obj": { + "node_modules/is-observable": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-2.1.0.tgz", + "integrity": "sha512-DailKdLb0WU+xX8K5w7VsJhapwHLZ9jjmazqCJq4X12CTgqq73TKnbRcnSLuXYPOoLQgV5IrD7ePiX/h1vnkBw==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true, + "license": "MIT" + }, "node_modules/is-regex": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", @@ -18757,6 +17139,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-retry-allowed": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-2.2.0.tgz", + "integrity": "sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-set": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", @@ -18917,13 +17311,13 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "license": "ISC" }, - "node_modules/iso-url": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/iso-url/-/iso-url-1.2.1.tgz", - "integrity": "sha512-9JPDgCN4B7QPkLtYAAOrEuAWvP9rWvR5offAr0/SeF046wIkglqH3VXgYYP6NcsKslH80UIVgmPqNe3j7tG2ng==", + "node_modules/isomorphic-ws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", + "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", "license": "MIT", - "engines": { - "node": ">=12" + "peerDependencies": { + "ws": "*" } }, "node_modules/isows": { @@ -18941,86 +17335,6 @@ "ws": "*" } }, - "node_modules/it-all": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/it-all/-/it-all-3.0.7.tgz", - "integrity": "sha512-PkuYtu6XhJzuPTKXImd6y0qE6H91MUPV/b9xotXMAI6GjmD2v3NoHj2g5L0lS2qZ0EzyGWZU1kp0UxW8POvNBQ==", - "license": "Apache-2.0 OR MIT" - }, - "node_modules/it-first": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/it-first/-/it-first-3.0.7.tgz", - "integrity": "sha512-e2dVSlOP+pAxPYPVJBF4fX7au8cvGfvLhIrGCMc5aWDnCvwgOo94xHbi3Da6eXQ2jPL5FGEM8sJMn5uE8Seu+g==", - "license": "Apache-2.0 OR MIT" - }, - "node_modules/it-glob": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/it-glob/-/it-glob-3.0.2.tgz", - "integrity": "sha512-yw6am0buc9W6HThDhlf/0k9LpwK31p9Y3c0hpaoth9Iaha4Kog2oRlVanLGSrPPoh9yGwHJbs+KfBJt020N6/g==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "fast-glob": "^3.3.3" - } - }, - "node_modules/it-last": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/it-last/-/it-last-3.0.7.tgz", - "integrity": "sha512-qG4BTveE6Wzsz5voqaOtZAfZgXTJT+yiaj45vp5S0Vi8oOdgKlRqUeolfvWoMCJ9vwSc/z9pAaNYIza7gA851w==", - "license": "Apache-2.0 OR MIT" - }, - "node_modules/it-map": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/it-map/-/it-map-3.1.2.tgz", - "integrity": "sha512-G3dzFUjTYHKumJJ8wa9dSDS3yKm8L7qDUnAgzemOD0UMztwm54Qc2v97SuUCiAgbOz/aibkSLImfoFK09RlSFQ==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "it-peekable": "^3.0.0" - } - }, - "node_modules/it-peekable": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/it-peekable/-/it-peekable-3.0.6.tgz", - "integrity": "sha512-odk9wn8AwFQipy8+tFaZNRCM62riraKZJRysfbmOett9wgJumCwgZFzWUBUwMoiQapEcEVGwjDpMChZIi+zLuQ==", - "license": "Apache-2.0 OR MIT" - }, - "node_modules/it-pushable": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/it-pushable/-/it-pushable-3.2.3.tgz", - "integrity": "sha512-gzYnXYK8Y5t5b/BnJUr7glfQLO4U5vyb05gPx/TyTw+4Bv1zM9gFk4YsOrnulWefMewlphCjKkakFvj1y99Tcg==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "p-defer": "^4.0.0" - } - }, - "node_modules/it-stream-types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/it-stream-types/-/it-stream-types-2.0.2.tgz", - "integrity": "sha512-Rz/DEZ6Byn/r9+/SBCuJhpPATDF9D+dz5pbgSUyBsCDtza6wtNATrz/jz1gDyNanC3XdLboriHnOC925bZRBww==", - "license": "Apache-2.0 OR MIT" - }, - "node_modules/it-to-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/it-to-stream/-/it-to-stream-1.0.0.tgz", - "integrity": "sha512-pLULMZMAB/+vbdvbZtebC0nWBTbG581lk6w8P7DfIIIKUfa8FbY7Oi0FxZcFPbxvISs7A9E+cMpLDBc1XhpAOA==", - "license": "MIT", - "dependencies": { - "buffer": "^6.0.3", - "fast-fifo": "^1.0.0", - "get-iterator": "^1.0.2", - "p-defer": "^3.0.0", - "p-fifo": "^1.0.0", - "readable-stream": "^3.6.0" - } - }, - "node_modules/it-to-stream/node_modules/p-defer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-3.0.0.tgz", - "integrity": "sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/jackspeak": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", @@ -19036,6 +17350,65 @@ "@pkgjs/parseargs": "^0.11.0" } }, + "node_modules/jayson": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/jayson/-/jayson-4.3.0.tgz", + "integrity": "sha512-AauzHcUcqs8OBnCHOkJY280VaTiCm57AbuO7lqzcw7JapGj50BisE3xhksye4zlTSR1+1tAz67wLTl8tEH1obQ==", + "license": "MIT", + "dependencies": { + "@types/connect": "^3.4.33", + "@types/node": "^12.12.54", + "@types/ws": "^7.4.4", + "commander": "^2.20.3", + "delay": "^5.0.0", + "es6-promisify": "^5.0.0", + "eyes": "^0.1.8", + "isomorphic-ws": "^4.0.1", + "json-stringify-safe": "^5.0.1", + "stream-json": "^1.9.1", + "uuid": "^8.3.2", + "ws": "^7.5.10" + }, + "bin": { + "jayson": "bin/jayson.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jayson/node_modules/@types/node": { + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", + "license": "MIT" + }, + "node_modules/jayson/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "license": "MIT" + }, + "node_modules/jayson/node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/jest-diff": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", @@ -19091,6 +17464,7 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "devOptional": true, "license": "MIT", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -19225,6 +17599,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "devOptional": true, "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", @@ -19242,6 +17617,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "devOptional": true, "license": "MIT", "engines": { "node": ">=10" @@ -19254,6 +17630,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "devOptional": true, "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", @@ -19268,6 +17645,7 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "devOptional": true, "license": "MIT" }, "node_modules/jiti": { @@ -19279,27 +17657,28 @@ "jiti": "bin/jiti.js" } }, + "node_modules/jose": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/jose/-/jose-6.1.3.tgz", + "integrity": "sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, "node_modules/jotai": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/jotai/-/jotai-1.13.1.tgz", - "integrity": "sha512-RUmH1S4vLsG3V6fbGlKzGJnLrDcC/HNb5gH2AeA9DzuJknoVxSGvvg8OBB7lke+gDc4oXmdVsaKn/xDUhWZ0vw==", + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/jotai/-/jotai-2.16.2.tgz", + "integrity": "sha512-DH0lBiTXvewsxtqqwjDW6Hg9JPTDnq9LcOsXSFWCAUEt+qj5ohl9iRVX9zQXPPHKLXCdH+5mGvM28fsXMl17/g==", "license": "MIT", "engines": { "node": ">=12.20.0" }, "peerDependencies": { - "@babel/core": "*", - "@babel/template": "*", - "jotai-devtools": "*", - "jotai-immer": "*", - "jotai-optics": "*", - "jotai-redux": "*", - "jotai-tanstack-query": "*", - "jotai-urql": "*", - "jotai-valtio": "*", - "jotai-xstate": "*", - "jotai-zustand": "*", - "react": ">=16.8" + "@babel/core": ">=7.0.0", + "@babel/template": ">=7.0.0", + "@types/react": ">=17.0.0", + "react": ">=17.0.0" }, "peerDependenciesMeta": { "@babel/core": { @@ -19308,69 +17687,157 @@ "@babel/template": { "optional": true }, - "jotai-devtools": { - "optional": true - }, - "jotai-immer": { - "optional": true - }, - "jotai-optics": { - "optional": true - }, - "jotai-redux": { - "optional": true - }, - "jotai-tanstack-query": { - "optional": true - }, - "jotai-urql": { - "optional": true - }, - "jotai-valtio": { - "optional": true - }, - "jotai-xstate": { + "@types/react": { "optional": true }, - "jotai-zustand": { + "react": { "optional": true } } }, "node_modules/js-base64": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.7.tgz", - "integrity": "sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==", + "version": "3.7.8", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.8.tgz", + "integrity": "sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow==", "license": "BSD-3-Clause" }, - "node_modules/js-sha256": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.10.1.tgz", - "integrity": "sha512-5obBtsz9301ULlsgggLg542s/jqtddfOpV5KJc4hajc9JV8GeY2gZHSVpYBn4nWqAUTJ9v+xwtbJ1mIBgIH5Vw==", - "license": "MIT" + "node_modules/js-sha256": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.10.1.tgz", + "integrity": "sha512-5obBtsz9301ULlsgggLg542s/jqtddfOpV5KJc4hajc9JV8GeY2gZHSVpYBn4nWqAUTJ9v+xwtbJ1mIBgIH5Vw==", + "license": "MIT" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdom": { + "version": "27.4.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-27.4.0.tgz", + "integrity": "sha512-mjzqwWRD9Y1J1KUi7W97Gja1bwOOM5Ug0EZ6UDK3xS7j7mndrkwozHtSblfomlzyB4NepioNt+B2sOSzczVgtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@acemir/cssom": "^0.9.28", + "@asamuzakjp/dom-selector": "^6.7.6", + "@exodus/bytes": "^1.6.0", + "cssstyle": "^5.3.4", + "data-urls": "^6.0.0", + "decimal.js": "^10.6.0", + "html-encoding-sniffer": "^6.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.6", + "is-potential-custom-element-name": "^1.0.1", + "parse5": "^8.0.0", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^6.0.0", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^8.0.0", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^15.1.0", + "ws": "^8.18.3", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "canvas": "^3.0.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/jsdom/node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/jsdom/node_modules/parse5": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.0.tgz", + "integrity": "sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } }, - "node_modules/js-sha3": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==", - "license": "MIT" + "node_modules/jsdom/node_modules/tr46": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-6.0.0.tgz", + "integrity": "sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=20" + } }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" + "node_modules/jsdom/node_modules/webidl-conversions": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-8.0.1.tgz", + "integrity": "sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=20" + } }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "node_modules/jsdom/node_modules/whatwg-url": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-15.1.0.tgz", + "integrity": "sha512-2ytDk0kiEj/yu90JOAp44PVPUkO9+jVhyf+SybKlRHSDlvOOZhdPIrr7xTH64l4WixO2cP+wQIcgujkGBPPz6g==", + "dev": true, "license": "MIT", "dependencies": { - "argparse": "^2.0.1" + "tr46": "^6.0.0", + "webidl-conversions": "^8.0.0" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">=20" } }, "node_modules/jsesc": { @@ -19416,6 +17883,12 @@ "integrity": "sha512-RJ9YYNCkhVDBuP4zN5BBtYAzEl03yq/jIIsyif0JY9qyJuQQZNeDK7anAPKKlyEtLSj2s8h6hNh2F8zO5q7ScA==", "license": "ISC" }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "license": "ISC" + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -19428,19 +17901,6 @@ "node": ">=6" } }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, "node_modules/keccak": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.4.tgz", @@ -19471,51 +17931,11 @@ "node": ">=6" } }, - "node_modules/kubo-rpc-client": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kubo-rpc-client/-/kubo-rpc-client-5.1.0.tgz", - "integrity": "sha512-yTBoyEN1Ymwi0Tzi8+Mfxylg3BRAatzykih8jzwaJjfYCqKUEqCX+43m4X78CdTPRXyIHUbdI9N0DcKRwNwk+A==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@ipld/dag-cbor": "^9.0.0", - "@ipld/dag-json": "^10.0.0", - "@ipld/dag-pb": "^4.0.0", - "@libp2p/crypto": "^5.0.0", - "@libp2p/interface": "^2.0.0", - "@libp2p/logger": "^5.0.0", - "@libp2p/peer-id": "^5.0.0", - "@multiformats/multiaddr": "^12.2.1", - "@multiformats/multiaddr-to-uri": "^11.0.0", - "any-signal": "^4.1.1", - "blob-to-it": "^2.0.5", - "browser-readablestream-to-it": "^2.0.5", - "dag-jose": "^5.0.0", - "electron-fetch": "^1.9.1", - "err-code": "^3.0.1", - "ipfs-unixfs": "^11.1.4", - "iso-url": "^1.2.1", - "it-all": "^3.0.4", - "it-first": "^3.0.4", - "it-glob": "^3.0.1", - "it-last": "^3.0.4", - "it-map": "^3.0.5", - "it-peekable": "^3.0.3", - "it-to-stream": "^1.0.0", - "merge-options": "^3.0.4", - "multiformats": "^13.1.0", - "nanoid": "^5.0.7", - "native-fetch": "^4.0.2", - "parse-duration": "^2.1.2", - "react-native-fetch-api": "^3.0.0", - "stream-to-it": "^1.0.1", - "uint8arrays": "^5.0.3", - "wherearewe": "^2.0.1" - } - }, "node_modules/leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "devOptional": true, "license": "MIT", "engines": { "node": ">=6" @@ -19551,39 +17971,25 @@ } }, "node_modules/lit-element": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-4.2.1.tgz", - "integrity": "sha512-WGAWRGzirAgyphK2urmYOV72tlvnxw7YfyLDgQ+OZnM9vQQBQnumQ7jUJe6unEzwGU3ahFOjuz1iz1jjrpCPuw==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-4.2.2.tgz", + "integrity": "sha512-aFKhNToWxoyhkNDmWZwEva2SlQia+jfG0fjIWV//YeTaWrVnOxD89dPKfigCUspXFmjzOEUQpOkejH5Ly6sG0w==", "license": "BSD-3-Clause", "dependencies": { - "@lit-labs/ssr-dom-shim": "^1.4.0", + "@lit-labs/ssr-dom-shim": "^1.5.0", "@lit/reactive-element": "^2.1.0", "lit-html": "^3.3.0" } }, "node_modules/lit-html": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.3.1.tgz", - "integrity": "sha512-S9hbyDu/vs1qNrithiNyeyv64c9yqiW9l+DBgI18fL+MTvOtWoFR0FWiyq1TxaYef5wNlpEmzlXoBlZEO+WjoA==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.3.2.tgz", + "integrity": "sha512-Qy9hU88zcmaxBXcc10ZpdK7cOLXvXpRoBxERdtqV9QOrfpMZZ6pSYP91LhpPtap3sFMUiL7Tw2RImbe0Al2/kw==", "license": "BSD-3-Clause", "dependencies": { "@types/trusted-types": "^2.0.2" } }, - "node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", @@ -19597,20 +18003,6 @@ "dev": true, "license": "MIT" }, - "node_modules/lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", - "deprecated": "This package is deprecated. Use the optional chaining (?.) operator instead.", - "license": "MIT" - }, - "node_modules/lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", - "dev": true, - "license": "MIT" - }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -19680,646 +18072,322 @@ "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", "dev": true, "license": "MIT", - "bin": { - "lz-string": "bin/bin.js" - } - }, - "node_modules/markdown-table": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", - "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/mdast-util-definitions": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz", - "integrity": "sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "unist-util-visit": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-find-and-replace": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.2.tgz", - "integrity": "sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0", - "escape-string-regexp": "^5.0.0", - "unist-util-is": "^5.0.0", - "unist-util-visit-parents": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mdast-util-from-markdown": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz", - "integrity": "sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "mdast-util-to-string": "^3.1.0", - "micromark": "^3.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-decode-string": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "unist-util-stringify-position": "^3.0.0", - "uvu": "^0.5.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-2.0.2.tgz", - "integrity": "sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==", - "license": "MIT", - "dependencies": { - "mdast-util-from-markdown": "^1.0.0", - "mdast-util-gfm-autolink-literal": "^1.0.0", - "mdast-util-gfm-footnote": "^1.0.0", - "mdast-util-gfm-strikethrough": "^1.0.0", - "mdast-util-gfm-table": "^1.0.0", - "mdast-util-gfm-task-list-item": "^1.0.0", - "mdast-util-to-markdown": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-autolink-literal": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.3.tgz", - "integrity": "sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0", - "ccount": "^2.0.0", - "mdast-util-find-and-replace": "^2.0.0", - "micromark-util-character": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-footnote": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.2.tgz", - "integrity": "sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-to-markdown": "^1.3.0", - "micromark-util-normalize-identifier": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-strikethrough": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.3.tgz", - "integrity": "sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-to-markdown": "^1.3.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-table": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.7.tgz", - "integrity": "sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0", - "markdown-table": "^3.0.0", - "mdast-util-from-markdown": "^1.0.0", - "mdast-util-to-markdown": "^1.3.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-task-list-item": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.2.tgz", - "integrity": "sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-to-markdown": "^1.3.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "bin": { + "lz-string": "bin/bin.js" } }, - "node_modules/mdast-util-phrasing": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz", - "integrity": "sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==", + "node_modules/markdown-table": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0", - "unist-util-is": "^5.0.0" - }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/mdast-util-to-hast": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz", - "integrity": "sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==", + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/md5": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", + "license": "BSD-3-Clause", "dependencies": { - "@types/hast": "^2.0.0", - "@types/mdast": "^3.0.0", - "mdast-util-definitions": "^5.0.0", - "micromark-util-sanitize-uri": "^1.1.0", - "trim-lines": "^3.0.0", - "unist-util-generated": "^2.0.0", - "unist-util-position": "^4.0.0", - "unist-util-visit": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" } }, - "node_modules/mdast-util-to-markdown": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz", - "integrity": "sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==", + "node_modules/md5/node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "license": "MIT" + }, + "node_modules/mdast-util-definitions": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz", + "integrity": "sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==", "license": "MIT", "dependencies": { "@types/mdast": "^3.0.0", "@types/unist": "^2.0.0", - "longest-streak": "^3.0.0", - "mdast-util-phrasing": "^3.0.0", - "mdast-util-to-string": "^3.0.0", - "micromark-util-decode-string": "^1.0.0", - "unist-util-visit": "^4.0.0", - "zwitch": "^2.0.0" + "unist-util-visit": "^4.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/mdast-util-to-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz", - "integrity": "sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==", + "node_modules/mdast-util-find-and-replace": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.2.tgz", + "integrity": "sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==", "license": "MIT", "dependencies": { - "@types/mdast": "^3.0.0" + "@types/mdast": "^3.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/media-query-parser": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/media-query-parser/-/media-query-parser-2.0.2.tgz", - "integrity": "sha512-1N4qp+jE0pL5Xv4uEcwVUhIkwdUO3S/9gML90nqKA7v7FcOS5vUtatfzok9S9U1EJU8dHWlcv95WLnKmmxZI9w==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.5" - } - }, - "node_modules/memoize-one": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", - "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", - "license": "MIT" - }, - "node_modules/merge-options": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/merge-options/-/merge-options-3.0.4.tgz", - "integrity": "sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==", - "license": "MIT", - "dependencies": { - "is-plain-obj": "^2.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true, - "license": "MIT" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "license": "MIT", "engines": { - "node": ">= 8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/micro-ftch": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/micro-ftch/-/micro-ftch-0.3.1.tgz", - "integrity": "sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==", - "license": "MIT" - }, - "node_modules/micromark": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz", - "integrity": "sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "node_modules/mdast-util-from-markdown": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz", + "integrity": "sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==", "license": "MIT", "dependencies": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", "decode-named-character-reference": "^1.0.0", - "micromark-core-commonmark": "^1.0.1", - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-chunked": "^1.0.0", - "micromark-util-combine-extensions": "^1.0.0", + "mdast-util-to-string": "^3.1.0", + "micromark": "^3.0.0", "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-encode": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-sanitize-uri": "^1.0.0", - "micromark-util-subtokenize": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.1", - "uvu": "^0.5.0" - } - }, - "node_modules/micromark-core-commonmark": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz", - "integrity": "sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-factory-destination": "^1.0.0", - "micromark-factory-label": "^1.0.0", - "micromark-factory-space": "^1.0.0", - "micromark-factory-title": "^1.0.0", - "micromark-factory-whitespace": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-chunked": "^1.0.0", - "micromark-util-classify-character": "^1.0.0", - "micromark-util-html-tag-name": "^1.0.0", + "micromark-util-decode-string": "^1.0.0", "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-subtokenize": "^1.0.0", "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.1", + "micromark-util-types": "^1.0.0", + "unist-util-stringify-position": "^3.0.0", "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/micromark-extension-gfm": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-2.0.3.tgz", - "integrity": "sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ==", + "node_modules/mdast-util-gfm": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-2.0.2.tgz", + "integrity": "sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==", "license": "MIT", "dependencies": { - "micromark-extension-gfm-autolink-literal": "^1.0.0", - "micromark-extension-gfm-footnote": "^1.0.0", - "micromark-extension-gfm-strikethrough": "^1.0.0", - "micromark-extension-gfm-table": "^1.0.0", - "micromark-extension-gfm-tagfilter": "^1.0.0", - "micromark-extension-gfm-task-list-item": "^1.0.0", - "micromark-util-combine-extensions": "^1.0.0", - "micromark-util-types": "^1.0.0" + "mdast-util-from-markdown": "^1.0.0", + "mdast-util-gfm-autolink-literal": "^1.0.0", + "mdast-util-gfm-footnote": "^1.0.0", + "mdast-util-gfm-strikethrough": "^1.0.0", + "mdast-util-gfm-table": "^1.0.0", + "mdast-util-gfm-task-list-item": "^1.0.0", + "mdast-util-to-markdown": "^1.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/micromark-extension-gfm-autolink-literal": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.5.tgz", - "integrity": "sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==", + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.3.tgz", + "integrity": "sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==", "license": "MIT", "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-sanitize-uri": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" + "@types/mdast": "^3.0.0", + "ccount": "^2.0.0", + "mdast-util-find-and-replace": "^2.0.0", + "micromark-util-character": "^1.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/micromark-extension-gfm-footnote": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.1.2.tgz", - "integrity": "sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==", - "license": "MIT", - "dependencies": { - "micromark-core-commonmark": "^1.0.0", - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-sanitize-uri": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" + "node_modules/mdast-util-gfm-footnote": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.2.tgz", + "integrity": "sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0", + "micromark-util-normalize-identifier": "^1.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/micromark-extension-gfm-strikethrough": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.7.tgz", - "integrity": "sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==", + "node_modules/mdast-util-gfm-strikethrough": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.3.tgz", + "integrity": "sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==", "license": "MIT", "dependencies": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-classify-character": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/micromark-extension-gfm-table": { + "node_modules/mdast-util-gfm-table": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.7.tgz", - "integrity": "sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.7.tgz", + "integrity": "sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==", "license": "MIT", "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" + "@types/mdast": "^3.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "mdast-util-to-markdown": "^1.3.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/micromark-extension-gfm-tagfilter": { + "node_modules/mdast-util-gfm-task-list-item": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.2.tgz", - "integrity": "sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.2.tgz", + "integrity": "sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==", "license": "MIT", "dependencies": { - "micromark-util-types": "^1.0.0" + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/micromark-extension-gfm-task-list-item": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.5.tgz", - "integrity": "sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==", + "node_modules/mdast-util-phrasing": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz", + "integrity": "sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==", "license": "MIT", "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" + "@types/mdast": "^3.0.0", + "unist-util-is": "^5.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/micromark-factory-destination": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz", - "integrity": "sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "node_modules/mdast-util-to-hast": { + "version": "12.3.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz", + "integrity": "sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==", "license": "MIT", "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-definitions": "^5.0.0", + "micromark-util-sanitize-uri": "^1.1.0", + "trim-lines": "^3.0.0", + "unist-util-generated": "^2.0.0", + "unist-util-position": "^4.0.0", + "unist-util-visit": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/micromark-factory-label": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz", - "integrity": "sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "node_modules/mdast-util-to-markdown": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz", + "integrity": "sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==", "license": "MIT", "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^3.0.0", + "mdast-util-to-string": "^3.0.0", + "micromark-util-decode-string": "^1.0.0", + "unist-util-visit": "^4.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/micromark-factory-space": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", - "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "node_modules/mdast-util-to-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz", + "integrity": "sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==", "license": "MIT", "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-types": "^1.0.0" + "@types/mdast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/micromark-factory-title": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz", - "integrity": "sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } + "node_modules/mdn-data": { + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", + "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", + "dev": true, + "license": "CC0-1.0" }, - "node_modules/micromark-factory-whitespace": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz", - "integrity": "sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "node_modules/media-query-parser": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/media-query-parser/-/media-query-parser-2.0.2.tgz", + "integrity": "sha512-1N4qp+jE0pL5Xv4uEcwVUhIkwdUO3S/9gML90nqKA7v7FcOS5vUtatfzok9S9U1EJU8dHWlcv95WLnKmmxZI9w==", "license": "MIT", "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" + "@babel/runtime": "^7.12.5" } }, - "node_modules/micromark-util-character": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", - "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } + "node_modules/memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", + "license": "MIT" }, - "node_modules/micromark-util-chunked": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz", - "integrity": "sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^1.0.0" + "engines": { + "node": ">= 8" } }, - "node_modules/micromark-util-classify-character": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz", - "integrity": "sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==", + "node_modules/micro-ftch": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/micro-ftch/-/micro-ftch-0.3.1.tgz", + "integrity": "sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==", + "license": "MIT" + }, + "node_modules/micromark": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz", + "integrity": "sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==", "funding": [ { "type": "GitHub Sponsors", @@ -20332,15 +18400,29 @@ ], "license": "MIT", "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "micromark-core-commonmark": "^1.0.1", + "micromark-factory-space": "^1.0.0", "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" } }, - "node_modules/micromark-util-combine-extensions": { + "node_modules/micromark-core-commonmark": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz", - "integrity": "sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz", + "integrity": "sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==", "funding": [ { "type": "GitHub Sponsors", @@ -20353,125 +18435,149 @@ ], "license": "MIT", "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-factory-destination": "^1.0.0", + "micromark-factory-label": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-factory-title": "^1.0.0", + "micromark-factory-whitespace": "^1.0.0", + "micromark-util-character": "^1.0.0", "micromark-util-chunked": "^1.0.0", - "micromark-util-types": "^1.0.0" + "micromark-util-classify-character": "^1.0.0", + "micromark-util-html-tag-name": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" } }, - "node_modules/micromark-util-decode-numeric-character-reference": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz", - "integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "node_modules/micromark-extension-gfm": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-2.0.3.tgz", + "integrity": "sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ==", "license": "MIT", "dependencies": { - "micromark-util-symbol": "^1.0.0" + "micromark-extension-gfm-autolink-literal": "^1.0.0", + "micromark-extension-gfm-footnote": "^1.0.0", + "micromark-extension-gfm-strikethrough": "^1.0.0", + "micromark-extension-gfm-table": "^1.0.0", + "micromark-extension-gfm-tagfilter": "^1.0.0", + "micromark-extension-gfm-task-list-item": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-types": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/micromark-util-decode-string": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz", - "integrity": "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.5.tgz", + "integrity": "sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==", "license": "MIT", "dependencies": { - "decode-named-character-reference": "^1.0.0", "micromark-util-character": "^1.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-symbol": "^1.0.0" + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/micromark-util-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz", - "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" + "node_modules/micromark-extension-gfm-footnote": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.1.2.tgz", + "integrity": "sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==", + "license": "MIT", + "dependencies": { + "micromark-core-commonmark": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } }, - "node_modules/micromark-util-html-tag-name": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz", - "integrity": "sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.7.tgz", + "integrity": "sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==", + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-classify-character": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } }, - "node_modules/micromark-util-normalize-identifier": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz", - "integrity": "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "node_modules/micromark-extension-gfm-table": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.7.tgz", + "integrity": "sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==", "license": "MIT", "dependencies": { - "micromark-util-symbol": "^1.0.0" + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/micromark-util-resolve-all": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz", - "integrity": "sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.2.tgz", + "integrity": "sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==", "license": "MIT", "dependencies": { "micromark-util-types": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/micromark-util-sanitize-uri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz", - "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==", + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.5.tgz", + "integrity": "sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==", + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz", + "integrity": "sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==", "funding": [ { "type": "GitHub Sponsors", @@ -20485,14 +18591,14 @@ "license": "MIT", "dependencies": { "micromark-util-character": "^1.0.0", - "micromark-util-encode": "^1.0.0", - "micromark-util-symbol": "^1.0.0" + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" } }, - "node_modules/micromark-util-subtokenize": { + "node_modules/micromark-factory-label": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz", - "integrity": "sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz", + "integrity": "sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==", "funding": [ { "type": "GitHub Sponsors", @@ -20505,16 +18611,16 @@ ], "license": "MIT", "dependencies": { - "micromark-util-chunked": "^1.0.0", + "micromark-util-character": "^1.0.0", "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0", "uvu": "^0.5.0" } }, - "node_modules/micromark-util-symbol": { + "node_modules/micromark-factory-space": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", - "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", + "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", "funding": [ { "type": "GitHub Sponsors", @@ -20525,12 +18631,16 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT" + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-types": "^1.0.0" + } }, - "node_modules/micromark-util-types": { + "node_modules/micromark-factory-title": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", - "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz", + "integrity": "sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==", "funding": [ { "type": "GitHub Sponsors", @@ -20541,740 +18651,580 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT" - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", - "dev": true, - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/miniflare": { - "version": "4.20251125.0", - "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-4.20251125.0.tgz", - "integrity": "sha512-xY6deLx0Drt8GfGG2Fv0fHUocHAIG/Iv62Kl36TPfDzgq7/+DQ5gYNisxnmyISQdA/sm7kOvn2XRBncxjWYrLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspotcode/source-map-support": "0.8.1", - "acorn": "8.14.0", - "acorn-walk": "8.3.2", - "exit-hook": "2.2.1", - "glob-to-regexp": "0.4.1", - "sharp": "^0.33.5", - "stoppable": "1.1.0", - "undici": "7.14.0", - "workerd": "1.20251125.0", - "ws": "8.18.0", - "youch": "4.1.0-beta.10", - "zod": "3.22.3" - }, - "bin": { - "miniflare": "bootstrap.js" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/miniflare/node_modules/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/miniflare/node_modules/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/miniflare/node_modules/zod": { - "version": "3.22.3", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.3.tgz", - "integrity": "sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug==", - "dev": true, "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "license": "ISC" - }, - "node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", - "license": "MIT" - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" } }, - "node_modules/mipd": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mipd/-/mipd-0.0.7.tgz", - "integrity": "sha512-aAPZPNDQ3uMTdKbuO2YmAw2TxLHO0moa4YKAyETM/DTj5FloZo+a+8tU+iv4GmW+sOxKLSRwcSFuczk+Cpt6fg==", + "node_modules/micromark-factory-whitespace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz", + "integrity": "sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==", "funding": [ { - "type": "github", - "url": "https://github.com/sponsors/wagmi-dev" + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" } ], "license": "MIT", - "peerDependencies": { - "typescript": ">=5.0.4" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/mitt": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", - "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", - "license": "MIT" - }, - "node_modules/mixpanel-browser": { - "version": "2.56.0", - "resolved": "https://registry.npmjs.org/mixpanel-browser/-/mixpanel-browser-2.56.0.tgz", - "integrity": "sha512-GYeEz58pV2M9MZtK8vSPL4oJmCwGS08FDDRZvZwr5VJpWdT4Lgyg6zXhmNfCmSTEIw2coaarm7HZ4FL9dAVvnA==", - "license": "Apache-2.0", "dependencies": { - "rrweb": "2.0.0-alpha.13" + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" } }, - "node_modules/modern-ahocorasick": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/modern-ahocorasick/-/modern-ahocorasick-1.1.0.tgz", - "integrity": "sha512-sEKPVl2rM+MNVkGQt3ChdmD8YsigmXdn5NifZn6jiwn9LRJpWm8F3guhaqrJT/JOat6pwpbXEk6kv+b9DMIjsQ==", - "license": "MIT" - }, - "node_modules/moo": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.2.tgz", - "integrity": "sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==", - "license": "BSD-3-Clause" - }, - "node_modules/mri": { + "node_modules/micromark-util-character": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/multiformats": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.3.2.tgz", - "integrity": "sha512-qbB0CQDt3QKfiAzZ5ZYjLFOs+zW43vA4uyM8g27PeEuXZybUOFyjrVdP93HPBHMoglibwfkdVwbzfUq8qGcH6g==", - "license": "Apache-2.0 OR MIT" - }, - "node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true, - "license": "ISC" - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", + "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" } }, - "node_modules/nanoid": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.5.tgz", - "integrity": "sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw==", + "node_modules/micromark-util-chunked": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz", + "integrity": "sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==", "funding": [ { - "type": "github", - "url": "https://github.com/sponsors/ai" + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" } ], "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.js" - }, - "engines": { - "node": "^18 || >=20" + "dependencies": { + "micromark-util-symbol": "^1.0.0" } }, - "node_modules/native-fetch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/native-fetch/-/native-fetch-4.0.2.tgz", - "integrity": "sha512-4QcVlKFtv2EYVS5MBgsGX5+NWKtbDbIECdUXDBGDMAZXq3Jkv9zf+y8iS7Ub8fEdga3GpYeazp9gauNqXHJOCg==", + "node_modules/micromark-util-classify-character": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz", + "integrity": "sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", - "peerDependencies": { - "undici": "*" + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" } }, - "node_modules/next": { - "version": "15.3.5", - "resolved": "https://registry.npmjs.org/next/-/next-15.3.5.tgz", - "integrity": "sha512-RkazLBMMDJSJ4XZQ81kolSpwiCt907l0xcgcpF4xC2Vml6QVcPNXW0NQRwQ80FFtSn7UM52XN0anaw8TEJXaiw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@next/env": "15.3.5", - "@swc/counter": "0.1.3", - "@swc/helpers": "0.5.15", - "busboy": "1.6.0", - "caniuse-lite": "^1.0.30001579", - "postcss": "8.4.31", - "styled-jsx": "5.1.6" - }, - "bin": { - "next": "dist/bin/next" - }, - "engines": { - "node": "^18.18.0 || ^19.8.0 || >= 20.0.0" - }, - "optionalDependencies": { - "@next/swc-darwin-arm64": "15.3.5", - "@next/swc-darwin-x64": "15.3.5", - "@next/swc-linux-arm64-gnu": "15.3.5", - "@next/swc-linux-arm64-musl": "15.3.5", - "@next/swc-linux-x64-gnu": "15.3.5", - "@next/swc-linux-x64-musl": "15.3.5", - "@next/swc-win32-arm64-msvc": "15.3.5", - "@next/swc-win32-x64-msvc": "15.3.5", - "sharp": "^0.34.1" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.1.0", - "@playwright/test": "^1.41.2", - "babel-plugin-react-compiler": "*", - "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", - "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", - "sass": "^1.3.0" - }, - "peerDependenciesMeta": { - "@opentelemetry/api": { - "optional": true - }, - "@playwright/test": { - "optional": true - }, - "babel-plugin-react-compiler": { - "optional": true + "node_modules/micromark-util-combine-extensions": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz", + "integrity": "sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" }, - "sass": { - "optional": true + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" } - } - }, - "node_modules/next-themes": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.4.6.tgz", - "integrity": "sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==", + ], "license": "MIT", - "peerDependencies": { - "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-types": "^1.0.0" } }, - "node_modules/next/node_modules/@img/sharp-darwin-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", - "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz", + "integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } ], - "peer": true, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.2.4" + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^1.0.0" } }, - "node_modules/next/node_modules/@img/sharp-darwin-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", - "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" + "node_modules/micromark-util-decode-string": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz", + "integrity": "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } ], - "peer": true, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.2.4" + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-symbol": "^1.0.0" } }, - "node_modules/next/node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", - "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" + "node_modules/micromark-util-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz", + "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } ], - "peer": true, - "funding": { - "url": "https://opencollective.com/libvips" - } + "license": "MIT" }, - "node_modules/next/node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", - "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", - "cpu": [ - "x64" + "node_modules/micromark-util-html-tag-name": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz", + "integrity": "sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz", + "integrity": "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } ], - "peer": true, - "funding": { - "url": "https://opencollective.com/libvips" + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^1.0.0" } }, - "node_modules/next/node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", - "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", - "cpu": [ - "arm" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" + "node_modules/micromark-util-resolve-all": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz", + "integrity": "sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } ], - "peer": true, - "funding": { - "url": "https://opencollective.com/libvips" + "license": "MIT", + "dependencies": { + "micromark-util-types": "^1.0.0" } }, - "node_modules/next/node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", - "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" + "node_modules/micromark-util-sanitize-uri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz", + "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } ], - "peer": true, - "funding": { - "url": "https://opencollective.com/libvips" + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-symbol": "^1.0.0" } }, - "node_modules/next/node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", - "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", - "cpu": [ - "s390x" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" + "node_modules/micromark-util-subtokenize": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz", + "integrity": "sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } ], - "peer": true, - "funding": { - "url": "https://opencollective.com/libvips" + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" } }, - "node_modules/next/node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", - "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", - "cpu": [ - "x64" + "node_modules/micromark-util-symbol": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", + "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } ], - "peer": true, - "funding": { - "url": "https://opencollective.com/libvips" + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" } }, - "node_modules/next/node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", - "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "funding": { - "url": "https://opencollective.com/libvips" + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" } }, - "node_modules/next/node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", - "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "funding": { - "url": "https://opencollective.com/libvips" + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" } }, - "node_modules/next/node_modules/@img/sharp-linux-arm": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", - "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", - "cpu": [ - "arm" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "peer": true, + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "license": "MIT", "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=12" }, "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.2.4" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/next/node_modules/@img/sharp-linux-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", - "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "peer": true, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "license": "MIT", "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=4" + } + }, + "node_modules/miniflare": { + "version": "4.20260116.0", + "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-4.20260116.0.tgz", + "integrity": "sha512-fCU1thOdiKfcauYp/gAchhesOTqTPy3K7xY6g72RiJ2xkna18QJ3Mh5sgDmnqlOEqSW9vpmYeK8vd/aqkrtlUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "0.8.1", + "sharp": "^0.34.5", + "undici": "7.18.2", + "workerd": "1.20260116.0", + "ws": "8.18.0", + "youch": "4.1.0-beta.10", + "zod": "^3.25.76" }, - "funding": { - "url": "https://opencollective.com/libvips" + "bin": { + "miniflare": "bootstrap.js" }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.2.4" + "engines": { + "node": ">=18.0.0" } }, - "node_modules/next/node_modules/@img/sharp-linux-s390x": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", - "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", - "cpu": [ - "s390x" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "peer": true, + "node_modules/miniflare/node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "dev": true, + "license": "MIT", "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=10.0.0" }, - "funding": { - "url": "https://opencollective.com/libvips" + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" }, - "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.2.4" + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, - "node_modules/next/node_modules/@img/sharp-linux-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", - "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, + "node_modules/miniflare/node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "dev": true, + "license": "MIT", "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.2.4" + "url": "https://github.com/sponsors/colinhacks" } }, - "node_modules/next/node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", - "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "peer": true, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "license": "ISC" + }, + "node_modules/minimatch": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": "20 || >=22" }, "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/next/node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", - "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "peer": true, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.2.4" + "node": ">=16 || 14 >=14.17" } }, - "node_modules/next/node_modules/@img/sharp-wasm32": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", - "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", - "cpu": [ - "wasm32" + "node_modules/mipd": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mipd/-/mipd-0.0.7.tgz", + "integrity": "sha512-aAPZPNDQ3uMTdKbuO2YmAw2TxLHO0moa4YKAyETM/DTj5FloZo+a+8tU+iv4GmW+sOxKLSRwcSFuczk+Cpt6fg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wagmi-dev" + } ], - "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", - "optional": true, - "peer": true, - "dependencies": { - "@emnapi/runtime": "^1.7.0" + "license": "MIT", + "peerDependencies": { + "typescript": ">=5.0.4" }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "license": "MIT" + }, + "node_modules/mixpanel-browser": { + "version": "2.56.0", + "resolved": "https://registry.npmjs.org/mixpanel-browser/-/mixpanel-browser-2.56.0.tgz", + "integrity": "sha512-GYeEz58pV2M9MZtK8vSPL4oJmCwGS08FDDRZvZwr5VJpWdT4Lgyg6zXhmNfCmSTEIw2coaarm7HZ4FL9dAVvnA==", + "license": "Apache-2.0", + "dependencies": { + "rrweb": "2.0.0-alpha.13" + } + }, + "node_modules/modern-ahocorasick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/modern-ahocorasick/-/modern-ahocorasick-1.1.0.tgz", + "integrity": "sha512-sEKPVl2rM+MNVkGQt3ChdmD8YsigmXdn5NifZn6jiwn9LRJpWm8F3guhaqrJT/JOat6pwpbXEk6kv+b9DMIjsQ==", + "license": "MIT" + }, + "node_modules/moo": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.2.tgz", + "integrity": "sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==", + "license": "BSD-3-Clause" + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "license": "MIT", "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" + "node": ">=4" } }, - "node_modules/next/node_modules/@img/sharp-win32-ia32": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", - "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", - "cpu": [ - "ia32" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/next": { + "version": "15.3.5", + "resolved": "https://registry.npmjs.org/next/-/next-15.3.5.tgz", + "integrity": "sha512-RkazLBMMDJSJ4XZQ81kolSpwiCt907l0xcgcpF4xC2Vml6QVcPNXW0NQRwQ80FFtSn7UM52XN0anaw8TEJXaiw==", + "license": "MIT", "peer": true, + "dependencies": { + "@next/env": "15.3.5", + "@swc/counter": "0.1.3", + "@swc/helpers": "0.5.15", + "busboy": "1.6.0", + "caniuse-lite": "^1.0.30001579", + "postcss": "8.4.31", + "styled-jsx": "5.1.6" + }, + "bin": { + "next": "dist/bin/next" + }, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": "^18.18.0 || ^19.8.0 || >= 20.0.0" }, - "funding": { - "url": "https://opencollective.com/libvips" + "optionalDependencies": { + "@next/swc-darwin-arm64": "15.3.5", + "@next/swc-darwin-x64": "15.3.5", + "@next/swc-linux-arm64-gnu": "15.3.5", + "@next/swc-linux-arm64-musl": "15.3.5", + "@next/swc-linux-x64-gnu": "15.3.5", + "@next/swc-linux-x64-musl": "15.3.5", + "@next/swc-win32-arm64-msvc": "15.3.5", + "@next/swc-win32-x64-msvc": "15.3.5", + "sharp": "^0.34.1" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.41.2", + "babel-plugin-react-compiler": "*", + "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@playwright/test": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + }, + "sass": { + "optional": true + } } }, - "node_modules/next/node_modules/@img/sharp-win32-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", - "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" + "node_modules/next-themes": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.4.6.tgz", + "integrity": "sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" } }, "node_modules/next/node_modules/nanoid": { @@ -21325,66 +19275,6 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/next/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "license": "ISC", - "optional": true, - "peer": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/next/node_modules/sharp": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", - "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", - "hasInstallScript": true, - "license": "Apache-2.0", - "optional": true, - "peer": true, - "dependencies": { - "@img/colour": "^1.0.0", - "detect-libc": "^2.1.2", - "semver": "^7.7.3" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.34.5", - "@img/sharp-darwin-x64": "0.34.5", - "@img/sharp-libvips-darwin-arm64": "1.2.4", - "@img/sharp-libvips-darwin-x64": "1.2.4", - "@img/sharp-libvips-linux-arm": "1.2.4", - "@img/sharp-libvips-linux-arm64": "1.2.4", - "@img/sharp-libvips-linux-ppc64": "1.2.4", - "@img/sharp-libvips-linux-riscv64": "1.2.4", - "@img/sharp-libvips-linux-s390x": "1.2.4", - "@img/sharp-libvips-linux-x64": "1.2.4", - "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", - "@img/sharp-libvips-linuxmusl-x64": "1.2.4", - "@img/sharp-linux-arm": "0.34.5", - "@img/sharp-linux-arm64": "0.34.5", - "@img/sharp-linux-ppc64": "0.34.5", - "@img/sharp-linux-riscv64": "0.34.5", - "@img/sharp-linux-s390x": "0.34.5", - "@img/sharp-linux-x64": "0.34.5", - "@img/sharp-linuxmusl-arm64": "0.34.5", - "@img/sharp-linuxmusl-x64": "0.34.5", - "@img/sharp-wasm32": "0.34.5", - "@img/sharp-win32-arm64": "0.34.5", - "@img/sharp-win32-ia32": "0.34.5", - "@img/sharp-win32-x64": "0.34.5" - } - }, "node_modules/node-addon-api": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", @@ -21429,15 +19319,15 @@ } }, "node_modules/node-mock-http": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/node-mock-http/-/node-mock-http-1.0.3.tgz", - "integrity": "sha512-jN8dK25fsfnMrVsEhluUTPkBFY+6ybu7jSB1n+ri/vOGjJxU8J9CZhpSGkHXSkFjtUhbmoncG/YG9ta5Ludqog==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/node-mock-http/-/node-mock-http-1.0.4.tgz", + "integrity": "sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==", "license": "MIT" }, "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", "license": "MIT" }, "node_modules/normalize-path": { @@ -21449,16 +19339,6 @@ "node": ">=0.10.0" } }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/not": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/not/-/not-0.1.0.tgz", @@ -21631,15 +19511,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/observable-fns": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/observable-fns/-/observable-fns-0.6.1.tgz", + "integrity": "sha512-9gRK4+sRWzeN6AOewNBTLXir7Zl/i3GB6Yl26gK4flxz8BXVpD3kt8amREmWNb0mxYOGDotvE5a4N+PtGGKdkg==", + "dev": true, + "license": "MIT" + }, "node_modules/ofetch": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.4.1.tgz", - "integrity": "sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.5.1.tgz", + "integrity": "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==", "license": "MIT", "dependencies": { - "destr": "^2.0.3", - "node-fetch-native": "^1.6.4", - "ufo": "^1.5.4" + "destr": "^2.0.5", + "node-fetch-native": "^1.6.7", + "ufo": "^1.6.1" } }, "node_modules/on-exit-leak-free": { @@ -21730,20 +19617,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/ox": { - "version": "0.9.6", - "resolved": "https://registry.npmjs.org/ox/-/ox-0.9.6.tgz", - "integrity": "sha512-8SuCbHPvv2eZLYXrNmC0EC12rdzXQLdhnOMlHDW2wiCPLxBrOOJwX5L5E61by+UjTPOryqQiRSnjIKCI+GykKg==", + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/ox/-/ox-0.11.3.tgz", + "integrity": "sha512-1bWYGk/xZel3xro3l8WGg6eq4YEKlaqvyMtVhfMFpbJzK2F6rj4EDRtqDCWVEJMkzcmEi9uW2QxsqELokOlarw==", "funding": [ { "type": "github", @@ -21758,7 +19635,7 @@ "@noble/hashes": "^1.8.0", "@scure/bip32": "^1.7.0", "@scure/bip39": "^1.6.0", - "abitype": "^1.0.9", + "abitype": "^1.2.3", "eventemitter3": "5.0.1" }, "peerDependencies": { @@ -21770,37 +19647,6 @@ } } }, - "node_modules/p-defer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-4.0.1.tgz", - "integrity": "sha512-Mr5KC5efvAK5VUptYEIopP1bakB85k2IWXaRC0rsh1uwn1L6M0LVml8OIQ4Gudg4oyZakf7FmeRLkMMtZW1i5A==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-fifo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-fifo/-/p-fifo-1.0.0.tgz", - "integrity": "sha512-IjoCxXW48tqdtDFz6fqo5q1UfFVjjVZe8TC1QRflvNUJtNfCUhxOUw6MOVZhDPjqhSzc26xKdugsO17gmzd5+A==", - "license": "MIT", - "dependencies": { - "fast-fifo": "^1.0.0", - "p-defer": "^3.0.0" - } - }, - "node_modules/p-fifo/node_modules/p-defer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-3.0.0.tgz", - "integrity": "sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -21816,23 +19662,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/p-map": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz", - "integrity": "sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz", + "integrity": "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==", "dev": true, "license": "MIT", "engines": { @@ -21842,34 +19675,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-queue": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-8.1.0.tgz", - "integrity": "sha512-mxLDbbGIBEXTJL0zEx8JIylaj3xQ7Z/7eEVjcF9fJX4DBiH9oqe+oahYnlKKxm0Ci9TlWTyhSHgygxMxjIB2jw==", - "license": "MIT", - "dependencies": { - "eventemitter3": "^5.0.1", - "p-timeout": "^6.1.2" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-timeout": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.4.tgz", - "integrity": "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==", - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -21897,12 +19702,6 @@ "node": ">=6" } }, - "node_modules/parse-duration": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/parse-duration/-/parse-duration-2.1.4.tgz", - "integrity": "sha512-b98m6MsCh+akxfyoz9w9dt0AlH2dfYLOBss5SdDsr9pkhKNvkWBXU/r8A4ahmIGByBOLV2+4YwfCuFxbDDaGyg==", - "license": "MIT" - }, "node_modules/parse-entities": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", @@ -21952,26 +19751,6 @@ "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", "license": "MIT" }, - "node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -22025,13 +19804,6 @@ "node": ">=8" } }, - "node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", - "dev": true, - "license": "MIT" - }, "node_modules/pathval": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", @@ -22115,27 +19887,14 @@ "node": ">= 6" } }, - "node_modules/pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/playwright": { - "version": "1.51.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.51.1.tgz", - "integrity": "sha512-kkx+MB2KQRkyxjYPc3a0wLZZoDczmppyGJIvQ43l+aZihkaVvmu/21kiyaHeHjiFxjxNNFnUncKmcGIyOojsaw==", + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.57.0.tgz", + "integrity": "sha512-ilYQj1s8sr2ppEJ2YVadYBN0Mb3mdo9J0wQ+UuDhzYqURwSoW4n1Xs5vs7ORwgDGmyEh33tRMeS8KhdkMoLXQw==", "devOptional": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.51.1" + "playwright-core": "1.57.0" }, "bin": { "playwright": "cli.js" @@ -22148,9 +19907,9 @@ } }, "node_modules/playwright-core": { - "version": "1.51.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.51.1.tgz", - "integrity": "sha512-/crRMj8+j/Nq5s8QcvegseuyeZPxpQCZb6HNk3Sos3BlZyAknRjoyJPFWkpNn8v0+P3WiwqFF8P+zQo4eqiNuw==", + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.57.0.tgz", + "integrity": "sha512-agTcKlMw/mjBWOnD6kFZttAAGHgi/Nw0CZ2o6JqWSbMlI219lAFLZZCyqByTsvVAJq5XA5H8cA6PrvBRpBWEuQ==", "devOptional": true, "license": "Apache-2.0", "bin": { @@ -22167,85 +19926,37 @@ "dev": true, "hasInstallScript": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/pngjs": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz", - "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==", - "license": "MIT", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/pofile": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/pofile/-/pofile-1.1.4.tgz", - "integrity": "sha512-r6Q21sKsY1AjTVVjOuU02VYKVNQGJNQHjTIvs4dEbeuuYfxgYk/DGD2mqqq4RDaVkwdSq0VEtmQUOPe/wH8X3g==", - "dev": true, - "license": "MIT" - }, - "node_modules/pony-cause": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/pony-cause/-/pony-cause-2.1.11.tgz", - "integrity": "sha512-M7LhCsdNbNgiLYiP4WjsfLUuFmCfnjdF6jKe2R9NKl4WFN+HZPGHJZ9lnLP7f9ZnKe3U9nuWD0szirmj+migUg==", - "license": "0BSD", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/porto": { - "version": "0.2.19", - "resolved": "https://registry.npmjs.org/porto/-/porto-0.2.19.tgz", - "integrity": "sha512-q1vEJgdtlEOf6byWgD31GHiMwpfLuxFSfx9f7Sw4RGdvpQs2ANBGfnzzardADZegr87ZXsebSp+3vaaznEUzPQ==", - "license": "MIT", - "dependencies": { - "hono": "^4.9.6", - "idb-keyval": "^6.2.1", - "mipd": "^0.0.7", - "ox": "^0.9.6", - "zod": "^4.1.5", - "zustand": "^5.0.1" - }, - "bin": { - "porto": "_dist/cli/bin/index.js" - }, - "peerDependencies": { - "@tanstack/react-query": ">=5.59.0", - "@wagmi/core": ">=2.16.3", - "react": ">=18", - "typescript": ">=5.4.0", - "viem": ">=2.37.0", - "wagmi": ">=2.0.0" - }, - "peerDependenciesMeta": { - "@tanstack/react-query": { - "optional": true - }, - "react": { - "optional": true - }, - "typescript": { - "optional": true - }, - "wagmi": { - "optional": true - } + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/porto/node_modules/zod": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.11.tgz", - "integrity": "sha512-WPsqwxITS2tzx1bzhIKsEs19ABD5vmCVa4xBo2tq/SrV4RNZtfws1EnCWQXM6yh8bD08a1idvkB5MZSBiZsjwg==", + "node_modules/pngjs": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz", + "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==", "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/pofile": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/pofile/-/pofile-1.1.4.tgz", + "integrity": "sha512-r6Q21sKsY1AjTVVjOuU02VYKVNQGJNQHjTIvs4dEbeuuYfxgYk/DGD2mqqq4RDaVkwdSq0VEtmQUOPe/wH8X3g==", + "dev": true, + "license": "MIT" + }, + "node_modules/pony-cause": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/pony-cause/-/pony-cause-2.1.11.tgz", + "integrity": "sha512-M7LhCsdNbNgiLYiP4WjsfLUuFmCfnjdF6jKe2R9NKl4WFN+HZPGHJZ9lnLP7f9ZnKe3U9nuWD0szirmj+migUg==", + "license": "0BSD", + "engines": { + "node": ">=12.0.0" } }, "node_modules/possible-typed-array-names": { @@ -22258,9 +19969,9 @@ } }, "node_modules/postcss": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", - "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", "funding": [ { "type": "opencollective", @@ -22277,7 +19988,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.8", + "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -22500,12 +20211,6 @@ "node": ">=0.4.0" } }, - "node_modules/progress-events": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/progress-events/-/progress-events-1.0.1.tgz", - "integrity": "sha512-MOzLIwhpt64KIVN64h1MwdKWiyKFNc/S6BoYKPIVUHFg0/eIEyBulhWCgn678v/4c0ri3FdGuzXymNCv02MUIw==", - "license": "Apache-2.0 OR MIT" - }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -22527,17 +20232,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/protons-runtime": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/protons-runtime/-/protons-runtime-5.5.0.tgz", - "integrity": "sha512-EsALjF9QsrEk6gbCx3lmfHxVN0ah7nG3cY7GySD4xf4g8cr7g543zB88Foh897Sr1RQJ9yDCUsoT1i1H/cVUFA==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "uint8-varint": "^2.0.2", - "uint8arraylist": "^2.4.3", - "uint8arrays": "^5.0.1" - } - }, "node_modules/proxy-compare": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/proxy-compare/-/proxy-compare-2.6.0.tgz", @@ -22587,15 +20281,12 @@ } }, "node_modules/qr": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/qr/-/qr-0.5.0.tgz", - "integrity": "sha512-LtnyJsepKCMzfmHBZKVNo1g29kS+8ZbuxE9294EsRhHgVVpy4x8eFw9o4J9SIolDHoDYuaEIY+z8UjiCv/eudA==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/qr/-/qr-0.5.4.tgz", + "integrity": "sha512-gjVMHOt7CX+BQd7JLQ9fnS4kJK4Lj4u+Conq52tcCbW7YH3mATTtBbTMA+7cQ1rKOkDo61olFHJReawe+XFxIA==", "license": "(MIT OR Apache-2.0)", "engines": { "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" } }, "node_modules/qrcode": { @@ -22674,13 +20365,6 @@ "integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==", "license": "MIT" }, - "node_modules/ramda": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.2.tgz", - "integrity": "sha512-SbiLPU40JuJniHexQSAgad32hfwd+DRUdwF2PlVuI5RZD0/vahUco7R8vD86J/tcEKKF9vZrUVwgtmGCqlCKyA==", - "dev": true, - "license": "MIT" - }, "node_modules/react": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", @@ -22741,16 +20425,6 @@ "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==", "license": "MIT" }, - "node_modules/react-ga": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/react-ga/-/react-ga-3.3.1.tgz", - "integrity": "sha512-4Vc0W5EvXAXUN/wWyxvsAKDLLgtJ3oLmhYYssx+YzphJpejtOst6cbIHCIyF50Fdxuf5DDKqRYny24yJ2y7GFQ==", - "license": "Apache-2.0", - "peerDependencies": { - "prop-types": "^15.6.0", - "react": "^15.6.2 || ^16.0 || ^17 || ^18" - } - }, "node_modules/react-helmet-async": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-2.0.5.tgz", @@ -22766,9 +20440,9 @@ } }, "node_modules/react-hook-form": { - "version": "7.55.0", - "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.55.0.tgz", - "integrity": "sha512-XRnjsH3GVMQz1moZTW53MxfoWN7aDpUg/GpVNc4A3eXRVNdGXfbzJ4vM4aLQ8g6XCUh1nIbx70aaNCl7kxnjog==", + "version": "7.71.1", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.71.1.tgz", + "integrity": "sha512-9SUJKCGKo8HUSsCO+y0CtqkqI5nNuaDqTxyqPsZPqIwudpj4rCrAz/jZV+jn57bx5gtZKOh3neQu94DXMc+w5w==", "license": "MIT", "engines": { "node": ">=18.0.0" @@ -22781,23 +20455,6 @@ "react": "^16.8.0 || ^17 || ^18 || ^19" } }, - "node_modules/react-hot-toast": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/react-hot-toast/-/react-hot-toast-2.5.2.tgz", - "integrity": "sha512-Tun3BbCxzmXXM7C+NI4qiv6lT0uwGh4oAfeJyNOjYUejTsm35mK9iCaYLGv8cBz9L5YxZLx/2ii7zsIwPtPUdw==", - "license": "MIT", - "dependencies": { - "csstype": "^3.1.3", - "goober": "^2.1.16" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "react": ">=16", - "react-dom": ">=16" - } - }, "node_modules/react-intersection-observer": { "version": "9.16.0", "resolved": "https://registry.npmjs.org/react-intersection-observer/-/react-intersection-observer-9.16.0.tgz", @@ -22831,12 +20488,6 @@ "react": "^16.13.1 || ^17.0.0 || ^18.0.0" } }, - "node_modules/react-lazy-with-preload": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/react-lazy-with-preload/-/react-lazy-with-preload-2.2.1.tgz", - "integrity": "sha512-ONSb8gizLE5jFpdHAclZ6EAAKuFX2JydnFXPPPjoUImZlLjGtKzyBS8SJgJq7CpLgsGKh9QCZdugJyEEOVC16Q==", - "license": "MIT" - }, "node_modules/react-loading-skeleton": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/react-loading-skeleton/-/react-loading-skeleton-3.5.0.tgz", @@ -22883,43 +20534,10 @@ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "license": "MIT" }, - "node_modules/react-native-fetch-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/react-native-fetch-api/-/react-native-fetch-api-3.0.0.tgz", - "integrity": "sha512-g2rtqPjdroaboDKTsJCTlcmtw54E25OjyaunUP0anOZn4Fuo2IKs8BVfe02zVggA/UysbmfSnRJIqtNkAgggNA==", - "license": "MIT", - "dependencies": { - "p-defer": "^3.0.0" - } - }, - "node_modules/react-native-fetch-api/node_modules/p-defer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-3.0.0.tgz", - "integrity": "sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/react-popper": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-2.3.0.tgz", - "integrity": "sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q==", - "license": "MIT", - "dependencies": { - "react-fast-compare": "^3.0.1", - "warning": "^4.0.2" - }, - "peerDependencies": { - "@popperjs/core": "^2.0.0", - "react": "^16.8.0 || ^17 || ^18", - "react-dom": "^16.8.0 || ^17 || ^18" - } - }, "node_modules/react-refresh": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", - "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.18.0.tgz", + "integrity": "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==", "dev": true, "license": "MIT", "engines": { @@ -23014,9 +20632,9 @@ } }, "node_modules/react-select": { - "version": "5.10.1", - "resolved": "https://registry.npmjs.org/react-select/-/react-select-5.10.1.tgz", - "integrity": "sha512-roPEZUL4aRZDx6DcsD+ZNreVl+fM8VsKn0Wtex1v4IazH60ILp5xhdlp464IsEAlJdXeD+BhDAFsBVMfvLQueA==", + "version": "5.10.2", + "resolved": "https://registry.npmjs.org/react-select/-/react-select-5.10.2.tgz", + "integrity": "sha512-Z33nHdEFWq9tfnfVXaiM12rbJmk+QjFEztWLtmXqQhz6Al4UZZ9xc0wiatmGtUOCCnHN0WizL3tCMYRENX4rVQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.0", @@ -23558,6 +21176,16 @@ "node": ">=0.10.0" } }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", @@ -23651,13 +21279,13 @@ } }, "node_modules/rollup": { - "version": "4.38.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.38.0.tgz", - "integrity": "sha512-5SsIRtJy9bf1ErAOiFMFzl64Ex9X5V7bnJ+WlFMb+zmP459OSWCEG7b0ERZ+PEU7xPt4OG3RHbrp1LJlXxYTrw==", + "version": "4.55.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.55.3.tgz", + "integrity": "sha512-y9yUpfQvetAjiDLtNMf1hL9NXchIJgWt6zIKeoB+tCd3npX08Eqfzg60V9DhIGVMtQ0AlMkFw5xa+AQ37zxnAA==", "dev": true, "license": "MIT", "dependencies": { - "@types/estree": "1.0.7" + "@types/estree": "1.0.8" }, "bin": { "rollup": "dist/bin/rollup" @@ -23667,26 +21295,31 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.38.0", - "@rollup/rollup-android-arm64": "4.38.0", - "@rollup/rollup-darwin-arm64": "4.38.0", - "@rollup/rollup-darwin-x64": "4.38.0", - "@rollup/rollup-freebsd-arm64": "4.38.0", - "@rollup/rollup-freebsd-x64": "4.38.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.38.0", - "@rollup/rollup-linux-arm-musleabihf": "4.38.0", - "@rollup/rollup-linux-arm64-gnu": "4.38.0", - "@rollup/rollup-linux-arm64-musl": "4.38.0", - "@rollup/rollup-linux-loongarch64-gnu": "4.38.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.38.0", - "@rollup/rollup-linux-riscv64-gnu": "4.38.0", - "@rollup/rollup-linux-riscv64-musl": "4.38.0", - "@rollup/rollup-linux-s390x-gnu": "4.38.0", - "@rollup/rollup-linux-x64-gnu": "4.38.0", - "@rollup/rollup-linux-x64-musl": "4.38.0", - "@rollup/rollup-win32-arm64-msvc": "4.38.0", - "@rollup/rollup-win32-ia32-msvc": "4.38.0", - "@rollup/rollup-win32-x64-msvc": "4.38.0", + "@rollup/rollup-android-arm-eabi": "4.55.3", + "@rollup/rollup-android-arm64": "4.55.3", + "@rollup/rollup-darwin-arm64": "4.55.3", + "@rollup/rollup-darwin-x64": "4.55.3", + "@rollup/rollup-freebsd-arm64": "4.55.3", + "@rollup/rollup-freebsd-x64": "4.55.3", + "@rollup/rollup-linux-arm-gnueabihf": "4.55.3", + "@rollup/rollup-linux-arm-musleabihf": "4.55.3", + "@rollup/rollup-linux-arm64-gnu": "4.55.3", + "@rollup/rollup-linux-arm64-musl": "4.55.3", + "@rollup/rollup-linux-loong64-gnu": "4.55.3", + "@rollup/rollup-linux-loong64-musl": "4.55.3", + "@rollup/rollup-linux-ppc64-gnu": "4.55.3", + "@rollup/rollup-linux-ppc64-musl": "4.55.3", + "@rollup/rollup-linux-riscv64-gnu": "4.55.3", + "@rollup/rollup-linux-riscv64-musl": "4.55.3", + "@rollup/rollup-linux-s390x-gnu": "4.55.3", + "@rollup/rollup-linux-x64-gnu": "4.55.3", + "@rollup/rollup-linux-x64-musl": "4.55.3", + "@rollup/rollup-openbsd-x64": "4.55.3", + "@rollup/rollup-openharmony-arm64": "4.55.3", + "@rollup/rollup-win32-arm64-msvc": "4.55.3", + "@rollup/rollup-win32-ia32-msvc": "4.55.3", + "@rollup/rollup-win32-x64-gnu": "4.55.3", + "@rollup/rollup-win32-x64-msvc": "4.55.3", "fsevents": "~2.3.2" } }, @@ -23816,6 +21449,38 @@ "node": ">=12" } }, + "node_modules/rpc-websockets": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/rpc-websockets/-/rpc-websockets-9.3.2.tgz", + "integrity": "sha512-VuW2xJDnl1k8n8kjbdRSWawPRkwaVqUQNjE1TdeTawf0y0abGhtVJFTXCLfgpgGDBkO/Fj6kny8Dc/nvOW78MA==", + "license": "LGPL-3.0-only", + "dependencies": { + "@swc/helpers": "^0.5.11", + "@types/uuid": "^8.3.4", + "@types/ws": "^8.2.2", + "buffer": "^6.0.3", + "eventemitter3": "^5.0.1", + "uuid": "^8.3.2", + "ws": "^8.5.0" + }, + "funding": { + "type": "paypal", + "url": "https://paypal.me/kozjak" + }, + "optionalDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + } + }, + "node_modules/rpc-websockets/node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/rrdom": { "version": "2.0.0-alpha.18", "resolved": "https://registry.npmjs.org/rrdom/-/rrdom-2.0.0-alpha.18.tgz", @@ -23850,16 +21515,6 @@ "postcss": "^8.4.38" } }, - "node_modules/run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -23883,26 +21538,6 @@ "queue-microtask": "^1.2.2" } }, - "node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/rxjs/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true, - "license": "0BSD" - }, "node_modules/sade": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", @@ -23971,7 +21606,22 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } }, "node_modules/scheduler": { "version": "0.23.2", @@ -24086,16 +21736,16 @@ "license": "MIT" }, "node_modules/sharp": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz", - "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", - "dev": true, + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", + "devOptional": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "color": "^4.2.3", - "detect-libc": "^2.0.3", - "semver": "^7.6.3" + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" }, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" @@ -24104,32 +21754,37 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.33.5", - "@img/sharp-darwin-x64": "0.33.5", - "@img/sharp-libvips-darwin-arm64": "1.0.4", - "@img/sharp-libvips-darwin-x64": "1.0.4", - "@img/sharp-libvips-linux-arm": "1.0.5", - "@img/sharp-libvips-linux-arm64": "1.0.4", - "@img/sharp-libvips-linux-s390x": "1.0.4", - "@img/sharp-libvips-linux-x64": "1.0.4", - "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", - "@img/sharp-libvips-linuxmusl-x64": "1.0.4", - "@img/sharp-linux-arm": "0.33.5", - "@img/sharp-linux-arm64": "0.33.5", - "@img/sharp-linux-s390x": "0.33.5", - "@img/sharp-linux-x64": "0.33.5", - "@img/sharp-linuxmusl-arm64": "0.33.5", - "@img/sharp-linuxmusl-x64": "0.33.5", - "@img/sharp-wasm32": "0.33.5", - "@img/sharp-win32-ia32": "0.33.5", - "@img/sharp-win32-x64": "0.33.5" + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" } }, "node_modules/sharp/node_modules/semver": { "version": "7.7.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "dev": true, + "devOptional": true, "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -24248,23 +21903,6 @@ "dev": true, "license": "ISC" }, - "node_modules/simple-swizzle": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.4.tgz", - "integrity": "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, - "node_modules/simple-swizzle/node_modules/is-arrayish": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.4.tgz", - "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==", - "dev": true, - "license": "MIT" - }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -24276,13 +21914,13 @@ } }, "node_modules/socket.io-client": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.8.1.tgz", - "integrity": "sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ==", + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.8.3.tgz", + "integrity": "sha512-uP0bpjWrjQmUt5DTHq9RuoCBdFJF10cdX9X+a368j/Ft0wmaVgxlrjvK3kjvgCODOMMOz9lcaRzxmso0bTWZ/g==", "license": "MIT", "dependencies": { "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.2", + "debug": "~4.4.1", "engine.io-client": "~6.6.1", "socket.io-parser": "~4.2.4" }, @@ -24290,53 +21928,19 @@ "node": ">=10.0.0" } }, - "node_modules/socket.io-client/node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, "node_modules/socket.io-parser": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", - "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.5.tgz", + "integrity": "sha512-bPMmpy/5WWKHea5Y/jYAP6k74A+hvmRCQaJuJB6I/ML5JZq/KfNieUVo/3Mh7SAqn7TyFdIo6wqYHInG1MU1bQ==", "license": "MIT", "dependencies": { "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1" + "debug": "~4.4.1" }, "engines": { "node": ">=10.0.0" } }, - "node_modules/socket.io-parser/node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, "node_modules/solid-js": { "version": "1.9.5", "resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.9.5.tgz", @@ -24463,15 +22067,19 @@ "node": ">= 0.4" } }, - "node_modules/stoppable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz", - "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4", - "npm": ">=6" + "node_modules/stream-chain": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/stream-chain/-/stream-chain-2.2.5.tgz", + "integrity": "sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==", + "license": "BSD-3-Clause" + }, + "node_modules/stream-json": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/stream-json/-/stream-json-1.9.1.tgz", + "integrity": "sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==", + "license": "BSD-3-Clause", + "dependencies": { + "stream-chain": "^2.2.5" } }, "node_modules/stream-shift": { @@ -24480,15 +22088,6 @@ "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", "license": "MIT" }, - "node_modules/stream-to-it": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-to-it/-/stream-to-it-1.0.1.tgz", - "integrity": "sha512-AqHYAYPHcmvMrcLNgncE/q0Aj/ajP6A4qGhxP6EVn7K3YTNs0bJpJyk57wc2Heb7MUL64jurvmnmui8D9kjZgA==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "it-stream-types": "^2.0.1" - } - }, "node_modules/streamsearch": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", @@ -24643,27 +22242,6 @@ } } }, - "node_modules/styled-system": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/styled-system/-/styled-system-5.1.5.tgz", - "integrity": "sha512-7VoD0o2R3RKzOzPK0jYrVnS8iJdfkKsQJNiLRDjikOpQVqQHns/DXWaPZOH4tIKkhAT7I6wIsy9FWTWh2X3q+A==", - "license": "MIT", - "dependencies": { - "@styled-system/background": "^5.1.2", - "@styled-system/border": "^5.1.5", - "@styled-system/color": "^5.1.2", - "@styled-system/core": "^5.1.2", - "@styled-system/flexbox": "^5.1.2", - "@styled-system/grid": "^5.1.2", - "@styled-system/layout": "^5.1.2", - "@styled-system/position": "^5.1.2", - "@styled-system/shadow": "^5.1.2", - "@styled-system/space": "^5.1.2", - "@styled-system/typography": "^5.1.2", - "@styled-system/variant": "^5.1.5", - "object-assign": "^4.1.1" - } - }, "node_modules/stylis": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", @@ -24746,9 +22324,9 @@ } }, "node_modules/superstruct": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-1.0.4.tgz", - "integrity": "sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-2.0.2.tgz", + "integrity": "sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==", "license": "MIT", "engines": { "node": ">=14.0.0" @@ -24758,6 +22336,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "devOptional": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -24778,18 +22357,12 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/swr": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/swr/-/swr-2.3.3.tgz", - "integrity": "sha512-dshNvs3ExOqtZ6kJBaAsabhPdHyeY4P2cKwRCniDVifBMoG/SVI7tfLWqPXriVspf2Rg4tPzXJTnwaihIeFw2A==", - "license": "MIT", - "dependencies": { - "dequal": "^2.0.3", - "use-sync-external-store": "^1.4.0" - }, - "peerDependencies": { - "react": "^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true, + "license": "MIT" }, "node_modules/tailwind-merge": { "version": "2.6.0", @@ -24907,23 +22480,10 @@ "node": ">=8.10.0" } }, - "node_modules/theme-ui": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/theme-ui/-/theme-ui-0.17.1.tgz", - "integrity": "sha512-sw55duDM23Em+r67oaCJDxxVVGkyOA88Ja+Krc8BOVCxj70rfBVftc1aC4kbCuBWxgHD3eTjKQzoMUucWQuofw==", - "license": "MIT", - "dependencies": { - "@theme-ui/color-modes": "^0.17.1", - "@theme-ui/components": "^0.17.1", - "@theme-ui/core": "^0.17.1", - "@theme-ui/css": "^0.17.1", - "@theme-ui/global": "^0.17.1", - "@theme-ui/theme-provider": "^0.17.1" - }, - "peerDependencies": { - "@emotion/react": ">=11.1.1", - "react": ">=18" - } + "node_modules/text-encoding-utf-8": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz", + "integrity": "sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==" }, "node_modules/thenify": { "version": "3.3.1", @@ -24955,12 +22515,24 @@ "real-require": "^0.1.0" } }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "node_modules/threads": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/threads/-/threads-1.7.0.tgz", + "integrity": "sha512-Mx5NBSHX3sQYR6iI9VYbgHKBLisyB+xROCBGjjWm1O9wb9vfLxdaGtmT/KCjUqMsSNW6nERzCW3T6H43LqjDZQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "callsites": "^3.1.0", + "debug": "^4.2.0", + "is-observable": "^2.1.0", + "observable-fns": "^0.6.1" + }, + "funding": { + "url": "https://github.com/andywer/threads.js?sponsor=1" + }, + "optionalDependencies": { + "tiny-worker": ">= 2" + } }, "node_modules/tiny-invariant": { "version": "1.3.3", @@ -24968,6 +22540,17 @@ "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", "license": "MIT" }, + "node_modules/tiny-worker": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tiny-worker/-/tiny-worker-2.3.0.tgz", + "integrity": "sha512-pJ70wq5EAqTAEl9IkGzA+fN0836rycEuz2Cn6yeZ6FRzlVS5IDOkFHpIoEsksPRQV34GDqXm65+OlnZqUSyK2g==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "esm": "^3.2.25" + } + }, "node_modules/tinybench": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", @@ -24981,13 +22564,14 @@ "dev": true }, "node_modules/tinyglobby": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", - "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", "dev": true, + "license": "MIT", "dependencies": { - "fdir": "^6.4.4", - "picomatch": "^4.0.2" + "fdir": "^6.5.0", + "picomatch": "^4.0.3" }, "engines": { "node": ">=12.0.0" @@ -24997,10 +22581,14 @@ } }, "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.4.4", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", - "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, "peerDependencies": { "picomatch": "^3 || ^4" }, @@ -25011,10 +22599,11 @@ } }, "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -25049,19 +22638,26 @@ "node": ">=14.0.0" } }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "node_modules/tldts": { + "version": "7.0.19", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.19.tgz", + "integrity": "sha512-8PWx8tvC4jDB39BQw1m4x8y5MH1BcQ5xHeL2n7UVFulMPH/3Q0uiamahFJ3lXA0zO2SUyRXuVVbWSDmstlt9YA==", "dev": true, "license": "MIT", "dependencies": { - "os-tmpdir": "~1.0.2" + "tldts-core": "^7.0.19" }, - "engines": { - "node": ">=0.6.0" + "bin": { + "tldts": "bin/cli.js" } }, + "node_modules/tldts-core": { + "version": "7.0.19", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.19.tgz", + "integrity": "sha512-lJX2dEWx0SGH4O6p+7FPwYmJ/bu1JbcGJ8RLaG9b7liIgZ85itUVEPbMtWRVrde/0fnDPEPHW10ZsKW3kVsE9A==", + "dev": true, + "license": "MIT" + }, "node_modules/to-buffer": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.2.tgz", @@ -25088,6 +22684,19 @@ "node": ">=8.0" } }, + "node_modules/tough-cookie": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.0.tgz", + "integrity": "sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tldts": "^7.0.5" + }, + "engines": { + "node": ">=16" + } + }, "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", @@ -25153,19 +22762,6 @@ "integrity": "sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g==", "license": "ISC" }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/typed-array-buffer": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", @@ -25184,7 +22780,6 @@ "version": "5.6.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", - "devOptional": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -25221,39 +22816,11 @@ } }, "node_modules/ufo": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz", - "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz", + "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==", "license": "MIT" }, - "node_modules/uint8-varint": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.4.tgz", - "integrity": "sha512-FwpTa7ZGA/f/EssWAb5/YV6pHgVF1fViKdW8cWaEarjB8t7NyofSWBdOTyFPaGuUG4gx3v1O3PQ8etsiOs3lcw==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "uint8arraylist": "^2.0.0", - "uint8arrays": "^5.0.0" - } - }, - "node_modules/uint8arraylist": { - "version": "2.4.8", - "resolved": "https://registry.npmjs.org/uint8arraylist/-/uint8arraylist-2.4.8.tgz", - "integrity": "sha512-vc1PlGOzglLF0eae1M8mLRTBivsvrGsdmJ5RbK3e+QRvRLOZfZhQROTwH/OfyF3+ZVUg9/8hE8bmKP2CvP9quQ==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "uint8arrays": "^5.0.1" - } - }, - "node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "multiformats": "^13.0.0" - } - }, "node_modules/uncrypto": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/uncrypto/-/uncrypto-0.1.3.tgz", @@ -25261,18 +22828,19 @@ "license": "MIT" }, "node_modules/undici": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.14.0.tgz", - "integrity": "sha512-Vqs8HTzjpQXZeXdpsfChQTlafcMQaaIwnGwLam1wudSSjlJeQ3bw1j+TLPePgrCnCpUXx7Ba5Pdpf5OBih62NQ==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.18.2.tgz", + "integrity": "sha512-y+8YjDFzWdQlSE9N5nzKMT3g4a5UBX1HKowfdXh0uvAnTaqqwqB92Jt4UXBAeKekDs5IaDKyJFR4X1gYVCgXcw==", + "dev": true, "license": "MIT", "engines": { "node": ">=20.18.1" } }, "node_modules/undici-types": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "license": "MIT" }, "node_modules/unenv": { @@ -25456,16 +23024,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/unplugin": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.0.1.tgz", @@ -25514,16 +23072,10 @@ "node": ">=8.10.0" } }, - "node_modules/unraw": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unraw/-/unraw-3.0.0.tgz", - "integrity": "sha512-08/DA66UF65OlpUDIQtbJyrqTR0jTAlJ+jsnkQ4jxR7+K5g5YG1APZKQSMCE1vqqmD+2pv6+IdEjmopFatacvg==", - "license": "MIT" - }, "node_modules/update-browserslist-db": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "funding": [ { "type": "opencollective", @@ -25608,12 +23160,12 @@ } }, "node_modules/use-sync-external-store": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz", - "integrity": "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", "license": "MIT", "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, "node_modules/utf-8-validate": { @@ -25701,15 +23253,6 @@ } } }, - "node_modules/valtio/node_modules/use-sync-external-store": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", - "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, "node_modules/vaul": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vaul/-/vaul-1.1.2.tgz", @@ -25790,9 +23333,9 @@ } }, "node_modules/viem": { - "version": "2.37.9", - "resolved": "https://registry.npmjs.org/viem/-/viem-2.37.9.tgz", - "integrity": "sha512-XXUOE5yJcjr9/M9kRoQcPMUfetwHprO9aTho6vNELjBKJIBx7rYq1fjvBw+xEnhsRjhh5lsORi6B0h8fYFB7NA==", + "version": "2.44.4", + "resolved": "https://registry.npmjs.org/viem/-/viem-2.44.4.tgz", + "integrity": "sha512-sJDLVl2EsS5Fo7GSWZME5CXEV7QRYkUJPeBw7ac+4XI3D4ydvMw/gjulTsT5pgqcpu70BploFnOAC6DLpan1Yg==", "funding": [ { "type": "github", @@ -25805,9 +23348,9 @@ "@noble/hashes": "1.8.0", "@scure/bip32": "1.7.0", "@scure/bip39": "1.6.0", - "abitype": "1.1.0", + "abitype": "1.2.3", "isows": "1.0.7", - "ox": "0.9.6", + "ox": "0.11.3", "ws": "8.18.3" }, "peerDependencies": { @@ -25820,21 +23363,24 @@ } }, "node_modules/vite": { - "version": "5.4.8", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.8.tgz", - "integrity": "sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", + "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", "dev": true, "license": "MIT", "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" + "esbuild": "^0.27.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": "^20.19.0 || >=22.12.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" @@ -25843,19 +23389,25 @@ "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" }, "peerDependenciesMeta": { "@types/node": { "optional": true }, + "jiti": { + "optional": true + }, "less": { "optional": true }, @@ -25876,6 +23428,12 @@ }, "terser": { "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true } } }, @@ -25930,30 +23488,135 @@ "url": "https://opencollective.com/vitest" } }, + "node_modules/vite-node/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, "node_modules/vite-node/node_modules/pathe": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", "dev": true }, + "node_modules/vite-node/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/vite-node/node_modules/vite": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz", + "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, "node_modules/vite-plugin-static-copy": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/vite-plugin-static-copy/-/vite-plugin-static-copy-2.3.0.tgz", - "integrity": "sha512-LLKwhhHetGaCnWz4mas4qqjjguDka6/6b4+SeIohRroj8aCE7QTfiZECfPecslFQkWZ3HdQuq5kOPmWZjNYlKA==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/vite-plugin-static-copy/-/vite-plugin-static-copy-3.1.5.tgz", + "integrity": "sha512-9pbZn9Vb+uUNg/Tr/f2MXmGvfSfLeWjscS4zTA3v+sWqKN+AjJ/ipTFwaqdopJkNkxG5DfgYrZXD80ljbNDxbg==", "dev": true, "license": "MIT", "dependencies": { - "chokidar": "^3.5.3", - "fast-glob": "^3.2.11", - "fs-extra": "^11.1.0", - "p-map": "^7.0.3", - "picocolors": "^1.0.0" + "chokidar": "^3.6.0", + "p-map": "^7.0.4", + "picocolors": "^1.1.1", + "tinyglobby": "^0.2.15" }, "engines": { "node": "^18.0.0 || >=20.0.0" }, "peerDependencies": { - "vite": "^5.0.0 || ^6.0.0" + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0" } }, "node_modules/vite-plugin-static-copy/node_modules/chokidar": { @@ -25995,15 +23658,16 @@ } }, "node_modules/vite-tsconfig-paths": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.3.2.tgz", - "integrity": "sha512-0Vd/a6po6Q+86rPlntHye7F31zA2URZMbH8M3saAZ/xR9QoGN/L21bxEGfXdWmFdNkqPpRdxFT7nmNe12e9/uA==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-6.0.4.tgz", + "integrity": "sha512-iIsEJ+ek5KqRTK17pmxtgIxXtqr3qDdE6OxrP9mVeGhVDNXRJTKN/l9oMbujTQNzMLe6XZ8qmpztfbkPu2TiFQ==", "dev": true, "license": "MIT", "dependencies": { "debug": "^4.1.1", "globrex": "^0.1.2", - "tsconfck": "^3.0.3" + "tsconfck": "^3.0.3", + "vite": "*" }, "peerDependencies": { "vite": "*" @@ -26015,9 +23679,9 @@ } }, "node_modules/vite/node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz", + "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", "cpu": [ "arm" ], @@ -26028,13 +23692,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/vite/node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", + "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", "cpu": [ "arm64" ], @@ -26045,13 +23709,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/vite/node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz", + "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", "cpu": [ "x64" ], @@ -26062,13 +23726,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/vite/node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", + "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", "cpu": [ "arm64" ], @@ -26079,13 +23743,13 @@ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/vite/node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", + "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", "cpu": [ "x64" ], @@ -26096,13 +23760,13 @@ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", + "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", "cpu": [ "arm64" ], @@ -26113,13 +23777,13 @@ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/vite/node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", + "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", "cpu": [ "x64" ], @@ -26130,13 +23794,13 @@ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/vite/node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", + "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", "cpu": [ "arm" ], @@ -26147,13 +23811,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/vite/node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", + "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", "cpu": [ "arm64" ], @@ -26164,13 +23828,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/vite/node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", + "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", "cpu": [ "ia32" ], @@ -26181,13 +23845,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", + "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", "cpu": [ "loong64" ], @@ -26198,15 +23862,66 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/vite/node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", + "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", + "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", + "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", + "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", "cpu": [ - "mips64el" + "s390x" ], "dev": true, "license": "MIT", @@ -26215,15 +23930,15 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, - "node_modules/vite/node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", + "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", "cpu": [ - "ppc64" + "x64" ], "dev": true, "license": "MIT", @@ -26232,64 +23947,64 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, - "node_modules/vite/node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "node_modules/vite/node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", + "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", "cpu": [ - "riscv64" + "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "linux" + "netbsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, - "node_modules/vite/node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", + "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", "cpu": [ - "s390x" + "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "linux" + "netbsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, - "node_modules/vite/node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "node_modules/vite/node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", + "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", "cpu": [ - "x64" + "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "linux" + "openbsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, - "node_modules/vite/node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", + "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", "cpu": [ "x64" ], @@ -26297,33 +24012,33 @@ "license": "MIT", "optional": true, "os": [ - "netbsd" + "openbsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, - "node_modules/vite/node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "node_modules/vite/node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", + "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", "cpu": [ - "x64" + "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "openbsd" + "openharmony" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/vite/node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", + "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", "cpu": [ "x64" ], @@ -26334,13 +24049,13 @@ "sunos" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/vite/node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", + "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", "cpu": [ "arm64" ], @@ -26351,13 +24066,13 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/vite/node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", + "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", "cpu": [ "ia32" ], @@ -26368,13 +24083,13 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/vite/node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", + "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", "cpu": [ "x64" ], @@ -26385,13 +24100,13 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/vite/node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", + "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -26399,32 +24114,66 @@ "esbuild": "bin/esbuild" }, "engines": { - "node": ">=12" + "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" + "@esbuild/aix-ppc64": "0.27.2", + "@esbuild/android-arm": "0.27.2", + "@esbuild/android-arm64": "0.27.2", + "@esbuild/android-x64": "0.27.2", + "@esbuild/darwin-arm64": "0.27.2", + "@esbuild/darwin-x64": "0.27.2", + "@esbuild/freebsd-arm64": "0.27.2", + "@esbuild/freebsd-x64": "0.27.2", + "@esbuild/linux-arm": "0.27.2", + "@esbuild/linux-arm64": "0.27.2", + "@esbuild/linux-ia32": "0.27.2", + "@esbuild/linux-loong64": "0.27.2", + "@esbuild/linux-mips64el": "0.27.2", + "@esbuild/linux-ppc64": "0.27.2", + "@esbuild/linux-riscv64": "0.27.2", + "@esbuild/linux-s390x": "0.27.2", + "@esbuild/linux-x64": "0.27.2", + "@esbuild/netbsd-arm64": "0.27.2", + "@esbuild/netbsd-x64": "0.27.2", + "@esbuild/openbsd-arm64": "0.27.2", + "@esbuild/openbsd-x64": "0.27.2", + "@esbuild/openharmony-arm64": "0.27.2", + "@esbuild/sunos-x64": "0.27.2", + "@esbuild/win32-arm64": "0.27.2", + "@esbuild/win32-ia32": "0.27.2", + "@esbuild/win32-x64": "0.27.2" + } + }, + "node_modules/vite/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/vitest": { @@ -26497,6 +24246,51 @@ } } }, + "node_modules/vitest/node_modules/@vitest/mocker": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.1.3.tgz", + "integrity": "sha512-PJbLjonJK82uCWHjzgBJZuR7zmAOrSvKk1QBxrennDIgtH4uK0TB1PvYmc0XBCigxxtiAVPfWtAdy4lpz8SQGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "3.1.3", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.17" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^5.0.0 || ^6.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/vitest/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, "node_modules/vitest/node_modules/magic-string": { "version": "0.30.17", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", @@ -26512,14 +24306,115 @@ "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", "dev": true }, + "node_modules/vitest/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/vitest/node_modules/vite": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz", + "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/wagmi": { - "version": "2.17.5", - "resolved": "https://registry.npmjs.org/wagmi/-/wagmi-2.17.5.tgz", - "integrity": "sha512-Sk2e40gfo68gbJ6lHkpIwCMkH76rO0+toCPjf3PzdQX37rZo9042DdNTYcSg3zhnx8abFJtrk/5vAWfR8APTDw==", + "version": "2.19.5", + "resolved": "https://registry.npmjs.org/wagmi/-/wagmi-2.19.5.tgz", + "integrity": "sha512-RQUfKMv6U+EcSNNGiPbdkDtJwtuFxZWLmvDiQmjjBgkuPulUwDJsKhi7gjynzJdsx2yDqhHCXkKsbbfbIsHfcQ==", "license": "MIT", "dependencies": { - "@wagmi/connectors": "5.11.2", - "@wagmi/core": "2.21.2", + "@wagmi/connectors": "6.2.0", + "@wagmi/core": "2.22.1", "use-sync-external-store": "1.4.0" }, "funding": { @@ -26546,15 +24441,6 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, - "node_modules/warning": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", - "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, "node_modules/wcwidth": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", @@ -26565,37 +24451,6 @@ "defaults": "^1.0.3" } }, - "node_modules/weald": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/weald/-/weald-1.0.4.tgz", - "integrity": "sha512-+kYTuHonJBwmFhP1Z4YQK/dGi3jAnJGCYhyODFpHK73rbxnp9lnZQj7a2m+WVgn8fXr5bJaxUpF6l8qZpPeNWQ==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "ms": "^3.0.0-canary.1", - "supports-color": "^9.4.0" - } - }, - "node_modules/weald/node_modules/ms": { - "version": "3.0.0-canary.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-3.0.0-canary.1.tgz", - "integrity": "sha512-kh8ARjh8rMN7Du2igDRO9QJnqCb2xYTJxyQYK7vJJS4TvLLmsbyhiKpSW+t+y26gyOyMd0riphX0GeWKU3ky5g==", - "license": "MIT", - "engines": { - "node": ">=12.13" - } - }, - "node_modules/weald/node_modules/supports-color": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.4.0.tgz", - "integrity": "sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, "node_modules/web-namespaces": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", @@ -26633,6 +24488,16 @@ "integrity": "sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==", "license": "MIT" }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", @@ -26643,19 +24508,6 @@ "webidl-conversions": "^3.0.0" } }, - "node_modules/wherearewe": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/wherearewe/-/wherearewe-2.0.1.tgz", - "integrity": "sha512-XUguZbDxCA2wBn2LoFtcEhXL6AXo+hVjGonwhSTTTU9SzbWG8Xu3onNIpzf9j/mYUcJQ0f+m37SzG77G851uFw==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "is-electron": "^2.2.0" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -26754,9 +24606,9 @@ } }, "node_modules/workerd": { - "version": "1.20251125.0", - "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20251125.0.tgz", - "integrity": "sha512-oQYfgu3UZ15HlMcEyilKD1RdielRnKSG5MA0xoi1theVs99Rop9AEFYicYCyK1R4YjYblLRYEiL1tMgEFqpReA==", + "version": "1.20260116.0", + "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20260116.0.tgz", + "integrity": "sha512-tVdBes3qkZKm9ntrgSDlvKzk4g2mcMp4bNM1+UgZMpTesb0x7e59vYYcKclbSNypmVkdLWpEc2TOpO0WF/rrZw==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", @@ -26767,28 +24619,28 @@ "node": ">=16" }, "optionalDependencies": { - "@cloudflare/workerd-darwin-64": "1.20251125.0", - "@cloudflare/workerd-darwin-arm64": "1.20251125.0", - "@cloudflare/workerd-linux-64": "1.20251125.0", - "@cloudflare/workerd-linux-arm64": "1.20251125.0", - "@cloudflare/workerd-windows-64": "1.20251125.0" + "@cloudflare/workerd-darwin-64": "1.20260116.0", + "@cloudflare/workerd-darwin-arm64": "1.20260116.0", + "@cloudflare/workerd-linux-64": "1.20260116.0", + "@cloudflare/workerd-linux-arm64": "1.20260116.0", + "@cloudflare/workerd-windows-64": "1.20260116.0" } }, "node_modules/wrangler": { - "version": "4.51.0", - "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-4.51.0.tgz", - "integrity": "sha512-JHv+58UxM2//e4kf9ASDwg016xd/OdDNDUKW6zLQyE7Uc9ayYKX1QJ9NsYtpo4dC1dfg6rT67pf1aNK1cTzUDg==", + "version": "4.59.3", + "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-4.59.3.tgz", + "integrity": "sha512-zl+nqoGzWJ4K+NEMjy4GiaIi9ix59FkOzd7UsDb8CQADwy3li1DSNAzHty/BWYa3ZvMxr/G4pogMBb5vcSrNvQ==", "dev": true, "license": "MIT OR Apache-2.0", "dependencies": { - "@cloudflare/kv-asset-handler": "0.4.1", - "@cloudflare/unenv-preset": "2.7.11", + "@cloudflare/kv-asset-handler": "0.4.2", + "@cloudflare/unenv-preset": "2.10.0", "blake3-wasm": "2.1.5", - "esbuild": "0.25.4", - "miniflare": "4.20251125.0", + "esbuild": "0.27.0", + "miniflare": "4.20260116.0", "path-to-regexp": "6.3.0", "unenv": "2.0.0-rc.24", - "workerd": "1.20251125.0" + "workerd": "1.20260116.0" }, "bin": { "wrangler": "bin/wrangler.js", @@ -26801,7 +24653,7 @@ "fsevents": "~2.3.2" }, "peerDependencies": { - "@cloudflare/workers-types": "^4.20251125.0" + "@cloudflare/workers-types": "^4.20260116.0" }, "peerDependenciesMeta": { "@cloudflare/workers-types": { @@ -26810,9 +24662,9 @@ } }, "node_modules/wrangler/node_modules/@esbuild/aix-ppc64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.4.tgz", - "integrity": "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.0.tgz", + "integrity": "sha512-KuZrd2hRjz01y5JK9mEBSD3Vj3mbCvemhT466rSuJYeE/hjuBrHfjjcjMdTm/sz7au+++sdbJZJmuBwQLuw68A==", "cpu": [ "ppc64" ], @@ -26827,9 +24679,9 @@ } }, "node_modules/wrangler/node_modules/@esbuild/android-arm": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.4.tgz", - "integrity": "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.0.tgz", + "integrity": "sha512-j67aezrPNYWJEOHUNLPj9maeJte7uSMM6gMoxfPC9hOg8N02JuQi/T7ewumf4tNvJadFkvLZMlAq73b9uwdMyQ==", "cpu": [ "arm" ], @@ -26844,9 +24696,9 @@ } }, "node_modules/wrangler/node_modules/@esbuild/android-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.4.tgz", - "integrity": "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.0.tgz", + "integrity": "sha512-CC3vt4+1xZrs97/PKDkl0yN7w8edvU2vZvAFGD16n9F0Cvniy5qvzRXjfO1l94efczkkQE6g1x0i73Qf5uthOQ==", "cpu": [ "arm64" ], @@ -26861,9 +24713,9 @@ } }, "node_modules/wrangler/node_modules/@esbuild/android-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.4.tgz", - "integrity": "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.0.tgz", + "integrity": "sha512-wurMkF1nmQajBO1+0CJmcN17U4BP6GqNSROP8t0X/Jiw2ltYGLHpEksp9MpoBqkrFR3kv2/te6Sha26k3+yZ9Q==", "cpu": [ "x64" ], @@ -26878,9 +24730,9 @@ } }, "node_modules/wrangler/node_modules/@esbuild/darwin-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.4.tgz", - "integrity": "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.0.tgz", + "integrity": "sha512-uJOQKYCcHhg07DL7i8MzjvS2LaP7W7Pn/7uA0B5S1EnqAirJtbyw4yC5jQ5qcFjHK9l6o/MX9QisBg12kNkdHg==", "cpu": [ "arm64" ], @@ -26895,9 +24747,9 @@ } }, "node_modules/wrangler/node_modules/@esbuild/darwin-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.4.tgz", - "integrity": "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.0.tgz", + "integrity": "sha512-8mG6arH3yB/4ZXiEnXof5MK72dE6zM9cDvUcPtxhUZsDjESl9JipZYW60C3JGreKCEP+p8P/72r69m4AZGJd5g==", "cpu": [ "x64" ], @@ -26912,9 +24764,9 @@ } }, "node_modules/wrangler/node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.4.tgz", - "integrity": "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.0.tgz", + "integrity": "sha512-9FHtyO988CwNMMOE3YIeci+UV+x5Zy8fI2qHNpsEtSF83YPBmE8UWmfYAQg6Ux7Gsmd4FejZqnEUZCMGaNQHQw==", "cpu": [ "arm64" ], @@ -26929,9 +24781,9 @@ } }, "node_modules/wrangler/node_modules/@esbuild/freebsd-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.4.tgz", - "integrity": "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.0.tgz", + "integrity": "sha512-zCMeMXI4HS/tXvJz8vWGexpZj2YVtRAihHLk1imZj4efx1BQzN76YFeKqlDr3bUWI26wHwLWPd3rwh6pe4EV7g==", "cpu": [ "x64" ], @@ -26946,9 +24798,9 @@ } }, "node_modules/wrangler/node_modules/@esbuild/linux-arm": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.4.tgz", - "integrity": "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.0.tgz", + "integrity": "sha512-t76XLQDpxgmq2cNXKTVEB7O7YMb42atj2Re2Haf45HkaUpjM2J0UuJZDuaGbPbamzZ7bawyGFUkodL+zcE+jvQ==", "cpu": [ "arm" ], @@ -26963,9 +24815,9 @@ } }, "node_modules/wrangler/node_modules/@esbuild/linux-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.4.tgz", - "integrity": "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.0.tgz", + "integrity": "sha512-AS18v0V+vZiLJyi/4LphvBE+OIX682Pu7ZYNsdUHyUKSoRwdnOsMf6FDekwoAFKej14WAkOef3zAORJgAtXnlQ==", "cpu": [ "arm64" ], @@ -26980,9 +24832,9 @@ } }, "node_modules/wrangler/node_modules/@esbuild/linux-ia32": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.4.tgz", - "integrity": "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.0.tgz", + "integrity": "sha512-Mz1jxqm/kfgKkc/KLHC5qIujMvnnarD9ra1cEcrs7qshTUSksPihGrWHVG5+osAIQ68577Zpww7SGapmzSt4Nw==", "cpu": [ "ia32" ], @@ -26997,9 +24849,9 @@ } }, "node_modules/wrangler/node_modules/@esbuild/linux-loong64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.4.tgz", - "integrity": "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.0.tgz", + "integrity": "sha512-QbEREjdJeIreIAbdG2hLU1yXm1uu+LTdzoq1KCo4G4pFOLlvIspBm36QrQOar9LFduavoWX2msNFAAAY9j4BDg==", "cpu": [ "loong64" ], @@ -27014,9 +24866,9 @@ } }, "node_modules/wrangler/node_modules/@esbuild/linux-mips64el": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.4.tgz", - "integrity": "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.0.tgz", + "integrity": "sha512-sJz3zRNe4tO2wxvDpH/HYJilb6+2YJxo/ZNbVdtFiKDufzWq4JmKAiHy9iGoLjAV7r/W32VgaHGkk35cUXlNOg==", "cpu": [ "mips64el" ], @@ -27031,9 +24883,9 @@ } }, "node_modules/wrangler/node_modules/@esbuild/linux-ppc64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.4.tgz", - "integrity": "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.0.tgz", + "integrity": "sha512-z9N10FBD0DCS2dmSABDBb5TLAyF1/ydVb+N4pi88T45efQ/w4ohr/F/QYCkxDPnkhkp6AIpIcQKQ8F0ANoA2JA==", "cpu": [ "ppc64" ], @@ -27048,9 +24900,9 @@ } }, "node_modules/wrangler/node_modules/@esbuild/linux-riscv64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.4.tgz", - "integrity": "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.0.tgz", + "integrity": "sha512-pQdyAIZ0BWIC5GyvVFn5awDiO14TkT/19FTmFcPdDec94KJ1uZcmFs21Fo8auMXzD4Tt+diXu1LW1gHus9fhFQ==", "cpu": [ "riscv64" ], @@ -27065,9 +24917,9 @@ } }, "node_modules/wrangler/node_modules/@esbuild/linux-s390x": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.4.tgz", - "integrity": "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.0.tgz", + "integrity": "sha512-hPlRWR4eIDDEci953RI1BLZitgi5uqcsjKMxwYfmi4LcwyWo2IcRP+lThVnKjNtk90pLS8nKdroXYOqW+QQH+w==", "cpu": [ "s390x" ], @@ -27082,9 +24934,9 @@ } }, "node_modules/wrangler/node_modules/@esbuild/linux-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.4.tgz", - "integrity": "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.0.tgz", + "integrity": "sha512-1hBWx4OUJE2cab++aVZ7pObD6s+DK4mPGpemtnAORBvb5l/g5xFGk0vc0PjSkrDs0XaXj9yyob3d14XqvnQ4gw==", "cpu": [ "x64" ], @@ -27099,9 +24951,9 @@ } }, "node_modules/wrangler/node_modules/@esbuild/netbsd-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.4.tgz", - "integrity": "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.0.tgz", + "integrity": "sha512-xbbOdfn06FtcJ9d0ShxxvSn2iUsGd/lgPIO2V3VZIPDbEaIj1/3nBBe1AwuEZKXVXkMmpr6LUAgMkLD/4D2PPA==", "cpu": [ "x64" ], @@ -27116,9 +24968,9 @@ } }, "node_modules/wrangler/node_modules/@esbuild/openbsd-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.4.tgz", - "integrity": "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.0.tgz", + "integrity": "sha512-aCwlRdSNMNxkGGqQajMUza6uXzR/U0dIl1QmLjPtRbLOx3Gy3otfFu/VjATy4yQzo9yFDGTxYDo1FfAD9oRD2A==", "cpu": [ "x64" ], @@ -27133,9 +24985,9 @@ } }, "node_modules/wrangler/node_modules/@esbuild/sunos-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.4.tgz", - "integrity": "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.0.tgz", + "integrity": "sha512-Q1KY1iJafM+UX6CFEL+F4HRTgygmEW568YMqDA5UV97AuZSm21b7SXIrRJDwXWPzr8MGr75fUZPV67FdtMHlHA==", "cpu": [ "x64" ], @@ -27150,9 +25002,9 @@ } }, "node_modules/wrangler/node_modules/@esbuild/win32-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.4.tgz", - "integrity": "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.0.tgz", + "integrity": "sha512-W1eyGNi6d+8kOmZIwi/EDjrL9nxQIQ0MiGqe/AWc6+IaHloxHSGoeRgDRKHFISThLmsewZ5nHFvGFWdBYlgKPg==", "cpu": [ "arm64" ], @@ -27167,9 +25019,9 @@ } }, "node_modules/wrangler/node_modules/@esbuild/win32-ia32": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.4.tgz", - "integrity": "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.0.tgz", + "integrity": "sha512-30z1aKL9h22kQhilnYkORFYt+3wp7yZsHWus+wSKAJR8JtdfI76LJ4SBdMsCopTR3z/ORqVu5L1vtnHZWVj4cQ==", "cpu": [ "ia32" ], @@ -27184,9 +25036,9 @@ } }, "node_modules/wrangler/node_modules/@esbuild/win32-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.4.tgz", - "integrity": "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.0.tgz", + "integrity": "sha512-aIitBcjQeyOhMTImhLZmtxfdOcuNRpwlPNmlFKPcHQYPhEssw75Cl1TSXJXpMkzaua9FUetx/4OQKq7eJul5Cg==", "cpu": [ "x64" ], @@ -27201,9 +25053,9 @@ } }, "node_modules/wrangler/node_modules/esbuild": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.4.tgz", - "integrity": "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.0.tgz", + "integrity": "sha512-jd0f4NHbD6cALCyGElNpGAOtWxSq46l9X/sWB0Nzd5er4Kz2YTm+Vl0qKFT9KUJvD8+fiO8AvoHhFvEatfVixA==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -27214,31 +25066,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.4", - "@esbuild/android-arm": "0.25.4", - "@esbuild/android-arm64": "0.25.4", - "@esbuild/android-x64": "0.25.4", - "@esbuild/darwin-arm64": "0.25.4", - "@esbuild/darwin-x64": "0.25.4", - "@esbuild/freebsd-arm64": "0.25.4", - "@esbuild/freebsd-x64": "0.25.4", - "@esbuild/linux-arm": "0.25.4", - "@esbuild/linux-arm64": "0.25.4", - "@esbuild/linux-ia32": "0.25.4", - "@esbuild/linux-loong64": "0.25.4", - "@esbuild/linux-mips64el": "0.25.4", - "@esbuild/linux-ppc64": "0.25.4", - "@esbuild/linux-riscv64": "0.25.4", - "@esbuild/linux-s390x": "0.25.4", - "@esbuild/linux-x64": "0.25.4", - "@esbuild/netbsd-arm64": "0.25.4", - "@esbuild/netbsd-x64": "0.25.4", - "@esbuild/openbsd-arm64": "0.25.4", - "@esbuild/openbsd-x64": "0.25.4", - "@esbuild/sunos-x64": "0.25.4", - "@esbuild/win32-arm64": "0.25.4", - "@esbuild/win32-ia32": "0.25.4", - "@esbuild/win32-x64": "0.25.4" + "@esbuild/aix-ppc64": "0.27.0", + "@esbuild/android-arm": "0.27.0", + "@esbuild/android-arm64": "0.27.0", + "@esbuild/android-x64": "0.27.0", + "@esbuild/darwin-arm64": "0.27.0", + "@esbuild/darwin-x64": "0.27.0", + "@esbuild/freebsd-arm64": "0.27.0", + "@esbuild/freebsd-x64": "0.27.0", + "@esbuild/linux-arm": "0.27.0", + "@esbuild/linux-arm64": "0.27.0", + "@esbuild/linux-ia32": "0.27.0", + "@esbuild/linux-loong64": "0.27.0", + "@esbuild/linux-mips64el": "0.27.0", + "@esbuild/linux-ppc64": "0.27.0", + "@esbuild/linux-riscv64": "0.27.0", + "@esbuild/linux-s390x": "0.27.0", + "@esbuild/linux-x64": "0.27.0", + "@esbuild/netbsd-arm64": "0.27.0", + "@esbuild/netbsd-x64": "0.27.0", + "@esbuild/openbsd-arm64": "0.27.0", + "@esbuild/openbsd-x64": "0.27.0", + "@esbuild/openharmony-arm64": "0.27.0", + "@esbuild/sunos-x64": "0.27.0", + "@esbuild/win32-arm64": "0.27.0", + "@esbuild/win32-ia32": "0.27.0", + "@esbuild/win32-x64": "0.27.0" } }, "node_modules/wrap-ansi": { @@ -27300,6 +25153,23 @@ } } }, + "node_modules/xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true, + "license": "MIT" + }, "node_modules/xmlhttprequest-ssl": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.2.tgz", @@ -27469,9 +25339,9 @@ } }, "node_modules/zod": { - "version": "3.24.2", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.2.tgz", - "integrity": "sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==", + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.5.tgz", + "integrity": "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" diff --git a/package.json b/package.json index 872833b62..4814e3744 100644 --- a/package.json +++ b/package.json @@ -3,44 +3,43 @@ "version": "1.0.0", "type": "module", "dependencies": { - "@binance/w3w-rainbow-connector-v2": "^1.0.2", + "@binance/w3w-rainbow-connector-v2": "^1.0.8", "@dnd-kit/core": "^6.0.5", "@dnd-kit/sortable": "^7.0.1", "@dnd-kit/utilities": "^3.2.0", - "@emotion/react": "^11.9.0", - "@hookform/resolvers": "^3.9.1", - "@lingui/macro": "4.14.0", - "@lingui/react": "4.14.0", + "@hookform/resolvers": "^5.2.2", + "@lingui/macro": "^5.8.0", + "@lingui/react": "^5.8.0", "@lucide/lab": "^0.1.2", "@popperjs/core": "^2.11.5", - "@radix-ui/react-accordion": "^1.2.1", - "@radix-ui/react-avatar": "^1.1.1", - "@radix-ui/react-checkbox": "^1.1.2", - "@radix-ui/react-collapsible": "^1.1.1", - "@radix-ui/react-dialog": "^1.1.14", - "@radix-ui/react-dropdown-menu": "^2.1.2", - "@radix-ui/react-hover-card": "^1.1.6", - "@radix-ui/react-label": "^2.1.0", - "@radix-ui/react-navigation-menu": "^1.2.3", + "@radix-ui/react-accordion": "^1.2.12", + "@radix-ui/react-avatar": "^1.1.11", + "@radix-ui/react-checkbox": "^1.3.3", + "@radix-ui/react-collapsible": "^1.1.12", + "@radix-ui/react-dialog": "^1.1.15", + "@radix-ui/react-dropdown-menu": "^2.1.16", + "@radix-ui/react-hover-card": "^1.1.15", + "@radix-ui/react-label": "^2.1.8", + "@radix-ui/react-navigation-menu": "^1.2.14", "@radix-ui/react-popover": "^1.1.15", - "@radix-ui/react-scroll-area": "^1.2.2", - "@radix-ui/react-select": "^2.1.7", - "@radix-ui/react-separator": "^1.1.0", - "@radix-ui/react-slider": "^1.2.1", - "@radix-ui/react-slot": "^1.1.0", - "@radix-ui/react-switch": "^1.1.1", - "@radix-ui/react-tabs": "^1.1.1", - "@radix-ui/react-toggle": "^1.1.1", - "@radix-ui/react-toggle-group": "^1.1.1", - "@radix-ui/react-tooltip": "^1.1.8", - "@rainbow-me/rainbowkit": "2.2.8", - "@react-spring/web": "^9.7.1", + "@radix-ui/react-progress": "^1.1.8", + "@radix-ui/react-scroll-area": "^1.2.10", + "@radix-ui/react-select": "^2.2.6", + "@radix-ui/react-separator": "^1.1.8", + "@radix-ui/react-slider": "^1.3.6", + "@radix-ui/react-slot": "^1.2.4", + "@radix-ui/react-switch": "^1.2.6", + "@radix-ui/react-tabs": "^1.1.13", + "@radix-ui/react-toggle": "^1.1.10", + "@radix-ui/react-toggle-group": "^1.1.11", + "@radix-ui/react-tooltip": "^1.2.8", + "@rainbow-me/rainbowkit": "2.2.10", "@reserve-protocol/dtf-rebalance-lib": "2.6.3", - "@reserve-protocol/react-zapper": "^1.5.6", + "@reserve-protocol/react-zapper": "^1.5.8", "@reserve-protocol/rtokens": "^1.1.23", "@sentry/react": "^9.16.0", "@sentry/vite-plugin": "^3.4.0", - "@tanstack/react-query": "^5.87.4", + "@tanstack/react-query": "^5.90.19", "@tanstack/react-table": "8.20.6", "@uiw/react-md-editor": "^3.20.5", "bad-words": "^4.0.0", @@ -49,13 +48,12 @@ "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "cmdk": "^1.1.1", - "dayjs": "^1.11.10", + "dayjs": "^1.11.19", "decimal.js-light": "^2.5.1", - "graphql": "^16.8.1", - "graphql-request": "5.1.0", - "humanize-duration": "^3.28.0", - "jotai": "^1.12.0", - "kubo-rpc-client": "^5.0.2", + "graphql": "16.12.0", + "graphql-request": "^7.4.0", + "humanize-duration": "^3.33.2", + "jotai": "^2.16.2", "lucide-react": "^0.461.0", "mixpanel-browser": "2.56.0", "next-themes": "^0.4.4", @@ -63,39 +61,37 @@ "react-dom": "18.3.1", "react-dropzone": "^14.3.5", "react-error-boundary": "4.1.2", - "react-ga": "^3.3.1", "react-helmet-async": "^2.0.5", - "react-hook-form": "^7.31.3", - "react-hot-toast": "^2.4.0", + "react-hook-form": "7.71.1", "react-intersection-observer": "^9.4.0", "react-json-view-lite": "^1.2.0", - "react-lazy-with-preload": "^2.2.1", "react-loading-skeleton": "^3.3.1", - "react-popper": "^2.3.0", "react-router-dom": "7.0.1", - "react-select": "^5.10.0", + "react-select": "^5.10.2", "react-virtualized-auto-sizer": "^1.0.25", "react-window": "^1.8.11", "recharts": "^2.13.3", "sonner": "^1.7.4", - "swr": "^2.2.5", "tailwind-merge": "^2.5.5", "tailwindcss-animate": "^1.0.7", - "theme-ui": "0.17.1", "vaul": "^1.1.1", - "viem": "2.37.9", - "wagmi": "2.17.5", - "zod": "^3.23.8" + "viem": "2.44.4", + "wagmi": "2.19.5", + "zod": "4.3.5" }, "scripts": { "start": "vite", - "build": "tsc && vite build && npm run generate-seo-pages", + "build": "npm run refresh-token-logos && tsc && vite build && npm run generate-seo-pages", "build:no-seo": "tsc && vite build", + "refresh-token-logos": "npx tsx scripts/refresh-token-logos.ts", "serve": "vite preview", + "typecheck": "tsc --noEmit", + "typecheck:watch": "tsc --noEmit --watch", "analyze": "vite-bundle-visualizer 'build/static/js/*.js'", - "test": "vite test", + "test": "vitest", + "test:run": "vitest run", + "test:coverage": "vitest run --coverage", "test:e2e": "npx playwright test", - "test:lib": "npx vitest run", "translations": "lingui extract --clean && lingui compile", "forknet": "anvil --fork-url https://eth.llamarpc.com --chain-id 1 --balance 10000000", "parse-collaterals": "node scripts/parseCollaterals", @@ -118,35 +114,33 @@ ] }, "devDependencies": { - "@cloudflare/workers-types": "^4.20251126.0", - "@lingui/cli": "4.14.0", - "@lingui/vite-plugin": "4.14.0", + "@cloudflare/workers-types": "^4.20260120.0", + "@lingui/cli": "^5.8.0", + "@lingui/vite-plugin": "^5.8.0", "@locator/babel-jsx": "^0.4.4", - "@playwright/test": "^1.38.0", - "@react-spring/types": "^9.4.5", + "@playwright/test": "^1.57.0", "@testing-library/jest-dom": "^5.16.4", "@testing-library/react": "^13.0.0", "@testing-library/user-event": "^14.0.4", "@types/humanize-duration": "3.27.4", - "@types/jest": "29.5.14", - "@types/mixpanel-browser": "^2.50.2", - "@types/node": "22.9.1", + "@types/node": "^22.15.0", "@types/react": "18.3.1", "@types/react-dom": "18.3.1", "@types/react-window": "^1.8.8", "@viem/anvil": "0.0.10", - "@vitejs/plugin-react": "4.3.3", - "autoprefixer": "^10.4.20", + "@vitejs/plugin-react": "^5.1.2", + "autoprefixer": "^10.4.23", "babel-plugin-macros": "3.1.0", - "postcss": "^8.4.49", + "jsdom": "^27.4.0", + "postcss": "^8.5.6", "prettier": "3.3.3", "tailwindcss": "^3.4.15", "typescript": "5.6.3", - "vite": "5.4.8", + "vite": "^7.3.1", "vite-bundle-visualizer": "1.2.1", - "vite-plugin-static-copy": "^2.1.0", - "vite-tsconfig-paths": "^4.2.0", + "vite-plugin-static-copy": "^3.1.5", + "vite-tsconfig-paths": "^6.0.4", "vitest": "^3.1.3", - "wrangler": "^4.51.0" + "wrangler": "^4.59.3" } } diff --git a/scripts/refresh-token-logos.ts b/scripts/refresh-token-logos.ts new file mode 100644 index 000000000..3dac8c3a1 --- /dev/null +++ b/scripts/refresh-token-logos.ts @@ -0,0 +1,268 @@ +/** + * Script to pre-compute token logo URLs at build time + * Fetches all Index DTF baskets and resolves logos for each token + * + * Run: npx tsx scripts/refresh-token-logos.ts + */ + +import * as fs from 'fs' +import * as path from 'path' +import { fileURLToPath } from 'url' + +const __filename = fileURLToPath(import.meta.url) +const __dirname = path.dirname(__filename) + +const API_URL = 'https://api.reserve.org' +const CHAINS_TO_FETCH = [1, 8453, 56] // Ethereum, Base, BSC +const ONE_WEEK = 7 * 24 * 60 * 60 * 1000 + +// Known local assets - skip these (copied from token-logo/index.tsx) +const SVGS = new Set([ + 'aave', 'dai', 'cdai', 'rsr', 'strsr', 'rsv', 'tusd', 'usdt', 'cusdt', + 'usdc', 'cusdc', 'usdbc', 'usdp', 'wsgusdbc', 'wcusdcv3', 'wcusdtv3', + 'wcusdbcv3', 'wbtc', 'cwbtc', 'ceth', 'eth', 'busd', 'weth', 'sadai', + 'sausdc', 'sabasusdbc', 'sausdt', 'eurt', 'fusdc', 'fusdt', 'fdai', + 'wcUSDCv3', 'wsteth', 'cbeth', 'meusd', 'reth', 'stkcvx3crv', + 'stkcvxcrv3crypto', 'stkcvxeusd3crv-f', 'stkcvxeth+eth', 'stkcvxeth+eth-f', + 'stkcvxmim-3lp3crv-f', 'sdai', 'mrp-ausdt', 'mrp-ausdc', 'mrp-adai', + 'mrp-awbtc', 'mrp-aweth', 'mrp-awteth', 'mrp-asteth', 'frax', 'crvusd', + 'mkusd', 'eusd', 're7weth', 'saethusdc', 'saethpyusd', 'pyusd', + 'sabasusdc', 'saarbusdcn', 'sfrxeth', 'usd+', 'pxeth', 'apxeth', 'susde', + 'sdt', 'wusdm', 'eth+', 'wsamm-eusd/usdc', 'oeth', 'woeth', 'susds', + 'saethusdt', 'saethrlusd', 'cro', 'xlm', 'hbar', 'hype', 'sui', 'fxs', + 'weeth', 'king', +]) + +const PNGS = new Set([ + 'steakusdc', 'mai', 'dola', 'fxusd', 'alusd', 'ethx', 'dtf', 'trx', 'wbnb', + 'toncoin', 'bgb', 'sttao', 'bonk', 'moomorpho-steakhouse-usdc', + 'moomorpho-steakhouse-wbtc', 'moomorpho-steakhouse-weth', + 'moomorpho-smokehouse-wsteth', 'moomorpho-smokehouse-usdc', 'ssr', + 'avgjoescrypto', 'eat', +]) + +const EXTERNAL_ASSETS = new Set([ + 'leo', 'okb', 'gt', 'kas', 'mnt', 'ena', 'wld', 'jup', 'ray', 'paxg', + 'gala', 'pyth', 'cake', +]) + +function hasLocalAsset(symbol: string): boolean { + const lower = symbol.toLowerCase() + return SVGS.has(lower) || PNGS.has(lower) || EXTERNAL_ASSETS.has(lower) +} + +interface BasketToken { + address: string + symbol: string +} + +interface IndexDTFItem { + address: string + symbol: string + basket: BasketToken[] + chainId: number +} + +async function fetchIndexDTFs(chainId: number): Promise { + try { + const response = await fetch( + `${API_URL}/discover/dtf?chainId=${chainId}&limit=100` + ) + if (!response.ok) { + console.error(`Failed to fetch Index DTFs for chain ${chainId}`) + return [] + } + return await response.json() + } catch (error) { + console.error(`Error fetching Index DTFs for chain ${chainId}:`, error) + return [] + } +} + +async function tryImageUrl(url: string): Promise { + try { + const controller = new AbortController() + const timeout = setTimeout(() => controller.abort(), 5000) // 5s timeout + const response = await fetch(url, { + method: 'HEAD', + signal: controller.signal, + }) + clearTimeout(timeout) + return response.ok + } catch { + return false + } +} + +async function resolveLogoUrl( + address: string, + chainId: number +): Promise { + const dexscreenerUrl = `https://dd.dexscreener.com/ds-data/tokens/base/${address.toLowerCase()}.png?size=lg` + const llamaUrl = `https://token-icons.llamao.fi/icons/tokens/${chainId}/${address.toLowerCase()}` + + // Try both sources in parallel, return first success + const results = await Promise.allSettled([ + tryImageUrl(dexscreenerUrl).then((ok) => + ok ? dexscreenerUrl : Promise.reject() + ), + tryImageUrl(llamaUrl).then((ok) => (ok ? llamaUrl : Promise.reject())), + ]) + + // Prefer dexscreener if both succeed + for (const result of results) { + if (result.status === 'fulfilled') { + return result.value + } + } + + return null +} + +function loadExistingMappings(outputPath: string): Record { + if (!fs.existsSync(outputPath)) { + return {} + } + try { + const content = fs.readFileSync(outputPath, 'utf-8') + const match = content.match( + /TOKEN_LOGO_MAPPINGS[^=]*=\s*(\{[\s\S]*?\n\})/ + ) + if (match) { + return JSON.parse(match[1]) + } + } catch { + // Couldn't parse existing mappings + } + return {} +} + +async function main() { + const outputPath = path.join( + __dirname, + '../src/components/token-logo/token-logo-mappings.ts' + ) + + // Check if we should skip (file exists and is less than a week old) + if (fs.existsSync(outputPath)) { + try { + const content = fs.readFileSync(outputPath, 'utf-8') + const match = content.match(/LAST_UPDATED = (\d+)/) + if (match) { + const lastUpdated = parseInt(match[1], 10) + if (Date.now() - lastUpdated < ONE_WEEK) { + console.log('Token mappings fresh (< 1 week), skipping refresh') + process.exit(0) + } + } + } catch { + // File exists but couldn't parse, continue with refresh + } + } + + console.log('Refreshing token logo mappings...\n') + + // Load existing mappings to validate and reuse + const existingMappings = loadExistingMappings(outputPath) + const existingCount = Object.keys(existingMappings).length + if (existingCount > 0) { + console.log(`Loaded ${existingCount} existing mappings to validate\n`) + } + + // Collect all unique tokens by symbol + const tokensBySymbol = new Map< + string, + { address: string; chainId: number } + >() + + for (const chainId of CHAINS_TO_FETCH) { + console.log(`Fetching DTFs for chain ${chainId}...`) + const dtfs = await fetchIndexDTFs(chainId) + console.log(` Found ${dtfs.length} DTFs`) + + for (const dtf of dtfs) { + for (const token of dtf.basket || []) { + const symbolLower = token.symbol.toLowerCase() + + // Skip if we have a local asset + if (hasLocalAsset(token.symbol)) { + continue + } + + // Only store first occurrence (prioritize earlier chains) + if (!tokensBySymbol.has(symbolLower)) { + tokensBySymbol.set(symbolLower, { + address: token.address, + chainId, + }) + } + } + } + } + + console.log(`\nFound ${tokensBySymbol.size} unique tokens to resolve...`) + + // Resolve logos in parallel with batched concurrency + const BATCH_SIZE = 30 + const mappings: Record = {} + let resolved = 0 + let reused = 0 + let failed = 0 + + const entries = Array.from(tokensBySymbol.entries()) + + // Process in batches + for (let i = 0; i < entries.length; i += BATCH_SIZE) { + const batch = entries.slice(i, i + BATCH_SIZE) + + const results = await Promise.all( + batch.map(async ([symbol, { address, chainId }]) => { + // First check if existing mapping is still valid + const existingUrl = existingMappings[symbol] + if (existingUrl && (await tryImageUrl(existingUrl))) { + return { symbol, url: existingUrl, cached: true } + } + + // Resolve fresh + const url = await resolveLogoUrl(address, chainId) + return { symbol, url, cached: false } + }) + ) + + // Process results and log + for (const { symbol, url, cached } of results) { + if (url) { + mappings[symbol] = url + if (cached) { + reused++ + console.log(` ✓ ${symbol} (cached)`) + } else { + resolved++ + console.log(` ✓ ${symbol}`) + } + } else { + failed++ + console.log(` ✗ ${symbol} (no logo found)`) + } + } + } + + // Generate output file + const output = `// Auto-generated by scripts/refresh-token-logos.ts +// Do not edit manually + +export const TOKEN_LOGO_MAPPINGS: Record = ${JSON.stringify(mappings, null, 2)} + +export const LAST_UPDATED = ${Date.now()} +` + + fs.writeFileSync(outputPath, output) + + console.log(`\n✅ Generated token logo mappings`) + console.log(` Reused (cached): ${reused}`) + console.log(` Resolved (new): ${resolved}`) + console.log(` Failed: ${failed}`) + console.log(` Output: ${outputPath}`) +} + +main().catch(console.error) diff --git a/src/app.css b/src/app.css index cdc340d60..297616960 100644 --- a/src/app.css +++ b/src/app.css @@ -128,21 +128,21 @@ body { @font-face { font-family: 'TWK Lausanne'; - src: url('/fonts/TWKLausanne-300.otf') format('woff'); + src: url('/fonts/TWKLausanne-300.otf') format('opentype'); font-weight: 300; font-display: swap; } @font-face { font-family: 'TWK Lausanne'; - src: url('/fonts/TWKLausanne-500.otf') format('woff'); + src: url('/fonts/TWKLausanne-500.otf') format('opentype'); font-weight: 500; font-display: swap; } @font-face { font-family: 'TWK Lausanne'; - src: url('/fonts/TWKLausanne-700.otf') format('woff'); + src: url('/fonts/TWKLausanne-700.otf') format('opentype'); font-weight: 700; font-display: swap; } @@ -155,6 +155,6 @@ body { @apply border-border; } body { - @apply bg-background text-foreground; + @apply bg-background text-foreground font-normal; } } diff --git a/src/app.tsx b/src/app.tsx index 5c74b8c13..54955f6b2 100644 --- a/src/app.tsx +++ b/src/app.tsx @@ -1,5 +1,5 @@ import mixpanel from 'mixpanel-browser/src/loaders/loader-module-core' -import { useEffect } from 'react' +import { useEffect, useRef } from 'react' import { HelmetProvider } from 'react-helmet-async' import { BrowserRouter as Router, @@ -8,18 +8,26 @@ import { } from 'react-router-dom' import ChainProvider from 'state/chain' import Updater from 'state/updater' -import { ThemeUIProvider } from 'theme-ui' import { getTokenRoute } from 'utils' import AppRoutes from './app-routes' import Layout from './components/layout' import { Toaster } from './components/ui/sonner' +import { TooltipProvider } from './components/ui/tooltip' import LanguageProvider from './i18n' -import { theme } from './theme' import * as Sentry from '@sentry/react' -mixpanel.init(import.meta.env.VITE_MIXPANEL_KEY || 'mixpanel_key', { - track_pageview: true, -}) +// Deferred Mixpanel initialization to avoid blocking first render +const useMixpanelInit = () => { + const initialized = useRef(false) + useEffect(() => { + if (!initialized.current) { + initialized.current = true + mixpanel.init(import.meta.env.VITE_MIXPANEL_KEY || 'mixpanel_key', { + track_pageview: true, + }) + } + }, []) +} // Support for old routes redirects const Redirects = () => { @@ -49,17 +57,6 @@ const ScrollToTop = () => { return null } -const handleError = (error: Error) => { - if ( - error.message.includes('Failed to fetch dynamically imported module') || - error.message.includes('Importing a module script failed') - ) { - window.location.reload() - } else { - console.error(error) - } -} - function FallbackUI({ error, resetErrorBoundary, @@ -103,30 +100,34 @@ function FallbackUI({ * * @returns {JSX.Element} */ -const App = () => ( - - ( - - )} - > - - - - +const App = () => { + useMixpanelInit() + + return ( + + ( + + )} + > + + + - - - - - - - + + + + + + + + + - - - - -) + + + + ) +} export default App diff --git a/src/components/account/index.tsx b/src/components/account/index.tsx index c2361d4db..cc43b8e1d 100644 --- a/src/components/account/index.tsx +++ b/src/components/account/index.tsx @@ -1,15 +1,20 @@ -import Button from '@/components/old/button' -import { MouseoverTooltipContent } from '@/components/old/tooltip' +import { Button } from '@/components/ui/button' +import { Card } from '@/components/ui/card' +import { + Tooltip, + TooltipContent, + TooltipTrigger, +} from '@/components/ui/tooltip' import Staking from '@/views/index-dtf/overview/components/staking' import PortfolioSidebar from '@/views/portfolio/sidebar' import { Trans } from '@lingui/macro' import { ConnectButton } from '@rainbow-me/rainbowkit' import ChainLogo from 'components/icons/ChainLogo' import { useAtomValue } from 'jotai' -import { AlertCircle, Menu, Wallet, Power } from 'lucide-react' +import { AlertCircle, Wallet, Power } from 'lucide-react' import { ReactNode } from 'react' import { chainIdAtom, selectedRTokenAtom } from 'state/atoms' -import { Box, Card, Flex, Text } from 'theme-ui' +import { cn } from '@/lib/utils' const ErrorWrapper = ({ chainId, @@ -25,31 +30,30 @@ const ErrorWrapper = ({ isValid ? ( <>{children} ) : ( - - + + {children} + + + Network - - - - Chain: {chainId} - + +
+ + Chain: {chainId} + Unsupported - - - + +
+ The configured network "{currentChain}" is different from the wallet selected network "{chainId}"". Change your network in the connected wallet. -
+ - } - > - {children} -
+ + ) /** @@ -70,94 +74,71 @@ const Account = () => { isTokenSelected && connected && chain.id !== chainId return ( - {(() => { if (!connected) { return ( ) } return ( - - - setVisible(true)} - > -
-
- {!invalidChain ? ( - - ) : ( - - )} -
+ <> + + +
+
+
+ {!invalidChain ? ( + + ) : ( + + )} +
- - {account.displayName} - + + {account.displayName} + -
- +
+ +
- - + + - + ) })()} - +
) }} diff --git a/src/components/chain-selector/ChainSelector.tsx b/src/components/chain-selector/ChainSelector.tsx deleted file mode 100644 index 8ddcdd222..000000000 --- a/src/components/chain-selector/ChainSelector.tsx +++ /dev/null @@ -1,132 +0,0 @@ -import Button from '@/components/old/button' -import Base from 'components/icons/logos/Base' -import Ethereum from 'components/icons/logos/Ethereum' -import Popup from '@/components/old/popup' -import { useAtomValue } from 'jotai' -import mixpanel from 'mixpanel-browser/src/loaders/loader-module-core' -import { useState } from 'react' -import { Check, ChevronDown, ChevronUp } from 'lucide-react' -import { useNavigate, useSearchParams } from 'react-router-dom' -import { chainIdAtom, selectedRTokenAtom } from 'state/atoms' -import { Box, BoxProps, Flex, Text } from 'theme-ui' -import { ChainId } from 'utils/chains' -import { ROUTES } from 'utils/constants' - -export const chainIcons = { - [ChainId.Mainnet]: Ethereum, - [ChainId.Base]: Base, -} - -const CHAIN_LIST = [ - { label: 'Ethereum', id: ChainId.Mainnet }, - { label: 'Base', id: ChainId.Base }, -] - -const ChainList = ({ onSelect }: { onSelect(chain: number): void }) => { - const selected = useAtomValue(chainIdAtom) - const navigate = useNavigate() - - return ( - - {CHAIN_LIST.map((chain) => { - const Icon = chainIcons[chain.id] - const isSelected = selected === chain.id - - return ( - onSelect(chain.id)} - key={chain.id} - > - - - {chain.label} - - - - - - ) - })} - - - - - ) -} - -const ChainSelector = (props: BoxProps) => { - const [searchParams, setSearchParams] = useSearchParams() - const chainId = useAtomValue(chainIdAtom) - const selectedRToken = useAtomValue(selectedRTokenAtom) - const [isVisible, setVisible] = useState(false) - const navigate = useNavigate() - - const handleSelect = (chain: number) => { - if (chain !== chainId && selectedRToken) { - navigate(`/?chainId=${chain}`) - } else { - searchParams.set('chainId', chain.toString()) - setSearchParams(searchParams) - } - - setVisible(false) - } - - const ChainIcon = chainIcons[chainId] - - return ( - setVisible(false)} - content={} - containerProps={{ - sx: { border: '2px solid', borderColor: 'darkBorder' }, - }} - > - setVisible(!isVisible)} - > - {!!ChainIcon && } - - {isVisible ? : } - - - ) -} - -export default ChainSelector diff --git a/src/components/charts/area/AreaChart.tsx b/src/components/charts/area/AreaChart.tsx index c3868af30..4dc5de74c 100644 --- a/src/components/charts/area/AreaChart.tsx +++ b/src/components/charts/area/AreaChart.tsx @@ -1,5 +1,4 @@ import { Trans } from '@lingui/macro' -import InfoBox from '@/components/old/info-box' import TabMenu from 'components/tab-menu' import { useMemo } from 'react' import { ArrowDown, ArrowUp } from 'lucide-react' @@ -10,13 +9,15 @@ import { Tooltip, YAxis, } from 'recharts' -import { Box, BoxProps, Card, Flex, Spinner, Text } from 'theme-ui' +import { Card } from '@/components/ui/card' +import Spinner from '@/components/ui/spinner' +import { cn } from '@/lib/utils' import { StringMap } from 'types' import { formatCurrency } from 'utils' type ChartData = { value: number; label?: string; display?: string }[] -interface Props extends Omit { +interface Props { data: ChartData title: React.ReactNode heading?: string @@ -26,16 +27,19 @@ interface Props extends Omit { height?: number moreActions?: React.ReactNode domain?: [number | string, number | string] + className?: string } -function CustomTooltip({ payload, label, active }: any) { +function CustomTooltip({ payload, active }: any) { if (active && payload) { return ( - - + + + {payload[0]?.payload?.display || payload[0]?.payload?.value} + + + {payload[0]?.payload?.label} + ) } @@ -55,23 +59,18 @@ const Gain = ({ data }: { data: ChartData }) => { return 0 }, [data]) - let gainColor = 'lightText' - - if (gain >= 0.01) { - gainColor = 'primary' - } else if (gain < 0) { - gainColor = 'danger' - } + const gainColorClass = + gain >= 0.01 ? 'text-primary' : gain < 0 ? 'text-destructive' : 'text-legend' return ( - +
{gain >= 0.01 && } {gain < 0 && } - + {gain >= 0.01 && '+'} {formatCurrency(gain)}% - - + +
) } @@ -87,7 +86,7 @@ const AreaChart = ({ height = 100, moreActions, domain, - ...props + className, }: Props) => { const options = useMemo(() => { if (!timeRange) { @@ -101,16 +100,16 @@ const AreaChart = ({ }, [JSON.stringify(timeRange)]) return ( - +
{heading && ( - - {heading} - +
+ {heading} +
)} - +
{title} - +
{data && !!data.length && ( @@ -128,30 +127,21 @@ const AreaChart = ({ )} {data && !data.length && ( - - +
+ No data - - + +
)} {!data && ( - - +
)} - +
{!!options && currentRange && onRangeChange && ( )} {moreActions} - - +
+
) } diff --git a/src/components/dark-mode-toggle/ThemeColorMode.tsx b/src/components/dark-mode-toggle/ThemeColorMode.tsx deleted file mode 100644 index 52cb00352..000000000 --- a/src/components/dark-mode-toggle/ThemeColorMode.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import { BoxProps, useColorMode } from 'theme-ui' -import DarkModeToggle from '.' - -// TODO: Fix typescript here -const ThemeColorMode = (props: BoxProps) => { - const [colorMode, setColorMode] = useColorMode() - - return ( - setColorMode(mode)} - {...props} - /> - ) -} - -export default ThemeColorMode diff --git a/src/components/dark-mode-toggle/index.tsx b/src/components/dark-mode-toggle/index.tsx index 19e84dc10..178ff2d92 100644 --- a/src/components/dark-mode-toggle/index.tsx +++ b/src/components/dark-mode-toggle/index.tsx @@ -1,13 +1,11 @@ -import { animated, useSpring } from '@react-spring/web' -import { useEffect } from 'react' -import { Box } from 'theme-ui' +import { useEffect, useState } from 'react' export const MODES = { LIGHT: 'light', DARK: 'dark', } -const properties: { [x: string]: any } = { +const properties = { light: { r: 9, transform: 'rotate(40deg)', @@ -22,33 +20,30 @@ const properties: { [x: string]: any } = { cy: 0, opacity: 1, }, - springConfig: { mass: 4, tension: 250, friction: 35 }, } -const DarkModeToggle = ({ - mode, - onToggle, - ...props -}: { - mode: string - onToggle(colorMode: string): void -}) => { - const { r, transform, cx, cy, opacity } = properties[mode] +const TRANSITION = 'all 400ms cubic-bezier(0.5, 0, 0.2, 1)' - const svgContainerProps = useSpring({ - transform, - config: properties.springConfig, - }) - const centerCircleProps = useSpring({ r, config: properties.springConfig }) - const maskedCircleProps = useSpring({ - cx, - cy, - config: properties.springConfig, - }) - const linesProps = useSpring({ opacity, config: properties.springConfig }) +const getInitialMode = () => { + if (typeof window === 'undefined') return MODES.LIGHT + const stored = localStorage.getItem('theme-ui-color-mode') + if (stored === MODES.DARK || stored === MODES.LIGHT) return stored + return window.matchMedia('(prefers-color-scheme: dark)').matches + ? MODES.DARK + : MODES.LIGHT +} + +const DarkModeToggle = ({ className }: { className?: string }) => { + const [mode, setMode] = useState(getInitialMode) + + const { r, transform, cx, cy, opacity } = + properties[mode as keyof typeof properties] const handleToggle = () => { const newMode = mode === MODES.LIGHT ? MODES.DARK : MODES.LIGHT + setMode(newMode) + localStorage.setItem('theme-ui-color-mode', newMode) + // Update theme-ui theme document.documentElement.setAttribute('data-color-mode', newMode) // Update Tailwind theme @@ -57,15 +52,11 @@ const DarkModeToggle = ({ } else { document.documentElement.classList.remove('dark') } - onToggle(newMode) } useEffect(() => { - // Sync theme-ui theme - if (mode !== document.documentElement.getAttribute('data-color-mode')) { - document.documentElement.setAttribute('data-color-mode', mode) - } - // Sync Tailwind theme + // Sync on mount + document.documentElement.setAttribute('data-color-mode', mode) if (mode === MODES.DARK) { document.documentElement.classList.add('dark') } else { @@ -74,8 +65,8 @@ const DarkModeToggle = ({ }, []) return ( - - + - - - + @@ -115,9 +109,9 @@ const DarkModeToggle = ({ - - - + + +
) } diff --git a/src/components/field/index.tsx b/src/components/field/index.tsx index 354f03c1a..90d4b6d38 100644 --- a/src/components/field/index.tsx +++ b/src/components/field/index.tsx @@ -1,15 +1,20 @@ import { t } from '@lingui/macro' import Help from 'components/help' +import { Input } from '@/components/ui/input' +import { Textarea } from '@/components/ui/textarea' +import { Slider } from '@/components/ui/slider' import React, { useMemo } from 'react' import { RegisterOptions, useFormContext } from 'react-hook-form' -import { Box, Flex, Input, InputProps, Slider, Text, Textarea } from 'theme-ui' import { StringMap } from 'types' +import { cn } from '@/lib/utils' -interface FieldProps extends InputProps { +interface FieldProps { label?: string strong?: boolean help?: string required?: boolean + children?: React.ReactNode + className?: string } interface FormFieldProps extends FieldProps { @@ -19,6 +24,7 @@ interface FormFieldProps extends FieldProps { error?: string | boolean options?: RegisterOptions helper?: string + disabled?: boolean } export const getErrorMessage = (error: StringMap): string => { @@ -42,56 +48,49 @@ export const Field = ({ required, strong, children, - sx = {}, - ...props + className, }: FieldProps) => ( - - - - +
+
+ {label} - - {required && *} - - {!!help && } - + + {required && *} +
+ {!!help && } +
{children} -
+
) -export const FieldInput = React.forwardRef( - ({ sx = {}, textarea = false, error, ...props }: FormFieldProps, ref) => { - const InputComponent = textarea ? Textarea : Input +export const FieldInput = React.forwardRef< + HTMLInputElement | HTMLTextAreaElement, + FormFieldProps +>(({ textarea = false, error, className, ...props }, ref) => { + const InputComponent = textarea ? Textarea : Input - return ( - <> - + return ( + <> + - {!!error && typeof error === 'string' && ( - - {error} - - )} - - ) - } -) + {!!error && typeof error === 'string' && ( + + {error} + + )} + + ) +}) export const FormField = ({ placeholder, @@ -126,17 +125,9 @@ export const FormField = ({ {...register(name, options)} /> {helper && ( - + {helper} - + )} ), @@ -149,17 +140,27 @@ export const FormFieldRange = ({ options, min = 0, max = 100, + className, ...props -}: FormFieldProps) => { - const { register } = useFormContext() +}: FormFieldProps & { min?: number; max?: number }) => { + const { register, watch } = useFormContext() + const { onChange } = register(name, options) + const value = watch(name) return useMemo( () => ( - - + + + onChange({ target: { name, value: val[0] } }) + } + /> ), - [register] + [register, value] ) } diff --git a/src/components/filters/chain/ChainFilter.tsx b/src/components/filters/chain/ChainFilter.tsx index 9ae7f26aa..45283a1e7 100644 --- a/src/components/filters/chain/ChainFilter.tsx +++ b/src/components/filters/chain/ChainFilter.tsx @@ -1,10 +1,9 @@ import { devModeAtom } from '@/state/atoms' -import { ChainId } from '@/utils/chains' +import { cn } from '@/lib/utils' import ChainLogo from 'components/icons/ChainLogo' import StackedChainLogo from 'components/icons/StackedChainLogo' import { useAtomValue } from 'jotai' import { useMemo } from 'react' -import { Box, Text } from 'theme-ui' import { CHAIN_TO_NETWORK, NETWORKS, @@ -50,38 +49,34 @@ const ChainFilter = ({ ) return ( - +
{Boolean(chainsLogos.length) && ( )} - {chains.length === 0 && Select a chain} + {chains.length === 0 && Select a chain} {chains.length == 1 && ( - + {capitalize(CHAIN_TO_NETWORK[Number(chains[0])])} - + )} {chains.length > 1 && chains.length !== supportedChainList.length && ( - {chains.length} chains + {chains.length} chains )} {chains.length === supportedChainList.length && ( - All Chains + All Chains )} - +
) } diff --git a/src/components/go-to.tsx b/src/components/go-to.tsx new file mode 100644 index 000000000..51b29c003 --- /dev/null +++ b/src/components/go-to.tsx @@ -0,0 +1,26 @@ +import { cn } from '@/lib/utils' +import { ArrowUpRight } from 'lucide-react' +import { Link } from 'react-router-dom' + +interface GoToProps { + href: string + className?: string +} + +const GoTo = ({ href, className }: GoToProps) => { + return ( + e.stopPropagation()} + > + + + ) +} + +export default GoTo diff --git a/src/components/help/index.tsx b/src/components/help/index.tsx index 3bb6d8467..3d98ab548 100644 --- a/src/components/help/index.tsx +++ b/src/components/help/index.tsx @@ -1,35 +1,105 @@ -import { Placement } from '@popperjs/core' +import { + Tooltip, + TooltipContent, + TooltipTrigger, +} from '@/components/ui/tooltip' import HelpIcon from 'components/icons/CustomHelpIcon' -import { MouseoverTooltip } from '@/components/old/tooltip' import { ReactNode } from 'react' -import { Box, BoxProps } from 'theme-ui' +import { cn } from '@/lib/utils' -interface Props extends Omit { +// Legacy theme-ui spacing to Tailwind mapping +// theme-ui: [0, 4, 8, 16, 24, 32, 40, 48, 80, 256] +const spacingMap: Record = { + 0: '0', + 1: '1', // 4px + 2: '2', // 8px + 3: '4', // 16px + 4: '6', // 24px + 5: '8', // 32px +} + +// Map placement (from @popperjs/core) to side +const placementToSide = ( + placement?: string +): 'top' | 'right' | 'bottom' | 'left' => { + if (placement?.startsWith('bottom')) return 'bottom' + if (placement?.startsWith('left')) return 'left' + if (placement?.startsWith('right')) return 'right' + return 'top' +} + +interface Props { content: ReactNode size?: number color?: string - placement?: Placement + className?: string + side?: 'top' | 'right' | 'bottom' | 'left' + // Legacy theme-ui props (will be converted to Tailwind classes) + placement?: string + ml?: number | string + mr?: number | string + mt?: number | string + mb?: number | string + mx?: number | string + my?: number | string + sx?: Record // Ignored, just for compatibility } const Help = ({ content, color, size = 16, - sx = {}, + className, + side, placement, - ...props + ml, + mr, + mt, + mb, + mx, + my, + sx, // eslint-disable-line @typescript-eslint/no-unused-vars }: Props) => { const defaultColor = 'secondaryText' + + // Build Tailwind classes from legacy props + const legacyClasses: string[] = [] + + const addSpacing = ( + prefix: string, + value: number | string | undefined + ) => { + if (value === undefined) return + const numValue = typeof value === 'string' ? parseInt(value) : value + const twValue = spacingMap[numValue] ?? value + legacyClasses.push(`${prefix}-${twValue}`) + } + + addSpacing('ml', ml ?? mx) + addSpacing('mr', mr ?? mx) + addSpacing('mt', mt ?? my) + addSpacing('mb', mb ?? my) + + const finalSide = side ?? placementToSide(placement) + return ( - - - - - + + + + + + {content} + + ) } diff --git a/src/components/icons/Beefy.tsx b/src/components/icons/Beefy.tsx index 7035fcd6a..c3393a5d8 100644 --- a/src/components/icons/Beefy.tsx +++ b/src/components/icons/Beefy.tsx @@ -1,6 +1,8 @@ -import { Image, ImageProps } from 'theme-ui' +interface BeefyProps extends React.ImgHTMLAttributes { + width?: number | string +} -const Beefy = (props: ImageProps) => { - return +const Beefy = ({ width = 16, ...props }: BeefyProps) => { + return } export default Beefy diff --git a/src/components/icons/Camelot.tsx b/src/components/icons/Camelot.tsx index 9c4758384..748f0c913 100644 --- a/src/components/icons/Camelot.tsx +++ b/src/components/icons/Camelot.tsx @@ -1,6 +1,8 @@ -import { Image, ImageProps } from 'theme-ui' +interface CamelotProps extends React.ImgHTMLAttributes { + width?: number | string +} -const Camelot = (props: ImageProps) => { - return +const Camelot = ({ width = 16, ...props }: CamelotProps) => { + return } export default Camelot diff --git a/src/components/icons/Concentrator.tsx b/src/components/icons/Concentrator.tsx index a25adb232..17f8d8ee0 100644 --- a/src/components/icons/Concentrator.tsx +++ b/src/components/icons/Concentrator.tsx @@ -1,6 +1,8 @@ -import { Image, ImageProps } from 'theme-ui' +interface ConcentratorProps extends React.ImgHTMLAttributes { + width?: number | string +} -const Concentrator = (props: ImageProps) => { - return +const Concentrator = ({ width = 16, ...props }: ConcentratorProps) => { + return } export default Concentrator diff --git a/src/components/icons/DivaIcon.tsx b/src/components/icons/DivaIcon.tsx index 04cac07b9..6e43cc018 100644 --- a/src/components/icons/DivaIcon.tsx +++ b/src/components/icons/DivaIcon.tsx @@ -1,6 +1,8 @@ -import { Image, ImageProps } from 'theme-ui' +interface DivaIconProps extends React.ImgHTMLAttributes { + width?: number | string +} -const DivaIcon = (props: ImageProps) => { - return +const DivaIcon = ({ width = 20, ...props }: DivaIconProps) => { + return } export default DivaIcon diff --git a/src/components/icons/StackedChainLogo.tsx b/src/components/icons/StackedChainLogo.tsx index f5f766ceb..ff833b023 100644 --- a/src/components/icons/StackedChainLogo.tsx +++ b/src/components/icons/StackedChainLogo.tsx @@ -1,16 +1,15 @@ -import { Box, BoxProps } from 'theme-ui' +import { cn } from '@/lib/utils' import ChainLogo from './ChainLogo' -interface Props extends BoxProps { +interface Props extends React.HTMLAttributes { chains: number[] } // Shows ethereum/base stacked logos to indicate multichain -const StackedChainLogo = ({ chains, ...props }: Props) => ( - ( +
{[...chains].reverse().map((chain, index) => ( @@ -20,7 +19,7 @@ const StackedChainLogo = ({ chains, ...props }: Props) => ( style={{ position: 'absolute', left: -(index * 10) }} /> ))} - +
) export default StackedChainLogo diff --git a/src/components/icons/TokenLogo.tsx b/src/components/icons/TokenLogo.tsx index de43e0ae6..422b3ba5c 100644 --- a/src/components/icons/TokenLogo.tsx +++ b/src/components/icons/TokenLogo.tsx @@ -2,10 +2,10 @@ import useRToken from 'hooks/useRToken' import { useAtomValue } from 'jotai' import React from 'react' import { rTokenMetaAtom } from 'state/rtoken/atoms/rTokenAtom' -import { Box, BoxProps, Image } from 'theme-ui' +import { cn } from '@/lib/utils' import ChainLogo from './ChainLogo' -interface Props extends BoxProps { +interface Props extends React.HTMLAttributes { symbol?: string width?: number | string src?: string @@ -118,9 +118,10 @@ const TokenImage = React.memo( width?: number | string }) => { return ( - { currentTarget.onerror = null // prevents looping currentTarget.src = '/svgs/defaultLogo.svg' @@ -136,7 +137,8 @@ const TokenLogo = ({ chain, width = 20, bordered = false, - sx = {}, + className, + style, ...props }: Props) => { let imgSrc = src @@ -162,32 +164,24 @@ const TokenLogo = ({ } return ( - {!!chain && ( - - + )} - + ) } -interface TCurrentRTokenLogo extends BoxProps { +interface TCurrentRTokenLogo extends React.HTMLAttributes { width?: number } export const CurrentRTokenLogo = ({ width = 20, + className, ...props }: TCurrentRTokenLogo) => { const rToken = useAtomValue(rTokenMetaAtom) return ( - +
- +
) } diff --git a/src/components/icons/logos/Aerodrome.tsx b/src/components/icons/logos/Aerodrome.tsx index 9fa8ea01c..df43585a2 100644 --- a/src/components/icons/logos/Aerodrome.tsx +++ b/src/components/icons/logos/Aerodrome.tsx @@ -1,6 +1,8 @@ -import { Image, ImageProps } from 'theme-ui' +interface AerodromeProps extends React.ImgHTMLAttributes { + width?: number | string +} -const Aerodrome = (props: ImageProps) => { - return +const Aerodrome = ({ width = 16, ...props }: AerodromeProps) => { + return } export default Aerodrome diff --git a/src/components/icons/logos/Curve.tsx b/src/components/icons/logos/Curve.tsx index a75dbeaea..8b330796e 100644 --- a/src/components/icons/logos/Curve.tsx +++ b/src/components/icons/logos/Curve.tsx @@ -1,7 +1,9 @@ -import { Image, ImageProps } from 'theme-ui' +interface CurveProps extends React.ImgHTMLAttributes { + width?: number | string +} -const Curve = (props: ImageProps) => { - return +const Curve = ({ width = 16, ...props }: CurveProps) => { + return } export default Curve diff --git a/src/components/icons/logos/Dinero.tsx b/src/components/icons/logos/Dinero.tsx index ec1745ee0..db4c2ae19 100644 --- a/src/components/icons/logos/Dinero.tsx +++ b/src/components/icons/logos/Dinero.tsx @@ -1,6 +1,8 @@ -import { Image, ImageProps } from 'theme-ui' +interface DineroProps extends React.ImgHTMLAttributes { + width?: number | string +} -const Dinero = (props: ImageProps) => { - return +const Dinero = ({ width = 16, ...props }: DineroProps) => { + return } export default Dinero diff --git a/src/components/icons/logos/Dyson.tsx b/src/components/icons/logos/Dyson.tsx index 7d8b25815..487af5c25 100644 --- a/src/components/icons/logos/Dyson.tsx +++ b/src/components/icons/logos/Dyson.tsx @@ -1,6 +1,8 @@ -import { Image, ImageProps } from 'theme-ui' +interface DysonProps extends React.ImgHTMLAttributes { + width?: number | string +} -const Dyson = (props: ImageProps) => { - return +const Dyson = ({ width = 16, ...props }: DysonProps) => { + return } export default Dyson diff --git a/src/components/icons/logos/Ethena.tsx b/src/components/icons/logos/Ethena.tsx index 033578ce8..2f00437b5 100644 --- a/src/components/icons/logos/Ethena.tsx +++ b/src/components/icons/logos/Ethena.tsx @@ -1,6 +1,8 @@ -import { Image, ImageProps } from 'theme-ui' +interface EthenaProps extends React.ImgHTMLAttributes { + width?: number | string +} -const Ethena = (props: ImageProps) => { - return +const Ethena = ({ width = 16, ...props }: EthenaProps) => { + return } export default Ethena diff --git a/src/components/icons/logos/Etherfi.tsx b/src/components/icons/logos/Etherfi.tsx index b975365ba..74e38613a 100644 --- a/src/components/icons/logos/Etherfi.tsx +++ b/src/components/icons/logos/Etherfi.tsx @@ -1,12 +1,15 @@ -import { Image, ImageProps } from 'theme-ui' +interface EtherfiProps extends React.ImgHTMLAttributes { + width?: number +} -const Origin = (props: ImageProps) => { +const Etherfi = ({ width = 16, ...props }: EtherfiProps) => { return ( - Etherfi ) } -export default Origin +export default Etherfi diff --git a/src/components/icons/logos/Merkl.tsx b/src/components/icons/logos/Merkl.tsx index 39efda3d6..83b84c552 100644 --- a/src/components/icons/logos/Merkl.tsx +++ b/src/components/icons/logos/Merkl.tsx @@ -1,6 +1,8 @@ -import { Image, ImageProps } from 'theme-ui' +interface MerklProps extends React.ImgHTMLAttributes { + width?: number | string +} -const Merkl = (props: ImageProps) => { - return +const Merkl = ({ width = 16, ...props }: MerklProps) => { + return } export default Merkl diff --git a/src/components/icons/logos/Origin.tsx b/src/components/icons/logos/Origin.tsx index 18b7ce71b..1c7e31ee8 100644 --- a/src/components/icons/logos/Origin.tsx +++ b/src/components/icons/logos/Origin.tsx @@ -1,8 +1,10 @@ -import { Image, ImageProps } from 'theme-ui' +interface OriginProps extends React.ImgHTMLAttributes { + width?: number | string +} -const Origin = (props: ImageProps) => { +const Origin = ({ width = 16, ...props }: OriginProps) => { return ( - + ) } export default Origin diff --git a/src/components/icons/logos/Sky.tsx b/src/components/icons/logos/Sky.tsx index 18ac52df4..b82fc39aa 100644 --- a/src/components/icons/logos/Sky.tsx +++ b/src/components/icons/logos/Sky.tsx @@ -1,8 +1,10 @@ -import { Image, ImageProps } from 'theme-ui' +interface SkyProps extends React.ImgHTMLAttributes { + width?: number | string +} -const Sky = (props: ImageProps) => { +const Sky = ({ width = 16, ...props }: SkyProps) => { return ( - + ) } export default Sky diff --git a/src/components/icons/logos/Stader.tsx b/src/components/icons/logos/Stader.tsx index 73d0d787a..81efa95ec 100644 --- a/src/components/icons/logos/Stader.tsx +++ b/src/components/icons/logos/Stader.tsx @@ -1,6 +1,8 @@ -import { Image, ImageProps } from 'theme-ui' +interface StaderProps extends React.ImgHTMLAttributes { + width?: number | string +} -const Stader = (props: ImageProps) => { - return +const Stader = ({ width = 16, ...props }: StaderProps) => { + return } export default Stader diff --git a/src/components/index.ts b/src/components/index.ts deleted file mode 100644 index 7c3ef0d5e..000000000 --- a/src/components/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -// Base components -export { default as Input } from './old/input' -export { default as NumericalInput } from './old/numerical-input' -export { default as Button } from './old/button' -export { default as Modal } from './old/modal' -export { default as Card, TitleCard } from './old/card' -export { default as Container } from './old/container' -export { default as InfoBox } from './old/info-box' diff --git a/src/components/index.tsx b/src/components/index.tsx new file mode 100644 index 000000000..305c77b2f --- /dev/null +++ b/src/components/index.tsx @@ -0,0 +1,6 @@ +// Base components (migrated to shadcn) +export { Input, NumericalInput } from './ui/input' +export { Button, buttonVariants } from './ui/button' +export type { ButtonProps } from './ui/button' +export { default as Modal } from './ui/modal' +export type { ModalProps } from './ui/modal' diff --git a/src/components/layout/header/components/app-header.tsx b/src/components/layout/header/components/app-header.tsx index 6c2d563ef..ad6b0db47 100644 --- a/src/components/layout/header/components/app-header.tsx +++ b/src/components/layout/header/components/app-header.tsx @@ -1,5 +1,5 @@ import CommandMenu from '@/components/command-menu' -import ThemeColorMode from '@/components/dark-mode-toggle/ThemeColorMode' +import DarkModeToggle from '@/components/dark-mode-toggle' import { cn } from '@/lib/utils' import Account from 'components/account' import { ReactNode } from 'react' @@ -33,21 +33,7 @@ const AppHeader = () => (
- +
diff --git a/src/components/layout/navigation/TokenNavigation.tsx b/src/components/layout/navigation/TokenNavigation.tsx index 104ad0ee3..e9410f3c7 100644 --- a/src/components/layout/navigation/TokenNavigation.tsx +++ b/src/components/layout/navigation/TokenNavigation.tsx @@ -6,12 +6,12 @@ import ManagerIcon from 'components/icons/ManagerIcon' import StakeIcon from 'components/icons/StakeIcon' import { CurrentRTokenLogo } from 'components/icons/TokenLogo' import { navigationIndexAtom } from 'components/section-navigation/atoms' -import useSectionNavigate from 'components/section-navigation/useSectionNavigate' +import useSectionNavigate from '@/components/section-navigation/use-section-navigate' import { useAtomValue } from 'jotai' import React, { useEffect, useMemo, useState } from 'react' import { ChevronDown, ChevronRight } from 'lucide-react' import { NavLink, useNavigate } from 'react-router-dom' -import { Box, Flex, Text } from 'theme-ui' +import { cn } from '@/lib/utils' import { ROUTES } from 'utils/constants' interface SubNavItem { @@ -44,7 +44,7 @@ const SubNavigation = ({ const current = useAtomValue(navigationIndexAtom) const handleSubnav = ( - e: React.MouseEvent, + e: React.MouseEvent, index: number ) => { e.preventDefault() @@ -60,28 +60,21 @@ const SubNavigation = ({ const active = Math.min(...current) return ( - +
    {items.map(({ label, id }, currentIndex) => { const isActive = active === currentIndex return ( - handleSubnav(e, currentIndex)} key={id} > {label} - + ) })} - +
) } @@ -113,50 +106,34 @@ const NavContent = ({ return ( <> - - +
{icon} - - + {label} - + {!!subnav && ( - {expanded ? : } - +
)} -
+ {!!subnav && expanded && ( )} @@ -166,11 +143,7 @@ const NavContent = ({ const NavItem = (props: NavigationItem) => ( {({ isActive }) => } @@ -233,33 +206,27 @@ const TokenNavigation = () => { ) return ( - - {navigation.map((props) => ( ))} - - + + ) } export default React.memo(TokenNavigation) diff --git a/src/components/layout/navigation/index.tsx b/src/components/layout/navigation/index.tsx index 72bdd45ab..890a264b6 100644 --- a/src/components/layout/navigation/index.tsx +++ b/src/components/layout/navigation/index.tsx @@ -11,8 +11,6 @@ import mixpanel from 'mixpanel-browser/src/loaders/loader-module-core' import { useEffect, useMemo } from 'react' import { NavLink } from 'react-router-dom' import { chainIdAtom, selectedRTokenAtom } from 'state/atoms' -import { transition } from 'theme' -import { Box, NavLinkProps, Text } from 'theme-ui' import { ROUTES } from 'utils/constants' import RSV from 'utils/rsv' @@ -22,63 +20,33 @@ interface Item { Icon: React.ElementType } -interface NavItemProps extends Item, Omit { +interface NavItemProps extends Item { rTokenAddress: string - to?: any } const MenuItem = ({ title, Icon }: Omit) => { return ( - +
- + {title} - - + +
) } -const NavItem = ({ - path, - title, - Icon, - rTokenAddress, - ...props -}: NavItemProps) => { +const NavItem = ({ path, title, Icon, rTokenAddress }: NavItemProps) => { const chainId = useAtomValue(chainIdAtom) return ( ({ - textDecoration: 'none', - marginLeft: 12, - marginRight: 12, - paddingBottom: '12px', - paddingTop: '12px', - opacity: isActive ? '1' : '0.68', - color: 'inherit', - lineHeight: '32px', - boxShadow: isActive - ? 'inset 0 0px 0px var(--theme-ui-colors-background), inset 0 -2px 0px currentColor, inset 0 0px 0px var(--theme-ui-colors-background)' - : 'none', - display: 'flex', - })} + className={({ isActive }) => + `no-underline mx-3 py-3 flex ${ + isActive + ? 'opacity-100 shadow-[inset_0_0px_0px_var(--background),inset_0_-2px_0px_currentColor]' + : 'opacity-70' + }` + } to={`${path}?token=${rTokenAddress}&chainId=${chainId}`} onClick={() => mixpanel.track('Selected RToken NavItem', { @@ -86,7 +54,6 @@ const NavItem = ({ Target: path.slice(1), }) } - {...props} > @@ -130,7 +97,7 @@ const Navigation = () => { }, [rTokenAddress]) return ( - +
{pages.map((item) => ( { rTokenAddress={rTokenAddress ?? ''} /> ))} - +
) } diff --git a/src/components/old/alert/index.tsx b/src/components/old/alert/index.tsx deleted file mode 100644 index 3ae65e4fd..000000000 --- a/src/components/old/alert/index.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import { AlertCircle } from 'lucide-react' -import { Box, BoxProps, Text } from 'theme-ui' - -interface Props extends BoxProps { - text: string -} - -const Alert = ({ text, ...props }: Props) => ( - - - - {text} - - -) - -export default Alert diff --git a/src/components/old/boxes/CollapsableBox.tsx b/src/components/old/boxes/CollapsableBox.tsx deleted file mode 100644 index d27051385..000000000 --- a/src/components/old/boxes/CollapsableBox.tsx +++ /dev/null @@ -1,51 +0,0 @@ -import { useState } from 'react' -import { ChevronDown, ChevronUp } from 'lucide-react' -import { Box, BoxProps, Divider, Flex } from 'theme-ui' - -interface Props extends Omit { - defaultOpen?: boolean - open?: boolean - divider?: boolean - onToggle?(state: boolean): void - header: React.ReactNode -} - -const CollapsableBox = ({ - defaultOpen = false, - open, - onToggle, - children, - divider = true, - header, - ...props -}: Props) => { - const [isOpen, setOpen] = useState(defaultOpen) - - return ( - - { - if (onToggle) { - onToggle(!open) - } else { - setOpen(!isOpen) - } - }} - > - {header} - - {open || isOpen ? : } - - - {(open || isOpen) && ( - <> - {divider && } - {children} - - )} - - ) -} - -export default CollapsableBox diff --git a/src/components/old/boxes/SelectableBox.tsx b/src/components/old/boxes/SelectableBox.tsx deleted file mode 100644 index 02405a5dd..000000000 --- a/src/components/old/boxes/SelectableBox.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import { Box, BoxProps, Checkbox } from 'theme-ui' - -interface Props extends BoxProps { - selected?: boolean // controlled component - onSelect(): void - unavailable?: boolean - unavailableComponent?: React.ReactNode -} - -const SelectableBox = ({ - onSelect, - unavailable = false, - unavailableComponent, - selected, - children, - ...props -}: Props) => ( - - {children} - - {((unavailable && !unavailableComponent) || !unavailable) && ( - - - - )} - {unavailable && !!unavailableComponent && ( - {unavailableComponent} - )} - - -) - -export default SelectableBox diff --git a/src/components/old/button/ButtonGroup.tsx b/src/components/old/button/ButtonGroup.tsx deleted file mode 100644 index 6bb7f5870..000000000 --- a/src/components/old/button/ButtonGroup.tsx +++ /dev/null @@ -1,61 +0,0 @@ -import { FC, useState } from 'react' -import { Box } from 'theme-ui' -import Button from '.' - -type ButtonGroupItem = { - label: string - onClick: () => void -} - -type ButtonGroupProps = { - buttons: ButtonGroupItem[] - startActive?: number -} - -const ButtonGroup: FC = ({ buttons, startActive = 0 }) => { - const [active, setActive] = useState(startActive) - - return ( - - {buttons.map((button, index) => ( - - ))} - - ) -} - -export default ButtonGroup diff --git a/src/components/old/button/Close.tsx b/src/components/old/button/Close.tsx deleted file mode 100644 index c5cbec0d9..000000000 --- a/src/components/old/button/Close.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import { Box, ButtonProps } from 'theme-ui' - -const Close = (props: ButtonProps) => - -export default Close diff --git a/src/components/old/button/CopyValue.tsx b/src/components/old/button/CopyValue.tsx deleted file mode 100644 index f33132d42..000000000 --- a/src/components/old/button/CopyValue.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import { t } from '@lingui/macro' -import { MouseoverTooltip } from '@/components/old/tooltip' -import { useState } from 'react' -import CopyIcon from 'components/icons/CopyIcon' -import { ButtonProps, IconButton } from 'theme-ui' -import { Placement } from '@popperjs/core' - -interface Props extends ButtonProps { - text?: string - value: string - size?: number - placement?: Placement -} - -const CopyValue = ({ - text, - value, - size = 16, - placement = 'left', - ...props -}: Props) => { - const copyText = text || t`Copy to clipboard` - const confirmText = t`Copied to clipboard!` - const [displayText, setDisplayText] = useState(copyText) - - const handleClose = () => { - setDisplayText(copyText) - } - - const handleCopy = () => { - navigator.clipboard.writeText(value) - setDisplayText(confirmText) - } - - return ( - - { - e.stopPropagation() - handleCopy() - }} - {...props} - > - - - - ) -} - -export default CopyValue diff --git a/src/components/old/button/GoTo.tsx b/src/components/old/button/GoTo.tsx deleted file mode 100644 index 3132c92ab..000000000 --- a/src/components/old/button/GoTo.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import ExternalArrowIcon from 'components/icons/ExternalArrowIcon' -import { Link, LinkProps, Text } from 'theme-ui' - -const GoTo = ({ color, ...props }: LinkProps) => { - return ( - e.stopPropagation()} - > - - - - - ) -} - -export default GoTo diff --git a/src/components/old/button/index.tsx b/src/components/old/button/index.tsx deleted file mode 100644 index 2d3c86fb2..000000000 --- a/src/components/old/button/index.tsx +++ /dev/null @@ -1,95 +0,0 @@ -import { ReactNode } from 'react' -import { X } from 'lucide-react' -import { mediumButton, smallButton } from 'theme' -import { - Button as ThemeButton, - ButtonProps as _ButtonProps, - Spinner, - Text, -} from 'theme-ui' - -export interface ButtonProps extends _ButtonProps { - small?: boolean - medium?: boolean - fullWidth?: boolean -} - -const Button = ({ - sx = {}, - small, - medium, - fullWidth, - ...props -}: ButtonProps) => { - let styles = sx - - if (small) { - styles = { ...sx, ...smallButton } - } else if (medium) { - styles = { ...sx, ...mediumButton } - } - - if (fullWidth) { - styles = { ...styles, width: '100%' } - } - - return -} - -export interface LoadingButtonProps extends ButtonProps { - loading?: boolean - loadingText?: string - text: ReactNode -} - -export const LoadingButton = ({ - loading, - text, - onClick, - loadingText = 'Pending, Sign in wallet', - ...props -}: LoadingButtonProps) => ( - -) - -export const SmallButton = ({ sx = {}, ...props }: ButtonProps) => ( - -) - -export default Button diff --git a/src/components/old/card/index.tsx b/src/components/old/card/index.tsx deleted file mode 100644 index 8b2377373..000000000 --- a/src/components/old/card/index.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import { - Box, - Card as ThemeCard, - CardProps, - Divider, - Flex, - Text, -} from 'theme-ui' - -const Card = ThemeCard - -interface TitleCardProps extends CardProps { - title?: string - customTitle?: React.ReactNode - right?: any -} - -export const TitleCard = ({ - title, - customTitle, - right = null, - children, - ...props -}: TitleCardProps) => ( - - - {customTitle ? customTitle : {title}} - - {right} - - - {children} - -) - -export default Card diff --git a/src/components/old/container/index.tsx b/src/components/old/container/index.tsx deleted file mode 100644 index b6f972f01..000000000 --- a/src/components/old/container/index.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import { Box, BoxProps } from 'theme-ui' - -/** - * Wraps the page content - * - * @param {ReactNode} children - * @returns - */ -const Container = ({ sx = {}, ...props }: BoxProps) => ( - - - -) - -export default Container diff --git a/src/components/old/expandable-content/index.tsx b/src/components/old/expandable-content/index.tsx deleted file mode 100644 index aff682042..000000000 --- a/src/components/old/expandable-content/index.tsx +++ /dev/null @@ -1,42 +0,0 @@ -import { useState } from 'react' -import { Minus, Plus } from 'lucide-react' -import { Box, BoxProps, Text } from 'theme-ui' - -export interface ExpandableContentProps - extends Omit { - title: React.ReactNode - content: React.ReactNode - expanded?: boolean -} - -const ExpandableContent = ({ - title, - content, - expanded = false, - ...props -}: ExpandableContentProps) => { - const [isOpen, setOpen] = useState(expanded) - - return ( - - setOpen(!isOpen)} - > - - {title} - - {isOpen ? : } - - {isOpen && ( - - {content} - - )} - - ) -} - -export default ExpandableContent diff --git a/src/components/old/info-box/index.tsx b/src/components/old/info-box/index.tsx deleted file mode 100644 index 8964a97ca..000000000 --- a/src/components/old/info-box/index.tsx +++ /dev/null @@ -1,150 +0,0 @@ -import CopyValue from '@/components/old/button/CopyValue' -import GoTo from '@/components/old/button/GoTo' -import Help from 'components/help' -import { useAtomValue } from 'jotai' -import React from 'react' -import { chainIdAtom } from 'state/atoms' -import { Box, BoxProps, Flex, Text } from 'theme-ui' -import { ExplorerDataType, getExplorerLink } from 'utils/getExplorerLink' - -// TODO: Change component structure for "InfoBoxes" or something more generic -interface Props extends BoxProps { - title: string - subtitle?: React.ReactNode - help?: string - icon?: React.ReactNode - light?: boolean - address?: string - right?: React.ReactNode - addressType?: ExplorerDataType -} -const InfoBox = ({ title, subtitle, light, ...props }: Props) => ( - - - {title} - - - {subtitle} - - -) - -export const ContentHead = ({ title, subtitle, ...props }: Props) => ( - - - {title} - - {!!subtitle && ( - - {subtitle} - - )} - -) - -export const InfoHeading = ({ title, subtitle, help, ...props }: Props) => ( - - - - {title} - - {!!help && ( - { - return

{i}

- })} - /> - )} -
- {!!subtitle && {subtitle}} -
-) - -export const InfoItem = ({ - title, - subtitle, - help, - address, - icon, - right, - addressType = ExplorerDataType.ADDRESS, - ...props -}: Props) => { - const chainId = useAtomValue(chainIdAtom) - - return ( - - {icon} - - - - {title} - - {!!help && } - - {!!subtitle && subtitle} - - {!!address && ( - - - - - )} - {!!right && ( - - {right} - - )} - - ) -} - -interface InfoProps extends Omit { - title: React.ReactNode | string - subtitle: React.ReactNode | string - icon?: React.ReactNode -} - -export const Info = ({ title, subtitle, icon = null, ...props }: InfoProps) => ( - - {icon} - - - {title} - - - {subtitle} - - - -) - -export default InfoBox diff --git a/src/components/old/info-icon/index.tsx b/src/components/old/info-icon/index.tsx deleted file mode 100644 index 179374371..000000000 --- a/src/components/old/info-icon/index.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import Help from 'components/help' -import { BoxProps, Box, Flex, Text } from 'theme-ui' - -export interface IconInfoProps extends BoxProps { - icon: any - text: string - title: string - help?: string -} - -const IconInfo = ({ icon, sx, title, text, help, ...props }: IconInfoProps) => ( - - {icon} - - - {title} - {!!help && } - - {text} - - -) - -export default IconInfo diff --git a/src/components/old/input/index.tsx b/src/components/old/input/index.tsx deleted file mode 100644 index 7b770f3af..000000000 --- a/src/components/old/input/index.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import { useCallback } from 'react' -import { Search } from 'lucide-react' -import { - Box, - Input as ThemeInput, - InputProps as ThemeInputProps, -} from 'theme-ui' - -interface InputProps extends Omit { - onChange(value: string): void -} - -const Input = ({ onChange, ...props }: InputProps) => { - const handleChange = useCallback( - (event: any) => { - onChange(event.target.value) - }, - [onChange] - ) - - return -} - -export const SearchInput = (props: InputProps) => { - return ( - - - - - ) -} - -export default Input diff --git a/src/components/old/modal/ModalAlert.tsx b/src/components/old/modal/ModalAlert.tsx deleted file mode 100644 index a20c15268..000000000 --- a/src/components/old/modal/ModalAlert.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import { Box, Button, Flex } from 'theme-ui' - -const ModalAlert = ({ - onClose, - children, -}: { - children: any - onClose?(): void - title?: string - subtitle?: string -}) => { - return ( - <> - - - {children} - {!!onClose && ( - - )} - - - ) -} - -export default ModalAlert diff --git a/src/components/old/modal/index.tsx b/src/components/old/modal/index.tsx deleted file mode 100644 index 5560d8c4e..000000000 --- a/src/components/old/modal/index.tsx +++ /dev/null @@ -1,140 +0,0 @@ -import { forwardRef, useEffect, useRef } from 'react' -import { createPortal } from 'react-dom' -import { X } from 'lucide-react' -import { Box, BoxProps, Button, Divider, Flex, Text } from 'theme-ui' - -export interface ModalProps extends BoxProps { - title?: string - onClose?(): void // unclosable modal if this is not defined - width?: string | number - closeOnClickAway?: boolean - titleProps?: any - hideCloseButton?: boolean -} - -const Overlay = (props: BoxProps) => ( - -) - -const Dialog = forwardRef( - ({ width = '420px', sx = {}, ...props }, ref) => ( - - ) -) - -const Header = ({ - title, - onClose, - titleProps = {}, - hideCloseButton, -}: ModalProps) => { - if ((!title && !onClose) || hideCloseButton) { - return null - } - - return ( - <> - - - {title && title} - - {!!onClose && ( - - )} - - - ) -} - -const Modal = ({ - children, - closeOnClickAway = false, - hideCloseButton = false, - ...props -}: ModalProps) => { - const dialogRef = useRef(null) - - useEffect(() => { - const keyDownHandler = (event: any) => { - if (event.key === 'Escape') { - event.preventDefault() - props.onClose?.() - } - } - - const handleClickOutside = (event: any) => { - if ( - closeOnClickAway && - dialogRef.current && - !dialogRef.current.contains(event.target) - ) { - props.onClose?.() - } - } - - document.addEventListener('keydown', keyDownHandler) - document.addEventListener('mousedown', handleClickOutside) - - return () => { - document.removeEventListener('keydown', keyDownHandler) - document.removeEventListener('mousedown', handleClickOutside) - } - }, [closeOnClickAway]) - - return createPortal( - - -
- {children} -
-
, - document.body - ) -} - -export default Modal diff --git a/src/components/old/numerical-input/NumericalInput.tsx b/src/components/old/numerical-input/NumericalInput.tsx deleted file mode 100644 index 7db80880e..000000000 --- a/src/components/old/numerical-input/NumericalInput.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import { Input } from 'components' -import { InputProps as ThemeInputProps } from 'theme-ui' - -const inputRegex = RegExp(`^[0-9]*[.]?[0-9]*$`) - -interface InputProps extends Omit { - onChange(value: string): void -} - -const NumericalInput = ({ onChange, ...props }: InputProps) => { - const handleChange = (value: string) => { - const input = value.replace(/,/g, '.') - if (value === '' || inputRegex.test(input)) { - onChange(input) - } - } - - return ( - - ) -} - -export default NumericalInput diff --git a/src/components/old/numerical-input/index.ts b/src/components/old/numerical-input/index.ts deleted file mode 100644 index 92d4b0bfa..000000000 --- a/src/components/old/numerical-input/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default } from './NumericalInput' diff --git a/src/components/old/popover/index.tsx b/src/components/old/popover/index.tsx deleted file mode 100644 index fc5d27c3d..000000000 --- a/src/components/old/popover/index.tsx +++ /dev/null @@ -1,175 +0,0 @@ -import { Options, Placement } from '@popperjs/core' -import useOnClickOutside from 'hooks/useOnClickOutside' -import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react' -import { usePopper } from 'react-popper' -import { createPortal } from 'react-dom' -import { StringMap } from 'types' -import { Box, BoxProps } from 'theme-ui' -import useInterval from '@/hooks/useInterval' - -const PopoverContainer = React.forwardRef< - HTMLDivElement, - BoxProps & { show: boolean } ->(({ show, sx, ...props }, ref) => ( - -)) - -const Arrow = React.forwardRef( - ({ sx, ...props }, ref) => ( - - ) -) - -export interface PopoverProps { - content: React.ReactNode - zIndex?: number - show: boolean - children: React.ReactNode - placement?: Placement - arrow?: boolean - onDismiss?: () => void - containerProps?: StringMap -} - -export default function Popover({ - zIndex = 100010, - content, - show, - children, - placement = 'auto', - arrow = false, - onDismiss = undefined, -}: PopoverProps) { - const [referenceElement, setReferenceElement] = - useState(null) - const popperElement = useRef(null) - const [arrowElement, setArrowElement] = useState(null) - - const options = useMemo( - (): Options => ({ - placement, - strategy: 'fixed', - modifiers: [ - { name: 'offset', options: { offset: [8, 8] } }, - { name: 'arrow', options: { element: arrowElement } }, - { name: 'preventOverflow', options: { padding: 8 } }, - ], - }), - [arrowElement, placement] - ) - - const handleDismiss = (event: TouchEvent | MouseEvent) => { - if (referenceElement?.contains(event.target as Node)) { - return - } - - return onDismiss && onDismiss() - } - - // Only applicable if onDismiss is send - useOnClickOutside(popperElement, handleDismiss) - - const { styles, update, attributes } = usePopper( - referenceElement, - popperElement.current, - options - ) - - const updateCallback = useCallback(() => { - if (update) { - update() - } - }, [update]) - useInterval(updateCallback, show ? 200 : null) - - useEffect(() => { - if (show) { - updateCallback() - } - }, [show]) - - return ( - <> - setReferenceElement(element)}> - {children} - - {createPortal( - - {content} - {arrow && ( - - )} - , - document.body - )} - - ) -} diff --git a/src/components/old/popup/index.tsx b/src/components/old/popup/index.tsx deleted file mode 100644 index 996a3dd9a..000000000 --- a/src/components/old/popup/index.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import { Box } from 'theme-ui' -import Popover, { PopoverProps } from '../popover' - -const Popup = ({ content, containerProps = {}, ...props }: PopoverProps) => { - return ( - - {content} - - } - /> - ) -} - -export default Popup diff --git a/src/components/old/table/components/TablePagination.tsx b/src/components/old/table/components/TablePagination.tsx deleted file mode 100644 index 5a4496e74..000000000 --- a/src/components/old/table/components/TablePagination.tsx +++ /dev/null @@ -1,95 +0,0 @@ -import { t } from '@lingui/macro' -import { Table } from '@tanstack/react-table' -import { SmallButton } from '@/components/old/button' -import Help from 'components/help' -import { Box, BoxProps, Text } from 'theme-ui' - -export interface TablePaginationProps extends BoxProps { - table: Table - totalCount: number -} - -const TablePagination = ({ table, totalCount }: TablePaginationProps) => { - const canPreviousPage = table.getCanPreviousPage() - const canNextPage = table.getCanNextPage() - - return ( - - - {(canPreviousPage || canNextPage) && ( - - - table.setPageIndex(0)} - disabled={!canPreviousPage} - > - {'<<'} - - - - table.previousPage()} - disabled={!canPreviousPage} - > - {'<'} - - - - table.nextPage()} - disabled={!canNextPage} - > - {'>'} - - - - table.setPageIndex(table.getPageCount() - 1)} - disabled={!canNextPage} - > - {'>>'} - - - - )} - {/* - - */} - - {totalCount} records - - - - ) -} - -export default TablePagination diff --git a/src/components/old/table/components/TablePlaceholder.tsx b/src/components/old/table/components/TablePlaceholder.tsx deleted file mode 100644 index 73849cb22..000000000 --- a/src/components/old/table/components/TablePlaceholder.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import { borderRadius } from 'theme' -import { BoxProps, Flex, Text } from 'theme-ui' - -interface Props extends BoxProps { - icon?: boolean // TODO: custom icon? - text?: string - loading?: boolean -} - -const defaultText = 'No data found' - -const TablePlaceholder = ({ - icon = false, - text = defaultText, - loading = false, - ...props -}: Props) => ( - - {text} - -) - -export default TablePlaceholder diff --git a/src/components/old/table/index.tsx b/src/components/old/table/index.tsx deleted file mode 100644 index a022437b3..000000000 --- a/src/components/old/table/index.tsx +++ /dev/null @@ -1,199 +0,0 @@ -import { - SortingState, - flexRender, - getCoreRowModel, - getExpandedRowModel, - getPaginationRowModel, - getSortedRowModel, - useReactTable, - Row, -} from '@tanstack/react-table' -import React, { Fragment, useCallback, useMemo, useState } from 'react' -import { ArrowDown, ArrowUp } from 'lucide-react' -import { Box, BoxProps, Flex } from 'theme-ui' -import { StringMap } from 'types' -import TablePagination from './components/TablePagination' -import Skeleton from 'react-loading-skeleton' - -export interface TableProps extends BoxProps { - columns: any[] // figure out proper type - data: StringMap[] - compact?: boolean - sorting?: boolean - pagination?: boolean | { pageSize: number } - onSort?(state: SortingState): void - defaultPageSize?: number - onRowClick?(data: any, row: Row): void - sortBy?: SortingState - maxHeight?: string | number - isLoading?: boolean - columnVisibility?: (string | string[])[] - renderSubComponent?: (props: { row: Row }) => React.ReactElement -} - -export function Table({ - columns, - data = [], - sorting = false, - compact = false, - pagination, - isLoading = false, - defaultPageSize = 10, - maxHeight = 'auto', - sx = {}, - columnVisibility, - renderSubComponent, - sortBy = [], - onRowClick, - onSort, - ...props -}: TableProps) { - const [sortingState, setSorting] = useState(sortBy) - const paginationState = useMemo( - () => ({ pageSize: defaultPageSize, pageIndex: 0 }), - [defaultPageSize] - ) - - const handleSort = useCallback( - (state: any) => { - setSorting(state) - onSort?.(state) - }, - [onSort, setSorting] - ) - - const table = useReactTable({ - columns, - data, - getCoreRowModel: getCoreRowModel(), - getSortedRowModel: getSortedRowModel(), - getExpandedRowModel: getExpandedRowModel(), - getPaginationRowModel: !!pagination ? getPaginationRowModel() : undefined, - enableSorting: sorting, - initialState: { - pagination: paginationState, - }, - state: { - sorting: sortingState, - }, - onSortingChange: handleSort, - }) - - return ( - - - - {table.getHeaderGroups().map((headerGroup) => ( - - {headerGroup.headers.map((header, index) => ( - - - - {flexRender( - header.column.columnDef.header, - header.getContext() - )} - - {{ - asc: , - desc: , - }[header.column.getIsSorted() as string] ?? null} - - - ))} - - ))} - {table.getRowModel().rows.map((row) => { - return ( - - onRowClick(row.original, row) - : undefined - } - sx={{ cursor: !!onRowClick ? 'pointer' : 'inherit' }} - > - {row.getVisibleCells().map((cell, index) => ( - - {flexRender( - cell.column.columnDef.cell, - cell.getContext() - )} - - ))} - - {!!renderSubComponent && row.getIsExpanded() && ( - - {/* 2nd row is a custom 1 cell row */} - - {renderSubComponent({ row })} - - - )} - - ) - })} - - - {isLoading && ( - - )} - {pagination && } - - ) -} diff --git a/src/components/old/tooltip/index.tsx b/src/components/old/tooltip/index.tsx deleted file mode 100644 index 02507ca0a..000000000 --- a/src/components/old/tooltip/index.tsx +++ /dev/null @@ -1,110 +0,0 @@ -/** @jsxImportSource theme-ui */ -import { ReactNode, useCallback, useState } from 'react' -import { Box } from 'theme-ui' - -import Popover, { PopoverProps } from '../popover' - -interface TooltipProps extends Omit { - text: ReactNode - disableHover?: boolean // disable the hover and content display - onClose?: () => void -} - -interface TooltipContentProps extends Omit { - content: ReactNode - onOpen?: () => void - // whether to wrap the content in a `TooltipContainer` - wrap?: boolean - disableHover?: boolean // disable the hover and content display -} - -const TooltipBox = ({ children }: { children: ReactNode }) => ( - - {children} - -) - -export default function Tooltip({ text, ...rest }: TooltipProps) { - return {text}} {...rest} /> -} - -function TooltipContent({ - content, - wrap = false, - ...rest -}: TooltipContentProps) { - return ( - {content} : content} - {...rest} - /> - ) -} - -/** Standard text tooltip. */ -export function MouseoverTooltip({ - text, - disableHover, - onClose: closeCallback = undefined, - children, - ...rest -}: Omit) { - const [show, setShow] = useState(false) - const open = useCallback(() => { - setShow(true) - closeCallback?.() - }, [setShow]) - const close = useCallback(() => { - setShow(false) - }, [setShow, closeCallback]) - return ( - -
- {children} -
-
- ) -} - -/** Tooltip that displays custom content. */ -export function MouseoverTooltipContent({ - content, - children, - onOpen: openCallback = undefined, - disableHover, - ...rest -}: Omit) { - const [show, setShow] = useState(false) - const open = useCallback(() => { - setShow(true) - openCallback?.() - }, [openCallback]) - const close = useCallback(() => setShow(false), [setShow]) - return ( - -
- {children} -
-
- ) -} diff --git a/src/components/progress-bar/index.tsx b/src/components/progress-bar/index.tsx index 3ed25876b..ba508145f 100644 --- a/src/components/progress-bar/index.tsx +++ b/src/components/progress-bar/index.tsx @@ -1,5 +1,5 @@ -import { FC, ReactNode } from 'react' -import { Box, Text, useColorMode } from 'theme-ui' +import { cn } from '@/lib/utils' +import { FC, ReactNode, useEffect, useState } from 'react' import { formatPercentage } from 'utils' interface ProgressBarProps { @@ -17,141 +17,113 @@ const ProgressBar: FC = ({ height = 40, width = '100%', }) => { - const [colorMode] = useColorMode() - const isDarkMode = colorMode === 'dark' + const [isDarkMode, setIsDarkMode] = useState(false) + + useEffect(() => { + const checkDarkMode = () => { + setIsDarkMode(document.documentElement.classList.contains('dark')) + } + checkDarkMode() + const observer = new MutationObserver(checkDarkMode) + observer.observe(document.documentElement, { + attributes: true, + attributeFilter: ['class'], + }) + return () => observer.disconnect() + }, []) + const shouldPercentageBeOnForeground = percentage <= 8 const shouldTextBeOnForeground = percentage >= 40 const hideBackgroundText = percentage >= 70 const completed = percentage >= 100 return ( - - {!shouldTextBeOnForeground && !shouldPercentageBeOnForeground && ( - + {`${formatPercentage(percentage)}`} - + )} - + {foregroundText && ( - {foregroundText} {(shouldTextBeOnForeground || shouldPercentageBeOnForeground) && ( <> - | - | + {`${formatPercentage(percentage)}`} - + )} - + )} {backgroundText && !hideBackgroundText && ( - + {backgroundText} - + )} - {foregroundText} <> - | - | + {`${formatPercentage(percentage)}`} - + - - + + ) } diff --git a/src/components/rtoken-selector/SelectedToken.tsx b/src/components/rtoken-selector/SelectedToken.tsx deleted file mode 100644 index 74ea4352a..000000000 --- a/src/components/rtoken-selector/SelectedToken.tsx +++ /dev/null @@ -1,64 +0,0 @@ -import { Trans } from '@lingui/macro' -import CirclesIcon from 'components/icons/CirclesIcon' -import TokenLogo from 'components/icons/TokenLogo' -import { useAtomValue } from 'jotai' -import { useMemo } from 'react' -import { rTokenAtom, selectedRTokenAtom } from 'state/atoms' -import { Box, Text } from 'theme-ui' -import { shortenAddress } from 'utils' -import availableTokensAtom, { DEFAULT_LOGO } from './atoms' - -/** - * Top header token display - */ -const SelectedToken = () => { - const selectedAddress = useAtomValue(selectedRTokenAtom) - const rToken = useAtomValue(rTokenAtom) - const tokenList = useAtomValue(availableTokensAtom) - const { symbol, logo } = useMemo(() => { - if (selectedAddress && tokenList[selectedAddress]) { - return tokenList[selectedAddress] - } - - if (rToken) { - return { - symbol: rToken.symbol, - logo: DEFAULT_LOGO, - } - } - - return { - symbol: shortenAddress(selectedAddress ?? ''), - logo: DEFAULT_LOGO, - } - }, [selectedAddress, rToken?.symbol]) - - if (!selectedAddress) { - return ( - - - - RTokens - - - ) - } - - return ( - - - {symbol} - - ) -} - -export default SelectedToken diff --git a/src/components/rtoken-selector/TokenList.tsx b/src/components/rtoken-selector/TokenList.tsx deleted file mode 100644 index f18430e4a..000000000 --- a/src/components/rtoken-selector/TokenList.tsx +++ /dev/null @@ -1,75 +0,0 @@ -import TokenItem from 'components/token-item' -import useTokenList from 'hooks/useTokenList' -import { useAtomValue } from 'jotai' -import { memo, useMemo } from 'react' -import { Box } from 'theme-ui' -import availableTokensAtom from './atoms' - -/** - * Token selector list of available RTokens - */ -const TokenList = memo( - ({ onSelect }: { onSelect(address: string, chainId: number): void }) => { - const { list, isLoading } = useTokenList() - const tokens = useAtomValue(availableTokensAtom) - - const orderedTokens = useMemo(() => { - if (!tokens && isLoading) return [] - - const _tokens = Object.values(tokens).map((token) => ({ - id: token.address, - chain: token.chainId, - ...token, - })) - return isLoading - ? _tokens - : [ - ...list, - ..._tokens.filter( - (token) => !list.map((rToken) => rToken.id).includes(token.id) - ), - ] - }, [tokens, list, isLoading]) - - return ( - - {orderedTokens.map(({ id, logo, symbol, chain }) => ( - { - onSelect(id, chain as number) - }} - > - - - ))} - - ) - } -) - -export default TokenList diff --git a/src/components/rtoken-selector/atoms.ts b/src/components/rtoken-selector/atoms.ts deleted file mode 100644 index f17fed832..000000000 --- a/src/components/rtoken-selector/atoms.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { atom } from 'jotai' -import { accountRTokensAtom, allrTokenListAtom } from 'state/atoms' -export interface TokenDisplay { - address: string - symbol: string - logo: string - chainId: number - listed: boolean -} - -export const DEFAULT_LOGO = '/svgs/defaultLogo.svg' - -const availableTokensAtom = atom((get) => { - const defaultTokens = get(allrTokenListAtom) - const owned = get(accountRTokensAtom) - const tokenList: { - [x: string]: TokenDisplay - } = {} - - for (const token of Object.values(defaultTokens)) { - if (token) { - tokenList[token.address] = { - address: token.address, - symbol: token.symbol, - logo: token.logo ? `/svgs/${token.logo.toLowerCase()}` : DEFAULT_LOGO, - chainId: token.chainId, - listed: true, - } - } - } - - for (const token of owned) { - if (tokenList[token.address] == null) { - tokenList[token.address] = { - address: token.address, - symbol: token.symbol, - logo: DEFAULT_LOGO, - chainId: token.chainId, - listed: false, - } - } - } - - return tokenList -}) - -export default availableTokensAtom diff --git a/src/components/rtoken-selector/index.tsx b/src/components/rtoken-selector/index.tsx deleted file mode 100644 index 358657f7e..000000000 --- a/src/components/rtoken-selector/index.tsx +++ /dev/null @@ -1,82 +0,0 @@ -import Popup from '@/components/old/popup' -import { useAtomValue } from 'jotai' -import mixpanel from 'mixpanel-browser/src/loaders/loader-module-core' -import { useCallback, useState } from 'react' -import { ChevronDown, ChevronUp } from 'lucide-react' -import { useLocation, useMatch, useNavigate } from 'react-router-dom' -import { selectedRTokenAtom } from 'state/atoms' -import { Box, BoxProps } from 'theme-ui' -import { getTokenRoute } from 'utils' -import SelectedToken from './SelectedToken' -import TokenList from './TokenList' - -const trackToken = (token: string) => { - mixpanel.track('Selected RToken', { - Source: 'Dropdown', - RToken: token.toLowerCase(), - }) -} - -/** - * Top header RToken selection - */ -const RTokenSelector = (props: BoxProps) => { - const navigate = useNavigate() - const [isVisible, setVisible] = useState(false) - const selected = useAtomValue(selectedRTokenAtom) - const location = useLocation() - - const handleSelect = useCallback( - (token: string, chain: number) => { - if (token !== selected) { - let route = 'overview' - - if (selected) { - if (location.pathname.includes('governance')) { - route = 'governance' - } else { - const split = location.pathname.split('/') - route = split[split.length - 1] - } - } - - trackToken(token) - navigate(getTokenRoute(token, chain, route)) - setVisible(false) - } - }, - [selected, location.pathname] - ) - - const handleHome = useCallback(() => { - navigate('/') - setVisible(false) - }, [setVisible, navigate]) - - return ( - setVisible(false)} - content={} - > - setVisible(!isVisible)} - > - - - {isVisible ? : } - - - ) -} - -export default RTokenSelector diff --git a/src/components/rtoken-setup/Layout.tsx b/src/components/rtoken-setup/Layout.tsx index ebe69301d..50e5b796f 100644 --- a/src/components/rtoken-setup/Layout.tsx +++ b/src/components/rtoken-setup/Layout.tsx @@ -1,26 +1,22 @@ -import { BoxProps, Grid } from 'theme-ui' +import { cn } from '@/lib/utils' -const Layout = ({ children, ...props }: BoxProps) => ( - div:first-of-type': { - display: ['none', 'none', 'none', 'inherit'], - }, - }} - {...props} +const Layout = ({ children, className }: LayoutProps) => ( +
div:first-of-type]:hidden xl:[&>div:first-of-type]:block', + className + )} > {children} - +
) export default Layout diff --git a/src/components/rtoken-setup/basket/BackupBasket.tsx b/src/components/rtoken-setup/basket/BackupBasket.tsx index 0ee6e066a..1327a6f10 100644 --- a/src/components/rtoken-setup/basket/BackupBasket.tsx +++ b/src/components/rtoken-setup/basket/BackupBasket.tsx @@ -3,12 +3,11 @@ import DocsLink from '@/components/utils/docs-link' import EmptyBoxIcon from 'components/icons/EmptyBoxIcon' import { useAtomValue } from 'jotai' import { useCallback } from 'react' -import { Box, BoxProps, Flex, Text } from 'theme-ui' import { backupCollateralAtom, basketAtom } from '../atoms' import EmergencyCollateral from './EmergencyCollateral' import { PROTOCOL_DOCS } from '@/utils/constants' -interface Props extends BoxProps { +interface BackupBasketProps { onAdd?( data: { basket: 'primary' | 'backup' @@ -16,34 +15,35 @@ interface Props extends BoxProps { } | null ): void readOnly?: boolean + className?: string } const Placeholder = () => ( - - - - +
+
+
+ Diversity factor - - N= - - 0 - - - + + N= +
+ 0 +
+
+
- + Empty backup basket - - + + Each target unit of your primary basket will have defined emergency collateral to replace with in case of default. - - - - + +
+
+
) // TODO: Create readonly component and remove flag @@ -54,8 +54,8 @@ const Placeholder = () => ( const BackupBasket = ({ onAdd = () => {}, readOnly = false, - ...props -}: Props) => { + className, +}: BackupBasketProps) => { const targetUnits = Object.keys(useAtomValue(basketAtom)) const backupBasket = useAtomValue(backupCollateralAtom) @@ -71,22 +71,22 @@ const BackupBasket = ({ } return ( - - - Emergency Collateral +
+
+ Emergency Collateral - +
{targetUnits.map((targetUnit) => readOnly && !backupBasket[targetUnit]?.collaterals.length ? ( - - +
+ No emergency collateral for target {targetUnit} - - + +
) : ( - +
- +
) )} {!targetUnits.length && } -
+
) } diff --git a/src/components/rtoken-setup/basket/BasketSetup.tsx b/src/components/rtoken-setup/basket/BasketSetup.tsx index 947bd63c6..53a7720a8 100644 --- a/src/components/rtoken-setup/basket/BasketSetup.tsx +++ b/src/components/rtoken-setup/basket/BasketSetup.tsx @@ -1,6 +1,6 @@ -import SectionWrapper from 'components/section-navigation/SectionWrapper' +import SectionWrapper from '@/components/section-navigation/section-wrapper' +import { Card } from '@/components/ui/card' import { useState } from 'react' -import { Card } from 'theme-ui' import BackupBasket from './BackupBasket' import CollateralModal from './CollateralModal' import PrimaryBasket from './PrimaryBasket' @@ -14,17 +14,12 @@ const BasketSetup = ({ startIndex = 2 }) => { return ( <> - + - + diff --git a/src/components/rtoken-setup/basket/CollateralModal.tsx b/src/components/rtoken-setup/basket/CollateralModal.tsx index c1f47d650..85f5df114 100644 --- a/src/components/rtoken-setup/basket/CollateralModal.tsx +++ b/src/components/rtoken-setup/basket/CollateralModal.tsx @@ -1,9 +1,9 @@ import { t, Trans } from '@lingui/macro' -import { Button, Modal } from 'components' -import { ModalProps } from '@/components/old/modal' +import { Button } from '@/components/ui/button' +import { Separator } from '@/components/ui/separator' +import { Modal, ModalProps } from 'components' import { atom, useAtomValue, useSetAtom } from 'jotai' import { useMemo, useState } from 'react' -import { Box, Divider, Text } from 'theme-ui' import { CollateralPlugin } from 'types' import { addBackupCollateralAtom, @@ -16,7 +16,7 @@ import CustomCollateral from './CustomCollateral' import PluginItem from './PluginItem' import collateralPlugins from 'utils/plugins' import { chainIdAtom } from 'state/atoms' -import { SearchInput } from '@/components/old/input' +import { SearchInput } from '@/components/ui/input' interface Props extends Omit { targetUnit?: string // filter by target unit @@ -122,65 +122,49 @@ const CollateralModal = ({ placeholder="Search by collateral symbol or target name" autoFocus value={search} - onChange={setSearch} - backgroundColor="focusedBackground" - sx={{ - '&:focus': { - backgroundColor: 'focusedBackground', - }, - '&:hover': { - backgroundColor: 'focusedBackground', - }, - }} + onChange={(e) => setSearch(e.target.value)} + inputClassName="bg-muted" /> - - +
- +
- - +
+ {filteredCollaterals.map((plugin) => ( - +
- - + +
))} {!Object.keys(collaterals).length && ( - - +
+ No plugins available - - + +
)} -
- +
+ ) diff --git a/src/components/rtoken-setup/basket/CustomCollateral.tsx b/src/components/rtoken-setup/basket/CustomCollateral.tsx index 7e672fff4..2cd2303ac 100644 --- a/src/components/rtoken-setup/basket/CustomCollateral.tsx +++ b/src/components/rtoken-setup/basket/CustomCollateral.tsx @@ -2,13 +2,12 @@ import { t, Trans } from '@lingui/macro' import CollateralAbi from 'abis/CollateralAbi' import ERC20 from 'abis/ERC20' import { Input } from 'components' -import { SmallButton } from '@/components/old/button' +import { Button } from '@/components/ui/button' import PluginsIcon from 'components/icons/PluginsIcon' import { useAtomValue } from 'jotai' import { useState } from 'react' import { chainIdAtom } from 'state/atoms' import { wagmiConfig } from 'state/chain' -import { Box, Flex, Text } from 'theme-ui' import { CollateralPlugin } from 'types' import { isAddress } from 'utils' import { Address, hexToString } from 'viem' @@ -95,54 +94,56 @@ const CustomCollateral = ({ if (isActive) { return ( - - - - Plugin address - +
+
+ Plugin address handleChange(e.target.value)} value={address} placeholder={t`Input plugin address (not ERC-20 address)`} /> {error && address && ( - - {error} - + {error} )} - - - setActive(false)}> +
+
+ +
+
) } return ( - +
- - +
+ Made your own collateral? - - + + Use a custom plugin contract address - - - setActive(true)}> + +
+ +
) } diff --git a/src/components/rtoken-setup/basket/EmergencyCollateral.tsx b/src/components/rtoken-setup/basket/EmergencyCollateral.tsx index 27fb463a2..f73442395 100644 --- a/src/components/rtoken-setup/basket/EmergencyCollateral.tsx +++ b/src/components/rtoken-setup/basket/EmergencyCollateral.tsx @@ -14,29 +14,29 @@ import { verticalListSortingStrategy, } from '@dnd-kit/sortable' import { t, Trans } from '@lingui/macro' -import { SmallButton } from '@/components/old/button' +import { Button } from '@/components/ui/button' +import { Separator } from '@/components/ui/separator' +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from '@/components/ui/select' import Help from 'components/help' import SortableItem from 'components/sortable/SortableItem' import { useSetAtom } from 'jotai' import { useMemo } from 'react' import { Move, X } from 'lucide-react' -import { - Box, - CardProps, - Divider, - Flex, - IconButton, - Select, - Text, -} from 'theme-ui' import { Collateral, updateBackupBasketUnitAtom } from '../atoms' -interface Props extends CardProps { +interface EmergencyCollateralProps { targetUnit: string diversityFactor?: number collaterals?: Collateral[] readOnly?: boolean onAdd(targetUnit: string): void + className?: string } /** @@ -50,8 +50,8 @@ const EmergencyCollateral = ({ collaterals = [], readOnly = false, onAdd, - ...props -}: Props) => { + className, +}: EmergencyCollateralProps) => { const updateBasket = useSetAtom(updateBackupBasketUnitAtom) const sensors = useSensors( useSensor(PointerSensor, { @@ -68,10 +68,10 @@ const EmergencyCollateral = ({ [collaterals] ) - const handleDiversityFactor = (e: any) => { + const handleDiversityFactor = (value: string) => { updateBasket([ targetUnit, - { diversityFactor: +e.target.value, collaterals }, + { diversityFactor: +value, collaterals }, ]) } @@ -109,57 +109,68 @@ const EmergencyCollateral = ({ } return ( - - - - {targetUnit} Backups +
+ +
+ {targetUnit} Backups {!readOnly && ( - onAdd(targetUnit)} - ml="auto" - variant="primary" + className="ml-auto" > Add to basket - + )} - - - +
+
+ Diversity factor - + {readOnly ? ( - - {diversityFactor} - +
+ {diversityFactor} +
) : ( <> - - + + + + + {collaterals.map((c, index) => ( + + {index + 1} + + ))} + {!collaterals.length && ( + 0 + )} + - +
)} - +
{readOnly ? ( - +
{collaterals.map((collateral, index) => ( - - {collateral.symbol} - {index + 1} - + {collateral.symbol} + {index + 1} +
))} -
+ ) : ( {collaterals.map((collateral, index) => ( - +
- - +
+ {targetUnit} - - {collateral.symbol} - - - {index + 1} - - + {collateral.symbol} +
+ {index + 1} + +
))}
)} -
+ ) } diff --git a/src/components/rtoken-setup/basket/PluginItem.tsx b/src/components/rtoken-setup/basket/PluginItem.tsx index bdefbad38..7f7a78f7e 100644 --- a/src/components/rtoken-setup/basket/PluginItem.tsx +++ b/src/components/rtoken-setup/basket/PluginItem.tsx @@ -1,30 +1,24 @@ import { Trans } from '@lingui/macro' -import GoTo from '@/components/old/button/GoTo' +import GoTo from '@/components/ui/go-to' +import { Separator } from '@/components/ui/separator' +import { Checkbox } from '@/components/ui/checkbox' +import { Button } from '@/components/ui/button' import TokenLogo from 'components/icons/TokenLogo' import { useAtomValue } from 'jotai' import { useState } from 'react' import { ChevronDown, ChevronUp } from 'lucide-react' import { chainIdAtom, collateralYieldAtom } from 'state/atoms' -import { - Box, - BoxProps, - Checkbox, - Divider, - Flex, - IconButton, - Link, - Text, -} from 'theme-ui' import { CollateralPlugin } from 'types' import { formatPercentage, parseDuration } from 'utils' import { ExplorerDataType, getExplorerLink } from 'utils/getExplorerLink' import { Collateral } from '../atoms' import { collateralDisplay } from 'utils/constants' -interface PluginItemProps extends BoxProps { +interface PluginItemProps { data: CollateralPlugin | Collateral selected?: boolean onCheck(address: string): void + className?: string } const PluginInfo = ({ data }: { data: CollateralPlugin }) => { @@ -32,47 +26,46 @@ const PluginInfo = ({ data }: { data: CollateralPlugin }) => { return ( <> - - - - + +
+ +
+ Decimals - - {data.decimals} - - - + + {data.decimals} +
+
+ Default delay - - + + {parseDuration(+data.delayUntilDefault)} - - - - + +
+
+ Version - - {data.version} - - + + {data.version} +
+
) } @@ -81,7 +74,7 @@ const PluginInfo = ({ data }: { data: CollateralPlugin }) => { * View: Deploy -> Basket setup -> CollateralModal * Display collateral plugin item */ -const PluginItem = ({ data, onCheck, selected, ...props }: PluginItemProps) => { +const PluginItem = ({ data, onCheck, selected, className }: PluginItemProps) => { const [isVisible, setVisible] = useState(false) const chainId = useAtomValue(chainIdAtom) const collateralYields = useAtomValue(collateralYieldAtom) @@ -92,42 +85,43 @@ const PluginItem = ({ data, onCheck, selected, ...props }: PluginItemProps) => { const displayName = collateralDisplay[symbol.toLowerCase()] ?? symbol return ( - - +
+
- - - {displayName} +
+
+ {displayName} - +
- + Target: {data.targetName} | Est. APY:{' '} {formatPercentage( collateralYields[chainId]?.[symbol.toLowerCase()] || 0 )} - - - -
+
+ - setVisible(!isVisible)} > {isVisible ? ( @@ -135,10 +129,10 @@ const PluginItem = ({ data, onCheck, selected, ...props }: PluginItemProps) => { ) : ( )} - - + +
{isVisible && } -
+
) } diff --git a/src/components/rtoken-setup/basket/PrimaryBasket.tsx b/src/components/rtoken-setup/basket/PrimaryBasket.tsx index 8e14aa669..56f1a35f2 100644 --- a/src/components/rtoken-setup/basket/PrimaryBasket.tsx +++ b/src/components/rtoken-setup/basket/PrimaryBasket.tsx @@ -5,7 +5,7 @@ import EmptyBoxIcon from 'components/icons/EmptyBoxIcon' import { useAtomValue, useSetAtom } from 'jotai' import { useCallback, useEffect, useMemo } from 'react' import { chainIdAtom, collateralYieldAtom } from 'state/atoms' -import { Box, BoxProps, Divider, Flex, Text } from 'theme-ui' +import { Separator } from '@/components/ui/separator' import { formatCurrency, formatPercentage, @@ -13,15 +13,14 @@ import { truncateDecimals, } from 'utils' import { formatEther } from 'viem' -import { useContractReads } from 'wagmi' import { Basket, basketAtom, basketTargetUnitPriceAtom } from '../atoms' import UnitBasket from './UnitBasket' -import { SmallButton } from '@/components/old/button' +import { Button } from '@/components/ui/button' import DocsLink from '@/components/utils/docs-link' import { useWatchReadContracts } from '@/hooks/useWatchReadContract' import { PROTOCOL_DOCS } from '@/utils/constants' -interface Props extends BoxProps { +interface PrimaryBasketProps { onAdd?( data: { basket: 'primary' | 'backup' @@ -29,6 +28,7 @@ interface Props extends BoxProps { } | null ): void readOnly?: boolean + className?: string } const getBasketComposition = ( @@ -48,24 +48,20 @@ const getBasketComposition = ( } const Placeholder = () => ( - +
- + Empty Basket - - + +

This is the target collateral basket at the onset of an RToken that defines which collateral needs to be deposited for issuances. The prime basket is directly set by governance, and only changes through successful governance proposals. - - +

+
) const usePricePerTarget = (basket: Basket) => { @@ -160,26 +156,26 @@ const BasketEstimatedApy = () => { }, [collateralYields, basket, chainId]) return ( - - - 1 Token = - +
+
+ 1 Token = + {!!units.length ? getBasketComposition(basket, targetUnitPrice) : '--'} - - + + Estimated basket APY = - - {formatPercentage(getEstApy())} - + + {formatPercentage(getEstApy())} +
- +
) } @@ -191,34 +187,34 @@ const BasketEstimatedApy = () => { const PrimaryBasket = ({ onAdd = () => {}, readOnly = false, - ...props -}: Props) => { + className, +}: PrimaryBasketProps) => { const basket = useAtomValue(basketAtom) const units = Object.keys(basket) return ( - - - +
+
+ Primary Basket - + {!readOnly && ( - onAdd({ basket: 'primary' })} - ml="auto" - variant="primary" + className="ml-auto" > Add to basket - + )} - +
{!units.length && } {units.map((targetUnit) => ( - + )} - +
) } diff --git a/src/components/rtoken-setup/basket/UnitBasket.tsx b/src/components/rtoken-setup/basket/UnitBasket.tsx index 4076c40e6..d8abf8dc2 100644 --- a/src/components/rtoken-setup/basket/UnitBasket.tsx +++ b/src/components/rtoken-setup/basket/UnitBasket.tsx @@ -4,7 +4,8 @@ import Help from 'components/help' import TokenLogo from 'components/icons/TokenLogo' import { useAtomValue, useSetAtom } from 'jotai' import { useMemo } from 'react' -import { Box, CardProps, Divider, Flex, IconButton, Text } from 'theme-ui' +import { Separator } from '@/components/ui/separator' +import { Button } from '@/components/ui/button' import { formatCurrency, truncateDecimals } from 'utils' import { basketTargetUnitPriceAtom, @@ -13,20 +14,43 @@ import { } from '../atoms' import { collateralDisplay } from 'utils/constants' import Skeleton from 'react-loading-skeleton' -import IconInfo from '@/components/old/info-icon' import { X } from 'lucide-react' -interface UnitBasketProps extends CardProps { +const IconInfo = ({ + icon, + title, + text, + help, +}: { + icon: React.ReactNode + title: string + text: string + help?: string +}) => ( +
+ {icon} +
+
+ {title} + {!!help && } +
+ {text} +
+
+) + +interface UnitBasketProps { data: PrimaryUnitBasket unit: string readOnly?: boolean + className?: string } /** * View: Deploy -> Basket setup -> PrimaryBasket * Display collateral composition for target unit */ -const UnitBasket = ({ data, readOnly, unit, ...props }: UnitBasketProps) => { +const UnitBasket = ({ data, readOnly, unit, className }: UnitBasketProps) => { const updateBasket = useSetAtom(updateBasketUnitAtom) const targetUnitPrice = useAtomValue(basketTargetUnitPriceAtom)[unit] @@ -74,60 +98,51 @@ const UnitBasket = ({ data, readOnly, unit, ...props }: UnitBasketProps) => { } return ( - - +
+ {!readOnly && ( <> - - +
+ {unit} Basket - - - + +
+
0 ? 'smallInput' : 'inputError'} value={data.scale} - sx={{ textAlign: 'center' }} + className={`text-center text-sm p-1 border rounded ${+data.scale > 0 ? 'border-border' : 'border-destructive'}`} onChange={handleScale} /> - - - {unit} +
+
+ {unit} {targetUnitPrice ? ( - + 1 = {formatCurrency(targetUnitPrice)}$ - + ) : ( )} - +
- - - - +
+
+
+ {unit} Token distribution - - + Filled: {totalDistribution}% - - + +
)} {data.collaterals.map((collateral, index) => ( - +
} title={unit} @@ -143,39 +158,38 @@ const UnitBasket = ({ data, readOnly, unit, ...props }: UnitBasketProps) => { } /> {!readOnly ? ( - +
0 && - +data.distribution[index] <= 100 - ? 'smallInput' - : 'inputError' - } + className={`text-center text-sm p-1.5 border rounded ${ + +data.distribution[index] > 0 && +data.distribution[index] <= 100 + ? 'border-border' + : 'border-destructive' + }`} value={data.distribution[index]} disabled={data.collaterals.length > 1 ? false : true} onChange={(value) => handleDistribution(index, value)} /> - +
) : ( - + {Math.round(+data.distribution[index] * 100) / 100} - + )} - % + % {!readOnly && ( - handleRemove(index)} > - - + + )} - +
))} - +
) } diff --git a/src/components/rtoken-setup/components/BackButton.tsx b/src/components/rtoken-setup/components/BackButton.tsx index fa0698a8e..0257bbb1f 100644 --- a/src/components/rtoken-setup/components/BackButton.tsx +++ b/src/components/rtoken-setup/components/BackButton.tsx @@ -1,12 +1,11 @@ import { Trans } from '@lingui/macro' -import { SmallButton } from '@/components/old/button' +import { Button } from '@/components/ui/button' import useRToken from 'hooks/useRToken' import { useAtomValue } from 'jotai' import { useCallback } from 'react' import { ArrowLeft } from 'lucide-react' import { useNavigate } from 'react-router-dom' import { chainIdAtom } from 'state/atoms' -import { Box } from 'theme-ui' import { getTokenRoute } from 'utils' const BackButton = () => { @@ -23,12 +22,12 @@ const BackButton = () => { }, [rToken?.address, navigate, chainId]) return ( - - - + ) } diff --git a/src/components/rtoken-setup/components/RolesEdit.tsx b/src/components/rtoken-setup/components/RolesEdit.tsx index ea5292a52..2d4d24aa8 100644 --- a/src/components/rtoken-setup/components/RolesEdit.tsx +++ b/src/components/rtoken-setup/components/RolesEdit.tsx @@ -1,9 +1,9 @@ import { Trans } from '@lingui/macro' +import { Button } from '@/components/ui/button' import { Input } from 'components' -import { SmallButton } from '@/components/old/button' import Help from 'components/help' import { useState } from 'react' -import { Box, BoxProps, Text } from 'theme-ui' +import { cn } from '@/lib/utils' import { isAddress } from 'utils' const NewRoleAddress = ({ @@ -22,49 +22,45 @@ const NewRoleAddress = ({ addresses.findIndex((a) => a.toLowerCase() === address.toLowerCase()) !== -1 return ( - +
setAddress(e.target.value)} /> {((address && !isValid) || isExisting) && ( - + {isExisting ? ( This address already holds this role ) : ( Invalid address )} - + )} - onSave(address)} - ml={3} + className="ml-4" > Save - - onDismiss()} variant="muted" ml={3}> + + +
) } -interface RoleEditProps extends Omit { +interface RoleEditProps { title: string onChange(addresses: string[]): void addresses: string[] help?: string compact?: boolean + className?: string } const RolesEdit = ({ @@ -73,7 +69,7 @@ const RolesEdit = ({ help, addresses, compact = false, - ...props + className, }: RoleEditProps) => { const [isCreating, setCreate] = useState(false) @@ -87,58 +83,44 @@ const RolesEdit = ({ } return ( - - - +
+
+ {title} - + {!!help && } - +
{!addresses.length && !isCreating && ( - + No holders for this role... - + )} {addresses.map((addr, index) => ( - - - +
+
- - +
+ Current holder - - {addr} - - + + {addr} +
+
- handleRemove(index)} > Remove - - + +
))} {isCreating ? ( ) : ( - setCreate(true)} variant="muted" > Add new {title.substring(0, title.length - 1).toLowerCase()} - + )} -
+
) } diff --git a/src/components/rtoken-setup/governance/GovernanceParameters.tsx b/src/components/rtoken-setup/governance/GovernanceParameters.tsx index 967df1ad1..ffcb5679b 100644 --- a/src/components/rtoken-setup/governance/GovernanceParameters.tsx +++ b/src/components/rtoken-setup/governance/GovernanceParameters.tsx @@ -4,18 +4,18 @@ import { useAtomValue } from 'jotai' import { useMemo } from 'react' import { useFormContext } from 'react-hook-form' import { secondsPerBlockAtom } from 'state/atoms' -import { Box, BoxProps, Text } from 'theme-ui' import { decimalPattern, numberPattern, parseDuration } from 'utils' import { timeToBlocks } from '../atoms' -interface IGovernanceParameters extends BoxProps { +interface GovernanceParametersProps { timebased?: boolean + className?: string } const GovernanceParameters = ({ timebased = true, - ...props -}: IGovernanceParameters) => { + className, +}: GovernanceParametersProps) => { const secondsPerBlock = useAtomValue(secondsPerBlockAtom) const { watch } = useFormContext() const [votingDelay, votingPeriod, minDelay] = watch([ @@ -46,10 +46,10 @@ const GovernanceParameters = ({ }, [timebased, secondsPerBlock, votingDelay, votingPeriod, minDelay]) return ( - - +
+ Governance parameters - + - +
) } diff --git a/src/components/rtoken-setup/governance/GovernanceSetup.tsx b/src/components/rtoken-setup/governance/GovernanceSetup.tsx index 5610dc280..ff7723253 100644 --- a/src/components/rtoken-setup/governance/GovernanceSetup.tsx +++ b/src/components/rtoken-setup/governance/GovernanceSetup.tsx @@ -1,72 +1,76 @@ import { t, Trans } from '@lingui/macro' import { Field, FormField } from 'components/field' import { useFormContext } from 'react-hook-form' +import { Card } from '@/components/ui/card' +import { Separator } from '@/components/ui/separator' +import { Switch } from '@/components/ui/switch' import { - Box, - BoxProps, - Card, - Flex, Select, - Switch, - Text, - Image, - Divider, -} from 'theme-ui' + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from '@/components/ui/select' import { addressPattern } from 'utils' import GovernanceParameters from './GovernanceParameters' import DocsLink from '@/components/utils/docs-link' import RolesSetup from './RoleSetup' import { PROTOCOL_DOCS } from '@/utils/constants' -interface Props extends BoxProps { +interface GovernanceSetupProps { disabled?: boolean + className?: string } -const GovernanceSetup = ({ disabled = false, ...props }: Props) => { - const { register, watch } = useFormContext() +const GovernanceSetup = ({ + disabled = false, + className, +}: GovernanceSetupProps) => { + const { register, watch, setValue } = useFormContext() const defaultGovernance = watch('defaultGovernance') const unfreeze = watch('unfreeze') + const unpause = watch('unpause') return ( - - - + +
+ Governance - + - - - - - +
+ +
+
+ Use the Alexios governor format? - - + + Choose between our Alexios Governor and anything between one-person rule to arbitrary DAO structure under your defined Ethereum address. - - - + +
+
setValue('defaultGovernance', checked)} /> - - - - - +
+
+ +
+ Roles - + - +
{!defaultGovernance ? ( { freeze and unfreeze the system set governance parameters upgrade system contracts`} - mb={3} + className="mb-4" name="owner" options={{ required: true, @@ -92,7 +96,7 @@ const GovernanceSetup = ({ disabled = false, ...props }: Props) => { label={t`Guardian address`} placeholder={t`Input the guardian ethereum address`} help={t`The guardian has the ability to reject proposals even if they pass. Should be assigned to a multisig or EOA that can be trusted to act as a backstop. It is acceptable if it is relatively slow to act. Only one guardian address should be defined.`} - mb={3} + className="mb-4" name="guardian" options={{ disabled, @@ -107,38 +111,42 @@ const GovernanceSetup = ({ disabled = false, ...props }: Props) => { {defaultGovernance && ( <> - + )} - - - + +
+ Initial RToken state after deployment - + - +
- setValue('unpause', Number(value))} + > + + + + + + RToken will be left in pause state + + + RToken will be fully functional + + {unfreeze === '0' && ( - + Only the guardian address or governance will be able to unpause - + )}
diff --git a/src/components/rtoken-setup/governance/RoleSetup.tsx b/src/components/rtoken-setup/governance/RoleSetup.tsx index 2474dc0ec..b9b4457d5 100644 --- a/src/components/rtoken-setup/governance/RoleSetup.tsx +++ b/src/components/rtoken-setup/governance/RoleSetup.tsx @@ -1,7 +1,6 @@ import { useAtom } from 'jotai' import { useResetAtom } from 'jotai/utils' import { useEffect } from 'react' -import { Box, BoxProps, Divider } from 'theme-ui' import { setupRolesAtom } from '../atoms' import RolesEdit from '../components/RolesEdit' @@ -15,21 +14,25 @@ const roleMap: { { roleKey: 'pausers', title: 'Pausers', - help: 'The pauser has the ability to pause and unpause an RToken’s system. The PAUSER role should be assigned to an address that is able to act quickly in response to off-chain events, such as a Chainlink feed failing. It is ok to have multiple pausers. It can be robot-controlled. It can also consist of a 1-of-N multisig for high availability and coverage. It is acceptable for there to be false positives, since redemption remains enabled.', + help: "The pauser has the ability to pause and unpause an RToken's system. The PAUSER role should be assigned to an address that is able to act quickly in response to off-chain events, such as a Chainlink feed failing. It is ok to have multiple pausers. It can be robot-controlled. It can also consist of a 1-of-N multisig for high availability and coverage. It is acceptable for there to be false positives, since redemption remains enabled.", }, { roleKey: 'shortFreezers', title: 'Short Freezers', - help: 'The short freezer has the ability to freeze an RToken’s system for a short period of time. The SHORT_FREEZER role should be assigned to an address that might reasonably be expected to be the first to detect a bug in the code and can act quickly, and with some tolerance for false positives, though less than in pausing. It is acceptable to have multiple short freezers. It can be robot-controlled. It can also consist of a 1-of-N multisig for high availability and coverage. If a bug is detected, a short freeze can be triggered which will automatically expire if it is not renewed by LONG_FREEZER.', + help: "The short freezer has the ability to freeze an RToken's system for a short period of time. The SHORT_FREEZER role should be assigned to an address that might reasonably be expected to be the first to detect a bug in the code and can act quickly, and with some tolerance for false positives, though less than in pausing. It is acceptable to have multiple short freezers. It can be robot-controlled. It can also consist of a 1-of-N multisig for high availability and coverage. If a bug is detected, a short freeze can be triggered which will automatically expire if it is not renewed by LONG_FREEZER.", }, { roleKey: 'longFreezers', title: 'Long Freezers', - help: 'The long freezer has the ability to freeze an RToken’s system for a long period of time. The LONG_FREEZER role should be assigned to an address that will highly optimize for no false positives. It is much longer than the short freeze. It can act slowly and needs to be trusted. It is probably expected to have only one long-freezer address. It allows only 6x uses per long-freezer. It exists so that in the case of a zero-day exploit, governance can act before the system unfreezes and resumes functioning. ', + help: "The long freezer has the ability to freeze an RToken's system for a long period of time. The LONG_FREEZER role should be assigned to an address that will highly optimize for no false positives. It is much longer than the short freeze. It can act slowly and needs to be trusted. It is probably expected to have only one long-freezer address. It allows only 6x uses per long-freezer. It exists so that in the case of a zero-day exploit, governance can act before the system unfreezes and resumes functioning.", }, ] -const RolesSetup = (props: BoxProps) => { +interface RolesSetupProps { + className?: string +} + +const RolesSetup = ({ className }: RolesSetupProps) => { const [roles, setRoles] = useAtom(setupRolesAtom) const resetRoles = useResetAtom(setupRolesAtom) @@ -40,20 +43,20 @@ const RolesSetup = (props: BoxProps) => { } return ( - - {roleMap.map(({ title, roleKey, help }, index) => ( - +
+ {roleMap.map(({ title, roleKey, help }) => ( +
handleChange(roleKey, value)} help={help} compact - mt={4} + className="mt-4" /> - +
))} - +
) } diff --git a/src/components/rtoken-setup/token/BackingForm.tsx b/src/components/rtoken-setup/token/BackingForm.tsx index 8d96215fc..1e3b70a78 100644 --- a/src/components/rtoken-setup/token/BackingForm.tsx +++ b/src/components/rtoken-setup/token/BackingForm.tsx @@ -1,13 +1,17 @@ import { t } from '@lingui/macro' import { FormField } from 'components/field' import { useFormContext } from 'react-hook-form' -import { Box, BoxProps } from 'theme-ui' +import { cn } from '@/lib/utils' import { decimalPattern, numberPattern, parseDuration } from 'utils' +interface BackingFormProps { + className?: string +} + /** * View: Deploy -> Token setup */ -const BackingForm = (props: BoxProps) => { +const BackingForm = ({ className }: BackingFormProps) => { const { watch } = useFormContext() const [ tradingDelayHelp, @@ -22,12 +26,12 @@ const BackingForm = (props: BoxProps) => { ]).map((value) => parseDuration(+value || 0)) return ( - +
{ label={t`Warmup period (s)`} placeholder={t`Period in seconds`} help={t`The warmup period is how many seconds should pass after the basket regained the SOUND status before an RToken can be issued and/or a trade can be opened.`} - mb={3} + className="mb-4" helper={warnupPeriodHelp} name="warmupPeriod" options={{ @@ -55,7 +59,7 @@ const BackingForm = (props: BoxProps) => { label={t`Batch Auction length (s)`} placeholder={t`Duration in Seconds`} help={t`Batch Auction length - defines how long Gnosis EasyAuction auctions should be. Gnosis EasyAuction is a platform enabling fair price discovery for tokens through the use of batch auctions.`} - mb={3} + className="mb-4" helper={auctionLengthHelp} name="batchAuctionLength" options={{ @@ -69,7 +73,7 @@ const BackingForm = (props: BoxProps) => { label={t`Dutch Auction length (s)`} placeholder={t`Duration in Seconds`} help={t`The dutch auction length is how many seconds long falling-price dutch auctions should be. A longer period will result in less slippage due to better price granularity, and a shorter period will result in more slippage.`} - mb={3} + className="mb-4" helper={dutchAuctionLengthHelp} name="dutchAuctionLength" options={{ @@ -82,8 +86,8 @@ const BackingForm = (props: BoxProps) => { { label={t`Max trade slippage (%)`} placeholder={t`% Acceptable`} help={t`Max trade slippage — maximum deviation from oracle prices that any trade can clear at. Why this matters? Acts as a form of slippage protection.`} - mb={3} + className="mb-4" name="maxTradeSlippage" options={{ required: true, @@ -109,7 +113,7 @@ const BackingForm = (props: BoxProps) => { label={t`Issuance throttle rate (%)`} placeholder={t`Issuance throttle Rate`} help={t`Issuance rate - allows the issuer to limit the amount of RTokens issued per hour based on a percentage of the current RToken market cap. This matters in the event of an exploit where an attacker tries to issue more RTokens. This buys time for users with pause or freeze permissions to reduce the amount of RTokens that can be issued.`} - mb={3} + className="mb-4" name="issuanceThrottleRate" options={{ required: true, @@ -122,7 +126,7 @@ const BackingForm = (props: BoxProps) => { label={t`Issuance throttle amount`} placeholder={t`Issuance throttle amount`} help={t`Issuance amount - allows the issuer to limit the amount of RTokens issued per hour. This matters in the event of an exploit where an attacker tries to issue more RTokens. This buys time for users with pause or freeze permissions to reduce the amount of RTokens that can be issued.`} - mb={3} + className="mb-4" name="issuanceThrottleAmount" options={{ required: true, @@ -135,7 +139,7 @@ const BackingForm = (props: BoxProps) => { label={t`Redemption throttle rate (%)`} placeholder={t`Redemption throttle Rate`} help={t`Redemption rate - allows the issuer to limit the amount of RTokens redeemed per hour based on a percentage of the current RToken market cap. This matters in the event of an exploit where an attacker tries to redeem RTokens. This buys time for users with pause or freeze permissions to reduce the amount of RTokens that can be redeemed.`} - mb={3} + className="mb-4" name="redemptionThrottleRate" options={{ required: true, @@ -156,7 +160,7 @@ const BackingForm = (props: BoxProps) => { max: 1e30, }} /> - +
) } diff --git a/src/components/rtoken-setup/token/ExternalRevenueSplit.tsx b/src/components/rtoken-setup/token/ExternalRevenueSplit.tsx index 86b5c284a..d6b1f407d 100644 --- a/src/components/rtoken-setup/token/ExternalRevenueSplit.tsx +++ b/src/components/rtoken-setup/token/ExternalRevenueSplit.tsx @@ -1,16 +1,16 @@ import { t, Trans } from '@lingui/macro' -import { SmallButton } from '@/components/old/button' +import { Button } from '@/components/ui/button' import Field, { FieldInput, getErrorMessage } from 'components/field' import { useAtomValue } from 'jotai' import { useEffect } from 'react' import { useForm } from 'react-hook-form' -import { Box, BoxProps, Grid } from 'theme-ui' import { ExternalAddressSplit, isRevenueValidAtom } from '../atoms' -interface ExternalRevenueSplitProps extends Omit { +interface ExternalRevenueSplitProps { defaultValues?: Partial onChange(data: ExternalAddressSplit): void onRemove(): void + className?: string } const inputValidation = { @@ -24,7 +24,7 @@ const ExternalRevenueSpit = ({ onChange, onRemove, defaultValues = {}, - ...props + className, }: ExternalRevenueSplitProps) => { const { register, @@ -75,63 +75,50 @@ const ExternalRevenueSpit = ({ }, [formValues[2]]) return ( - - - +
+
+
- - +
+
- - - +
+ +
) } diff --git a/src/components/rtoken-setup/token/OtherForm.tsx b/src/components/rtoken-setup/token/OtherForm.tsx index c330578ba..29ee787d7 100644 --- a/src/components/rtoken-setup/token/OtherForm.tsx +++ b/src/components/rtoken-setup/token/OtherForm.tsx @@ -1,25 +1,28 @@ import { t } from '@lingui/macro' import { FormField } from 'components/field' import { useFormContext } from 'react-hook-form' -import { Box, BoxProps } from 'theme-ui' import { decimalPattern, numberPattern, parseDuration } from 'utils' +interface OtherFormProps { + className?: string +} + /** * View: Deploy -> Token setup */ -const OtherForm = (props: BoxProps) => { +const OtherForm = ({ className }: OtherFormProps) => { const { watch } = useFormContext() const [shortFreezeHelp, longFreezeHelp, unstakingDelayHelp]: string[] = watch( ['shortFreeze', 'longFreeze', 'unstakingDelay'] ).map((value) => parseDuration(+value || 0)) return ( - +
{ { label={t`Withdrawal leak (%)`} placeholder={t`Input withdrawal leak %`} help={t`The fraction of RSR stake that should be permitted to withdraw without a refresh. When cumulative withdrawals (or a single withdrawal) exceed this fraction, gas must be paid to refresh all assets.`} - mb={3} + className="mb-4" name="withdrawalLeak" options={{ required: true, @@ -60,7 +63,7 @@ const OtherForm = (props: BoxProps) => { label={t`Unstaking Delay (s)`} placeholder={t`Delay in Seconds`} help={t`Unstaking delay - number of seconds that all RSR unstaking must be delayed in order to account for stakers trying to frontrun defaults and needs to be longer than "governance" for proper incentives for basket changes.`} - mb={3} + className="mb-4" helper={unstakingDelayHelp} name="unstakingDelay" options={{ @@ -74,7 +77,7 @@ const OtherForm = (props: BoxProps) => { label={t`Reward ratio (decimals)`} placeholder={t`stRSR payout fraction 0.0`} help={t`Reward ratio - amount of the current reward amount that should be handed out in a single block. The default corresponds to a half life of approximately 15 days.`} - mb={3} + className="mb-4" name="rewardRatio" options={{ required: true, @@ -87,7 +90,7 @@ const OtherForm = (props: BoxProps) => { label={t`Minimum trade volume ($)`} placeholder={t`Minimum trade in USD terms`} help={t`Minimum trade volume - minimum sized trade that can be performed, in terms of the unit of account eg. USD.`} - mb={3} + className="mb-4" name="minTrade" options={{ required: true, @@ -101,7 +104,7 @@ const OtherForm = (props: BoxProps) => { placeholder={t`Maximum trade for RToken`} help={t`Maximum trade volume - maximum sized trade for any trade involving RToken, in terms of the unit of account eg. USD.`} name="maxTrade" - mb={3} + className="mb-4" options={{ required: true, pattern: decimalPattern, @@ -109,7 +112,7 @@ const OtherForm = (props: BoxProps) => { min: 0, }} /> - +
) } diff --git a/src/components/rtoken-setup/token/RevenueSplit.tsx b/src/components/rtoken-setup/token/RevenueSplit.tsx index 8b1ed3040..df4eec0c4 100644 --- a/src/components/rtoken-setup/token/RevenueSplit.tsx +++ b/src/components/rtoken-setup/token/RevenueSplit.tsx @@ -1,5 +1,7 @@ import { t, Trans } from '@lingui/macro' -import { SmallButton } from '@/components/old/button' +import { Button } from '@/components/ui/button' +import { Card } from '@/components/ui/card' +import { Separator } from '@/components/ui/separator' import Field, { FieldInput, getErrorMessage } from 'components/field' import { atom, useAtom, useAtomValue } from 'jotai' import { useSetAtom } from 'jotai' @@ -7,7 +9,6 @@ import { useEffect } from 'react' import { Plus } from 'lucide-react' import { useForm } from 'react-hook-form' import DocsLink from '@/components/utils/docs-link' -import { Box, BoxProps, Card, Divider, Flex, Text, Link } from 'theme-ui' import { ExternalAddressSplit, isRevenueValidAtom, @@ -39,7 +40,11 @@ const inputValidation = { max: 100, } -const RevenueSplit = (props: BoxProps) => { +interface RevenueSplitProps { + className?: string +} + +const RevenueSplit = ({ className }: RevenueSplitProps) => { const [revenueSplit, setRevenueSplit] = useAtom(revenueSplitAtom) const updateExternalShare = useSetAtom(updateExternalShareAtom) const isValid = useAtomValue(isRevenueValidAtom) @@ -98,17 +103,17 @@ const RevenueSplit = (props: BoxProps) => { } return ( - - - + +
+ Revenue Distribution - + - - - +
+ + { {revenueSplit.external.map((split, index) => ( handleRemoveExternal(index)} @@ -136,26 +141,31 @@ const RevenueSplit = (props: BoxProps) => { /> ))} {isDirty && (!isValid || !isValidExternals) && ( - - +
+ {!isValid ? ( Distributed revenue does not add up to 100% ) : ( Invalid destination address )} - - + +
)} - - + + +

Define what portion of the revenue goes to the RToken holders versus RSR stakers. It can also be configured to send a portion of the @@ -164,14 +174,15 @@ const RevenueSplit = (props: BoxProps) => {

- Read more about revenue distribution - - + +

) } diff --git a/src/components/rtoken-setup/token/TokenConfiguration.tsx b/src/components/rtoken-setup/token/TokenConfiguration.tsx index e8501008f..98ade62d9 100644 --- a/src/components/rtoken-setup/token/TokenConfiguration.tsx +++ b/src/components/rtoken-setup/token/TokenConfiguration.tsx @@ -1,57 +1,56 @@ import { Trans } from '@lingui/macro' -import { SmallButton } from '@/components/old/button' -import SectionWrapper from 'components/section-navigation/SectionWrapper' +import { Button } from '@/components/ui/button' +import SectionWrapper from '@/components/section-navigation/section-wrapper' +import { Card } from '@/components/ui/card' +import { Separator } from '@/components/ui/separator' import { useState } from 'react' import { ChevronDown, ChevronUp } from 'lucide-react' -import { Box, BoxProps, Button, Card, Divider, Flex, Text } from 'theme-ui' import BackingForm from './BackingForm' import OtherForm from './OtherForm' import TokenForm from './TokenForm' -const chevronProps = { - style: { - marginLeft: 10, - }, - size: 14, +interface TokenConfigurationProps { + className?: string } /** * View: Deploy -> Token setup * Display token forms */ -const TokenConfiguration = (props: BoxProps) => { +const TokenConfiguration = ({ className }: TokenConfigurationProps) => { const [advanceConfig, setAdvanceConfig] = useState(false) return ( - + - - - + +
+ Advanced config: - - + + 15 params - - + +
{advanceConfig && ( <> - + )} diff --git a/src/components/rtoken-setup/token/TokenForm.tsx b/src/components/rtoken-setup/token/TokenForm.tsx index ead4d5da2..5ca41d25d 100644 --- a/src/components/rtoken-setup/token/TokenForm.tsx +++ b/src/components/rtoken-setup/token/TokenForm.tsx @@ -1,23 +1,24 @@ import { t, Trans } from '@lingui/macro' -import Button from '@/components/old/button' import { FormField } from 'components/field' -import { Box, BoxProps, Divider, Text } from 'theme-ui' -import { isAddress } from 'utils' + +interface TokenFormProps { + className?: string +} /** * View: Deploy -> Token setup */ -const TokenForm = (props: BoxProps) => ( - - - +const TokenForm = ({ className }: TokenFormProps) => ( +
+
+ RToken Details - - + +
( ( }, }} /> - +
) export default TokenForm diff --git a/src/components/section-navigation/Navigation.tsx b/src/components/section-navigation/Navigation.tsx deleted file mode 100644 index 187dc242e..000000000 --- a/src/components/section-navigation/Navigation.tsx +++ /dev/null @@ -1,82 +0,0 @@ -import { useAtom } from 'jotai' -import { useEffect } from 'react' -import { Box, BoxProps, Text } from 'theme-ui' -import { navigationIndexAtom } from './atoms' - -interface Props extends BoxProps { - title?: string - sections: string[] - initialIndex?: number -} - -const Navigation = ({ title, sections, initialIndex = 0, ...props }: Props) => { - const [current, setNavigationIndex] = useAtom(navigationIndexAtom) - - useEffect(() => { - return () => { - setNavigationIndex([]) - } - }, []) - - const handleNavigate = (index: number) => { - const target = document.getElementById(`section-${index}`) - const wrapper = document.getElementById('app-container') - - if (target && wrapper) { - const count = target.offsetTop - wrapper.scrollTop - 20 // xx = any extra distance from top ex. 60 - wrapper.scrollBy({ top: count, left: 0, behavior: 'smooth' }) - } - } - - const active = Math.min(...current) - - return ( - - {!!title && ( - - {title} - - )} - - {sections.map((item, index) => { - const currentIndex = index + initialIndex - const isActive = active === currentIndex - - return ( - !isActive && handleNavigate(currentIndex)} - as="li" - mt={!!index ? 4 : 0} - sx={{ - lineHeight: '16px', - borderLeft: isActive ? '3px solid' : 'none', - borderColor: 'text', - paddingLeft: isActive ? '13px' : '16px', - cursor: 'pointer', - }} - > - {item} - - ) - })} - - - ) -} - -export default Navigation diff --git a/src/components/section-navigation/SectionContainer.tsx b/src/components/section-navigation/section-container.tsx similarity index 72% rename from src/components/section-navigation/SectionContainer.tsx rename to src/components/section-navigation/section-container.tsx index d5f41fb3a..0a7d28c9a 100644 --- a/src/components/section-navigation/SectionContainer.tsx +++ b/src/components/section-navigation/section-container.tsx @@ -1,11 +1,13 @@ import { useSetAtom } from 'jotai' +import { useEffect } from 'react' import { useSearchParams } from 'react-router-dom' -import { Box, BoxProps } from 'theme-ui' import { navigationIndexAtom } from './atoms' -import { useEffect } from 'react' -import useSectionNavigate from './useSectionNavigate' +import useSectionNavigate from './use-section-navigate' -const SectionContainer = ({ children, ...props }: BoxProps) => { +const SectionContainer = ({ + children, + ...props +}: React.HTMLAttributes) => { let [searchParams] = useSearchParams() const navigate = useSectionNavigate() const setNavigationIndex = useSetAtom(navigationIndexAtom) @@ -20,7 +22,7 @@ const SectionContainer = ({ children, ...props }: BoxProps) => { return () => setNavigationIndex([]) }, []) - return {children} + return
{children}
} export default SectionContainer diff --git a/src/components/section-navigation/section-navigation.tsx b/src/components/section-navigation/section-navigation.tsx new file mode 100644 index 000000000..6c8f0d1e7 --- /dev/null +++ b/src/components/section-navigation/section-navigation.tsx @@ -0,0 +1,68 @@ +import { useAtom } from 'jotai' +import { useEffect } from 'react' +import { cn } from '@/lib/utils' +import { navigationIndexAtom } from './atoms' + +interface Props { + title?: string + sections: string[] + initialIndex?: number + className?: string +} + +const Navigation = ({ + title, + sections, + initialIndex = 0, + className, +}: Props) => { + const [current, setNavigationIndex] = useAtom(navigationIndexAtom) + + useEffect(() => { + return () => { + setNavigationIndex([]) + } + }, []) + + const handleNavigate = (index: number) => { + const target = document.getElementById(`section-${index}`) + const wrapper = document.getElementById('app-container') + + if (target && wrapper) { + const count = target.offsetTop - wrapper.scrollTop - 20 + wrapper.scrollBy({ top: count, left: 0, behavior: 'smooth' }) + } + } + + const active = Math.min(...current) + + return ( +
+ {!!title &&

{title}

} +
    + {sections.map((item, index) => { + const currentIndex = index + initialIndex + const isActive = active === currentIndex + + return ( +
  • !isActive && handleNavigate(currentIndex)} + className={cn( + 'leading-4 cursor-pointer', + index > 0 && 'mt-4', + isActive ? 'border-l-[3px] border-foreground pl-[13px]' : 'pl-4' + )} + > + + {item} + +
  • + ) + })} +
+
+ ) +} + +export default Navigation diff --git a/src/components/section-navigation/SectionWrapper.tsx b/src/components/section-navigation/section-wrapper.tsx similarity index 76% rename from src/components/section-navigation/SectionWrapper.tsx rename to src/components/section-navigation/section-wrapper.tsx index 5d26b65ca..a82be7241 100644 --- a/src/components/section-navigation/SectionWrapper.tsx +++ b/src/components/section-navigation/section-wrapper.tsx @@ -1,11 +1,9 @@ -import { atom } from 'jotai' -import { useSetAtom } from 'jotai' +import { atom, useSetAtom } from 'jotai' import { useEffect } from 'react' import { useInView } from 'react-intersection-observer' -import { Box, BoxProps } from 'theme-ui' import { navigationIndexAtom } from './atoms' -interface Props extends BoxProps { +interface Props extends React.HTMLAttributes { navigationIndex: number threshold?: number } @@ -25,7 +23,6 @@ const updateSectionAtom = atom(null, (get, set, section: [boolean, number]) => { } }) -// TODO: Store ref on atom? this would allow to use it directly rather than use js for the scrolling const SectionWrapper = ({ navigationIndex, threshold = 0.6, @@ -38,7 +35,7 @@ const SectionWrapper = ({ updateNavigationIndex([inView, navigationIndex]) }, [inView]) - return + return
} export default SectionWrapper diff --git a/src/components/section-navigation/useSectionNavigate.ts b/src/components/section-navigation/use-section-navigate.ts similarity index 100% rename from src/components/section-navigation/useSectionNavigate.ts rename to src/components/section-navigation/use-section-navigate.ts diff --git a/src/components/sidebar/index.tsx b/src/components/sidebar/index.tsx index e863a451c..a833e06c8 100644 --- a/src/components/sidebar/index.tsx +++ b/src/components/sidebar/index.tsx @@ -1,55 +1,34 @@ -import { ReactNode } from 'react' import { createPortal } from 'react-dom' -import { Box, BoxProps } from 'theme-ui' +import { cn } from '@/lib/utils' -interface Props extends BoxProps { +interface Props { onClose(): void width?: string + children?: React.ReactNode + className?: string } -const Sidebar = ({ - onClose, - width = '600', - children, - sx = {}, - ...props -}: Props) => +const Sidebar = ({ onClose, width = '600px', children, className }: Props) => createPortal( <> - ({ - position: 'fixed', - left: 0, - top: 0, - zIndex: 100000, - opacity: '50%', - width: '100vw', - height: '100%', - backgroundColor: theme.colors?.modalOverlay, - })} - {...props} + className="fixed left-0 top-0 z-[100000] opacity-50 w-screen h-full bg-black/50" /> - ({ - flexDirection: 'column', - zIndex: 100001, - display: 'flex', - position: 'absolute', - maxWidth: ['100vw', '100vw', '840px'], - width: ['100vw', '100vw', width], - backgroundColor: 'background', - right: 0, - borderLeft: `solid 1px ${theme.colors?.borderFocused}`, - boxShadow: '-32px 0px 64px rgba(0, 0, 0, 0.15)', - top: 0, - height: '100%', - overflow: 'hidden', - ...sx, - })} + {/* Sidebar panel */} +
{children} - +
, document.body ) diff --git a/src/components/stake-drawer/components/submit-stake-button.tsx b/src/components/stake-drawer/components/submit-stake-button.tsx index 469e76b46..2beafe178 100644 --- a/src/components/stake-drawer/components/submit-stake-button.tsx +++ b/src/components/stake-drawer/components/submit-stake-button.tsx @@ -1,4 +1,4 @@ -import TransactionButton from '@/components/old/button/TransactionButton' +import TransactionButton from '@/components/ui/transaction-button' import { walletAtom } from '@/state/atoms' import { useAtomValue, useSetAtom } from 'jotai' import { useEffect, useState } from 'react' @@ -219,7 +219,7 @@ const SubmitStakeButton = () => { } onClick={readyToSubmit ? write : approve} text={getButtonText()} - fullWidth + className="w-full" error={ readyToSubmit ? error || txError diff --git a/src/components/stake-drawer/components/submit-unstake-button.tsx b/src/components/stake-drawer/components/submit-unstake-button.tsx index 62d7152a9..efabaa40e 100644 --- a/src/components/stake-drawer/components/submit-unstake-button.tsx +++ b/src/components/stake-drawer/components/submit-unstake-button.tsx @@ -1,4 +1,4 @@ -import TransactionButton from '@/components/old/button/TransactionButton' +import TransactionButton from '@/components/ui/transaction-button' import { walletAtom } from '@/state/atoms' import { useAtomValue, useSetAtom } from 'jotai' import { useEffect, useState } from 'react' @@ -102,7 +102,7 @@ const SubmitUnstakeButton = () => { } onClick={write} text={getButtonText()} - fullWidth + className="w-full" error={error || txError} />
diff --git a/src/components/tab-menu/index.tsx b/src/components/tab-menu/index.tsx index 4dff288c8..548d906cf 100644 --- a/src/components/tab-menu/index.tsx +++ b/src/components/tab-menu/index.tsx @@ -1,7 +1,5 @@ -import React, { useMemo } from 'react' -import { useCallback, useState } from 'react' -import { borderRadius } from 'theme' -import { Box, BoxProps, Text } from 'theme-ui' +import React, { useCallback } from 'react' +import { cn } from '@/lib/utils' interface Item { key: string | number @@ -9,102 +7,67 @@ interface Item { icon?: JSX.Element } -interface Props extends BoxProps { +interface Props { items: Item[] onMenuChange(key: string): void active: string | number small?: boolean - background?: string collapse?: boolean + className?: string + ml?: string + mt?: number | number[] + background?: string } -const defaultStyles = ( - background: string, - small: boolean, - collapse: boolean -) => ({ - // border: '1px solid', - // borderColor: 'border', - color: 'secondaryText', - fontSize: small ? 0 : 1, - fontWeight: small ? 500 : 400, - borderRadius: borderRadius.inputs, - background: 'inputBackground', - width: 'fit-content', - '>div': { - padding: small ? '6px' : '6px 8px 6px 8px', - lineHeight: '16px', - userSelect: 'none', - cursor: 'pointer', - display: 'flex', - alignItems: 'center', - backgroundColor: 'transparent', - borderRadius: borderRadius.inner, - justifyContent: 'center', - width: collapse ? [40, 'auto'] : 'auto', - marginLeft: '2px', - ':first-of-type': { - marginLeft: 0, - }, - ':hover': { - backgroundColor: 'inputBorder', - }, - '&.active': { - backgroundColor: 'focusedBackground', - color: 'accentInverted', - fontWeight: 500, - }, - }, -}) - const MenuItem = ({ item, onClick, isActive, collapse, + small, }: { item: Item onClick(key: string | number): void isActive: boolean collapse: boolean + small: boolean }) => { return (
onClick(item.key)} > {item.icon} - {item.label} - +
) } -// Reusable implementation, different from token header as it doesnt relies on routes -// TODO: refactor header menu to not rely on react-router at least on the inner component level. const TabMenu = ({ items, onMenuChange, small = false, collapse = false, - background = 'transparent', active, - sx, - ...props + className, + ml, + mt, + background, }: Props) => { - // TODO: Styles got a typing error, for some reason userSelect: 'none' is not valid? - const styles: any = useMemo(() => { - return { - ...defaultStyles(background, small, collapse), - ...(sx ?? {}), - } - }, [background, collapse, small, sx]) - const handleSelect = useCallback( (key: string) => { onMenuChange(key) @@ -113,7 +76,13 @@ const TabMenu = ({ ) return ( - +
{items.map((item) => ( ))} - +
) } diff --git a/src/components/tables/ListedTokensTable.tsx b/src/components/tables/ListedTokensTable.tsx index c5b473e4c..966958e60 100644 --- a/src/components/tables/ListedTokensTable.tsx +++ b/src/components/tables/ListedTokensTable.tsx @@ -1,14 +1,14 @@ import { t } from '@lingui/macro' import { createColumnHelper } from '@tanstack/react-table' import ChainLogo from 'components/icons/ChainLogo' -import { Table, TableProps } from '@/components/old/table' +import { Table, TableProps } from '@/components/ui/legacy-table' import TokenItem from 'components/token-item' +import Spinner from '@/components/ui/spinner' import useRTokenLogo from 'hooks/useRTokenLogo' import useTokenList, { ListedToken } from 'hooks/useTokenList' import mixpanel from 'mixpanel-browser/src/loaders/loader-module-core' import { useMemo } from 'react' import { useNavigate } from 'react-router-dom' -import { Box, Spinner, Text } from 'theme-ui' import { formatCurrency, formatCurrencyCell, @@ -52,16 +52,7 @@ const ListedTokensTable = (props: Partial) => { columnHelper.accessor('targetUnits', { header: t`Target(s)`, cell: (data) => { - return ( - - {data.getValue()} - - ) + return {data.getValue()} }, }), columnHelper.accessor('chain', { @@ -93,14 +84,14 @@ const ListedTokensTable = (props: Partial) => { {...props} /> {isLoading && ( - +
- +
)} {!isLoading && !list.length && ( - - No RTokens listed for this chain - +
+ No RTokens listed for this chain +
)} ) diff --git a/src/components/token-balance/index.tsx b/src/components/token-balance/index.tsx index b8772039e..23c7a4ba5 100644 --- a/src/components/token-balance/index.tsx +++ b/src/components/token-balance/index.tsx @@ -1,12 +1,17 @@ +import Help from 'components/help' import TokenLogo from 'components/icons/TokenLogo' -import IconInfo, { IconInfoProps } from '@/components/old/info-icon' import { formatCurrency } from 'utils' +import { cn } from '@/lib/utils' -interface Props extends Partial { +interface Props { symbol?: string balance: number usd?: boolean logoSrc?: string + title?: string + icon?: React.ReactNode + help?: string + className?: string } const TokenBalance = ({ @@ -16,14 +21,19 @@ const TokenBalance = ({ usd = false, logoSrc, icon, - ...props + help, + className, }: Props) => ( - } - {...props} - /> +
+ {icon || } +
+
+ {title || symbol} + {!!help && } +
+ {`${usd ? '$' : ''}${formatCurrency(balance || 0, 6)}`} +
+
) export default TokenBalance diff --git a/src/components/token-item/index.tsx b/src/components/token-item/index.tsx index 191398a3b..1dcbad38f 100644 --- a/src/components/token-item/index.tsx +++ b/src/components/token-item/index.tsx @@ -2,38 +2,31 @@ import TokenLogo from 'components/icons/TokenLogo' import Arbitrum from 'components/icons/logos/Arbitrum' import Base from 'components/icons/logos/Base' import Ethereum from 'components/icons/logos/Ethereum' -import { Box, BoxProps, Flex, Text } from 'theme-ui' import { ChainId } from 'utils/chains' import BSC from '../icons/logos/BSC' -interface Props extends BoxProps { +interface Props { symbol: string logo?: string width?: number chainId?: number | null + className?: string + sx?: Record } -const TokenItem = ({ symbol, logo, width = 24, chainId, ...props }: Props) => ( - - - - {symbol} - - +const TokenItem = ({ symbol, logo, width = 24, chainId, className, sx }: Props) => ( +
+
+ + {symbol} +
+
{chainId === ChainId.Mainnet && } {chainId === ChainId.Base && } {chainId === ChainId.Arbitrum && } {chainId === ChainId.BSC && } - - +
+
) export default TokenItem diff --git a/src/components/token-logo/StackTokenLogo.tsx b/src/components/token-logo/StackTokenLogo.tsx index 16f1eea1d..3bd1a84ff 100644 --- a/src/components/token-logo/StackTokenLogo.tsx +++ b/src/components/token-logo/StackTokenLogo.tsx @@ -1,25 +1,25 @@ import LegacyTokenLogo from 'components/icons/TokenLogo' import TokenLogo from '.' import React from 'react' -import { Box, BoxProps } from 'theme-ui' +import { cn } from '@/lib/utils' -interface Props extends BoxProps { +interface Props { tokens: { symbol: string; logo?: string; address: string; chain?: number }[] size?: number reverseStack?: boolean overlap?: number outsource?: boolean + className?: string } const StackTokenLogo = React.memo( ({ tokens, - sx = {}, size, reverseStack = false, overlap = 0, outsource = false, - ...props + className, }: Props) => { // Create a copy of the array before reversing it const orderedTokens = React.useMemo(() => { @@ -28,42 +28,30 @@ const StackTokenLogo = React.memo( }, [tokens, reverseStack]) return ( - {orderedTokens.map((token, index) => { if (token.symbol === 'FRAXBP') { return ( - +
- +
) } @@ -72,13 +60,10 @@ const StackTokenLogo = React.memo( const m = first ? 0 : gap return ( - {outsource ? ( )} - +
) })} -
+
) } ) diff --git a/src/components/token-logo/index.tsx b/src/components/token-logo/index.tsx index 9f79e24aa..fa81d8519 100644 --- a/src/components/token-logo/index.tsx +++ b/src/components/token-logo/index.tsx @@ -4,6 +4,7 @@ import { indexDTFIconsAtom } from '@/views/portfolio/atoms' import { useAtom, useAtomValue } from 'jotai' import * as React from 'react' import { routeCacheAtom } from './atoms' +import { TOKEN_LOGO_MAPPINGS } from './token-logo-mappings' type Sizes = 'sm' | 'md' | 'lg' | 'xl' @@ -113,6 +114,17 @@ const TokenLogo = React.forwardRef((props, ref) => { return } + // Check pre-computed mappings (build-time resolved logos) + if (symbol) { + const mappedUrl = TOKEN_LOGO_MAPPINGS[symbol.toLowerCase()] + if (mappedUrl) { + const url = await tryLoadImage(mappedUrl) + cacheUrl(url) + setCurrentSrc(url) + return + } + } + if (address && symbol && UNIVERSAL_ASSETS.has(address.toLowerCase())) { try { const universalUrl = `https://app.universal.xyz/wrapped-tokens/UA-${symbol.toUpperCase().substring(1)}.svg` diff --git a/src/components/token-logo/token-logo-mappings.ts b/src/components/token-logo/token-logo-mappings.ts new file mode 100644 index 000000000..7ae8b5d70 --- /dev/null +++ b/src/components/token-logo/token-logo-mappings.ts @@ -0,0 +1,120 @@ +// Auto-generated by scripts/refresh-token-logos.ts +// Do not edit manually + +export const TOKEN_LOGO_MAPPINGS: Record = { + "crv": "https://token-icons.llamao.fi/icons/tokens/1/0xd533a949740bb3306d119cc777fa900ba034cd52", + "ogn": "https://token-icons.llamao.fi/icons/tokens/1/0x8207c1ffc5b6804f6024322ccf34f29c3541ae26", + "inv": "https://token-icons.llamao.fi/icons/tokens/1/0x41d5d79431a913c4ae7d69a668ecdfe5ff9dfb68", + "lqty": "https://token-icons.llamao.fi/icons/tokens/1/0x6dea81c8171d0ba574754ef6f8b412f2ed88c54d", + "rsup": "https://token-icons.llamao.fi/icons/tokens/1/0x419905009e4656fdc02418c7df35b1e61ed5f726", + "fxn": "https://token-icons.llamao.fi/icons/tokens/1/0x365accfca291e7d3914637abf1f7635db165bb09", + "alcx": "https://token-icons.llamao.fi/icons/tokens/1/0xdbdb4d16eda451d0503b854cf79d55697f90c8df", + "cbbtc": "https://dd.dexscreener.com/ds-data/tokens/base/0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf.png?size=lg", + "sky": "https://token-icons.llamao.fi/icons/tokens/1/0x56072c95faa701256059aa122697b133aded9279", + "morpho": "https://token-icons.llamao.fi/icons/tokens/1/0x58d97b57bb95320f9a05dc918aef65434969c2b2", + "ldo": "https://token-icons.llamao.fi/icons/tokens/1/0x5a98fcbea516cf06857215779fd812ca3bef1b32", + "cow": "https://token-icons.llamao.fi/icons/tokens/1/0xdef1ca1fb7fbcdc777520aa7f396b4e015f497ab", + "cpool": "https://token-icons.llamao.fi/icons/tokens/1/0x66761fa41377003622aee3c7675fc7b5c1c2fac5", + "eul": "https://token-icons.llamao.fi/icons/tokens/1/0xd9fcd98c322942075a5c3860693e9f4f03aae07b", + "fluid": "https://token-icons.llamao.fi/icons/tokens/1/0x6f40d4a6237c257fff2db00fa0510deeecd303eb", + "syrup": "https://token-icons.llamao.fi/icons/tokens/1/0x643c4e15d7d62ad0abec4a9bd4b001aa3ef52d66", + "resolv": "https://token-icons.llamao.fi/icons/tokens/1/0x259338656198ec7a76c729514d3cb45dfbf768a1", + "uni": "https://token-icons.llamao.fi/icons/tokens/1/0x1f9840a85d5af5bf1d1762f925bdaddc4201f984", + "ondo": "https://token-icons.llamao.fi/icons/tokens/1/0xfaba6f8e4a5e8ab82f62fe7c39859fa577269be3", + "pendle": "https://token-icons.llamao.fi/icons/tokens/1/0x808507121b80c02388fad14726482e061b8da827", + "ethfi": "https://token-icons.llamao.fi/icons/tokens/1/0xfe0c30065b384f05761f15d0cc899d4f9f9cc0eb", + "eigen": "https://token-icons.llamao.fi/icons/tokens/1/0xec53bf9167f50cdeb3ae105f56099aaab9061f83", + "mkr": "https://token-icons.llamao.fi/icons/tokens/1/0x9f8f72aa9304c8b593d555f12ef6589cc3a579a2", + "plume": "https://token-icons.llamao.fi/icons/tokens/1/0x4c1746a800d224393fe2470c70a35717ed4ea5f1", + "cfg": "https://token-icons.llamao.fi/icons/tokens/1/0xcccccccccc33d538dbc2ee4feab0a7a1ff4e8a94", + "uxrp": "https://token-icons.llamao.fi/icons/tokens/8453/0x2615a94df961278dcbc41fb0a54fec5f10a693ae", + "usol": "https://token-icons.llamao.fi/icons/tokens/8453/0x9b8df6e244526ab5f6e6400d331db28c8fdddb55", + "udoge": "https://token-icons.llamao.fi/icons/tokens/8453/0x12e96c2bfea6e835cf8dd38a5834fa61cf723736", + "uada": "https://token-icons.llamao.fi/icons/tokens/8453/0xa3a34a0d9a08ccddb6ed422ac0a28a06731335aa", + "usui": "https://token-icons.llamao.fi/icons/tokens/8453/0xb0505e5a99abd03d94a1169e638b78edfed26ea4", + "ulink": "https://token-icons.llamao.fi/icons/tokens/8453/0xd403d1624daef243fbcbd4a80d8a6f36affe32b2", + "uapt": "https://token-icons.llamao.fi/icons/tokens/8453/0x9c0e042d65a2e1ff31ac83f404e5cb79f452c337", + "uatom": "https://token-icons.llamao.fi/icons/tokens/8453/0x6e934283dae5d5d1831cbe8d557c44c9b83f30ee", + "uavax": "https://token-icons.llamao.fi/icons/tokens/8453/0xd6a34b430c05ac78c24985f8abee2616bc1788cb", + "unear": "https://token-icons.llamao.fi/icons/tokens/8453/0x5ed25e305e08f58afd7995eac72563e6be65a617", + "usei": "https://token-icons.llamao.fi/icons/tokens/8453/0x71a67215a2025f501f386a49858a9ced2fc0249d", + "bsdeth": "https://token-icons.llamao.fi/icons/tokens/8453/0xcb327b99ff831bf8223cced12b1338ff3aa322ff", + "coinage": "https://dd.dexscreener.com/ds-data/tokens/base/0xf4d7fd100b5b03e51261a2e6a673632ef2c68896.png?size=lg", + "edge": "https://dd.dexscreener.com/ds-data/tokens/base/0xed6e000def95780fb89734c07ee2ce9f6dcaf110.png?size=lg", + "tibbir": "https://dd.dexscreener.com/ds-data/tokens/base/0xa4a2e2ca3fbfe21aed83471d28b6f65a233c6e00.png?size=lg", + "cookie": "https://dd.dexscreener.com/ds-data/tokens/base/0xc0041ef357b183448b235a8ea73ce4e4ec8c265f.png?size=lg", + "sqdgn": "https://dd.dexscreener.com/ds-data/tokens/base/0x4674f73545f1db4036250ff8c33a39ad1678d864.png?size=lg", + "bios": "https://dd.dexscreener.com/ds-data/tokens/base/0x73cb479f2ccf77bad90bcda91e3987358437240a.png?size=lg", + "kudai": "https://dd.dexscreener.com/ds-data/tokens/base/0x288f4eb27400fa220d14b864259ad1b7f77c1594.png?size=lg", + "a0x": "https://dd.dexscreener.com/ds-data/tokens/base/0x820c5f0fb255a1d18fd0ebb0f1ccefbc4d546da7.png?size=lg", + "tig": "https://dd.dexscreener.com/ds-data/tokens/base/0x0c03ce270b4826ec62e7dd007f0b716068639f7b.png?size=lg", + "drb": "https://dd.dexscreener.com/ds-data/tokens/base/0x3ec2156d4c0a9cbdab4a016633b7bcf6a8d68ea2.png?size=lg", + "clanker": "https://dd.dexscreener.com/ds-data/tokens/base/0x1bc0c42215582d5a085795f4badbac3ff36d1bcb.png?size=lg", + "sire": "https://dd.dexscreener.com/ds-data/tokens/base/0x7ce02e86354ea0cc3b302aeadc0ab56bc7eb44b8.png?size=lg", + "giza": "https://dd.dexscreener.com/ds-data/tokens/base/0x590830dfdf9a3f68afcdde2694773debdf267774.png?size=lg", + "facy": "https://dd.dexscreener.com/ds-data/tokens/base/0xfac77f01957ed1b3dd1cbea992199b8f85b6e886.png?size=lg", + "toshi": "https://dd.dexscreener.com/ds-data/tokens/base/0xac1bd2486aaf3b5c0fc3fd868558b082a531b2b4.png?size=lg", + "npc": "https://dd.dexscreener.com/ds-data/tokens/base/0xb166e8b140d35d9d8226e40c09f757bac5a4d87d.png?size=lg", + "kta": "https://dd.dexscreener.com/ds-data/tokens/base/0xc0634090f2fe6c6d75e61be2b949464abb498973.png?size=lg", + "ethy": "https://dd.dexscreener.com/ds-data/tokens/base/0xc44141a684f6aa4e36cd9264ab55550b03c88643.png?size=lg", + "altt": "https://dd.dexscreener.com/ds-data/tokens/base/0x1b5ce2a593a840e3ad3549a34d7b3dec697c114d.png?size=lg", + "bnkr": "https://dd.dexscreener.com/ds-data/tokens/base/0x22af33fe49fd1fa80c7149773dde5890d3c76f3b.png?size=lg", + "fartcoin": "https://dd.dexscreener.com/ds-data/tokens/base/0x2f6c17fa9f9bc3600346ab4e48c0701e1d5962ae.png?size=lg", + "fair": "https://dd.dexscreener.com/ds-data/tokens/base/0x7d928816cc9c462dd7adef911de41535e444cb07.png?size=lg", + "noice": "https://dd.dexscreener.com/ds-data/tokens/base/0x9cb41fd9dc6891bae8187029461bfaadf6cc0c69.png?size=lg", + "bracky": "https://dd.dexscreener.com/ds-data/tokens/base/0x06f71fb90f84b35302d132322a3c90e4477333b0.png?size=lg", + "regent": "https://dd.dexscreener.com/ds-data/tokens/base/0x6f89bca4ea5931edfcb09786267b251dee752b07.png?size=lg", + "aero": "https://dd.dexscreener.com/ds-data/tokens/base/0x940181a94a35a4569e4529a3cdfb74e38fd98631.png?size=lg", + "zora": "https://dd.dexscreener.com/ds-data/tokens/base/0x1111111111166b7fe7bd91427724b487980afc69.png?size=lg", + "rsc": "https://dd.dexscreener.com/ds-data/tokens/base/0xfbb75a59193a3525a8825bebe7d4b56899e2f7e1.png?size=lg", + "seda": "https://dd.dexscreener.com/ds-data/tokens/base/0x306acd0c07c430abbbb2e74ef7bde94f32a898c0.png?size=lg", + "sapien": "https://dd.dexscreener.com/ds-data/tokens/base/0xc729777d0470f30612b1564fd96e8dd26f5814e3.png?size=lg", + "avnt": "https://dd.dexscreener.com/ds-data/tokens/base/0x696f9436b67233384889472cd7cd58a6fb5df4f1.png?size=lg", + "miggles": "https://dd.dexscreener.com/ds-data/tokens/base/0xb1a03eda10342529bbf8eb700a06c60441fef25d.png?size=lg", + "keycat": "https://dd.dexscreener.com/ds-data/tokens/base/0x9a26f5433671751c3276a065f57e5a02d2817973.png?size=lg", + "uarb": "https://token-icons.llamao.fi/icons/tokens/8453/0xd01cb4171a985571deff48c9dc2f6e153a244d64", + "jesse": "https://dd.dexscreener.com/ds-data/tokens/base/0x50f88fe97f72cd3e75b9eb4f747f59bceba80d59.png?size=lg", + "balajis": "https://dd.dexscreener.com/ds-data/tokens/base/0xcaf75598b8b9a6e645b60d882845d361f549f5ec.png?size=lg", + "propaganda": "https://dd.dexscreener.com/ds-data/tokens/base/0xfe9ede4478ad200a2186175a81f9ce9f0e679270.png?size=lg", + "docker": "https://dd.dexscreener.com/ds-data/tokens/base/0x56f8ad6112c2db9f9848243531b277ce1c3be30c.png?size=lg", + "jacob": "https://dd.dexscreener.com/ds-data/tokens/base/0x9b13358e3a023507e7046c18f508a958cda75f54.png?size=lg", + "11am": "https://dd.dexscreener.com/ds-data/tokens/base/0xafd3a55ae8c86fb550495223f92f1af192e163fd.png?size=lg", + "zxbt": "https://dd.dexscreener.com/ds-data/tokens/base/0xe99d2f7988c5f2d013a34e7484f079cab87f469f.png?size=lg", + "vv": "https://dd.dexscreener.com/ds-data/tokens/base/0xd2969cc475a49e73182ae1c517add57db0f1c2ac.png?size=lg", + "latenightonbase": "https://dd.dexscreener.com/ds-data/tokens/base/0x8c32bcfc720fec35443748a96030ce866d0665ff.png?size=lg", + "virtual": "https://dd.dexscreener.com/ds-data/tokens/base/0x0b3e328455c4059eeb9e3f84b5543f74e24e7e1b.png?size=lg", + "fai": "https://dd.dexscreener.com/ds-data/tokens/base/0xb33ff54b9f7242ef1593d2c9bcd8f9df46c77935.png?size=lg", + "aixbt": "https://dd.dexscreener.com/ds-data/tokens/base/0x4f9fd6be4a90f2620860d680c0d4d5fb53d1a825.png?size=lg", + "vvv": "https://dd.dexscreener.com/ds-data/tokens/base/0xacfe6019ed1a7dc6f7b508c02d1b04ec88cc21bf.png?size=lg", + "tony": "https://dd.dexscreener.com/ds-data/tokens/base/0xb22a793a81ff5b6ad37f40d5fe1e0ac4184d52f3.png?size=lg", + "rekt": "https://dd.dexscreener.com/ds-data/tokens/base/0xb3e3c89b8d9c88b1fe96856e382959ee6291ebba.png?size=lg", + "rei": "https://dd.dexscreener.com/ds-data/tokens/base/0x6b2504a03ca4d43d0d73776f6ad46dab2f2a4cfd.png?size=lg", + "game": "https://dd.dexscreener.com/ds-data/tokens/base/0x1c4cca7c5db003824208adda61bd749e55f463a3.png?size=lg", + "vader": "https://dd.dexscreener.com/ds-data/tokens/base/0x731814e491571a2e9ee3c5b1f7f3b962ee8f4870.png?size=lg", + "luna": "https://dd.dexscreener.com/ds-data/tokens/base/0x55cd6469f597452b5a7536e2cd98fde4c1247ee4.png?size=lg", + "axr": "https://dd.dexscreener.com/ds-data/tokens/base/0x58db197e91bc8cf1587f75850683e4bd0730e6bf.png?size=lg", + "wire": "https://dd.dexscreener.com/ds-data/tokens/base/0x0b3ae50babe7ffa4e1a50569cee6bdefd4ccaee0.png?size=lg", + "vpay": "https://dd.dexscreener.com/ds-data/tokens/base/0x98ac5b33a4ef1151f138941c979211599c2ff953.png?size=lg", + "spx": "https://dd.dexscreener.com/ds-data/tokens/base/0x50da645f148798f68ef2d7db7c1cb22a6819bb2c.png?size=lg", + "mog": "https://dd.dexscreener.com/ds-data/tokens/base/0x2da56acb9ea78330f947bd57c54119debda7af71.png?size=lg", + "tybg": "https://dd.dexscreener.com/ds-data/tokens/base/0x0d97f261b1e88845184f678e2d1e7a98d9fd38de.png?size=lg", + "pepe": "https://token-icons.llamao.fi/icons/tokens/8453/0xb4fde59a779991bfb6a52253b51947828b982be3", + "shekel": "https://dd.dexscreener.com/ds-data/tokens/base/0x5f6a682a58854c7fbe228712aeeffccde0008ac0.png?size=lg", + "higher": "https://dd.dexscreener.com/ds-data/tokens/base/0x0578d8a44db98b23bf096a382e016e29a5ce0ffe.png?size=lg", + "moobifi": "https://dd.dexscreener.com/ds-data/tokens/base/0xc55e93c62874d8100dbd2dfe307edc1036ad5434.png?size=lg", + "degen": "https://dd.dexscreener.com/ds-data/tokens/base/0x4ed4e862860bed51a9570b96d89af5e1b0efefed.png?size=lg", + "bitcoin": "https://dd.dexscreener.com/ds-data/tokens/base/0x2a06a17cbc6d0032cac2c6696da90f29d39a1a29.png?size=lg", + "btcb": "https://token-icons.llamao.fi/icons/tokens/56/0x7130d2a12b9bcbfae4f2634d864a1ee1ce3ead9c", + "xrp": "https://token-icons.llamao.fi/icons/tokens/56/0x1d2f0da169ceb9fc7b3144628db156f3f6c60dbe", + "sol": "https://token-icons.llamao.fi/icons/tokens/56/0x570a5d26f7765ecb712c0924e4de545b89fd43df", + "doge": "https://token-icons.llamao.fi/icons/tokens/56/0xba2ae424d960c26247dd6c32edc70b295c744c43", + "ada": "https://token-icons.llamao.fi/icons/tokens/56/0x3ee2200efb3400fabb9aacf31297cbdd1d435d47", + "link": "https://token-icons.llamao.fi/icons/tokens/56/0xf8a0bf9cf54bb92f17374d9e9a321e6a111a51bd", + "bch": "https://token-icons.llamao.fi/icons/tokens/56/0x8ff795a6f4d97e7887c79bea79aba5cc76444adf", + "avax": "https://token-icons.llamao.fi/icons/tokens/56/0x1ce0c2827e2ef14d5c4f29a091d735a204794041", + "ltc": "https://token-icons.llamao.fi/icons/tokens/56/0x4338665cbb7b2485a8855a139b75d5e34ab0db94", + "shib": "https://token-icons.llamao.fi/icons/tokens/56/0x2859e4544c4bb03966803b044a93563bd2d0dd4d", + "zec": "https://token-icons.llamao.fi/icons/tokens/56/0x1ba42e5193dfa8b03d15dd1b86a3113bbbef8eeb" +} + +export const LAST_UPDATED = 1769045874631 diff --git a/src/components/track-asset/index.tsx b/src/components/track-asset/index.tsx index daa47e847..3beae998a 100644 --- a/src/components/track-asset/index.tsx +++ b/src/components/track-asset/index.tsx @@ -1,6 +1,9 @@ -import { MouseoverTooltip } from '@/components/old/tooltip' +import { + Tooltip, + TooltipContent, + TooltipTrigger, +} from '@/components/ui/tooltip' import { Bookmark } from 'lucide-react' -import { IconButton } from 'theme-ui' import { Token } from 'types' import { useWalletClient } from 'wagmi' @@ -25,17 +28,18 @@ const TrackAsset = ({ token }: { token: Token }) => { } return ( - - - - - + + + + + Track token in your wallet + ) } diff --git a/src/components/transaction-error/TransactionError.tsx b/src/components/transaction-error/TransactionError.tsx index 6c745fc92..9b9387fe6 100644 --- a/src/components/transaction-error/TransactionError.tsx +++ b/src/components/transaction-error/TransactionError.tsx @@ -1,11 +1,12 @@ -import { BoxProps, Box, Text } from 'theme-ui' +import { cn } from '@/lib/utils' -interface Props extends BoxProps { +interface Props { error?: Error | null withName?: boolean + className?: string } -const TransactionError = ({ error, withName = true, ...props }: Props) => { +const TransactionError = ({ error, withName = true, className }: Props) => { if (!error) { return null } @@ -24,20 +25,18 @@ const TransactionError = ({ error, withName = true, ...props }: Props) => { } return ( - - + {withName && `${error.name}:`} {withName &&
} {message} -
-
+ + ) } diff --git a/src/components/transaction-input/index.tsx b/src/components/transaction-input/index.tsx index 2b94ba3c3..18052d9de 100644 --- a/src/components/transaction-input/index.tsx +++ b/src/components/transaction-input/index.tsx @@ -1,10 +1,10 @@ import { NumericalInput } from 'components' import Help from 'components/help' import { useAtom } from 'jotai' -import { Box, BoxProps, Flex, Text } from 'theme-ui' import { formatCurrency } from 'utils' +import { cn } from '@/lib/utils' -export interface TransactionInputProps extends BoxProps { +export interface TransactionInputProps { title?: string placeholder?: string compact?: boolean @@ -13,6 +13,7 @@ export interface TransactionInputProps extends BoxProps { disabled?: boolean autoFocus?: boolean hasThrottle?: boolean + className?: string } interface MaxLabelProps { @@ -30,19 +31,19 @@ export const MaxLabel = ({ help = '', handleClick, }: MaxLabelProps) => ( - - + {text} - + {!!help && } - + ) const TransactionInput = ({ @@ -54,31 +55,28 @@ const TransactionInput = ({ compact = true, autoFocus = false, hasThrottle = false, - ...props + className, }: TransactionInputProps) => { const [amount, setAmount] = useAtom(amountAtom) const maxLabel = ( - setAmount(maxAmount)} - as="a" - variant="a" - sx={{ display: 'block', fontSize: compact ? 1 : 2 }} - ml={'auto'} - mr={2} + className={cn( + 'block ml-auto mr-2 text-primary cursor-pointer hover:underline', + compact ? 'text-sm' : 'text-base' + )} > Max: {formatCurrency(+maxAmount, 5)} - + ) return ( - - - - {title} - - {compact && {maxLabel}} - +
+
+ + {compact &&
{maxLabel}
} +
- {!compact && ( - - {maxLabel} - - )} - + {!compact &&
{maxLabel}
} +
) } diff --git a/src/components/transaction-modal/ApprovalStatus.tsx b/src/components/transaction-modal/ApprovalStatus.tsx index a79fffba3..5c195b29a 100644 --- a/src/components/transaction-modal/ApprovalStatus.tsx +++ b/src/components/transaction-modal/ApprovalStatus.tsx @@ -1,7 +1,7 @@ import { Trans } from '@lingui/macro' import TokenLogo from 'components/icons/TokenLogo' +import Spinner from '@/components/ui/spinner' import { Check } from 'lucide-react' -import { Box, Spinner, Text } from 'theme-ui' import { Allowance } from 'types' import { Hex } from 'viem' @@ -14,27 +14,27 @@ interface IApprovalStatus { const ApprovalStatus = ({ allowance, hash, success }: IApprovalStatus) => { if (success) { return ( - +
- {allowance.symbol} Approved - + {allowance.symbol} Approved +
) } return ( - +
- - +
+ Approve in wallet - - + + {!hash && 'Proceed in wallet'} {hash && 'Confirming transaction'} - - - - + +
+ +
) } diff --git a/src/components/transaction-modal/EstimatedGasInfo.tsx b/src/components/transaction-modal/EstimatedGasInfo.tsx index 415ad3f84..17b51a87f 100644 --- a/src/components/transaction-modal/EstimatedGasInfo.tsx +++ b/src/components/transaction-modal/EstimatedGasInfo.tsx @@ -1,23 +1,24 @@ import { Trans } from '@lingui/macro' -import { Box, BoxProps, Spinner, Text } from 'theme-ui' +import Spinner from '@/components/ui/spinner' import { formatCurrency } from 'utils' -interface Props extends BoxProps { +interface Props { fee?: number | null + className?: string } -const EstimatedGasInfo = ({ fee, ...props }: Props) => { +const EstimatedGasInfo = ({ fee, className }: Props) => { return ( - - +
+ Estimated gas cost: - + {fee ? ( - ${formatCurrency(fee)} + ${formatCurrency(fee)} ) : ( - + )} - +
) } diff --git a/src/components/transaction-modal/ShowMore.tsx b/src/components/transaction-modal/ShowMore.tsx index 869445459..d07581a79 100644 --- a/src/components/transaction-modal/ShowMore.tsx +++ b/src/components/transaction-modal/ShowMore.tsx @@ -1,29 +1,29 @@ -import Button from '@/components/old/button' +import { Button } from '@/components/ui/button' import AsteriskIcon from 'components/icons/AsteriskIcon' import { useState } from 'react' -import { Box, BoxProps, Divider, Text } from 'theme-ui' -const ShowMore = ({ children, ...props }: BoxProps) => { +interface Props { + children: React.ReactNode + className?: string +} + +const ShowMore = ({ children, className }: Props) => { const [isVisible, setVisible] = useState(false) return ( - - - - - - - {isVisible && {children}} - +
+
+ {isVisible &&
{children}
} + ) } diff --git a/src/components/transaction-modal/TransactionConfirmedModal.tsx b/src/components/transaction-modal/TransactionConfirmedModal.tsx index 5cc8772cf..f797b2520 100644 --- a/src/components/transaction-modal/TransactionConfirmedModal.tsx +++ b/src/components/transaction-modal/TransactionConfirmedModal.tsx @@ -1,10 +1,9 @@ import { Trans } from '@lingui/macro' import ExternalArrowIcon from 'components/icons/ExternalArrowIcon' import TransactionSignedIcon from 'components/icons/SignedTransactionIcon' -import Modal from '@/components/old/modal' +import { Modal } from 'components' import { useAtomValue } from 'jotai' import { chainIdAtom } from 'state/atoms' -import { Flex, Link, Text } from 'theme-ui' import { ETHERSCAN_NAMES, ExplorerDataType, @@ -22,29 +21,23 @@ const TransactionConfirmedModal = ({ return ( - +

- + Transaction signed! - +
- View on {ETHERSCAN_NAMES[chainId]}{' '} - - + +
) } diff --git a/src/components/transaction-modal/TransactionError.tsx b/src/components/transaction-modal/TransactionError.tsx index acf62d796..1f914c95b 100644 --- a/src/components/transaction-modal/TransactionError.tsx +++ b/src/components/transaction-modal/TransactionError.tsx @@ -1,5 +1,4 @@ -import ModalAlert from '@/components/old/modal/ModalAlert' -import { Box, Text } from 'theme-ui' +import { Button } from '@/components/ui/button' const TransactionError = ({ onClose, @@ -10,19 +9,20 @@ const TransactionError = ({ title?: string subtitle?: string }) => ( - - - {title} - - - - {subtitle} - - - + <> + {/* Overlay */} +
+ {/* Content */} +
+

{title}

+
+ {subtitle} +
+ +
+ ) export default TransactionError diff --git a/src/components/transaction-modal/index.tsx b/src/components/transaction-modal/index.tsx index cafd5e53e..ed149c017 100644 --- a/src/components/transaction-modal/index.tsx +++ b/src/components/transaction-modal/index.tsx @@ -1,12 +1,12 @@ import { t } from '@lingui/macro' import ERC20 from 'abis/ERC20' -import TransactionButton from '@/components/old/button/TransactionButton' -import Modal, { ModalProps } from '@/components/old/modal' +import TransactionButton from '@/components/ui/transaction-button' +import { Separator } from '@/components/ui/separator' +import { Modal, ModalProps } from 'components' import useContractWrite from 'hooks/useContractWrite' import useWatchTransaction from 'hooks/useWatchTransaction' import { useAtomValue } from 'jotai' import { chainIdAtom, walletAtom } from 'state/atoms' -import { Divider, Text, Box } from 'theme-ui' import { Allowance } from 'types' import TransactionConfirmedModal from './TransactionConfirmedModal' import TransactionError from './TransactionError' @@ -40,14 +40,14 @@ const Approval = ({ return ( <> - + @@ -146,7 +146,7 @@ const TransactionModal = ({ {requiredAllowance && !hasAllowance && ( )} - + {!!validationMessage && ( - - {validationMessage} - +
+ {validationMessage} +
)} ) diff --git a/src/components/transaction-modal/transaction-confirmed-modal.tsx b/src/components/transaction-modal/transaction-confirmed-modal.tsx new file mode 100644 index 000000000..3dcdb3aa8 --- /dev/null +++ b/src/components/transaction-modal/transaction-confirmed-modal.tsx @@ -0,0 +1,50 @@ +import { Trans } from '@lingui/macro' +import ExternalArrowIcon from 'components/icons/ExternalArrowIcon' +import TransactionSignedIcon from 'components/icons/SignedTransactionIcon' +import { useAtomValue } from 'jotai' +import { chainIdAtom } from 'state/atoms' +import { + ETHERSCAN_NAMES, + ExplorerDataType, + getExplorerLink, +} from 'utils/getExplorerLink' +import { + Dialog, + DialogContent, +} from '@/components/ui/dialog' + +const TransactionConfirmedModal = ({ + hash, + onClose, +}: { + hash: string + onClose(): void +}) => { + const chainId = useAtomValue(chainIdAtom) + + return ( + !open && onClose()}> + +
+ +
+ + Transaction signed! + +
+ + View on {ETHERSCAN_NAMES[chainId]}{' '} + + +
+
+
+ ) +} + +export default TransactionConfirmedModal diff --git a/src/components/transaction-modal/transaction-error.tsx b/src/components/transaction-modal/transaction-error.tsx new file mode 100644 index 000000000..f31d792c1 --- /dev/null +++ b/src/components/transaction-modal/transaction-error.tsx @@ -0,0 +1,31 @@ +import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert' +import { Button } from '@/components/ui/button' +import { AlertCircle, X } from 'lucide-react' + +const TransactionError = ({ + onClose, + title, + subtitle, +}: { + onClose(): void + title?: string + subtitle?: string +}) => ( + + + {title} + + {subtitle} + + + +) + +export default TransactionError diff --git a/src/components/transactions/manager/TransactionHeader.tsx b/src/components/transactions/manager/TransactionHeader.tsx deleted file mode 100644 index 8bba8aef2..000000000 --- a/src/components/transactions/manager/TransactionHeader.tsx +++ /dev/null @@ -1,53 +0,0 @@ -import { Trans } from '@lingui/macro' -import { ConnectButton } from '@rainbow-me/rainbowkit' -import Button from '@/components/old/button' -import WalletIcon from 'components/icons/WalletOutlineIcon' -import { useSetAtom } from 'jotai' -import { ChevronDown, X } from 'lucide-react' -import { Box, Flex, Text } from 'theme-ui' -import { txSidebarToggleAtom } from './atoms' - -const TransactionHeader = () => { - const setSidebar = useSetAtom(txSidebarToggleAtom) - - return ( - - - Account - - - {({ account, openAccountModal }) => { - return ( - - - - {account?.displayName} - - - - ) - }} - - - - ) -} - -export default TransactionHeader diff --git a/src/components/transactions/manager/TransactionList.tsx b/src/components/transactions/manager/TransactionList.tsx deleted file mode 100644 index 32ec2d5b4..000000000 --- a/src/components/transactions/manager/TransactionList.tsx +++ /dev/null @@ -1,115 +0,0 @@ -import { Trans } from '@lingui/macro' -import EmptyBoxIcon from 'components/icons/EmptyBoxIcon' -import dayjs from 'dayjs' -import { atom, useAtomValue } from 'jotai' -import { ArrowUpRight, Check, X } from 'lucide-react' -import { chainIdAtom } from 'state/atoms' -import { - TransactionState, - currentTxHistoryAtom, -} from 'state/chain/atoms/transactionAtoms' -import { borderRadius } from 'theme' -import { Box, Flex, Grid, Link, Spinner, Text } from 'theme-ui' -import { ExplorerDataType, getExplorerLink } from 'utils/getExplorerLink' - -const txByDateAtom = atom((get) => { - const txs = get(currentTxHistoryAtom) - - return txs.reduce( - (txMap, tx) => { - const date = dayjs(tx.timestamp).format('MMM D') - - if (txMap[date]) { - txMap[date].push(tx) - } else { - txMap[date] = [tx] - } - - return txMap - }, - {} as { [x: string]: TransactionState[] } - ) -}) - -const TransactionItem = ({ tx }: { tx: TransactionState }) => { - let Icon: any = Spinner - let label = 'Mining' - - if (tx.status === 'success') { - Icon = Check - label = `Confirmed, Block ${tx.block}` - } else if (tx.status === 'error') { - Icon = X - label = `Reverted` - } - - return ( - - {tx.label} - - - {label} - {' '} - - - - Inspect - - - - - - ) -} - -const TransactionList = () => { - const txs = useAtomValue(txByDateAtom) - - return ( - - {Object.keys(txs).map((day) => ( - - - {day} - - {txs[day].map((tx) => ( - - ))} - - ))} - {!Object.keys(txs).length && ( - - - - No transactions in local memory... - - - )} - - ) -} - -export default TransactionList diff --git a/src/components/transactions/manager/TransactionSidebar.tsx b/src/components/transactions/manager/TransactionSidebar.tsx deleted file mode 100644 index 75b24026e..000000000 --- a/src/components/transactions/manager/TransactionSidebar.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import Sidebar from 'components/sidebar' -import { useAtom } from 'jotai' -import TransactionHeader from './TransactionHeader' -import TransactionList from './TransactionList' -import { txSidebarToggleAtom } from './atoms' -import { useAccount } from 'wagmi' -import { useEffect } from 'react' - -const TransactionSidebar = () => { - const [isVisible, setSidebar] = useAtom(txSidebarToggleAtom) - const { isConnected } = useAccount() - - useEffect(() => { - if (!isConnected && isVisible) { - setSidebar(false) - } - }, [isConnected]) - - if (!isVisible || !isConnected) { - return null - } - - return ( - setSidebar(false)} width="600px"> - - - - ) -} - -export default TransactionSidebar diff --git a/src/components/transactions/manager/atoms.ts b/src/components/transactions/manager/atoms.ts deleted file mode 100644 index e395aa52f..000000000 --- a/src/components/transactions/manager/atoms.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { atom } from 'jotai' - -export const txSidebarToggleAtom = atom(false) diff --git a/src/components/transactions/table/index.tsx b/src/components/transactions/table/index.tsx index 6759d32f6..3ab79ebf4 100644 --- a/src/components/transactions/table/index.tsx +++ b/src/components/transactions/table/index.tsx @@ -2,18 +2,17 @@ import { t, Trans } from '@lingui/macro' import { createColumnHelper } from '@tanstack/react-table' import Help from 'components/help' import ChainLogo from 'components/icons/ChainLogo' -import { Table } from '@/components/old/table' +import { Table } from '@/components/ui/legacy-table' import { useAtomValue } from 'jotai' import mixpanel from 'mixpanel-browser/src/loaders/loader-module-core' import { useMemo } from 'react' import { blockTimestampAtom, chainIdAtom, rTokenAtom } from 'state/atoms' -import { borderRadius } from 'theme' -import { Box, BoxProps, Flex, Link, Text } from 'theme-ui' +import { cn } from '@/lib/utils' import { StringMap, TransactionRecord } from 'types' import { formatUsdCurrencyCell, relativeTime, shortenString } from 'utils' import { ExplorerDataType, getExplorerLink } from 'utils/getExplorerLink' -interface Props extends BoxProps { +interface Props { data: TransactionRecord[] title?: string help?: string @@ -23,6 +22,7 @@ interface Props extends BoxProps { maxHeight?: number | string external?: boolean multichain?: boolean + className?: string } const TransactionsTable = ({ @@ -35,8 +35,7 @@ const TransactionsTable = ({ compact, multichain = false, external = true, - sx = {}, - ...props + className, }: Props) => { const currentTime = useAtomValue(blockTimestampAtom) const chainId = useAtomValue(chainIdAtom) @@ -66,12 +65,12 @@ const TransactionsTable = ({ columnHelper.accessor('type', { header: t`Type`, cell: (data) => ( - - + + {transactionTypes[data.getValue()] || data.getValue()} {' '} {external && data.row.original.symbol} - + ), }), columnHelper.accessor('amountUSD', { @@ -94,21 +93,22 @@ const TransactionsTable = ({ const value = data.getValue() return ( - +
{multichain && data.row.original.chain && ( )} - { mixpanel.track('Clicked Transaction Viewer', { RToken: rToken?.address.toLowerCase() ?? '', @@ -117,8 +117,8 @@ const TransactionsTable = ({ }} > {shortenString(value)} - - + +
) }, }), @@ -127,28 +127,18 @@ const TransactionsTable = ({ ) return ( - ({ - backgroundColor: theme.colors.contentBackground, - border: 'none', - borderRadius: borderRadius.boxes, - height: 'fit-content', - maxHeight: ['360px', 'none'], - overflow: 'auto', - ...sx, - })} +
- +
{!!title && ( - - {title} - + {title} )} - {!!help && } - + {!!help && } +
{!data?.length && ( - - +
+ No transactions - - + +
)} -
+ ) } diff --git a/src/components/ui/button-group.tsx b/src/components/ui/button-group.tsx new file mode 100644 index 000000000..156b214a8 --- /dev/null +++ b/src/components/ui/button-group.tsx @@ -0,0 +1,45 @@ +/** + * ButtonGroup - Group of toggle buttons + */ +import { FC, useState } from 'react' +import { Button } from './button' +import { cn } from '@/lib/utils' + +type ButtonGroupItem = { + label: string + onClick: () => void +} + +type ButtonGroupProps = { + buttons: ButtonGroupItem[] + startActive?: number +} + +const ButtonGroup: FC = ({ buttons, startActive = 0 }) => { + const [active, setActive] = useState(startActive) + + return ( +
+ {buttons.map((button, index) => ( + + ))} +
+ ) +} + +export default ButtonGroup diff --git a/src/components/ui/button.tsx b/src/components/ui/button.tsx index 8d5ae4ebd..cd5ea65d6 100644 --- a/src/components/ui/button.tsx +++ b/src/components/ui/button.tsx @@ -23,13 +23,14 @@ const buttonVariants = cva( 'ghost-accent': 'hover:bg-primary hover:text-white', link: 'text-foreground underline-offset-4 hover:text-primary', muted: 'text-foreground bg-border hover:bg-border/80', + circle: 'rounded-full p-1 h-7 w-7 border border-border hover:bg-accent', none: '', }, size: { default: 'h-10 px-4 py-2', xs: 'h-7 rounded-md px-2', sm: 'h-9 rounded-md px-3', - lg: 'h-11 rounded-md px-8', + lg: 'h-12 rounded-lg px-4 text-base', icon: 'h-9 rounded-md w-9 px-2', 'icon-rounded': 'h-8 rounded-full w-8 px-2', inline: 'h-auto p-0 m-0', diff --git a/src/components/ui/copy-value.tsx b/src/components/ui/copy-value.tsx new file mode 100644 index 000000000..61d447bf8 --- /dev/null +++ b/src/components/ui/copy-value.tsx @@ -0,0 +1,102 @@ +/** + * CopyValue - Copy to clipboard button with tooltip + * Maintains backward compatibility with old CopyValue API + */ +import { t } from '@lingui/macro' +import { + Tooltip, + TooltipContent, + TooltipTrigger, +} from '@/components/ui/tooltip' +import { useState } from 'react' +import CopyIcon from 'components/icons/CopyIcon' +import { cn } from '@/lib/utils' + +// Legacy theme-ui spacing to Tailwind mapping +const spacingMap: Record = { + 0: '0', + 1: '1', + 2: '2', + 3: '4', + 4: '6', + 5: '8', +} + +interface CopyValueProps { + text?: string + value: string + size?: number + side?: 'top' | 'right' | 'bottom' | 'left' + color?: string + className?: string + // Legacy theme-ui spacing props + ml?: number | string + mr?: number | string + mt?: number | string + mb?: number | string + mx?: number | string + my?: number | string +} + +const CopyValue = ({ + text, + value, + size = 16, + side = 'left', + color, + className, + ml, + mr, + mt, + mb, + mx, + my, +}: CopyValueProps) => { + const copyText = text || t`Copy to clipboard` + const confirmText = t`Copied to clipboard!` + const [displayText, setDisplayText] = useState(copyText) + + const handleCopy = (e: React.MouseEvent) => { + e.stopPropagation() + navigator.clipboard.writeText(value) + setDisplayText(confirmText) + setTimeout(() => setDisplayText(copyText), 2000) + } + + // Build spacing classes from legacy props + const getSpacingClass = (prefix: string, value?: number | string) => { + if (value === undefined) return '' + const numValue = typeof value === 'string' ? parseInt(value) : value + const twValue = spacingMap[numValue] ?? numValue + return `${prefix}-${twValue}` + } + + const spacingClasses = [ + getSpacingClass('ml', ml ?? mx), + getSpacingClass('mr', mr ?? mx), + getSpacingClass('mt', mt ?? my), + getSpacingClass('mb', mb ?? my), + ].filter(Boolean) + + return ( + + + + + {displayText} + + ) +} + +export default CopyValue diff --git a/src/components/ui/copy.tsx b/src/components/ui/copy.tsx index 566934085..6d975a4cb 100644 --- a/src/components/ui/copy.tsx +++ b/src/components/ui/copy.tsx @@ -1,12 +1,7 @@ import { t } from '@lingui/macro' import { CopyIcon } from 'lucide-react' import React, { useState } from 'react' -import { - Tooltip, - TooltipContent, - TooltipProvider, - TooltipTrigger, -} from './tooltip' +import { Tooltip, TooltipContent, TooltipTrigger } from './tooltip' interface CopyProps { value: string @@ -37,16 +32,14 @@ const Copy: React.FC = ({ } return ( - - - - - - - {displayText} - - - + + + + + + {displayText} + + ) } diff --git a/src/components/ui/go-to.tsx b/src/components/ui/go-to.tsx new file mode 100644 index 000000000..51b01cdb8 --- /dev/null +++ b/src/components/ui/go-to.tsx @@ -0,0 +1,73 @@ +/** + * GoTo - External link button with arrow icon + */ +import ExternalArrowIcon from 'components/icons/ExternalArrowIcon' +import { cn } from '@/lib/utils' + +// Legacy theme-ui spacing to Tailwind mapping +const spacingMap: Record = { + 0: '0', + 1: '1', + 2: '2', + 3: '4', + 4: '6', + 5: '8', +} + +interface GoToProps { + href?: string + color?: string + className?: string + style?: React.CSSProperties + // Legacy theme-ui spacing props + ml?: number | string + mr?: number | string + mt?: number | string + mb?: number | string + mx?: number | string + my?: number | string +} + +const GoTo = ({ href, color, className, style, ml, mr, mt, mb, mx, my, ...props }: GoToProps) => { + // Build spacing classes from legacy props + const getSpacingClass = (prefix: string, value?: number | string) => { + if (value === undefined) return '' + const numValue = typeof value === 'string' ? parseInt(value) : value + const twValue = spacingMap[numValue] ?? numValue + return `${prefix}-${twValue}` + } + + const spacingClasses = [ + getSpacingClass('ml', ml ?? mx), + getSpacingClass('mr', mr ?? mx), + getSpacingClass('mt', mt ?? my), + getSpacingClass('mb', mb ?? my), + ].filter(Boolean) + + return ( + e.stopPropagation()} + {...props} + > + + + + + ) +} + +export default GoTo diff --git a/src/components/ui/legacy-table.tsx b/src/components/ui/legacy-table.tsx new file mode 100644 index 000000000..a30abf9d9 --- /dev/null +++ b/src/components/ui/legacy-table.tsx @@ -0,0 +1,130 @@ +/** + * Legacy Table wrapper - maintains backward compatibility with old Table API + * Uses DataTable internally with shadcn/tailwind styling + */ +import { + SortingState, + Row, + ColumnDef, +} from '@tanstack/react-table' +import DataTable, { SorteableButton } from './data-table' +import { cn } from '@/lib/utils' +import Skeleton from 'react-loading-skeleton' + +// Legacy theme-ui spacing to Tailwind mapping +const spacingMap: Record = { + 0: '0', + 1: '1', // 4px + 2: '2', // 8px + 3: '4', // 16px + 4: '6', // 24px + 5: '8', // 32px +} + +export interface TableProps { + columns: ColumnDef[] + data: any[] + compact?: boolean + sorting?: boolean + pagination?: boolean | { pageSize: number } + onSort?(state: SortingState): void + defaultPageSize?: number + onRowClick?(data: any, row: Row): void + sortBy?: SortingState + maxHeight?: string | number + isLoading?: boolean + columnVisibility?: (string | string[])[] + renderSubComponent?: (props: { row: Row }) => React.ReactElement + className?: string + // theme-ui legacy props (converted to Tailwind classes) + sx?: Record + mt?: number | string + mb?: number | string + pt?: number | string + pb?: number | string + p?: number | string +} + +export function Table({ + columns, + data = [], + sorting = false, + compact = false, + pagination, + isLoading = false, + defaultPageSize = 10, + maxHeight = 'auto', + sortBy = [], + onRowClick, + renderSubComponent, + className, + mt, + mb, + pt, + pb, + p, +}: TableProps) { + // Convert onRowClick signature from (data, row) to (data, event, row) + const handleRowClick = onRowClick + ? (rowData: any, event: React.MouseEvent, row?: Row) => { + onRowClick(rowData, row!) + } + : undefined + + // For pagination, map old API to new + const paginationConfig = pagination + ? typeof pagination === 'boolean' + ? { pageSize: defaultPageSize } + : pagination + : undefined + + // Build spacing classes from legacy props + const getSpacingClass = (prefix: string, value?: number | string) => { + if (value === undefined) return '' + const numValue = typeof value === 'string' ? parseInt(value) : value + const twValue = spacingMap[numValue] ?? numValue + return `${prefix}-${twValue}` + } + + const spacingClasses = [ + getSpacingClass('mt', mt), + getSpacingClass('mb', mb), + getSpacingClass('pt', pt), + getSpacingClass('pb', pb), + getSpacingClass('p', p), + ].filter(Boolean) + + // Polished table styling matching yield-dtf transactions table + const polishedTableClassName = + 'rounded-3xl pt-5 bg-card text-sm [&_table_tr]:border-none' + + return ( +
+ +
+ + } + /> + + ) +} + +// Re-export SorteableButton for consumers that use it +export { SorteableButton } diff --git a/src/components/ui/modal.tsx b/src/components/ui/modal.tsx new file mode 100644 index 000000000..d8cb53fcd --- /dev/null +++ b/src/components/ui/modal.tsx @@ -0,0 +1,125 @@ +import { ReactNode } from 'react' +import { + Dialog, + DialogContent, + DialogTitle, + DialogDescription, +} from './dialog' +import { cn } from '@/lib/utils' + +// Legacy theme-ui spacing to Tailwind mapping +// theme-ui: [0, 4, 8, 16, 24, 32, 40, 48, 80, 256] +const spacingMap: Record = { + 0: '0', + 1: '1', // 4px + 2: '2', // 8px + 3: '4', // 16px + 4: '6', // 24px + 5: '8', // 32px +} + +export interface ModalProps { + title?: string + children?: ReactNode + onClose?(): void + width?: string | number + closeOnClickAway?: boolean + hideCloseButton?: boolean + titleProps?: { className?: string; ml?: number | string } + style?: React.CSSProperties + sx?: Record // Ignored, for compatibility + className?: string + // Legacy theme-ui props + p?: number | string + px?: number | string + py?: number | string +} + +/** + * Modal component - wrapper around shadcn Dialog + * Maintains backward compatibility with old Modal API + */ +const Modal = ({ + title, + children, + onClose, + width = '420px', + closeOnClickAway = false, + hideCloseButton = false, + titleProps, + style, + className, + p, + px, + py, +}: ModalProps) => { + // Convert width to maxWidth class or style + const widthValue = typeof width === 'number' ? `${width}px` : width + + // Build padding classes from legacy props + const paddingClasses: string[] = [] + if (p !== undefined) { + const numP = typeof p === 'string' ? parseInt(p) : p + const twP = spacingMap[numP] ?? numP + paddingClasses.push(`p-${twP}`) + } else { + // Default padding if not specified + paddingClasses.push('p-6') + } + if (px !== undefined) { + const numPx = typeof px === 'string' ? parseInt(px) : px + const twPx = spacingMap[numPx] ?? numPx + paddingClasses.push(`px-${twPx}`) + } + if (py !== undefined) { + const numPy = typeof py === 'string' ? parseInt(py) : py + const twPy = spacingMap[numPy] ?? numPy + paddingClasses.push(`py-${twPy}`) + } + + return ( + { + if (!open && onClose) { + onClose() + } + }} + > + { + if (!closeOnClickAway) { + e.preventDefault() + } + }} + onEscapeKeyDown={(e) => { + if (!onClose) { + e.preventDefault() + } + }} + > + {title && ( + + {title} + + )} + {/* Hidden description for accessibility */} + + {title || 'Modal dialog'} + + {children} + + + ) +} + +export default Modal diff --git a/src/components/ui/progress.tsx b/src/components/ui/progress.tsx new file mode 100644 index 000000000..865bedb13 --- /dev/null +++ b/src/components/ui/progress.tsx @@ -0,0 +1,34 @@ +import * as React from 'react' +import * as ProgressPrimitive from '@radix-ui/react-progress' + +import { cn } from '@/lib/utils' + +interface ProgressProps + extends React.ComponentPropsWithoutRef { + indicatorClassName?: string +} + +const Progress = React.forwardRef< + React.ElementRef, + ProgressProps +>(({ className, value, indicatorClassName, ...props }, ref) => ( + + + +)) +Progress.displayName = ProgressPrimitive.Root.displayName + +export { Progress } diff --git a/src/components/ui/tests/transaction-button.test.tsx b/src/components/ui/tests/transaction-button.test.tsx new file mode 100644 index 000000000..990f59d1e --- /dev/null +++ b/src/components/ui/tests/transaction-button.test.tsx @@ -0,0 +1,327 @@ +import { render, screen } from '@testing-library/react' +import userEvent from '@testing-library/user-event' +import { describe, it, expect, vi, beforeEach } from 'vitest' + +// Mock Lingui before importing components +vi.mock('@lingui/macro', () => ({ + Trans: ({ children }: { children: React.ReactNode }) => <>{children}, + t: (strings: TemplateStringsArray) => strings[0], +})) + +// Mock external dependencies +const mockOpenConnectModal = vi.fn() +const mockSwitchChain = vi.fn() + +vi.mock('@rainbow-me/rainbowkit', () => ({ + useConnectModal: () => ({ openConnectModal: mockOpenConnectModal }), +})) + +vi.mock('wagmi', () => ({ + useSwitchChain: () => ({ switchChain: mockSwitchChain }), +})) + +vi.mock('hooks/useGasEstimate', () => ({ + useGasAmount: () => ({ usd: 1.5 }), +})) + +vi.mock('components/transaction-error/TransactionError', () => ({ + default: ({ error }: { error: Error }) => ( +
{error.message}
+ ), +})) + +// Stateful mocks for jotai atoms +let mockWallet: string | null = '0x1234567890abcdef' +let mockWalletChain = 1 +let mockChainId = 1 + +vi.mock('jotai', () => ({ + useAtomValue: (atom: unknown) => { + const atomStr = String(atom) + if (atomStr.includes('wallet') && atomStr.includes('Chain')) return mockWalletChain + if (atomStr.includes('chainId')) return mockChainId + if (atomStr.includes('wallet')) return mockWallet + return mockWallet + }, +})) + +vi.mock('state/atoms', () => ({ + walletAtom: Symbol('walletAtom'), + walletChainAtom: Symbol('walletChainAtom'), + chainIdAtom: Symbol('chainIdAtom'), +})) + +vi.mock('utils/constants', () => ({ + CHAIN_TAGS: { 1: 'Ethereum', 8453: 'Base' }, +})) + +// Import components after all mocks are set up +import TransactionButton, { + ConnectWalletButton, + TransactionButtonContainer, + GasEstimateLabel, +} from '../transaction-button' + +describe('ConnectWalletButton', () => { + beforeEach(() => { + vi.clearAllMocks() + }) + + it('renders Connect Wallet text', () => { + render() + expect(screen.getByText('Connect Wallet')).toBeInTheDocument() + }) + + it('calls openConnectModal when clicked', async () => { + const user = userEvent.setup() + render() + + await user.click(screen.getByRole('button')) + + expect(mockOpenConnectModal).toHaveBeenCalledTimes(1) + }) + + it('applies custom className alongside default styles', () => { + render() + const button = screen.getByRole('button') + + expect(button).toHaveClass('custom-class') + expect(button).toHaveClass('rounded-xl') + }) +}) + +describe('GasEstimateLabel', () => { + it('renders formatted gas cost in USD', () => { + render() + + expect(screen.getByText('Estimated gas cost:')).toBeInTheDocument() + // formatCurrency adds appropriate decimal places + expect(screen.getByText(/\$1\.50?/)).toBeInTheDocument() + }) +}) + +describe('TransactionButtonContainer', () => { + beforeEach(() => { + vi.clearAllMocks() + mockWallet = '0x1234567890abcdef' + mockWalletChain = 1 + mockChainId = 1 + }) + + it('renders children when wallet connected and on correct chain', () => { + render( + + + + ) + + expect(screen.getByText('Child Button')).toBeInTheDocument() + }) + + it('shows ConnectWalletButton when no wallet connected', () => { + mockWallet = null + render( + + + + ) + + expect(screen.getByText('Connect Wallet')).toBeInTheDocument() + expect(screen.queryByText('Child Button')).not.toBeInTheDocument() + }) + + it('shows switch chain button when on wrong chain', () => { + mockWalletChain = 8453 + mockChainId = 1 + render( + + + + ) + + expect(screen.getByText('Switch to Ethereum')).toBeInTheDocument() + }) + + it('calls switchChain with correct chainId when clicked', async () => { + const user = userEvent.setup() + mockWalletChain = 8453 + mockChainId = 1 + render( + + + + ) + + await user.click(screen.getByText('Switch to Ethereum')) + + expect(mockSwitchChain).toHaveBeenCalledWith({ chainId: 1 }) + }) + + it('uses explicit chain prop over chainId atom', () => { + mockWalletChain = 1 + mockChainId = 1 + render( + + + + ) + + expect(screen.getByText('Switch to Base')).toBeInTheDocument() + }) +}) + +describe('TransactionButton', () => { + beforeEach(() => { + vi.clearAllMocks() + mockWallet = '0x1234567890abcdef' + mockWalletChain = 1 + mockChainId = 1 + }) + + describe('wallet states', () => { + it('shows button text when wallet connected and on correct chain', () => { + render() + + expect(screen.getByText('Submit Transaction')).toBeInTheDocument() + }) + + it('shows ConnectWalletButton when no wallet', () => { + mockWallet = null + render() + + expect(screen.getByText('Connect Wallet')).toBeInTheDocument() + expect(screen.queryByText('Submit')).not.toBeInTheDocument() + }) + + it('shows switch chain button when on wrong chain', () => { + mockWalletChain = 8453 + render() + + expect(screen.getByText('Switch to Ethereum')).toBeInTheDocument() + }) + }) + + describe('loading states', () => { + it('shows loading text and spinner when loading=true', () => { + render() + + expect(screen.getByText('Processing...')).toBeInTheDocument() + expect(screen.getByRole('button').querySelector('.animate-spin')).toBeInTheDocument() + }) + + it('shows mining text when mining=true', () => { + render() + + expect(screen.getByText('Tx in process...')).toBeInTheDocument() + }) + + it('prioritizes mining state over loading state', () => { + render( + + ) + + expect(screen.getByText('Tx in process...')).toBeInTheDocument() + expect(screen.queryByText('Loading...')).not.toBeInTheDocument() + }) + + it('disables button when loading', () => { + render() + + expect(screen.getByRole('button')).toBeDisabled() + }) + + it('disables button when mining', () => { + render() + + expect(screen.getByRole('button')).toBeDisabled() + }) + }) + + describe('disabled state', () => { + it('disables button when disabled prop is true', () => { + render() + + expect(screen.getByRole('button')).toBeDisabled() + }) + + it('does not trigger onClick when disabled', async () => { + const user = userEvent.setup() + const handleClick = vi.fn() + render() + + await user.click(screen.getByRole('button')) + + expect(handleClick).not.toHaveBeenCalled() + }) + }) + + describe('gas estimate', () => { + it('shows gas estimate when gas prop provided', () => { + render() + + expect(screen.getByText('Estimated gas cost:')).toBeInTheDocument() + expect(screen.getByText(/\$1\.50?/)).toBeInTheDocument() + }) + + it('does not show gas estimate when gas is not provided', () => { + render() + + expect(screen.queryByText('Estimated gas cost:')).not.toBeInTheDocument() + }) + }) + + describe('error display', () => { + it('shows error when error prop provided', () => { + const error = new Error('Transaction reverted') + render() + + expect(screen.getByTestId('transaction-error')).toBeInTheDocument() + expect(screen.getByText('Transaction reverted')).toBeInTheDocument() + }) + + it('does not show error when error is null', () => { + render() + + expect(screen.queryByTestId('transaction-error')).not.toBeInTheDocument() + }) + }) + + describe('interactions', () => { + it('calls onClick when clicked', async () => { + const user = userEvent.setup() + const handleClick = vi.fn() + render() + + await user.click(screen.getByRole('button')) + + expect(handleClick).toHaveBeenCalledTimes(1) + }) + }) + + describe('className', () => { + it('applies custom className', () => { + render() + + const button = screen.getByRole('button') + expect(button).toHaveClass('w-full') + expect(button).toHaveClass('custom') + }) + }) + + describe('combined states', () => { + it('shows both gas and error when both provided', () => { + const error = new Error('Failed') + render( + + ) + + expect(screen.getByText('Estimated gas cost:')).toBeInTheDocument() + expect(screen.getByTestId('transaction-error')).toBeInTheDocument() + }) + }) +}) diff --git a/src/components/old/button/TransactionButton.tsx b/src/components/ui/transaction-button.tsx similarity index 60% rename from src/components/old/button/TransactionButton.tsx rename to src/components/ui/transaction-button.tsx index 57160da02..f25f93843 100644 --- a/src/components/old/button/TransactionButton.tsx +++ b/src/components/ui/transaction-button.tsx @@ -1,3 +1,7 @@ +/** + * TransactionButton - Blockchain transaction button with wallet/chain validation + * Uses shadcn Button with transaction-specific functionality + */ import { t, Trans } from '@lingui/macro' import { useConnectModal } from '@rainbow-me/rainbowkit' import TransactionError from 'components/transaction-error/TransactionError' @@ -6,61 +10,66 @@ import { useGasAmount } from 'hooks/useGasEstimate' import useNotification from 'hooks/useNotification' import useWatchTransaction from 'hooks/useWatchTransaction' import { useAtomValue } from 'jotai' -import { CheckCircle } from 'lucide-react' -import { useEffect } from 'react' +import { CheckCircle, Loader2 } from 'lucide-react' +import { ReactNode, useEffect } from 'react' import { chainIdAtom, walletAtom, walletChainAtom } from 'state/atoms' -import { Box, BoxProps, Text } from 'theme-ui' import { formatCurrency } from 'utils' import { CHAIN_TAGS } from 'utils/constants' import { UseSimulateContractParameters, useSwitchChain } from 'wagmi' -import Button, { ButtonProps, LoadingButton, LoadingButtonProps } from '.' +import { Button, ButtonProps } from './button' +import { cn } from '@/lib/utils' -interface TransactionButtonProps extends LoadingButtonProps { +export interface TransactionButtonProps extends ButtonProps { + text?: string gas?: bigint mining?: boolean + loading?: boolean + loadingText?: string error?: Error | null chain?: number errorWithName?: boolean } -export const GasEstimateLabel = ({ gas, ...props }: { gas: bigint }) => { +export const GasEstimateLabel = ({ gas }: { gas: bigint }) => { const { usd } = useGasAmount(gas) return ( - - +
+ Estimated gas cost: - - ${formatCurrency(usd)} - + + ${formatCurrency(usd)} +
) } -export const ConnectWalletButton = (props: ButtonProps) => { +export const ConnectWalletButton = ({ className, ...props }: ButtonProps) => { const { openConnectModal } = useConnectModal() return ( ) } -interface ITransactionButtonContainer extends BoxProps { +interface ITransactionButtonContainer { + children?: ReactNode chain?: number + className?: string } export const TransactionButtonContainer = ({ children, chain, - ...props + className, }: ITransactionButtonContainer) => { const wallet = useAtomValue(walletAtom) const walletChain = useAtomValue(walletChainAtom) @@ -70,23 +79,22 @@ export const TransactionButtonContainer = ({ let Component = children if (!wallet) { - Component = + Component = } else if (isInvalidWallet && switchChain) { Component = ( ) } - return {Component} + return
{Component}
} const TransactionButton = ({ @@ -97,6 +105,9 @@ const TransactionButton = ({ chain, loadingText, errorWithName = true, + text, + className, + disabled, ...props }: TransactionButtonProps) => { const address = useAtomValue(walletAtom) @@ -108,40 +119,40 @@ const TransactionButton = ({ : walletChain !== chainId if (!address) { - return + return } if (isInvalidWallet && switchChain) { return ( ) } - if (mining) { - loadingText = t`Tx in process...` - } + const isLoading = loading || mining + const displayText = mining ? t`Tx in process...` : isLoading ? loadingText : text return ( <> - + {!!gas && } {!!error && ( @@ -151,11 +162,14 @@ const TransactionButton = ({ } // Execute tx and forget type of button -interface ExecuteButtonProps extends LoadingButtonProps { +export interface ExecuteButtonProps extends ButtonProps { call: UseSimulateContractParameters | undefined + text?: string txLabel?: string successLabel?: string onSuccess?(): void + loading?: boolean + loadingText?: string } export const ExecuteButton = ({ @@ -165,6 +179,9 @@ export const ExecuteButton = ({ successLabel, disabled, loadingText, + text, + className, + loading: externalLoading, ...props }: ExecuteButtonProps) => { const { write, hash, isLoading, validationError, reset, isReady } = @@ -172,11 +189,15 @@ export const ExecuteButton = ({ const notify = useNotification() const { isMining, status } = useWatchTransaction({ hash, - label: txLabel || props.text, + label: txLabel || String(text), }) + const isLoading_ = isLoading || isMining || externalLoading + let displayText = text + let finalLoadingText = loadingText + if (isMining) { - loadingText = t`Tx in process...` + finalLoadingText = t`Tx in process...` } useEffect(() => { @@ -199,16 +220,19 @@ export const ExecuteButton = ({ if (!successLabel) { return } - props.text = successLabel + displayText = successLabel } return ( - + > + {isLoading_ && } + {isLoading_ ? finalLoadingText : displayText} + ) } diff --git a/src/components/utils/blockies-avatar.tsx b/src/components/utils/blockies-avatar.tsx index 0e67a92eb..3e939166b 100644 --- a/src/components/utils/blockies-avatar.tsx +++ b/src/components/utils/blockies-avatar.tsx @@ -1,7 +1,6 @@ import { cn } from '@/lib/utils' import * as blockies from 'blockies-ts' import { useMemo } from 'react' -import { Image } from 'theme-ui' type BlockiesAvatarProps = { address: string diff --git a/src/components/utils/docs-link.tsx b/src/components/utils/docs-link.tsx index e08aca3a4..aa55db661 100644 --- a/src/components/utils/docs-link.tsx +++ b/src/components/utils/docs-link.tsx @@ -1,21 +1,18 @@ import ExternalArrowIcon from 'components/icons/ExternalArrowIcon' -import { BoxProps, Flex } from 'theme-ui' -interface Props extends BoxProps { - link: any +interface Props { + link: string size?: number } const DocsLink = ({ link }: Props) => { return ( - window.open(link, '_blank')} - sx={{ cursor: 'pointer' }} - ml={2} - mt={1} + className="flex cursor-pointer ml-2 mt-1" > - + ) } diff --git a/src/components/utils/explorer-address.tsx b/src/components/utils/explorer-address.tsx index 4f1ddd430..635d3bb0c 100644 --- a/src/components/utils/explorer-address.tsx +++ b/src/components/utils/explorer-address.tsx @@ -1,5 +1,5 @@ import { ArrowUpRight } from 'lucide-react' -import { Box, BoxProps } from 'theme-ui' +import { cn } from '@/lib/utils' import { shortenAddress } from 'utils' import { ExplorerDataType, getExplorerLink } from 'utils/getExplorerLink' @@ -14,43 +14,26 @@ const ExplorerAddress = ({ address, chain, type = ExplorerDataType.ADDRESS, - sx, - ...props -}: ExplorerAddressProps & BoxProps) => { + className, +}: ExplorerAddressProps) => { const handleAddress = (e: React.MouseEvent) => { e.stopPropagation() window.open(getExplorerLink(address, chain, type), '_blank') } return ( - {shortenAddress(address)} - +
- - +
+ ) } diff --git a/src/components/utils/integrations/dgneth-btn-appendix.tsx b/src/components/utils/integrations/dgneth-btn-appendix.tsx index 90b23fd86..d07a2da49 100644 --- a/src/components/utils/integrations/dgneth-btn-appendix.tsx +++ b/src/components/utils/integrations/dgneth-btn-appendix.tsx @@ -1,7 +1,7 @@ -import { FC, PropsWithChildren, memo, useMemo } from 'react' +import { useQuery } from '@tanstack/react-query' import { Plus } from 'lucide-react' -import useSWR from 'swr' -import { Box, ButtonProps, Text } from 'theme-ui' +import { FC, PropsWithChildren, memo, useMemo } from 'react' +import { cn } from '@/lib/utils' import { ChainId } from 'utils/chains' import { erc20Abi, formatUnits } from 'viem' import { useReadContracts } from 'wagmi' @@ -11,17 +11,15 @@ type Props = { basketAPY?: number borderColor?: string hideLabelOnMobile?: boolean -} & PropsWithChildren + children?: React.ReactNode +} const TOKEN_ADDRESS = '0x005F893EcD7bF9667195642f7649DA8163e23658' const STAKE_TOKEN_ADDRESS = '0x5BDd1fA233843Bfc034891BE8a6769e58F1e1346' -const fetcher = (url: string) => fetch(url).then((res) => res.json()) - const DgnETHButtonAppendix: FC = ({ rTokenSymbol, basketAPY, - borderColor = 'divaBorder', hideLabelOnMobile = false, children, }) => { @@ -43,10 +41,10 @@ const DgnETHButtonAppendix: FC = ({ allowFailure: false, }) - const { data: yieldsAPIData } = useSWR( - 'https://yields.reserve.org/pools', - fetcher - ) + const { data: yieldsAPIData } = useQuery({ + queryKey: ['yields-pools'], + queryFn: () => fetch('https://yields.reserve.org/pools').then((res) => res.json()), + }) const _basketAPY = useMemo(() => { const apiBasketAPY = @@ -71,15 +69,8 @@ const DgnETHButtonAppendix: FC = ({ if (rTokenSymbol !== 'dgnETH') return <>{children} return ( - { if (e.target === e.currentTarget) { e.stopPropagation() @@ -88,31 +79,25 @@ const DgnETHButtonAppendix: FC = ({ }} > {children} - { window.open('https://degeneth.com/', '_blank') }} > - - {apy} - - {apy} + APY on degeneth.com - - - + + + ) } diff --git a/src/components/vote-lock/components/submit-lock-button.tsx b/src/components/vote-lock/components/submit-lock-button.tsx index 80a41022e..f685f7ece 100644 --- a/src/components/vote-lock/components/submit-lock-button.tsx +++ b/src/components/vote-lock/components/submit-lock-button.tsx @@ -1,5 +1,5 @@ import dtfIndexStakingVault from '@/abis/dtf-index-staking-vault' -import TransactionButton from '@/components/old/button/TransactionButton' +import TransactionButton from '@/components/ui/transaction-button' import { walletAtom } from '@/state/atoms' import { portfolioSidebarOpenAtom } from '@/views/portfolio/atoms' import { useAtomValue, useSetAtom } from 'jotai' @@ -63,7 +63,7 @@ export const DelegateButton = () => { loadingText={!!hash ? 'Confirming tx...' : 'Pending, sign in wallet'} onClick={write} text={`Delegate ${stToken?.underlying.symbol}`} - fullWidth + className="w-full" error={error || txError} /> @@ -211,7 +211,7 @@ const SubmitLockButton = () => { ? `Vote lock ${stToken?.underlying.symbol}` : `Approve use of ${stToken?.underlying.symbol}` } - fullWidth + className="w-full" error={ readyToSubmit ? error || txError diff --git a/src/components/vote-lock/components/submit-unlock-button.tsx b/src/components/vote-lock/components/submit-unlock-button.tsx index f52b0ee4c..701610e88 100644 --- a/src/components/vote-lock/components/submit-unlock-button.tsx +++ b/src/components/vote-lock/components/submit-unlock-button.tsx @@ -1,5 +1,5 @@ import dtfIndexStakingVault from '@/abis/dtf-index-staking-vault' -import TransactionButton from '@/components/old/button/TransactionButton' +import TransactionButton from '@/components/ui/transaction-button' import { walletAtom } from '@/state/atoms' import { portfolioSidebarOpenAtom } from '@/views/portfolio/atoms' import { useAtomValue, useSetAtom } from 'jotai' @@ -92,7 +92,7 @@ const SubmitUnlockButton = () => { ? 'Transaction confirmed' : `Begin ${unlockDelay ? `${unlockDelay}-day` : ''} unlock delay` } - fullWidth + className="w-full" error={error || txError} /> diff --git a/src/hooks/tests/use-debounce.test.ts b/src/hooks/tests/use-debounce.test.ts new file mode 100644 index 000000000..9c1927865 --- /dev/null +++ b/src/hooks/tests/use-debounce.test.ts @@ -0,0 +1,91 @@ +import { renderHook, act } from '@testing-library/react' +import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest' +import useDebounce from '../useDebounce' + +describe('useDebounce', () => { + beforeEach(() => { + vi.useFakeTimers() + }) + + afterEach(() => { + vi.useRealTimers() + }) + + it('returns initial value immediately', () => { + const { result } = renderHook(() => useDebounce('initial', 500)) + expect(result.current).toBe('initial') + }) + + it('debounces value updates', () => { + const { result, rerender } = renderHook( + ({ value, delay }) => useDebounce(value, delay), + { initialProps: { value: 'initial', delay: 500 } } + ) + + // Change value + rerender({ value: 'updated', delay: 500 }) + + // Value should still be initial before delay + expect(result.current).toBe('initial') + + // Fast forward past delay + act(() => { + vi.advanceTimersByTime(500) + }) + + // Now value should be updated + expect(result.current).toBe('updated') + }) + + it('cancels pending update on rapid changes', () => { + const { result, rerender } = renderHook( + ({ value, delay }) => useDebounce(value, delay), + { initialProps: { value: 'first', delay: 500 } } + ) + + // Rapid changes + rerender({ value: 'second', delay: 500 }) + act(() => vi.advanceTimersByTime(200)) + + rerender({ value: 'third', delay: 500 }) + act(() => vi.advanceTimersByTime(200)) + + rerender({ value: 'fourth', delay: 500 }) + + // Still should be first value + expect(result.current).toBe('first') + + // Complete the delay + act(() => vi.advanceTimersByTime(500)) + + // Should be the last value, not intermediate ones + expect(result.current).toBe('fourth') + }) + + it('works with numbers', () => { + const { result, rerender } = renderHook( + ({ value, delay }) => useDebounce(value, delay), + { initialProps: { value: 0, delay: 300 } } + ) + + rerender({ value: 100, delay: 300 }) + expect(result.current).toBe(0) + + act(() => vi.advanceTimersByTime(300)) + expect(result.current).toBe(100) + }) + + it('works with objects (same reference)', () => { + const obj = { amount: '100' } + const { result, rerender } = renderHook( + ({ value, delay }) => useDebounce(value, delay), + { initialProps: { value: obj, delay: 300 } } + ) + + const newObj = { amount: '200' } + rerender({ value: newObj, delay: 300 }) + + act(() => vi.advanceTimersByTime(300)) + expect(result.current).toEqual({ amount: '200' }) + }) +}) diff --git a/src/hooks/tests/use-query.test.ts b/src/hooks/tests/use-query.test.ts new file mode 100644 index 000000000..a742717b7 --- /dev/null +++ b/src/hooks/tests/use-query.test.ts @@ -0,0 +1,122 @@ +import { renderHook, waitFor } from '@testing-library/react' +import { describe, it, expect, vi, beforeEach } from 'vitest' +import { createWrapper } from '../../test-utils' +import useQuery, { useMultiFetch } from '../use-query' + +// Mock the gqlClientAtom and GRAPH_CLIENTS +vi.mock('state/atoms', () => ({ + gqlClientAtom: {}, + GRAPH_CLIENTS: { + 1: { request: vi.fn() }, + 8453: { request: vi.fn() }, + }, +})) + +vi.mock('jotai', async () => { + const actual = await vi.importActual('jotai') + return { + ...actual, + useAtomValue: vi.fn(() => ({ + request: vi.fn().mockResolvedValue({ data: 'mocked' }), + })), + } +}) + +vi.mock('utils/constants', () => ({ + supportedChainList: [1, 8453], +})) + +describe('useQuery', () => { + beforeEach(() => { + vi.clearAllMocks() + }) + + it('returns undefined data when query is null', () => { + const { result } = renderHook(() => useQuery(null), { + wrapper: createWrapper(), + }) + + expect(result.current.data).toBeUndefined() + expect(result.current.isLoading).toBe(false) + }) + + it('returns SWR-compatible interface shape', () => { + const { result } = renderHook(() => useQuery(null), { + wrapper: createWrapper(), + }) + + expect(result.current).toHaveProperty('data') + expect(result.current).toHaveProperty('error') + expect(result.current).toHaveProperty('isLoading') + expect(result.current).toHaveProperty('isValidating') + expect(result.current).toHaveProperty('mutate') + expect(typeof result.current.mutate).toBe('function') + }) + + it('fetches data when query is provided', async () => { + const mockQuery = `query { test }` + + const { result } = renderHook( + () => useQuery(mockQuery, {}), + { wrapper: createWrapper() } + ) + + // Initially loading + expect(result.current.isLoading).toBe(true) + + await waitFor(() => { + expect(result.current.isLoading).toBe(false) + }) + + expect(result.current.data).toEqual({ data: 'mocked' }) + }) +}) + +describe('useMultiFetch', () => { + beforeEach(() => { + vi.clearAllMocks() + global.fetch = vi.fn() + }) + + it('returns undefined when urls is null', () => { + const { result } = renderHook(() => useMultiFetch(null), { + wrapper: createWrapper(), + }) + + expect(result.current.data).toBeUndefined() + expect(result.current.isLoading).toBe(false) + }) + + it('fetches multiple URLs in parallel', async () => { + const mockData = [{ id: 1 }, { id: 2 }] + ;(global.fetch as any).mockImplementation((url: string) => + Promise.resolve({ + json: () => Promise.resolve(url.includes('1') ? mockData[0] : mockData[1]), + }) + ) + + const { result } = renderHook( + () => useMultiFetch(['https://api.test/1', 'https://api.test/2']), + { wrapper: createWrapper() } + ) + + await waitFor(() => { + expect(result.current.isLoading).toBe(false) + }) + + expect(result.current.data).toEqual(mockData) + expect(global.fetch).toHaveBeenCalledTimes(2) + }) + + it('has SWR-compatible interface', () => { + const { result } = renderHook(() => useMultiFetch(null), { + wrapper: createWrapper(), + }) + + expect(result.current).toHaveProperty('data') + expect(result.current).toHaveProperty('error') + expect(result.current).toHaveProperty('isLoading') + expect(result.current).toHaveProperty('isValidating') + expect(result.current).toHaveProperty('mutate') + }) +}) diff --git a/src/hooks/tests/use-time-remaining.test.ts b/src/hooks/tests/use-time-remaining.test.ts new file mode 100644 index 000000000..9d0107032 --- /dev/null +++ b/src/hooks/tests/use-time-remaining.test.ts @@ -0,0 +1,94 @@ +import { renderHook, act } from '@testing-library/react' +import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest' +import useTimeRemaining from '../use-time-remaining' + +describe('useTimeRemaining', () => { + const NOW = 1700000000000 // Fixed timestamp for consistent tests + + beforeEach(() => { + vi.useFakeTimers() + vi.setSystemTime(NOW) + }) + + afterEach(() => { + vi.useRealTimers() + }) + + it('returns empty string when no timestamp provided', () => { + const { result } = renderHook(() => useTimeRemaining()) + expect(result.current).toBe('') + }) + + it('returns empty string when timestamp is undefined', () => { + const { result } = renderHook(() => useTimeRemaining(undefined)) + expect(result.current).toBe('') + }) + + it('returns "Ended" when timestamp is in the past', () => { + const pastTimestamp = Math.floor(NOW / 1000) - 100 + const { result } = renderHook(() => useTimeRemaining(pastTimestamp)) + expect(result.current).toBe('Ended') + }) + + it('formats days, hours, minutes correctly', () => { + // 2 days, 4 hours, 30 minutes from now + const futureTimestamp = Math.floor(NOW / 1000) + (2 * 86400) + (4 * 3600) + (30 * 60) + const { result } = renderHook(() => useTimeRemaining(futureTimestamp)) + expect(result.current).toBe('2d 4h 30m') + }) + + it('shows hours and minutes when no days', () => { + // 4 hours, 15 minutes from now + const futureTimestamp = Math.floor(NOW / 1000) + (4 * 3600) + (15 * 60) + const { result } = renderHook(() => useTimeRemaining(futureTimestamp)) + expect(result.current).toBe('4h 15m') + }) + + it('shows seconds when less than 1 hour remaining', () => { + // 30 minutes, 45 seconds from now + const futureTimestamp = Math.floor(NOW / 1000) + (30 * 60) + 45 + const { result } = renderHook(() => useTimeRemaining(futureTimestamp)) + expect(result.current).toBe('30m 45s') + }) + + it('shows only seconds when very short time remaining', () => { + // 45 seconds from now + const futureTimestamp = Math.floor(NOW / 1000) + 45 + const { result } = renderHook(() => useTimeRemaining(futureTimestamp)) + // Hook doesn't show minutes when there are 0 minutes + expect(result.current).toBe('45s') + }) + + it('updates countdown as time passes', () => { + // 2 minutes from now + const futureTimestamp = Math.floor(NOW / 1000) + 120 + const { result } = renderHook(() => useTimeRemaining(futureTimestamp)) + + expect(result.current).toBe('2m 0s') + + // Advance 60 seconds + act(() => { + vi.advanceTimersByTime(60 * 1000) + }) + + expect(result.current).toBe('1m 0s') + + // Advance another 60 seconds + act(() => { + vi.advanceTimersByTime(60 * 1000) + }) + + expect(result.current).toBe('Ended') + }) + + it('cleans up interval on unmount', () => { + const clearIntervalSpy = vi.spyOn(global, 'clearInterval') + const futureTimestamp = Math.floor(NOW / 1000) + 3600 + + const { unmount } = renderHook(() => useTimeRemaining(futureTimestamp)) + unmount() + + expect(clearIntervalSpy).toHaveBeenCalled() + clearIntervalSpy.mockRestore() + }) +}) diff --git a/src/hooks/use-query.ts b/src/hooks/use-query.ts new file mode 100644 index 000000000..0fe50e324 --- /dev/null +++ b/src/hooks/use-query.ts @@ -0,0 +1,138 @@ +import { keepPreviousData, useQuery as useReactQuery } from '@tanstack/react-query' +import { RequestDocument } from 'graphql-request' +import { useAtomValue } from 'jotai' +import { GRAPH_CLIENTS, gqlClientAtom } from 'state/atoms' +import { supportedChainList } from 'utils/constants' + +// SWR-compatible config options +interface QueryConfig { + staleTime?: number + refetchInterval?: number | false + enabled?: boolean + refetchOnWindowFocus?: boolean + keepPreviousData?: boolean // Maps to React Query's placeholderData +} + +/** + * SWR-compatible return interface for easy migration. + * Consumers can destructure { data, error, isLoading, isValidating, mutate } + */ +interface UseQueryReturn { + data: T | undefined + error: Error | null + isLoading: boolean + isValidating: boolean + mutate: () => void +} + +/** + * GraphQL query hook - React Query implementation with SWR-compatible interface. + * + * @param query - GraphQL query document, or null to skip + * @param variables - Query variables + * @param config - React Query config options (staleTime, refetchInterval, etc.) + */ +const useQuery = ( + query: RequestDocument | null = null, + variables: Record = {}, + config: QueryConfig = {} +): UseQueryReturn => { + const client = useAtomValue(gqlClientAtom) + const { keepPreviousData: shouldKeepPrevious, ...restConfig } = config + + const result = useReactQuery({ + queryKey: query ? ['graphql', query, variables] : ['graphql-disabled'], + queryFn: () => client.request(query as RequestDocument, variables), + enabled: !!query && (config.enabled !== false), + placeholderData: shouldKeepPrevious ? keepPreviousData : undefined, + ...restConfig, + }) + + return { + data: result.data, + error: result.error, + isLoading: result.isLoading, + isValidating: result.isFetching && !result.isLoading, + mutate: () => result.refetch(), + } +} + +/** + * Multichain GraphQL query hook - fetches from all supported chains in parallel. + */ +export const useMultichainQuery = ( + query: RequestDocument | null = null, + variables: Record = {}, + config: QueryConfig = {} +): UseQueryReturn<{ [chainId: number]: T }> => { + const { keepPreviousData: shouldKeepPrevious, ...restConfig } = config + + const result = useReactQuery({ + queryKey: query ? ['graphql-multichain', query, variables] : ['graphql-multichain-disabled'], + queryFn: async () => { + const chains: Set = new Set( + variables._chain ? variables._chain : supportedChainList + ) + + const calls = supportedChainList.map((chain) => + chains.has(chain) + ? GRAPH_CLIENTS[chain].request(query as RequestDocument, variables[chain] || variables) + : Promise.resolve(null) + ) + + const results = await Promise.all(calls) + + return supportedChainList.reduce( + (acc, chainId, index) => { + acc[chainId] = results[index] + return acc + }, + {} as { [chainId: number]: T | null } + ) + }, + enabled: !!query && (config.enabled !== false), + placeholderData: shouldKeepPrevious ? keepPreviousData : undefined, + ...restConfig, + }) + + return { + data: result.data as { [chainId: number]: T } | undefined, + error: result.error, + isLoading: result.isLoading, + isValidating: result.isFetching && !result.isLoading, + mutate: () => result.refetch(), + } +} + +/** + * Fetch multiple URLs in parallel. + */ +export const useMultiFetch = ( + urls: string[] | null, + config: { + staleTime?: number + enabled?: boolean + } = {} +): UseQueryReturn => { + const result = useReactQuery({ + queryKey: urls ? ['multi-fetch', ...urls] : ['multi-fetch-disabled'], + queryFn: async () => { + if (!urls) return [] + const responses = await Promise.all(urls.map((url) => fetch(url))) + return Promise.all(responses.map((res) => res.json())) as Promise + }, + enabled: !!urls && (config.enabled !== false), + staleTime: config.staleTime ?? 1000 * 60 * 60, // 1 hour default (mimics useSWRImmutable) + ...config, + }) + + return { + data: result.data, + error: result.error, + isLoading: result.isLoading, + isValidating: result.isFetching && !result.isLoading, + mutate: () => result.refetch(), + } +} + +export default useQuery diff --git a/src/hooks/useIndexDTFList.ts b/src/hooks/useIndexDTFList.ts index 0b0e289be..b8a0ae676 100644 --- a/src/hooks/useIndexDTFList.ts +++ b/src/hooks/useIndexDTFList.ts @@ -1,8 +1,10 @@ import { ChainId } from '@/utils/chains' -import { RESERVE_API } from '@/utils/constants' +// import { RESERVE_API } from '@/utils/constants' import { useQuery } from '@tanstack/react-query' import { Address } from 'viem' +const RESERVE_API = 'https://api.reserve.org/' + type Performance = { timestamp: number; value: number } export type IndexDTFItem = { @@ -34,9 +36,6 @@ const calculatePercentageChange = (performance: Performance[]) => { const REFRESH_INTERVAL = 1000 * 60 * 10 // 10 minutes -// TODO: Top 100 only, worry about pagination later -// TODO: Pagination may become a problem sooner? need to fetch analytics/pricing here as well! -// TODO: Mock data for what should come from the API const useIndexDTFList = () => { return useQuery({ queryKey: ['index-dtf-list'], diff --git a/src/hooks/useQuery.ts b/src/hooks/useQuery.ts deleted file mode 100644 index 4cb9db468..000000000 --- a/src/hooks/useQuery.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { RequestDocument } from 'graphql-request' -import { useAtomValue } from 'jotai' -import { GRAPH_CLIENTS, gqlClientAtom } from 'state/atoms' -import useSWR from 'swr' -import useSWRImmutable from 'swr/immutable' -import { supportedChainList } from 'utils/constants' - -// TODO: Need to figure out a way to refactor this to work with mutligraphs -// TODO: For now index-dtf will be separate and will use react-query - -type FetcherArgs = [RequestDocument, Record] - -const multichainFetcher = async ( - props: FetcherArgs -): Promise<{ [x: number]: any }> => { - const [query, variables] = props - // Filter out chain if _chain exists - const chains: Set = new Set( - variables._chain ? variables._chain : supportedChainList - ) - const calls: any[] = [] - - for (const chain of supportedChainList) { - if (chains.has(chain)) { - calls.push( - GRAPH_CLIENTS[chain].request(query, variables[chain] || variables) - ) - } else { - calls.push(null) - } - } - - const results = await Promise.all(calls) - - return supportedChainList.reduce( - (acc, current, index) => { - acc[current] = results[index] - return acc - }, - {} as { [x: number]: any } - ) -} - -const useQuery = ( - query: RequestDocument | null = null, - variables: any = {}, - config: any = {} -) => { - const client = useAtomValue(gqlClientAtom) - - const fetcher = (props: FetcherArgs) => client.request(...props) - - return useSWR(query ? [query, variables] : null, fetcher, config) -} - -export const useMultichainQuery = ( - query: RequestDocument | null = null, - variables: any = {}, - config: any = {} -) => useSWR(query ? [query, variables] : null, multichainFetcher, config) - -export default useQuery - -const fetchMultiple = async (urls: string[]): Promise => { - const responses = await Promise.all(urls.map((url) => fetch(url))) - const data = await Promise.all(responses.map((res) => res.json())) - return data -} - -export const useMultiFetch = (urls: string[] | null, config?: any) => { - const fetcher = (): Promise => fetchMultiple(urls ?? []) - return useSWRImmutable(urls ? urls.join() : null, fetcher, config) -} diff --git a/src/hooks/useTokenList.tsx b/src/hooks/useTokenList.tsx index 50d7b2ec6..4977a5b24 100644 --- a/src/hooks/useTokenList.tsx +++ b/src/hooks/useTokenList.tsx @@ -13,7 +13,7 @@ import { supportedChainList, } from 'utils/constants' import { formatEther, getAddress } from 'viem' -import { useMultichainQuery } from './useQuery' +import { useMultichainQuery } from './use-query' import useTimeFrom from './useTimeFrom' import { useWatchReadContracts } from './useWatchReadContract' import { Token } from '@/types' diff --git a/src/hooks/useTokenStats.tsx b/src/hooks/useTokenStats.tsx index 6afb1a837..c3cafcd88 100644 --- a/src/hooks/useTokenStats.tsx +++ b/src/hooks/useTokenStats.tsx @@ -9,7 +9,7 @@ import { formatCurrency } from 'utils' import { TIME_RANGES } from 'utils/constants' import { RSVOverview } from 'utils/rsv' import { formatEther } from 'viem' -import useQuery from './useQuery' +import useQuery from './use-query' import useTimeFrom from './useTimeFrom' const rTokenMetricsQuery = gql` diff --git a/src/index.tsx b/src/index.tsx index 66c11b21a..9f80acb81 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -1,15 +1,19 @@ import 'polyfills' +import * as Sentry from '@sentry/react' import { createRoot } from 'react-dom/client' import App from './app' -import * as Sentry from '@sentry/react' - -Sentry.init({ - dsn: 'https://b68198129f2305a28405a306efc7d779@o4509282817015808.ingest.us.sentry.io/4509282885566464', - // Setting this option to true will send default PII data to Sentry. - // For example, automatic IP address collection on events - sendDefaultPii: true, -}) const root = createRoot(document.getElementById('root')!) root.render() + +// Defer Sentry init to after first render to avoid blocking FCP +requestIdleCallback( + () => { + Sentry.init({ + dsn: 'https://b68198129f2305a28405a306efc7d779@o4509282817015808.ingest.us.sentry.io/4509282885566464', + sendDefaultPii: true, + }) + }, + { timeout: 2000 } +) diff --git a/src/lib/ipfs-upload.ts b/src/lib/ipfs-upload.ts deleted file mode 100644 index 9a83039c5..000000000 --- a/src/lib/ipfs-upload.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { create } from 'kubo-rpc-client' - -const IPFS_GATEWAY = 'https://ipfs.satsuma.xyz/ipfs/' -const IPFS_NODE = 'https://ipfs.satsuma.xyz/api/v0/add?pin=true' - -export const uploadFileToIpfs = async (file: File | Blob) => { - const ipfs = create({ - url: IPFS_NODE, - }) - - const response = await ipfs.add(file, { - pin: true, - }) - const ipfsHash = response.cid.toV0().toString() - - return { - ipfsHash: ipfsHash, - ipfsLink: `ipfs://${ipfsHash}`, - ipfsResolved: `${IPFS_GATEWAY}${ipfsHash}`, - } -} - -export const uploadJsonToIpfs = async (json: object) => { - const stringified = JSON.stringify(json, null, 2) - const file = new Blob([stringified], { type: 'application/json' }) - - return await uploadFileToIpfs(file) -} - -export function resolveIpfsLink(ipfsLink: string) { - if (ipfsLink.startsWith('ipfs://')) { - return `${IPFS_GATEWAY}${ipfsLink.slice(7)}` - } - - return ipfsLink -} diff --git a/src/locales/en.js b/src/locales/en.js index 5039d7a28..1ace3bd9c 100644 --- a/src/locales/en.js +++ b/src/locales/en.js @@ -1 +1 @@ -/*eslint-disable*/module.exports={messages:JSON.parse("{\"1LAqfa\":[\"- Redeem \",[\"0\"]],\"xEhonF\":\"(in their Github repository)\",\"J/hVSQ\":[[\"0\"]],\"/uk/m7\":[[\"0\"],\" APY\"],\"RwBJxn\":[[\"0\"],\" auctions\"],\"A1BKet\":[[\"0\"],\" Description\"],\"FGOUAP\":[[\"0\"],\" of \",[\"1\"]],\"FbyycO\":[[\"0\"],\" Price\"],\"4kl1Q6\":[[\"fromToken\"],\" amount\"],\"njiDEz\":[[\"pauseLabel\"],\" not paused\"],\"qeq9zz\":[[\"pauseLabel\"],\" paused\"],\"8UH/HA\":[[\"unit\"],\" Token distribution\"],\"9OU4oG\":\"% Acceptable\",\"SkmQRZ\":\"% Revenue share\",\"b6D1xw\":\"% Revenue to RSR Stakers\",\"MqLjTu\":\"% Revenue to RToken Holders\",\"BuQhD6\":\"% to external address\",\"Bkd1RD\":[\"+ Mint \",[\"0\"]],\"eFTnE/\":\"15 params\",\"x59O98\":\"3.4.0 Upgrade spells\",\"TEAI8I\":\"A Brief RToken Introduction\",\"Sw7Gww\":\"A good explainer for how Gnosis auctions work can be found\",\"XU7Jfb\":\"A year ago\",\"G5W/UB\":\"ABC Labs uses industry standard anonymized analytics tools to understand usage and improve the user experience. ABC Labs does not collect any information about users or their financial activity.\",\"uyJsf6\":\"About\",\"Ng/SkH\":\"Above minimum trade volume\",\"rQh1iF\":\"Abstain\",\"AeXO77\":\"Account\",\"m16xKo\":\"Add\",\"wh9uml\":\"Add new address\",\"l9C7HU\":\"Add to backup basket\",\"VYQ8Iy\":\"Add to basket\",\"xjFy3M\":\"Add to primary basket\",\"Du6bPw\":\"Address\",\"2yBN46\":\"Advanced config:\",\"92tTve\":\"After your withdrawal request is proposed onchain (transaction 1) you must verify (transaction 2) and complete (transaction 3) the withdrawal in order to access your funds. You can track your progress in the transactions table under Withdrawals.\",\"GFvPy6\":\"Against\",\"ypVIwM\":\"Alexios is standard token-voting adopted from Compound Governor Bravo, with adjustments accounting for RSR being staked across multiple RTokens.\",\"XOJDc9\":\"All time\",\"+0K6xY\":\"All unlisted RTokens\",\"hehnjM\":\"Amount\",\"2NFd5O\":\"Annualized RSR Stakers Revenue\",\"yts6Fj\":\"Annualized RTokens Revenue\",\"U6AQ7u\":\"Anyone can click the button above to check and trigger an auction for any revenue that has accrued or for rebalances that need to happen. Please note that for RTokens with many collateral types in the basket, this may be an expensive transaction to execute.\",\"73QZmA\":\"Approve in wallet\",\"MAaLW+\":\"Are there any fees involved in using Base Bridge?\",\"jQSzKJ\":\"As RSR\",\"xrBkuC\":\"As RToken\",\"SHPE7u\":\"Asset Registry\",\"LG54As\":\"Auctionable revenue\",\"Vchc1B\":\"auctioned\",\"rhMQ3Z\":\"Auctions\",\"ZDmC6j\":\"Available collateral\",\"b0tqCW\":\"Back to Governance\",\"9aZHfH\":\"Back to settings\",\"02uyLF\":\"Backing\",\"kg0lD1\":\"Backing & Risk\",\"gdgoAB\":\"Backing + Overcollaterization:\",\"7rqC5h\":\"Backing + Staked\",\"qvSTRH\":\"Backing buffer\",\"E/kZN+\":\"Backing buffer - percentage value that describes how much additional collateral tokens to keep in the BackingManager before forwarding tokens to the RevenueTraders. The RevenueTraders here refers to the RToken and RSR traders. Why this matters? It allows collateral tokens to be periodically converted into the RToken, which is a more efficient form of revenue production than trading each individual collateral for the desired RToken. It also provides a buffer to prevent RSR seizure after trading slippage. For more info on the BackingManager and Trader types see the “Revenue distribution to RToken holders” and “Summary of revenue distribution” in our documentation.\",\"0DN8vr\":\"Backing buffer (%)\",\"EIcaiW\":\"Backing config\",\"c23a1k\":\"Backing Manager\",\"W2Q1/M\":\"Backing Parameters\",\"a8IIG5\":\"Backup basket\",\"kFRSvP\":\"Backup configuration tracks primary basket changes to update its values. This may not be desired on a proposal, you can choose to propose new changes.\",\"llDXYJ\":\"Backups\",\"0QDjxt\":\"Balance:\",\"ehOkF+\":\"Basics\",\"HG4SWx\":\"Basket\",\"+cJZX5\":\"Basket APY\",\"p5/O52\":\"Basket defaulted\",\"x1Ujs3\":\"Basket Handler\",\"HFgTxe\":\"Basket iffy\",\"g1KZ8Y\":\"Basket is not ready\",\"+s9pmq\":\"Basket scale for this unit of account. This is used to initially calculate how much of each token is required for minting.\",\"fSh1F2\":\"Basket warmup period\",\"+WPOsr\":\"Batch auction length\",\"CZUigm\":\"Batch Auction length - defines how long Gnosis EasyAuction auctions should be. Gnosis EasyAuction is a platform enabling fair price discovery for tokens through the use of batch auctions.\",\"U7USFW\":\"Batch Auction length (s)\",\"nd4lSI\":\"Batch trade\",\"rf/1ro\":\"Be aware that anyone can create an RToken that ends up on this list. We don't apply any standards beyond what can be done with the Reserve Protocol.\",\"PBnztC\":\"Begin governance setup\",\"ZRBNIp\":[\"Begin minting \",[\"0\"],\" \",[\"1\"]],\"DNiYLX\":[\"Begin redemption of \",[\"0\"],\" \",[\"1\"]],\"qaArC7\":\"Below minimum trade volume\",\"8DIDYI\":\"Bought\",\"mkW9xD\":\"Broker\",\"O2UpM1\":\"Browse\",\"+SwX7M\":\"Browse RTokens\",\"oS2F65\":\"Buying\",\"prlK0G\":\"Can I cancel a withdrawal?\",\"nTAJs/\":\"Can’t find what you’re looking for elsewhere or want to join the conversation?\",\"dEgA5A\":\"Cancel\",\"xcRNSV\":\"Cancel Issue\",\"jE3OmQ\":\"Cancel proposal\",\"xouc5P\":\"Cancel unstake\",\"YiF3/Q\":\"Cast Spell 1\",\"YwD4dh\":\"Cast Spell 2\",\"4ZzlJd\":\"Casting 3.4.0 upgrade spell\",\"VvjZ7K\":\"Caution\",\"xjhtsV\":\"Chain\",\"o+XJ9D\":\"Change\",\"IICqKY\":\"Change backup basket\",\"OC3bUY\":\"Change distribution\",\"rEptSB\":\"Change diversity factor\",\"pVgGbU\":\"Change in:\",\"B6FtWk\":\"Change primary basket\",\"gqu6u3\":\"Check for auctions\",\"GXo8gr\":\"Choose between our Alexios Governor and anything between one man rule to arbitrary DAO structure under your defined Ethereum address.\",\"31T9Uy\":\"Choose Redemption Basket\",\"hom7qf\":\"Claim\",\"ngS/8Z\":[\"Claim $\",[\"0\"]],\"Q8mMek\":\"Claim rewards across all traders\",\"y2L2W5\":\"Claimable emissions\",\"q0gCXD\":\"Collateral distribution\",\"zXlSi4\":\"Collateral Exposure\",\"pB3Yot\":\"Collateral Plugins\",\"52SO2+\":\"Collateral token\",\"t4r50E\":\"Collateral(s)\",\"bwdIqT\":\"Community Discord\",\"5NmEnz\":\"community is available around the clock for general questions, assistance and support!\",\"1KBao4\":\"Compare RTokens\",\"bD8I7O\":\"Complete\",\"en/H+I\":\"Complete withdrawal on Mainnet\",\"RW+4/D\":\"Configure your vote\",\"z77j59\":\"Confirm & prepare proposal\",\"PZZf4D\":\"Confirm & Submit\",\"XXw3LT\":\"Confirm changes made\",\"Eq4P3S\":\"Confirm delegate\",\"iSLIjg\":\"Connect\",\"CtByM7\":\"Connect Wallet\",\"iH8itU\":\"Connect your wallet\",\"FNKsXU\":\"Contract Addresses\",\"ogCHh3\":\"Contract upgrades\",\"qS2FaE\":\"Contracts\",\"u+VWhB\":\"Copied to clipboard!\",\"/4gGIX\":\"Copy to clipboard\",\"+2ovA+\":\"Create proposal\",\"88kg0+\":\"Created At\",\"7vEC4B\":\"current\",\"Hp1l6f\":\"Current\",\"bmmEBC\":\"Current holder\",\"ADH2UX\":\"Current status:\",\"srRMnJ\":\"Customize\",\"QQ2SBx\":\"Decimals\",\"drp73Y\":\"Default delay\",\"0hSka2\":\"DeFi protocols oftentimes have incentives for liquidity that are paid in their token or a combination of tokens. By providing liquidity for trading or lending or other activities on these protocols, you can earn rewards that are sometimes quite high! Note that there are always risks (smart contract risks, impermanent loss risks, etc), in providing liquidity on these protocols so please make sure you understand things before blindly diving in.\",\"mgR7iR\":\"DeFi yield opportunities for RTokens in Convex, Curve, Yearn & Beefy\",\"UpgRb2\":\"Define what portion of the revenue goes to the RToken holders versus RSR stakers. It can also be configured to send a portion of the revenue of an RToken to any arbitrary Ethereum address (wallet or smart contract).<0/><1/>\",\"QpGF0U\":[\"Delay (in number of \",[\"0\"],\") since the proposal starts until voting ends.\"],\"YSajVI\":\"Delay in seconds\",\"hyt0Ac\":\"Delay in Seconds\",\"XbvxUa\":\"Delegate\",\"fSkQWU\":\"Delegate to\",\"Ui1tti\":\"Delegate votes\",\"nsUy30\":\"Delegate voting power\",\"aFfRAV\":\"Delegate voting power for future votes\",\"2VoM3e\":\"Delegated to self\",\"if4+2Q\":\"Delegated to:\",\"GLUC2q\":\"Deploy\",\"7SrxgE\":\"Deploy an RToken\",\"zoFqVH\":\"Deploy Governance\",\"GO6A9W\":\"Deploy RToken\",\"cs1EEG\":\"Deploy transaction submitted\",\"PmRw7M\":\"Deploy your own RToken\",\"YEpmZo\":\"Deploying through this UI doesn't require deep technical knowledge as long as you don't need novel collateral plugins for your baskets. However, we encourage you to talk to someone proficient in the protocol and read the docs to learn more before confirming any transactions.\",\"kj3M8S\":\"Deposit\",\"gN/Sjx\":\"Deposits: a few minutes usually, only requires 1x transaction. Withdrawals: 7 days, 3 transactions.\",\"Nu4oKW\":\"Description\",\"pRLw2a\":\"Details + Roles\",\"bzSI52\":\"Discard\",\"/XQgft\":\"Discover\",\"iQSUHl\":\"Discussions of ideas and suggestion that the community has on improving the Reserve Ecosystem\",\"1QfxQT\":\"Dismiss\",\"MYod0t\":[\"Display only \",[\"0\"],\" related collaterals\"],\"7C9ebc\":\"Distributed revenue does not add up to 100%\",\"XsPuIt\":\"Distributor\",\"CobcOM\":\"Diversity factor\",\"IhmalY\":\"Diversity Factor\",\"TvY/XA\":\"Documentation\",\"QtNpcx\":\"Duration in seconds\",\"oHUnqt\":\"Duration in Seconds\",\"MrVW7f\":\"Dutch auction length\",\"5dVVsn\":\"Dutch Auction length (s)\",\"pfaRE0\":\"Dutch trade\",\"RLDSN8\":\"Each target unit of your primary basket will have defined emergency collateral to replace with in case of default.\",\"rcvQYl\":\"Each type of trade can currently happen in only one way; the protocol launches a Gnosis EasyAuction. The Reserve Protocol is designed to make it easy to add other trading methods, but no other methods are currently supported.\",\"QIuujP\":\"Earn\",\"ePK91l\":\"Edit\",\"ZJhuy5\":\"Emergency basket\",\"XWoKr0\":\"Emergency Collateral\",\"PU/y6X\":\"Empty backup basket\",\"gAVoMF\":\"Empty Basket\",\"4t/yW7\":\"Ended at\",\"Kxg5/E\":\"Ended auctions\",\"fPOajI\":\"Ends at\",\"fn/6Aa\":\"Ensure that the asset(s) you are unregistering do not have pending revenue that can be\",\"6FHCpe\":\"Est. APY\",\"cBgRZm\":\"Est. APY:\",\"UJrReY\":\"Est. Staking APY\",\"hrp5QR\":\"Estimated basket APY\",\"FEt55g\":\"Estimated gas cost\",\"Aw88aM\":\"Estimated gas cost:\",\"tdllfV\":\"ETH address\",\"51OY3J\":\"Executable code\",\"QwwYl1\":\"Execute proposal\",\"0BKROZ\":\"Execution Delay\",\"JJ/1wI\":\"Exit Deployer\",\"8tjQCz\":\"Explore\",\"c8OQUt\":[\"Explore yield opportunities for \",[\"0\"]],\"PKItzG\":\"Extra collateral to keep\",\"osWXWB\":\"Farm\",\"Z0UMy9\":\"Featured RTokens\",\"EzkIsi\":\"File new issues or view & upvote existing feedback.\",\"rpilX8\":\"Final price in:\",\"f+unss\":\"First-loss RSR Capital\",\"YHpbe1\":\"For\",\"Q0xGVH\":\"Freeze State\",\"ejVYRQ\":\"From\",\"kdnzvG\":\"From:\",\"9DGbad\":\"Frozen\",\"9Pk/+F\":\"Full exposure view\",\"eI/TLj\":\"Funds moved\",\"1jYZaW\":\"Furnace\",\"bWMGJN\":\"Go to the RToken Deployer\",\"dE6BLF\":\"Governance\",\"i2y1O5\":\"Governance Details\",\"WNrgVT\":\"Governance format\",\"Sku3Zy\":\"Governance forum\",\"olT/Wc\":\"Governance gets deployed & your RToken is now usable (if unpaused)\",\"pYpb1y\":\"Governance parameters\",\"qdZImh\":\"Governance roles\",\"NmI7Ll\":\"Governor address\",\"M4YZCC\":\"Governor mandate\",\"i/oT62\":\"Guardian\",\"V0H90D\":\"Guardian address\",\"OAfk3i\":\"Hash\",\"r+1aZf\":\"Historical metrics\",\"wssdFG\":\"Holders APY\",\"GCTzEY\":\"How do I verify my withdrawal transaction?\",\"HxV134\":\"How do withdrawals work?\",\"UV0ZnN\":\"How fast will my tokens arrive?\",\"l5O21S\":\"If an RToken is listed on Register, it doesn't mean that ABC Labs endorses the safety or risk levels of the RToken or that ABC Labs was involved in the creation of or is in anyway responsible for the RToken. ABC Labs requires Github requests with additional information beyond what is available on the blockchain to give users relevant data to make informed decisions. As a user, please evaluate any new RToken carefully before holding or staking your RSR on them.\",\"b3XmO9\":\"If you prefer not to wait, instead of making a withdrawal using Register L2 Bridge, you also have the option to utilize a third-party bridge for quicker withdrawals.\",\"GYgvDh\":\"If your token is paused and you have the correct role, you can unpause it here.\",\"9L7NSU\":\"Immediate\",\"pJ2Ng0\":\"In Withdraw Process\",\"yIRfV3\":\"Including off-chain in-app transactions of RToken in the Reserve App.\",\"rqptfw\":\"Initial RToken state after deployment\",\"SUkrBJ\":\"Input delay\",\"glKVIy\":\"Input delay in hours\",\"NgIppW\":\"Input plugin address (not ERC-20 address)\",\"g7BX9A\":\"Input proposal threshold\",\"0n6GRN\":\"Input proposal title\",\"OPVsCp\":\"Input quorum percent\",\"i8EW0F\":\"Input RFC link\",\"I3M3ju\":\"Input RSR stakers revenue distribution\",\"/A3dHx\":\"Input the guardian ethereum address\",\"SIHhwZ\":\"Input the owner ethereum address\",\"6cDDmZ\":\"Input ticker\",\"Ze3la6\":\"Input token holders revenue distribution\",\"0Rrfh3\":\"Input token name\",\"wjincn\":\"Input token name or symbol\",\"d/VrnV\":\"Input voting period\",\"WZK33i\":\"Input wallet\",\"U/iNrh\":\"Input withdrawal leak %\",\"NWSIX1\":\"Inspect\",\"cg7wLy\":\"Inspect collateral backing, mint, stake, redeem & explore additional earn opportunities across DeFi\",\"kka8e4\":\"Intro\",\"a3U7In\":[\"Invalid (\",[\"targetUnit\"],\") backup diversity factor\"],\"xEIcwa\":[\"Invalid (\",[\"targetUnit\"],\") basket distribution\"],\"CKp2aP\":[\"Invalid (\",[\"targetUnit\"],\") basket scale\"],\"Kw1+qc\":\"Invalid address\",\"Kjox/d\":\"Invalid asset\",\"TjramT\":\"Invalid collateral\",\"AXu7J/\":\"Invalid destination address\",\"N5kBDi\":\"Invalid ethereum address\",\"n5/QY4\":\"Invalid maximum range\",\"NqF94Y\":\"Invalid minimum range\",\"WY8amq\":\"Invalid number\",\"w8xQRx\":\"Invalid value\",\"Xtj6BR\":\"Issuance amount - allows the issuer to limit the amount of RTokens issued per hour. This matters in the event of an exploit where an attacker tries to issue more RTokens. This buys time for users with pause or freeze permissions to reduce the amount of RTokens that can be issued.\",\"x9GEpw\":\"Issuance rate - allows the issuer to limit the amount of RTokens issued per hour based on a percentage of the current RToken market cap. This matters in the event of an exploit where an attacker tries to issue more RTokens. This buys time for users with pause or freeze permissions to reduce the amount of RTokens that can be issued.\",\"dScyNc\":\"Issuance throttle amount\",\"tjTLy7\":\"Issuance throttle rate\",\"0U/Tk/\":\"Issuance throttle Rate\",\"U9ks0t\":\"Issuance throttle rate (%)\",\"DLNgVH\":\"Issue\",\"Z3FXyt\":\"Loading...\",\"b4vxFC\":\"Long Freeze\",\"XUds+a\":\"Long freeze duration\",\"+RU5yD\":\"Long freeze duration - freeze an RToken’s system for a longer period of time. A long-freezer has 6 charges before losing the ability to freeze any more\",\"BmvM5L\":\"Long freeze duration (s)\",\"98fSbL\":\"Made your own collateral?\",\"D16asK\":\"Main\",\"HQc4VD\":\"Make proposed changes to the backing basket, emergency collateral, governance params, etc. Changes in multiple areas can be batched into a single proposal although to make voting on issues simpler it may make sense to separate things if unrelated.\",\"bKXjUF\":\"Mandate\",\"fAfiCl\":\"Mandate cannot be longer than 256 characters\",\"dViFQP\":\"Mandate is required\",\"/DCw0h\":\"Market cap:\",\"Kow4Yn\":\"Max trade slippage\",\"Q/sl1D\":\"Max trade slippage — maximum deviation from oracle prices that any trade can clear at. Why this matters? Acts as a form of slippage protection.\",\"D7h0du\":\"Max trade slippage (%)\",\"8wGbsh\":\"Maximum trade for RToken\",\"iDr5Z5\":\"Maximum trade volume - maximum sized trade for any trade involving RToken, in terms of the unit of account eg. USD.\",\"PlJdlY\":\"Mechanics\",\"p5fpTr\":\"Meditate peacefully on the stability of a future asset backed reserve currency while your RToken deploys 🧘‍♂️\",\"BxWKeM\":\"Melt\",\"YjzAfU\":\"Melting\",\"iVav3e\":\"Minimum trade in USD terms\",\"LoH4s+\":\"Minimum trade size\",\"IwXX9d\":\"Minimum trade volume\",\"JWf8LL\":\"Minimum trade volume - minimum sized trade that can be performed, in terms of the unit of account eg. USD.\",\"HCswgj\":\"Minimum trade volume ($)\",\"5IrCQY\":\"Mint\",\"kI1eQH\":\"Mint - Global throttle\",\"KaOUA4\":[\"Mint \",[\"0\"]],\"L2MqsA\":\"Mint + Redeem\",\"XXCmTE\":\"Mint amount\",\"maOPkj\":\"Mintable now\",\"irOfE1\":\"Minting requires a deposit of the defined collateral tokens in equal value amounts to the RToken smart contracts.\",\"GhJQm9\":\"Missing collateral\",\"TiC6Xh\":\"Mkt Cap\",\"e2+lHb\":\"mth\",\"6YtxFj\":\"Name\",\"moeKLu\":\"Navigate to the Withdrawal tab and view transactions below. Next to your transaction, use the button to complete the next available action. This action will ask you to complete the next required step to move your transaction forward and receive your withdrawn tokens in your wallet.\",\"gv/ySg\":\"Need help bridging?\",\"HBI6nY\":\"Need help?\",\"OR475H\":\"Network\",\"W2iax5\":\"Networks\",\"bkcUbj\":\"New backup configuration\",\"bSZuP8\":\"New primary basket\",\"KqojOL\":\"Next steps\",\"W5JlJM\":\"No actionable revenue available\",\"UsxK+A\":\"No assets to unregister...\",\"plhHQt\":\"No data\",\"rP4PKZ\":\"No emergency collateral for target\",\"uhqYEB\":\"No emergency collateral for this target unit\",\"6fx8ZN\":\"No ended auctions\",\"OyCrBF\":\"No holders for this role...\",\"Eo6Lg5\":\"No plugins available\",\"m+s/1w\":\"No proposals created...\",\"xc4rPs\":\"No transactions\",\"LbyTTW\":\"No transactions in local memory...\",\"p2vqx1\":\"No voters at this moment...\",\"VHVdS1\":\"No votes\",\"Tpt0Ho\":\"No withdrawals found for connected wallet.\",\"8f/nnw\":\"No, if a withdrawal has already been initiated on the Withdraw page it is not possible to cancel it. Once withdrawn, the process needs to be completed.\",\"EdQY6l\":\"None\",\"OJx3wK\":\"Not available\",\"I7CwKt\":\"Not frozen\",\"GE3hR8\":\"Not ready to set up governance?\",\"X12LZU\":\"Not sure what you're looking at?\",\"eWxpbp\":\"Ongoing auctions\",\"Z2UK1U\":\"Ongoing dutch auctions\",\"qg1O48\":\"Only the guardian address or governance will be able to unpause\",\"/IX/7x\":\"Other\",\"snZOdR\":\"Other config\",\"UjFzc9\":\"Other parameters\",\"jBJkMt\":\"Other Parameters\",\"ed2+9W\":\"Other Risks\",\"6/dCYd\":\"Overview\",\"LtI9AS\":\"Owner\",\"xkAsLE\":\"Owner address\",\"X1mZKh\":\"Owner Address\",\"F18WP3\":\"Parameters\",\"sDP9Ho\":\"Pause status\",\"89oleM\":\"Peg:\",\"lIBAz6\":\"Pending auctions to settle\",\"J2tM5d\":\"Pending, sign in wallet\",\"9FqwqX\":\"Period in seconds\",\"kDRVPV\":\"Phase\",\"F3bW6y\":\"Platform\",\"I6NohP\":\"Platform exposure\",\"Dx9h/1\":\"Please carefully evaluate the RToken before choosing to stake your RSR here. If any of the various collaterals of this RToken default, then the staked RSR will be the first funds that get auctioned off to make up the difference for RToken holders.\",\"Q8+uwY\":\"Please complete the required governance configuration to complete deployment.\",\"ujpEaI\":\"Please connect your wallet\",\"3ebyPI\":\"Please don't close this window to avoid issues finding your way back here.\",\"A+8PId\":\"Please keep in mind that interactions with the Ethereum or Base blockchains are pseudonymous and publicly available.\",\"WsVNsQ\":\"Please read more about how Register manage tokens on our repository\",\"yUHPo3\":\"Please select an asset to claim\",\"oKucDI\":\"Please sign the transaction in your wallet to continue with the deployment process.\",\"aSt5Rp\":\"Please sign the transaction in your wallet to continue with the governance process.\",\"IZwgAK\":\"Please sign the transaction in your wallet to continue with the government configuration process.\",\"eiVzdG\":\"Please wait while the simulation executes\",\"ou6PkF\":\"Pool\",\"MqA4qt\":\"Portfolio\",\"QKskSe\":\"Preparing transaction\",\"a7u1N9\":\"Price\",\"wTvlZg\":\"Primary basket\",\"vFeILc\":\"Primary Basket\",\"GycO8a\":\"Primary basket not defined\",\"CpEYLQ\":\"Proceed in wallet\",\"e0NrBM\":\"Project\",\"oDQ5xF\":\"Proposal execution delay (hours)\",\"Yh49N4\":\"Proposal Threshold\",\"CPVP0+\":\"Proposal Threshold (%)\",\"ypPAJ2\":\"Proposal Title\",\"6g1gi0\":\"Proposals\",\"i4xxYn\":\"Proposals voted\",\"H3cnhC\":[\"Propose changes to $\",[\"0\"]],\"A+iiAx\":\"Propose how the basket should be distributed going forward.\",\"aqHaEK\":\"Propose new backup configuration\",\"P+Quwn\":\"Propose new basket\",\"3sRog+\":\"Proposed\",\"bZZ1DH\":\"Proposed by\",\"j3CapQ\":\"Protocol Docs\",\"/s+80y\":\"Provide liquidity across DeFi & earn more with your RTokens\",\"EU/w8s\":\"Queue proposal\",\"9OBKm7\":\"Quorum\",\"8uEgwp\":\"Quorum (%)\",\"Fn9TcI\":\"Quorum?:\",\"VcQdaO\":\"Read more about revenue distribution\",\"3Imb0U\":\"Receiving eth address\",\"j3sA7W\":\"Recent proposals\",\"UhF/tF\":\"Record limit\",\"VCG/e6\":\"Redeem\",\"z7p6LJ\":\"Redeem - Global throttle\",\"sk7H6q\":[\"Redeem \",[\"0\"]],\"vq/idj\":\"Redeem amount\",\"qFHaGG\":\"Redeemable now\",\"xmPyUn\":\"Redemption amount - allows the issuer to limit the amount of RTokens redeemed per hour. This matters in the event of an exploit where an attacker tries to redeem RTokens.This buys time for users with pause or freeze permissions to reduce the amount of RTokens that can be redeemed.\",\"Jd7EeB\":\"Redemption rate - allows the issuer to limit the amount of RTokens redeemed per hour based on a percentage of the current RToken market cap. This matters in the event of an exploit where an attacker tries to redeem RTokens. This buys time for users with pause or freeze permissions to reduce the amount of RTokens that can be redeemed.\",\"ta/cTS\":\"Redemption throttle amount\",\"MrnlGV\":\"Redemption throttle rate\",\"HKPYsc\":\"Redemption throttle Rate\",\"KDqZm9\":\"Redemption throttle rate (%)\",\"muMr9+\":\"Refresh quote\",\"1Go5ao\":\"Register Assets\",\"Rcw4Ec\":\"Register Feedback\",\"ZHUnsw\":\"Register is an open source project developed and maintained by ABC Labs as the first dApp to interact with the Reserve Protocol and various RTokens deployed with the platform.\",\"mLb7PA\":\"Register L2 Bridge enables the transfer of certain digital assets and other data back and forth between Ethereum and Base.\",\"/7T5Z1\":\"Register listed RTokens\",\"Zllgcd\":\"Register Listing\",\"Pci103\":\"Registering assets\",\"FZPbrN\":\"Registration of an asset plugin enables the RToken to price an underlying ERC20 token. Where an asset plugin for the underlying token already exists, the existing asset plugin is replaced with the new one.\",\"QS7Iqq\":\"Regular minting\",\"Z22ZHd\":\"Related Contracts\",\"t/YqKh\":\"Remove\",\"1RVBJe\":\"Request sent\",\"Y0kXxR\":\"Required setup:\",\"dA1zfj\":\"Required:\",\"1ex6fX\":\"Reserve aims to help people around the world maintain their spending power by allowing anyone to create asset-backed currencies with tokenized assets on the Ethereum blockchain in customizable and novel ways.\",\"9B4C/p\":\"Reserve Bridge\",\"gHuu3G\":\"Reserve Discord\",\"zsUWkY\":\"Reserve Forum\",\"z95yhS\":\"Reserve Protocol Smart-Contract Risk\",\"EQvnVc\":\"Revenue distribution\",\"7ALdX9\":\"Revenue Distribution\",\"sfFoij\":\"Revenue share\",\"UaUjkN\":\"Revenue split\",\"jJdwCB\":\"Revert\",\"pynxnf\":\"Review stake\",\"ktUGFg\":\"Reward ratio\",\"SOJxcI\":\"Reward ratio - amount of the current reward amount that should be handed out in a single block. The default corresponds to a half life of approximately 15 days.\",\"DATVA/\":\"Reward ratio (decimals)\",\"kEqOfQ\":\"RFC\",\"Zb7zns\":\"Risk evaluation\",\"W8K/75\":\"Role held by:\",\"5dJK4M\":\"Roles\",\"iQ+Xt1\":\"Roles & Controls\",\"59Dk0F\":\"RSR available to withdraw\",\"JxdCy/\":\"RSR Staked\",\"5YPwIl\":\"RSR Stakers\",\"dNQZNq\":\"RSR Trader\",\"bsalqT\":\"RToken Address\",\"03lM+L\":\"RToken Deployment Transaction succeeded\",\"7R+Rtn\":\"RToken Details\",\"1pynDW\":\"RToken holders\",\"v+QrKR\":\"RToken in Wallet\",\"fbrLqM\":\"RToken is frozen\",\"togYEE\":\"RToken is paused\",\"bsxAWr\":\"RToken mandate\",\"Nj/5dc\":\"RToken Market Cap\",\"En3lQ+\":\"RToken Maximum trade volume\",\"oMnqeW\":\"RToken Maximum trade volume ($)\",\"5EuWoG\":\"RToken Trader\",\"alx8ZZ\":\"RToken will be fully functional\",\"ymns7Z\":\"RToken will be left in pause state\",\"K1iv1D\":\"RToken will be ready to use after this TX if you choose to unpause.\",\"d3wKBU\":\"RTokens\",\"PnFsqo\":\"RTokens are 100% backed by a diversified set of underlying collateral tokens...\",\"1i9qCJ\":\"RTokens in this list is not an endorsement or audited by us. It’s simply RTokens that have gone through our listing process and don’t seem like clear scams.\",\"SsYoDT\":\"RTokens live on a blockchain, either Ethereum or Base, which means that they can be transacted worldwide within seconds. They're also 100% backed by other assets living on that same blockchain. The users of the currency can - at any time - redeem their RTokens for backing assets worthe the same value.\",\"tfDRzk\":\"Save\",\"A1taO8\":\"Search\",\"EAVrtH\":\"Search by token symbol\",\"K29LLi\":\"Select proposal type\",\"0RrIzN\":\"Select token\",\"WEVa0d\":\"Selling\",\"xmi4fw\":\"Send verify tx on Mainnet\",\"BecCbK\":\"Settle all\",\"81aX0K\":\"Settleable auctions\",\"qSVeRc\":\"Setup Governance\",\"d+U+9W\":\"Shared externally\",\"ExN9Hw\":\"Shared with RSR Stakers\",\"TnNnVh\":\"Shared with RToken Holders\",\"mif1tC\":\"Short Freeze\",\"ww1hmr\":\"Short freeze duration\",\"ZC1jjY\":\"Short freeze duration (s)\",\"l8wHqt\":\"Short freezers have the responsibility of freezing an RToken if anything dangerous or suspicious is happening. This is a one-shot freeze and the role will be revoked after a single use. This field determines how long the RToken will remain frozen until the freeze expires or is extended by another actor.\",\"n+8yVN\":\"Signature\",\"wENF7v\":\"Signing Tx 1\",\"88o7M6\":\"Signing Tx 2\",\"9cNlqf\":\"Simulate proposal\",\"ElVQVf\":\"Simulate Proposal\",\"8qwuC/\":\"Simulation successful ✓\",\"wmlz0b\":\"Simulation unsuccessful ✘\",\"vi7Gkt\":\"Small revenue auctions\",\"oC5VUA\":\"Snapshot Delay\",\"s9KGXU\":\"Sold\",\"EAGRJL\":\"Some collateral tokens from protocols like Aave and Convex differ technically from other collateral tokens. To ensure proper handling, they must be wrapped in a contract for effective monitoring. Once wrapped, the collateral remains the same but has a new interface for price and appreciation tracking.\",\"pfKK+t\":\"Spell 1\",\"2+Ty+2\":\"Spell 2\",\"n/7eJI\":\"St Token Ticker\",\"JYKRJS\":\"Stake\",\"H6nEG8\":\"Stake + Unstake\",\"4T0Zfr\":\"Stake pool\",\"FXFgMV\":\"Stake pool USD value:\",\"OinOun\":\"Stake RSR\",\"q6lAbz\":\"Staked\",\"yuBO6n\":\"Staked RSR\",\"dH1S+k\":\"Staked RSR Overcollateralisation\",\"KRwsdB\":\"Stakers APY\",\"f8rob6\":\"Staking RSR\",\"H7qwjR\":\"Staking token\",\"rCQOIX\":\"Staking yield share ends\",\"lsLMXZ\":\"Start Issue\",\"uAQUqI\":\"Status\",\"htTcVX\":\"Status:\",\"39OpPc\":\"Stay patient while the transaction is in progress & don’t close this window to avoid issues finding your way back here.\",\"kHijuY\":\"Still have questions? Come talk to the Reserve community in our Discord server. We'd be more than happy to help!\",\"XvmLhx\":\"stRSR payout fraction 0.0\",\"nDsw/H\":\"stRSR Token\",\"nU3mt/\":\"Submit proposal on-chain\",\"bwSQI0\":\"Supply\",\"xE0CMr\":\"Surplus below minimum trade\",\"8Ps70y\":\"Symbol\",\"O6Z3uT\":\"Target:\",\"iA99DC\":\"Target(s)\",\"WNtc8U\":\"The amount of assets selected affects the gas price, this asset may not be worth claiming yet.\",\"rbkFds\":[\"The configured network \\\"\",[\"currentChain\"],\"\\\" is different from the wallet selected network \\\"\",[\"chainId\"],\"\\\"\\\". Change your network in the connected wallet.\"],\"/o1XvT\":\"The creation of new RToken designs is permissionless. If you are the inventive type and have ideas for what assets should be in the basket, what a good governance looks like, or anything novel that could work within the realms of the protocol, please consider putting those ideas into practice or sharing them with the community.\",\"DiXm3I\":\"The diversity factor determines the amount of emergency collateral that will be deployed to the RToken basket in the case of a default.\",\"V302gs\":\"The dutch auction length is how many seconds long falling-price dutch auctions should be. A longer period will result in less slippage due to better price granularity, and a shorter period will result in more slippage.\",\"ETZEWb\":\"The fraction of RSR stake that should be permitted to withdraw without a refresh. When cumulative withdrawals (or a single withdrawal) exceed this fraction, gas must be paid to refresh all assets.\",\"wHW6eD\":\"The guardian has the ability to reject proposals even if they pass. Should be assigned to a multisig or EOA that can be trusted to act as a backstop. It is acceptable if it is relatively slow to act. Only one guardian address should be defined.\",\"B9PIbV\":\"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.\",\"+hApc9\":\"The minimum amount of time after a proposal passes before it can be executed.\",\"XmfFIm\":\"The minimum percentage of stRSR ownership on an RToken to be able to create a proposal.\",\"7YOBWU\":\"The minimum percentage of stRSR voter participation (either For or Abstain) on a proposal before it can be passed.\",\"QqcMwa\":\"The pauser(s) can put the RToken in two states which can be either true or false (no set duration):\",\"VzPx0Z\":\"The projected annual revenue generated by the protocol for RSR stakers, calculated using the current RSR staker APY and the amount of staked RSR for the listed RTokens.\",\"1RZ0qL\":\"The projected annual revenue generated by the protocol for RToken holders, calculated using the current APY and TVL of the listed RTokens.\",\"EJGWha\":\"The Reserve Project\",\"3caoaJ\":\"The Reserve Protocol makes a few different types of trades\",\"gqYTsB\":\"The token supply is not enough for changing the primary basket safely, contact the Reserve team for recommendations.\",\"is3nYM\":\"The top level decision maker, typically a decentralized governance smart contract, responsible for setting or updating all RToken parameter values, RToken baskets, etc. - The RToken OWNER has the power to:\\ngrant and revoke roles to any Ethereum account\\npause and unpause the system\\nfreeze and unfreeze the system\\nset governance parameters\\nupgrade system contracts\",\"9pSFbO\":\"The total value of all RSR staked in the protocol\",\"2/2c30\":\"The total value of all RToken in circulation\",\"nlmg5u\":\"The warmup period is how many seconds should pass after the basket regained the SOUND status before an RToken can be issued and/or a trade can be opened.\",\"RnKfJB\":\"There are network fees involved which are used to pay for the gas costs on Ethereum and Base. There are no additional fees.\",\"gQIzLz\":\"There’s two freezing roles that put the system in the same state for different durations:\",\"lpTJF8\":\"This address already holds this role\",\"8y1g5b\":\"This App\",\"te2erb\":\"This asset is already (being) registered\",\"B8AaMI\":\"This field is required\",\"yGeylI\":\"This is the target collateral basket at the onset of an RToken that defines which collateral needs to be deposited for issuances. The prime basket is directly set by governance, and only changes through successful governance proposals.\",\"73I6CL\":\"This seven day bridge duration is in place as a challenge period security measure built into the OP Stack.\",\"LK9M3g\":\"Ticker\",\"FAeo39\":\"Ticker - symbol eg. USD+\",\"LhMjLm\":\"Time\",\"XelGWQ\":\"Timelock address\",\"ZxkdRe\":\"To:\",\"TP9/K5\":\"Token\",\"1RKej3\":\"Token details\",\"06o+4H\":\"Token Details\",\"XCLYYd\":\"Token exposure\",\"SKZhW9\":\"Token name\",\"v3O3qT\":\"Token name - the name of the RToken eg. Savings Dollar\",\"dUcbZZ\":\"Token name required\",\"bqervZ\":\"Token ticker is required\",\"6RDwJM\":\"Tokens\",\"wzyEKJ\":\"Tokens to match trade\",\"efXgiG\":\"Top voting addresses\",\"G3RyLw\":\"Total % to arbitrary address\",\"cBsi4+\":\"Total initial RToken scale including all targets. If your RToken only has one target unit this will be the same as the basket scale input.\",\"KZ1u6+\":\"Total Market Cap\",\"iaxJrF\":\"Total RSR staked\",\"Wg0Nr2\":\"Trader contract address\",\"MM0Byw\":\"Trader contract for batch trades.\",\"V03foK\":\"Trader contract for Dutch trades.\",\"RrkUqq\":\"Trader implementations\",\"2qh1i8\":\"Trading delay\",\"uQt4Id\":\"Trading delay - how many seconds should pass after the basket has been changed, before a rebalancing trade is opened. Why does this matter? To avoid losses due to poor liquidity.\",\"X0neaw\":\"Trading delay (s)\",\"Cd3fOR\":\"Transaction 1\",\"lCJhs9\":\"Transaction 2\",\"CjHP6C\":\"Transaction confirmed\",\"u3ZeYl\":\"Transaction failed\",\"BlQdFK\":\"Transaction reverted\",\"lPTKNn\":\"Transaction signed!\",\"ExzCxg\":\"Transaction submitted\",\"4wyw8H\":\"Transactions\",\"zPGNJm\":\"Transfer\",\"rgPYaR\":\"Transfer RTokens between Ethereum, Base, and Arbitrum\",\"I8Cs0D\":\"Transferring from Base to Ethereum takes approximately 7 days and requires 3 transactions.\",\"Tt0Nb4\":\"Trigger an Auction\",\"3Ig3IE\":\"Trigger melt\",\"Ypb3g5\":\"Trigger Unstake\",\"J8Bkl9\":\"Turn on Zaps to mint using 1 asset\",\"FYZr+9\":\"Tutorial video\",\"FHKsZF\":\"TVL\",\"MbL4eP\":\"Tx 1\",\"i8BXee\":\"Tx 2\",\"D9+vIc\":\"Tx Hash\",\"oMs/1/\":\"Tx in process...\",\"Al7fdr\":\"Tx Type\",\"vDXkqt\":\"Tx1. RToken Deploy\",\"P5dyHY\":\"Tx2. Governance\",\"+TZLxF\":\"Txs\",\"+zy2Nq\":\"Type\",\"ps586T\":\"Underlying Platform Exposure\",\"DF3kaf\":\"Underlying Token Exposure\",\"HZZiNN\":\"Understand the Reserve Protocol.\",\"wQ0QLx\":\"Unfreeze\",\"nBB/1g\":\"Unknown amount of recollateralization auctions left to run\",\"C2n1bi\":\"Unpausing\",\"lnV9JE\":\"Unregister\",\"Nll23d\":\"Unregister Assets\",\"fPvOAk\":\"Unregistering assets\",\"OFjZGo\":\"Unstake\",\"B+Ho2y\":\"Unstake Cancelled\",\"VG9opj\":\"Unstake RSR\",\"eg+wzu\":\"Unstaking Delay\",\"MwW2jd\":\"Unstaking delay - number of seconds that all RSR unstaking must be delayed in order to account for stakers trying to frontrun defaults and needs to be longer than \\\"governance\\\" for proper incentives for basket changes.\",\"aMQVfT\":\"Unstaking Delay (s)\",\"SxMxM9\":\"Unstaking delay:\",\"t7AAh/\":\"Unstaking RSR\",\"k5+pKI\":\"Unsupported\",\"HEcCC4\":\"Unwrap collaterals\",\"XC3Dby\":\"Upgrade contract implementations to a newer version. This is usually performed for a protocol update or bugfix.\",\"J5TfTH\":\"Upgrade contracts\",\"dfIw2n\":\"USD Value\",\"iWCwan\":\"Use a custom plugin contract address\",\"mo0Ni5\":\"Use the Alexios governor format?\",\"E4jeW1\":\"User Tracking\",\"y8908V\":\"Validating...\",\"uSMfoN\":\"Verify\",\"bl9677\":\"Verifying\",\"NpjEcw\":\"Verifying allowance...\",\"YKsN3Z\":\"Verifying transaction...\",\"eE0JZ4\":\"Version\",\"jpctdh\":\"View\",\"p5nYkr\":\"View All\",\"PzZvqB\":\"View All, including unlisted\",\"CyZadL\":\"View in explorer\",\"OQU8Is\":\"View on etherscan\",\"rd4eHq\":\"View on Etherscan\",\"+7Mfrq\":\"Volume (all time)\",\"fn1iqG\":\"Volume (last 7d)\",\"lQXQKs\":\"Vote\",\"AGXrI9\":\"Vote on-chain\",\"A+I9lo\":\"Vote Supply\",\"Ezc+mS\":\"Vote weight\",\"PByO0X\":\"Votes\",\"1Rd7wm\":\"Votes against\",\"bOmHmD\":\"Votes for\",\"W5kTFy\":\"Voting\",\"8TaAKn\":\"Voting Addresses\",\"4JU3Dr\":\"Voting on the RToken you are staked on requires you to delegate your vote to yourself or another Eth address.\",\"nUImH+\":\"Voting Period\",\"6bxci/\":\"Voting power\",\"TibSbv\":\"Voting power delegation\",\"qzWWBP\":\"Wait 1 hour\",\"HhkGfV\":\"Wait 7 days\",\"fUl1Mc\":\"Wait to trigger revenue auctions until after recollateralization has finished.\",\"sb9Y58\":\"Wallet\",\"6lKE6C\":\"Wallet staked RSR + RToken Value\",\"YR54Ai\":\"Warmup period (s)\",\"UW873z\":\"Watch an intro to RTokens\",\"3z87OK\":\"Welcome to Register - the user interface for registering, inspecting, and interacting with RTokens. \\\"RToken\\\" is the generic name given to asset-backed stablecoins created on the Reserve Protocol, the creation of which is entirely permissionless.\",\"ZOzJpl\":\"What if I have a question, issue or problem?\",\"kF8qEW\":\"What is Register L2 Bridge?\",\"Opgzh2\":\"What is Reserve Governor Alexios?\",\"cVPW0n\":\"What wallet can I use?\",\"ELDnYW\":\"When staking RSR, you are putting your RSR at risk in the case of a collateral default in exchange for 1) the rights to govern the RToken and 2) for a portion of the revenue generated by the collateral. The revenue sent to the staked RSR pool will be distributed amongst RSR stakers proportionally to their stake in the pool.\",\"3hfWcC\":\"When you stake your RSR, you will receive a stRSR receipt token which represents your ownership in the staked RSR contract. As revenue is distributed, the receipt token will be redeemable for an increasing amount of RSR. If there is a default scenario where the staked RSR is slashed, then the receipt token will be redeemable for a decreased amount of RSR.\",\"xr5Ynp\":\"When you unstake your stRSR, there will be a delay (defined by governance). This is to eliminate game theory scenarios that would make the backstop RSR staked pool less effective because people would continually be incentivized to unstake and restake.\",\"jutz4V\":\"Whenever you see the term \\\"overcollateralization\\\", we're referring to the built-in defence mechanism included in RTokens that help protect their stability in the case of any of their backing assets defaulting.\",\"AONm5p\":\"Whether you're an economist looking to improve the fiat standard, a DeFi-entrepreneur seeking to fill a gap in the market, or simply an innovator with a wild idea, anyone can create their own asset-backed currency.\",\"4XcwOZ\":\"Why does it take seven days to withdraw?\",\"OsyKSt\":\"Withdraw\",\"PILCOO\":\"Withdraw RSR\",\"C5TXiE\":\"Withdrawal leak\",\"VOpaFJ\":\"Withdrawal leak (%)\",\"ewqAyO\":\"Withdrawal Transactions\",\"9+KWSx\":\"Worst price\",\"rmZvu8\":\"Wrap collaterals\",\"MqIowX\":\"Wrap/Unwrap collateral\",\"7isgZi\":\"Wrap/Unwrap Tokens\",\"pMn92J\":\"Wrapping collateral tokens\",\"0gv+T2\":\"X\",\"MhhoeD\":\"You can leave your RToken paused and come back to setting up governance later.\",\"dDZTA0\":\"You can use popular Ethereum wallets like Metamask, Rabby, Coinbase Wallet, and Rainbow Wallet to name a few.\",\"P+769u\":\"You receive:\",\"o6ImqE\":\"You submit the transaction configuring your RToken design\",\"YPqf0p\":\"You use:\",\"8znDHf\":\"You will be the temporary owner until governance is deployed in transaction 2.\",\"jKFx1V\":\"You’ll receive:\",\"CtG7o7\":\"Your RTokens\",\"cQe/XW\":\"Your stake position\",\"R6xgEU\":\"Your staked RSR\"}")}; \ No newline at end of file +/*eslint-disable*/module.exports={messages:JSON.parse("{\"+0K6xY\":[\"All unlisted RTokens\"],\"+2ovA+\":[\"Create proposal\"],\"+7Mfrq\":[\"Volume (all time)\"],\"+SwX7M\":[\"Browse RTokens\"],\"+TZLxF\":[\"Txs\"],\"+WPOsr\":[\"Batch auction length\"],\"+cJZX5\":[\"Basket APY\"],\"+hApc9\":[\"The minimum amount of time after a proposal passes before it can be executed.\"],\"+s9pmq\":[\"Basket scale for this unit of account. This is used to initially calculate how much of each token is required for minting.\"],\"+zy2Nq\":[\"Type\"],\"/4gGIX\":[\"Copy to clipboard\"],\"/7T5Z1\":[\"Register listed RTokens\"],\"/A3dHx\":[\"Input the guardian ethereum address\"],\"/DCw0h\":[\"Market cap:\"],\"/IX/7x\":[\"Other\"],\"/o1XvT\":[\"The creation of new RToken designs is permissionless. If you are the inventive type and have ideas for what assets should be in the basket, what a good governance looks like, or anything novel that could work within the realms of the protocol, please consider putting those ideas into practice or sharing them with the community.\"],\"/uk/m7\":[[\"0\"],\" APY\"],\"02uyLF\":[\"Backing\"],\"03lM+L\":[\"RToken Deployment Transaction succeeded\"],\"06o+4H\":[\"Token Details\"],\"0BKROZ\":[\"Execution Delay\"],\"0DN8vr\":[\"Backing buffer (%)\"],\"0R4s65\":[\"Underlying Token\"],\"0Rrfh3\":[\"Input token name\"],\"0U/Tk/\":[\"Issuance throttle Rate\"],\"0gv+T2\":[\"X\"],\"0hSka2\":[\"DeFi protocols oftentimes have incentives for liquidity that are paid in their token or a combination of tokens. By providing liquidity for trading or lending or other activities on these protocols, you can earn rewards that are sometimes quite high! Note that there are always risks (smart contract risks, impermanent loss risks, etc), in providing liquidity on these protocols so please make sure you understand things before blindly diving in.\"],\"0n6GRN\":[\"Input proposal title\"],\"18of6T\":[\"Propose how the basket should be distributed going forward. \"],\"1Go5ao\":[\"Register Assets\"],\"1KBao4\":[\"Compare RTokens\"],\"1LAqfa\":[\"- Redeem \",[\"0\"]],\"1QfxQT\":[\"Dismiss\"],\"1RKej3\":[\"Token details\"],\"1Rd7wm\":[\"Votes against\"],\"1VYWc5\":[\"Controls changes to the basket of an Index DTF\"],\"1ex6fX\":[\"Reserve aims to help people around the world maintain their spending power by allowing anyone to create asset-backed currencies with tokenized assets on the Ethereum blockchain in customizable and novel ways.\"],\"1jYZaW\":[\"Furnace\"],\"1pynDW\":[\"RToken holders\"],\"2+Ty+2\":[\"Spell 2\"],\"2VoM3e\":[\"Delegated to self\"],\"2qh1i8\":[\"Trading delay\"],\"2xwMgJ\":[\"DTFs live on blockchain networks including Ethereum, Base, Binance Smart Chain, enabling worldwide transactions within seconds. Each DTF is 100% backed by other assets on the same blockchain. Users can redeem their DTF tokens for the underlying backing assets at any time without anyone else’s involvement.\"],\"2yBN46\":[\"Advanced config:\"],\"31T9Uy\":[\"Choose Redemption Basket\"],\"3Ig3IE\":[\"Trigger melt\"],\"3Imb0U\":[\"Receiving eth address\"],\"3TepwF\":[\"Discover DTFs\"],\"3caoaJ\":[\"The Reserve Protocol makes a few different types of trades\"],\"3ebyPI\":[\"Please don't close this window to avoid issues finding your way back here.\"],\"3hfWcC\":[\"When you stake your RSR, you will receive a stRSR receipt token which represents your ownership in the staked RSR contract. As revenue is distributed, the receipt token will be redeemable for an increasing amount of RSR. If there is a default scenario where the staked RSR is slashed, then the receipt token will be redeemable for a decreased amount of RSR.\"],\"3sRog+\":[\"Proposed\"],\"4JU3Dr\":[\"Voting on the RToken you are staked on requires you to delegate your vote to yourself or another Eth address.\"],\"4T0Zfr\":[\"Stake pool\"],\"4ZzlJd\":[\"Casting 3.4.0 upgrade spell\"],\"4kl1Q6\":[[\"fromToken\"],\" amount\"],\"4sRQtL\":[\"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.\"],\"4t/yW7\":[\"Ended at\"],\"4wyw8H\":[\"Transactions\"],\"51OY3J\":[\"Executable code\"],\"52SO2+\":[\"Collateral token\"],\"54w0Yi\":[\"Understand the project and protocols\"],\"59Dk0F\":[\"RSR available to withdraw\"],\"5EuWoG\":[\"RToken Trader\"],\"5IrCQY\":[\"Mint\"],\"5YPwIl\":[\"RSR Stakers\"],\"5dJK4M\":[\"Roles\"],\"5dVVsn\":[\"Dutch Auction length (s)\"],\"6/dCYd\":[\"Overview\"],\"6FHCpe\":[\"Est. APY\"],\"6QtlTh\":[\"Minting Fee\"],\"6RDwJM\":[\"Tokens\"],\"6YtxFj\":[\"Name\"],\"6bxci/\":[\"Voting power\"],\"6cDDmZ\":[\"Input ticker\"],\"6fx8ZN\":[\"No ended auctions\"],\"6g1gi0\":[\"Proposals\"],\"6lKE6C\":[\"Wallet staked RSR + RToken Value\"],\"73QZmA\":[\"Approve in wallet\"],\"7ALdX9\":[\"Revenue Distribution\"],\"7B7o9d\":[\"Fixed Platform Share\"],\"7C9ebc\":[\"Distributed revenue does not add up to 100%\"],\"7R+Rtn\":[\"RToken Details\"],\"7YOBWU\":[\"The minimum percentage of stRSR voter participation (either For or Abstain) on a proposal before it can be passed.\"],\"7fqtid\":[\"Fees & Revenue Distribution\"],\"7isgZi\":[\"Wrap/Unwrap Tokens\"],\"7rqC5h\":[\"Backing + Staked\"],\"7vOU8z\":[\"Reserve Docs\"],\"81aX0K\":[\"Settleable auctions\"],\"88kg0+\":[\"Created At\"],\"88o7M6\":[\"Signing Tx 2\"],\"89oleM\":[\"Peg:\"],\"8DIDYI\":[\"Bought\"],\"8Ps70y\":[\"Symbol\"],\"8TaAKn\":[\"Voting Addresses\"],\"8UH/HA\":[[\"unit\"],\" Token distribution\"],\"8qwuC/\":[\"Simulation successful ✓\"],\"8tjQCz\":[\"Explore\"],\"8uEgwp\":[\"Quorum (%)\"],\"8wGbsh\":[\"Maximum trade for RToken\"],\"8y1g5b\":[\"This App\"],\"8znDHf\":[\"You will be the temporary owner until governance is deployed in transaction 2.\"],\"9+KWSx\":[\"Worst price\"],\"98fSbL\":[\"Made your own collateral?\"],\"9B4C/p\":[\"Reserve Bridge\"],\"9DGbad\":[\"Frozen\"],\"9FqwqX\":[\"Period in seconds\"],\"9L7NSU\":[\"Immediate\"],\"9OBKm7\":[\"Quorum\"],\"9OU4oG\":[\"% Acceptable\"],\"9Pk/+F\":[\"Full exposure view\"],\"9aZHfH\":[\"Back to settings\"],\"9cNlqf\":[\"Simulate proposal\"],\"A+8PId\":[\"Please keep in mind that interactions with the Ethereum or Base blockchains are pseudonymous and publicly available.\"],\"A+I9lo\":[\"Vote Supply\"],\"A1BKet\":[[\"0\"],\" Description\"],\"A1taO8\":[\"Search\"],\"ADH2UX\":[\"Current status:\"],\"AGXrI9\":[\"Vote on-chain\"],\"AXu7J/\":[\"Invalid destination address\"],\"Al7fdr\":[\"Tx Type\"],\"Aw88aM\":[\"Estimated gas cost:\"],\"B+Ho2y\":[\"Unstake Cancelled\"],\"B6FtWk\":[\"Change primary basket\"],\"B8AaMI\":[\"This field is required\"],\"BJMyhE\":[\"If a DTF is listed on this app, it doesn't mean that ABC Labs endorses the safety or risk levels of the DTF or that ABC Labs was involved in the creation of or is in anyway responsible for the DTF.\"],\"BecCbK\":[\"Settle all\"],\"Bkd1RD\":[\"+ Mint \",[\"0\"]],\"BlQdFK\":[\"Transaction reverted\"],\"BmvM5L\":[\"Long freeze duration (s)\"],\"BuQhD6\":[\"% to external address\"],\"BxWKeM\":[\"Melt\"],\"C2n1bi\":[\"Unpausing\"],\"C5TXiE\":[\"Withdrawal leak\"],\"CKp2aP\":[\"Invalid (\",[\"targetUnit\"],\") basket scale\"],\"CPVP0+\":[\"Proposal Threshold (%)\"],\"CZUigm\":[\"Batch Auction length - defines how long Gnosis EasyAuction auctions should be. Gnosis EasyAuction is a platform enabling fair price discovery for tokens through the use of batch auctions.\"],\"Cd3fOR\":[\"Transaction 1\"],\"CjHP6C\":[\"Transaction confirmed\"],\"CobcOM\":[\"Diversity factor\"],\"CpEYLQ\":[\"Proceed in wallet\"],\"CtByM7\":[\"Connect Wallet\"],\"CtG7o7\":[\"Your RTokens\"],\"CwyiJ4\":[\"A Brief DTF Introduction\"],\"CyZadL\":[\"View in explorer\"],\"D16asK\":[\"Main\"],\"D7h0du\":[\"Max trade slippage (%)\"],\"D9+vIc\":[\"Tx Hash\"],\"DATVA/\":[\"Reward ratio (decimals)\"],\"DF3kaf\":[\"Underlying Token Exposure\"],\"DLNgVH\":[\"Issue\"],\"DNiYLX\":[\"Begin redemption of \",[\"0\"],\" \",[\"1\"]],\"DiXm3I\":[\"The diversity factor determines the amount of emergency collateral that will be deployed to the RToken basket in the case of a default.\"],\"Du6bPw\":[\"Address\"],\"Dx9h/1\":[\"Please carefully evaluate the RToken before choosing to stake your RSR here. If any of the various collaterals of this RToken default, then the staked RSR will be the first funds that get auctioned off to make up the difference for RToken holders.\"],\"E4jeW1\":[\"User Tracking\"],\"EAGRJL\":[\"Some collateral tokens from protocols like Aave and Convex differ technically from other collateral tokens. To ensure proper handling, they must be wrapped in a contract for effective monitoring. Once wrapped, the collateral remains the same but has a new interface for price and appreciation tracking.\"],\"EDIx1I\":[\"Distribute Fees\"],\"EIcaiW\":[\"Backing config\"],\"EJGWha\":[\"The Reserve Project\"],\"ELDnYW\":[\"When staking RSR, you are putting your RSR at risk in the case of a collateral default in exchange for 1) the rights to govern the RToken and 2) for a portion of the revenue generated by the collateral. The revenue sent to the staked RSR pool will be distributed amongst RSR stakers proportionally to their stake in the pool.\"],\"EQvnVc\":[\"Revenue distribution\"],\"ETZEWb\":[\"The fraction of RSR stake that should be permitted to withdraw without a refresh. When cumulative withdrawals (or a single withdrawal) exceed this fraction, gas must be paid to refresh all assets.\"],\"EU/w8s\":[\"Queue proposal\"],\"EdQY6l\":[\"None\"],\"ElVQVf\":[\"Simulate Proposal\"],\"En3lQ+\":[\"RToken Maximum trade volume\"],\"Eo6Lg5\":[\"No plugins available\"],\"Eq4P3S\":[\"Confirm delegate\"],\"ExN9Hw\":[\"Shared with RSR Stakers\"],\"ExzCxg\":[\"Transaction submitted\"],\"Ezc+mS\":[\"Vote weight\"],\"F18WP3\":[\"Parameters\"],\"F3bW6y\":[\"Platform\"],\"FAeo39\":[\"Ticker - symbol eg. USD+\"],\"FEt55g\":[\"Estimated gas cost\"],\"FGOUAP\":[[\"0\"],\" of \",[\"1\"]],\"FHKsZF\":[\"TVL\"],\"FNKsXU\":[\"Contract Addresses\"],\"FXFgMV\":[\"Stake pool USD value:\"],\"FYZr+9\":[\"Tutorial video\"],\"FZPbrN\":[\"Registration of an asset plugin enables the RToken to price an underlying ERC20 token. Where an asset plugin for the underlying token already exists, the existing asset plugin is replaced with the new one.\"],\"Fn9TcI\":[\"Quorum?:\"],\"G3RyLw\":[\"Total % to arbitrary address\"],\"G5W/UB\":[\"ABC Labs uses industry standard anonymized analytics tools to understand usage and improve the user experience. ABC Labs does not collect any information about users or their financial activity.\"],\"GE3hR8\":[\"Not ready to set up governance?\"],\"GFvPy6\":[\"Against\"],\"GO6A9W\":[\"Deploy RToken\"],\"GYgvDh\":[\"If your token is paused and you have the correct role, you can unpause it here.\"],\"GhJQm9\":[\"Missing collateral\"],\"GirW3J\":[\"Choose between our Alexios Governor and anything between one-person rule to arbitrary DAO structure under your defined Ethereum address.\"],\"GycO8a\":[\"Primary basket not defined\"],\"H3cnhC\":[\"Propose changes to $\",[\"0\"]],\"H6nEG8\":[\"Stake + Unstake\"],\"H7qwjR\":[\"Staking token\"],\"HCswgj\":[\"Minimum trade volume ($)\"],\"HEcCC4\":[\"Unwrap collaterals\"],\"HG4SWx\":[\"Basket\"],\"HKPYsc\":[\"Redemption throttle Rate\"],\"HPq6Cr\":[\"Annualized TVL Fee\"],\"HQc4VD\":[\"Make proposed changes to the backing basket, emergency collateral, governance params, etc. Changes in multiple areas can be batched into a single proposal although to make voting on issues simpler it may make sense to separate things if unrelated.\"],\"Hp1l6f\":[\"Current\"],\"I3M3ju\":[\"Input RSR stakers revenue distribution\"],\"I6NohP\":[\"Platform exposure\"],\"I7CwKt\":[\"Not frozen\"],\"IGqrgX\":[\"Voting Delay\"],\"IICqKY\":[\"Change backup basket\"],\"IZwgAK\":[\"Please sign the transaction in your wallet to continue with the government configuration process.\"],\"IhmalY\":[\"Diversity Factor\"],\"IwXX9d\":[\"Minimum trade volume\"],\"J/hVSQ\":[[\"0\"]],\"J2tM5d\":[\"Pending, sign in wallet\"],\"J5TfTH\":[\"Upgrade contracts\"],\"J8Bkl9\":[\"Turn on Zaps to mint using 1 asset\"],\"JJ/1wI\":[\"Exit Deployer\"],\"JVkoZo\":[\"Governor Address\"],\"JWf8LL\":[\"Minimum trade volume - minimum sized trade that can be performed, in terms of the unit of account eg. USD.\"],\"JYKRJS\":[\"Stake\"],\"Jd7EeB\":[\"Redemption rate - allows the issuer to limit the amount of RTokens redeemed per hour based on a percentage of the current RToken market cap. This matters in the event of an exploit where an attacker tries to redeem RTokens. This buys time for users with pause or freeze permissions to reduce the amount of RTokens that can be redeemed.\"],\"JxdCy/\":[\"RSR Staked\"],\"K1iv1D\":[\"RToken will be ready to use after this TX if you choose to unpause.\"],\"K29LLi\":[\"Select proposal type\"],\"KBIO6h\":[\"Balance: \"],\"KDqZm9\":[\"Redemption throttle rate (%)\"],\"KRwsdB\":[\"Stakers APY\"],\"KZ1u6+\":[\"Total Market Cap\"],\"KaOUA4\":[\"Mint \",[\"0\"]],\"Kjox/d\":[\"Invalid asset\"],\"Kow4Yn\":[\"Max trade slippage\"],\"KqojOL\":[\"Next steps\"],\"Kw1+qc\":[\"Invalid address\"],\"Kxg5/E\":[\"Ended auctions\"],\"L2MqsA\":[\"Mint + Redeem\"],\"LDJIpn\":[\"Voting Quorum\"],\"LG54As\":[\"Auctionable revenue\"],\"LIRGo4\":[\"Vote-Lock DAO Token\"],\"LK9M3g\":[\"Ticker\"],\"LhMjLm\":[\"Time\"],\"LkMovi\":[\"Yield DTFs (created on the Reserve Yield Protocol) feature built-in overcollateralization — a defense mechanism that helps protect stability if any backing assets default.\"],\"LoH4s+\":[\"Minimum trade size\"],\"LtI9AS\":[\"Owner\"],\"LvyY/V\":[\"RTokens in this list is not an endorsement or audited by us. It's simply RTokens that have gone through our listing process and don't seem like clear scams.\"],\"M4YZCC\":[\"Governor mandate\"],\"MM0Byw\":[\"Trader contract for batch trades.\"],\"MYod0t\":[\"Display only \",[\"0\"],\" related collaterals\"],\"MbL4eP\":[\"Tx 1\"],\"MhhoeD\":[\"You can leave your RToken paused and come back to setting up governance later.\"],\"MqA4qt\":[\"Portfolio\"],\"MqIowX\":[\"Wrap/Unwrap collateral\"],\"MqLjTu\":[\"% Revenue to RToken Holders\"],\"MrVW7f\":[\"Dutch auction length\"],\"MrnlGV\":[\"Redemption throttle rate\"],\"MwW2jd\":[\"Unstaking delay - number of seconds that all RSR unstaking must be delayed in order to account for stakers trying to frontrun defaults and needs to be longer than \\\"governance\\\" for proper incentives for basket changes.\"],\"N5kBDi\":[\"Invalid ethereum address\"],\"Ng/SkH\":[\"Above minimum trade volume\"],\"NgIppW\":[\"Input plugin address (not ERC-20 address)\"],\"Nll23d\":[\"Unregister Assets\"],\"NmI7Ll\":[\"Governor address\"],\"NpjEcw\":[\"Verifying allowance...\"],\"Nu4oKW\":[\"Description\"],\"O6Z3uT\":[\"Target:\"],\"OAfk3i\":[\"Hash\"],\"OC3bUY\":[\"Change distribution\"],\"OCI+DI\":[\"DTF Explorer\"],\"OFjZGo\":[\"Unstake\"],\"OJx3wK\":[\"Not available\"],\"OPVsCp\":[\"Input quorum percent\"],\"OR475H\":[\"Network\"],\"OinOun\":[\"Stake RSR\"],\"Opgzh2\":[\"What is Reserve Governor Alexios?\"],\"OsyKSt\":[\"Withdraw\"],\"OyCrBF\":[\"No holders for this role...\"],\"P+769u\":[\"You receive:\"],\"P+Quwn\":[\"Propose new basket\"],\"P/M2Id\":[\"Long freeze duration - freeze an RToken's system for a longer period of time. A long-freezer has 6 charges before losing the ability to freeze any more\"],\"P5dyHY\":[\"Tx2. Governance\"],\"PBjWTe\":[\"DeFi yield opportunities for DTFs in Aerodrome, Convex, Beefy, Yearn & Others\"],\"PBnztC\":[\"Begin governance setup\"],\"PByO0X\":[\"Votes\"],\"PILCOO\":[\"Withdraw RSR\"],\"PKItzG\":[\"Extra collateral to keep\"],\"PU/y6X\":[\"Empty backup basket\"],\"PWBWkh\":[\"ABC Labs requires additional information beyond what is available on the blockchain to give users relevant data to make informed decisions. As a user, please evaluate any new DTF carefully before holding, staking RSR, or vote locking tokens on them.\"],\"PZZf4D\":[\"Confirm & Submit\"],\"Pci103\":[\"Registering assets\"],\"PgOApQ\":[\"You'll receive:\"],\"PkquuC\":[\"Join the conversation or ask questions\"],\"PlJdlY\":[\"Mechanics\"],\"PmRw7M\":[\"Deploy your own RToken\"],\"PnFsqo\":[\"RTokens are 100% backed by a diversified set of underlying collateral tokens...\"],\"PzZvqB\":[\"View All, including unlisted\"],\"Q/sl1D\":[\"Max trade slippage — maximum deviation from oracle prices that any trade can clear at. Why this matters? Acts as a form of slippage protection.\"],\"Q0xGVH\":[\"Freeze State\"],\"Q8+uwY\":[\"Please complete the required governance configuration to complete deployment.\"],\"Q8mMek\":[\"Claim rewards across all traders\"],\"QGN0A9\":[\" auctioned\"],\"QIuujP\":[\"Earn\"],\"QKskSe\":[\"Preparing transaction\"],\"QLUkRN\":[\"Reserve Blog\"],\"QQ2SBx\":[\"Decimals\"],\"QWtJhD\":[\"Invalid minimum range \"],\"QpGF0U\":[\"Delay (in number of \",[\"0\"],\") since the proposal starts until voting ends.\"],\"QqcMwa\":[\"The pauser(s) can put the RToken in two states which can be either true or false (no set duration):\"],\"QtNpcx\":[\"Duration in seconds\"],\"QwwYl1\":[\"Execute proposal\"],\"R6xgEU\":[\"Your staked RSR\"],\"RLDSN8\":[\"Each target unit of your primary basket will have defined emergency collateral to replace with in case of default.\"],\"RVG9Xc\":[\"Controls settings of the vlDAO including vote lock duration and approving revenue tokens\"],\"RW+4/D\":[\"Configure your vote\"],\"RrkUqq\":[\"Trader implementations\"],\"RwBJxn\":[[\"0\"],\" auctions\"],\"SHPE7u\":[\"Asset Registry\"],\"SIHhwZ\":[\"Input the owner ethereum address\"],\"SKZhW9\":[\"Token name\"],\"SOJxcI\":[\"Reward ratio - amount of the current reward amount that should be handed out in a single block. The default corresponds to a half life of approximately 15 days.\"],\"SUkrBJ\":[\"Input delay\"],\"SViOvb\":[\"View on\"],\"SkmQRZ\":[\"% Revenue share\"],\"Sku3Zy\":[\"Governance forum\"],\"SnVnD8\":[\"Provide liquidity across DeFi & earn more with your DTFs\"],\"Sw7Gww\":[\"A good explainer for how Gnosis auctions work can be found\"],\"SxMxM9\":[\"Unstaking delay:\"],\"TP9/K5\":[\"Token\"],\"TiC6Xh\":[\"Mkt Cap\"],\"TibSbv\":[\"Voting power delegation\"],\"TjramT\":[\"Invalid collateral\"],\"TnNnVh\":[\"Shared with RToken Holders\"],\"Tt0Nb4\":[\"Trigger an Auction\"],\"TvY/XA\":[\"Documentation\"],\"U/iNrh\":[\"Input withdrawal leak %\"],\"U6AQ7u\":[\"Anyone can click the button above to check and trigger an auction for any revenue that has accrued or for rebalances that need to happen. Please note that for RTokens with many collateral types in the basket, this may be an expensive transaction to execute.\"],\"U7USFW\":[\"Batch Auction length (s)\"],\"U9ks0t\":[\"Issuance throttle rate (%)\"],\"UJrReY\":[\"Est. Staking APY\"],\"UW873z\":[\"Watch an intro to RTokens\"],\"UaUjkN\":[\"Revenue split\"],\"UhF/tF\":[\"Record limit\"],\"Ui1tti\":[\"Delegate votes\"],\"UjFzc9\":[\"Other parameters\"],\"UpgRb2\":[\"Define what portion of the revenue goes to the RToken holders versus RSR stakers. It can also be configured to send a portion of the revenue of an RToken to any arbitrary Ethereum address (wallet or smart contract).<0/><1/>\"],\"UsxK+A\":[\"No assets to unregister...\"],\"V+Usr0\":[\"Controls fees, voting parameters, and anything other than basket changes for an Index DTF\"],\"V03foK\":[\"Trader contract for Dutch trades.\"],\"V0H90D\":[\"Guardian address\"],\"V302gs\":[\"The dutch auction length is how many seconds long falling-price dutch auctions should be. A longer period will result in less slippage due to better price granularity, and a shorter period will result in more slippage.\"],\"VCG/e6\":[\"Redeem\"],\"VG9opj\":[\"Unstake RSR\"],\"VHVdS1\":[\"No votes\"],\"VOpaFJ\":[\"Withdrawal leak (%)\"],\"VYQ8Iy\":[\"Add to basket\"],\"VcQdaO\":[\"Read more about revenue distribution\"],\"VrBAxX\":[\"Deployer Share\"],\"W2Q1/M\":[\"Backing Parameters\"],\"W2iax5\":[\"Networks\"],\"W5JlJM\":[\"No actionable revenue available\"],\"W5kTFy\":[\"Voting\"],\"W8K/75\":[\"Role held by:\"],\"WEVa0d\":[\"Selling\"],\"WJQWuz\":[\"Create a new Yield DTF\"],\"WNrgVT\":[\"Governance format\"],\"WNtc8U\":[\"The amount of assets selected affects the gas price, this asset may not be worth claiming yet.\"],\"WXGS2i\":[\"Timelock Address\"],\"WY8amq\":[\"Invalid number\"],\"WZK33i\":[\"Input wallet\"],\"Wg0Nr2\":[\"Trader contract address\"],\"WsVNsQ\":[\"Please read more about how Register manage tokens on our repository\"],\"X0neaw\":[\"Trading delay (s)\"],\"X1mZKh\":[\"Owner Address\"],\"XC3Dby\":[\"Upgrade contract implementations to a newer version. This is usually performed for a protocol update or bugfix.\"],\"XCLYYd\":[\"Token exposure\"],\"XD7cKh\":[\"Get an overview of everything going on\"],\"XOJDc9\":[\"All time\"],\"XU7Jfb\":[\"A year ago\"],\"XUds+a\":[\"Long freeze duration\"],\"XWoKr0\":[\"Emergency Collateral\"],\"XXCmTE\":[\"Mint amount\"],\"XXw3LT\":[\"Confirm changes made\"],\"XaBNjY\":[\"Non-Basket Governance\"],\"XbvxUa\":[\"Delegate\"],\"XelGWQ\":[\"Timelock address\"],\"XkKUrt\":[\"Backing buffer - percentage value that describes how much additional collateral tokens to keep in the BackingManager before forwarding tokens to the RevenueTraders. The RevenueTraders here refers to the RToken and RSR traders. Why this matters? It allows collateral tokens to be periodically converted into the RToken, which is a more efficient form of revenue production than trading each individual collateral for the desired RToken. It also provides a buffer to prevent RSR seizure after trading slippage. For more info on the BackingManager and Trader types see the \\\"Revenue distribution to RToken holders\\\" and \\\"Summary of revenue distribution\\\" in our documentation.\"],\"XmfFIm\":[\"The minimum percentage of stRSR ownership on an RToken to be able to create a proposal.\"],\"XsOPg3\":[\"File issues or upvote existing ones\"],\"XsPuIt\":[\"Distributor\"],\"Xtj6BR\":[\"Issuance amount - allows the issuer to limit the amount of RTokens issued per hour. This matters in the event of an exploit where an attacker tries to issue more RTokens. This buys time for users with pause or freeze permissions to reduce the amount of RTokens that can be issued.\"],\"XvmLhx\":[\"stRSR payout fraction 0.0\"],\"Y0kXxR\":[\"Required setup:\"],\"YEpmZo\":[\"Deploying through this UI doesn't require deep technical knowledge as long as you don't need novel collateral plugins for your baskets. However, we encourage you to talk to someone proficient in the protocol and read the docs to learn more before confirming any transactions.\"],\"YHpbe1\":[\"For\"],\"YKsN3Z\":[\"Verifying transaction...\"],\"YPqf0p\":[\"You use:\"],\"YR54Ai\":[\"Warmup period (s)\"],\"YSG6CZ\":[\"Transfer DTFs across chains\"],\"YSajVI\":[\"Delay in seconds\"],\"Yh49N4\":[\"Proposal Threshold\"],\"YiF3/Q\":[\"Cast Spell 1\"],\"YirHq7\":[\"Feedback\"],\"YjzAfU\":[\"Melting\"],\"Yp52FQ\":[\"Stay up to date in long form\"],\"Ypb3g5\":[\"Trigger Unstake\"],\"YwD4dh\":[\"Cast Spell 2\"],\"Z0UMy9\":[\"Featured RTokens\"],\"Z1twd3\":[\"Delegated to: \"],\"Z22ZHd\":[\"Related Contracts\"],\"Z2UK1U\":[\"Ongoing dutch auctions\"],\"Z3FXyt\":[\"Loading...\"],\"ZC1jjY\":[\"Short freeze duration (s)\"],\"ZDmC6j\":[\"Available collateral\"],\"ZJhuy5\":[\"Emergency basket\"],\"ZRBNIp\":[\"Begin minting \",[\"0\"],\" \",[\"1\"]],\"ZTu0WX\":[\"The top level decision maker, typically a decentralized governance smart contract, responsible for setting or updating all RToken parameter values, RToken baskets, etc. - The RToken OWNER has the power to:\\n grant and revoke roles to any Ethereum account\\n pause and unpause the system\\n freeze and unfreeze the system\\n set governance parameters\\n upgrade system contracts\"],\"Zb7zns\":[\"Risk evaluation\"],\"Ze3la6\":[\"Input token holders revenue distribution\"],\"Zllgcd\":[\"Register Listing\"],\"a3Cnqz\":[\"Auction Launcher\"],\"a3U7In\":[\"Invalid (\",[\"targetUnit\"],\") backup diversity factor\"],\"a7u1N9\":[\"Price\"],\"a8IIG5\":[\"Backup basket\"],\"aFfRAV\":[\"Delegate voting power for future votes\"],\"aMQVfT\":[\"Unstaking Delay (s)\"],\"aSt5Rp\":[\"Please sign the transaction in your wallet to continue with the governance process.\"],\"alx8ZZ\":[\"RToken will be fully functional\"],\"aqHaEK\":[\"Propose new backup configuration\"],\"b0tqCW\":[\"Back to Governance\"],\"b4vxFC\":[\"Long Freeze\"],\"b6D1xw\":[\"% Revenue to RSR Stakers\"],\"bKXjUF\":[\"Mandate\"],\"bOmHmD\":[\"Votes for\"],\"bSZuP8\":[\"New primary basket\"],\"bWMGJN\":[\"Go to the RToken Deployer\"],\"bZZ1DH\":[\"Proposed by\"],\"bkcUbj\":[\"New backup configuration\"],\"bmmEBC\":[\"Current holder\"],\"bqervZ\":[\"Token ticker is required\"],\"bsalqT\":[\"RToken Address\"],\"bsxAWr\":[\"RToken mandate\"],\"bwSQI0\":[\"Supply\"],\"bwdIqT\":[\"Community Discord\"],\"bzSI52\":[\"Discard\"],\"c23a1k\":[\"Backing Manager\"],\"c8OQUt\":[\"Explore yield opportunities for \",[\"0\"]],\"cBgRZm\":[\"Est. APY:\"],\"cBsi4+\":[\"Total initial RToken scale including all targets. If your RToken only has one target unit this will be the same as the basket scale input.\"],\"cQe/XW\":[\"Your stake position\"],\"cg7wLy\":[\"Inspect collateral backing, mint, stake, redeem & explore additional earn opportunities across DeFi\"],\"cs1EEG\":[\"Deploy transaction submitted\"],\"cyJYDE\":[\"Governance Share\"],\"d+U+9W\":[\"Shared externally\"],\"d/VrnV\":[\"Input voting period\"],\"dA1zfj\":[\"Required:\"],\"dA8fzb\":[\"Participate & Earn\"],\"dE6BLF\":[\"Governance\"],\"dEgA5A\":[\"Cancel\"],\"dH1S+k\":[\"Staked RSR Overcollateralisation\"],\"dNQZNq\":[\"RSR Trader\"],\"dScyNc\":[\"Issuance throttle amount\"],\"dUcbZZ\":[\"Token name required\"],\"dViFQP\":[\"Mandate is required\"],\"dfIw2n\":[\"USD Value\"],\"drp73Y\":[\"Default delay\"],\"e/6RX4\":[\"Whether you’re an economist looking to improve the fiat standard, a DeFi entrepreneur seeking to fill a gap in the market, or simply an innovator with a wild idea, Reserve makes it easy to launch your own asset-backed index.\"],\"e0NrBM\":[\"Project\"],\"e2+lHb\":[\"mth\"],\"eE0JZ4\":[\"Version\"],\"eFTnE/\":[\"15 params\"],\"ePK91l\":[\"Edit\"],\"eWxpbp\":[\"Ongoing auctions\"],\"ed2+9W\":[\"Other Risks\"],\"efXgiG\":[\"Top voting addresses\"],\"eg+wzu\":[\"Unstaking Delay\"],\"ehOkF+\":[\"Basics\"],\"eiVzdG\":[\"Please wait while the simulation executes\"],\"ejVYRQ\":[\"From\"],\"f8rob6\":[\"Staking RSR\"],\"fAfiCl\":[\"Mandate cannot be longer than 256 characters\"],\"fPOajI\":[\"Ends at\"],\"fPvOAk\":[\"Unregistering assets\"],\"fSh1F2\":[\"Basket warmup period\"],\"fSkQWU\":[\"Delegate to\"],\"fTK2tH\":[\"DAO Governance\"],\"fUl1Mc\":[\"Wait to trigger revenue auctions until after recollateralization has finished.\"],\"fZBHde\":[\"Yield DTF Creator\"],\"fn/6Aa\":[\"Ensure that the asset(s) you are unregistering do not have pending revenue that can be\"],\"fn1iqG\":[\"Volume (last 7d)\"],\"g1KZ8Y\":[\"Basket is not ready\"],\"g7BX9A\":[\"Input proposal threshold\"],\"gAVoMF\":[\"Empty Basket\"],\"gHuu3G\":[\"Reserve Discord\"],\"gdgoAB\":[\"Backing + Overcollaterization:\"],\"glKVIy\":[\"Input delay in hours\"],\"gqYTsB\":[\"The token supply is not enough for changing the primary basket safely, contact the Reserve team for recommendations.\"],\"gqu6u3\":[\"Check for auctions\"],\"hbeGqD\":[\"Regular minting \"],\"hehnjM\":[\"Amount\"],\"hom7qf\":[\"Claim\"],\"hrp5QR\":[\"Estimated basket APY\"],\"htTcVX\":[\"Status:\"],\"hyt0Ac\":[\"Delay in Seconds\"],\"i/oT62\":[\"Guardian\"],\"i2y1O5\":[\"Governance Details\"],\"i4xxYn\":[\"Proposals voted\"],\"i8BXee\":[\"Tx 2\"],\"i8EW0F\":[\"Input RFC link\"],\"iA99DC\":[\"Target(s)\"],\"iDr5Z5\":[\"Maximum trade volume - maximum sized trade for any trade involving RToken, in terms of the unit of account eg. USD.\"],\"iH8itU\":[\"Connect your wallet\"],\"iQ+Xt1\":[\"Roles & Controls\"],\"iSLIjg\":[\"Connect\"],\"iVav3e\":[\"Minimum trade in USD terms\"],\"iWCwan\":[\"Use a custom plugin contract address\"],\"iaxJrF\":[\"Total RSR staked\"],\"irOfE1\":[\"Minting requires a deposit of the defined collateral tokens in equal value amounts to the RToken smart contracts.\"],\"j3CapQ\":[\"Protocol Docs\"],\"j3sA7W\":[\"Recent proposals\"],\"jBJkMt\":[\"Other Parameters\"],\"jDkOvZ\":[\"There's two freezing roles that put the system in the same state for different durations:\"],\"jE3OmQ\":[\"Cancel proposal\"],\"jJdwCB\":[\"Revert\"],\"jQSzKJ\":[\"As RSR\"],\"jpctdh\":[\"View\"],\"k1ifdL\":[\"Processing...\"],\"k5+pKI\":[\"Unsupported\"],\"kEqOfQ\":[\"RFC\"],\"kFRSvP\":[\"Backup configuration tracks primary basket changes to update its values. This may not be desired on a proposal, you can choose to propose new changes.\"],\"kI1eQH\":[\"Mint - Global throttle\"],\"kg0lD1\":[\"Backing & Risk\"],\"kj3M8S\":[\"Deposit\"],\"kka8e4\":[\"Intro\"],\"koRR0F\":[\"Create New DTF\"],\"ktUGFg\":[\"Reward ratio\"],\"l8wHqt\":[\"Short freezers have the responsibility of freezing an RToken if anything dangerous or suspicious is happening. This is a one-shot freeze and the role will be revoked after a single use. This field determines how long the RToken will remain frozen until the freeze expires or is extended by another actor.\"],\"l9C7HU\":[\"Add to backup basket\"],\"lCJhs9\":[\"Transaction 2\"],\"lIBAz6\":[\"Pending auctions to settle\"],\"lPTKNn\":[\"Transaction signed!\"],\"lQXQKs\":[\"Vote\"],\"llDXYJ\":[\"Backups\"],\"lnV9JE\":[\"Unregister\"],\"lpTJF8\":[\"This address already holds this role\"],\"lsLMXZ\":[\"Start Issue\"],\"m+s/1w\":[\"No proposals created...\"],\"m01EHO\":[\"Discussions of ecosystem ideas\"],\"m16xKo\":[\"Add\"],\"mBdi4t\":[\"Basket Governance\"],\"maOPkj\":[\"Mintable now\"],\"mif1tC\":[\"Short Freeze\"],\"mkW9xD\":[\"Broker\"],\"mo0Ni5\":[\"Use the Alexios governor format?\"],\"muMr9+\":[\"Refresh quote\"],\"n+8yVN\":[\"Signature\"],\"n/7eJI\":[\"St Token Ticker\"],\"n5/QY4\":[\"Invalid maximum range\"],\"nBB/1g\":[\"Unknown amount of recollateralization auctions left to run\"],\"nDsw/H\":[\"stRSR Token\"],\"nU/QUI\":[\"Mint disabled\"],\"nU3mt/\":[\"Submit proposal on-chain\"],\"nUImH+\":[\"Voting Period\"],\"nd4lSI\":[\"Batch trade\"],\"ngS/8Z\":[\"Claim $\",[\"0\"]],\"njiDEz\":[[\"pauseLabel\"],\" not paused\"],\"nlmg5u\":[\"The warmup period is how many seconds should pass after the basket regained the SOUND status before an RToken can be issued and/or a trade can be opened.\"],\"nsUy30\":[\"Delegate voting power\"],\"o+XJ9D\":[\"Change\"],\"o6ImqE\":[\"You submit the transaction configuring your RToken design\"],\"oC5VUA\":[\"Snapshot Delay\"],\"oDQ5xF\":[\"Proposal execution delay (hours)\"],\"oHUnqt\":[\"Duration in Seconds\"],\"oKucDI\":[\"Please sign the transaction in your wallet to continue with the deployment process.\"],\"oMnqeW\":[\"RToken Maximum trade volume ($)\"],\"oMs/1/\":[\"Tx in process...\"],\"oS2F65\":[\"Buying\"],\"ogCHh3\":[\"Contract upgrades\"],\"olT/Wc\":[\"Governance gets deployed & your RToken is now usable (if unpaused)\"],\"ou6PkF\":[\"Pool\"],\"p2vqx1\":[\"No voters at this moment...\"],\"p5fpTr\":[\"Meditate peacefully on the stability of a future asset backed reserve currency while your RToken deploys 🧘‍♂️\"],\"p5nYkr\":[\"View All\"],\"pB3Yot\":[\"Collateral Plugins\"],\"pJ2Ng0\":[\"In Withdraw Process\"],\"pMn92J\":[\"Wrapping collateral tokens\"],\"pRLw2a\":[\"Details + Roles\"],\"pVgGbU\":[\"Change in:\"],\"pYpb1y\":[\"Governance parameters\"],\"pfKK+t\":[\"Spell 1\"],\"pfaRE0\":[\"Dutch trade\"],\"plhHQt\":[\"No data\"],\"ps586T\":[\"Underlying Platform Exposure\"],\"pwUZo2\":[\"Confirming...\"],\"pynxnf\":[\"Review stake\"],\"q0gCXD\":[\"Collateral distribution\"],\"q6lAbz\":[\"Staked\"],\"qFHaGG\":[\"Redeemable now\"],\"qS2FaE\":[\"Contracts\"],\"qSVeRc\":[\"Setup Governance\"],\"qaArC7\":[\"Below minimum trade volume\"],\"qdZImh\":[\"Governance roles\"],\"qeq9zz\":[[\"pauseLabel\"],\" paused\"],\"qg1O48\":[\"Only the guardian address or governance will be able to unpause\"],\"qvSTRH\":[\"Backing buffer\"],\"r+1aZf\":[\"Historical metrics\"],\"r/0iqc\":[\"Welcome to Reserve — a platform for creating, exploring, and interacting with Decentralized Token Folios (“DTFs”). A DTF is the generic name given to any onchain asset-backed index. DTFs can be created on Reserve’s Yield Protocol or Index Protocol permissionlessly, by any person or entity.\"],\"r9JRyA\":[\"Deployer\"],\"rCQOIX\":[\"Staking yield share ends\"],\"rEptSB\":[\"Change diversity factor\"],\"rP4PKZ\":[\"No emergency collateral for target\"],\"rQh1iF\":[\"Abstain\"],\"rbkFds\":[\"The configured network \\\"\",[\"currentChain\"],\"\\\" is different from the wallet selected network \\\"\",[\"chainId\"],\"\\\"\\\". Change your network in the connected wallet.\"],\"rcvQYl\":[\"Each type of trade can currently happen in only one way; the protocol launches a Gnosis EasyAuction. The Reserve Protocol is designed to make it easy to add other trading methods, but no other methods are currently supported.\"],\"rd4eHq\":[\"View on Etherscan\"],\"rf/1ro\":[\"Be aware that anyone can create an RToken that ends up on this list. We don't apply any standards beyond what can be done with the Reserve Protocol.\"],\"rhMQ3Z\":[\"Auctions\"],\"rmZvu8\":[\"Wrap collaterals\"],\"rpilX8\":[\"Final price in:\"],\"rqptfw\":[\"Initial RToken state after deployment\"],\"s9KGXU\":[\"Sold\"],\"s9TQT6\":[\"Still have questions? Come talk to us in the Reserve Discord server. We’d be happy to help! You can also\"],\"sDP9Ho\":[\"Pause status\"],\"sG20ZB\":[\"Brand Manager\"],\"sb9Y58\":[\"Wallet\"],\"sfFoij\":[\"Revenue share\"],\"sjs3Wq\":[\"This app is an open source project developed and maintained by ABC Labs to interact with the Reserve Protocol and various DTFs deployed with the protocol.\"],\"sk7H6q\":[\"Redeem \",[\"0\"]],\"snZOdR\":[\"Other config\"],\"srRMnJ\":[\"Customize\"],\"t/YqKh\":[\"Remove\"],\"t4r50E\":[\"Collateral(s)\"],\"t7AAh/\":[\"Unstaking RSR\"],\"tLSIFr\":[\"Stay patient while the transaction is in progress & don't close this window to avoid issues finding your way back here.\"],\"ta/cTS\":[\"Redemption throttle amount\"],\"tdllfV\":[\"ETH address\"],\"te2erb\":[\"This asset is already (being) registered\"],\"tfDRzk\":[\"Save\"],\"tjTLy7\":[\"Issuance throttle rate\"],\"u+VWhB\":[\"Copied to clipboard!\"],\"u3ZeYl\":[\"Transaction failed\"],\"uAQUqI\":[\"Status\"],\"uQt4Id\":[\"Trading delay - how many seconds should pass after the basket has been changed, before a rebalancing trade is opened. Why does this matter? To avoid losses due to poor liquidity.\"],\"uhqYEB\":[\"No emergency collateral for this target unit\"],\"ujpEaI\":[\"Please connect your wallet\"],\"v+QrKR\":[\"RToken in Wallet\"],\"v3O3qT\":[\"Token name - the name of the RToken eg. Savings Dollar\"],\"vDXkqt\":[\"Tx1. RToken Deploy\"],\"vFeILc\":[\"Primary Basket\"],\"vi7Gkt\":[\"Small revenue auctions\"],\"vq/idj\":[\"Redeem amount\"],\"w8xQRx\":[\"Invalid value\"],\"wENF7v\":[\"Signing Tx 1\"],\"wHW6eD\":[\"The guardian has the ability to reject proposals even if they pass. Should be assigned to a multisig or EOA that can be trusted to act as a backstop. It is acceptable if it is relatively slow to act. Only one guardian address should be defined.\"],\"wQ0QLx\":[\"Unfreeze\"],\"wTvlZg\":[\"Primary basket\"],\"wh9uml\":[\"Add new address\"],\"wjincn\":[\"Input token name or symbol\"],\"wmlz0b\":[\"Simulation unsuccessful ✘\"],\"wssdFG\":[\"Holders APY\"],\"ww1hmr\":[\"Short freeze duration\"],\"wzyEKJ\":[\"Tokens to match trade\"],\"x1Ujs3\":[\"Basket Handler\"],\"x59O98\":[\"3.4.0 Upgrade spells\"],\"x9GEpw\":[\"Issuance rate - allows the issuer to limit the amount of RTokens issued per hour based on a percentage of the current RToken market cap. This matters in the event of an exploit where an attacker tries to issue more RTokens. This buys time for users with pause or freeze permissions to reduce the amount of RTokens that can be issued.\"],\"xE0CMr\":[\"Surplus below minimum trade\"],\"xEIcwa\":[\"Invalid (\",[\"targetUnit\"],\") basket distribution\"],\"xEhonF\":[\"(in their Github repository)\"],\"xYxQCZ\":[[\"0\"],\" \",[\"1\"]],\"xc4rPs\":[\"No transactions\"],\"xcRNSV\":[\"Cancel Issue\"],\"xjFy3M\":[\"Add to primary basket\"],\"xjhtsV\":[\"Chain\"],\"xkAsLE\":[\"Owner address\"],\"xmPyUn\":[\"Redemption amount - allows the issuer to limit the amount of RTokens redeemed per hour. This matters in the event of an exploit where an attacker tries to redeem RTokens.This buys time for users with pause or freeze permissions to reduce the amount of RTokens that can be redeemed.\"],\"xouc5P\":[\"Cancel unstake\"],\"xr5Ynp\":[\"When you unstake your stRSR, there will be a delay (defined by governance). This is to eliminate game theory scenarios that would make the backstop RSR staked pool less effective because people would continually be incentivized to unstake and restake.\"],\"xrBkuC\":[\"As RToken\"],\"y2L2W5\":[\"Claimable emissions\"],\"y8908V\":[\"Validating...\"],\"yGeylI\":[\"This is the target collateral basket at the onset of an RToken that defines which collateral needs to be deposited for issuances. The prime basket is directly set by governance, and only changes through successful governance proposals.\"],\"yIRfV3\":[\"Including off-chain in-app transactions of RToken in the Reserve App.\"],\"yJo4PI\":[\"Create a new overcollateralized Yield DTF\"],\"yUHPo3\":[\"Please select an asset to claim\"],\"ymns7Z\":[\"RToken will be left in pause state\"],\"ypPAJ2\":[\"Proposal Title\"],\"ypVIwM\":[\"Alexios is standard token-voting adopted from Compound Governor Bravo, with adjustments accounting for RSR being staked across multiple RTokens.\"],\"yuBO6n\":[\"Staked RSR\"],\"z77j59\":[\"Confirm & prepare proposal\"],\"z7p6LJ\":[\"Redeem - Global throttle\"],\"z95yhS\":[\"Reserve Protocol Smart-Contract Risk\"],\"zPGNJm\":[\"Transfer\"],\"zXlSi4\":[\"Collateral Exposure\"],\"zoFqVH\":[\"Deploy Governance\"],\"zsUWkY\":[\"Reserve Forum\"]}")}; \ No newline at end of file diff --git a/src/locales/en.po b/src/locales/en.po index 4a3df5689..b3588aa60 100644 --- a/src/locales/en.po +++ b/src/locales/en.po @@ -13,56 +13,70 @@ msgstr "" "Language-Team: \n" "Plural-Forms: \n" +#: src/views/yield-dtf/governance/views/proposal/components/UnregisterProposal.tsx:54 +msgid " auctioned" +msgstr "" + +#. placeholder {0}: rToken?.symbol ?? '' #: src/views/yield-dtf/issuance/components/redeem/index.tsx:37 msgid "- Redeem {0}" msgstr "" -#: src/views/yield-dtf/auctions/components/About.tsx:75 +#: src/views/yield-dtf/auctions/components/About.tsx:65 msgid "(in their Github repository)" msgstr "" -#: src/views/yield-dtf/deploy/components/TokenParameters.tsx:53 -#: src/views/yield-dtf/overview/components/hero/OverviewActions.tsx:136 +#. placeholder {0}: !!holders ? `Mint ${formatCurrency(holders, 1)}% Est. APY` : 'Mint' +#. placeholder {0}: CHAIN_TAGS[chainId] +#: src/views/yield-dtf/deploy/components/TokenParameters.tsx:42 +#: src/views/yield-dtf/overview/components/hero/overview-actions.tsx:123 msgid "{0}" msgstr "" -#: src/views/yield-dtf/overview/components/charts/APYChart.tsx:281 +#. placeholder {0}: rToken?.symbol ?? '' +#. placeholder {1}: currentPrice === 'USD' ? 'Price' : 'Exchange Rate' +#: src/views/yield-dtf/overview/components/charts/price-chart.tsx:132 +msgid "{0} {1}" +msgstr "" + +#. placeholder {0}: rToken?.symbol ?? '' +#: src/views/yield-dtf/overview/components/charts/apy-chart.tsx:294 msgid "{0} APY" msgstr "" +#. placeholder {0}: settleable?.length ?? 0 #: src/views/yield-dtf/auctions/auctions-sidebar/SettleableAuctions.tsx:74 msgid "{0} auctions" msgstr "" -#: src/views/yield-dtf/overview/components/hero/TokenMandate.tsx:28 +#. placeholder {0}: expanded ? '-' : '+' +#: src/views/yield-dtf/overview/components/hero/token-mandate.tsx:25 msgid "{0} Description" msgstr "" +#. placeholder {0}: formatCurrency(revenueData?.pendingToMelt ?? 0) +#. placeholder {1}: rToken?.symbol ?? 'rToken' #: src/views/yield-dtf/auctions/auctions-sidebar/MeltingBox.tsx:42 msgid "{0} of {1}" msgstr "" -#: src/views/yield-dtf/overview/components/charts/PriceChart.tsx:120 -msgid "{0} Price" -msgstr "" - -#: src/views/yield-dtf/issuance/components/wrapping/CollateralItem.tsx:337 +#: src/views/yield-dtf/issuance/components/wrapping/CollateralItem.tsx:332 msgid "{fromToken} amount" msgstr "" -#: src/views/yield-dtf/settings/components/PauseManager.tsx:69 +#: src/views/yield-dtf/settings/components/pause-manager.tsx:66 msgid "{pauseLabel} not paused" msgstr "" -#: src/views/yield-dtf/settings/components/PauseManager.tsx:69 +#: src/views/yield-dtf/settings/components/pause-manager.tsx:66 msgid "{pauseLabel} paused" msgstr "" -#: src/components/rtoken-setup/basket/UnitBasket.tsx:96 +#: src/components/rtoken-setup/basket/UnitBasket.tsx:134 msgid "{unit} Token distribution" msgstr "" -#: src/components/rtoken-setup/token/BackingForm.tsx:97 +#: src/components/rtoken-setup/token/BackingForm.tsx:101 msgid "% Acceptable" msgstr "" @@ -70,133 +84,123 @@ msgstr "" msgid "% Revenue share" msgstr "" -#: src/components/rtoken-setup/token/RevenueSplit.tsx:117 +#: src/components/rtoken-setup/token/RevenueSplit.tsx:125 msgid "% Revenue to RSR Stakers" msgstr "" -#: src/components/rtoken-setup/token/RevenueSplit.tsx:108 +#: src/components/rtoken-setup/token/RevenueSplit.tsx:116 msgid "% Revenue to RToken Holders" msgstr "" -#: src/views/yield-dtf/settings/components/RevenueSplitInfo.tsx:40 +#: src/views/yield-dtf/settings/components/revenue-split-info.tsx:30 msgid "% to external address" msgstr "" -#: src/views/yield-dtf/issuance/components/issue/Issue.tsx:112 +#. placeholder {0}: rToken?.symbol ?? '' +#: src/views/yield-dtf/issuance/components/issue/Issue.tsx:116 msgid "+ Mint {0}" msgstr "" -#: src/components/rtoken-setup/token/TokenConfiguration.tsx:35 +#: src/components/rtoken-setup/token/TokenConfiguration.tsx:33 msgid "15 params" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/SpellUpgrade.tsx:44 +#: src/views/yield-dtf/governance/views/proposal/components/SpellUpgrade.tsx:45 msgid "3.4.0 Upgrade spells" msgstr "" -#: src/views/discover/components/yield/components/RegisterAbout.tsx:27 -msgid "A Brief RToken Introduction" +#: src/views/discover/components/yield/components/RegisterAbout.tsx:34 +msgid "A Brief DTF Introduction" msgstr "" -#: src/views/yield-dtf/auctions/components/About.tsx:67 +#: src/views/yield-dtf/auctions/components/About.tsx:56 msgid "A good explainer for how Gnosis auctions work can be found" msgstr "" -#: src/utils/index.ts:80 +#: src/utils/index.ts:127 msgid "A year ago" msgstr "" -#: src/views/discover/components/yield/components/RegisterAbout.tsx:131 -msgid "ABC Labs uses industry standard anonymized analytics tools to understand usage and improve the user experience. ABC Labs does not collect any information about users or their financial activity." +#: src/views/discover/components/yield/components/RegisterAbout.tsx:129 +msgid "ABC Labs requires additional information beyond what is available on the blockchain to give users relevant data to make informed decisions. As a user, please evaluate any new DTF carefully before holding, staking RSR, or vote locking tokens on them." msgstr "" -#: src/views/yield-dtf/auctions/components/About.tsx:10 -msgid "About" +#: src/views/discover/components/yield/components/RegisterAbout.tsx:142 +msgid "ABC Labs uses industry standard anonymized analytics tools to understand usage and improve the user experience. ABC Labs does not collect any information about users or their financial activity." msgstr "" #: src/views/yield-dtf/auctions/auctions-sidebar/Revenue.tsx:99 msgid "Above minimum trade volume" msgstr "" -#: src/views/yield-dtf/governance/views/proposal-detail/components/ProposalVotes.tsx:109 -#: src/views/yield-dtf/governance/views/proposal-detail/components/VoteModal.tsx:50 +#: src/views/index-dtf/governance/views/proposal/components/vote-modal.tsx:58 +#: src/views/yield-dtf/governance/views/proposal-detail/components/ProposalVotes.tsx:90 +#: src/views/yield-dtf/governance/views/proposal-detail/components/VoteModal.tsx:55 msgid "Abstain" msgstr "" -#: src/components/transactions/manager/TransactionHeader.tsx:25 -msgid "Account" -msgstr "" - -#: src/components/rtoken-setup/basket/CustomCollateral.tsx:143 -#: src/views/yield-dtf/governance/views/proposal/components/ItemPreview.tsx:43 -#: src/views/yield-dtf/governance/views/proposal/components/ListItemPreview.tsx:21 -#: src/views/yield-dtf/governance/views/proposal/components/ProposedRevenueSplitPreview.tsx:127 +#: src/components/rtoken-setup/basket/CustomCollateral.tsx:144 +#: src/views/yield-dtf/governance/views/proposal/components/ItemPreview.tsx:45 +#: src/views/yield-dtf/governance/views/proposal/components/ListItemPreview.tsx:22 +#: src/views/yield-dtf/governance/views/proposal/components/ProposedRevenueSplitPreview.tsx:130 msgid "Add" msgstr "" -#: src/components/rtoken-setup/token/RevenueSplit.tsx:150 +#: src/components/rtoken-setup/token/RevenueSplit.tsx:163 msgid "Add new address" msgstr "" -#: src/components/rtoken-setup/basket/CollateralModal.tsx:181 +#: src/components/rtoken-setup/basket/CollateralModal.tsx:165 msgid "Add to backup basket" msgstr "" #: src/components/rtoken-setup/basket/EmergencyCollateral.tsx:122 -#: src/components/rtoken-setup/basket/PrimaryBasket.tsx:96 +#: src/components/rtoken-setup/basket/PrimaryBasket.tsx:210 msgid "Add to basket" msgstr "" -#: src/components/rtoken-setup/basket/CollateralModal.tsx:179 +#: src/components/rtoken-setup/basket/CollateralModal.tsx:163 msgid "Add to primary basket" msgstr "" -#: src/views/yield-dtf/governance/components/TopVoters.tsx:88 +#: src/views/index-dtf/settings/components/index-settings-basic.tsx:26 +#: src/views/yield-dtf/governance/components/TopVoters.tsx:89 msgid "Address" msgstr "" -#: src/components/rtoken-setup/token/TokenConfiguration.tsx:32 +#: src/components/rtoken-setup/token/TokenConfiguration.tsx:30 msgid "Advanced config:" msgstr "" -#: src/views/bridge/components/BridgeFaq.tsx:48 -msgid "After your withdrawal request is proposed onchain (transaction 1) you must verify (transaction 2) and complete (transaction 3) the withdrawal in order to access your funds. You can track your progress in the transactions table under Withdrawals." -msgstr "" - -#: src/views/yield-dtf/governance/views/proposal-detail/components/VoteModal.tsx:49 +#: src/views/index-dtf/governance/views/proposal/components/vote-modal.tsx:57 +#: src/views/yield-dtf/governance/views/proposal-detail/components/VoteModal.tsx:54 msgid "Against" msgstr "" -#: src/views/yield-dtf/settings/components/ListingInfo.tsx:26 +#: src/views/yield-dtf/settings/components/listing-info.tsx:39 msgid "Alexios is standard token-voting adopted from Compound Governor Bravo, with adjustments accounting for RSR being staked across multiple RTokens." msgstr "" -#: src/views/index-dtf/governance/components/governance-stats.tsx:84 -#: src/views/yield-dtf/governance/components/GovernanceOverview.tsx:116 +#: src/views/yield-dtf/governance/components/GovernanceOverview.tsx:126 msgid "All time" msgstr "" -#: src/views/tokens/Tokens.tsx:23 +#: src/views/tokens/Tokens.tsx:24 msgid "All unlisted RTokens" msgstr "" -#: src/components/transactions/table/index.tsx:78 -#: src/views/bridge/components/BridgeWithdrawals.tsx:22 -#: src/views/explorer/components/transactions/useTransactionColumns.tsx:77 -#: src/views/yield-dtf/auctions/components/useColumns.tsx:40 -#: src/views/yield-dtf/overview/components/RTokenTransactions.tsx:105 +#: src/components/transactions/table/index.tsx:77 +#: src/views/explorer/components/transactions/useTransactionColumns.tsx:76 +#: src/views/yield-dtf/auctions/components/useColumns.tsx:39 +#: src/views/yield-dtf/overview/components/rtoken-transactions.tsx:108 msgid "Amount" msgstr "" -#: src/views/home/components/Hero.tsx:68 -msgid "Annualized RSR Stakers Revenue" +#: src/views/index-dtf/settings/components/index-settings-fees.tsx:92 +msgid "Annualized TVL Fee" msgstr "" -#: src/views/home/components/Hero.tsx:58 -msgid "Annualized RTokens Revenue" -msgstr "" - -#: src/views/yield-dtf/auctions/components/About.tsx:84 +#: src/views/yield-dtf/auctions/components/About.tsx:74 msgid "Anyone can click the button above to check and trigger an auction for any revenue that has accrued or for rebalances that need to happen. Please note that for RTokens with many collateral types in the basket, this may be an expensive transaction to execute." msgstr "" @@ -204,34 +208,30 @@ msgstr "" msgid "Approve in wallet" msgstr "" -#: src/views/bridge/components/BridgeFaq.tsx:77 -msgid "Are there any fees involved in using Base Bridge?" -msgstr "" - -#: src/components/rtoken-setup/token/ExternalRevenueSplit.tsx:101 +#: src/components/rtoken-setup/token/ExternalRevenueSplit.tsx:96 msgid "As RSR" msgstr "" -#: src/components/rtoken-setup/token/ExternalRevenueSplit.tsx:91 +#: src/components/rtoken-setup/token/ExternalRevenueSplit.tsx:89 msgid "As RToken" msgstr "" -#: src/views/yield-dtf/settings/components/ContractsInfo.tsx:26 +#: src/views/yield-dtf/settings/components/contracts-info.tsx:22 msgid "Asset Registry" msgstr "" -#: src/views/yield-dtf/auctions/auctions-sidebar/AvailableRevenueAuctions.tsx:37 -msgid "Auctionable revenue" +#: src/views/index-dtf/settings/components/index-settings-roles.tsx:59 +msgid "Auction Launcher" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/UnregisterProposal.tsx:48 -msgid "auctioned" +#: src/views/yield-dtf/auctions/auctions-sidebar/AvailableRevenueAuctions.tsx:37 +msgid "Auctionable revenue" msgstr "" -#: src/components/layout/navigation/index.tsx:112 -#: src/components/layout/navigation/TokenNavigation.tsx:207 -#: src/views/index-dtf/components/navigation/index.tsx:85 -#: src/views/yield-dtf/auctions/auctions-sidebar/index.tsx:23 +#: src/components/layout/navigation/index.tsx:79 +#: src/components/layout/navigation/TokenNavigation.tsx:180 +#: src/views/index-dtf/components/navigation/index.tsx:130 +#: src/views/yield-dtf/auctions/auctions-sidebar/index.tsx:16 msgid "Auctions" msgstr "" @@ -239,143 +239,143 @@ msgstr "" msgid "Available collateral" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/ProposalNavigation.tsx:39 +#: src/views/yield-dtf/governance/views/proposal/components/ProposalNavigation.tsx:38 msgid "Back to Governance" msgstr "" -#: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:44 +#: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:43 msgid "Back to settings" msgstr "" -#: src/views/yield-dtf/overview/components/backing/BackingOverview.tsx:90 -#: src/views/yield-dtf/overview/components/CollateralPieChartWrapper.tsx:136 +#: src/views/yield-dtf/overview/components/backing/backing-overview.tsx:77 +#: src/views/yield-dtf/overview/components/collateral-pie-chart-wrapper.tsx:85 msgid "Backing" msgstr "" -#: src/components/layout/navigation/TokenNavigation.tsx:189 -#: src/views/yield-dtf/overview/components/backing/index.tsx:71 +#: src/components/layout/navigation/TokenNavigation.tsx:162 +#: src/views/yield-dtf/overview/components/backing/index.tsx:85 msgid "Backing & Risk" msgstr "" -#: src/views/discover/components/yield/components/MobileCollateralInfo.tsx:46 -#: src/views/discover/components/yield/components/RTokenCard.tsx:212 +#: src/views/discover/components/yield/components/MobileCollateralInfo.tsx:28 +#: src/views/discover/components/yield/components/TokenStats.tsx:58 msgid "Backing + Overcollaterization:" msgstr "" -#: src/views/yield-dtf/staking/components/overview/StakingStats.tsx:77 +#: src/views/yield-dtf/staking/components/overview/staking-stats.tsx:83 msgid "Backing + Staked" msgstr "" -#: src/views/yield-dtf/settings/components/BackingInfo.tsx:66 +#: src/views/yield-dtf/settings/components/backing-info.tsx:47 msgid "Backing buffer" msgstr "" -#: src/components/rtoken-setup/token/BackingForm.tsx:85 -msgid "Backing buffer - percentage value that describes how much additional collateral tokens to keep in the BackingManager before forwarding tokens to the RevenueTraders. The RevenueTraders here refers to the RToken and RSR traders. Why this matters? It allows collateral tokens to be periodically converted into the RToken, which is a more efficient form of revenue production than trading each individual collateral for the desired RToken. It also provides a buffer to prevent RSR seizure after trading slippage. For more info on the BackingManager and Trader types see the “Revenue distribution to RToken holders” and “Summary of revenue distribution” in our documentation." +#: src/components/rtoken-setup/token/BackingForm.tsx:89 +msgid "Backing buffer - percentage value that describes how much additional collateral tokens to keep in the BackingManager before forwarding tokens to the RevenueTraders. The RevenueTraders here refers to the RToken and RSR traders. Why this matters? It allows collateral tokens to be periodically converted into the RToken, which is a more efficient form of revenue production than trading each individual collateral for the desired RToken. It also provides a buffer to prevent RSR seizure after trading slippage. For more info on the BackingManager and Trader types see the \"Revenue distribution to RToken holders\" and \"Summary of revenue distribution\" in our documentation." msgstr "" -#: src/components/rtoken-setup/token/BackingForm.tsx:83 +#: src/components/rtoken-setup/token/BackingForm.tsx:87 msgid "Backing buffer (%)" msgstr "" -#: src/components/layout/navigation/TokenNavigation.tsx:225 -#: src/views/yield-dtf/governance/views/proposal/components/ProposalNavigation.tsx:17 -#: src/views/yield-dtf/settings/components/NavigationSidebar.tsx:15 +#: src/components/layout/navigation/TokenNavigation.tsx:198 +#: src/views/yield-dtf/governance/views/proposal/components/ProposalNavigation.tsx:16 +#: src/views/yield-dtf/settings/components/navigation-sidebar.tsx:14 msgid "Backing config" msgstr "" -#: src/views/yield-dtf/deploy/components/BackingManager.tsx:9 -#: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:24 -#: src/views/yield-dtf/settings/components/ContractsInfo.tsx:21 +#: src/views/yield-dtf/deploy/components/BackingManager.tsx:14 +#: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:23 +#: src/views/yield-dtf/settings/components/contracts-info.tsx:17 msgid "Backing Manager" msgstr "" -#: src/views/yield-dtf/settings/components/BackingInfo.tsx:23 +#: src/views/yield-dtf/settings/components/backing-info.tsx:15 msgid "Backing Parameters" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/ProposedBackupPreview.tsx:104 +#: src/views/yield-dtf/governance/views/proposal/components/ProposedBackupPreview.tsx:115 msgid "Backup basket" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/ProposalBasketSetup.tsx:93 +#: src/views/yield-dtf/governance/views/proposal/components/ProposalBasketSetup.tsx:79 msgid "Backup configuration tracks primary basket changes to update its values. This may not be desired on a proposal, you can choose to propose new changes." msgstr "" -#: src/views/yield-dtf/settings/components/EmergencyCollateralInfo.tsx:27 +#: src/views/yield-dtf/settings/components/emergency-collateral-info.tsx:22 msgid "Backups" msgstr "" -#: src/views/yield-dtf/governance/components/AccountVotes.tsx:75 -msgid "Balance:" +#: src/views/yield-dtf/governance/components/AccountVotes.tsx:74 +msgid "Balance: " msgstr "" -#: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:20 -#: src/views/yield-dtf/deploy/components/TokenParameters.tsx:133 +#: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:19 +#: src/views/yield-dtf/deploy/components/TokenParameters.tsx:123 msgid "Basics" msgstr "" -#: src/components/rtoken-setup/basket/UnitBasket.tsx:77 -#: src/views/yield-dtf/settings/components/BasketInfo.tsx:26 +#: src/components/rtoken-setup/basket/UnitBasket.tsx:107 +#: src/views/yield-dtf/settings/components/basket-info.tsx:21 msgid "Basket" msgstr "" -#: src/views/explorer/components/tokens/index.tsx:180 +#: src/views/explorer/components/tokens/index.tsx:160 msgid "Basket APY" msgstr "" -#: src/components/layout/header/components/TokenToggle.tsx:66 -msgid "Basket defaulted" +#: src/views/index-dtf/settings/components/index-settings-governance.tsx:120 +msgid "Basket Governance" msgstr "" -#: src/views/yield-dtf/settings/components/ContractsInfo.tsx:22 +#: src/views/yield-dtf/settings/components/contracts-info.tsx:18 msgid "Basket Handler" msgstr "" -#: src/components/layout/header/components/TokenToggle.tsx:68 -msgid "Basket iffy" -msgstr "" - #: src/views/yield-dtf/issuance/components/issue/ConfirmIssuance.tsx:89 msgid "Basket is not ready" msgstr "" -#: src/components/rtoken-setup/basket/UnitBasket.tsx:90 +#: src/components/rtoken-setup/basket/UnitBasket.tsx:128 msgid "Basket scale for this unit of account. This is used to initially calculate how much of each token is required for minting." msgstr "" -#: src/views/yield-dtf/settings/components/BackingInfo.tsx:29 +#: src/views/yield-dtf/settings/components/backing-info.tsx:19 msgid "Basket warmup period" msgstr "" -#: src/views/yield-dtf/settings/components/BackingInfo.tsx:50 +#: src/views/yield-dtf/settings/components/backing-info.tsx:37 msgid "Batch auction length" msgstr "" -#: src/components/rtoken-setup/token/BackingForm.tsx:57 +#: src/components/rtoken-setup/token/BackingForm.tsx:61 msgid "Batch Auction length - defines how long Gnosis EasyAuction auctions should be. Gnosis EasyAuction is a platform enabling fair price discovery for tokens through the use of batch auctions." msgstr "" -#: src/components/rtoken-setup/token/BackingForm.tsx:55 +#: src/components/rtoken-setup/token/BackingForm.tsx:59 msgid "Batch Auction length (s)" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/TraderImplementationProposal.tsx:14 +#: src/views/yield-dtf/governance/views/proposal/components/TraderImplementationProposal.tsx:22 msgid "Batch trade" msgstr "" -#: src/views/tokens/Tokens.tsx:24 +#: src/views/tokens/Tokens.tsx:27 msgid "Be aware that anyone can create an RToken that ends up on this list. We don't apply any standards beyond what can be done with the Reserve Protocol." msgstr "" -#: src/views/yield-dtf/settings/components/GovernancePrompt.tsx:53 +#: src/views/yield-dtf/settings/components/governance-prompt.tsx:33 msgid "Begin governance setup" msgstr "" +#. placeholder {0}: formatCurrency(Number(amount)) +#. placeholder {1}: rToken?.symbol #: src/views/yield-dtf/issuance/components/issue/ConfirmIssuance.tsx:96 msgid "Begin minting {0} {1}" msgstr "" +#. placeholder {0}: formatCurrency(Number(amount)) +#. placeholder {1}: rToken?.symbol ?? '' #: src/views/yield-dtf/issuance/components/redeem/ConfirmRedemption.tsx:99 msgid "Begin redemption of {0} {1}" msgstr "" @@ -384,118 +384,107 @@ msgstr "" msgid "Below minimum trade volume" msgstr "" -#: src/views/yield-dtf/auctions/components/useColumns.tsx:36 +#: src/views/yield-dtf/auctions/components/useColumns.tsx:35 msgid "Bought" msgstr "" -#: src/views/yield-dtf/settings/components/ContractsInfo.tsx:25 -msgid "Broker" +#: src/views/index-dtf/settings/components/index-settings-roles.tsx:68 +msgid "Brand Manager" msgstr "" -#: src/components/layout/header/components/HeaderMenu.tsx:46 -msgid "Browse" +#: src/views/yield-dtf/settings/components/contracts-info.tsx:21 +msgid "Broker" msgstr "" -#: src/views/discover/components/yield/components/CompareTokensTitle.tsx:48 +#: src/views/discover/components/yield/components/CompareTokensTitle.tsx:34 msgid "Browse RTokens" msgstr "" -#: src/views/yield-dtf/auctions/components/useColumns.tsx:36 +#: src/views/yield-dtf/auctions/components/useColumns.tsx:35 msgid "Buying" msgstr "" -#: src/views/bridge/components/BridgeFaq.tsx:83 -msgid "Can I cancel a withdrawal?" -msgstr "" - -#: src/components/layout/header/components/RegisterHelp.tsx:82 -msgid "Can’t find what you’re looking for elsewhere or want to join the conversation?" -msgstr "" - -#: src/views/yield-dtf/staking/components/stake/EditDelegate.tsx:34 +#: src/views/yield-dtf/staking/components/stake/edit-delegate.tsx:39 msgid "Cancel" msgstr "" -#: src/components/transactions/table/index.tsx:53 -#: src/views/explorer/components/transactions/useTransactionColumns.tsx:33 -#: src/views/yield-dtf/overview/components/RTokenTransactions.tsx:83 +#: src/components/transactions/table/index.tsx:52 +#: src/views/explorer/components/transactions/useTransactionColumns.tsx:32 +#: src/views/yield-dtf/overview/components/rtoken-transactions.tsx:80 msgid "Cancel Issue" msgstr "" +#: src/views/index-dtf/governance/views/proposal/components/proposal-cancel-button.tsx:135 #: src/views/yield-dtf/governance/views/proposal-detail/components/ProposalCancel.tsx:48 msgid "Cancel proposal" msgstr "" -#: src/views/yield-dtf/staking/components/withdraw/CooldownUnstake.tsx:73 +#: src/views/yield-dtf/staking/components/withdraw/cooldown-unstake.tsx:70 msgid "Cancel unstake" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/SpellUpgrade.tsx:72 +#: src/views/yield-dtf/governance/views/proposal/components/SpellUpgrade.tsx:77 msgid "Cast Spell 1" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/SpellUpgrade.tsx:81 +#: src/views/yield-dtf/governance/views/proposal/components/SpellUpgrade.tsx:88 msgid "Cast Spell 2" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/SpellUpgradePreview.tsx:28 +#: src/views/yield-dtf/governance/views/proposal/components/SpellUpgradePreview.tsx:32 msgid "Casting 3.4.0 upgrade spell" msgstr "" -#: src/components/layout/token-menu/Caution.tsx:24 -msgid "Caution" -msgstr "" - -#: src/views/earn/hooks/useEarnTableColumns.tsx:141 -#: src/views/yield-dtf/overview/components/RTokenTransactions.tsx:133 +#: src/views/earn/hooks/useEarnTableColumns.tsx:113 msgid "Chain" msgstr "" -#: src/views/yield-dtf/governance/components/AccountVotes.tsx:105 -#: src/views/yield-dtf/governance/views/proposal/components/ItemPreview.tsx:120 +#: src/views/yield-dtf/governance/components/AccountVotes.tsx:104 +#: src/views/yield-dtf/governance/views/proposal/components/ItemPreview.tsx:116 msgid "Change" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/ProposalBasketSetup.tsx:90 +#: src/views/yield-dtf/governance/views/proposal/components/ProposalBasketSetup.tsx:76 msgid "Change backup basket" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/ProposedRevenueSplitPreview.tsx:110 +#: src/views/yield-dtf/governance/views/proposal/components/ProposedRevenueSplitPreview.tsx:113 msgid "Change distribution" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/ProposedBackupPreview.tsx:110 -#: src/views/yield-dtf/governance/views/proposal/components/ProposedBackupPreview.tsx:131 +#: src/views/yield-dtf/governance/views/proposal/components/ProposedBackupPreview.tsx:120 +#: src/views/yield-dtf/governance/views/proposal/components/ProposedBackupPreview.tsx:141 msgid "Change diversity factor" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/PreviewBox.tsx:39 +#: src/views/yield-dtf/governance/views/proposal/components/PreviewBox.tsx:36 msgid "Change in:" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/ProposalBasketSetup.tsx:61 +#: src/views/yield-dtf/governance/views/proposal/components/ProposalBasketSetup.tsx:46 msgid "Change primary basket" msgstr "" -#: src/views/yield-dtf/auctions/components/AuctionsHeader.tsx:44 +#: src/views/yield-dtf/auctions/components/AuctionsHeader.tsx:43 msgid "Check for auctions" msgstr "" -#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:44 -msgid "Choose between our Alexios Governor and anything between one man rule to arbitrary DAO structure under your defined Ethereum address." +#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:51 +msgid "Choose between our Alexios Governor and anything between one-person rule to arbitrary DAO structure under your defined Ethereum address." msgstr "" -#: src/views/yield-dtf/issuance/components/redeem/RedeemNonceModal.tsx:40 +#: src/views/yield-dtf/issuance/components/redeem/RedeemNonceModal.tsx:41 msgid "Choose Redemption Basket" msgstr "" -#: src/components/transactions/table/index.tsx:52 -#: src/views/explorer/components/transactions/useTransactionColumns.tsx:32 -#: src/views/yield-dtf/overview/components/RTokenTransactions.tsx:82 +#: src/components/transactions/table/index.tsx:51 +#: src/views/explorer/components/transactions/useTransactionColumns.tsx:31 +#: src/views/yield-dtf/overview/components/rtoken-transactions.tsx:79 msgid "Claim" msgstr "" -#: src/views/yield-dtf/auctions/auctions-sidebar/claim-rewards/components/ClaimFromTraderButton.tsx:79 +#. placeholder {0}: formatCurrency(claimAmount) +#: src/views/yield-dtf/auctions/auctions-sidebar/claim-rewards/components/ClaimFromTraderButton.tsx:78 msgid "Claim ${0}" msgstr "" @@ -507,11 +496,11 @@ msgstr "" msgid "Claimable emissions" msgstr "" -#: src/views/yield-dtf/issuance/components/issue/CollateralDistribution.tsx:47 +#: src/views/yield-dtf/issuance/components/issue/CollateralDistribution.tsx:37 msgid "Collateral distribution" msgstr "" -#: src/views/yield-dtf/overview/components/backing/CollateralExposure.tsx:248 +#: src/views/yield-dtf/overview/components/backing/collateral-exposure.tsx:216 msgid "Collateral Exposure" msgstr "" @@ -519,197 +508,211 @@ msgstr "" msgid "Collateral Plugins" msgstr "" -#: src/components/rtoken-setup/basket/PluginItem.tsx:39 +#: src/components/rtoken-setup/basket/PluginItem.tsx:33 msgid "Collateral token" msgstr "" -#: src/views/yield-dtf/overview/components/CollateralPieChartTooltip.tsx:179 +#: src/views/yield-dtf/overview/components/collateral-pie-chart-tooltip.tsx:141 msgid "Collateral(s)" msgstr "" -#: src/views/yield-dtf/deploy/components/Intro.tsx:35 -#: src/views/yield-dtf/governance/views/proposal/components/Intro.tsx:30 +#: src/views/yield-dtf/deploy/components/Intro.tsx:34 +#: src/views/yield-dtf/governance/views/proposal/components/Intro.tsx:37 msgid "Community Discord" msgstr "" -#: src/views/bridge/components/BridgeFaq.tsx:70 -msgid "community is available around the clock for general questions, assistance and support!" -msgstr "" - -#: src/views/discover/components/yield/components/TokenList.tsx:21 +#: src/views/discover/components/yield/components/TokenList.tsx:22 msgid "Compare RTokens" msgstr "" -#: src/views/bridge/components/FinalizeWithdrawalButton.tsx:47 -msgid "Complete" -msgstr "" - -#: src/views/bridge/components/WithdrawalInfoModal.tsx:69 -msgid "Complete withdrawal on Mainnet" -msgstr "" - -#: src/views/yield-dtf/governance/components/AccountVotes.tsx:58 +#: src/views/yield-dtf/governance/components/AccountVotes.tsx:57 msgid "Configure your vote" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/ProposalOverview.tsx:55 +#: src/views/yield-dtf/governance/views/proposal/components/ProposalOverview.tsx:39 msgid "Confirm & prepare proposal" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/ConfirmProposalOverview.tsx:137 +#: src/views/yield-dtf/governance/views/proposal/components/ConfirmProposalOverview.tsx:121 msgid "Confirm & Submit" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/ProposalOverview.tsx:42 +#: src/views/yield-dtf/governance/views/proposal/components/ProposalOverview.tsx:28 msgid "Confirm changes made" msgstr "" -#: src/views/yield-dtf/governance/components/DelegateModal.tsx:39 +#: src/views/index-dtf/governance/components/delegate-modal.tsx:38 +#: src/views/yield-dtf/governance/components/DelegateModal.tsx:38 msgid "Confirm delegate" msgstr "" -#: src/components/account/index.tsx:103 +#: src/views/index-dtf/governance/views/proposal/components/vote-modal.tsx:149 +msgid "Confirming..." +msgstr "" + +#: src/components/account/index.tsx:95 msgid "Connect" msgstr "" -#: src/components/old/button/TransactionButton.tsx:45 +#: src/components/ui/transaction-button.tsx:57 +#: src/components/ui/transaction.tsx:44 msgid "Connect Wallet" msgstr "" -#: src/views/yield-dtf/staking/components/stake/DelegateStake.tsx:41 +#: src/views/yield-dtf/staking/components/stake/delegate-stake.tsx:45 msgid "Connect your wallet" msgstr "" -#: src/components/layout/navigation/TokenNavigation.tsx:228 -#: src/views/yield-dtf/settings/components/NavigationSidebar.tsx:18 +#: src/components/layout/navigation/TokenNavigation.tsx:201 +#: src/views/yield-dtf/settings/components/navigation-sidebar.tsx:17 msgid "Contract Addresses" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/ContractUpgradesPreview.tsx:30 +#: src/views/yield-dtf/governance/views/proposal/components/ContractUpgradesPreview.tsx:34 msgid "Contract upgrades" msgstr "" -#: src/views/yield-dtf/governance/views/proposal-detail/components/ProposalDetailNavigation.tsx:7 +#: src/views/yield-dtf/governance/views/proposal-detail/components/ProposalDetailNavigation.tsx:6 msgid "Contracts" msgstr "" -#: src/components/old/button/CopyValue.tsx:15 +#: src/views/index-dtf/settings/components/index-settings-governance.tsx:111 +msgid "Controls changes to the basket of an Index DTF" +msgstr "" + +#: src/views/index-dtf/settings/components/index-settings-governance.tsx:113 +msgid "Controls fees, voting parameters, and anything other than basket changes for an Index DTF" +msgstr "" + +#: src/views/index-dtf/settings/components/index-settings-governance.tsx:114 +msgid "Controls settings of the vlDAO including vote lock duration and approving revenue tokens" +msgstr "" + +#: src/components/ui/copy-value.tsx:56 +#: src/components/ui/copy.tsx:20 msgid "Copied to clipboard!" msgstr "" -#: src/components/old/button/CopyValue.tsx:14 +#: src/components/ui/copy-value.tsx:55 +#: src/components/ui/copy.tsx:19 msgid "Copy to clipboard" msgstr "" -#: src/views/yield-dtf/governance/components/ProposalList.tsx:210 -msgid "Create proposal" +#: src/components/layout/header/components/app-navigation.tsx:114 +msgid "Create a new overcollateralized Yield DTF" msgstr "" -#: src/views/explorer/components/governance/index.tsx:64 -msgid "Created At" +#: src/views/yield-dtf/deploy/components/Intro.tsx:17 +msgid "Create a new Yield DTF" msgstr "" -#: src/views/index-dtf/governance/components/governance-stats.tsx:39 -msgid "current" +#: src/components/layout/header/components/app-navigation.tsx:81 +msgid "Create New DTF" msgstr "" -#: src/views/index-dtf/governance/components/governance-stats.tsx:93 -#: src/views/index-dtf/governance/components/governance-stats.tsx:104 -#: src/views/yield-dtf/governance/components/GovernanceOverview.tsx:90 -#: src/views/yield-dtf/governance/components/GovernanceOverview.tsx:126 +#: src/views/yield-dtf/governance/components/ProposalList.tsx:191 +msgid "Create proposal" +msgstr "" + +#: src/views/explorer/components/governance/index.tsx:70 +msgid "Created At" +msgstr "" + +#: src/views/yield-dtf/governance/components/GovernanceOverview.tsx:107 #: src/views/yield-dtf/governance/components/GovernanceOverview.tsx:136 -#: src/views/yield-dtf/governance/views/proposal/components/ItemPreview.tsx:83 -#: src/views/yield-dtf/staking/components/overview/StakingStats.tsx:61 -#: src/views/yield-dtf/staking/components/overview/StakingStats.tsx:71 -#: src/views/yield-dtf/staking/components/overview/StakingStats.tsx:81 +#: src/views/yield-dtf/governance/components/GovernanceOverview.tsx:146 +#: src/views/yield-dtf/governance/views/proposal/components/ItemPreview.tsx:79 +#: src/views/yield-dtf/staking/components/overview/staking-stats.tsx:67 +#: src/views/yield-dtf/staking/components/overview/staking-stats.tsx:77 +#: src/views/yield-dtf/staking/components/overview/staking-stats.tsx:87 msgid "Current" msgstr "" -#: src/components/rtoken-setup/components/RolesEdit.tsx:127 +#: src/components/rtoken-setup/components/RolesEdit.tsx:109 msgid "Current holder" msgstr "" -#: src/views/yield-dtf/settings/components/FreezeManager.tsx:103 +#: src/views/yield-dtf/settings/components/freeze-manager.tsx:99 msgid "Current status:" msgstr "" -#: src/components/rtoken-setup/token/TokenConfiguration.tsx:43 +#: src/components/rtoken-setup/token/TokenConfiguration.tsx:42 msgid "Customize" msgstr "" -#: src/components/rtoken-setup/basket/PluginItem.tsx:57 +#: src/views/index-dtf/settings/components/index-settings-governance.tsx:123 +msgid "DAO Governance" +msgstr "" + +#: src/components/rtoken-setup/basket/PluginItem.tsx:50 msgid "Decimals" msgstr "" -#: src/components/rtoken-setup/basket/PluginItem.tsx:63 +#: src/components/rtoken-setup/basket/PluginItem.tsx:56 msgid "Default delay" msgstr "" -#: src/views/earn/index.tsx:79 +#: src/views/earn/views/defi/components/earn-heading.tsx:44 msgid "DeFi protocols oftentimes have incentives for liquidity that are paid in their token or a combination of tokens. By providing liquidity for trading or lending or other activities on these protocols, you can earn rewards that are sometimes quite high! Note that there are always risks (smart contract risks, impermanent loss risks, etc), in providing liquidity on these protocols so please make sure you understand things before blindly diving in." msgstr "" -#: src/views/earn/index.tsx:65 -msgid "DeFi yield opportunities for RTokens in Convex, Curve, Yearn & Beefy" +#: src/views/earn/views/defi/components/earn-heading.tsx:20 +msgid "DeFi yield opportunities for DTFs in Aerodrome, Convex, Beefy, Yearn & Others" msgstr "" -#: src/components/rtoken-setup/token/RevenueSplit.tsx:156 +#: src/components/rtoken-setup/token/RevenueSplit.tsx:169 msgid "Define what portion of the revenue goes to the RToken holders versus RSR stakers. It can also be configured to send a portion of the revenue of an RToken to any arbitrary Ethereum address (wallet or smart contract).<0/><1/>" msgstr "" +#. placeholder {0}: timebased ? 'hours' : 'blocks' #: src/components/rtoken-setup/governance/GovernanceParameters.tsx:73 msgid "Delay (in number of {0}) since the proposal starts until voting ends." msgstr "" -#: src/components/rtoken-setup/token/BackingForm.tsx:28 +#: src/components/rtoken-setup/token/BackingForm.tsx:32 msgid "Delay in seconds" msgstr "" -#: src/components/rtoken-setup/token/OtherForm.tsx:61 +#: src/components/rtoken-setup/token/OtherForm.tsx:64 msgid "Delay in Seconds" msgstr "" -#: src/views/yield-dtf/governance/components/AccountVotes.tsx:72 +#: src/views/yield-dtf/governance/components/AccountVotes.tsx:71 msgid "Delegate" msgstr "" -#: src/views/yield-dtf/governance/components/DelegateModal.tsx:43 +#: src/views/index-dtf/governance/components/delegate-modal.tsx:42 +#: src/views/yield-dtf/governance/components/DelegateModal.tsx:42 msgid "Delegate to" msgstr "" -#: src/views/yield-dtf/governance/components/DelegateModal.tsx:36 +#: src/views/index-dtf/governance/components/delegate-modal.tsx:35 +#: src/views/yield-dtf/governance/components/DelegateModal.tsx:35 msgid "Delegate votes" msgstr "" -#: src/views/yield-dtf/staking/components/stake/EditDelegate.tsx:24 +#: src/views/yield-dtf/staking/components/stake/edit-delegate.tsx:23 msgid "Delegate voting power" msgstr "" -#: src/views/yield-dtf/governance/views/proposal-detail/components/ProposalVote.tsx:170 +#: src/views/index-dtf/governance/views/proposal/components/proposal-vote-button.tsx:19 +#: src/views/yield-dtf/governance/views/proposal-detail/components/ProposalVote.tsx:151 msgid "Delegate voting power for future votes" msgstr "" -#: src/views/yield-dtf/governance/components/AccountVotes.tsx:88 +#: src/views/yield-dtf/governance/components/AccountVotes.tsx:87 msgid "Delegated to self" msgstr "" -#: src/views/yield-dtf/governance/components/AccountVotes.tsx:91 -msgid "Delegated to:" -msgstr "" - -#: src/components/layout/header/components/AppHeader.tsx:39 -msgid "Deploy" -msgstr "" - -#: src/views/yield-dtf/deploy/components/Intro.tsx:19 -msgid "Deploy an RToken" +#: src/views/yield-dtf/governance/components/AccountVotes.tsx:90 +msgid "Delegated to: " msgstr "" -#: src/views/yield-dtf/deploy/components/GovernanceOverview.tsx:100 +#: src/views/yield-dtf/deploy/components/GovernanceOverview.tsx:97 msgid "Deploy Governance" msgstr "" -#: src/views/yield-dtf/deploy/components/DeployOverview.tsx:158 +#: src/views/yield-dtf/deploy/components/DeployOverview.tsx:144 msgid "Deploy RToken" msgstr "" @@ -717,32 +720,36 @@ msgstr "" msgid "Deploy transaction submitted" msgstr "" -#: src/views/discover/components/yield/components/DeployHero.tsx:70 +#: src/views/discover/components/yield/components/DeployHero.tsx:36 msgid "Deploy your own RToken" msgstr "" -#: src/views/yield-dtf/deploy/components/Intro.tsx:22 -msgid "Deploying through this UI doesn't require deep technical knowledge as long as you don't need novel collateral plugins for your baskets. However, we encourage you to talk to someone proficient in the protocol and read the docs to learn more before confirming any transactions." +#: src/views/index-dtf/settings/components/index-settings-basic.tsx:38 +msgid "Deployer" msgstr "" -#: src/components/transactions/table/index.tsx:57 -#: src/views/bridge/components/BridgeHeader.tsx:85 -#: src/views/explorer/components/transactions/useTransactionColumns.tsx:37 -#: src/views/yield-dtf/overview/components/RTokenTransactions.tsx:87 -msgid "Deposit" +#: src/views/index-dtf/settings/components/index-settings-fees.tsx:37 +msgid "Deployer Share" msgstr "" -#: src/views/bridge/components/BridgeFaq.tsx:34 -msgid "Deposits: a few minutes usually, only requires 1x transaction. Withdrawals: 7 days, 3 transactions." +#: src/views/yield-dtf/deploy/components/Intro.tsx:20 +msgid "Deploying through this UI doesn't require deep technical knowledge as long as you don't need novel collateral plugins for your baskets. However, we encourage you to talk to someone proficient in the protocol and read the docs to learn more before confirming any transactions." msgstr "" -#: src/views/explorer/components/governance/index.tsx:43 -#: src/views/yield-dtf/governance/views/proposal/components/ConfirmProposalForm.tsx:81 +#: src/components/transactions/table/index.tsx:56 +#: src/views/explorer/components/transactions/useTransactionColumns.tsx:36 +#: src/views/yield-dtf/overview/components/rtoken-transactions.tsx:84 +msgid "Deposit" +msgstr "" + +#: src/views/explorer/components/governance/index.tsx:49 +#: src/views/yield-dtf/governance/views/proposal/components/ConfirmProposalForm.tsx:68 msgid "Description" msgstr "" -#: src/components/layout/navigation/index.tsx:116 -#: src/components/layout/navigation/TokenNavigation.tsx:217 +#: src/components/layout/navigation/index.tsx:83 +#: src/components/layout/navigation/TokenNavigation.tsx:190 +#: src/views/index-dtf/components/navigation/index.tsx:135 msgid "Details + Roles" msgstr "" @@ -750,261 +757,277 @@ msgstr "" msgid "Discard" msgstr "" -#: src/components/layout/header/components/AppHeader.tsx:29 -msgid "Discover" +#: src/components/layout/header/components/app-navigation.tsx:57 +msgid "Discover DTFs" msgstr "" -#: src/components/layout/header/components/RegisterHelp.tsx:77 -msgid "Discussions of ideas and suggestion that the community has on improving the Reserve Ecosystem" +#: src/components/layout/header/components/app-navigation.tsx:140 +msgid "Discussions of ecosystem ideas" msgstr "" -#: src/components/rtoken-setup/basket/CustomCollateral.tsx:117 -#: src/components/rtoken-setup/components/RolesEdit.tsx:56 +#: src/components/rtoken-setup/basket/CustomCollateral.tsx:112 +#: src/components/rtoken-setup/components/RolesEdit.tsx:51 msgid "Dismiss" msgstr "" -#: src/views/yield-dtf/issuance/components/wrapping/DisplayMode.tsx:15 +#. placeholder {0}: rToken?.symbol +#: src/views/yield-dtf/issuance/components/wrapping/DisplayMode.tsx:19 msgid "Display only {0} related collaterals" msgstr "" -#: src/components/rtoken-setup/token/RevenueSplit.tsx:139 +#: src/views/index-dtf/settings/components/distribute-fees.tsx:47 +msgid "Distribute Fees" +msgstr "" + +#: src/components/rtoken-setup/token/RevenueSplit.tsx:147 msgid "Distributed revenue does not add up to 100%" msgstr "" -#: src/views/yield-dtf/settings/components/ContractsInfo.tsx:29 +#: src/views/yield-dtf/settings/components/contracts-info.tsx:25 msgid "Distributor" msgstr "" -#: src/components/rtoken-setup/basket/BackupBasket.tsx:25 +#: src/components/rtoken-setup/basket/BackupBasket.tsx:26 #: src/components/rtoken-setup/basket/EmergencyCollateral.tsx:128 msgid "Diversity factor" msgstr "" -#: src/views/yield-dtf/settings/components/EmergencyCollateralInfo.tsx:35 +#: src/views/yield-dtf/settings/components/emergency-collateral-info.tsx:30 msgid "Diversity Factor" msgstr "" -#: src/views/yield-dtf/governance/components/GovernanceOverview.tsx:194 +#: src/views/yield-dtf/governance/components/GovernanceOverview.tsx:205 msgid "Documentation" msgstr "" -#: src/components/rtoken-setup/token/OtherForm.tsx:20 -#: src/components/rtoken-setup/token/OtherForm.tsx:34 +#: src/components/layout/header/components/app-navigation.tsx:88 +msgid "DTF Explorer" +msgstr "" + +#: src/views/discover/components/yield/components/RegisterAbout.tsx:56 +msgid "DTFs live on blockchain networks including Ethereum, Base, Binance Smart Chain, enabling worldwide transactions within seconds. Each DTF is 100% backed by other assets on the same blockchain. Users can redeem their DTF tokens for the underlying backing assets at any time without anyone else’s involvement." +msgstr "" + +#: src/components/rtoken-setup/token/OtherForm.tsx:23 +#: src/components/rtoken-setup/token/OtherForm.tsx:37 msgid "Duration in seconds" msgstr "" -#: src/components/rtoken-setup/token/BackingForm.tsx:56 -#: src/components/rtoken-setup/token/BackingForm.tsx:70 +#: src/components/rtoken-setup/token/BackingForm.tsx:60 +#: src/components/rtoken-setup/token/BackingForm.tsx:74 msgid "Duration in Seconds" msgstr "" -#: src/views/yield-dtf/settings/components/BackingInfo.tsx:58 +#: src/views/yield-dtf/settings/components/backing-info.tsx:42 msgid "Dutch auction length" msgstr "" -#: src/components/rtoken-setup/token/BackingForm.tsx:69 +#: src/components/rtoken-setup/token/BackingForm.tsx:73 msgid "Dutch Auction length (s)" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/TraderImplementationProposal.tsx:25 +#: src/views/yield-dtf/governance/views/proposal/components/TraderImplementationProposal.tsx:33 msgid "Dutch trade" msgstr "" -#: src/components/rtoken-setup/basket/BackupBasket.tsx:38 +#: src/components/rtoken-setup/basket/BackupBasket.tsx:39 msgid "Each target unit of your primary basket will have defined emergency collateral to replace with in case of default." msgstr "" -#: src/views/yield-dtf/auctions/components/About.tsx:59 +#: src/views/yield-dtf/auctions/components/About.tsx:48 msgid "Each type of trade can currently happen in only one way; the protocol launches a Gnosis EasyAuction. The Reserve Protocol is designed to make it easy to add other trading methods, but no other methods are currently supported." msgstr "" -#: src/components/layout/header/components/HeaderMenu.tsx:51 -#: src/components/layout/navigation/TokenNavigation.tsx:190 -#: src/views/yield-dtf/overview/components/RTokenEarn.tsx:46 +#: src/components/layout/navigation/TokenNavigation.tsx:163 msgid "Earn" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/ConfirmProposalOverview.tsx:133 +#: src/views/yield-dtf/governance/views/proposal/components/ConfirmProposalOverview.tsx:117 msgid "Edit" msgstr "" -#: src/components/layout/navigation/TokenNavigation.tsx:223 -#: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:22 -#: src/views/yield-dtf/governance/views/proposal/components/ProposalNavigation.tsx:22 -#: src/views/yield-dtf/settings/components/NavigationSidebar.tsx:13 +#: src/components/layout/navigation/TokenNavigation.tsx:196 +#: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:21 +#: src/views/yield-dtf/governance/views/proposal/components/ProposalNavigation.tsx:21 +#: src/views/yield-dtf/settings/components/navigation-sidebar.tsx:12 msgid "Emergency basket" msgstr "" -#: src/views/yield-dtf/settings/components/EmergencyCollateralInfo.tsx:21 +#: src/views/yield-dtf/settings/components/emergency-collateral-info.tsx:16 msgid "Emergency Collateral" msgstr "" -#: src/components/rtoken-setup/basket/BackupBasket.tsx:35 +#: src/components/rtoken-setup/basket/BackupBasket.tsx:36 msgid "Empty backup basket" msgstr "" -#: src/components/rtoken-setup/basket/PrimaryBasket.tsx:40 +#: src/components/rtoken-setup/basket/PrimaryBasket.tsx:54 msgid "Empty Basket" msgstr "" -#: src/views/yield-dtf/auctions/components/useColumns.tsx:53 +#: src/views/yield-dtf/auctions/components/useColumns.tsx:52 msgid "Ended at" msgstr "" -#: src/views/yield-dtf/auctions/batch/components/FinalizedAuctions.tsx:16 -#: src/views/yield-dtf/auctions/dutch/components/EndedDutchAuctions.tsx:16 +#: src/views/yield-dtf/auctions/batch/components/FinalizedAuctions.tsx:19 +#: src/views/yield-dtf/auctions/dutch/components/EndedDutchAuctions.tsx:19 msgid "Ended auctions" msgstr "" -#: src/views/yield-dtf/auctions/components/useColumns.tsx:53 +#: src/views/yield-dtf/auctions/components/useColumns.tsx:52 msgid "Ends at" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/UnregisterProposal.tsx:39 +#: src/views/yield-dtf/governance/views/proposal/components/UnregisterProposal.tsx:44 msgid "Ensure that the asset(s) you are unregistering do not have pending revenue that can be" msgstr "" -#: src/views/discover/components/yield/components/RTokenCard.tsx:261 +#: src/views/discover/components/yield/components/TokenActions.tsx:67 msgid "Est. APY" msgstr "" -#: src/components/rtoken-setup/basket/PluginItem.tsx:112 +#: src/components/rtoken-setup/basket/PluginItem.tsx:105 msgid "Est. APY:" msgstr "" -#: src/views/yield-dtf/staking/components/overview/StakingStats.tsx:54 +#: src/views/yield-dtf/staking/components/overview/staking-stats.tsx:61 msgid "Est. Staking APY" msgstr "" -#: src/components/rtoken-setup/basket/PrimaryBasket.tsx:120 +#: src/components/rtoken-setup/basket/PrimaryBasket.tsx:168 msgid "Estimated basket APY" msgstr "" -#: src/views/yield-dtf/staking/components/GasEstimate.tsx:16 +#: src/views/yield-dtf/staking/components/gas-estimate.tsx:18 msgid "Estimated gas cost" msgstr "" -#: src/components/old/button/TransactionButton.tsx:32 -#: src/components/transaction-modal/EstimatedGasInfo.tsx:13 +#: src/components/transaction-modal/EstimatedGasInfo.tsx:14 +#: src/components/ui/transaction-button.tsx:39 msgid "Estimated gas cost:" msgstr "" -#: src/views/yield-dtf/governance/components/DelegateModal.tsx:50 +#: src/views/index-dtf/governance/components/delegate-modal.tsx:49 +#: src/views/yield-dtf/governance/components/DelegateModal.tsx:49 msgid "ETH address" msgstr "" -#: src/views/yield-dtf/governance/views/proposal-detail/components/ContractProposalDetails.tsx:57 +#: src/views/yield-dtf/governance/views/proposal-detail/components/ContractProposalDetails.tsx:48 msgid "Executable code" msgstr "" +#: src/views/index-dtf/governance/views/proposal/components/proposal-execute-button.tsx:40 +#: src/views/index-dtf/governance/views/proposal/components/proposal-execute-button.tsx:64 #: src/views/yield-dtf/governance/views/proposal-detail/components/ProposalExecute.tsx:30 #: src/views/yield-dtf/governance/views/proposal-detail/components/ProposalExecute.tsx:42 msgid "Execute proposal" msgstr "" -#: src/views/yield-dtf/settings/components/GovernanceInfo.tsx:60 +#: src/views/index-dtf/settings/components/index-settings-governance.tsx:86 +#: src/views/yield-dtf/settings/components/governance-info.tsx:50 msgid "Execution Delay" msgstr "" -#: src/components/rtoken-setup/components/BackButton.tsx:29 -#: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:46 +#: src/components/rtoken-setup/components/BackButton.tsx:28 +#: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:45 msgid "Exit Deployer" msgstr "" -#: src/components/layout/header/components/HeaderMenu.tsx:61 #: src/views/discover/components/yield/discover-yield-dtf.tsx:20 msgid "Explore" msgstr "" -#: src/views/yield-dtf/overview/components/RTokenEarn.tsx:50 +#. placeholder {0}: rToken?.symbol ?? '' +#: src/views/yield-dtf/overview/components/rtoken-earn.tsx:39 msgid "Explore yield opportunities for {0}" msgstr "" -#: src/components/rtoken-setup/token/BackingForm.tsx:84 +#: src/components/rtoken-setup/token/BackingForm.tsx:88 msgid "Extra collateral to keep" msgstr "" -#: src/components/layout/header/components/AppHeader.tsx:34 -msgid "Farm" +#: src/views/explorer/components/tokens/index.tsx:190 +msgid "Featured RTokens" msgstr "" -#: src/views/explorer/components/tokens/index.tsx:233 -msgid "Featured RTokens" +#: src/components/layout/header/components/app-navigation.tsx:120 +msgid "Feedback" msgstr "" -#: src/components/layout/header/components/RegisterHelp.tsx:67 -msgid "File new issues or view & upvote existing feedback." +#: src/views/index-dtf/settings/components/index-settings-fees.tsx:86 +msgid "Fees & Revenue Distribution" msgstr "" -#: src/views/yield-dtf/auctions/dutch/components/AuctionTimeIndicators.tsx:35 +#: src/components/layout/header/components/app-navigation.tsx:122 +msgid "File issues or upvote existing ones" +msgstr "" + +#: src/views/yield-dtf/auctions/dutch/components/AuctionTimeIndicators.tsx:32 msgid "Final price in:" msgstr "" -#: src/views/home/components/Hero.tsx:48 -msgid "First-loss RSR Capital" +#: src/views/index-dtf/settings/components/index-settings-fees.tsx:32 +msgid "Fixed Platform Share" msgstr "" -#: src/views/yield-dtf/governance/views/proposal-detail/components/VoteModal.tsx:48 +#: src/views/index-dtf/governance/views/proposal/components/vote-modal.tsx:56 +#: src/views/yield-dtf/governance/views/proposal-detail/components/VoteModal.tsx:53 msgid "For" msgstr "" -#: src/views/yield-dtf/settings/components/FreezeManager.tsx:102 +#: src/views/yield-dtf/settings/components/freeze-manager.tsx:98 msgid "Freeze State" msgstr "" -#: src/views/explorer/components/transactions/useTransactionColumns.tsx:109 -#: src/views/yield-dtf/overview/components/RTokenTransactions.tsx:141 +#: src/views/explorer/components/transactions/useTransactionColumns.tsx:108 +#: src/views/yield-dtf/overview/components/rtoken-transactions.tsx:151 msgid "From" msgstr "" -#: src/views/bridge/components/BridgeInput.tsx:79 -msgid "From:" -msgstr "" - -#: src/views/yield-dtf/settings/components/FreezeManager.tsx:104 +#: src/views/yield-dtf/settings/components/freeze-manager.tsx:100 msgid "Frozen" msgstr "" -#: src/views/yield-dtf/overview/components/CollateralPieChartWrapper.tsx:108 +#: src/views/yield-dtf/overview/components/collateral-pie-chart-wrapper.tsx:70 msgid "Full exposure view" msgstr "" -#: src/views/bridge/components/FinalizeWithdrawalButton.tsx:34 -msgid "Funds moved" +#: src/views/yield-dtf/settings/components/contracts-info.tsx:24 +msgid "Furnace" msgstr "" -#: src/views/yield-dtf/settings/components/ContractsInfo.tsx:28 -msgid "Furnace" +#: src/components/layout/header/components/app-navigation.tsx:94 +msgid "Get an overview of everything going on" msgstr "" -#: src/views/discover/components/yield/components/DeployHero.tsx:84 +#: src/views/discover/components/yield/components/DeployHero.tsx:50 msgid "Go to the RToken Deployer" msgstr "" -#: src/components/layout/navigation/index.tsx:113 -#: src/components/layout/navigation/TokenNavigation.tsx:212 -#: src/components/layout/navigation/TokenNavigation.tsx:227 -#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:33 -#: src/views/index-dtf/components/navigation/index.tsx:80 -#: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:29 -#: src/views/yield-dtf/governance/views/proposal/components/ProposalNavigation.tsx:19 -#: src/views/yield-dtf/settings/components/NavigationSidebar.tsx:17 +#: src/components/layout/navigation/index.tsx:80 +#: src/components/layout/navigation/TokenNavigation.tsx:185 +#: src/components/layout/navigation/TokenNavigation.tsx:200 +#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:38 +#: src/views/index-dtf/components/navigation/index.tsx:125 +#: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:28 +#: src/views/yield-dtf/governance/views/proposal/components/ProposalNavigation.tsx:18 +#: src/views/yield-dtf/settings/components/navigation-sidebar.tsx:16 msgid "Governance" msgstr "" -#: src/views/yield-dtf/settings/components/GovernanceInfo.tsx:35 +#: src/views/yield-dtf/settings/components/governance-info.tsx:29 msgid "Governance Details" msgstr "" -#: src/views/yield-dtf/governance/components/GovernanceOverview.tsx:152 +#: src/views/yield-dtf/governance/components/GovernanceOverview.tsx:162 msgid "Governance format" msgstr "" -#: src/views/yield-dtf/governance/components/GovernanceOverview.tsx:181 +#: src/views/yield-dtf/governance/components/GovernanceOverview.tsx:192 msgid "Governance forum" msgstr "" -#: src/views/yield-dtf/deploy/components/RTokenSetup.tsx:73 +#: src/views/yield-dtf/deploy/components/RTokenSetup.tsx:65 msgid "Governance gets deployed & your RToken is now usable (if unpaused)" msgstr "" @@ -1012,77 +1035,70 @@ msgstr "" msgid "Governance parameters" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/ProposedRolesPreview.tsx:41 -#: src/views/yield-dtf/governance/views/proposal/components/RolesProposal.tsx:37 +#: src/views/yield-dtf/governance/views/proposal/components/ProposedRolesPreview.tsx:45 +#: src/views/yield-dtf/governance/views/proposal/components/RolesProposal.tsx:42 msgid "Governance roles" msgstr "" -#: src/views/yield-dtf/settings/components/GovernanceInfo.tsx:84 +#: src/views/index-dtf/settings/components/index-settings-fees.tsx:43 +msgid "Governance Share" +msgstr "" + +#: src/views/yield-dtf/settings/components/governance-info.tsx:70 msgid "Governor address" msgstr "" -#: src/views/yield-dtf/overview/components/hero/TokenMandate.tsx:58 +#: src/views/index-dtf/settings/components/index-settings-governance.tsx:46 +msgid "Governor Address" +msgstr "" + +#: src/views/yield-dtf/overview/components/hero/token-mandate.tsx:41 msgid "Governor mandate" msgstr "" -#: src/views/yield-dtf/governance/components/GovernanceOverview.tsx:170 +#: src/views/index-dtf/settings/components/index-settings-roles.tsx:50 +#: src/views/yield-dtf/governance/components/GovernanceOverview.tsx:180 msgid "Guardian" msgstr "" -#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:87 +#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:96 msgid "Guardian address" msgstr "" -#: src/components/transactions/table/index.tsx:92 +#: src/components/transactions/table/index.tsx:91 msgid "Hash" msgstr "" -#: src/components/layout/navigation/TokenNavigation.tsx:191 -#: src/views/yield-dtf/overview/components/HistoricalMetrics.tsx:20 +#: src/components/layout/navigation/TokenNavigation.tsx:164 +#: src/views/yield-dtf/overview/components/historical-metrics.tsx:13 msgid "Historical metrics" msgstr "" -#: src/views/explorer/components/tokens/index.tsx:184 +#: src/views/explorer/components/tokens/index.tsx:164 msgid "Holders APY" msgstr "" -#: src/views/bridge/components/BridgeFaq.tsx:105 -msgid "How do I verify my withdrawal transaction?" -msgstr "" - -#: src/views/bridge/components/BridgeFaq.tsx:39 -msgid "How do withdrawals work?" -msgstr "" - -#: src/views/bridge/components/BridgeFaq.tsx:33 -msgid "How fast will my tokens arrive?" -msgstr "" - -#: src/views/discover/components/yield/components/RegisterAbout.tsx:115 -msgid "If an RToken is listed on Register, it doesn't mean that ABC Labs endorses the safety or risk levels of the RToken or that ABC Labs was involved in the creation of or is in anyway responsible for the RToken. ABC Labs requires Github requests with additional information beyond what is available on the blockchain to give users relevant data to make informed decisions. As a user, please evaluate any new RToken carefully before holding or staking your RSR on them." +#: src/views/discover/components/yield/components/RegisterAbout.tsx:122 +msgid "If a DTF is listed on this app, it doesn't mean that ABC Labs endorses the safety or risk levels of the DTF or that ABC Labs was involved in the creation of or is in anyway responsible for the DTF." msgstr "" -#: src/views/bridge/components/BridgeFaq.tsx:98 -msgid "If you prefer not to wait, instead of making a withdrawal using Register L2 Bridge, you also have the option to utilize a third-party bridge for quicker withdrawals." -msgstr "" - -#: src/views/yield-dtf/settings/components/ListingInfo.tsx:31 +#: src/views/yield-dtf/settings/components/listing-info.tsx:44 msgid "If your token is paused and you have the correct role, you can unpause it here." msgstr "" -#: src/views/yield-dtf/staking/components/unstake/UnstakeModal.tsx:50 +#: src/views/yield-dtf/staking/components/unstake/unstake-modal.tsx:49 msgid "Immediate" msgstr "" -#: src/views/yield-dtf/staking/components/withdraw/index.tsx:12 +#: src/views/yield-dtf/staking/components/withdraw/index.tsx:16 msgid "In Withdraw Process" msgstr "" -#: src/views/discover/components/yield/components/TokenList.tsx:22 +#: src/views/discover/components/yield/components/TokenList.tsx:25 msgid "Including off-chain in-app transactions of RToken in the Reserve App." msgstr "" -#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:112 +#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:121 msgid "Initial RToken state after deployment" msgstr "" @@ -1094,7 +1110,7 @@ msgstr "" msgid "Input delay in hours" msgstr "" -#: src/components/rtoken-setup/basket/CustomCollateral.tsx:107 +#: src/components/rtoken-setup/basket/CustomCollateral.tsx:104 msgid "Input plugin address (not ERC-20 address)" msgstr "" @@ -1102,7 +1118,7 @@ msgstr "" msgid "Input proposal threshold" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/ConfirmProposalForm.tsx:62 +#: src/views/yield-dtf/governance/views/proposal/components/ConfirmProposalForm.tsx:54 msgid "Input proposal title" msgstr "" @@ -1110,37 +1126,37 @@ msgstr "" msgid "Input quorum percent" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/ConfirmProposalForm.tsx:70 +#: src/views/yield-dtf/governance/views/proposal/components/ConfirmProposalForm.tsx:62 msgid "Input RFC link" msgstr "" -#: src/components/rtoken-setup/token/RevenueSplit.tsx:119 +#: src/components/rtoken-setup/token/RevenueSplit.tsx:127 msgid "Input RSR stakers revenue distribution" msgstr "" -#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:88 +#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:97 msgid "Input the guardian ethereum address" msgstr "" -#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:68 +#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:77 msgid "Input the owner ethereum address" msgstr "" -#: src/components/rtoken-setup/token/TokenForm.tsx:28 -#: src/views/yield-dtf/deploy/components/TokenForm.tsx:27 +#: src/components/rtoken-setup/token/TokenForm.tsx:29 +#: src/views/yield-dtf/deploy/components/TokenForm.tsx:31 msgid "Input ticker" msgstr "" -#: src/components/rtoken-setup/token/RevenueSplit.tsx:110 +#: src/components/rtoken-setup/token/RevenueSplit.tsx:118 msgid "Input token holders revenue distribution" msgstr "" -#: src/components/rtoken-setup/token/TokenForm.tsx:19 -#: src/views/yield-dtf/deploy/components/TokenForm.tsx:17 +#: src/components/rtoken-setup/token/TokenForm.tsx:20 +#: src/views/yield-dtf/deploy/components/TokenForm.tsx:21 msgid "Input token name" msgstr "" -#: src/views/tokens/components/TableFilters.tsx:26 +#: src/views/tokens/components/TableFilters.tsx:25 msgid "Input token name or symbol" msgstr "" @@ -1148,185 +1164,186 @@ msgstr "" msgid "Input voting period" msgstr "" -#: src/views/explorer/components/transactions/Filters.tsx:24 +#: src/views/explorer/components/transactions/Filters.tsx:22 msgid "Input wallet" msgstr "" -#: src/components/rtoken-setup/token/OtherForm.tsx:48 +#: src/components/rtoken-setup/token/OtherForm.tsx:51 msgid "Input withdrawal leak %" msgstr "" -#: src/components/transactions/manager/TransactionList.tsx:74 -msgid "Inspect" -msgstr "" - -#: src/views/discover/components/yield/components/CompareTokensTitle.tsx:51 +#: src/views/discover/components/yield/components/CompareTokensTitle.tsx:37 msgid "Inspect collateral backing, mint, stake, redeem & explore additional earn opportunities across DeFi" msgstr "" -#: src/components/layout/navigation/TokenNavigation.tsx:188 -#: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:19 -#: src/views/yield-dtf/governance/views/proposal/components/ProposalNavigation.tsx:16 +#: src/components/layout/navigation/TokenNavigation.tsx:161 +#: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:18 +#: src/views/yield-dtf/governance/views/proposal/components/ProposalNavigation.tsx:15 msgid "Intro" msgstr "" -#: src/components/rtoken-setup/atoms.ts:126 +#: src/components/rtoken-setup/atoms.ts:137 msgid "Invalid ({targetUnit}) backup diversity factor" msgstr "" -#: src/components/rtoken-setup/atoms.ts:111 +#: src/components/rtoken-setup/atoms.ts:122 msgid "Invalid ({targetUnit}) basket distribution" msgstr "" -#: src/components/rtoken-setup/atoms.ts:115 +#: src/components/rtoken-setup/atoms.ts:126 msgid "Invalid ({targetUnit}) basket scale" msgstr "" -#: src/components/rtoken-setup/basket/CustomCollateral.tsx:90 -#: src/components/rtoken-setup/components/RolesEdit.tsx:44 -#: src/views/yield-dtf/staking/components/stake/EditDelegate.tsx:53 +#: src/components/rtoken-setup/basket/CustomCollateral.tsx:89 +#: src/components/rtoken-setup/components/RolesEdit.tsx:38 +#: src/views/yield-dtf/staking/components/stake/edit-delegate.tsx:51 msgid "Invalid address" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/RegisterEdit.tsx:43 +#: src/views/yield-dtf/governance/views/proposal/components/RegisterEdit.tsx:34 msgid "Invalid asset" msgstr "" -#: src/components/rtoken-setup/basket/CustomCollateral.tsx:82 +#: src/components/rtoken-setup/basket/CustomCollateral.tsx:81 msgid "Invalid collateral" msgstr "" -#: src/components/rtoken-setup/token/RevenueSplit.tsx:141 +#: src/components/rtoken-setup/token/RevenueSplit.tsx:149 msgid "Invalid destination address" msgstr "" -#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:81 -#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:97 +#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:90 +#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:106 msgid "Invalid ethereum address" msgstr "" -#: src/components/field/index.tsx:31 +#: src/components/field/index.tsx:37 msgid "Invalid maximum range" msgstr "" -#: src/components/field/index.tsx:33 -msgid "Invalid minimum range" +#: src/components/field/index.tsx:39 +msgid "Invalid minimum range " msgstr "" -#: src/components/field/index.tsx:29 +#: src/components/field/index.tsx:35 msgid "Invalid number" msgstr "" -#: src/components/field/index.tsx:35 +#: src/components/field/index.tsx:41 msgid "Invalid value" msgstr "" -#: src/components/rtoken-setup/token/BackingForm.tsx:124 +#: src/components/rtoken-setup/token/BackingForm.tsx:128 msgid "Issuance amount - allows the issuer to limit the amount of RTokens issued per hour. This matters in the event of an exploit where an attacker tries to issue more RTokens. This buys time for users with pause or freeze permissions to reduce the amount of RTokens that can be issued." msgstr "" -#: src/components/rtoken-setup/token/BackingForm.tsx:111 +#: src/components/rtoken-setup/token/BackingForm.tsx:115 msgid "Issuance rate - allows the issuer to limit the amount of RTokens issued per hour based on a percentage of the current RToken market cap. This matters in the event of an exploit where an attacker tries to issue more RTokens. This buys time for users with pause or freeze permissions to reduce the amount of RTokens that can be issued." msgstr "" -#: src/components/rtoken-setup/token/BackingForm.tsx:122 -#: src/components/rtoken-setup/token/BackingForm.tsx:123 -#: src/views/yield-dtf/settings/components/BackingInfo.tsx:87 +#: src/components/rtoken-setup/token/BackingForm.tsx:126 +#: src/components/rtoken-setup/token/BackingForm.tsx:127 +#: src/views/yield-dtf/settings/components/backing-info.tsx:61 msgid "Issuance throttle amount" msgstr "" -#: src/views/yield-dtf/settings/components/BackingInfo.tsx:80 +#: src/views/yield-dtf/settings/components/backing-info.tsx:55 msgid "Issuance throttle rate" msgstr "" -#: src/components/rtoken-setup/token/BackingForm.tsx:110 +#: src/components/rtoken-setup/token/BackingForm.tsx:114 msgid "Issuance throttle Rate" msgstr "" -#: src/components/rtoken-setup/token/BackingForm.tsx:109 +#: src/components/rtoken-setup/token/BackingForm.tsx:113 msgid "Issuance throttle rate (%)" msgstr "" -#: src/components/transactions/table/index.tsx:50 -#: src/views/explorer/components/transactions/useTransactionColumns.tsx:30 -#: src/views/yield-dtf/overview/components/RTokenTransactions.tsx:80 +#: src/components/transactions/table/index.tsx:49 +#: src/views/explorer/components/transactions/useTransactionColumns.tsx:29 +#: src/views/yield-dtf/overview/components/rtoken-transactions.tsx:77 msgid "Issue" msgstr "" -#: src/views/yield-dtf/settings/components/SettingItem.tsx:60 +#: src/components/layout/header/components/app-navigation.tsx:146 +msgid "Join the conversation or ask questions" +msgstr "" + +#: src/views/yield-dtf/settings/components/setting-item.tsx:60 msgid "Loading..." msgstr "" -#: src/views/yield-dtf/settings/components/FreezeManager.tsx:68 -#: src/views/yield-dtf/settings/components/FreezeManager.tsx:72 +#: src/views/yield-dtf/settings/components/freeze-manager.tsx:67 +#: src/views/yield-dtf/settings/components/freeze-manager.tsx:71 msgid "Long Freeze" msgstr "" -#: src/views/yield-dtf/settings/components/OtherInfo.tsx:26 +#: src/views/yield-dtf/settings/components/other-info.tsx:18 msgid "Long freeze duration" msgstr "" -#: src/components/rtoken-setup/token/OtherForm.tsx:35 -msgid "Long freeze duration - freeze an RToken’s system for a longer period of time. A long-freezer has 6 charges before losing the ability to freeze any more" +#: src/components/rtoken-setup/token/OtherForm.tsx:38 +msgid "Long freeze duration - freeze an RToken's system for a longer period of time. A long-freezer has 6 charges before losing the ability to freeze any more" msgstr "" -#: src/components/rtoken-setup/token/OtherForm.tsx:33 +#: src/components/rtoken-setup/token/OtherForm.tsx:36 msgid "Long freeze duration (s)" msgstr "" -#: src/components/rtoken-setup/basket/CustomCollateral.tsx:136 +#: src/components/rtoken-setup/basket/CustomCollateral.tsx:132 msgid "Made your own collateral?" msgstr "" -#: src/views/yield-dtf/settings/components/ContractsInfo.tsx:20 +#: src/views/yield-dtf/settings/components/contracts-info.tsx:16 msgid "Main" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/Intro.tsx:17 +#: src/views/yield-dtf/governance/views/proposal/components/Intro.tsx:23 msgid "Make proposed changes to the backing basket, emergency collateral, governance params, etc. Changes in multiple areas can be batched into a single proposal although to make voting on issues simpler it may make sense to separate things if unrelated." msgstr "" -#: src/components/rtoken-setup/token/TokenForm.tsx:36 -#: src/views/yield-dtf/deploy/components/TokenForm.tsx:45 -#: src/views/yield-dtf/settings/components/BasicInfo.tsx:24 +#: src/components/rtoken-setup/token/TokenForm.tsx:37 +#: src/views/index-dtf/settings/components/index-settings-basic.tsx:32 +#: src/views/yield-dtf/deploy/components/TokenForm.tsx:49 +#: src/views/yield-dtf/settings/components/basic-info.tsx:20 msgid "Mandate" msgstr "" -#: src/components/rtoken-setup/token/TokenForm.tsx:44 -#: src/views/yield-dtf/deploy/components/TokenForm.tsx:54 +#: src/components/rtoken-setup/token/TokenForm.tsx:45 +#: src/views/yield-dtf/deploy/components/TokenForm.tsx:58 msgid "Mandate cannot be longer than 256 characters" msgstr "" -#: src/components/rtoken-setup/token/TokenForm.tsx:41 -#: src/views/yield-dtf/deploy/components/TokenForm.tsx:51 +#: src/components/rtoken-setup/token/TokenForm.tsx:42 +#: src/views/yield-dtf/deploy/components/TokenForm.tsx:55 msgid "Mandate is required" msgstr "" -#: src/views/discover/components/yield/components/RTokenCard.tsx:167 +#: src/views/discover/components/yield/components/TokenStats.tsx:26 msgid "Market cap:" msgstr "" -#: src/views/yield-dtf/settings/components/BackingInfo.tsx:73 +#: src/views/yield-dtf/settings/components/backing-info.tsx:51 msgid "Max trade slippage" msgstr "" -#: src/components/rtoken-setup/token/BackingForm.tsx:98 +#: src/components/rtoken-setup/token/BackingForm.tsx:102 msgid "Max trade slippage — maximum deviation from oracle prices that any trade can clear at. Why this matters? Acts as a form of slippage protection." msgstr "" -#: src/components/rtoken-setup/token/BackingForm.tsx:96 +#: src/components/rtoken-setup/token/BackingForm.tsx:100 msgid "Max trade slippage (%)" msgstr "" -#: src/components/rtoken-setup/token/OtherForm.tsx:101 +#: src/components/rtoken-setup/token/OtherForm.tsx:104 msgid "Maximum trade for RToken" msgstr "" -#: src/components/rtoken-setup/token/OtherForm.tsx:102 +#: src/components/rtoken-setup/token/OtherForm.tsx:105 msgid "Maximum trade volume - maximum sized trade for any trade involving RToken, in terms of the unit of account eg. USD." msgstr "" -#: src/views/yield-dtf/staking/components/overview/About.tsx:19 +#: src/views/yield-dtf/staking/components/overview/about.tsx:24 msgid "Mechanics" msgstr "" @@ -1334,9 +1351,9 @@ msgstr "" msgid "Meditate peacefully on the stability of a future asset backed reserve currency while your RToken deploys 🧘‍♂️" msgstr "" -#: src/components/transactions/table/index.tsx:49 -#: src/views/explorer/components/transactions/useTransactionColumns.tsx:29 -#: src/views/yield-dtf/overview/components/RTokenTransactions.tsx:79 +#: src/components/transactions/table/index.tsx:48 +#: src/views/explorer/components/transactions/useTransactionColumns.tsx:28 +#: src/views/yield-dtf/overview/components/rtoken-transactions.tsx:76 msgid "Melt" msgstr "" @@ -1344,44 +1361,45 @@ msgstr "" msgid "Melting" msgstr "" -#: src/components/rtoken-setup/token/OtherForm.tsx:88 +#: src/components/rtoken-setup/token/OtherForm.tsx:91 msgid "Minimum trade in USD terms" msgstr "" -#: src/views/yield-dtf/auctions/auctions-sidebar/RevenueAuctionItem.tsx:74 +#: src/views/yield-dtf/auctions/auctions-sidebar/RevenueAuctionItem.tsx:117 msgid "Minimum trade size" msgstr "" -#: src/views/yield-dtf/settings/components/OtherInfo.tsx:43 +#: src/views/yield-dtf/settings/components/other-info.tsx:30 msgid "Minimum trade volume" msgstr "" -#: src/components/rtoken-setup/token/OtherForm.tsx:89 +#: src/components/rtoken-setup/token/OtherForm.tsx:92 msgid "Minimum trade volume - minimum sized trade that can be performed, in terms of the unit of account eg. USD." msgstr "" -#: src/components/rtoken-setup/token/OtherForm.tsx:87 +#: src/components/rtoken-setup/token/OtherForm.tsx:90 msgid "Minimum trade volume ($)" msgstr "" -#: src/components/layout/navigation/TokenNavigation.tsx:197 -#: src/components/transactions/table/index.tsx:46 -#: src/views/explorer/components/transactions/useTransactionColumns.tsx:26 -#: src/views/yield-dtf/issuance/components/issue/Issue.tsx:94 -#: src/views/yield-dtf/overview/components/RTokenTransactions.tsx:76 +#: src/components/layout/navigation/TokenNavigation.tsx:170 +#: src/components/transactions/table/index.tsx:45 +#: src/views/explorer/components/transactions/useTransactionColumns.tsx:25 +#: src/views/yield-dtf/issuance/components/issue/Issue.tsx:96 +#: src/views/yield-dtf/overview/components/rtoken-transactions.tsx:73 msgid "Mint" msgstr "" -#: src/views/yield-dtf/issuance/components/issue/IssuanceInfo.tsx:174 +#: src/views/yield-dtf/issuance/components/issue/IssuanceInfo.tsx:144 msgid "Mint - Global throttle" msgstr "" +#. placeholder {0}: rToken?.symbol #: src/views/yield-dtf/issuance/components/issue/ConfirmIssuance.tsx:101 msgid "Mint {0}" msgstr "" -#: src/components/layout/navigation/index.tsx:110 -#: src/views/index-dtf/components/navigation/index.tsx:75 +#: src/components/layout/navigation/index.tsx:77 +#: src/views/index-dtf/components/navigation/index.tsx:120 msgid "Mint + Redeem" msgstr "" @@ -1389,66 +1407,63 @@ msgstr "" msgid "Mint amount" msgstr "" -#: src/views/yield-dtf/issuance/components/issue/IssuanceInfo.tsx:175 +#: src/views/yield-dtf/issuance/components/issue/Issue.tsx:112 +msgid "Mint disabled" +msgstr "" + +#: src/views/yield-dtf/issuance/components/issue/IssuanceInfo.tsx:145 msgid "Mintable now" msgstr "" -#: src/views/yield-dtf/issuance/components/about/index.tsx:17 +#: src/views/index-dtf/settings/components/index-settings-fees.tsx:103 +msgid "Minting Fee" +msgstr "" + +#: src/views/yield-dtf/issuance/components/about/index.tsx:16 msgid "Minting requires a deposit of the defined collateral tokens in equal value amounts to the RToken smart contracts." msgstr "" -#: src/views/yield-dtf/issuance/components/issue/Issue.tsx:110 +#: src/views/yield-dtf/issuance/components/issue/Issue.tsx:114 msgid "Missing collateral" msgstr "" #: src/components/tables/ListedTokensTable.tsx:41 -#: src/views/explorer/components/tokens/index.tsx:172 -#: src/views/tokens/components/UnlistedTokensTable.tsx:85 +#: src/views/explorer/components/tokens/index.tsx:152 +#: src/views/tokens/components/UnlistedTokensTable.tsx:84 msgid "Mkt Cap" msgstr "" -#: src/utils/index.ts:82 +#: src/utils/index.ts:129 msgid "mth" msgstr "" -#: src/views/yield-dtf/settings/components/BasicInfo.tsx:22 -#: src/views/yield-dtf/settings/components/GovernanceInfo.tsx:38 +#: src/views/index-dtf/settings/components/index-settings-basic.tsx:15 +#: src/views/yield-dtf/settings/components/basic-info.tsx:15 +#: src/views/yield-dtf/settings/components/governance-info.tsx:30 msgid "Name" msgstr "" -#: src/views/bridge/components/BridgeFaq.tsx:106 -msgid "Navigate to the Withdrawal tab and view transactions below. Next to your transaction, use the button to complete the next available action. This action will ask you to complete the next required step to move your transaction forward and receive your withdrawn tokens in your wallet." -msgstr "" - -#: src/views/bridge/components/BridgeFaq.tsx:23 -msgid "Need help bridging?" -msgstr "" - -#: src/views/bridge/components/BridgeHeader.tsx:95 -msgid "Need help?" -msgstr "" - -#: src/components/account/index.tsx:33 -#: src/components/tables/ListedTokensTable.tsx:68 -#: src/views/explorer/components/tokens/index.tsx:152 -#: src/views/tokens/components/TableFilters.tsx:42 -#: src/views/tokens/components/UnlistedTokensTable.tsx:115 +#: src/components/account/index.tsx:38 +#: src/components/tables/ListedTokensTable.tsx:59 +#: src/views/explorer/components/tokens/index.tsx:132 +#: src/views/tokens/components/TableFilters.tsx:41 +#: src/views/tokens/components/UnlistedTokensTable.tsx:109 msgid "Network" msgstr "" -#: src/views/explorer/components/filters/ChainFilter.tsx:23 +#: src/views/explorer/components/filters/ChainFilter.tsx:22 msgid "Networks" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/ProposedBackupPreview.tsx:80 +#: src/views/yield-dtf/governance/views/proposal/components/ProposedBackupPreview.tsx:90 msgid "New backup configuration" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/ProposedBasketPreview.tsx:29 +#: src/views/yield-dtf/governance/views/proposal/components/ProposedBasketPreview.tsx:39 msgid "New primary basket" msgstr "" -#: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:29 +#: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:28 msgid "Next steps" msgstr "" @@ -1456,63 +1471,56 @@ msgstr "" msgid "No actionable revenue available" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/UnregisterEdit.tsx:40 +#: src/views/yield-dtf/governance/views/proposal/components/UnregisterEdit.tsx:34 msgid "No assets to unregister..." msgstr "" -#: src/components/charts/area/AreaChart.tsx:133 +#: src/components/charts/area/AreaChart.tsx:132 msgid "No data" msgstr "" -#: src/components/rtoken-setup/basket/BackupBasket.tsx:82 +#: src/components/rtoken-setup/basket/BackupBasket.tsx:85 msgid "No emergency collateral for target" msgstr "" -#: src/views/yield-dtf/settings/components/EmergencyCollateralInfo.tsx:61 +#: src/views/yield-dtf/settings/components/emergency-collateral-info.tsx:57 msgid "No emergency collateral for this target unit" msgstr "" -#: src/views/yield-dtf/auctions/components/EndedAuctionsSkeleton.tsx:16 +#: src/views/yield-dtf/auctions/components/EndedAuctionsSkeleton.tsx:7 msgid "No ended auctions" msgstr "" -#: src/components/rtoken-setup/components/RolesEdit.tsx:104 +#: src/components/rtoken-setup/components/RolesEdit.tsx:95 msgid "No holders for this role..." msgstr "" -#: src/components/rtoken-setup/basket/CollateralModal.tsx:166 +#: src/components/rtoken-setup/basket/CollateralModal.tsx:150 msgid "No plugins available" msgstr "" -#: src/views/yield-dtf/governance/components/ProposalList.tsx:234 +#: src/views/yield-dtf/governance/components/ProposalList.tsx:199 msgid "No proposals created..." msgstr "" -#: src/components/transactions/table/index.tsx:162 +#: src/components/transactions/table/index.tsx:152 msgid "No transactions" msgstr "" -#: src/components/transactions/manager/TransactionList.tsx:107 -msgid "No transactions in local memory..." -msgstr "" - -#: src/views/yield-dtf/governance/components/TopVoters.tsx:160 +#: src/views/yield-dtf/governance/components/TopVoters.tsx:148 msgid "No voters at this moment..." msgstr "" -#: src/views/yield-dtf/governance/views/proposal-detail/components/ProposalVotes.tsx:167 +#: src/views/index-dtf/governance/views/proposal/components/proposal-detail-votes.tsx:49 +#: src/views/yield-dtf/governance/views/proposal-detail/components/ProposalVotes.tsx:135 msgid "No votes" msgstr "" -#: src/views/bridge/components/BridgeWithdrawals.tsx:60 -msgid "No withdrawals found for connected wallet." +#: src/views/index-dtf/settings/components/index-settings-governance.tsx:122 +msgid "Non-Basket Governance" msgstr "" -#: src/views/bridge/components/BridgeFaq.tsx:84 -msgid "No, if a withdrawal has already been initiated on the Withdraw page it is not possible to cancel it. Once withdrawn, the process needs to be completed." -msgstr "" - -#: src/views/yield-dtf/governance/views/proposal/components/SpellUpgrade.tsx:63 +#: src/views/yield-dtf/governance/views/proposal/components/SpellUpgrade.tsx:66 msgid "None" msgstr "" @@ -1520,120 +1528,116 @@ msgstr "" msgid "Not available" msgstr "" -#: src/views/yield-dtf/settings/components/FreezeManager.tsx:104 +#: src/views/yield-dtf/settings/components/freeze-manager.tsx:100 msgid "Not frozen" msgstr "" -#: src/views/yield-dtf/deploy/components/GovernanceOverview.tsx:132 +#: src/views/yield-dtf/deploy/components/GovernanceOverview.tsx:127 msgid "Not ready to set up governance?" msgstr "" -#: src/views/discover/components/yield/components/RegisterAbout.tsx:158 -msgid "Not sure what you're looking at?" -msgstr "" - -#: src/views/yield-dtf/auctions/batch/components/OngoingAuctions.tsx:16 +#: src/views/yield-dtf/auctions/batch/components/OngoingAuctions.tsx:19 msgid "Ongoing auctions" msgstr "" -#: src/views/yield-dtf/auctions/dutch/components/OngoingDutchAuctions.tsx:14 +#: src/views/yield-dtf/auctions/dutch/components/OngoingDutchAuctions.tsx:13 msgid "Ongoing dutch auctions" msgstr "" -#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:131 +#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:146 msgid "Only the guardian address or governance will be able to unpause" msgstr "" -#: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:25 +#: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:24 msgid "Other" msgstr "" -#: src/components/layout/navigation/TokenNavigation.tsx:226 -#: src/views/yield-dtf/governance/views/proposal/components/ProposalNavigation.tsx:18 -#: src/views/yield-dtf/settings/components/NavigationSidebar.tsx:16 +#: src/components/layout/navigation/TokenNavigation.tsx:199 +#: src/views/yield-dtf/governance/views/proposal/components/ProposalNavigation.tsx:17 +#: src/views/yield-dtf/settings/components/navigation-sidebar.tsx:15 msgid "Other config" msgstr "" -#: src/views/yield-dtf/deploy/components/OtherSetup.tsx:8 +#: src/views/yield-dtf/deploy/components/OtherSetup.tsx:13 msgid "Other parameters" msgstr "" -#: src/views/yield-dtf/settings/components/OtherInfo.tsx:17 +#: src/views/yield-dtf/settings/components/other-info.tsx:11 msgid "Other Parameters" msgstr "" -#: src/views/yield-dtf/overview/components/backing/Risks.tsx:118 +#: src/views/yield-dtf/overview/components/backing/risks.tsx:109 msgid "Other Risks" msgstr "" -#: src/components/layout/navigation/index.tsx:109 -#: src/components/layout/navigation/TokenNavigation.tsx:185 -#: src/views/index-dtf/components/navigation/index.tsx:70 +#: src/components/layout/navigation/index.tsx:76 +#: src/components/layout/navigation/TokenNavigation.tsx:158 +#: src/views/index-dtf/components/navigation/index.tsx:115 msgid "Overview" msgstr "" -#: src/views/yield-dtf/governance/components/GovernanceOverview.tsx:164 +#: src/views/yield-dtf/governance/components/GovernanceOverview.tsx:174 msgid "Owner" msgstr "" -#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:67 +#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:76 msgid "Owner address" msgstr "" -#: src/views/yield-dtf/settings/components/BasicInfo.tsx:38 +#: src/views/yield-dtf/settings/components/basic-info.tsx:32 msgid "Owner Address" msgstr "" -#: src/views/yield-dtf/governance/views/proposal-detail/components/ContractProposalDetails.tsx:128 +#: src/views/yield-dtf/governance/views/proposal-detail/components/ContractProposalDetails.tsx:113 msgid "Parameters" msgstr "" -#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:116 +#: src/components/layout/header/components/app-navigation.tsx:76 +msgid "Participate & Earn" +msgstr "" + +#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:127 msgid "Pause status" msgstr "" -#: src/views/discover/components/yield/components/RTokenCard.tsx:197 +#: src/views/discover/components/yield/components/TokenStats.tsx:46 msgid "Peg:" msgstr "" -#: src/views/yield-dtf/auctions/dutch/components/PendingToSettleAuctions.tsx:19 +#: src/views/yield-dtf/auctions/dutch/components/PendingToSettleAuctions.tsx:24 msgid "Pending auctions to settle" msgstr "" #: src/components/transaction-modal/index.tsx:154 #: src/views/yield-dtf/deploy/components/DeployOverview.tsx:25 -#: src/views/yield-dtf/deploy/components/GovernanceOverview.tsx:24 -#: src/views/yield-dtf/governance/views/proposal/components/ConfirmProposalOverview.tsx:55 +#: src/views/yield-dtf/deploy/components/GovernanceOverview.tsx:25 +#: src/views/yield-dtf/governance/views/proposal/components/ConfirmProposalOverview.tsx:57 msgid "Pending, sign in wallet" msgstr "" -#: src/components/rtoken-setup/token/BackingForm.tsx:42 +#: src/components/rtoken-setup/token/BackingForm.tsx:46 msgid "Period in seconds" msgstr "" -#: src/views/bridge/components/BridgeWithdrawals.tsx:25 -msgid "Phase" -msgstr "" - -#: src/components/transactions/table/index.tsx:92 -#: src/views/explorer/components/transactions/useTransactionColumns.tsx:132 +#: src/components/transactions/table/index.tsx:91 +#: src/views/explorer/components/transactions/useTransactionColumns.tsx:131 msgid "Platform" msgstr "" -#: src/views/yield-dtf/overview/components/CollateralPieChartTooltip.tsx:212 +#: src/views/yield-dtf/overview/components/collateral-pie-chart-tooltip.tsx:178 msgid "Platform exposure" msgstr "" -#: src/views/yield-dtf/staking/components/overview/About.tsx:45 +#: src/views/yield-dtf/staking/components/overview/about.tsx:50 msgid "Please carefully evaluate the RToken before choosing to stake your RSR here. If any of the various collaterals of this RToken default, then the staked RSR will be the first funds that get auctioned off to make up the difference for RToken holders." msgstr "" -#: src/views/yield-dtf/settings/components/GovernancePrompt.tsx:43 +#: src/views/yield-dtf/settings/components/governance-prompt.tsx:24 msgid "Please complete the required governance configuration to complete deployment." msgstr "" -#: src/views/portfolio/components/Portfolio.tsx:141 -#: src/views/yield-dtf/auctions/auctions-sidebar/claim-rewards/components/ClaimFromTraderButton.tsx:75 +#: src/views/portfolio/components/Portfolio.tsx:123 +#: src/views/yield-dtf/auctions/auctions-sidebar/claim-rewards/components/ClaimFromTraderButton.tsx:74 msgid "Please connect your wallet" msgstr "" @@ -1641,15 +1645,15 @@ msgstr "" msgid "Please don't close this window to avoid issues finding your way back here." msgstr "" -#: src/views/discover/components/yield/components/RegisterAbout.tsx:138 +#: src/views/discover/components/yield/components/RegisterAbout.tsx:149 msgid "Please keep in mind that interactions with the Ethereum or Base blockchains are pseudonymous and publicly available." msgstr "" -#: src/views/yield-dtf/settings/components/ListingInfo.tsx:10 +#: src/views/yield-dtf/settings/components/listing-info.tsx:22 msgid "Please read more about how Register manage tokens on our repository" msgstr "" -#: src/views/yield-dtf/auctions/auctions-sidebar/claim-rewards/components/ClaimFromTraderButton.tsx:73 +#: src/views/yield-dtf/auctions/auctions-sidebar/claim-rewards/components/ClaimFromTraderButton.tsx:72 msgid "Please select an asset to claim" msgstr "" @@ -1657,24 +1661,23 @@ msgstr "" msgid "Please sign the transaction in your wallet to continue with the deployment process." msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/ConfirmProposalOverview.tsx:58 +#: src/views/yield-dtf/governance/views/proposal/components/ConfirmProposalOverview.tsx:60 msgid "Please sign the transaction in your wallet to continue with the governance process." msgstr "" -#: src/views/yield-dtf/deploy/components/GovernanceOverview.tsx:27 +#: src/views/yield-dtf/deploy/components/GovernanceOverview.tsx:28 msgid "Please sign the transaction in your wallet to continue with the government configuration process." msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/SimulateProposal.tsx:45 +#: src/views/yield-dtf/governance/views/proposal/components/SimulateProposal.tsx:43 msgid "Please wait while the simulation executes" msgstr "" -#: src/views/earn/hooks/useEarnTableColumns.tsx:70 +#: src/views/earn/hooks/useEarnTableColumns.tsx:62 msgid "Pool" msgstr "" -#: src/components/layout/header/components/HeaderMenu.tsx:56 -#: src/views/portfolio/components/Portfolio.tsx:126 +#: src/views/portfolio/components/Portfolio.tsx:114 msgid "Portfolio" msgstr "" @@ -1683,33 +1686,37 @@ msgid "Preparing transaction" msgstr "" #: src/components/tables/ListedTokensTable.tsx:37 -#: src/views/explorer/components/tokens/index.tsx:168 -#: src/views/tokens/components/UnlistedTokensTable.tsx:81 +#: src/views/explorer/components/tokens/index.tsx:148 +#: src/views/tokens/components/UnlistedTokensTable.tsx:80 msgid "Price" msgstr "" -#: src/components/layout/navigation/TokenNavigation.tsx:222 -#: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:21 -#: src/views/yield-dtf/governance/views/proposal/components/ProposalNavigation.tsx:21 -#: src/views/yield-dtf/governance/views/proposal/components/ProposedBasketPreview.tsx:54 -#: src/views/yield-dtf/settings/components/NavigationSidebar.tsx:12 +#: src/components/layout/navigation/TokenNavigation.tsx:195 +#: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:20 +#: src/views/yield-dtf/governance/views/proposal/components/ProposalNavigation.tsx:20 +#: src/views/yield-dtf/governance/views/proposal/components/ProposedBasketPreview.tsx:64 +#: src/views/yield-dtf/settings/components/navigation-sidebar.tsx:11 msgid "Primary basket" msgstr "" -#: src/components/rtoken-setup/basket/PrimaryBasket.tsx:87 -#: src/views/yield-dtf/settings/components/BasketInfo.tsx:20 +#: src/components/rtoken-setup/basket/PrimaryBasket.tsx:199 +#: src/views/yield-dtf/settings/components/basket-info.tsx:15 msgid "Primary Basket" msgstr "" -#: src/components/rtoken-setup/atoms.ts:102 +#: src/components/rtoken-setup/atoms.ts:113 msgid "Primary basket not defined" msgstr "" -#: src/views/yield-dtf/staking/components/stake/ConfirmStakeButton.tsx:98 +#: src/views/yield-dtf/staking/components/stake/confirm-stake-button.tsx:95 msgid "Proceed in wallet" msgstr "" -#: src/views/earn/hooks/useEarnTableColumns.tsx:130 +#: src/views/yield-dtf/staking/components/withdraw/available-unstake.tsx:76 +msgid "Processing..." +msgstr "" + +#: src/views/earn/hooks/useEarnTableColumns.tsx:102 msgid "Project" msgstr "" @@ -1717,7 +1724,8 @@ msgstr "" msgid "Proposal execution delay (hours)" msgstr "" -#: src/views/yield-dtf/settings/components/GovernanceInfo.tsx:65 +#: src/views/index-dtf/settings/components/index-settings-governance.tsx:70 +#: src/views/yield-dtf/settings/components/governance-info.tsx:54 msgid "Proposal Threshold" msgstr "" @@ -1725,58 +1733,61 @@ msgstr "" msgid "Proposal Threshold (%)" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/ConfirmProposalForm.tsx:57 +#: src/views/yield-dtf/governance/views/proposal/components/ConfirmProposalForm.tsx:49 msgid "Proposal Title" msgstr "" -#: src/views/explorer/components/governance/index.tsx:94 -#: src/views/yield-dtf/governance/components/GovernanceOverview.tsx:112 +#: src/views/explorer/components/governance/index.tsx:97 +#: src/views/index-dtf/governance/components/governance-stats.tsx:74 +#: src/views/yield-dtf/governance/components/GovernanceOverview.tsx:122 msgid "Proposals" msgstr "" -#: src/views/yield-dtf/governance/components/TopVoters.tsx:129 +#: src/views/yield-dtf/governance/components/TopVoters.tsx:130 msgid "Proposals voted" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/Intro.tsx:14 +#. placeholder {0}: rToken?.symbol +#: src/views/yield-dtf/governance/views/proposal/components/Intro.tsx:20 msgid "Propose changes to ${0}" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/ProposalBasketSetup.tsx:70 -msgid "Propose how the basket should be distributed going forward." +#: src/views/yield-dtf/governance/views/proposal/components/ProposalBasketSetup.tsx:55 +msgid "Propose how the basket should be distributed going forward. " msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/ProposalBasketSetup.tsx:100 +#: src/views/yield-dtf/governance/views/proposal/components/ProposalBasketSetup.tsx:86 msgid "Propose new backup configuration" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/ProposalBasketSetup.tsx:80 +#: src/views/yield-dtf/governance/views/proposal/components/ProposalBasketSetup.tsx:66 msgid "Propose new basket" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/ItemPreview.tsx:96 +#: src/views/yield-dtf/governance/views/proposal/components/ItemPreview.tsx:92 msgid "Proposed" msgstr "" +#: src/views/index-dtf/governance/views/proposal/components/vote-modal.tsx:107 #: src/views/yield-dtf/governance/views/proposal-detail/components/VoteModal.tsx:93 msgid "Proposed by" msgstr "" -#: src/components/layout/header/components/RegisterHelp.tsx:71 -#: src/views/yield-dtf/deploy/components/Intro.tsx:52 -#: src/views/yield-dtf/governance/views/proposal/components/Intro.tsx:36 +#: src/views/yield-dtf/deploy/components/Intro.tsx:51 +#: src/views/yield-dtf/governance/views/proposal/components/Intro.tsx:44 msgid "Protocol Docs" msgstr "" -#: src/views/earn/index.tsx:60 -msgid "Provide liquidity across DeFi & earn more with your RTokens" +#: src/views/earn/views/defi/components/earn-heading.tsx:15 +msgid "Provide liquidity across DeFi & earn more with your DTFs" msgstr "" -#: src/views/yield-dtf/governance/views/proposal-detail/components/ProposalQueue.tsx:32 +#: src/views/index-dtf/governance/views/proposal/components/proposal-queue-button.tsx:78 +#: src/views/yield-dtf/governance/views/proposal-detail/components/ProposalQueue.tsx:31 msgid "Queue proposal" msgstr "" -#: src/views/yield-dtf/settings/components/GovernanceInfo.tsx:70 +#: src/views/yield-dtf/settings/components/governance-info.tsx:58 msgid "Quorum" msgstr "" @@ -1788,33 +1799,34 @@ msgstr "" msgid "Quorum?:" msgstr "" -#: src/components/rtoken-setup/token/RevenueSplit.tsx:169 +#: src/components/rtoken-setup/token/RevenueSplit.tsx:183 msgid "Read more about revenue distribution" msgstr "" -#: src/components/rtoken-setup/token/ExternalRevenueSplit.tsx:120 +#: src/components/rtoken-setup/token/ExternalRevenueSplit.tsx:108 msgid "Receiving eth address" msgstr "" -#: src/views/yield-dtf/governance/components/ProposalList.tsx:203 +#: src/views/yield-dtf/governance/components/ProposalList.tsx:183 msgid "Recent proposals" msgstr "" -#: src/views/tokens/components/TableFilters.tsx:72 +#: src/views/tokens/components/TableFilters.tsx:70 msgid "Record limit" msgstr "" -#: src/components/transactions/table/index.tsx:47 -#: src/views/explorer/components/transactions/useTransactionColumns.tsx:27 +#: src/components/transactions/table/index.tsx:46 +#: src/views/explorer/components/transactions/useTransactionColumns.tsx:26 #: src/views/yield-dtf/issuance/components/redeem/RedeemInput.tsx:15 -#: src/views/yield-dtf/overview/components/RTokenTransactions.tsx:77 +#: src/views/yield-dtf/overview/components/rtoken-transactions.tsx:74 msgid "Redeem" msgstr "" -#: src/views/yield-dtf/issuance/components/issue/IssuanceInfo.tsx:194 +#: src/views/yield-dtf/issuance/components/issue/IssuanceInfo.tsx:164 msgid "Redeem - Global throttle" msgstr "" +#. placeholder {0}: rToken?.symbol #: src/views/yield-dtf/issuance/components/redeem/ConfirmRedemption.tsx:95 #: src/views/yield-dtf/issuance/components/redeem/ConfirmRedemption.tsx:96 msgid "Redeem {0}" @@ -1824,220 +1836,213 @@ msgstr "" msgid "Redeem amount" msgstr "" -#: src/views/yield-dtf/issuance/components/issue/IssuanceInfo.tsx:195 +#: src/views/yield-dtf/issuance/components/issue/IssuanceInfo.tsx:165 msgid "Redeemable now" msgstr "" -#: src/components/rtoken-setup/token/BackingForm.tsx:150 +#: src/components/rtoken-setup/token/BackingForm.tsx:154 msgid "Redemption amount - allows the issuer to limit the amount of RTokens redeemed per hour. This matters in the event of an exploit where an attacker tries to redeem RTokens.This buys time for users with pause or freeze permissions to reduce the amount of RTokens that can be redeemed." msgstr "" -#: src/components/rtoken-setup/token/BackingForm.tsx:137 +#: src/components/rtoken-setup/token/BackingForm.tsx:141 msgid "Redemption rate - allows the issuer to limit the amount of RTokens redeemed per hour based on a percentage of the current RToken market cap. This matters in the event of an exploit where an attacker tries to redeem RTokens. This buys time for users with pause or freeze permissions to reduce the amount of RTokens that can be redeemed." msgstr "" -#: src/components/rtoken-setup/token/BackingForm.tsx:148 -#: src/components/rtoken-setup/token/BackingForm.tsx:149 -#: src/views/yield-dtf/settings/components/BackingInfo.tsx:107 +#: src/components/rtoken-setup/token/BackingForm.tsx:152 +#: src/components/rtoken-setup/token/BackingForm.tsx:153 +#: src/views/yield-dtf/settings/components/backing-info.tsx:75 msgid "Redemption throttle amount" msgstr "" -#: src/views/yield-dtf/settings/components/BackingInfo.tsx:98 +#: src/views/yield-dtf/settings/components/backing-info.tsx:69 msgid "Redemption throttle rate" msgstr "" -#: src/components/rtoken-setup/token/BackingForm.tsx:136 +#: src/components/rtoken-setup/token/BackingForm.tsx:140 msgid "Redemption throttle Rate" msgstr "" -#: src/components/rtoken-setup/token/BackingForm.tsx:135 +#: src/components/rtoken-setup/token/BackingForm.tsx:139 msgid "Redemption throttle rate (%)" msgstr "" -#: src/views/index-dtf/deploy/steps/confirm-deploy/simple/index.tsx:39 +#: src/views/index-dtf/deploy/steps/confirm-deploy/simple/index.tsx:54 msgid "Refresh quote" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/RegisterProposal.tsx:26 +#: src/views/yield-dtf/governance/views/proposal/components/RegisterProposal.tsx:31 msgid "Register Assets" msgstr "" -#: src/components/layout/header/components/RegisterHelp.tsx:66 -msgid "Register Feedback" -msgstr "" - -#: src/views/discover/components/yield/components/RegisterAbout.tsx:108 -msgid "Register is an open source project developed and maintained by ABC Labs as the first dApp to interact with the Reserve Protocol and various RTokens deployed with the platform." -msgstr "" - -#: src/views/bridge/components/BridgeFaq.tsx:28 -msgid "Register L2 Bridge enables the transfer of certain digital assets and other data back and forth between Ethereum and Base." -msgstr "" - -#: src/views/tokens/Tokens.tsx:15 +#: src/views/tokens/Tokens.tsx:14 msgid "Register listed RTokens" msgstr "" -#: src/views/yield-dtf/settings/components/ListingInfo.tsx:9 +#: src/views/yield-dtf/settings/components/listing-info.tsx:21 msgid "Register Listing" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/ProposedRegisterPreview.tsx:28 +#: src/views/yield-dtf/governance/views/proposal/components/ProposedRegisterPreview.tsx:32 msgid "Registering assets" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/RegisterProposal.tsx:36 +#: src/views/yield-dtf/governance/views/proposal/components/RegisterProposal.tsx:41 msgid "Registration of an asset plugin enables the RToken to price an underlying ERC20 token. Where an asset plugin for the underlying token already exists, the existing asset plugin is replaced with the new one." msgstr "" -#: src/views/yield-dtf/issuance/components/about/index.tsx:14 -msgid "Regular minting" +#: src/views/yield-dtf/issuance/components/about/index.tsx:13 +msgid "Regular minting " msgstr "" -#: src/views/yield-dtf/settings/components/ContractsInfo.tsx:35 +#: src/views/yield-dtf/settings/components/contracts-info.tsx:29 msgid "Related Contracts" msgstr "" -#: src/components/rtoken-setup/components/RolesEdit.tsx:139 -#: src/views/yield-dtf/governance/views/proposal/components/ItemPreview.tsx:43 -#: src/views/yield-dtf/governance/views/proposal/components/ListItemPreview.tsx:21 -#: src/views/yield-dtf/governance/views/proposal/components/ProposedRevenueSplitPreview.tsx:127 +#: src/components/rtoken-setup/components/RolesEdit.tsx:121 +#: src/views/yield-dtf/governance/views/proposal/components/ItemPreview.tsx:45 +#: src/views/yield-dtf/governance/views/proposal/components/ListItemPreview.tsx:22 +#: src/views/yield-dtf/governance/views/proposal/components/ProposedRevenueSplitPreview.tsx:130 msgid "Remove" msgstr "" -#: src/views/bridge/components/WithdrawalInfoModal.tsx:55 -msgid "Request sent" -msgstr "" - -#: src/views/yield-dtf/settings/components/GovernancePrompt.tsx:36 +#: src/views/yield-dtf/settings/components/governance-prompt.tsx:17 msgid "Required setup:" msgstr "" -#: src/views/yield-dtf/issuance/components/balances/CollateralBalance.tsx:52 +#: src/views/yield-dtf/issuance/components/balances/CollateralBalance.tsx:53 msgid "Required:" msgstr "" -#: src/views/discover/components/yield/components/RegisterAbout.tsx:94 +#: src/views/discover/components/yield/components/RegisterAbout.tsx:101 msgid "Reserve aims to help people around the world maintain their spending power by allowing anyone to create asset-backed currencies with tokenized assets on the Ethereum blockchain in customizable and novel ways." msgstr "" -#: src/components/layout/header/components/RegisterHelp.tsx:86 +#: src/components/layout/header/components/app-navigation.tsx:126 +msgid "Reserve Blog" +msgstr "" + +#: src/components/layout/header/components/app-navigation.tsx:98 msgid "Reserve Bridge" msgstr "" -#: src/components/layout/header/components/RegisterHelp.tsx:81 +#: src/components/layout/header/components/app-navigation.tsx:144 msgid "Reserve Discord" msgstr "" -#: src/components/layout/header/components/RegisterHelp.tsx:76 +#: src/components/layout/header/components/app-navigation.tsx:132 +msgid "Reserve Docs" +msgstr "" + +#: src/components/layout/header/components/app-navigation.tsx:138 msgid "Reserve Forum" msgstr "" -#: src/views/yield-dtf/overview/components/backing/Risks.tsx:49 +#: src/views/yield-dtf/overview/components/backing/risks.tsx:38 msgid "Reserve Protocol Smart-Contract Risk" msgstr "" -#: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:23 -#: src/views/yield-dtf/overview/components/backing/RevenueSplitOverview.tsx:108 +#: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:22 +#: src/views/yield-dtf/overview/components/backing/revenue-split-overview.tsx:104 msgid "Revenue distribution" msgstr "" -#: src/components/rtoken-setup/token/RevenueSplit.tsx:103 -#: src/views/yield-dtf/settings/components/RevenueSplitInfo.tsx:20 +#: src/components/rtoken-setup/token/RevenueSplit.tsx:109 +#: src/views/yield-dtf/settings/components/revenue-split-info.tsx:14 msgid "Revenue Distribution" msgstr "" -#: src/components/layout/navigation/TokenNavigation.tsx:224 -#: src/views/yield-dtf/governance/views/proposal/components/ProposalNavigation.tsx:20 -#: src/views/yield-dtf/settings/components/NavigationSidebar.tsx:14 +#: src/components/layout/navigation/TokenNavigation.tsx:197 +#: src/views/yield-dtf/governance/views/proposal/components/ProposalNavigation.tsx:19 +#: src/views/yield-dtf/settings/components/navigation-sidebar.tsx:13 msgid "Revenue share" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/ProposedRevenueSplitPreview.tsx:104 +#: src/views/yield-dtf/governance/views/proposal/components/ProposedRevenueSplitPreview.tsx:108 msgid "Revenue split" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/ItemPreview.tsx:48 -#: src/views/yield-dtf/governance/views/proposal/components/ListItemPreview.tsx:27 -#: src/views/yield-dtf/governance/views/proposal/components/ProposedBackupPreview.tsx:87 -#: src/views/yield-dtf/governance/views/proposal/components/ProposedBasketPreview.tsx:36 -#: src/views/yield-dtf/governance/views/proposal/components/ProposedRevenueSplitPreview.tsx:136 +#: src/views/yield-dtf/governance/views/proposal/components/ItemPreview.tsx:50 +#: src/views/yield-dtf/governance/views/proposal/components/ListItemPreview.tsx:28 +#: src/views/yield-dtf/governance/views/proposal/components/ProposedBackupPreview.tsx:98 +#: src/views/yield-dtf/governance/views/proposal/components/ProposedBasketPreview.tsx:47 +#: src/views/yield-dtf/governance/views/proposal/components/ProposedRevenueSplitPreview.tsx:140 msgid "Revert" msgstr "" -#: src/views/yield-dtf/staking/components/stake/StakeModal.tsx:90 -#: src/views/yield-dtf/staking/components/unstake/UnstakeModal.tsx:64 +#: src/views/yield-dtf/staking/components/stake/stake-modal.tsx:90 +#: src/views/yield-dtf/staking/components/unstake/unstake-modal.tsx:63 msgid "Review stake" msgstr "" -#: src/views/yield-dtf/settings/components/OtherInfo.tsx:38 +#: src/views/yield-dtf/settings/components/other-info.tsx:26 msgid "Reward ratio" msgstr "" -#: src/components/rtoken-setup/token/OtherForm.tsx:76 +#: src/components/rtoken-setup/token/OtherForm.tsx:79 msgid "Reward ratio - amount of the current reward amount that should be handed out in a single block. The default corresponds to a half life of approximately 15 days." msgstr "" -#: src/components/rtoken-setup/token/OtherForm.tsx:74 +#: src/components/rtoken-setup/token/OtherForm.tsx:77 msgid "Reward ratio (decimals)" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/ConfirmProposalForm.tsx:66 +#: src/views/yield-dtf/governance/views/proposal/components/ConfirmProposalForm.tsx:58 msgid "RFC" msgstr "" -#: src/views/yield-dtf/staking/components/overview/About.tsx:43 +#: src/views/yield-dtf/staking/components/overview/about.tsx:48 msgid "Risk evaluation" msgstr "" -#: src/views/yield-dtf/governance/components/GovernanceOverview.tsx:165 -#: src/views/yield-dtf/governance/components/GovernanceOverview.tsx:171 -#: src/views/yield-dtf/settings/components/FreezeManager.tsx:38 -#: src/views/yield-dtf/settings/components/FreezeManager.tsx:70 -#: src/views/yield-dtf/settings/components/PauseManager.tsx:85 +#: src/views/yield-dtf/governance/components/GovernanceOverview.tsx:175 +#: src/views/yield-dtf/governance/components/GovernanceOverview.tsx:181 +#: src/views/yield-dtf/settings/components/freeze-manager.tsx:37 +#: src/views/yield-dtf/settings/components/freeze-manager.tsx:69 +#: src/views/yield-dtf/settings/components/pause-manager.tsx:82 msgid "Role held by:" msgstr "" -#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:61 -#: src/views/yield-dtf/settings/components/ListingInfo.tsx:34 +#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:68 +#: src/views/index-dtf/settings/components/index-settings-roles.tsx:37 +#: src/views/yield-dtf/settings/components/listing-info.tsx:47 msgid "Roles" msgstr "" -#: src/components/layout/navigation/TokenNavigation.tsx:220 -#: src/views/yield-dtf/settings/components/NavigationSidebar.tsx:10 -#: src/views/yield-dtf/settings/components/RTokenManagement.tsx:52 +#: src/components/layout/navigation/TokenNavigation.tsx:193 +#: src/views/yield-dtf/settings/components/navigation-sidebar.tsx:9 +#: src/views/yield-dtf/settings/components/rtoken-management.tsx:43 msgid "Roles & Controls" msgstr "" -#: src/views/yield-dtf/staking/components/withdraw/AvailableUnstake.tsx:29 +#: src/views/yield-dtf/staking/components/withdraw/available-unstake.tsx:24 msgid "RSR available to withdraw" msgstr "" -#: src/views/yield-dtf/overview/components/charts/StakingChart.tsx:80 +#: src/views/yield-dtf/overview/components/charts/staking-chart.tsx:97 msgid "RSR Staked" msgstr "" -#: src/views/yield-dtf/settings/components/RevenueSplitInfo.tsx:31 +#: src/views/yield-dtf/settings/components/revenue-split-info.tsx:23 msgid "RSR Stakers" msgstr "" -#: src/views/yield-dtf/settings/components/ContractsInfo.tsx:24 +#: src/views/yield-dtf/settings/components/contracts-info.tsx:20 msgid "RSR Trader" msgstr "" -#: src/views/yield-dtf/settings/components/BasicInfo.tsx:26 +#: src/views/yield-dtf/settings/components/basic-info.tsx:22 msgid "RToken Address" msgstr "" -#: src/views/yield-dtf/deploy/components/TransactionDivider.tsx:39 +#: src/views/yield-dtf/deploy/components/TransactionDivider.tsx:50 msgid "RToken Deployment Transaction succeeded" msgstr "" -#: src/components/rtoken-setup/token/TokenForm.tsx:14 +#: src/components/rtoken-setup/token/TokenForm.tsx:15 msgid "RToken Details" msgstr "" -#: src/views/yield-dtf/settings/components/RevenueSplitInfo.tsx:25 +#: src/views/yield-dtf/settings/components/revenue-split-info.tsx:17 msgid "RToken holders" msgstr "" @@ -2045,94 +2050,62 @@ msgstr "" msgid "RToken in Wallet" msgstr "" -#: src/components/layout/header/components/TokenToggle.tsx:37 -msgid "RToken is frozen" -msgstr "" - -#: src/components/layout/header/components/TokenToggle.tsx:39 -msgid "RToken is paused" -msgstr "" - -#: src/components/rtoken-setup/token/TokenForm.tsx:37 -#: src/views/yield-dtf/deploy/components/TokenForm.tsx:46 +#: src/components/rtoken-setup/token/TokenForm.tsx:38 +#: src/views/yield-dtf/deploy/components/TokenForm.tsx:50 msgid "RToken mandate" msgstr "" -#: src/views/home/components/Hero.tsx:38 -msgid "RToken Market Cap" -msgstr "" - -#: src/views/yield-dtf/settings/components/OtherInfo.tsx:48 +#: src/views/yield-dtf/settings/components/other-info.tsx:34 msgid "RToken Maximum trade volume" msgstr "" -#: src/components/rtoken-setup/token/OtherForm.tsx:100 +#: src/components/rtoken-setup/token/OtherForm.tsx:103 msgid "RToken Maximum trade volume ($)" msgstr "" -#: src/views/yield-dtf/settings/components/ContractsInfo.tsx:23 +#: src/views/yield-dtf/settings/components/contracts-info.tsx:19 msgid "RToken Trader" msgstr "" -#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:122 +#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:140 msgid "RToken will be fully functional" msgstr "" -#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:119 +#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:137 msgid "RToken will be left in pause state" msgstr "" -#: src/views/yield-dtf/deploy/components/GovernanceOverview.tsx:94 +#: src/views/yield-dtf/deploy/components/GovernanceOverview.tsx:91 msgid "RToken will be ready to use after this TX if you choose to unpause." msgstr "" -#: src/components/rtoken-selector/SelectedToken.tsx:47 -msgid "RTokens" -msgstr "" - -#: src/views/yield-dtf/overview/components/backing/index.tsx:75 +#: src/views/yield-dtf/overview/components/backing/index.tsx:89 msgid "RTokens are 100% backed by a diversified set of underlying collateral tokens..." msgstr "" -#: src/views/tokens/Tokens.tsx:16 -msgid "RTokens in this list is not an endorsement or audited by us. It’s simply RTokens that have gone through our listing process and don’t seem like clear scams." +#: src/views/tokens/Tokens.tsx:17 +msgid "RTokens in this list is not an endorsement or audited by us. It's simply RTokens that have gone through our listing process and don't seem like clear scams." msgstr "" -#: src/views/discover/components/yield/components/RegisterAbout.tsx:48 -msgid "RTokens live on a blockchain, either Ethereum or Base, which means that they can be transacted worldwide within seconds. They're also 100% backed by other assets living on that same blockchain. The users of the currency can - at any time - redeem their RTokens for backing assets worthe the same value." -msgstr "" - -#: src/components/rtoken-setup/basket/CustomCollateral.tsx:124 -#: src/components/rtoken-setup/components/RolesEdit.tsx:53 -#: src/views/yield-dtf/governance/views/proposal/components/RegisterEdit.tsx:55 -#: src/views/yield-dtf/staking/components/stake/EditDelegate.tsx:31 +#: src/components/rtoken-setup/basket/CustomCollateral.tsx:120 +#: src/components/rtoken-setup/components/RolesEdit.tsx:48 +#: src/views/yield-dtf/governance/views/proposal/components/RegisterEdit.tsx:47 +#: src/views/yield-dtf/staking/components/stake/edit-delegate.tsx:31 msgid "Save" msgstr "" -#: src/views/tokens/components/TableFilters.tsx:20 +#: src/views/tokens/components/TableFilters.tsx:19 msgid "Search" msgstr "" -#: src/views/bridge/components/BridgeTokenModal.tsx:197 -msgid "Search by token symbol" -msgstr "" - -#: src/views/index-dtf/governance/views/propose/components/proposal-type-selection.tsx:38 +#: src/views/index-dtf/governance/views/propose/index.tsx:51 msgid "Select proposal type" msgstr "" -#: src/views/bridge/components/BridgeTokenModal.tsx:185 -msgid "Select token" -msgstr "" - -#: src/views/yield-dtf/auctions/components/useColumns.tsx:32 +#: src/views/yield-dtf/auctions/components/useColumns.tsx:31 msgid "Selling" msgstr "" -#: src/views/bridge/components/WithdrawalInfoModal.tsx:62 -msgid "Send verify tx on Mainnet" -msgstr "" - #: src/views/yield-dtf/auctions/auctions-sidebar/SettleableAuctions.tsx:78 msgid "Settle all" msgstr "" @@ -2141,184 +2114,187 @@ msgstr "" msgid "Settleable auctions" msgstr "" -#: src/views/yield-dtf/settings/components/GovernancePrompt.tsx:40 +#: src/views/yield-dtf/settings/components/governance-prompt.tsx:21 msgid "Setup Governance" msgstr "" -#: src/views/yield-dtf/overview/components/backing/RevenueSplitOverview.tsx:36 +#: src/views/yield-dtf/overview/components/backing/revenue-split-overview.tsx:41 msgid "Shared externally" msgstr "" -#: src/views/yield-dtf/overview/components/backing/RevenueSplitOverview.tsx:31 +#: src/views/yield-dtf/overview/components/backing/revenue-split-overview.tsx:36 msgid "Shared with RSR Stakers" msgstr "" -#: src/views/yield-dtf/overview/components/backing/RevenueSplitOverview.tsx:28 +#: src/views/yield-dtf/overview/components/backing/revenue-split-overview.tsx:33 msgid "Shared with RToken Holders" msgstr "" -#: src/views/yield-dtf/settings/components/FreezeManager.tsx:37 -#: src/views/yield-dtf/settings/components/FreezeManager.tsx:40 +#: src/views/yield-dtf/settings/components/freeze-manager.tsx:36 +#: src/views/yield-dtf/settings/components/freeze-manager.tsx:39 msgid "Short Freeze" msgstr "" -#: src/views/yield-dtf/settings/components/OtherInfo.tsx:21 +#: src/views/yield-dtf/settings/components/other-info.tsx:13 msgid "Short freeze duration" msgstr "" -#: src/components/rtoken-setup/token/OtherForm.tsx:19 +#: src/components/rtoken-setup/token/OtherForm.tsx:22 msgid "Short freeze duration (s)" msgstr "" -#: src/components/rtoken-setup/token/OtherForm.tsx:21 +#: src/components/rtoken-setup/token/OtherForm.tsx:24 msgid "Short freezers have the responsibility of freezing an RToken if anything dangerous or suspicious is happening. This is a one-shot freeze and the role will be revoked after a single use. This field determines how long the RToken will remain frozen until the freeze expires or is extended by another actor." msgstr "" -#: src/views/yield-dtf/governance/views/proposal-detail/components/ContractProposalDetails.tsx:120 +#: src/views/yield-dtf/governance/views/proposal-detail/components/ContractProposalDetails.tsx:105 msgid "Signature" msgstr "" -#: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:52 +#: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:51 msgid "Signing Tx 1" msgstr "" -#: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:56 +#: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:55 msgid "Signing Tx 2" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/SimulateProposal.tsx:54 +#: src/views/yield-dtf/governance/views/proposal/components/SimulateProposal.tsx:56 msgid "Simulate proposal" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/SimulateProposal.tsx:112 +#: src/views/yield-dtf/governance/views/proposal/components/SimulateProposal.tsx:91 msgid "Simulate Proposal" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/SimulateProposal.tsx:34 +#: src/views/yield-dtf/governance/views/proposal/components/SimulateProposal.tsx:32 msgid "Simulation successful ✓" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/SimulateProposal.tsx:35 +#: src/views/yield-dtf/governance/views/proposal/components/SimulateProposal.tsx:33 msgid "Simulation unsuccessful ✘" msgstr "" -#: src/views/yield-dtf/auctions/auctions-sidebar/UnavailableRevenueAuctions.tsx:130 +#: src/views/yield-dtf/auctions/auctions-sidebar/UnavailableRevenueAuctions.tsx:128 msgid "Small revenue auctions" msgstr "" -#: src/views/yield-dtf/settings/components/GovernanceInfo.tsx:42 +#: src/views/yield-dtf/settings/components/governance-info.tsx:34 msgid "Snapshot Delay" msgstr "" -#: src/views/yield-dtf/auctions/components/useColumns.tsx:32 +#: src/views/yield-dtf/auctions/components/useColumns.tsx:31 msgid "Sold" msgstr "" -#: src/views/yield-dtf/issuance/components/about/index.tsx:27 +#: src/views/yield-dtf/issuance/components/about/index.tsx:26 msgid "Some collateral tokens from protocols like Aave and Convex differ technically from other collateral tokens. To ensure proper handling, they must be wrapped in a contract for effective monitoring. Once wrapped, the collateral remains the same but has a new interface for price and appreciation tracking." msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/SpellUpgradePreview.tsx:34 +#: src/views/yield-dtf/governance/views/proposal/components/SpellUpgradePreview.tsx:37 msgid "Spell 1" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/SpellUpgradePreview.tsx:34 +#: src/views/yield-dtf/governance/views/proposal/components/SpellUpgradePreview.tsx:37 msgid "Spell 2" msgstr "" -#: src/views/yield-dtf/deploy/components/TokenForm.tsx:40 +#: src/views/yield-dtf/deploy/components/TokenForm.tsx:44 msgid "St Token Ticker" msgstr "" -#: src/components/layout/navigation/TokenNavigation.tsx:202 -#: src/components/transactions/table/index.tsx:54 -#: src/views/explorer/components/transactions/useTransactionColumns.tsx:34 -#: src/views/yield-dtf/overview/components/RTokenTransactions.tsx:84 +#: src/components/layout/navigation/TokenNavigation.tsx:175 +#: src/components/transactions/table/index.tsx:53 +#: src/views/explorer/components/transactions/useTransactionColumns.tsx:33 +#: src/views/yield-dtf/overview/components/rtoken-transactions.tsx:81 msgid "Stake" msgstr "" -#: src/components/layout/navigation/index.tsx:111 +#: src/components/layout/navigation/index.tsx:78 msgid "Stake + Unstake" msgstr "" -#: src/views/yield-dtf/staking/components/overview/StakingStats.tsx:42 +#: src/views/yield-dtf/staking/components/overview/staking-stats.tsx:49 msgid "Stake pool" msgstr "" -#: src/views/yield-dtf/overview/components/hero/TokenStats.tsx:56 +#: src/views/yield-dtf/overview/components/hero/token-stats.tsx:52 msgid "Stake pool USD value:" msgstr "" -#: src/views/yield-dtf/staking/components/stake/StakeButton.tsx:31 +#: src/views/yield-dtf/staking/components/stake/stake-button.tsx:30 msgid "Stake RSR" msgstr "" -#: src/views/tokens/components/UnlistedTokensTable.tsx:111 +#: src/views/tokens/components/UnlistedTokensTable.tsx:105 msgid "Staked" msgstr "" -#: src/views/explorer/components/tokens/index.tsx:176 -#: src/views/yield-dtf/overview/components/CollateralPieChartWrapper.tsx:167 +#: src/views/explorer/components/tokens/index.tsx:156 +#: src/views/yield-dtf/overview/components/collateral-pie-chart-wrapper.tsx:105 msgid "Staked RSR" msgstr "" -#: src/views/yield-dtf/overview/components/CollateralPieChartTooltip.tsx:229 +#: src/views/yield-dtf/overview/components/collateral-pie-chart-tooltip.tsx:197 msgid "Staked RSR Overcollateralisation" msgstr "" -#: src/views/explorer/components/tokens/index.tsx:188 +#: src/views/explorer/components/tokens/index.tsx:168 msgid "Stakers APY" msgstr "" -#: src/views/yield-dtf/staking/components/overview/About.tsx:7 +#: src/views/yield-dtf/staking/components/overview/about.tsx:12 msgid "Staking RSR" msgstr "" -#: src/views/yield-dtf/deploy/components/TokenForm.tsx:36 +#: src/views/yield-dtf/deploy/components/TokenForm.tsx:40 msgid "Staking token" msgstr "" -#: src/views/yield-dtf/staking/components/unstake/UnstakeModal.tsx:47 +#: src/views/yield-dtf/staking/components/unstake/unstake-modal.tsx:46 msgid "Staking yield share ends" msgstr "" -#: src/components/transactions/table/index.tsx:51 -#: src/views/explorer/components/transactions/useTransactionColumns.tsx:31 -#: src/views/yield-dtf/overview/components/RTokenTransactions.tsx:81 +#: src/components/transactions/table/index.tsx:50 +#: src/views/explorer/components/transactions/useTransactionColumns.tsx:30 +#: src/views/yield-dtf/overview/components/rtoken-transactions.tsx:78 msgid "Start Issue" msgstr "" -#: src/views/bridge/components/BridgeWithdrawals.tsx:28 -#: src/views/explorer/components/governance/index.tsx:70 +#: src/views/explorer/components/governance/index.tsx:76 msgid "Status" msgstr "" -#: src/views/yield-dtf/settings/components/PauseManager.tsx:68 +#: src/views/yield-dtf/settings/components/pause-manager.tsx:65 msgid "Status:" msgstr "" -#: src/views/yield-dtf/deploy/components/GovernanceOverview.tsx:42 -#: src/views/yield-dtf/governance/views/proposal/components/ConfirmProposalOverview.tsx:75 -msgid "Stay patient while the transaction is in progress & don’t close this window to avoid issues finding your way back here." +#: src/views/yield-dtf/deploy/components/GovernanceOverview.tsx:46 +#: src/views/yield-dtf/governance/views/proposal/components/ConfirmProposalOverview.tsx:77 +msgid "Stay patient while the transaction is in progress & don't close this window to avoid issues finding your way back here." msgstr "" -#: src/views/discover/components/yield/components/RegisterAbout.tsx:74 -msgid "Still have questions? Come talk to the Reserve community in our Discord server. We'd be more than happy to help!" +#: src/components/layout/header/components/app-navigation.tsx:128 +msgid "Stay up to date in long form" msgstr "" -#: src/components/rtoken-setup/token/OtherForm.tsx:75 +#: src/views/discover/components/yield/components/RegisterAbout.tsx:81 +msgid "Still have questions? Come talk to us in the Reserve Discord server. We’d be happy to help! You can also" +msgstr "" + +#: src/components/rtoken-setup/token/OtherForm.tsx:78 msgid "stRSR payout fraction 0.0" msgstr "" -#: src/views/yield-dtf/settings/components/ContractsInfo.tsx:27 +#: src/views/yield-dtf/settings/components/contracts-info.tsx:23 msgid "stRSR Token" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/ConfirmProposalOverview.tsx:97 +#: src/views/yield-dtf/governance/views/proposal/components/ConfirmProposalOverview.tsx:95 msgid "Submit proposal on-chain" msgstr "" -#: src/views/yield-dtf/overview/components/charts/SupplyChart.tsx:74 +#: src/views/yield-dtf/overview/components/charts/supply-chart.tsx:85 msgid "Supply" msgstr "" @@ -2326,50 +2302,50 @@ msgstr "" msgid "Surplus below minimum trade" msgstr "" -#: src/views/yield-dtf/settings/components/BasicInfo.tsx:23 +#: src/views/yield-dtf/settings/components/basic-info.tsx:19 msgid "Symbol" msgstr "" -#: src/components/rtoken-setup/basket/PluginItem.tsx:112 +#: src/components/rtoken-setup/basket/PluginItem.tsx:105 msgid "Target:" msgstr "" #: src/components/tables/ListedTokensTable.tsx:53 -#: src/views/explorer/components/tokens/index.tsx:192 -#: src/views/tokens/components/UnlistedTokensTable.tsx:96 +#: src/views/explorer/components/tokens/index.tsx:172 +#: src/views/tokens/components/UnlistedTokensTable.tsx:95 msgid "Target(s)" msgstr "" -#: src/views/yield-dtf/auctions/auctions-sidebar/claim-rewards/components/TraderEmissions.tsx:172 +#: src/views/yield-dtf/auctions/auctions-sidebar/claim-rewards/components/TraderEmissions.tsx:156 msgid "The amount of assets selected affects the gas price, this asset may not be worth claiming yet." msgstr "" -#: src/components/account/index.tsx:43 +#: src/components/account/index.tsx:48 msgid "The configured network \"{currentChain}\" is different from the wallet selected network \"{chainId}\"\". Change your network in the connected wallet." msgstr "" -#: src/views/discover/components/yield/components/DeployHero.tsx:73 +#: src/views/discover/components/yield/components/DeployHero.tsx:39 msgid "The creation of new RToken designs is permissionless. If you are the inventive type and have ideas for what assets should be in the basket, what a good governance looks like, or anything novel that could work within the realms of the protocol, please consider putting those ideas into practice or sharing them with the community." msgstr "" -#: src/components/rtoken-setup/basket/EmergencyCollateral.tsx:145 +#: src/components/rtoken-setup/basket/EmergencyCollateral.tsx:157 msgid "The diversity factor determines the amount of emergency collateral that will be deployed to the RToken basket in the case of a default." msgstr "" -#: src/components/rtoken-setup/token/BackingForm.tsx:71 +#: src/components/rtoken-setup/token/BackingForm.tsx:75 msgid "The dutch auction length is how many seconds long falling-price dutch auctions should be. A longer period will result in less slippage due to better price granularity, and a shorter period will result in more slippage." msgstr "" -#: src/components/rtoken-setup/token/OtherForm.tsx:49 +#: src/components/rtoken-setup/token/OtherForm.tsx:52 msgid "The fraction of RSR stake that should be permitted to withdraw without a refresh. When cumulative withdrawals (or a single withdrawal) exceed this fraction, gas must be paid to refresh all assets." msgstr "" -#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:89 +#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:98 msgid "The guardian has the ability to reject proposals even if they pass. Should be assigned to a multisig or EOA that can be trusted to act as a backstop. It is acceptable if it is relatively slow to act. Only one guardian address should be defined." msgstr "" -#: src/views/yield-dtf/deploy/components/TokenForm.tsx:47 -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." +#: src/views/yield-dtf/deploy/components/TokenForm.tsx:51 +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/components/rtoken-setup/governance/GovernanceParameters.tsx:89 @@ -2384,157 +2360,137 @@ msgstr "" msgid "The minimum percentage of stRSR voter participation (either For or Abstain) on a proposal before it can be passed." msgstr "" -#: src/views/yield-dtf/settings/components/PauseManager.tsx:106 +#: src/views/yield-dtf/settings/components/pause-manager.tsx:97 msgid "The pauser(s) can put the RToken in two states which can be either true or false (no set duration):" msgstr "" -#: src/views/home/components/Hero.tsx:69 -msgid "The projected annual revenue generated by the protocol for RSR stakers, calculated using the current RSR staker APY and the amount of staked RSR for the listed RTokens." -msgstr "" - -#: src/views/home/components/Hero.tsx:59 -msgid "The projected annual revenue generated by the protocol for RToken holders, calculated using the current APY and TVL of the listed RTokens." -msgstr "" - -#: src/views/discover/components/yield/components/RegisterAbout.tsx:91 +#: src/views/discover/components/yield/components/RegisterAbout.tsx:98 msgid "The Reserve Project" msgstr "" -#: src/views/yield-dtf/auctions/components/About.tsx:14 +#: src/views/yield-dtf/auctions/components/About.tsx:17 msgid "The Reserve Protocol makes a few different types of trades" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/ProposalBasketSetup.tsx:65 +#: src/views/yield-dtf/governance/views/proposal/components/ProposalBasketSetup.tsx:50 msgid "The token supply is not enough for changing the primary basket safely, contact the Reserve team for recommendations." msgstr "" -#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:69 +#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:78 msgid "" "The top level decision maker, typically a decentralized governance smart contract, responsible for setting or updating all RToken parameter values, RToken baskets, etc. - The RToken OWNER has the power to:\n" -"grant and revoke roles to any Ethereum account\n" -"pause and unpause the system\n" -"freeze and unfreeze the system\n" -"set governance parameters\n" -"upgrade system contracts" +" grant and revoke roles to any Ethereum account\n" +" pause and unpause the system\n" +" freeze and unfreeze the system\n" +" set governance parameters\n" +" upgrade system contracts" msgstr "" -#: src/views/home/components/Hero.tsx:49 -msgid "The total value of all RSR staked in the protocol" -msgstr "" - -#: src/views/home/components/Hero.tsx:39 -msgid "The total value of all RToken in circulation" -msgstr "" - -#: src/components/rtoken-setup/token/BackingForm.tsx:43 +#: src/components/rtoken-setup/token/BackingForm.tsx:47 msgid "The warmup period is how many seconds should pass after the basket regained the SOUND status before an RToken can be issued and/or a trade can be opened." msgstr "" -#: src/views/bridge/components/BridgeFaq.tsx:78 -msgid "There are network fees involved which are used to pay for the gas costs on Ethereum and Base. There are no additional fees." -msgstr "" - -#: src/views/yield-dtf/settings/components/FreezeManager.tsx:122 -msgid "There’s two freezing roles that put the system in the same state for different durations:" +#: src/views/yield-dtf/settings/components/freeze-manager.tsx:112 +msgid "There's two freezing roles that put the system in the same state for different durations:" msgstr "" -#: src/components/rtoken-setup/components/RolesEdit.tsx:42 +#: src/components/rtoken-setup/components/RolesEdit.tsx:36 msgid "This address already holds this role" msgstr "" -#: src/views/discover/components/yield/components/RegisterAbout.tsx:105 +#: src/views/discover/components/yield/components/RegisterAbout.tsx:112 msgid "This App" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/RegisterEdit.tsx:41 +#: src/views/discover/components/yield/components/RegisterAbout.tsx:115 +msgid "This app is an open source project developed and maintained by ABC Labs to interact with the Reserve Protocol and various DTFs deployed with the protocol." +msgstr "" + +#: src/views/yield-dtf/governance/views/proposal/components/RegisterEdit.tsx:32 msgid "This asset is already (being) registered" msgstr "" -#: src/components/field/index.tsx:27 +#: src/components/field/index.tsx:33 msgid "This field is required" msgstr "" -#: src/components/rtoken-setup/basket/PrimaryBasket.tsx:43 +#: src/components/rtoken-setup/basket/PrimaryBasket.tsx:57 msgid "This is the target collateral basket at the onset of an RToken that defines which collateral needs to be deposited for issuances. The prime basket is directly set by governance, and only changes through successful governance proposals." msgstr "" -#: src/views/bridge/components/BridgeFaq.tsx:92 -msgid "This seven day bridge duration is in place as a challenge period security measure built into the OP Stack." -msgstr "" - -#: src/components/rtoken-setup/token/TokenForm.tsx:27 -#: src/views/yield-dtf/deploy/components/TokenForm.tsx:26 +#: src/components/rtoken-setup/token/TokenForm.tsx:28 +#: src/views/index-dtf/settings/components/index-settings-basic.tsx:21 +#: src/views/yield-dtf/deploy/components/TokenForm.tsx:30 msgid "Ticker" msgstr "" -#: src/views/yield-dtf/deploy/components/TokenForm.tsx:28 +#: src/views/yield-dtf/deploy/components/TokenForm.tsx:32 msgid "Ticker - symbol eg. USD+" msgstr "" -#: src/components/transactions/table/index.tsx:88 -#: src/views/bridge/components/BridgeWithdrawals.tsx:16 -#: src/views/explorer/components/transactions/useTransactionColumns.tsx:105 -#: src/views/yield-dtf/overview/components/RTokenTransactions.tsx:137 +#: src/components/transactions/table/index.tsx:87 +#: src/views/explorer/components/transactions/useTransactionColumns.tsx:104 +#: src/views/yield-dtf/overview/components/rtoken-transactions.tsx:145 msgid "Time" msgstr "" -#: src/views/yield-dtf/settings/components/GovernanceInfo.tsx:75 +#: src/views/yield-dtf/settings/components/governance-info.tsx:62 msgid "Timelock address" msgstr "" -#: src/views/bridge/components/BridgeOutput.tsx:30 -msgid "To:" +#: src/views/index-dtf/settings/components/index-settings-governance.tsx:53 +msgid "Timelock Address" msgstr "" #: src/components/tables/ListedTokensTable.tsx:27 -#: src/views/explorer/components/governance/index.tsx:32 -#: src/views/explorer/components/tokens/index.tsx:158 -#: src/views/explorer/components/transactions/useTransactionColumns.tsx:47 -#: src/views/tokens/components/UnlistedTokensTable.tsx:68 +#: src/views/explorer/components/governance/index.tsx:38 +#: src/views/explorer/components/tokens/index.tsx:138 +#: src/views/explorer/components/transactions/useTransactionColumns.tsx:46 +#: src/views/tokens/components/UnlistedTokensTable.tsx:67 msgid "Token" msgstr "" -#: src/components/layout/navigation/TokenNavigation.tsx:221 -#: src/views/yield-dtf/settings/components/NavigationSidebar.tsx:11 +#: src/components/layout/navigation/TokenNavigation.tsx:194 +#: src/views/yield-dtf/settings/components/navigation-sidebar.tsx:10 msgid "Token details" msgstr "" -#: src/views/yield-dtf/settings/components/BasicInfo.tsx:19 +#: src/views/yield-dtf/settings/components/basic-info.tsx:13 msgid "Token Details" msgstr "" -#: src/views/yield-dtf/overview/components/CollateralPieChartTooltip.tsx:198 +#: src/views/yield-dtf/overview/components/collateral-pie-chart-tooltip.tsx:162 msgid "Token exposure" msgstr "" -#: src/components/rtoken-setup/token/TokenForm.tsx:18 -#: src/views/yield-dtf/deploy/components/TokenForm.tsx:16 +#: src/components/rtoken-setup/token/TokenForm.tsx:19 +#: src/views/yield-dtf/deploy/components/TokenForm.tsx:20 msgid "Token name" msgstr "" -#: src/views/yield-dtf/deploy/components/TokenForm.tsx:18 +#: src/views/yield-dtf/deploy/components/TokenForm.tsx:22 msgid "Token name - the name of the RToken eg. Savings Dollar" msgstr "" -#: src/components/rtoken-setup/token/TokenForm.tsx:23 -#: src/views/yield-dtf/deploy/components/TokenForm.tsx:22 +#: src/components/rtoken-setup/token/TokenForm.tsx:24 +#: src/views/yield-dtf/deploy/components/TokenForm.tsx:26 msgid "Token name required" msgstr "" -#: src/components/rtoken-setup/token/TokenForm.tsx:32 -#: src/views/yield-dtf/deploy/components/TokenForm.tsx:31 +#: src/components/rtoken-setup/token/TokenForm.tsx:33 +#: src/views/yield-dtf/deploy/components/TokenForm.tsx:35 msgid "Token ticker is required" msgstr "" -#: src/views/explorer/components/filters/TokenFilter.tsx:37 +#: src/views/explorer/components/filters/TokenFilter.tsx:36 msgid "Tokens" msgstr "" -#: src/views/yield-dtf/auctions/auctions-sidebar/RevenueAuctionItem.tsx:67 +#: src/views/yield-dtf/auctions/auctions-sidebar/RevenueAuctionItem.tsx:110 msgid "Tokens to match trade" msgstr "" -#: src/views/yield-dtf/governance/components/TopVoters.tsx:147 +#: src/views/yield-dtf/governance/components/TopVoters.tsx:141 msgid "Top voting addresses" msgstr "" @@ -2542,57 +2498,57 @@ msgstr "" msgid "Total % to arbitrary address" msgstr "" -#: src/components/rtoken-setup/basket/PrimaryBasket.tsx:128 +#: src/components/rtoken-setup/basket/PrimaryBasket.tsx:176 msgid "Total initial RToken scale including all targets. If your RToken only has one target unit this will be the same as the basket scale input." msgstr "" -#: src/views/yield-dtf/overview/components/hero/TokenStats.tsx:33 +#: src/views/yield-dtf/overview/components/hero/token-stats.tsx:32 msgid "Total Market Cap" msgstr "" -#: src/views/yield-dtf/staking/components/overview/StakingStats.tsx:47 +#: src/views/yield-dtf/staking/components/overview/staking-stats.tsx:54 msgid "Total RSR staked" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/TraderImplementationProposal.tsx:15 -#: src/views/yield-dtf/governance/views/proposal/components/TraderImplementationProposal.tsx:26 +#: src/views/yield-dtf/governance/views/proposal/components/TraderImplementationProposal.tsx:23 +#: src/views/yield-dtf/governance/views/proposal/components/TraderImplementationProposal.tsx:34 msgid "Trader contract address" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/TraderImplementationProposal.tsx:16 +#: src/views/yield-dtf/governance/views/proposal/components/TraderImplementationProposal.tsx:24 msgid "Trader contract for batch trades." msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/TraderImplementationProposal.tsx:27 +#: src/views/yield-dtf/governance/views/proposal/components/TraderImplementationProposal.tsx:35 msgid "Trader contract for Dutch trades." msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/TraderImplementationProposal.tsx:10 +#: src/views/yield-dtf/governance/views/proposal/components/TraderImplementationProposal.tsx:18 msgid "Trader implementations" msgstr "" -#: src/views/yield-dtf/settings/components/BackingInfo.tsx:45 +#: src/views/yield-dtf/settings/components/backing-info.tsx:32 msgid "Trading delay" msgstr "" -#: src/components/rtoken-setup/token/BackingForm.tsx:29 +#: src/components/rtoken-setup/token/BackingForm.tsx:33 msgid "Trading delay - how many seconds should pass after the basket has been changed, before a rebalancing trade is opened. Why does this matter? To avoid losses due to poor liquidity." msgstr "" -#: src/components/rtoken-setup/token/BackingForm.tsx:27 +#: src/components/rtoken-setup/token/BackingForm.tsx:31 msgid "Trading delay (s)" msgstr "" -#: src/views/yield-dtf/deploy/components/RTokenSetup.tsx:47 -#: src/views/yield-dtf/deploy/components/TransactionDivider.tsx:38 +#: src/views/yield-dtf/deploy/components/RTokenSetup.tsx:48 +#: src/views/yield-dtf/deploy/components/TransactionDivider.tsx:49 msgid "Transaction 1" msgstr "" -#: src/views/yield-dtf/deploy/components/RTokenSetup.tsx:72 +#: src/views/yield-dtf/deploy/components/RTokenSetup.tsx:64 msgid "Transaction 2" msgstr "" -#: src/hooks/useWatchTransaction.ts:52 +#: src/hooks/useWatchTransaction.ts:54 msgid "Transaction confirmed" msgstr "" @@ -2600,40 +2556,37 @@ msgstr "" msgid "Transaction failed" msgstr "" -#: src/hooks/useWatchTransaction.ts:69 +#: src/hooks/useWatchTransaction.ts:71 msgid "Transaction reverted" msgstr "" -#: src/components/transaction-modal/TransactionConfirmedModal.tsx:32 +#: src/components/transaction-modal/transaction-confirmed-modal.tsx:32 +#: src/components/transaction-modal/TransactionConfirmedModal.tsx:28 msgid "Transaction signed!" msgstr "" -#: src/views/yield-dtf/deploy/components/GovernanceOverview.tsx:39 -#: src/views/yield-dtf/governance/views/proposal/components/ConfirmProposalOverview.tsx:72 +#: src/views/yield-dtf/deploy/components/GovernanceOverview.tsx:43 +#: src/views/yield-dtf/governance/views/proposal/components/ConfirmProposalOverview.tsx:74 msgid "Transaction submitted" msgstr "" -#: src/components/layout/navigation/TokenNavigation.tsx:192 -#: src/views/explorer/components/transactions/index.tsx:94 -#: src/views/yield-dtf/overview/components/RTokenTransactions.tsx:213 +#: src/components/layout/navigation/TokenNavigation.tsx:165 +#: src/views/explorer/components/transactions/index.tsx:38 +#: src/views/yield-dtf/overview/components/rtoken-transactions.tsx:220 msgid "Transactions" msgstr "" -#: src/components/transactions/table/index.tsx:48 -#: src/views/explorer/components/transactions/useTransactionColumns.tsx:28 -#: src/views/yield-dtf/overview/components/RTokenTransactions.tsx:78 +#: src/components/transactions/table/index.tsx:47 +#: src/views/explorer/components/transactions/useTransactionColumns.tsx:27 +#: src/views/yield-dtf/overview/components/rtoken-transactions.tsx:75 msgid "Transfer" msgstr "" -#: src/components/layout/header/components/RegisterHelp.tsx:87 -msgid "Transfer RTokens between Ethereum, Base, and Arbitrum" +#: src/components/layout/header/components/app-navigation.tsx:104 +msgid "Transfer DTFs across chains" msgstr "" -#: src/views/bridge/components/BridgeFaq.tsx:41 -msgid "Transferring from Base to Ethereum takes approximately 7 days and requires 3 transactions." -msgstr "" - -#: src/views/yield-dtf/auctions/components/About.tsx:81 +#: src/views/yield-dtf/auctions/components/About.tsx:71 msgid "Trigger an Auction" msgstr "" @@ -2641,11 +2594,11 @@ msgstr "" msgid "Trigger melt" msgstr "" -#: src/views/yield-dtf/staking/components/UnstakeDelay.tsx:23 +#: src/views/yield-dtf/staking/components/unstake-delay.tsx:16 msgid "Trigger Unstake" msgstr "" -#: src/views/yield-dtf/issuance/components/zapV2/ZapToggle.tsx:32 +#: src/views/yield-dtf/issuance/components/zapV2/ZapToggle.tsx:23 msgid "Turn on Zaps to mint using 1 asset" msgstr "" @@ -2653,185 +2606,180 @@ msgstr "" msgid "Tutorial video" msgstr "" -#: src/views/earn/hooks/useEarnTableColumns.tsx:199 +#: src/views/earn/hooks/useEarnTableColumns.tsx:170 msgid "TVL" msgstr "" -#: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:50 +#: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:49 msgid "Tx 1" msgstr "" -#: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:54 +#: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:53 msgid "Tx 2" msgstr "" -#: src/views/yield-dtf/overview/components/RTokenTransactions.tsx:164 +#: src/views/yield-dtf/overview/components/rtoken-transactions.tsx:175 msgid "Tx Hash" msgstr "" -#: src/components/old/button/TransactionButton.tsx:126 -#: src/components/old/button/TransactionButton.tsx:166 +#: src/components/ui/transaction-button.tsx:140 +#: src/components/ui/transaction-button.tsx:200 msgid "Tx in process..." msgstr "" -#: src/views/explorer/components/filters/TransactionTypeFilter.tsx:37 +#: src/views/explorer/components/filters/TransactionTypeFilter.tsx:35 msgid "Tx Type" msgstr "" -#: src/views/yield-dtf/deploy/components/DeployOverview.tsx:137 +#: src/views/yield-dtf/deploy/components/DeployOverview.tsx:123 msgid "Tx1. RToken Deploy" msgstr "" -#: src/views/yield-dtf/deploy/components/GovernanceOverview.tsx:125 +#: src/views/yield-dtf/deploy/components/GovernanceOverview.tsx:120 msgid "Tx2. Governance" msgstr "" #: src/components/tables/ListedTokensTable.tsx:45 -#: src/views/tokens/components/UnlistedTokensTable.tsx:89 +#: src/views/tokens/components/UnlistedTokensTable.tsx:88 msgid "Txs" msgstr "" -#: src/components/transactions/table/index.tsx:67 -#: src/views/bridge/components/BridgeWithdrawals.tsx:19 -#: src/views/explorer/components/transactions/useTransactionColumns.tsx:69 -#: src/views/yield-dtf/overview/components/RTokenTransactions.tsx:97 +#: src/components/transactions/table/index.tsx:66 +#: src/views/explorer/components/transactions/useTransactionColumns.tsx:68 +#: src/views/yield-dtf/overview/components/rtoken-transactions.tsx:96 msgid "Type" msgstr "" -#: src/views/yield-dtf/overview/components/backing/PlatformExposure.tsx:64 +#: src/views/yield-dtf/overview/components/backing/platform-exposure.tsx:58 msgid "Underlying Platform Exposure" msgstr "" -#: src/views/yield-dtf/overview/components/backing/TokenExposure.tsx:96 +#: src/views/index-dtf/settings/components/index-settings-governance-token.tsx:25 +msgid "Underlying Token" +msgstr "" + +#: src/views/yield-dtf/overview/components/backing/token-exposure.tsx:90 msgid "Underlying Token Exposure" msgstr "" -#: src/components/layout/header/components/RegisterHelp.tsx:72 -msgid "Understand the Reserve Protocol." +#: src/components/layout/header/components/app-navigation.tsx:134 +msgid "Understand the project and protocols" msgstr "" -#: src/views/yield-dtf/settings/components/FreezeManager.tsx:107 +#: src/views/yield-dtf/settings/components/freeze-manager.tsx:103 msgid "Unfreeze" msgstr "" -#: src/views/yield-dtf/auctions/auctions-sidebar/RecollaterizationAlert.tsx:28 +#: src/views/yield-dtf/auctions/auctions-sidebar/RecollaterizationAlert.tsx:24 msgid "Unknown amount of recollateralization auctions left to run" msgstr "" -#: src/views/yield-dtf/settings/components/ListingInfo.tsx:30 +#: src/views/yield-dtf/settings/components/listing-info.tsx:43 msgid "Unpausing" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/UnregisterEdit.tsx:74 +#: src/views/yield-dtf/governance/views/proposal/components/UnregisterEdit.tsx:59 msgid "Unregister" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/UnregisterProposal.tsx:33 +#: src/views/yield-dtf/governance/views/proposal/components/UnregisterProposal.tsx:38 msgid "Unregister Assets" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/ProposedUnregisterPreview.tsx:25 +#: src/views/yield-dtf/governance/views/proposal/components/ProposedUnregisterPreview.tsx:29 msgid "Unregistering assets" msgstr "" -#: src/components/transactions/table/index.tsx:55 -#: src/views/explorer/components/transactions/useTransactionColumns.tsx:35 -#: src/views/yield-dtf/overview/components/RTokenTransactions.tsx:85 +#: src/components/transactions/table/index.tsx:54 +#: src/views/explorer/components/transactions/useTransactionColumns.tsx:34 +#: src/views/yield-dtf/overview/components/rtoken-transactions.tsx:82 msgid "Unstake" msgstr "" -#: src/views/explorer/components/transactions/useTransactionColumns.tsx:39 -#: src/views/yield-dtf/overview/components/RTokenTransactions.tsx:89 +#: src/views/explorer/components/transactions/useTransactionColumns.tsx:38 +#: src/views/yield-dtf/overview/components/rtoken-transactions.tsx:86 msgid "Unstake Cancelled" msgstr "" -#: src/views/yield-dtf/staking/components/unstake/UnstakeButton.tsx:36 +#: src/views/yield-dtf/staking/components/unstake/unstake-button.tsx:35 msgid "Unstake RSR" msgstr "" -#: src/views/yield-dtf/settings/components/OtherInfo.tsx:31 -#: src/views/yield-dtf/staking/components/overview/StakingStats.tsx:67 +#: src/views/yield-dtf/settings/components/other-info.tsx:22 +#: src/views/yield-dtf/staking/components/overview/staking-stats.tsx:73 msgid "Unstaking Delay" msgstr "" -#: src/components/rtoken-setup/token/OtherForm.tsx:62 +#: src/components/rtoken-setup/token/OtherForm.tsx:65 msgid "Unstaking delay - number of seconds that all RSR unstaking must be delayed in order to account for stakers trying to frontrun defaults and needs to be longer than \"governance\" for proper incentives for basket changes." msgstr "" -#: src/components/rtoken-setup/token/OtherForm.tsx:60 +#: src/components/rtoken-setup/token/OtherForm.tsx:63 msgid "Unstaking Delay (s)" msgstr "" -#: src/views/yield-dtf/staking/components/UnstakeDelay.tsx:64 +#: src/views/yield-dtf/staking/components/unstake-delay.tsx:55 msgid "Unstaking delay:" msgstr "" -#: src/views/yield-dtf/staking/components/overview/About.tsx:32 +#: src/views/yield-dtf/staking/components/overview/about.tsx:37 msgid "Unstaking RSR" msgstr "" -#: src/components/account/index.tsx:39 +#: src/components/account/index.tsx:44 msgid "Unsupported" msgstr "" -#: src/views/yield-dtf/issuance/components/wrapping/WrapTypeToggle.tsx:48 +#: src/views/yield-dtf/issuance/components/wrapping/WrapTypeToggle.tsx:29 msgid "Unwrap collaterals" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/ContractUpgrades.tsx:140 +#: src/views/yield-dtf/governance/views/proposal/components/ContractUpgrades.tsx:141 msgid "Upgrade contract implementations to a newer version. This is usually performed for a protocol update or bugfix." msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/ContractUpgrades.tsx:125 +#: src/views/yield-dtf/governance/views/proposal/components/ContractUpgrades.tsx:126 msgid "Upgrade contracts" msgstr "" -#: src/views/explorer/components/transactions/useTransactionColumns.tsx:95 -#: src/views/yield-dtf/overview/components/RTokenTransactions.tsx:123 +#: src/views/explorer/components/transactions/useTransactionColumns.tsx:94 msgid "USD Value" msgstr "" -#: src/components/rtoken-setup/basket/CustomCollateral.tsx:139 +#: src/components/rtoken-setup/basket/CustomCollateral.tsx:135 msgid "Use a custom plugin contract address" msgstr "" -#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:41 +#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:48 msgid "Use the Alexios governor format?" msgstr "" -#: src/views/discover/components/yield/components/RegisterAbout.tsx:128 +#: src/views/discover/components/yield/components/RegisterAbout.tsx:139 msgid "User Tracking" msgstr "" -#: src/components/rtoken-setup/basket/CustomCollateral.tsx:124 +#: src/components/rtoken-setup/basket/CustomCollateral.tsx:120 msgid "Validating..." msgstr "" -#: src/views/bridge/components/ProveWithdrawalButton.tsx:52 -msgid "Verify" -msgstr "" - -#: src/views/bridge/components/ProveWithdrawalButton.tsx:40 -msgid "Verifying" -msgstr "" - -#: src/views/yield-dtf/staking/components/stake/ConfirmStakeButton.tsx:72 +#: src/views/yield-dtf/staking/components/stake/confirm-stake-button.tsx:69 msgid "Verifying allowance..." msgstr "" -#: src/views/yield-dtf/staking/components/stake/ConfirmStakeButton.tsx:94 +#: src/views/yield-dtf/staking/components/stake/confirm-stake-button.tsx:91 msgid "Verifying transaction..." msgstr "" -#: src/components/rtoken-setup/basket/PluginItem.tsx:71 +#: src/components/rtoken-setup/basket/PluginItem.tsx:64 +#: src/views/index-dtf/settings/components/index-settings-basic.tsx:46 msgid "Version" msgstr "" -#: src/views/yield-dtf/settings/components/RolesView.tsx:63 +#: src/views/yield-dtf/settings/components/roles-view.tsx:60 msgid "View" msgstr "" -#: src/views/discover/components/yield/components/TokenList.tsx:27 +#: src/views/discover/components/yield/components/TokenList.tsx:31 msgid "View All" msgstr "" @@ -2839,21 +2787,23 @@ msgstr "" msgid "View All, including unlisted" msgstr "" -#: src/views/yield-dtf/staking/components/stake/ConfirmStakeButton.tsx:133 -#: src/views/yield-dtf/staking/components/unstake/ConfirmUnstakeButton.tsx:80 +#: src/views/yield-dtf/staking/components/stake/confirm-stake-button.tsx:131 +#: src/views/yield-dtf/staking/components/unstake/confirm-unstake-button.tsx:89 msgid "View in explorer" msgstr "" -#: src/components/transaction-modal/TransactionConfirmedModal.tsx:40 -#: src/views/yield-dtf/governance/views/proposal-detail/components/VoteModal.tsx:75 -msgid "View on etherscan" +#: src/components/transaction-modal/transaction-confirmed-modal.tsx:41 +#: src/components/transaction-modal/TransactionConfirmedModal.tsx:37 +#: src/views/index-dtf/governance/views/proposal/components/vote-modal.tsx:88 +#: src/views/yield-dtf/governance/views/proposal-detail/components/VoteModal.tsx:74 +msgid "View on" msgstr "" -#: src/views/yield-dtf/deploy/components/TransactionDivider.tsx:51 +#: src/views/yield-dtf/deploy/components/TransactionDivider.tsx:63 msgid "View on Etherscan" msgstr "" -#: src/views/tokens/components/UnlistedTokensTable.tsx:92 +#: src/views/tokens/components/UnlistedTokensTable.tsx:91 msgid "Volume (all time)" msgstr "" @@ -2861,163 +2811,149 @@ msgstr "" msgid "Volume (last 7d)" msgstr "" -#: src/views/yield-dtf/governance/views/proposal-detail/components/VoteModal.tsx:132 +#: src/views/index-dtf/governance/views/proposal/components/vote-modal.tsx:63 +#: src/views/index-dtf/governance/views/proposal/components/vote-modal.tsx:148 +#: src/views/yield-dtf/governance/views/proposal-detail/components/VoteModal.tsx:129 msgid "Vote" msgstr "" -#: src/views/yield-dtf/governance/views/proposal-detail/components/ProposalVote.tsx:189 +#: src/views/index-dtf/governance/views/proposal/components/proposal-vote-button.tsx:60 +#: src/views/yield-dtf/governance/views/proposal-detail/components/ProposalVote.tsx:170 msgid "Vote on-chain" msgstr "" -#: src/views/yield-dtf/governance/components/GovernanceOverview.tsx:122 +#: src/views/index-dtf/governance/components/governance-stats.tsx:79 +#: src/views/yield-dtf/governance/components/GovernanceOverview.tsx:132 msgid "Vote Supply" msgstr "" -#: src/views/yield-dtf/governance/components/TopVoters.tsx:110 +#: src/views/yield-dtf/governance/components/TopVoters.tsx:111 msgid "Vote weight" msgstr "" -#: src/views/yield-dtf/governance/components/TopVoters.tsx:106 +#: src/views/index-dtf/settings/components/index-settings-governance-token.tsx:18 +msgid "Vote-Lock DAO Token" +msgstr "" + +#: src/views/yield-dtf/governance/components/TopVoters.tsx:107 msgid "Votes" msgstr "" -#: src/views/yield-dtf/governance/views/proposal-detail/components/ProposalVotes.tsx:95 +#: src/views/yield-dtf/governance/views/proposal-detail/components/ProposalVotes.tsx:79 msgid "Votes against" msgstr "" -#: src/views/yield-dtf/governance/views/proposal-detail/components/ProposalVotes.tsx:81 +#: src/views/yield-dtf/governance/views/proposal-detail/components/ProposalVotes.tsx:68 msgid "Votes for" msgstr "" +#: src/views/index-dtf/governance/views/proposal/components/vote-modal.tsx:97 #: src/views/yield-dtf/governance/views/proposal-detail/components/VoteModal.tsx:83 msgid "Voting" msgstr "" -#: src/views/yield-dtf/governance/components/GovernanceOverview.tsx:132 +#: src/views/index-dtf/governance/components/governance-stats.tsx:84 +#: src/views/yield-dtf/governance/components/GovernanceOverview.tsx:142 msgid "Voting Addresses" msgstr "" -#: src/views/yield-dtf/governance/components/AccountVotes.tsx:61 +#: src/views/index-dtf/settings/components/index-settings-governance.tsx:60 +msgid "Voting Delay" +msgstr "" + +#: src/views/yield-dtf/governance/components/AccountVotes.tsx:60 msgid "Voting on the RToken you are staked on requires you to delegate your vote to yourself or another Eth address." msgstr "" -#: src/views/yield-dtf/settings/components/GovernanceInfo.tsx:51 +#: src/views/index-dtf/settings/components/index-settings-governance.tsx:65 +#: src/views/yield-dtf/settings/components/governance-info.tsx:42 msgid "Voting Period" msgstr "" -#: src/views/yield-dtf/governance/components/AccountVotes.tsx:84 -#: src/views/yield-dtf/governance/components/GovernanceOverview.tsx:86 +#: src/views/yield-dtf/governance/components/AccountVotes.tsx:83 +#: src/views/yield-dtf/governance/components/GovernanceOverview.tsx:103 msgid "Voting power" msgstr "" -#: src/views/yield-dtf/staking/components/stake/DelegateStake.tsx:29 +#: src/views/yield-dtf/staking/components/stake/delegate-stake.tsx:28 msgid "Voting power delegation" msgstr "" -#: src/views/bridge/components/WithdrawalInfoModal.tsx:59 -msgid "Wait 1 hour" +#: src/views/index-dtf/settings/components/index-settings-governance.tsx:81 +msgid "Voting Quorum" msgstr "" -#: src/views/bridge/components/WithdrawalInfoModal.tsx:66 -msgid "Wait 7 days" -msgstr "" - -#: src/views/yield-dtf/auctions/auctions-sidebar/RecollaterizationAlert.tsx:33 +#: src/views/yield-dtf/auctions/auctions-sidebar/RecollaterizationAlert.tsx:29 msgid "Wait to trigger revenue auctions until after recollateralization has finished." msgstr "" -#: src/views/explorer/components/transactions/Filters.tsx:17 +#: src/views/explorer/components/transactions/Filters.tsx:16 msgid "Wallet" msgstr "" -#: src/views/portfolio/components/Portfolio.tsx:155 +#: src/views/portfolio/components/Portfolio.tsx:135 msgid "Wallet staked RSR + RToken Value" msgstr "" -#: src/components/rtoken-setup/token/BackingForm.tsx:41 +#: src/components/rtoken-setup/token/BackingForm.tsx:45 msgid "Warmup period (s)" msgstr "" -#: src/views/discover/components/yield/components/DeployHero.tsx:97 +#: src/views/discover/components/yield/components/DeployHero.tsx:63 msgid "Watch an intro to RTokens" msgstr "" -#: src/views/discover/components/yield/components/RegisterAbout.tsx:32 -msgid "Welcome to Register - the user interface for registering, inspecting, and interacting with RTokens. \"RToken\" is the generic name given to asset-backed stablecoins created on the Reserve Protocol, the creation of which is entirely permissionless." -msgstr "" - -#: src/views/bridge/components/BridgeFaq.tsx:62 -msgid "What if I have a question, issue or problem?" -msgstr "" - -#: src/views/bridge/components/BridgeFaq.tsx:27 -msgid "What is Register L2 Bridge?" +#: src/views/discover/components/yield/components/RegisterAbout.tsx:39 +msgid "Welcome to Reserve — a platform for creating, exploring, and interacting with Decentralized Token Folios (“DTFs”). A DTF is the generic name given to any onchain asset-backed index. DTFs can be created on Reserve’s Yield Protocol or Index Protocol permissionlessly, by any person or entity." msgstr "" -#: src/views/yield-dtf/settings/components/ListingInfo.tsx:25 +#: src/views/yield-dtf/settings/components/listing-info.tsx:38 msgid "What is Reserve Governor Alexios?" msgstr "" -#: src/views/bridge/components/BridgeFaq.tsx:56 -msgid "What wallet can I use?" -msgstr "" - -#: src/views/yield-dtf/staking/components/overview/About.tsx:9 +#: src/views/yield-dtf/staking/components/overview/about.tsx:14 msgid "When staking RSR, you are putting your RSR at risk in the case of a collateral default in exchange for 1) the rights to govern the RToken and 2) for a portion of the revenue generated by the collateral. The revenue sent to the staked RSR pool will be distributed amongst RSR stakers proportionally to their stake in the pool." msgstr "" -#: src/views/yield-dtf/staking/components/overview/About.tsx:21 +#: src/views/yield-dtf/staking/components/overview/about.tsx:26 msgid "When you stake your RSR, you will receive a stRSR receipt token which represents your ownership in the staked RSR contract. As revenue is distributed, the receipt token will be redeemable for an increasing amount of RSR. If there is a default scenario where the staked RSR is slashed, then the receipt token will be redeemable for a decreased amount of RSR." msgstr "" -#: src/views/yield-dtf/staking/components/overview/About.tsx:34 +#: src/views/yield-dtf/staking/components/overview/about.tsx:39 msgid "When you unstake your stRSR, there will be a delay (defined by governance). This is to eliminate game theory scenarios that would make the backstop RSR staked pool less effective because people would continually be incentivized to unstake and restake." msgstr "" -#: src/views/discover/components/yield/components/RegisterAbout.tsx:59 -msgid "Whenever you see the term \"overcollateralization\", we're referring to the built-in defence mechanism included in RTokens that help protect their stability in the case of any of their backing assets defaulting." -msgstr "" - -#: src/views/discover/components/yield/components/RegisterAbout.tsx:40 -msgid "Whether you're an economist looking to improve the fiat standard, a DeFi-entrepreneur seeking to fill a gap in the market, or simply an innovator with a wild idea, anyone can create their own asset-backed currency." -msgstr "" - -#: src/views/bridge/components/BridgeFaq.tsx:90 -msgid "Why does it take seven days to withdraw?" +#: src/views/discover/components/yield/components/RegisterAbout.tsx:48 +msgid "Whether you’re an economist looking to improve the fiat standard, a DeFi entrepreneur seeking to fill a gap in the market, or simply an innovator with a wild idea, Reserve makes it easy to launch your own asset-backed index." msgstr "" -#: src/components/transactions/table/index.tsx:56 -#: src/components/transactions/table/index.tsx:58 -#: src/views/bridge/components/BridgeHeader.tsx:90 -#: src/views/explorer/components/transactions/useTransactionColumns.tsx:36 -#: src/views/explorer/components/transactions/useTransactionColumns.tsx:38 -#: src/views/yield-dtf/overview/components/RTokenTransactions.tsx:86 -#: src/views/yield-dtf/overview/components/RTokenTransactions.tsx:88 -#: src/views/yield-dtf/staking/components/withdraw/AvailableUnstake.tsx:77 +#: src/components/transactions/table/index.tsx:55 +#: src/components/transactions/table/index.tsx:57 +#: src/views/explorer/components/transactions/useTransactionColumns.tsx:35 +#: src/views/explorer/components/transactions/useTransactionColumns.tsx:37 +#: src/views/yield-dtf/overview/components/rtoken-transactions.tsx:83 +#: src/views/yield-dtf/overview/components/rtoken-transactions.tsx:85 +#: src/views/yield-dtf/staking/components/withdraw/available-unstake.tsx:78 msgid "Withdraw" msgstr "" -#: src/views/yield-dtf/staking/components/UnstakeDelay.tsx:46 +#: src/views/yield-dtf/staking/components/unstake-delay.tsx:32 msgid "Withdraw RSR" msgstr "" -#: src/views/yield-dtf/settings/components/BackingInfo.tsx:36 +#: src/views/yield-dtf/settings/components/backing-info.tsx:24 msgid "Withdrawal leak" msgstr "" -#: src/components/rtoken-setup/token/OtherForm.tsx:47 +#: src/components/rtoken-setup/token/OtherForm.tsx:50 msgid "Withdrawal leak (%)" msgstr "" -#: src/views/bridge/components/BridgeWithdrawals.tsx:41 -msgid "Withdrawal Transactions" -msgstr "" - -#: src/views/yield-dtf/auctions/components/useColumns.tsx:49 +#: src/views/yield-dtf/auctions/components/useColumns.tsx:48 msgid "Worst price" msgstr "" -#: src/views/yield-dtf/issuance/components/wrapping/WrapTypeToggle.tsx:35 +#: src/views/yield-dtf/issuance/components/wrapping/WrapTypeToggle.tsx:20 msgid "Wrap collaterals" msgstr "" @@ -3025,55 +2961,59 @@ msgstr "" msgid "Wrap/Unwrap collateral" msgstr "" -#: src/views/yield-dtf/issuance/components/wrapping/WrapSidebarHeader.tsx:21 +#: src/views/yield-dtf/issuance/components/wrapping/WrapSidebarHeader.tsx:14 msgid "Wrap/Unwrap Tokens" msgstr "" -#: src/views/yield-dtf/issuance/components/about/index.tsx:24 +#: src/views/yield-dtf/issuance/components/about/index.tsx:23 msgid "Wrapping collateral tokens" msgstr "" -#: src/components/rtoken-setup/token/ExternalRevenueSplit.tsx:132 +#: src/components/rtoken-setup/token/ExternalRevenueSplit.tsx:119 msgid "X" msgstr "" -#: src/views/yield-dtf/deploy/components/GovernanceOverview.tsx:135 -msgid "You can leave your RToken paused and come back to setting up governance later." +#: src/components/layout/header/components/app-navigation.tsx:108 +msgid "Yield DTF Creator" msgstr "" -#: src/views/bridge/components/BridgeFaq.tsx:57 -msgid "You can use popular Ethereum wallets like Metamask, Rabby, Coinbase Wallet, and Rainbow Wallet to name a few." +#: src/views/discover/components/yield/components/RegisterAbout.tsx:67 +msgid "Yield DTFs (created on the Reserve Yield Protocol) feature built-in overcollateralization — a defense mechanism that helps protect stability if any backing assets default." msgstr "" -#: src/views/yield-dtf/staking/components/unstake/UnstakeModal.tsx:32 +#: src/views/yield-dtf/deploy/components/GovernanceOverview.tsx:130 +msgid "You can leave your RToken paused and come back to setting up governance later." +msgstr "" + +#: src/views/yield-dtf/staking/components/unstake/unstake-modal.tsx:31 msgid "You receive:" msgstr "" -#: src/views/yield-dtf/deploy/components/RTokenSetup.tsx:48 +#: src/views/yield-dtf/deploy/components/RTokenSetup.tsx:49 msgid "You submit the transaction configuring your RToken design" msgstr "" -#: src/views/yield-dtf/staking/components/stake/StakeModal.tsx:34 -#: src/views/yield-dtf/staking/components/unstake/UnstakeModal.tsx:26 +#: src/views/yield-dtf/staking/components/stake/stake-modal.tsx:34 +#: src/views/yield-dtf/staking/components/unstake/unstake-modal.tsx:25 msgid "You use:" msgstr "" -#: src/views/yield-dtf/deploy/components/DeployOverview.tsx:151 +#: src/views/yield-dtf/deploy/components/DeployOverview.tsx:137 msgid "You will be the temporary owner until governance is deployed in transaction 2." msgstr "" -#: src/views/yield-dtf/staking/components/stake/StakeModal.tsx:41 -msgid "You’ll receive:" +#: src/views/yield-dtf/staking/components/stake/stake-modal.tsx:41 +msgid "You'll receive:" msgstr "" -#: src/views/portfolio/components/Portfolio.tsx:183 +#: src/views/portfolio/components/Portfolio.tsx:152 msgid "Your RTokens" msgstr "" -#: src/views/yield-dtf/staking/components/StakePosition.tsx:25 +#: src/views/yield-dtf/staking/components/stake-position.tsx:29 msgid "Your stake position" msgstr "" -#: src/views/portfolio/components/Portfolio.tsx:193 +#: src/views/portfolio/components/Portfolio.tsx:158 msgid "Your staked RSR" msgstr "" diff --git a/src/locales/es.js b/src/locales/es.js index 5039d7a28..1ace3bd9c 100644 --- a/src/locales/es.js +++ b/src/locales/es.js @@ -1 +1 @@ -/*eslint-disable*/module.exports={messages:JSON.parse("{\"1LAqfa\":[\"- Redeem \",[\"0\"]],\"xEhonF\":\"(in their Github repository)\",\"J/hVSQ\":[[\"0\"]],\"/uk/m7\":[[\"0\"],\" APY\"],\"RwBJxn\":[[\"0\"],\" auctions\"],\"A1BKet\":[[\"0\"],\" Description\"],\"FGOUAP\":[[\"0\"],\" of \",[\"1\"]],\"FbyycO\":[[\"0\"],\" Price\"],\"4kl1Q6\":[[\"fromToken\"],\" amount\"],\"njiDEz\":[[\"pauseLabel\"],\" not paused\"],\"qeq9zz\":[[\"pauseLabel\"],\" paused\"],\"8UH/HA\":[[\"unit\"],\" Token distribution\"],\"9OU4oG\":\"% Acceptable\",\"SkmQRZ\":\"% Revenue share\",\"b6D1xw\":\"% Revenue to RSR Stakers\",\"MqLjTu\":\"% Revenue to RToken Holders\",\"BuQhD6\":\"% to external address\",\"Bkd1RD\":[\"+ Mint \",[\"0\"]],\"eFTnE/\":\"15 params\",\"x59O98\":\"3.4.0 Upgrade spells\",\"TEAI8I\":\"A Brief RToken Introduction\",\"Sw7Gww\":\"A good explainer for how Gnosis auctions work can be found\",\"XU7Jfb\":\"A year ago\",\"G5W/UB\":\"ABC Labs uses industry standard anonymized analytics tools to understand usage and improve the user experience. ABC Labs does not collect any information about users or their financial activity.\",\"uyJsf6\":\"About\",\"Ng/SkH\":\"Above minimum trade volume\",\"rQh1iF\":\"Abstain\",\"AeXO77\":\"Account\",\"m16xKo\":\"Add\",\"wh9uml\":\"Add new address\",\"l9C7HU\":\"Add to backup basket\",\"VYQ8Iy\":\"Add to basket\",\"xjFy3M\":\"Add to primary basket\",\"Du6bPw\":\"Address\",\"2yBN46\":\"Advanced config:\",\"92tTve\":\"After your withdrawal request is proposed onchain (transaction 1) you must verify (transaction 2) and complete (transaction 3) the withdrawal in order to access your funds. You can track your progress in the transactions table under Withdrawals.\",\"GFvPy6\":\"Against\",\"ypVIwM\":\"Alexios is standard token-voting adopted from Compound Governor Bravo, with adjustments accounting for RSR being staked across multiple RTokens.\",\"XOJDc9\":\"All time\",\"+0K6xY\":\"All unlisted RTokens\",\"hehnjM\":\"Amount\",\"2NFd5O\":\"Annualized RSR Stakers Revenue\",\"yts6Fj\":\"Annualized RTokens Revenue\",\"U6AQ7u\":\"Anyone can click the button above to check and trigger an auction for any revenue that has accrued or for rebalances that need to happen. Please note that for RTokens with many collateral types in the basket, this may be an expensive transaction to execute.\",\"73QZmA\":\"Approve in wallet\",\"MAaLW+\":\"Are there any fees involved in using Base Bridge?\",\"jQSzKJ\":\"As RSR\",\"xrBkuC\":\"As RToken\",\"SHPE7u\":\"Asset Registry\",\"LG54As\":\"Auctionable revenue\",\"Vchc1B\":\"auctioned\",\"rhMQ3Z\":\"Auctions\",\"ZDmC6j\":\"Available collateral\",\"b0tqCW\":\"Back to Governance\",\"9aZHfH\":\"Back to settings\",\"02uyLF\":\"Backing\",\"kg0lD1\":\"Backing & Risk\",\"gdgoAB\":\"Backing + Overcollaterization:\",\"7rqC5h\":\"Backing + Staked\",\"qvSTRH\":\"Backing buffer\",\"E/kZN+\":\"Backing buffer - percentage value that describes how much additional collateral tokens to keep in the BackingManager before forwarding tokens to the RevenueTraders. The RevenueTraders here refers to the RToken and RSR traders. Why this matters? It allows collateral tokens to be periodically converted into the RToken, which is a more efficient form of revenue production than trading each individual collateral for the desired RToken. It also provides a buffer to prevent RSR seizure after trading slippage. For more info on the BackingManager and Trader types see the “Revenue distribution to RToken holders” and “Summary of revenue distribution” in our documentation.\",\"0DN8vr\":\"Backing buffer (%)\",\"EIcaiW\":\"Backing config\",\"c23a1k\":\"Backing Manager\",\"W2Q1/M\":\"Backing Parameters\",\"a8IIG5\":\"Backup basket\",\"kFRSvP\":\"Backup configuration tracks primary basket changes to update its values. This may not be desired on a proposal, you can choose to propose new changes.\",\"llDXYJ\":\"Backups\",\"0QDjxt\":\"Balance:\",\"ehOkF+\":\"Basics\",\"HG4SWx\":\"Basket\",\"+cJZX5\":\"Basket APY\",\"p5/O52\":\"Basket defaulted\",\"x1Ujs3\":\"Basket Handler\",\"HFgTxe\":\"Basket iffy\",\"g1KZ8Y\":\"Basket is not ready\",\"+s9pmq\":\"Basket scale for this unit of account. This is used to initially calculate how much of each token is required for minting.\",\"fSh1F2\":\"Basket warmup period\",\"+WPOsr\":\"Batch auction length\",\"CZUigm\":\"Batch Auction length - defines how long Gnosis EasyAuction auctions should be. Gnosis EasyAuction is a platform enabling fair price discovery for tokens through the use of batch auctions.\",\"U7USFW\":\"Batch Auction length (s)\",\"nd4lSI\":\"Batch trade\",\"rf/1ro\":\"Be aware that anyone can create an RToken that ends up on this list. We don't apply any standards beyond what can be done with the Reserve Protocol.\",\"PBnztC\":\"Begin governance setup\",\"ZRBNIp\":[\"Begin minting \",[\"0\"],\" \",[\"1\"]],\"DNiYLX\":[\"Begin redemption of \",[\"0\"],\" \",[\"1\"]],\"qaArC7\":\"Below minimum trade volume\",\"8DIDYI\":\"Bought\",\"mkW9xD\":\"Broker\",\"O2UpM1\":\"Browse\",\"+SwX7M\":\"Browse RTokens\",\"oS2F65\":\"Buying\",\"prlK0G\":\"Can I cancel a withdrawal?\",\"nTAJs/\":\"Can’t find what you’re looking for elsewhere or want to join the conversation?\",\"dEgA5A\":\"Cancel\",\"xcRNSV\":\"Cancel Issue\",\"jE3OmQ\":\"Cancel proposal\",\"xouc5P\":\"Cancel unstake\",\"YiF3/Q\":\"Cast Spell 1\",\"YwD4dh\":\"Cast Spell 2\",\"4ZzlJd\":\"Casting 3.4.0 upgrade spell\",\"VvjZ7K\":\"Caution\",\"xjhtsV\":\"Chain\",\"o+XJ9D\":\"Change\",\"IICqKY\":\"Change backup basket\",\"OC3bUY\":\"Change distribution\",\"rEptSB\":\"Change diversity factor\",\"pVgGbU\":\"Change in:\",\"B6FtWk\":\"Change primary basket\",\"gqu6u3\":\"Check for auctions\",\"GXo8gr\":\"Choose between our Alexios Governor and anything between one man rule to arbitrary DAO structure under your defined Ethereum address.\",\"31T9Uy\":\"Choose Redemption Basket\",\"hom7qf\":\"Claim\",\"ngS/8Z\":[\"Claim $\",[\"0\"]],\"Q8mMek\":\"Claim rewards across all traders\",\"y2L2W5\":\"Claimable emissions\",\"q0gCXD\":\"Collateral distribution\",\"zXlSi4\":\"Collateral Exposure\",\"pB3Yot\":\"Collateral Plugins\",\"52SO2+\":\"Collateral token\",\"t4r50E\":\"Collateral(s)\",\"bwdIqT\":\"Community Discord\",\"5NmEnz\":\"community is available around the clock for general questions, assistance and support!\",\"1KBao4\":\"Compare RTokens\",\"bD8I7O\":\"Complete\",\"en/H+I\":\"Complete withdrawal on Mainnet\",\"RW+4/D\":\"Configure your vote\",\"z77j59\":\"Confirm & prepare proposal\",\"PZZf4D\":\"Confirm & Submit\",\"XXw3LT\":\"Confirm changes made\",\"Eq4P3S\":\"Confirm delegate\",\"iSLIjg\":\"Connect\",\"CtByM7\":\"Connect Wallet\",\"iH8itU\":\"Connect your wallet\",\"FNKsXU\":\"Contract Addresses\",\"ogCHh3\":\"Contract upgrades\",\"qS2FaE\":\"Contracts\",\"u+VWhB\":\"Copied to clipboard!\",\"/4gGIX\":\"Copy to clipboard\",\"+2ovA+\":\"Create proposal\",\"88kg0+\":\"Created At\",\"7vEC4B\":\"current\",\"Hp1l6f\":\"Current\",\"bmmEBC\":\"Current holder\",\"ADH2UX\":\"Current status:\",\"srRMnJ\":\"Customize\",\"QQ2SBx\":\"Decimals\",\"drp73Y\":\"Default delay\",\"0hSka2\":\"DeFi protocols oftentimes have incentives for liquidity that are paid in their token or a combination of tokens. By providing liquidity for trading or lending or other activities on these protocols, you can earn rewards that are sometimes quite high! Note that there are always risks (smart contract risks, impermanent loss risks, etc), in providing liquidity on these protocols so please make sure you understand things before blindly diving in.\",\"mgR7iR\":\"DeFi yield opportunities for RTokens in Convex, Curve, Yearn & Beefy\",\"UpgRb2\":\"Define what portion of the revenue goes to the RToken holders versus RSR stakers. It can also be configured to send a portion of the revenue of an RToken to any arbitrary Ethereum address (wallet or smart contract).<0/><1/>\",\"QpGF0U\":[\"Delay (in number of \",[\"0\"],\") since the proposal starts until voting ends.\"],\"YSajVI\":\"Delay in seconds\",\"hyt0Ac\":\"Delay in Seconds\",\"XbvxUa\":\"Delegate\",\"fSkQWU\":\"Delegate to\",\"Ui1tti\":\"Delegate votes\",\"nsUy30\":\"Delegate voting power\",\"aFfRAV\":\"Delegate voting power for future votes\",\"2VoM3e\":\"Delegated to self\",\"if4+2Q\":\"Delegated to:\",\"GLUC2q\":\"Deploy\",\"7SrxgE\":\"Deploy an RToken\",\"zoFqVH\":\"Deploy Governance\",\"GO6A9W\":\"Deploy RToken\",\"cs1EEG\":\"Deploy transaction submitted\",\"PmRw7M\":\"Deploy your own RToken\",\"YEpmZo\":\"Deploying through this UI doesn't require deep technical knowledge as long as you don't need novel collateral plugins for your baskets. However, we encourage you to talk to someone proficient in the protocol and read the docs to learn more before confirming any transactions.\",\"kj3M8S\":\"Deposit\",\"gN/Sjx\":\"Deposits: a few minutes usually, only requires 1x transaction. Withdrawals: 7 days, 3 transactions.\",\"Nu4oKW\":\"Description\",\"pRLw2a\":\"Details + Roles\",\"bzSI52\":\"Discard\",\"/XQgft\":\"Discover\",\"iQSUHl\":\"Discussions of ideas and suggestion that the community has on improving the Reserve Ecosystem\",\"1QfxQT\":\"Dismiss\",\"MYod0t\":[\"Display only \",[\"0\"],\" related collaterals\"],\"7C9ebc\":\"Distributed revenue does not add up to 100%\",\"XsPuIt\":\"Distributor\",\"CobcOM\":\"Diversity factor\",\"IhmalY\":\"Diversity Factor\",\"TvY/XA\":\"Documentation\",\"QtNpcx\":\"Duration in seconds\",\"oHUnqt\":\"Duration in Seconds\",\"MrVW7f\":\"Dutch auction length\",\"5dVVsn\":\"Dutch Auction length (s)\",\"pfaRE0\":\"Dutch trade\",\"RLDSN8\":\"Each target unit of your primary basket will have defined emergency collateral to replace with in case of default.\",\"rcvQYl\":\"Each type of trade can currently happen in only one way; the protocol launches a Gnosis EasyAuction. The Reserve Protocol is designed to make it easy to add other trading methods, but no other methods are currently supported.\",\"QIuujP\":\"Earn\",\"ePK91l\":\"Edit\",\"ZJhuy5\":\"Emergency basket\",\"XWoKr0\":\"Emergency Collateral\",\"PU/y6X\":\"Empty backup basket\",\"gAVoMF\":\"Empty Basket\",\"4t/yW7\":\"Ended at\",\"Kxg5/E\":\"Ended auctions\",\"fPOajI\":\"Ends at\",\"fn/6Aa\":\"Ensure that the asset(s) you are unregistering do not have pending revenue that can be\",\"6FHCpe\":\"Est. APY\",\"cBgRZm\":\"Est. APY:\",\"UJrReY\":\"Est. Staking APY\",\"hrp5QR\":\"Estimated basket APY\",\"FEt55g\":\"Estimated gas cost\",\"Aw88aM\":\"Estimated gas cost:\",\"tdllfV\":\"ETH address\",\"51OY3J\":\"Executable code\",\"QwwYl1\":\"Execute proposal\",\"0BKROZ\":\"Execution Delay\",\"JJ/1wI\":\"Exit Deployer\",\"8tjQCz\":\"Explore\",\"c8OQUt\":[\"Explore yield opportunities for \",[\"0\"]],\"PKItzG\":\"Extra collateral to keep\",\"osWXWB\":\"Farm\",\"Z0UMy9\":\"Featured RTokens\",\"EzkIsi\":\"File new issues or view & upvote existing feedback.\",\"rpilX8\":\"Final price in:\",\"f+unss\":\"First-loss RSR Capital\",\"YHpbe1\":\"For\",\"Q0xGVH\":\"Freeze State\",\"ejVYRQ\":\"From\",\"kdnzvG\":\"From:\",\"9DGbad\":\"Frozen\",\"9Pk/+F\":\"Full exposure view\",\"eI/TLj\":\"Funds moved\",\"1jYZaW\":\"Furnace\",\"bWMGJN\":\"Go to the RToken Deployer\",\"dE6BLF\":\"Governance\",\"i2y1O5\":\"Governance Details\",\"WNrgVT\":\"Governance format\",\"Sku3Zy\":\"Governance forum\",\"olT/Wc\":\"Governance gets deployed & your RToken is now usable (if unpaused)\",\"pYpb1y\":\"Governance parameters\",\"qdZImh\":\"Governance roles\",\"NmI7Ll\":\"Governor address\",\"M4YZCC\":\"Governor mandate\",\"i/oT62\":\"Guardian\",\"V0H90D\":\"Guardian address\",\"OAfk3i\":\"Hash\",\"r+1aZf\":\"Historical metrics\",\"wssdFG\":\"Holders APY\",\"GCTzEY\":\"How do I verify my withdrawal transaction?\",\"HxV134\":\"How do withdrawals work?\",\"UV0ZnN\":\"How fast will my tokens arrive?\",\"l5O21S\":\"If an RToken is listed on Register, it doesn't mean that ABC Labs endorses the safety or risk levels of the RToken or that ABC Labs was involved in the creation of or is in anyway responsible for the RToken. ABC Labs requires Github requests with additional information beyond what is available on the blockchain to give users relevant data to make informed decisions. As a user, please evaluate any new RToken carefully before holding or staking your RSR on them.\",\"b3XmO9\":\"If you prefer not to wait, instead of making a withdrawal using Register L2 Bridge, you also have the option to utilize a third-party bridge for quicker withdrawals.\",\"GYgvDh\":\"If your token is paused and you have the correct role, you can unpause it here.\",\"9L7NSU\":\"Immediate\",\"pJ2Ng0\":\"In Withdraw Process\",\"yIRfV3\":\"Including off-chain in-app transactions of RToken in the Reserve App.\",\"rqptfw\":\"Initial RToken state after deployment\",\"SUkrBJ\":\"Input delay\",\"glKVIy\":\"Input delay in hours\",\"NgIppW\":\"Input plugin address (not ERC-20 address)\",\"g7BX9A\":\"Input proposal threshold\",\"0n6GRN\":\"Input proposal title\",\"OPVsCp\":\"Input quorum percent\",\"i8EW0F\":\"Input RFC link\",\"I3M3ju\":\"Input RSR stakers revenue distribution\",\"/A3dHx\":\"Input the guardian ethereum address\",\"SIHhwZ\":\"Input the owner ethereum address\",\"6cDDmZ\":\"Input ticker\",\"Ze3la6\":\"Input token holders revenue distribution\",\"0Rrfh3\":\"Input token name\",\"wjincn\":\"Input token name or symbol\",\"d/VrnV\":\"Input voting period\",\"WZK33i\":\"Input wallet\",\"U/iNrh\":\"Input withdrawal leak %\",\"NWSIX1\":\"Inspect\",\"cg7wLy\":\"Inspect collateral backing, mint, stake, redeem & explore additional earn opportunities across DeFi\",\"kka8e4\":\"Intro\",\"a3U7In\":[\"Invalid (\",[\"targetUnit\"],\") backup diversity factor\"],\"xEIcwa\":[\"Invalid (\",[\"targetUnit\"],\") basket distribution\"],\"CKp2aP\":[\"Invalid (\",[\"targetUnit\"],\") basket scale\"],\"Kw1+qc\":\"Invalid address\",\"Kjox/d\":\"Invalid asset\",\"TjramT\":\"Invalid collateral\",\"AXu7J/\":\"Invalid destination address\",\"N5kBDi\":\"Invalid ethereum address\",\"n5/QY4\":\"Invalid maximum range\",\"NqF94Y\":\"Invalid minimum range\",\"WY8amq\":\"Invalid number\",\"w8xQRx\":\"Invalid value\",\"Xtj6BR\":\"Issuance amount - allows the issuer to limit the amount of RTokens issued per hour. This matters in the event of an exploit where an attacker tries to issue more RTokens. This buys time for users with pause or freeze permissions to reduce the amount of RTokens that can be issued.\",\"x9GEpw\":\"Issuance rate - allows the issuer to limit the amount of RTokens issued per hour based on a percentage of the current RToken market cap. This matters in the event of an exploit where an attacker tries to issue more RTokens. This buys time for users with pause or freeze permissions to reduce the amount of RTokens that can be issued.\",\"dScyNc\":\"Issuance throttle amount\",\"tjTLy7\":\"Issuance throttle rate\",\"0U/Tk/\":\"Issuance throttle Rate\",\"U9ks0t\":\"Issuance throttle rate (%)\",\"DLNgVH\":\"Issue\",\"Z3FXyt\":\"Loading...\",\"b4vxFC\":\"Long Freeze\",\"XUds+a\":\"Long freeze duration\",\"+RU5yD\":\"Long freeze duration - freeze an RToken’s system for a longer period of time. A long-freezer has 6 charges before losing the ability to freeze any more\",\"BmvM5L\":\"Long freeze duration (s)\",\"98fSbL\":\"Made your own collateral?\",\"D16asK\":\"Main\",\"HQc4VD\":\"Make proposed changes to the backing basket, emergency collateral, governance params, etc. Changes in multiple areas can be batched into a single proposal although to make voting on issues simpler it may make sense to separate things if unrelated.\",\"bKXjUF\":\"Mandate\",\"fAfiCl\":\"Mandate cannot be longer than 256 characters\",\"dViFQP\":\"Mandate is required\",\"/DCw0h\":\"Market cap:\",\"Kow4Yn\":\"Max trade slippage\",\"Q/sl1D\":\"Max trade slippage — maximum deviation from oracle prices that any trade can clear at. Why this matters? Acts as a form of slippage protection.\",\"D7h0du\":\"Max trade slippage (%)\",\"8wGbsh\":\"Maximum trade for RToken\",\"iDr5Z5\":\"Maximum trade volume - maximum sized trade for any trade involving RToken, in terms of the unit of account eg. USD.\",\"PlJdlY\":\"Mechanics\",\"p5fpTr\":\"Meditate peacefully on the stability of a future asset backed reserve currency while your RToken deploys 🧘‍♂️\",\"BxWKeM\":\"Melt\",\"YjzAfU\":\"Melting\",\"iVav3e\":\"Minimum trade in USD terms\",\"LoH4s+\":\"Minimum trade size\",\"IwXX9d\":\"Minimum trade volume\",\"JWf8LL\":\"Minimum trade volume - minimum sized trade that can be performed, in terms of the unit of account eg. USD.\",\"HCswgj\":\"Minimum trade volume ($)\",\"5IrCQY\":\"Mint\",\"kI1eQH\":\"Mint - Global throttle\",\"KaOUA4\":[\"Mint \",[\"0\"]],\"L2MqsA\":\"Mint + Redeem\",\"XXCmTE\":\"Mint amount\",\"maOPkj\":\"Mintable now\",\"irOfE1\":\"Minting requires a deposit of the defined collateral tokens in equal value amounts to the RToken smart contracts.\",\"GhJQm9\":\"Missing collateral\",\"TiC6Xh\":\"Mkt Cap\",\"e2+lHb\":\"mth\",\"6YtxFj\":\"Name\",\"moeKLu\":\"Navigate to the Withdrawal tab and view transactions below. Next to your transaction, use the button to complete the next available action. This action will ask you to complete the next required step to move your transaction forward and receive your withdrawn tokens in your wallet.\",\"gv/ySg\":\"Need help bridging?\",\"HBI6nY\":\"Need help?\",\"OR475H\":\"Network\",\"W2iax5\":\"Networks\",\"bkcUbj\":\"New backup configuration\",\"bSZuP8\":\"New primary basket\",\"KqojOL\":\"Next steps\",\"W5JlJM\":\"No actionable revenue available\",\"UsxK+A\":\"No assets to unregister...\",\"plhHQt\":\"No data\",\"rP4PKZ\":\"No emergency collateral for target\",\"uhqYEB\":\"No emergency collateral for this target unit\",\"6fx8ZN\":\"No ended auctions\",\"OyCrBF\":\"No holders for this role...\",\"Eo6Lg5\":\"No plugins available\",\"m+s/1w\":\"No proposals created...\",\"xc4rPs\":\"No transactions\",\"LbyTTW\":\"No transactions in local memory...\",\"p2vqx1\":\"No voters at this moment...\",\"VHVdS1\":\"No votes\",\"Tpt0Ho\":\"No withdrawals found for connected wallet.\",\"8f/nnw\":\"No, if a withdrawal has already been initiated on the Withdraw page it is not possible to cancel it. Once withdrawn, the process needs to be completed.\",\"EdQY6l\":\"None\",\"OJx3wK\":\"Not available\",\"I7CwKt\":\"Not frozen\",\"GE3hR8\":\"Not ready to set up governance?\",\"X12LZU\":\"Not sure what you're looking at?\",\"eWxpbp\":\"Ongoing auctions\",\"Z2UK1U\":\"Ongoing dutch auctions\",\"qg1O48\":\"Only the guardian address or governance will be able to unpause\",\"/IX/7x\":\"Other\",\"snZOdR\":\"Other config\",\"UjFzc9\":\"Other parameters\",\"jBJkMt\":\"Other Parameters\",\"ed2+9W\":\"Other Risks\",\"6/dCYd\":\"Overview\",\"LtI9AS\":\"Owner\",\"xkAsLE\":\"Owner address\",\"X1mZKh\":\"Owner Address\",\"F18WP3\":\"Parameters\",\"sDP9Ho\":\"Pause status\",\"89oleM\":\"Peg:\",\"lIBAz6\":\"Pending auctions to settle\",\"J2tM5d\":\"Pending, sign in wallet\",\"9FqwqX\":\"Period in seconds\",\"kDRVPV\":\"Phase\",\"F3bW6y\":\"Platform\",\"I6NohP\":\"Platform exposure\",\"Dx9h/1\":\"Please carefully evaluate the RToken before choosing to stake your RSR here. If any of the various collaterals of this RToken default, then the staked RSR will be the first funds that get auctioned off to make up the difference for RToken holders.\",\"Q8+uwY\":\"Please complete the required governance configuration to complete deployment.\",\"ujpEaI\":\"Please connect your wallet\",\"3ebyPI\":\"Please don't close this window to avoid issues finding your way back here.\",\"A+8PId\":\"Please keep in mind that interactions with the Ethereum or Base blockchains are pseudonymous and publicly available.\",\"WsVNsQ\":\"Please read more about how Register manage tokens on our repository\",\"yUHPo3\":\"Please select an asset to claim\",\"oKucDI\":\"Please sign the transaction in your wallet to continue with the deployment process.\",\"aSt5Rp\":\"Please sign the transaction in your wallet to continue with the governance process.\",\"IZwgAK\":\"Please sign the transaction in your wallet to continue with the government configuration process.\",\"eiVzdG\":\"Please wait while the simulation executes\",\"ou6PkF\":\"Pool\",\"MqA4qt\":\"Portfolio\",\"QKskSe\":\"Preparing transaction\",\"a7u1N9\":\"Price\",\"wTvlZg\":\"Primary basket\",\"vFeILc\":\"Primary Basket\",\"GycO8a\":\"Primary basket not defined\",\"CpEYLQ\":\"Proceed in wallet\",\"e0NrBM\":\"Project\",\"oDQ5xF\":\"Proposal execution delay (hours)\",\"Yh49N4\":\"Proposal Threshold\",\"CPVP0+\":\"Proposal Threshold (%)\",\"ypPAJ2\":\"Proposal Title\",\"6g1gi0\":\"Proposals\",\"i4xxYn\":\"Proposals voted\",\"H3cnhC\":[\"Propose changes to $\",[\"0\"]],\"A+iiAx\":\"Propose how the basket should be distributed going forward.\",\"aqHaEK\":\"Propose new backup configuration\",\"P+Quwn\":\"Propose new basket\",\"3sRog+\":\"Proposed\",\"bZZ1DH\":\"Proposed by\",\"j3CapQ\":\"Protocol Docs\",\"/s+80y\":\"Provide liquidity across DeFi & earn more with your RTokens\",\"EU/w8s\":\"Queue proposal\",\"9OBKm7\":\"Quorum\",\"8uEgwp\":\"Quorum (%)\",\"Fn9TcI\":\"Quorum?:\",\"VcQdaO\":\"Read more about revenue distribution\",\"3Imb0U\":\"Receiving eth address\",\"j3sA7W\":\"Recent proposals\",\"UhF/tF\":\"Record limit\",\"VCG/e6\":\"Redeem\",\"z7p6LJ\":\"Redeem - Global throttle\",\"sk7H6q\":[\"Redeem \",[\"0\"]],\"vq/idj\":\"Redeem amount\",\"qFHaGG\":\"Redeemable now\",\"xmPyUn\":\"Redemption amount - allows the issuer to limit the amount of RTokens redeemed per hour. This matters in the event of an exploit where an attacker tries to redeem RTokens.This buys time for users with pause or freeze permissions to reduce the amount of RTokens that can be redeemed.\",\"Jd7EeB\":\"Redemption rate - allows the issuer to limit the amount of RTokens redeemed per hour based on a percentage of the current RToken market cap. This matters in the event of an exploit where an attacker tries to redeem RTokens. This buys time for users with pause or freeze permissions to reduce the amount of RTokens that can be redeemed.\",\"ta/cTS\":\"Redemption throttle amount\",\"MrnlGV\":\"Redemption throttle rate\",\"HKPYsc\":\"Redemption throttle Rate\",\"KDqZm9\":\"Redemption throttle rate (%)\",\"muMr9+\":\"Refresh quote\",\"1Go5ao\":\"Register Assets\",\"Rcw4Ec\":\"Register Feedback\",\"ZHUnsw\":\"Register is an open source project developed and maintained by ABC Labs as the first dApp to interact with the Reserve Protocol and various RTokens deployed with the platform.\",\"mLb7PA\":\"Register L2 Bridge enables the transfer of certain digital assets and other data back and forth between Ethereum and Base.\",\"/7T5Z1\":\"Register listed RTokens\",\"Zllgcd\":\"Register Listing\",\"Pci103\":\"Registering assets\",\"FZPbrN\":\"Registration of an asset plugin enables the RToken to price an underlying ERC20 token. Where an asset plugin for the underlying token already exists, the existing asset plugin is replaced with the new one.\",\"QS7Iqq\":\"Regular minting\",\"Z22ZHd\":\"Related Contracts\",\"t/YqKh\":\"Remove\",\"1RVBJe\":\"Request sent\",\"Y0kXxR\":\"Required setup:\",\"dA1zfj\":\"Required:\",\"1ex6fX\":\"Reserve aims to help people around the world maintain their spending power by allowing anyone to create asset-backed currencies with tokenized assets on the Ethereum blockchain in customizable and novel ways.\",\"9B4C/p\":\"Reserve Bridge\",\"gHuu3G\":\"Reserve Discord\",\"zsUWkY\":\"Reserve Forum\",\"z95yhS\":\"Reserve Protocol Smart-Contract Risk\",\"EQvnVc\":\"Revenue distribution\",\"7ALdX9\":\"Revenue Distribution\",\"sfFoij\":\"Revenue share\",\"UaUjkN\":\"Revenue split\",\"jJdwCB\":\"Revert\",\"pynxnf\":\"Review stake\",\"ktUGFg\":\"Reward ratio\",\"SOJxcI\":\"Reward ratio - amount of the current reward amount that should be handed out in a single block. The default corresponds to a half life of approximately 15 days.\",\"DATVA/\":\"Reward ratio (decimals)\",\"kEqOfQ\":\"RFC\",\"Zb7zns\":\"Risk evaluation\",\"W8K/75\":\"Role held by:\",\"5dJK4M\":\"Roles\",\"iQ+Xt1\":\"Roles & Controls\",\"59Dk0F\":\"RSR available to withdraw\",\"JxdCy/\":\"RSR Staked\",\"5YPwIl\":\"RSR Stakers\",\"dNQZNq\":\"RSR Trader\",\"bsalqT\":\"RToken Address\",\"03lM+L\":\"RToken Deployment Transaction succeeded\",\"7R+Rtn\":\"RToken Details\",\"1pynDW\":\"RToken holders\",\"v+QrKR\":\"RToken in Wallet\",\"fbrLqM\":\"RToken is frozen\",\"togYEE\":\"RToken is paused\",\"bsxAWr\":\"RToken mandate\",\"Nj/5dc\":\"RToken Market Cap\",\"En3lQ+\":\"RToken Maximum trade volume\",\"oMnqeW\":\"RToken Maximum trade volume ($)\",\"5EuWoG\":\"RToken Trader\",\"alx8ZZ\":\"RToken will be fully functional\",\"ymns7Z\":\"RToken will be left in pause state\",\"K1iv1D\":\"RToken will be ready to use after this TX if you choose to unpause.\",\"d3wKBU\":\"RTokens\",\"PnFsqo\":\"RTokens are 100% backed by a diversified set of underlying collateral tokens...\",\"1i9qCJ\":\"RTokens in this list is not an endorsement or audited by us. It’s simply RTokens that have gone through our listing process and don’t seem like clear scams.\",\"SsYoDT\":\"RTokens live on a blockchain, either Ethereum or Base, which means that they can be transacted worldwide within seconds. They're also 100% backed by other assets living on that same blockchain. The users of the currency can - at any time - redeem their RTokens for backing assets worthe the same value.\",\"tfDRzk\":\"Save\",\"A1taO8\":\"Search\",\"EAVrtH\":\"Search by token symbol\",\"K29LLi\":\"Select proposal type\",\"0RrIzN\":\"Select token\",\"WEVa0d\":\"Selling\",\"xmi4fw\":\"Send verify tx on Mainnet\",\"BecCbK\":\"Settle all\",\"81aX0K\":\"Settleable auctions\",\"qSVeRc\":\"Setup Governance\",\"d+U+9W\":\"Shared externally\",\"ExN9Hw\":\"Shared with RSR Stakers\",\"TnNnVh\":\"Shared with RToken Holders\",\"mif1tC\":\"Short Freeze\",\"ww1hmr\":\"Short freeze duration\",\"ZC1jjY\":\"Short freeze duration (s)\",\"l8wHqt\":\"Short freezers have the responsibility of freezing an RToken if anything dangerous or suspicious is happening. This is a one-shot freeze and the role will be revoked after a single use. This field determines how long the RToken will remain frozen until the freeze expires or is extended by another actor.\",\"n+8yVN\":\"Signature\",\"wENF7v\":\"Signing Tx 1\",\"88o7M6\":\"Signing Tx 2\",\"9cNlqf\":\"Simulate proposal\",\"ElVQVf\":\"Simulate Proposal\",\"8qwuC/\":\"Simulation successful ✓\",\"wmlz0b\":\"Simulation unsuccessful ✘\",\"vi7Gkt\":\"Small revenue auctions\",\"oC5VUA\":\"Snapshot Delay\",\"s9KGXU\":\"Sold\",\"EAGRJL\":\"Some collateral tokens from protocols like Aave and Convex differ technically from other collateral tokens. To ensure proper handling, they must be wrapped in a contract for effective monitoring. Once wrapped, the collateral remains the same but has a new interface for price and appreciation tracking.\",\"pfKK+t\":\"Spell 1\",\"2+Ty+2\":\"Spell 2\",\"n/7eJI\":\"St Token Ticker\",\"JYKRJS\":\"Stake\",\"H6nEG8\":\"Stake + Unstake\",\"4T0Zfr\":\"Stake pool\",\"FXFgMV\":\"Stake pool USD value:\",\"OinOun\":\"Stake RSR\",\"q6lAbz\":\"Staked\",\"yuBO6n\":\"Staked RSR\",\"dH1S+k\":\"Staked RSR Overcollateralisation\",\"KRwsdB\":\"Stakers APY\",\"f8rob6\":\"Staking RSR\",\"H7qwjR\":\"Staking token\",\"rCQOIX\":\"Staking yield share ends\",\"lsLMXZ\":\"Start Issue\",\"uAQUqI\":\"Status\",\"htTcVX\":\"Status:\",\"39OpPc\":\"Stay patient while the transaction is in progress & don’t close this window to avoid issues finding your way back here.\",\"kHijuY\":\"Still have questions? Come talk to the Reserve community in our Discord server. We'd be more than happy to help!\",\"XvmLhx\":\"stRSR payout fraction 0.0\",\"nDsw/H\":\"stRSR Token\",\"nU3mt/\":\"Submit proposal on-chain\",\"bwSQI0\":\"Supply\",\"xE0CMr\":\"Surplus below minimum trade\",\"8Ps70y\":\"Symbol\",\"O6Z3uT\":\"Target:\",\"iA99DC\":\"Target(s)\",\"WNtc8U\":\"The amount of assets selected affects the gas price, this asset may not be worth claiming yet.\",\"rbkFds\":[\"The configured network \\\"\",[\"currentChain\"],\"\\\" is different from the wallet selected network \\\"\",[\"chainId\"],\"\\\"\\\". Change your network in the connected wallet.\"],\"/o1XvT\":\"The creation of new RToken designs is permissionless. If you are the inventive type and have ideas for what assets should be in the basket, what a good governance looks like, or anything novel that could work within the realms of the protocol, please consider putting those ideas into practice or sharing them with the community.\",\"DiXm3I\":\"The diversity factor determines the amount of emergency collateral that will be deployed to the RToken basket in the case of a default.\",\"V302gs\":\"The dutch auction length is how many seconds long falling-price dutch auctions should be. A longer period will result in less slippage due to better price granularity, and a shorter period will result in more slippage.\",\"ETZEWb\":\"The fraction of RSR stake that should be permitted to withdraw without a refresh. When cumulative withdrawals (or a single withdrawal) exceed this fraction, gas must be paid to refresh all assets.\",\"wHW6eD\":\"The guardian has the ability to reject proposals even if they pass. Should be assigned to a multisig or EOA that can be trusted to act as a backstop. It is acceptable if it is relatively slow to act. Only one guardian address should be defined.\",\"B9PIbV\":\"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.\",\"+hApc9\":\"The minimum amount of time after a proposal passes before it can be executed.\",\"XmfFIm\":\"The minimum percentage of stRSR ownership on an RToken to be able to create a proposal.\",\"7YOBWU\":\"The minimum percentage of stRSR voter participation (either For or Abstain) on a proposal before it can be passed.\",\"QqcMwa\":\"The pauser(s) can put the RToken in two states which can be either true or false (no set duration):\",\"VzPx0Z\":\"The projected annual revenue generated by the protocol for RSR stakers, calculated using the current RSR staker APY and the amount of staked RSR for the listed RTokens.\",\"1RZ0qL\":\"The projected annual revenue generated by the protocol for RToken holders, calculated using the current APY and TVL of the listed RTokens.\",\"EJGWha\":\"The Reserve Project\",\"3caoaJ\":\"The Reserve Protocol makes a few different types of trades\",\"gqYTsB\":\"The token supply is not enough for changing the primary basket safely, contact the Reserve team for recommendations.\",\"is3nYM\":\"The top level decision maker, typically a decentralized governance smart contract, responsible for setting or updating all RToken parameter values, RToken baskets, etc. - The RToken OWNER has the power to:\\ngrant and revoke roles to any Ethereum account\\npause and unpause the system\\nfreeze and unfreeze the system\\nset governance parameters\\nupgrade system contracts\",\"9pSFbO\":\"The total value of all RSR staked in the protocol\",\"2/2c30\":\"The total value of all RToken in circulation\",\"nlmg5u\":\"The warmup period is how many seconds should pass after the basket regained the SOUND status before an RToken can be issued and/or a trade can be opened.\",\"RnKfJB\":\"There are network fees involved which are used to pay for the gas costs on Ethereum and Base. There are no additional fees.\",\"gQIzLz\":\"There’s two freezing roles that put the system in the same state for different durations:\",\"lpTJF8\":\"This address already holds this role\",\"8y1g5b\":\"This App\",\"te2erb\":\"This asset is already (being) registered\",\"B8AaMI\":\"This field is required\",\"yGeylI\":\"This is the target collateral basket at the onset of an RToken that defines which collateral needs to be deposited for issuances. The prime basket is directly set by governance, and only changes through successful governance proposals.\",\"73I6CL\":\"This seven day bridge duration is in place as a challenge period security measure built into the OP Stack.\",\"LK9M3g\":\"Ticker\",\"FAeo39\":\"Ticker - symbol eg. USD+\",\"LhMjLm\":\"Time\",\"XelGWQ\":\"Timelock address\",\"ZxkdRe\":\"To:\",\"TP9/K5\":\"Token\",\"1RKej3\":\"Token details\",\"06o+4H\":\"Token Details\",\"XCLYYd\":\"Token exposure\",\"SKZhW9\":\"Token name\",\"v3O3qT\":\"Token name - the name of the RToken eg. Savings Dollar\",\"dUcbZZ\":\"Token name required\",\"bqervZ\":\"Token ticker is required\",\"6RDwJM\":\"Tokens\",\"wzyEKJ\":\"Tokens to match trade\",\"efXgiG\":\"Top voting addresses\",\"G3RyLw\":\"Total % to arbitrary address\",\"cBsi4+\":\"Total initial RToken scale including all targets. If your RToken only has one target unit this will be the same as the basket scale input.\",\"KZ1u6+\":\"Total Market Cap\",\"iaxJrF\":\"Total RSR staked\",\"Wg0Nr2\":\"Trader contract address\",\"MM0Byw\":\"Trader contract for batch trades.\",\"V03foK\":\"Trader contract for Dutch trades.\",\"RrkUqq\":\"Trader implementations\",\"2qh1i8\":\"Trading delay\",\"uQt4Id\":\"Trading delay - how many seconds should pass after the basket has been changed, before a rebalancing trade is opened. Why does this matter? To avoid losses due to poor liquidity.\",\"X0neaw\":\"Trading delay (s)\",\"Cd3fOR\":\"Transaction 1\",\"lCJhs9\":\"Transaction 2\",\"CjHP6C\":\"Transaction confirmed\",\"u3ZeYl\":\"Transaction failed\",\"BlQdFK\":\"Transaction reverted\",\"lPTKNn\":\"Transaction signed!\",\"ExzCxg\":\"Transaction submitted\",\"4wyw8H\":\"Transactions\",\"zPGNJm\":\"Transfer\",\"rgPYaR\":\"Transfer RTokens between Ethereum, Base, and Arbitrum\",\"I8Cs0D\":\"Transferring from Base to Ethereum takes approximately 7 days and requires 3 transactions.\",\"Tt0Nb4\":\"Trigger an Auction\",\"3Ig3IE\":\"Trigger melt\",\"Ypb3g5\":\"Trigger Unstake\",\"J8Bkl9\":\"Turn on Zaps to mint using 1 asset\",\"FYZr+9\":\"Tutorial video\",\"FHKsZF\":\"TVL\",\"MbL4eP\":\"Tx 1\",\"i8BXee\":\"Tx 2\",\"D9+vIc\":\"Tx Hash\",\"oMs/1/\":\"Tx in process...\",\"Al7fdr\":\"Tx Type\",\"vDXkqt\":\"Tx1. RToken Deploy\",\"P5dyHY\":\"Tx2. Governance\",\"+TZLxF\":\"Txs\",\"+zy2Nq\":\"Type\",\"ps586T\":\"Underlying Platform Exposure\",\"DF3kaf\":\"Underlying Token Exposure\",\"HZZiNN\":\"Understand the Reserve Protocol.\",\"wQ0QLx\":\"Unfreeze\",\"nBB/1g\":\"Unknown amount of recollateralization auctions left to run\",\"C2n1bi\":\"Unpausing\",\"lnV9JE\":\"Unregister\",\"Nll23d\":\"Unregister Assets\",\"fPvOAk\":\"Unregistering assets\",\"OFjZGo\":\"Unstake\",\"B+Ho2y\":\"Unstake Cancelled\",\"VG9opj\":\"Unstake RSR\",\"eg+wzu\":\"Unstaking Delay\",\"MwW2jd\":\"Unstaking delay - number of seconds that all RSR unstaking must be delayed in order to account for stakers trying to frontrun defaults and needs to be longer than \\\"governance\\\" for proper incentives for basket changes.\",\"aMQVfT\":\"Unstaking Delay (s)\",\"SxMxM9\":\"Unstaking delay:\",\"t7AAh/\":\"Unstaking RSR\",\"k5+pKI\":\"Unsupported\",\"HEcCC4\":\"Unwrap collaterals\",\"XC3Dby\":\"Upgrade contract implementations to a newer version. This is usually performed for a protocol update or bugfix.\",\"J5TfTH\":\"Upgrade contracts\",\"dfIw2n\":\"USD Value\",\"iWCwan\":\"Use a custom plugin contract address\",\"mo0Ni5\":\"Use the Alexios governor format?\",\"E4jeW1\":\"User Tracking\",\"y8908V\":\"Validating...\",\"uSMfoN\":\"Verify\",\"bl9677\":\"Verifying\",\"NpjEcw\":\"Verifying allowance...\",\"YKsN3Z\":\"Verifying transaction...\",\"eE0JZ4\":\"Version\",\"jpctdh\":\"View\",\"p5nYkr\":\"View All\",\"PzZvqB\":\"View All, including unlisted\",\"CyZadL\":\"View in explorer\",\"OQU8Is\":\"View on etherscan\",\"rd4eHq\":\"View on Etherscan\",\"+7Mfrq\":\"Volume (all time)\",\"fn1iqG\":\"Volume (last 7d)\",\"lQXQKs\":\"Vote\",\"AGXrI9\":\"Vote on-chain\",\"A+I9lo\":\"Vote Supply\",\"Ezc+mS\":\"Vote weight\",\"PByO0X\":\"Votes\",\"1Rd7wm\":\"Votes against\",\"bOmHmD\":\"Votes for\",\"W5kTFy\":\"Voting\",\"8TaAKn\":\"Voting Addresses\",\"4JU3Dr\":\"Voting on the RToken you are staked on requires you to delegate your vote to yourself or another Eth address.\",\"nUImH+\":\"Voting Period\",\"6bxci/\":\"Voting power\",\"TibSbv\":\"Voting power delegation\",\"qzWWBP\":\"Wait 1 hour\",\"HhkGfV\":\"Wait 7 days\",\"fUl1Mc\":\"Wait to trigger revenue auctions until after recollateralization has finished.\",\"sb9Y58\":\"Wallet\",\"6lKE6C\":\"Wallet staked RSR + RToken Value\",\"YR54Ai\":\"Warmup period (s)\",\"UW873z\":\"Watch an intro to RTokens\",\"3z87OK\":\"Welcome to Register - the user interface for registering, inspecting, and interacting with RTokens. \\\"RToken\\\" is the generic name given to asset-backed stablecoins created on the Reserve Protocol, the creation of which is entirely permissionless.\",\"ZOzJpl\":\"What if I have a question, issue or problem?\",\"kF8qEW\":\"What is Register L2 Bridge?\",\"Opgzh2\":\"What is Reserve Governor Alexios?\",\"cVPW0n\":\"What wallet can I use?\",\"ELDnYW\":\"When staking RSR, you are putting your RSR at risk in the case of a collateral default in exchange for 1) the rights to govern the RToken and 2) for a portion of the revenue generated by the collateral. The revenue sent to the staked RSR pool will be distributed amongst RSR stakers proportionally to their stake in the pool.\",\"3hfWcC\":\"When you stake your RSR, you will receive a stRSR receipt token which represents your ownership in the staked RSR contract. As revenue is distributed, the receipt token will be redeemable for an increasing amount of RSR. If there is a default scenario where the staked RSR is slashed, then the receipt token will be redeemable for a decreased amount of RSR.\",\"xr5Ynp\":\"When you unstake your stRSR, there will be a delay (defined by governance). This is to eliminate game theory scenarios that would make the backstop RSR staked pool less effective because people would continually be incentivized to unstake and restake.\",\"jutz4V\":\"Whenever you see the term \\\"overcollateralization\\\", we're referring to the built-in defence mechanism included in RTokens that help protect their stability in the case of any of their backing assets defaulting.\",\"AONm5p\":\"Whether you're an economist looking to improve the fiat standard, a DeFi-entrepreneur seeking to fill a gap in the market, or simply an innovator with a wild idea, anyone can create their own asset-backed currency.\",\"4XcwOZ\":\"Why does it take seven days to withdraw?\",\"OsyKSt\":\"Withdraw\",\"PILCOO\":\"Withdraw RSR\",\"C5TXiE\":\"Withdrawal leak\",\"VOpaFJ\":\"Withdrawal leak (%)\",\"ewqAyO\":\"Withdrawal Transactions\",\"9+KWSx\":\"Worst price\",\"rmZvu8\":\"Wrap collaterals\",\"MqIowX\":\"Wrap/Unwrap collateral\",\"7isgZi\":\"Wrap/Unwrap Tokens\",\"pMn92J\":\"Wrapping collateral tokens\",\"0gv+T2\":\"X\",\"MhhoeD\":\"You can leave your RToken paused and come back to setting up governance later.\",\"dDZTA0\":\"You can use popular Ethereum wallets like Metamask, Rabby, Coinbase Wallet, and Rainbow Wallet to name a few.\",\"P+769u\":\"You receive:\",\"o6ImqE\":\"You submit the transaction configuring your RToken design\",\"YPqf0p\":\"You use:\",\"8znDHf\":\"You will be the temporary owner until governance is deployed in transaction 2.\",\"jKFx1V\":\"You’ll receive:\",\"CtG7o7\":\"Your RTokens\",\"cQe/XW\":\"Your stake position\",\"R6xgEU\":\"Your staked RSR\"}")}; \ No newline at end of file +/*eslint-disable*/module.exports={messages:JSON.parse("{\"+0K6xY\":[\"All unlisted RTokens\"],\"+2ovA+\":[\"Create proposal\"],\"+7Mfrq\":[\"Volume (all time)\"],\"+SwX7M\":[\"Browse RTokens\"],\"+TZLxF\":[\"Txs\"],\"+WPOsr\":[\"Batch auction length\"],\"+cJZX5\":[\"Basket APY\"],\"+hApc9\":[\"The minimum amount of time after a proposal passes before it can be executed.\"],\"+s9pmq\":[\"Basket scale for this unit of account. This is used to initially calculate how much of each token is required for minting.\"],\"+zy2Nq\":[\"Type\"],\"/4gGIX\":[\"Copy to clipboard\"],\"/7T5Z1\":[\"Register listed RTokens\"],\"/A3dHx\":[\"Input the guardian ethereum address\"],\"/DCw0h\":[\"Market cap:\"],\"/IX/7x\":[\"Other\"],\"/o1XvT\":[\"The creation of new RToken designs is permissionless. If you are the inventive type and have ideas for what assets should be in the basket, what a good governance looks like, or anything novel that could work within the realms of the protocol, please consider putting those ideas into practice or sharing them with the community.\"],\"/uk/m7\":[[\"0\"],\" APY\"],\"02uyLF\":[\"Backing\"],\"03lM+L\":[\"RToken Deployment Transaction succeeded\"],\"06o+4H\":[\"Token Details\"],\"0BKROZ\":[\"Execution Delay\"],\"0DN8vr\":[\"Backing buffer (%)\"],\"0R4s65\":[\"Underlying Token\"],\"0Rrfh3\":[\"Input token name\"],\"0U/Tk/\":[\"Issuance throttle Rate\"],\"0gv+T2\":[\"X\"],\"0hSka2\":[\"DeFi protocols oftentimes have incentives for liquidity that are paid in their token or a combination of tokens. By providing liquidity for trading or lending or other activities on these protocols, you can earn rewards that are sometimes quite high! Note that there are always risks (smart contract risks, impermanent loss risks, etc), in providing liquidity on these protocols so please make sure you understand things before blindly diving in.\"],\"0n6GRN\":[\"Input proposal title\"],\"18of6T\":[\"Propose how the basket should be distributed going forward. \"],\"1Go5ao\":[\"Register Assets\"],\"1KBao4\":[\"Compare RTokens\"],\"1LAqfa\":[\"- Redeem \",[\"0\"]],\"1QfxQT\":[\"Dismiss\"],\"1RKej3\":[\"Token details\"],\"1Rd7wm\":[\"Votes against\"],\"1VYWc5\":[\"Controls changes to the basket of an Index DTF\"],\"1ex6fX\":[\"Reserve aims to help people around the world maintain their spending power by allowing anyone to create asset-backed currencies with tokenized assets on the Ethereum blockchain in customizable and novel ways.\"],\"1jYZaW\":[\"Furnace\"],\"1pynDW\":[\"RToken holders\"],\"2+Ty+2\":[\"Spell 2\"],\"2VoM3e\":[\"Delegated to self\"],\"2qh1i8\":[\"Trading delay\"],\"2xwMgJ\":[\"DTFs live on blockchain networks including Ethereum, Base, Binance Smart Chain, enabling worldwide transactions within seconds. Each DTF is 100% backed by other assets on the same blockchain. Users can redeem their DTF tokens for the underlying backing assets at any time without anyone else’s involvement.\"],\"2yBN46\":[\"Advanced config:\"],\"31T9Uy\":[\"Choose Redemption Basket\"],\"3Ig3IE\":[\"Trigger melt\"],\"3Imb0U\":[\"Receiving eth address\"],\"3TepwF\":[\"Discover DTFs\"],\"3caoaJ\":[\"The Reserve Protocol makes a few different types of trades\"],\"3ebyPI\":[\"Please don't close this window to avoid issues finding your way back here.\"],\"3hfWcC\":[\"When you stake your RSR, you will receive a stRSR receipt token which represents your ownership in the staked RSR contract. As revenue is distributed, the receipt token will be redeemable for an increasing amount of RSR. If there is a default scenario where the staked RSR is slashed, then the receipt token will be redeemable for a decreased amount of RSR.\"],\"3sRog+\":[\"Proposed\"],\"4JU3Dr\":[\"Voting on the RToken you are staked on requires you to delegate your vote to yourself or another Eth address.\"],\"4T0Zfr\":[\"Stake pool\"],\"4ZzlJd\":[\"Casting 3.4.0 upgrade spell\"],\"4kl1Q6\":[[\"fromToken\"],\" amount\"],\"4sRQtL\":[\"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.\"],\"4t/yW7\":[\"Ended at\"],\"4wyw8H\":[\"Transactions\"],\"51OY3J\":[\"Executable code\"],\"52SO2+\":[\"Collateral token\"],\"54w0Yi\":[\"Understand the project and protocols\"],\"59Dk0F\":[\"RSR available to withdraw\"],\"5EuWoG\":[\"RToken Trader\"],\"5IrCQY\":[\"Mint\"],\"5YPwIl\":[\"RSR Stakers\"],\"5dJK4M\":[\"Roles\"],\"5dVVsn\":[\"Dutch Auction length (s)\"],\"6/dCYd\":[\"Overview\"],\"6FHCpe\":[\"Est. APY\"],\"6QtlTh\":[\"Minting Fee\"],\"6RDwJM\":[\"Tokens\"],\"6YtxFj\":[\"Name\"],\"6bxci/\":[\"Voting power\"],\"6cDDmZ\":[\"Input ticker\"],\"6fx8ZN\":[\"No ended auctions\"],\"6g1gi0\":[\"Proposals\"],\"6lKE6C\":[\"Wallet staked RSR + RToken Value\"],\"73QZmA\":[\"Approve in wallet\"],\"7ALdX9\":[\"Revenue Distribution\"],\"7B7o9d\":[\"Fixed Platform Share\"],\"7C9ebc\":[\"Distributed revenue does not add up to 100%\"],\"7R+Rtn\":[\"RToken Details\"],\"7YOBWU\":[\"The minimum percentage of stRSR voter participation (either For or Abstain) on a proposal before it can be passed.\"],\"7fqtid\":[\"Fees & Revenue Distribution\"],\"7isgZi\":[\"Wrap/Unwrap Tokens\"],\"7rqC5h\":[\"Backing + Staked\"],\"7vOU8z\":[\"Reserve Docs\"],\"81aX0K\":[\"Settleable auctions\"],\"88kg0+\":[\"Created At\"],\"88o7M6\":[\"Signing Tx 2\"],\"89oleM\":[\"Peg:\"],\"8DIDYI\":[\"Bought\"],\"8Ps70y\":[\"Symbol\"],\"8TaAKn\":[\"Voting Addresses\"],\"8UH/HA\":[[\"unit\"],\" Token distribution\"],\"8qwuC/\":[\"Simulation successful ✓\"],\"8tjQCz\":[\"Explore\"],\"8uEgwp\":[\"Quorum (%)\"],\"8wGbsh\":[\"Maximum trade for RToken\"],\"8y1g5b\":[\"This App\"],\"8znDHf\":[\"You will be the temporary owner until governance is deployed in transaction 2.\"],\"9+KWSx\":[\"Worst price\"],\"98fSbL\":[\"Made your own collateral?\"],\"9B4C/p\":[\"Reserve Bridge\"],\"9DGbad\":[\"Frozen\"],\"9FqwqX\":[\"Period in seconds\"],\"9L7NSU\":[\"Immediate\"],\"9OBKm7\":[\"Quorum\"],\"9OU4oG\":[\"% Acceptable\"],\"9Pk/+F\":[\"Full exposure view\"],\"9aZHfH\":[\"Back to settings\"],\"9cNlqf\":[\"Simulate proposal\"],\"A+8PId\":[\"Please keep in mind that interactions with the Ethereum or Base blockchains are pseudonymous and publicly available.\"],\"A+I9lo\":[\"Vote Supply\"],\"A1BKet\":[[\"0\"],\" Description\"],\"A1taO8\":[\"Search\"],\"ADH2UX\":[\"Current status:\"],\"AGXrI9\":[\"Vote on-chain\"],\"AXu7J/\":[\"Invalid destination address\"],\"Al7fdr\":[\"Tx Type\"],\"Aw88aM\":[\"Estimated gas cost:\"],\"B+Ho2y\":[\"Unstake Cancelled\"],\"B6FtWk\":[\"Change primary basket\"],\"B8AaMI\":[\"This field is required\"],\"BJMyhE\":[\"If a DTF is listed on this app, it doesn't mean that ABC Labs endorses the safety or risk levels of the DTF or that ABC Labs was involved in the creation of or is in anyway responsible for the DTF.\"],\"BecCbK\":[\"Settle all\"],\"Bkd1RD\":[\"+ Mint \",[\"0\"]],\"BlQdFK\":[\"Transaction reverted\"],\"BmvM5L\":[\"Long freeze duration (s)\"],\"BuQhD6\":[\"% to external address\"],\"BxWKeM\":[\"Melt\"],\"C2n1bi\":[\"Unpausing\"],\"C5TXiE\":[\"Withdrawal leak\"],\"CKp2aP\":[\"Invalid (\",[\"targetUnit\"],\") basket scale\"],\"CPVP0+\":[\"Proposal Threshold (%)\"],\"CZUigm\":[\"Batch Auction length - defines how long Gnosis EasyAuction auctions should be. Gnosis EasyAuction is a platform enabling fair price discovery for tokens through the use of batch auctions.\"],\"Cd3fOR\":[\"Transaction 1\"],\"CjHP6C\":[\"Transaction confirmed\"],\"CobcOM\":[\"Diversity factor\"],\"CpEYLQ\":[\"Proceed in wallet\"],\"CtByM7\":[\"Connect Wallet\"],\"CtG7o7\":[\"Your RTokens\"],\"CwyiJ4\":[\"A Brief DTF Introduction\"],\"CyZadL\":[\"View in explorer\"],\"D16asK\":[\"Main\"],\"D7h0du\":[\"Max trade slippage (%)\"],\"D9+vIc\":[\"Tx Hash\"],\"DATVA/\":[\"Reward ratio (decimals)\"],\"DF3kaf\":[\"Underlying Token Exposure\"],\"DLNgVH\":[\"Issue\"],\"DNiYLX\":[\"Begin redemption of \",[\"0\"],\" \",[\"1\"]],\"DiXm3I\":[\"The diversity factor determines the amount of emergency collateral that will be deployed to the RToken basket in the case of a default.\"],\"Du6bPw\":[\"Address\"],\"Dx9h/1\":[\"Please carefully evaluate the RToken before choosing to stake your RSR here. If any of the various collaterals of this RToken default, then the staked RSR will be the first funds that get auctioned off to make up the difference for RToken holders.\"],\"E4jeW1\":[\"User Tracking\"],\"EAGRJL\":[\"Some collateral tokens from protocols like Aave and Convex differ technically from other collateral tokens. To ensure proper handling, they must be wrapped in a contract for effective monitoring. Once wrapped, the collateral remains the same but has a new interface for price and appreciation tracking.\"],\"EDIx1I\":[\"Distribute Fees\"],\"EIcaiW\":[\"Backing config\"],\"EJGWha\":[\"The Reserve Project\"],\"ELDnYW\":[\"When staking RSR, you are putting your RSR at risk in the case of a collateral default in exchange for 1) the rights to govern the RToken and 2) for a portion of the revenue generated by the collateral. The revenue sent to the staked RSR pool will be distributed amongst RSR stakers proportionally to their stake in the pool.\"],\"EQvnVc\":[\"Revenue distribution\"],\"ETZEWb\":[\"The fraction of RSR stake that should be permitted to withdraw without a refresh. When cumulative withdrawals (or a single withdrawal) exceed this fraction, gas must be paid to refresh all assets.\"],\"EU/w8s\":[\"Queue proposal\"],\"EdQY6l\":[\"None\"],\"ElVQVf\":[\"Simulate Proposal\"],\"En3lQ+\":[\"RToken Maximum trade volume\"],\"Eo6Lg5\":[\"No plugins available\"],\"Eq4P3S\":[\"Confirm delegate\"],\"ExN9Hw\":[\"Shared with RSR Stakers\"],\"ExzCxg\":[\"Transaction submitted\"],\"Ezc+mS\":[\"Vote weight\"],\"F18WP3\":[\"Parameters\"],\"F3bW6y\":[\"Platform\"],\"FAeo39\":[\"Ticker - symbol eg. USD+\"],\"FEt55g\":[\"Estimated gas cost\"],\"FGOUAP\":[[\"0\"],\" of \",[\"1\"]],\"FHKsZF\":[\"TVL\"],\"FNKsXU\":[\"Contract Addresses\"],\"FXFgMV\":[\"Stake pool USD value:\"],\"FYZr+9\":[\"Tutorial video\"],\"FZPbrN\":[\"Registration of an asset plugin enables the RToken to price an underlying ERC20 token. Where an asset plugin for the underlying token already exists, the existing asset plugin is replaced with the new one.\"],\"Fn9TcI\":[\"Quorum?:\"],\"G3RyLw\":[\"Total % to arbitrary address\"],\"G5W/UB\":[\"ABC Labs uses industry standard anonymized analytics tools to understand usage and improve the user experience. ABC Labs does not collect any information about users or their financial activity.\"],\"GE3hR8\":[\"Not ready to set up governance?\"],\"GFvPy6\":[\"Against\"],\"GO6A9W\":[\"Deploy RToken\"],\"GYgvDh\":[\"If your token is paused and you have the correct role, you can unpause it here.\"],\"GhJQm9\":[\"Missing collateral\"],\"GirW3J\":[\"Choose between our Alexios Governor and anything between one-person rule to arbitrary DAO structure under your defined Ethereum address.\"],\"GycO8a\":[\"Primary basket not defined\"],\"H3cnhC\":[\"Propose changes to $\",[\"0\"]],\"H6nEG8\":[\"Stake + Unstake\"],\"H7qwjR\":[\"Staking token\"],\"HCswgj\":[\"Minimum trade volume ($)\"],\"HEcCC4\":[\"Unwrap collaterals\"],\"HG4SWx\":[\"Basket\"],\"HKPYsc\":[\"Redemption throttle Rate\"],\"HPq6Cr\":[\"Annualized TVL Fee\"],\"HQc4VD\":[\"Make proposed changes to the backing basket, emergency collateral, governance params, etc. Changes in multiple areas can be batched into a single proposal although to make voting on issues simpler it may make sense to separate things if unrelated.\"],\"Hp1l6f\":[\"Current\"],\"I3M3ju\":[\"Input RSR stakers revenue distribution\"],\"I6NohP\":[\"Platform exposure\"],\"I7CwKt\":[\"Not frozen\"],\"IGqrgX\":[\"Voting Delay\"],\"IICqKY\":[\"Change backup basket\"],\"IZwgAK\":[\"Please sign the transaction in your wallet to continue with the government configuration process.\"],\"IhmalY\":[\"Diversity Factor\"],\"IwXX9d\":[\"Minimum trade volume\"],\"J/hVSQ\":[[\"0\"]],\"J2tM5d\":[\"Pending, sign in wallet\"],\"J5TfTH\":[\"Upgrade contracts\"],\"J8Bkl9\":[\"Turn on Zaps to mint using 1 asset\"],\"JJ/1wI\":[\"Exit Deployer\"],\"JVkoZo\":[\"Governor Address\"],\"JWf8LL\":[\"Minimum trade volume - minimum sized trade that can be performed, in terms of the unit of account eg. USD.\"],\"JYKRJS\":[\"Stake\"],\"Jd7EeB\":[\"Redemption rate - allows the issuer to limit the amount of RTokens redeemed per hour based on a percentage of the current RToken market cap. This matters in the event of an exploit where an attacker tries to redeem RTokens. This buys time for users with pause or freeze permissions to reduce the amount of RTokens that can be redeemed.\"],\"JxdCy/\":[\"RSR Staked\"],\"K1iv1D\":[\"RToken will be ready to use after this TX if you choose to unpause.\"],\"K29LLi\":[\"Select proposal type\"],\"KBIO6h\":[\"Balance: \"],\"KDqZm9\":[\"Redemption throttle rate (%)\"],\"KRwsdB\":[\"Stakers APY\"],\"KZ1u6+\":[\"Total Market Cap\"],\"KaOUA4\":[\"Mint \",[\"0\"]],\"Kjox/d\":[\"Invalid asset\"],\"Kow4Yn\":[\"Max trade slippage\"],\"KqojOL\":[\"Next steps\"],\"Kw1+qc\":[\"Invalid address\"],\"Kxg5/E\":[\"Ended auctions\"],\"L2MqsA\":[\"Mint + Redeem\"],\"LDJIpn\":[\"Voting Quorum\"],\"LG54As\":[\"Auctionable revenue\"],\"LIRGo4\":[\"Vote-Lock DAO Token\"],\"LK9M3g\":[\"Ticker\"],\"LhMjLm\":[\"Time\"],\"LkMovi\":[\"Yield DTFs (created on the Reserve Yield Protocol) feature built-in overcollateralization — a defense mechanism that helps protect stability if any backing assets default.\"],\"LoH4s+\":[\"Minimum trade size\"],\"LtI9AS\":[\"Owner\"],\"LvyY/V\":[\"RTokens in this list is not an endorsement or audited by us. It's simply RTokens that have gone through our listing process and don't seem like clear scams.\"],\"M4YZCC\":[\"Governor mandate\"],\"MM0Byw\":[\"Trader contract for batch trades.\"],\"MYod0t\":[\"Display only \",[\"0\"],\" related collaterals\"],\"MbL4eP\":[\"Tx 1\"],\"MhhoeD\":[\"You can leave your RToken paused and come back to setting up governance later.\"],\"MqA4qt\":[\"Portfolio\"],\"MqIowX\":[\"Wrap/Unwrap collateral\"],\"MqLjTu\":[\"% Revenue to RToken Holders\"],\"MrVW7f\":[\"Dutch auction length\"],\"MrnlGV\":[\"Redemption throttle rate\"],\"MwW2jd\":[\"Unstaking delay - number of seconds that all RSR unstaking must be delayed in order to account for stakers trying to frontrun defaults and needs to be longer than \\\"governance\\\" for proper incentives for basket changes.\"],\"N5kBDi\":[\"Invalid ethereum address\"],\"Ng/SkH\":[\"Above minimum trade volume\"],\"NgIppW\":[\"Input plugin address (not ERC-20 address)\"],\"Nll23d\":[\"Unregister Assets\"],\"NmI7Ll\":[\"Governor address\"],\"NpjEcw\":[\"Verifying allowance...\"],\"Nu4oKW\":[\"Description\"],\"O6Z3uT\":[\"Target:\"],\"OAfk3i\":[\"Hash\"],\"OC3bUY\":[\"Change distribution\"],\"OCI+DI\":[\"DTF Explorer\"],\"OFjZGo\":[\"Unstake\"],\"OJx3wK\":[\"Not available\"],\"OPVsCp\":[\"Input quorum percent\"],\"OR475H\":[\"Network\"],\"OinOun\":[\"Stake RSR\"],\"Opgzh2\":[\"What is Reserve Governor Alexios?\"],\"OsyKSt\":[\"Withdraw\"],\"OyCrBF\":[\"No holders for this role...\"],\"P+769u\":[\"You receive:\"],\"P+Quwn\":[\"Propose new basket\"],\"P/M2Id\":[\"Long freeze duration - freeze an RToken's system for a longer period of time. A long-freezer has 6 charges before losing the ability to freeze any more\"],\"P5dyHY\":[\"Tx2. Governance\"],\"PBjWTe\":[\"DeFi yield opportunities for DTFs in Aerodrome, Convex, Beefy, Yearn & Others\"],\"PBnztC\":[\"Begin governance setup\"],\"PByO0X\":[\"Votes\"],\"PILCOO\":[\"Withdraw RSR\"],\"PKItzG\":[\"Extra collateral to keep\"],\"PU/y6X\":[\"Empty backup basket\"],\"PWBWkh\":[\"ABC Labs requires additional information beyond what is available on the blockchain to give users relevant data to make informed decisions. As a user, please evaluate any new DTF carefully before holding, staking RSR, or vote locking tokens on them.\"],\"PZZf4D\":[\"Confirm & Submit\"],\"Pci103\":[\"Registering assets\"],\"PgOApQ\":[\"You'll receive:\"],\"PkquuC\":[\"Join the conversation or ask questions\"],\"PlJdlY\":[\"Mechanics\"],\"PmRw7M\":[\"Deploy your own RToken\"],\"PnFsqo\":[\"RTokens are 100% backed by a diversified set of underlying collateral tokens...\"],\"PzZvqB\":[\"View All, including unlisted\"],\"Q/sl1D\":[\"Max trade slippage — maximum deviation from oracle prices that any trade can clear at. Why this matters? Acts as a form of slippage protection.\"],\"Q0xGVH\":[\"Freeze State\"],\"Q8+uwY\":[\"Please complete the required governance configuration to complete deployment.\"],\"Q8mMek\":[\"Claim rewards across all traders\"],\"QGN0A9\":[\" auctioned\"],\"QIuujP\":[\"Earn\"],\"QKskSe\":[\"Preparing transaction\"],\"QLUkRN\":[\"Reserve Blog\"],\"QQ2SBx\":[\"Decimals\"],\"QWtJhD\":[\"Invalid minimum range \"],\"QpGF0U\":[\"Delay (in number of \",[\"0\"],\") since the proposal starts until voting ends.\"],\"QqcMwa\":[\"The pauser(s) can put the RToken in two states which can be either true or false (no set duration):\"],\"QtNpcx\":[\"Duration in seconds\"],\"QwwYl1\":[\"Execute proposal\"],\"R6xgEU\":[\"Your staked RSR\"],\"RLDSN8\":[\"Each target unit of your primary basket will have defined emergency collateral to replace with in case of default.\"],\"RVG9Xc\":[\"Controls settings of the vlDAO including vote lock duration and approving revenue tokens\"],\"RW+4/D\":[\"Configure your vote\"],\"RrkUqq\":[\"Trader implementations\"],\"RwBJxn\":[[\"0\"],\" auctions\"],\"SHPE7u\":[\"Asset Registry\"],\"SIHhwZ\":[\"Input the owner ethereum address\"],\"SKZhW9\":[\"Token name\"],\"SOJxcI\":[\"Reward ratio - amount of the current reward amount that should be handed out in a single block. The default corresponds to a half life of approximately 15 days.\"],\"SUkrBJ\":[\"Input delay\"],\"SViOvb\":[\"View on\"],\"SkmQRZ\":[\"% Revenue share\"],\"Sku3Zy\":[\"Governance forum\"],\"SnVnD8\":[\"Provide liquidity across DeFi & earn more with your DTFs\"],\"Sw7Gww\":[\"A good explainer for how Gnosis auctions work can be found\"],\"SxMxM9\":[\"Unstaking delay:\"],\"TP9/K5\":[\"Token\"],\"TiC6Xh\":[\"Mkt Cap\"],\"TibSbv\":[\"Voting power delegation\"],\"TjramT\":[\"Invalid collateral\"],\"TnNnVh\":[\"Shared with RToken Holders\"],\"Tt0Nb4\":[\"Trigger an Auction\"],\"TvY/XA\":[\"Documentation\"],\"U/iNrh\":[\"Input withdrawal leak %\"],\"U6AQ7u\":[\"Anyone can click the button above to check and trigger an auction for any revenue that has accrued or for rebalances that need to happen. Please note that for RTokens with many collateral types in the basket, this may be an expensive transaction to execute.\"],\"U7USFW\":[\"Batch Auction length (s)\"],\"U9ks0t\":[\"Issuance throttle rate (%)\"],\"UJrReY\":[\"Est. Staking APY\"],\"UW873z\":[\"Watch an intro to RTokens\"],\"UaUjkN\":[\"Revenue split\"],\"UhF/tF\":[\"Record limit\"],\"Ui1tti\":[\"Delegate votes\"],\"UjFzc9\":[\"Other parameters\"],\"UpgRb2\":[\"Define what portion of the revenue goes to the RToken holders versus RSR stakers. It can also be configured to send a portion of the revenue of an RToken to any arbitrary Ethereum address (wallet or smart contract).<0/><1/>\"],\"UsxK+A\":[\"No assets to unregister...\"],\"V+Usr0\":[\"Controls fees, voting parameters, and anything other than basket changes for an Index DTF\"],\"V03foK\":[\"Trader contract for Dutch trades.\"],\"V0H90D\":[\"Guardian address\"],\"V302gs\":[\"The dutch auction length is how many seconds long falling-price dutch auctions should be. A longer period will result in less slippage due to better price granularity, and a shorter period will result in more slippage.\"],\"VCG/e6\":[\"Redeem\"],\"VG9opj\":[\"Unstake RSR\"],\"VHVdS1\":[\"No votes\"],\"VOpaFJ\":[\"Withdrawal leak (%)\"],\"VYQ8Iy\":[\"Add to basket\"],\"VcQdaO\":[\"Read more about revenue distribution\"],\"VrBAxX\":[\"Deployer Share\"],\"W2Q1/M\":[\"Backing Parameters\"],\"W2iax5\":[\"Networks\"],\"W5JlJM\":[\"No actionable revenue available\"],\"W5kTFy\":[\"Voting\"],\"W8K/75\":[\"Role held by:\"],\"WEVa0d\":[\"Selling\"],\"WJQWuz\":[\"Create a new Yield DTF\"],\"WNrgVT\":[\"Governance format\"],\"WNtc8U\":[\"The amount of assets selected affects the gas price, this asset may not be worth claiming yet.\"],\"WXGS2i\":[\"Timelock Address\"],\"WY8amq\":[\"Invalid number\"],\"WZK33i\":[\"Input wallet\"],\"Wg0Nr2\":[\"Trader contract address\"],\"WsVNsQ\":[\"Please read more about how Register manage tokens on our repository\"],\"X0neaw\":[\"Trading delay (s)\"],\"X1mZKh\":[\"Owner Address\"],\"XC3Dby\":[\"Upgrade contract implementations to a newer version. This is usually performed for a protocol update or bugfix.\"],\"XCLYYd\":[\"Token exposure\"],\"XD7cKh\":[\"Get an overview of everything going on\"],\"XOJDc9\":[\"All time\"],\"XU7Jfb\":[\"A year ago\"],\"XUds+a\":[\"Long freeze duration\"],\"XWoKr0\":[\"Emergency Collateral\"],\"XXCmTE\":[\"Mint amount\"],\"XXw3LT\":[\"Confirm changes made\"],\"XaBNjY\":[\"Non-Basket Governance\"],\"XbvxUa\":[\"Delegate\"],\"XelGWQ\":[\"Timelock address\"],\"XkKUrt\":[\"Backing buffer - percentage value that describes how much additional collateral tokens to keep in the BackingManager before forwarding tokens to the RevenueTraders. The RevenueTraders here refers to the RToken and RSR traders. Why this matters? It allows collateral tokens to be periodically converted into the RToken, which is a more efficient form of revenue production than trading each individual collateral for the desired RToken. It also provides a buffer to prevent RSR seizure after trading slippage. For more info on the BackingManager and Trader types see the \\\"Revenue distribution to RToken holders\\\" and \\\"Summary of revenue distribution\\\" in our documentation.\"],\"XmfFIm\":[\"The minimum percentage of stRSR ownership on an RToken to be able to create a proposal.\"],\"XsOPg3\":[\"File issues or upvote existing ones\"],\"XsPuIt\":[\"Distributor\"],\"Xtj6BR\":[\"Issuance amount - allows the issuer to limit the amount of RTokens issued per hour. This matters in the event of an exploit where an attacker tries to issue more RTokens. This buys time for users with pause or freeze permissions to reduce the amount of RTokens that can be issued.\"],\"XvmLhx\":[\"stRSR payout fraction 0.0\"],\"Y0kXxR\":[\"Required setup:\"],\"YEpmZo\":[\"Deploying through this UI doesn't require deep technical knowledge as long as you don't need novel collateral plugins for your baskets. However, we encourage you to talk to someone proficient in the protocol and read the docs to learn more before confirming any transactions.\"],\"YHpbe1\":[\"For\"],\"YKsN3Z\":[\"Verifying transaction...\"],\"YPqf0p\":[\"You use:\"],\"YR54Ai\":[\"Warmup period (s)\"],\"YSG6CZ\":[\"Transfer DTFs across chains\"],\"YSajVI\":[\"Delay in seconds\"],\"Yh49N4\":[\"Proposal Threshold\"],\"YiF3/Q\":[\"Cast Spell 1\"],\"YirHq7\":[\"Feedback\"],\"YjzAfU\":[\"Melting\"],\"Yp52FQ\":[\"Stay up to date in long form\"],\"Ypb3g5\":[\"Trigger Unstake\"],\"YwD4dh\":[\"Cast Spell 2\"],\"Z0UMy9\":[\"Featured RTokens\"],\"Z1twd3\":[\"Delegated to: \"],\"Z22ZHd\":[\"Related Contracts\"],\"Z2UK1U\":[\"Ongoing dutch auctions\"],\"Z3FXyt\":[\"Loading...\"],\"ZC1jjY\":[\"Short freeze duration (s)\"],\"ZDmC6j\":[\"Available collateral\"],\"ZJhuy5\":[\"Emergency basket\"],\"ZRBNIp\":[\"Begin minting \",[\"0\"],\" \",[\"1\"]],\"ZTu0WX\":[\"The top level decision maker, typically a decentralized governance smart contract, responsible for setting or updating all RToken parameter values, RToken baskets, etc. - The RToken OWNER has the power to:\\n grant and revoke roles to any Ethereum account\\n pause and unpause the system\\n freeze and unfreeze the system\\n set governance parameters\\n upgrade system contracts\"],\"Zb7zns\":[\"Risk evaluation\"],\"Ze3la6\":[\"Input token holders revenue distribution\"],\"Zllgcd\":[\"Register Listing\"],\"a3Cnqz\":[\"Auction Launcher\"],\"a3U7In\":[\"Invalid (\",[\"targetUnit\"],\") backup diversity factor\"],\"a7u1N9\":[\"Price\"],\"a8IIG5\":[\"Backup basket\"],\"aFfRAV\":[\"Delegate voting power for future votes\"],\"aMQVfT\":[\"Unstaking Delay (s)\"],\"aSt5Rp\":[\"Please sign the transaction in your wallet to continue with the governance process.\"],\"alx8ZZ\":[\"RToken will be fully functional\"],\"aqHaEK\":[\"Propose new backup configuration\"],\"b0tqCW\":[\"Back to Governance\"],\"b4vxFC\":[\"Long Freeze\"],\"b6D1xw\":[\"% Revenue to RSR Stakers\"],\"bKXjUF\":[\"Mandate\"],\"bOmHmD\":[\"Votes for\"],\"bSZuP8\":[\"New primary basket\"],\"bWMGJN\":[\"Go to the RToken Deployer\"],\"bZZ1DH\":[\"Proposed by\"],\"bkcUbj\":[\"New backup configuration\"],\"bmmEBC\":[\"Current holder\"],\"bqervZ\":[\"Token ticker is required\"],\"bsalqT\":[\"RToken Address\"],\"bsxAWr\":[\"RToken mandate\"],\"bwSQI0\":[\"Supply\"],\"bwdIqT\":[\"Community Discord\"],\"bzSI52\":[\"Discard\"],\"c23a1k\":[\"Backing Manager\"],\"c8OQUt\":[\"Explore yield opportunities for \",[\"0\"]],\"cBgRZm\":[\"Est. APY:\"],\"cBsi4+\":[\"Total initial RToken scale including all targets. If your RToken only has one target unit this will be the same as the basket scale input.\"],\"cQe/XW\":[\"Your stake position\"],\"cg7wLy\":[\"Inspect collateral backing, mint, stake, redeem & explore additional earn opportunities across DeFi\"],\"cs1EEG\":[\"Deploy transaction submitted\"],\"cyJYDE\":[\"Governance Share\"],\"d+U+9W\":[\"Shared externally\"],\"d/VrnV\":[\"Input voting period\"],\"dA1zfj\":[\"Required:\"],\"dA8fzb\":[\"Participate & Earn\"],\"dE6BLF\":[\"Governance\"],\"dEgA5A\":[\"Cancel\"],\"dH1S+k\":[\"Staked RSR Overcollateralisation\"],\"dNQZNq\":[\"RSR Trader\"],\"dScyNc\":[\"Issuance throttle amount\"],\"dUcbZZ\":[\"Token name required\"],\"dViFQP\":[\"Mandate is required\"],\"dfIw2n\":[\"USD Value\"],\"drp73Y\":[\"Default delay\"],\"e/6RX4\":[\"Whether you’re an economist looking to improve the fiat standard, a DeFi entrepreneur seeking to fill a gap in the market, or simply an innovator with a wild idea, Reserve makes it easy to launch your own asset-backed index.\"],\"e0NrBM\":[\"Project\"],\"e2+lHb\":[\"mth\"],\"eE0JZ4\":[\"Version\"],\"eFTnE/\":[\"15 params\"],\"ePK91l\":[\"Edit\"],\"eWxpbp\":[\"Ongoing auctions\"],\"ed2+9W\":[\"Other Risks\"],\"efXgiG\":[\"Top voting addresses\"],\"eg+wzu\":[\"Unstaking Delay\"],\"ehOkF+\":[\"Basics\"],\"eiVzdG\":[\"Please wait while the simulation executes\"],\"ejVYRQ\":[\"From\"],\"f8rob6\":[\"Staking RSR\"],\"fAfiCl\":[\"Mandate cannot be longer than 256 characters\"],\"fPOajI\":[\"Ends at\"],\"fPvOAk\":[\"Unregistering assets\"],\"fSh1F2\":[\"Basket warmup period\"],\"fSkQWU\":[\"Delegate to\"],\"fTK2tH\":[\"DAO Governance\"],\"fUl1Mc\":[\"Wait to trigger revenue auctions until after recollateralization has finished.\"],\"fZBHde\":[\"Yield DTF Creator\"],\"fn/6Aa\":[\"Ensure that the asset(s) you are unregistering do not have pending revenue that can be\"],\"fn1iqG\":[\"Volume (last 7d)\"],\"g1KZ8Y\":[\"Basket is not ready\"],\"g7BX9A\":[\"Input proposal threshold\"],\"gAVoMF\":[\"Empty Basket\"],\"gHuu3G\":[\"Reserve Discord\"],\"gdgoAB\":[\"Backing + Overcollaterization:\"],\"glKVIy\":[\"Input delay in hours\"],\"gqYTsB\":[\"The token supply is not enough for changing the primary basket safely, contact the Reserve team for recommendations.\"],\"gqu6u3\":[\"Check for auctions\"],\"hbeGqD\":[\"Regular minting \"],\"hehnjM\":[\"Amount\"],\"hom7qf\":[\"Claim\"],\"hrp5QR\":[\"Estimated basket APY\"],\"htTcVX\":[\"Status:\"],\"hyt0Ac\":[\"Delay in Seconds\"],\"i/oT62\":[\"Guardian\"],\"i2y1O5\":[\"Governance Details\"],\"i4xxYn\":[\"Proposals voted\"],\"i8BXee\":[\"Tx 2\"],\"i8EW0F\":[\"Input RFC link\"],\"iA99DC\":[\"Target(s)\"],\"iDr5Z5\":[\"Maximum trade volume - maximum sized trade for any trade involving RToken, in terms of the unit of account eg. USD.\"],\"iH8itU\":[\"Connect your wallet\"],\"iQ+Xt1\":[\"Roles & Controls\"],\"iSLIjg\":[\"Connect\"],\"iVav3e\":[\"Minimum trade in USD terms\"],\"iWCwan\":[\"Use a custom plugin contract address\"],\"iaxJrF\":[\"Total RSR staked\"],\"irOfE1\":[\"Minting requires a deposit of the defined collateral tokens in equal value amounts to the RToken smart contracts.\"],\"j3CapQ\":[\"Protocol Docs\"],\"j3sA7W\":[\"Recent proposals\"],\"jBJkMt\":[\"Other Parameters\"],\"jDkOvZ\":[\"There's two freezing roles that put the system in the same state for different durations:\"],\"jE3OmQ\":[\"Cancel proposal\"],\"jJdwCB\":[\"Revert\"],\"jQSzKJ\":[\"As RSR\"],\"jpctdh\":[\"View\"],\"k1ifdL\":[\"Processing...\"],\"k5+pKI\":[\"Unsupported\"],\"kEqOfQ\":[\"RFC\"],\"kFRSvP\":[\"Backup configuration tracks primary basket changes to update its values. This may not be desired on a proposal, you can choose to propose new changes.\"],\"kI1eQH\":[\"Mint - Global throttle\"],\"kg0lD1\":[\"Backing & Risk\"],\"kj3M8S\":[\"Deposit\"],\"kka8e4\":[\"Intro\"],\"koRR0F\":[\"Create New DTF\"],\"ktUGFg\":[\"Reward ratio\"],\"l8wHqt\":[\"Short freezers have the responsibility of freezing an RToken if anything dangerous or suspicious is happening. This is a one-shot freeze and the role will be revoked after a single use. This field determines how long the RToken will remain frozen until the freeze expires or is extended by another actor.\"],\"l9C7HU\":[\"Add to backup basket\"],\"lCJhs9\":[\"Transaction 2\"],\"lIBAz6\":[\"Pending auctions to settle\"],\"lPTKNn\":[\"Transaction signed!\"],\"lQXQKs\":[\"Vote\"],\"llDXYJ\":[\"Backups\"],\"lnV9JE\":[\"Unregister\"],\"lpTJF8\":[\"This address already holds this role\"],\"lsLMXZ\":[\"Start Issue\"],\"m+s/1w\":[\"No proposals created...\"],\"m01EHO\":[\"Discussions of ecosystem ideas\"],\"m16xKo\":[\"Add\"],\"mBdi4t\":[\"Basket Governance\"],\"maOPkj\":[\"Mintable now\"],\"mif1tC\":[\"Short Freeze\"],\"mkW9xD\":[\"Broker\"],\"mo0Ni5\":[\"Use the Alexios governor format?\"],\"muMr9+\":[\"Refresh quote\"],\"n+8yVN\":[\"Signature\"],\"n/7eJI\":[\"St Token Ticker\"],\"n5/QY4\":[\"Invalid maximum range\"],\"nBB/1g\":[\"Unknown amount of recollateralization auctions left to run\"],\"nDsw/H\":[\"stRSR Token\"],\"nU/QUI\":[\"Mint disabled\"],\"nU3mt/\":[\"Submit proposal on-chain\"],\"nUImH+\":[\"Voting Period\"],\"nd4lSI\":[\"Batch trade\"],\"ngS/8Z\":[\"Claim $\",[\"0\"]],\"njiDEz\":[[\"pauseLabel\"],\" not paused\"],\"nlmg5u\":[\"The warmup period is how many seconds should pass after the basket regained the SOUND status before an RToken can be issued and/or a trade can be opened.\"],\"nsUy30\":[\"Delegate voting power\"],\"o+XJ9D\":[\"Change\"],\"o6ImqE\":[\"You submit the transaction configuring your RToken design\"],\"oC5VUA\":[\"Snapshot Delay\"],\"oDQ5xF\":[\"Proposal execution delay (hours)\"],\"oHUnqt\":[\"Duration in Seconds\"],\"oKucDI\":[\"Please sign the transaction in your wallet to continue with the deployment process.\"],\"oMnqeW\":[\"RToken Maximum trade volume ($)\"],\"oMs/1/\":[\"Tx in process...\"],\"oS2F65\":[\"Buying\"],\"ogCHh3\":[\"Contract upgrades\"],\"olT/Wc\":[\"Governance gets deployed & your RToken is now usable (if unpaused)\"],\"ou6PkF\":[\"Pool\"],\"p2vqx1\":[\"No voters at this moment...\"],\"p5fpTr\":[\"Meditate peacefully on the stability of a future asset backed reserve currency while your RToken deploys 🧘‍♂️\"],\"p5nYkr\":[\"View All\"],\"pB3Yot\":[\"Collateral Plugins\"],\"pJ2Ng0\":[\"In Withdraw Process\"],\"pMn92J\":[\"Wrapping collateral tokens\"],\"pRLw2a\":[\"Details + Roles\"],\"pVgGbU\":[\"Change in:\"],\"pYpb1y\":[\"Governance parameters\"],\"pfKK+t\":[\"Spell 1\"],\"pfaRE0\":[\"Dutch trade\"],\"plhHQt\":[\"No data\"],\"ps586T\":[\"Underlying Platform Exposure\"],\"pwUZo2\":[\"Confirming...\"],\"pynxnf\":[\"Review stake\"],\"q0gCXD\":[\"Collateral distribution\"],\"q6lAbz\":[\"Staked\"],\"qFHaGG\":[\"Redeemable now\"],\"qS2FaE\":[\"Contracts\"],\"qSVeRc\":[\"Setup Governance\"],\"qaArC7\":[\"Below minimum trade volume\"],\"qdZImh\":[\"Governance roles\"],\"qeq9zz\":[[\"pauseLabel\"],\" paused\"],\"qg1O48\":[\"Only the guardian address or governance will be able to unpause\"],\"qvSTRH\":[\"Backing buffer\"],\"r+1aZf\":[\"Historical metrics\"],\"r/0iqc\":[\"Welcome to Reserve — a platform for creating, exploring, and interacting with Decentralized Token Folios (“DTFs”). A DTF is the generic name given to any onchain asset-backed index. DTFs can be created on Reserve’s Yield Protocol or Index Protocol permissionlessly, by any person or entity.\"],\"r9JRyA\":[\"Deployer\"],\"rCQOIX\":[\"Staking yield share ends\"],\"rEptSB\":[\"Change diversity factor\"],\"rP4PKZ\":[\"No emergency collateral for target\"],\"rQh1iF\":[\"Abstain\"],\"rbkFds\":[\"The configured network \\\"\",[\"currentChain\"],\"\\\" is different from the wallet selected network \\\"\",[\"chainId\"],\"\\\"\\\". Change your network in the connected wallet.\"],\"rcvQYl\":[\"Each type of trade can currently happen in only one way; the protocol launches a Gnosis EasyAuction. The Reserve Protocol is designed to make it easy to add other trading methods, but no other methods are currently supported.\"],\"rd4eHq\":[\"View on Etherscan\"],\"rf/1ro\":[\"Be aware that anyone can create an RToken that ends up on this list. We don't apply any standards beyond what can be done with the Reserve Protocol.\"],\"rhMQ3Z\":[\"Auctions\"],\"rmZvu8\":[\"Wrap collaterals\"],\"rpilX8\":[\"Final price in:\"],\"rqptfw\":[\"Initial RToken state after deployment\"],\"s9KGXU\":[\"Sold\"],\"s9TQT6\":[\"Still have questions? Come talk to us in the Reserve Discord server. We’d be happy to help! You can also\"],\"sDP9Ho\":[\"Pause status\"],\"sG20ZB\":[\"Brand Manager\"],\"sb9Y58\":[\"Wallet\"],\"sfFoij\":[\"Revenue share\"],\"sjs3Wq\":[\"This app is an open source project developed and maintained by ABC Labs to interact with the Reserve Protocol and various DTFs deployed with the protocol.\"],\"sk7H6q\":[\"Redeem \",[\"0\"]],\"snZOdR\":[\"Other config\"],\"srRMnJ\":[\"Customize\"],\"t/YqKh\":[\"Remove\"],\"t4r50E\":[\"Collateral(s)\"],\"t7AAh/\":[\"Unstaking RSR\"],\"tLSIFr\":[\"Stay patient while the transaction is in progress & don't close this window to avoid issues finding your way back here.\"],\"ta/cTS\":[\"Redemption throttle amount\"],\"tdllfV\":[\"ETH address\"],\"te2erb\":[\"This asset is already (being) registered\"],\"tfDRzk\":[\"Save\"],\"tjTLy7\":[\"Issuance throttle rate\"],\"u+VWhB\":[\"Copied to clipboard!\"],\"u3ZeYl\":[\"Transaction failed\"],\"uAQUqI\":[\"Status\"],\"uQt4Id\":[\"Trading delay - how many seconds should pass after the basket has been changed, before a rebalancing trade is opened. Why does this matter? To avoid losses due to poor liquidity.\"],\"uhqYEB\":[\"No emergency collateral for this target unit\"],\"ujpEaI\":[\"Please connect your wallet\"],\"v+QrKR\":[\"RToken in Wallet\"],\"v3O3qT\":[\"Token name - the name of the RToken eg. Savings Dollar\"],\"vDXkqt\":[\"Tx1. RToken Deploy\"],\"vFeILc\":[\"Primary Basket\"],\"vi7Gkt\":[\"Small revenue auctions\"],\"vq/idj\":[\"Redeem amount\"],\"w8xQRx\":[\"Invalid value\"],\"wENF7v\":[\"Signing Tx 1\"],\"wHW6eD\":[\"The guardian has the ability to reject proposals even if they pass. Should be assigned to a multisig or EOA that can be trusted to act as a backstop. It is acceptable if it is relatively slow to act. Only one guardian address should be defined.\"],\"wQ0QLx\":[\"Unfreeze\"],\"wTvlZg\":[\"Primary basket\"],\"wh9uml\":[\"Add new address\"],\"wjincn\":[\"Input token name or symbol\"],\"wmlz0b\":[\"Simulation unsuccessful ✘\"],\"wssdFG\":[\"Holders APY\"],\"ww1hmr\":[\"Short freeze duration\"],\"wzyEKJ\":[\"Tokens to match trade\"],\"x1Ujs3\":[\"Basket Handler\"],\"x59O98\":[\"3.4.0 Upgrade spells\"],\"x9GEpw\":[\"Issuance rate - allows the issuer to limit the amount of RTokens issued per hour based on a percentage of the current RToken market cap. This matters in the event of an exploit where an attacker tries to issue more RTokens. This buys time for users with pause or freeze permissions to reduce the amount of RTokens that can be issued.\"],\"xE0CMr\":[\"Surplus below minimum trade\"],\"xEIcwa\":[\"Invalid (\",[\"targetUnit\"],\") basket distribution\"],\"xEhonF\":[\"(in their Github repository)\"],\"xYxQCZ\":[[\"0\"],\" \",[\"1\"]],\"xc4rPs\":[\"No transactions\"],\"xcRNSV\":[\"Cancel Issue\"],\"xjFy3M\":[\"Add to primary basket\"],\"xjhtsV\":[\"Chain\"],\"xkAsLE\":[\"Owner address\"],\"xmPyUn\":[\"Redemption amount - allows the issuer to limit the amount of RTokens redeemed per hour. This matters in the event of an exploit where an attacker tries to redeem RTokens.This buys time for users with pause or freeze permissions to reduce the amount of RTokens that can be redeemed.\"],\"xouc5P\":[\"Cancel unstake\"],\"xr5Ynp\":[\"When you unstake your stRSR, there will be a delay (defined by governance). This is to eliminate game theory scenarios that would make the backstop RSR staked pool less effective because people would continually be incentivized to unstake and restake.\"],\"xrBkuC\":[\"As RToken\"],\"y2L2W5\":[\"Claimable emissions\"],\"y8908V\":[\"Validating...\"],\"yGeylI\":[\"This is the target collateral basket at the onset of an RToken that defines which collateral needs to be deposited for issuances. The prime basket is directly set by governance, and only changes through successful governance proposals.\"],\"yIRfV3\":[\"Including off-chain in-app transactions of RToken in the Reserve App.\"],\"yJo4PI\":[\"Create a new overcollateralized Yield DTF\"],\"yUHPo3\":[\"Please select an asset to claim\"],\"ymns7Z\":[\"RToken will be left in pause state\"],\"ypPAJ2\":[\"Proposal Title\"],\"ypVIwM\":[\"Alexios is standard token-voting adopted from Compound Governor Bravo, with adjustments accounting for RSR being staked across multiple RTokens.\"],\"yuBO6n\":[\"Staked RSR\"],\"z77j59\":[\"Confirm & prepare proposal\"],\"z7p6LJ\":[\"Redeem - Global throttle\"],\"z95yhS\":[\"Reserve Protocol Smart-Contract Risk\"],\"zPGNJm\":[\"Transfer\"],\"zXlSi4\":[\"Collateral Exposure\"],\"zoFqVH\":[\"Deploy Governance\"],\"zsUWkY\":[\"Reserve Forum\"]}")}; \ No newline at end of file diff --git a/src/locales/es.po b/src/locales/es.po index bc4dfcc8a..ec805cb7b 100644 --- a/src/locales/es.po +++ b/src/locales/es.po @@ -13,56 +13,70 @@ msgstr "" "Language-Team: \n" "Plural-Forms: \n" +#: src/views/yield-dtf/governance/views/proposal/components/UnregisterProposal.tsx:54 +msgid " auctioned" +msgstr "" + +#. placeholder {0}: rToken?.symbol ?? '' #: src/views/yield-dtf/issuance/components/redeem/index.tsx:37 msgid "- Redeem {0}" msgstr "" -#: src/views/yield-dtf/auctions/components/About.tsx:75 +#: src/views/yield-dtf/auctions/components/About.tsx:65 msgid "(in their Github repository)" msgstr "" -#: src/views/yield-dtf/deploy/components/TokenParameters.tsx:53 -#: src/views/yield-dtf/overview/components/hero/OverviewActions.tsx:136 +#. placeholder {0}: !!holders ? `Mint ${formatCurrency(holders, 1)}% Est. APY` : 'Mint' +#. placeholder {0}: CHAIN_TAGS[chainId] +#: src/views/yield-dtf/deploy/components/TokenParameters.tsx:42 +#: src/views/yield-dtf/overview/components/hero/overview-actions.tsx:123 msgid "{0}" msgstr "" -#: src/views/yield-dtf/overview/components/charts/APYChart.tsx:281 +#. placeholder {0}: rToken?.symbol ?? '' +#. placeholder {1}: currentPrice === 'USD' ? 'Price' : 'Exchange Rate' +#: src/views/yield-dtf/overview/components/charts/price-chart.tsx:132 +msgid "{0} {1}" +msgstr "" + +#. placeholder {0}: rToken?.symbol ?? '' +#: src/views/yield-dtf/overview/components/charts/apy-chart.tsx:294 msgid "{0} APY" msgstr "" +#. placeholder {0}: settleable?.length ?? 0 #: src/views/yield-dtf/auctions/auctions-sidebar/SettleableAuctions.tsx:74 msgid "{0} auctions" msgstr "" -#: src/views/yield-dtf/overview/components/hero/TokenMandate.tsx:28 +#. placeholder {0}: expanded ? '-' : '+' +#: src/views/yield-dtf/overview/components/hero/token-mandate.tsx:25 msgid "{0} Description" msgstr "" +#. placeholder {0}: formatCurrency(revenueData?.pendingToMelt ?? 0) +#. placeholder {1}: rToken?.symbol ?? 'rToken' #: src/views/yield-dtf/auctions/auctions-sidebar/MeltingBox.tsx:42 msgid "{0} of {1}" msgstr "" -#: src/views/yield-dtf/overview/components/charts/PriceChart.tsx:120 -msgid "{0} Price" -msgstr "" - -#: src/views/yield-dtf/issuance/components/wrapping/CollateralItem.tsx:337 +#: src/views/yield-dtf/issuance/components/wrapping/CollateralItem.tsx:332 msgid "{fromToken} amount" msgstr "" -#: src/views/yield-dtf/settings/components/PauseManager.tsx:69 +#: src/views/yield-dtf/settings/components/pause-manager.tsx:66 msgid "{pauseLabel} not paused" msgstr "" -#: src/views/yield-dtf/settings/components/PauseManager.tsx:69 +#: src/views/yield-dtf/settings/components/pause-manager.tsx:66 msgid "{pauseLabel} paused" msgstr "" -#: src/components/rtoken-setup/basket/UnitBasket.tsx:96 +#: src/components/rtoken-setup/basket/UnitBasket.tsx:134 msgid "{unit} Token distribution" msgstr "" -#: src/components/rtoken-setup/token/BackingForm.tsx:97 +#: src/components/rtoken-setup/token/BackingForm.tsx:101 msgid "% Acceptable" msgstr "" @@ -70,133 +84,123 @@ msgstr "" msgid "% Revenue share" msgstr "" -#: src/components/rtoken-setup/token/RevenueSplit.tsx:117 +#: src/components/rtoken-setup/token/RevenueSplit.tsx:125 msgid "% Revenue to RSR Stakers" msgstr "" -#: src/components/rtoken-setup/token/RevenueSplit.tsx:108 +#: src/components/rtoken-setup/token/RevenueSplit.tsx:116 msgid "% Revenue to RToken Holders" msgstr "" -#: src/views/yield-dtf/settings/components/RevenueSplitInfo.tsx:40 +#: src/views/yield-dtf/settings/components/revenue-split-info.tsx:30 msgid "% to external address" msgstr "" -#: src/views/yield-dtf/issuance/components/issue/Issue.tsx:112 +#. placeholder {0}: rToken?.symbol ?? '' +#: src/views/yield-dtf/issuance/components/issue/Issue.tsx:116 msgid "+ Mint {0}" msgstr "" -#: src/components/rtoken-setup/token/TokenConfiguration.tsx:35 +#: src/components/rtoken-setup/token/TokenConfiguration.tsx:33 msgid "15 params" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/SpellUpgrade.tsx:44 +#: src/views/yield-dtf/governance/views/proposal/components/SpellUpgrade.tsx:45 msgid "3.4.0 Upgrade spells" msgstr "" -#: src/views/discover/components/yield/components/RegisterAbout.tsx:27 -msgid "A Brief RToken Introduction" +#: src/views/discover/components/yield/components/RegisterAbout.tsx:34 +msgid "A Brief DTF Introduction" msgstr "" -#: src/views/yield-dtf/auctions/components/About.tsx:67 +#: src/views/yield-dtf/auctions/components/About.tsx:56 msgid "A good explainer for how Gnosis auctions work can be found" msgstr "" -#: src/utils/index.ts:80 +#: src/utils/index.ts:127 msgid "A year ago" msgstr "" -#: src/views/discover/components/yield/components/RegisterAbout.tsx:131 -msgid "ABC Labs uses industry standard anonymized analytics tools to understand usage and improve the user experience. ABC Labs does not collect any information about users or their financial activity." +#: src/views/discover/components/yield/components/RegisterAbout.tsx:129 +msgid "ABC Labs requires additional information beyond what is available on the blockchain to give users relevant data to make informed decisions. As a user, please evaluate any new DTF carefully before holding, staking RSR, or vote locking tokens on them." msgstr "" -#: src/views/yield-dtf/auctions/components/About.tsx:10 -msgid "About" +#: src/views/discover/components/yield/components/RegisterAbout.tsx:142 +msgid "ABC Labs uses industry standard anonymized analytics tools to understand usage and improve the user experience. ABC Labs does not collect any information about users or their financial activity." msgstr "" #: src/views/yield-dtf/auctions/auctions-sidebar/Revenue.tsx:99 msgid "Above minimum trade volume" msgstr "" -#: src/views/yield-dtf/governance/views/proposal-detail/components/ProposalVotes.tsx:109 -#: src/views/yield-dtf/governance/views/proposal-detail/components/VoteModal.tsx:50 +#: src/views/index-dtf/governance/views/proposal/components/vote-modal.tsx:58 +#: src/views/yield-dtf/governance/views/proposal-detail/components/ProposalVotes.tsx:90 +#: src/views/yield-dtf/governance/views/proposal-detail/components/VoteModal.tsx:55 msgid "Abstain" msgstr "" -#: src/components/transactions/manager/TransactionHeader.tsx:25 -msgid "Account" -msgstr "" - -#: src/components/rtoken-setup/basket/CustomCollateral.tsx:143 -#: src/views/yield-dtf/governance/views/proposal/components/ItemPreview.tsx:43 -#: src/views/yield-dtf/governance/views/proposal/components/ListItemPreview.tsx:21 -#: src/views/yield-dtf/governance/views/proposal/components/ProposedRevenueSplitPreview.tsx:127 +#: src/components/rtoken-setup/basket/CustomCollateral.tsx:144 +#: src/views/yield-dtf/governance/views/proposal/components/ItemPreview.tsx:45 +#: src/views/yield-dtf/governance/views/proposal/components/ListItemPreview.tsx:22 +#: src/views/yield-dtf/governance/views/proposal/components/ProposedRevenueSplitPreview.tsx:130 msgid "Add" msgstr "" -#: src/components/rtoken-setup/token/RevenueSplit.tsx:150 +#: src/components/rtoken-setup/token/RevenueSplit.tsx:163 msgid "Add new address" msgstr "" -#: src/components/rtoken-setup/basket/CollateralModal.tsx:181 +#: src/components/rtoken-setup/basket/CollateralModal.tsx:165 msgid "Add to backup basket" msgstr "" #: src/components/rtoken-setup/basket/EmergencyCollateral.tsx:122 -#: src/components/rtoken-setup/basket/PrimaryBasket.tsx:96 +#: src/components/rtoken-setup/basket/PrimaryBasket.tsx:210 msgid "Add to basket" msgstr "" -#: src/components/rtoken-setup/basket/CollateralModal.tsx:179 +#: src/components/rtoken-setup/basket/CollateralModal.tsx:163 msgid "Add to primary basket" msgstr "" -#: src/views/yield-dtf/governance/components/TopVoters.tsx:88 +#: src/views/index-dtf/settings/components/index-settings-basic.tsx:26 +#: src/views/yield-dtf/governance/components/TopVoters.tsx:89 msgid "Address" msgstr "" -#: src/components/rtoken-setup/token/TokenConfiguration.tsx:32 +#: src/components/rtoken-setup/token/TokenConfiguration.tsx:30 msgid "Advanced config:" msgstr "" -#: src/views/bridge/components/BridgeFaq.tsx:48 -msgid "After your withdrawal request is proposed onchain (transaction 1) you must verify (transaction 2) and complete (transaction 3) the withdrawal in order to access your funds. You can track your progress in the transactions table under Withdrawals." -msgstr "" - -#: src/views/yield-dtf/governance/views/proposal-detail/components/VoteModal.tsx:49 +#: src/views/index-dtf/governance/views/proposal/components/vote-modal.tsx:57 +#: src/views/yield-dtf/governance/views/proposal-detail/components/VoteModal.tsx:54 msgid "Against" msgstr "" -#: src/views/yield-dtf/settings/components/ListingInfo.tsx:26 +#: src/views/yield-dtf/settings/components/listing-info.tsx:39 msgid "Alexios is standard token-voting adopted from Compound Governor Bravo, with adjustments accounting for RSR being staked across multiple RTokens." msgstr "" -#: src/views/index-dtf/governance/components/governance-stats.tsx:84 -#: src/views/yield-dtf/governance/components/GovernanceOverview.tsx:116 +#: src/views/yield-dtf/governance/components/GovernanceOverview.tsx:126 msgid "All time" msgstr "" -#: src/views/tokens/Tokens.tsx:23 +#: src/views/tokens/Tokens.tsx:24 msgid "All unlisted RTokens" msgstr "" -#: src/components/transactions/table/index.tsx:78 -#: src/views/bridge/components/BridgeWithdrawals.tsx:22 -#: src/views/explorer/components/transactions/useTransactionColumns.tsx:77 -#: src/views/yield-dtf/auctions/components/useColumns.tsx:40 -#: src/views/yield-dtf/overview/components/RTokenTransactions.tsx:105 +#: src/components/transactions/table/index.tsx:77 +#: src/views/explorer/components/transactions/useTransactionColumns.tsx:76 +#: src/views/yield-dtf/auctions/components/useColumns.tsx:39 +#: src/views/yield-dtf/overview/components/rtoken-transactions.tsx:108 msgid "Amount" msgstr "" -#: src/views/home/components/Hero.tsx:68 -msgid "Annualized RSR Stakers Revenue" +#: src/views/index-dtf/settings/components/index-settings-fees.tsx:92 +msgid "Annualized TVL Fee" msgstr "" -#: src/views/home/components/Hero.tsx:58 -msgid "Annualized RTokens Revenue" -msgstr "" - -#: src/views/yield-dtf/auctions/components/About.tsx:84 +#: src/views/yield-dtf/auctions/components/About.tsx:74 msgid "Anyone can click the button above to check and trigger an auction for any revenue that has accrued or for rebalances that need to happen. Please note that for RTokens with many collateral types in the basket, this may be an expensive transaction to execute." msgstr "" @@ -204,34 +208,30 @@ msgstr "" msgid "Approve in wallet" msgstr "" -#: src/views/bridge/components/BridgeFaq.tsx:77 -msgid "Are there any fees involved in using Base Bridge?" -msgstr "" - -#: src/components/rtoken-setup/token/ExternalRevenueSplit.tsx:101 +#: src/components/rtoken-setup/token/ExternalRevenueSplit.tsx:96 msgid "As RSR" msgstr "" -#: src/components/rtoken-setup/token/ExternalRevenueSplit.tsx:91 +#: src/components/rtoken-setup/token/ExternalRevenueSplit.tsx:89 msgid "As RToken" msgstr "" -#: src/views/yield-dtf/settings/components/ContractsInfo.tsx:26 +#: src/views/yield-dtf/settings/components/contracts-info.tsx:22 msgid "Asset Registry" msgstr "" -#: src/views/yield-dtf/auctions/auctions-sidebar/AvailableRevenueAuctions.tsx:37 -msgid "Auctionable revenue" +#: src/views/index-dtf/settings/components/index-settings-roles.tsx:59 +msgid "Auction Launcher" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/UnregisterProposal.tsx:48 -msgid "auctioned" +#: src/views/yield-dtf/auctions/auctions-sidebar/AvailableRevenueAuctions.tsx:37 +msgid "Auctionable revenue" msgstr "" -#: src/components/layout/navigation/index.tsx:112 -#: src/components/layout/navigation/TokenNavigation.tsx:207 -#: src/views/index-dtf/components/navigation/index.tsx:85 -#: src/views/yield-dtf/auctions/auctions-sidebar/index.tsx:23 +#: src/components/layout/navigation/index.tsx:79 +#: src/components/layout/navigation/TokenNavigation.tsx:180 +#: src/views/index-dtf/components/navigation/index.tsx:130 +#: src/views/yield-dtf/auctions/auctions-sidebar/index.tsx:16 msgid "Auctions" msgstr "" @@ -239,143 +239,143 @@ msgstr "" msgid "Available collateral" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/ProposalNavigation.tsx:39 +#: src/views/yield-dtf/governance/views/proposal/components/ProposalNavigation.tsx:38 msgid "Back to Governance" msgstr "" -#: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:44 +#: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:43 msgid "Back to settings" msgstr "" -#: src/views/yield-dtf/overview/components/backing/BackingOverview.tsx:90 -#: src/views/yield-dtf/overview/components/CollateralPieChartWrapper.tsx:136 +#: src/views/yield-dtf/overview/components/backing/backing-overview.tsx:77 +#: src/views/yield-dtf/overview/components/collateral-pie-chart-wrapper.tsx:85 msgid "Backing" msgstr "" -#: src/components/layout/navigation/TokenNavigation.tsx:189 -#: src/views/yield-dtf/overview/components/backing/index.tsx:71 +#: src/components/layout/navigation/TokenNavigation.tsx:162 +#: src/views/yield-dtf/overview/components/backing/index.tsx:85 msgid "Backing & Risk" msgstr "" -#: src/views/discover/components/yield/components/MobileCollateralInfo.tsx:46 -#: src/views/discover/components/yield/components/RTokenCard.tsx:212 +#: src/views/discover/components/yield/components/MobileCollateralInfo.tsx:28 +#: src/views/discover/components/yield/components/TokenStats.tsx:58 msgid "Backing + Overcollaterization:" msgstr "" -#: src/views/yield-dtf/staking/components/overview/StakingStats.tsx:77 +#: src/views/yield-dtf/staking/components/overview/staking-stats.tsx:83 msgid "Backing + Staked" msgstr "" -#: src/views/yield-dtf/settings/components/BackingInfo.tsx:66 +#: src/views/yield-dtf/settings/components/backing-info.tsx:47 msgid "Backing buffer" msgstr "" -#: src/components/rtoken-setup/token/BackingForm.tsx:85 -msgid "Backing buffer - percentage value that describes how much additional collateral tokens to keep in the BackingManager before forwarding tokens to the RevenueTraders. The RevenueTraders here refers to the RToken and RSR traders. Why this matters? It allows collateral tokens to be periodically converted into the RToken, which is a more efficient form of revenue production than trading each individual collateral for the desired RToken. It also provides a buffer to prevent RSR seizure after trading slippage. For more info on the BackingManager and Trader types see the “Revenue distribution to RToken holders” and “Summary of revenue distribution” in our documentation." +#: src/components/rtoken-setup/token/BackingForm.tsx:89 +msgid "Backing buffer - percentage value that describes how much additional collateral tokens to keep in the BackingManager before forwarding tokens to the RevenueTraders. The RevenueTraders here refers to the RToken and RSR traders. Why this matters? It allows collateral tokens to be periodically converted into the RToken, which is a more efficient form of revenue production than trading each individual collateral for the desired RToken. It also provides a buffer to prevent RSR seizure after trading slippage. For more info on the BackingManager and Trader types see the \"Revenue distribution to RToken holders\" and \"Summary of revenue distribution\" in our documentation." msgstr "" -#: src/components/rtoken-setup/token/BackingForm.tsx:83 +#: src/components/rtoken-setup/token/BackingForm.tsx:87 msgid "Backing buffer (%)" msgstr "" -#: src/components/layout/navigation/TokenNavigation.tsx:225 -#: src/views/yield-dtf/governance/views/proposal/components/ProposalNavigation.tsx:17 -#: src/views/yield-dtf/settings/components/NavigationSidebar.tsx:15 +#: src/components/layout/navigation/TokenNavigation.tsx:198 +#: src/views/yield-dtf/governance/views/proposal/components/ProposalNavigation.tsx:16 +#: src/views/yield-dtf/settings/components/navigation-sidebar.tsx:14 msgid "Backing config" msgstr "" -#: src/views/yield-dtf/deploy/components/BackingManager.tsx:9 -#: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:24 -#: src/views/yield-dtf/settings/components/ContractsInfo.tsx:21 +#: src/views/yield-dtf/deploy/components/BackingManager.tsx:14 +#: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:23 +#: src/views/yield-dtf/settings/components/contracts-info.tsx:17 msgid "Backing Manager" msgstr "" -#: src/views/yield-dtf/settings/components/BackingInfo.tsx:23 +#: src/views/yield-dtf/settings/components/backing-info.tsx:15 msgid "Backing Parameters" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/ProposedBackupPreview.tsx:104 +#: src/views/yield-dtf/governance/views/proposal/components/ProposedBackupPreview.tsx:115 msgid "Backup basket" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/ProposalBasketSetup.tsx:93 +#: src/views/yield-dtf/governance/views/proposal/components/ProposalBasketSetup.tsx:79 msgid "Backup configuration tracks primary basket changes to update its values. This may not be desired on a proposal, you can choose to propose new changes." msgstr "" -#: src/views/yield-dtf/settings/components/EmergencyCollateralInfo.tsx:27 +#: src/views/yield-dtf/settings/components/emergency-collateral-info.tsx:22 msgid "Backups" msgstr "" -#: src/views/yield-dtf/governance/components/AccountVotes.tsx:75 -msgid "Balance:" +#: src/views/yield-dtf/governance/components/AccountVotes.tsx:74 +msgid "Balance: " msgstr "" -#: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:20 -#: src/views/yield-dtf/deploy/components/TokenParameters.tsx:133 +#: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:19 +#: src/views/yield-dtf/deploy/components/TokenParameters.tsx:123 msgid "Basics" msgstr "" -#: src/components/rtoken-setup/basket/UnitBasket.tsx:77 -#: src/views/yield-dtf/settings/components/BasketInfo.tsx:26 +#: src/components/rtoken-setup/basket/UnitBasket.tsx:107 +#: src/views/yield-dtf/settings/components/basket-info.tsx:21 msgid "Basket" msgstr "" -#: src/views/explorer/components/tokens/index.tsx:180 +#: src/views/explorer/components/tokens/index.tsx:160 msgid "Basket APY" msgstr "" -#: src/components/layout/header/components/TokenToggle.tsx:66 -msgid "Basket defaulted" +#: src/views/index-dtf/settings/components/index-settings-governance.tsx:120 +msgid "Basket Governance" msgstr "" -#: src/views/yield-dtf/settings/components/ContractsInfo.tsx:22 +#: src/views/yield-dtf/settings/components/contracts-info.tsx:18 msgid "Basket Handler" msgstr "" -#: src/components/layout/header/components/TokenToggle.tsx:68 -msgid "Basket iffy" -msgstr "" - #: src/views/yield-dtf/issuance/components/issue/ConfirmIssuance.tsx:89 msgid "Basket is not ready" msgstr "" -#: src/components/rtoken-setup/basket/UnitBasket.tsx:90 +#: src/components/rtoken-setup/basket/UnitBasket.tsx:128 msgid "Basket scale for this unit of account. This is used to initially calculate how much of each token is required for minting." msgstr "" -#: src/views/yield-dtf/settings/components/BackingInfo.tsx:29 +#: src/views/yield-dtf/settings/components/backing-info.tsx:19 msgid "Basket warmup period" msgstr "" -#: src/views/yield-dtf/settings/components/BackingInfo.tsx:50 +#: src/views/yield-dtf/settings/components/backing-info.tsx:37 msgid "Batch auction length" msgstr "" -#: src/components/rtoken-setup/token/BackingForm.tsx:57 +#: src/components/rtoken-setup/token/BackingForm.tsx:61 msgid "Batch Auction length - defines how long Gnosis EasyAuction auctions should be. Gnosis EasyAuction is a platform enabling fair price discovery for tokens through the use of batch auctions." msgstr "" -#: src/components/rtoken-setup/token/BackingForm.tsx:55 +#: src/components/rtoken-setup/token/BackingForm.tsx:59 msgid "Batch Auction length (s)" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/TraderImplementationProposal.tsx:14 +#: src/views/yield-dtf/governance/views/proposal/components/TraderImplementationProposal.tsx:22 msgid "Batch trade" msgstr "" -#: src/views/tokens/Tokens.tsx:24 +#: src/views/tokens/Tokens.tsx:27 msgid "Be aware that anyone can create an RToken that ends up on this list. We don't apply any standards beyond what can be done with the Reserve Protocol." msgstr "" -#: src/views/yield-dtf/settings/components/GovernancePrompt.tsx:53 +#: src/views/yield-dtf/settings/components/governance-prompt.tsx:33 msgid "Begin governance setup" msgstr "" +#. placeholder {0}: formatCurrency(Number(amount)) +#. placeholder {1}: rToken?.symbol #: src/views/yield-dtf/issuance/components/issue/ConfirmIssuance.tsx:96 msgid "Begin minting {0} {1}" msgstr "" +#. placeholder {0}: formatCurrency(Number(amount)) +#. placeholder {1}: rToken?.symbol ?? '' #: src/views/yield-dtf/issuance/components/redeem/ConfirmRedemption.tsx:99 msgid "Begin redemption of {0} {1}" msgstr "" @@ -384,118 +384,107 @@ msgstr "" msgid "Below minimum trade volume" msgstr "" -#: src/views/yield-dtf/auctions/components/useColumns.tsx:36 +#: src/views/yield-dtf/auctions/components/useColumns.tsx:35 msgid "Bought" msgstr "" -#: src/views/yield-dtf/settings/components/ContractsInfo.tsx:25 -msgid "Broker" +#: src/views/index-dtf/settings/components/index-settings-roles.tsx:68 +msgid "Brand Manager" msgstr "" -#: src/components/layout/header/components/HeaderMenu.tsx:46 -msgid "Browse" +#: src/views/yield-dtf/settings/components/contracts-info.tsx:21 +msgid "Broker" msgstr "" -#: src/views/discover/components/yield/components/CompareTokensTitle.tsx:48 +#: src/views/discover/components/yield/components/CompareTokensTitle.tsx:34 msgid "Browse RTokens" msgstr "" -#: src/views/yield-dtf/auctions/components/useColumns.tsx:36 +#: src/views/yield-dtf/auctions/components/useColumns.tsx:35 msgid "Buying" msgstr "" -#: src/views/bridge/components/BridgeFaq.tsx:83 -msgid "Can I cancel a withdrawal?" -msgstr "" - -#: src/components/layout/header/components/RegisterHelp.tsx:82 -msgid "Can’t find what you’re looking for elsewhere or want to join the conversation?" -msgstr "" - -#: src/views/yield-dtf/staking/components/stake/EditDelegate.tsx:34 +#: src/views/yield-dtf/staking/components/stake/edit-delegate.tsx:39 msgid "Cancel" msgstr "" -#: src/components/transactions/table/index.tsx:53 -#: src/views/explorer/components/transactions/useTransactionColumns.tsx:33 -#: src/views/yield-dtf/overview/components/RTokenTransactions.tsx:83 +#: src/components/transactions/table/index.tsx:52 +#: src/views/explorer/components/transactions/useTransactionColumns.tsx:32 +#: src/views/yield-dtf/overview/components/rtoken-transactions.tsx:80 msgid "Cancel Issue" msgstr "" +#: src/views/index-dtf/governance/views/proposal/components/proposal-cancel-button.tsx:135 #: src/views/yield-dtf/governance/views/proposal-detail/components/ProposalCancel.tsx:48 msgid "Cancel proposal" msgstr "" -#: src/views/yield-dtf/staking/components/withdraw/CooldownUnstake.tsx:73 +#: src/views/yield-dtf/staking/components/withdraw/cooldown-unstake.tsx:70 msgid "Cancel unstake" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/SpellUpgrade.tsx:72 +#: src/views/yield-dtf/governance/views/proposal/components/SpellUpgrade.tsx:77 msgid "Cast Spell 1" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/SpellUpgrade.tsx:81 +#: src/views/yield-dtf/governance/views/proposal/components/SpellUpgrade.tsx:88 msgid "Cast Spell 2" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/SpellUpgradePreview.tsx:28 +#: src/views/yield-dtf/governance/views/proposal/components/SpellUpgradePreview.tsx:32 msgid "Casting 3.4.0 upgrade spell" msgstr "" -#: src/components/layout/token-menu/Caution.tsx:24 -msgid "Caution" -msgstr "" - -#: src/views/earn/hooks/useEarnTableColumns.tsx:141 -#: src/views/yield-dtf/overview/components/RTokenTransactions.tsx:133 +#: src/views/earn/hooks/useEarnTableColumns.tsx:113 msgid "Chain" msgstr "" -#: src/views/yield-dtf/governance/components/AccountVotes.tsx:105 -#: src/views/yield-dtf/governance/views/proposal/components/ItemPreview.tsx:120 +#: src/views/yield-dtf/governance/components/AccountVotes.tsx:104 +#: src/views/yield-dtf/governance/views/proposal/components/ItemPreview.tsx:116 msgid "Change" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/ProposalBasketSetup.tsx:90 +#: src/views/yield-dtf/governance/views/proposal/components/ProposalBasketSetup.tsx:76 msgid "Change backup basket" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/ProposedRevenueSplitPreview.tsx:110 +#: src/views/yield-dtf/governance/views/proposal/components/ProposedRevenueSplitPreview.tsx:113 msgid "Change distribution" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/ProposedBackupPreview.tsx:110 -#: src/views/yield-dtf/governance/views/proposal/components/ProposedBackupPreview.tsx:131 +#: src/views/yield-dtf/governance/views/proposal/components/ProposedBackupPreview.tsx:120 +#: src/views/yield-dtf/governance/views/proposal/components/ProposedBackupPreview.tsx:141 msgid "Change diversity factor" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/PreviewBox.tsx:39 +#: src/views/yield-dtf/governance/views/proposal/components/PreviewBox.tsx:36 msgid "Change in:" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/ProposalBasketSetup.tsx:61 +#: src/views/yield-dtf/governance/views/proposal/components/ProposalBasketSetup.tsx:46 msgid "Change primary basket" msgstr "" -#: src/views/yield-dtf/auctions/components/AuctionsHeader.tsx:44 +#: src/views/yield-dtf/auctions/components/AuctionsHeader.tsx:43 msgid "Check for auctions" msgstr "" -#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:44 -msgid "Choose between our Alexios Governor and anything between one man rule to arbitrary DAO structure under your defined Ethereum address." +#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:51 +msgid "Choose between our Alexios Governor and anything between one-person rule to arbitrary DAO structure under your defined Ethereum address." msgstr "" -#: src/views/yield-dtf/issuance/components/redeem/RedeemNonceModal.tsx:40 +#: src/views/yield-dtf/issuance/components/redeem/RedeemNonceModal.tsx:41 msgid "Choose Redemption Basket" msgstr "" -#: src/components/transactions/table/index.tsx:52 -#: src/views/explorer/components/transactions/useTransactionColumns.tsx:32 -#: src/views/yield-dtf/overview/components/RTokenTransactions.tsx:82 +#: src/components/transactions/table/index.tsx:51 +#: src/views/explorer/components/transactions/useTransactionColumns.tsx:31 +#: src/views/yield-dtf/overview/components/rtoken-transactions.tsx:79 msgid "Claim" msgstr "" -#: src/views/yield-dtf/auctions/auctions-sidebar/claim-rewards/components/ClaimFromTraderButton.tsx:79 +#. placeholder {0}: formatCurrency(claimAmount) +#: src/views/yield-dtf/auctions/auctions-sidebar/claim-rewards/components/ClaimFromTraderButton.tsx:78 msgid "Claim ${0}" msgstr "" @@ -507,11 +496,11 @@ msgstr "" msgid "Claimable emissions" msgstr "" -#: src/views/yield-dtf/issuance/components/issue/CollateralDistribution.tsx:47 +#: src/views/yield-dtf/issuance/components/issue/CollateralDistribution.tsx:37 msgid "Collateral distribution" msgstr "" -#: src/views/yield-dtf/overview/components/backing/CollateralExposure.tsx:248 +#: src/views/yield-dtf/overview/components/backing/collateral-exposure.tsx:216 msgid "Collateral Exposure" msgstr "" @@ -519,197 +508,211 @@ msgstr "" msgid "Collateral Plugins" msgstr "" -#: src/components/rtoken-setup/basket/PluginItem.tsx:39 +#: src/components/rtoken-setup/basket/PluginItem.tsx:33 msgid "Collateral token" msgstr "" -#: src/views/yield-dtf/overview/components/CollateralPieChartTooltip.tsx:179 +#: src/views/yield-dtf/overview/components/collateral-pie-chart-tooltip.tsx:141 msgid "Collateral(s)" msgstr "" -#: src/views/yield-dtf/deploy/components/Intro.tsx:35 -#: src/views/yield-dtf/governance/views/proposal/components/Intro.tsx:30 +#: src/views/yield-dtf/deploy/components/Intro.tsx:34 +#: src/views/yield-dtf/governance/views/proposal/components/Intro.tsx:37 msgid "Community Discord" msgstr "" -#: src/views/bridge/components/BridgeFaq.tsx:70 -msgid "community is available around the clock for general questions, assistance and support!" -msgstr "" - -#: src/views/discover/components/yield/components/TokenList.tsx:21 +#: src/views/discover/components/yield/components/TokenList.tsx:22 msgid "Compare RTokens" msgstr "" -#: src/views/bridge/components/FinalizeWithdrawalButton.tsx:47 -msgid "Complete" -msgstr "" - -#: src/views/bridge/components/WithdrawalInfoModal.tsx:69 -msgid "Complete withdrawal on Mainnet" -msgstr "" - -#: src/views/yield-dtf/governance/components/AccountVotes.tsx:58 +#: src/views/yield-dtf/governance/components/AccountVotes.tsx:57 msgid "Configure your vote" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/ProposalOverview.tsx:55 +#: src/views/yield-dtf/governance/views/proposal/components/ProposalOverview.tsx:39 msgid "Confirm & prepare proposal" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/ConfirmProposalOverview.tsx:137 +#: src/views/yield-dtf/governance/views/proposal/components/ConfirmProposalOverview.tsx:121 msgid "Confirm & Submit" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/ProposalOverview.tsx:42 +#: src/views/yield-dtf/governance/views/proposal/components/ProposalOverview.tsx:28 msgid "Confirm changes made" msgstr "" -#: src/views/yield-dtf/governance/components/DelegateModal.tsx:39 +#: src/views/index-dtf/governance/components/delegate-modal.tsx:38 +#: src/views/yield-dtf/governance/components/DelegateModal.tsx:38 msgid "Confirm delegate" msgstr "" -#: src/components/account/index.tsx:103 +#: src/views/index-dtf/governance/views/proposal/components/vote-modal.tsx:149 +msgid "Confirming..." +msgstr "" + +#: src/components/account/index.tsx:95 msgid "Connect" msgstr "" -#: src/components/old/button/TransactionButton.tsx:45 +#: src/components/ui/transaction-button.tsx:57 +#: src/components/ui/transaction.tsx:44 msgid "Connect Wallet" msgstr "" -#: src/views/yield-dtf/staking/components/stake/DelegateStake.tsx:41 +#: src/views/yield-dtf/staking/components/stake/delegate-stake.tsx:45 msgid "Connect your wallet" msgstr "" -#: src/components/layout/navigation/TokenNavigation.tsx:228 -#: src/views/yield-dtf/settings/components/NavigationSidebar.tsx:18 +#: src/components/layout/navigation/TokenNavigation.tsx:201 +#: src/views/yield-dtf/settings/components/navigation-sidebar.tsx:17 msgid "Contract Addresses" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/ContractUpgradesPreview.tsx:30 +#: src/views/yield-dtf/governance/views/proposal/components/ContractUpgradesPreview.tsx:34 msgid "Contract upgrades" msgstr "" -#: src/views/yield-dtf/governance/views/proposal-detail/components/ProposalDetailNavigation.tsx:7 +#: src/views/yield-dtf/governance/views/proposal-detail/components/ProposalDetailNavigation.tsx:6 msgid "Contracts" msgstr "" -#: src/components/old/button/CopyValue.tsx:15 +#: src/views/index-dtf/settings/components/index-settings-governance.tsx:111 +msgid "Controls changes to the basket of an Index DTF" +msgstr "" + +#: src/views/index-dtf/settings/components/index-settings-governance.tsx:113 +msgid "Controls fees, voting parameters, and anything other than basket changes for an Index DTF" +msgstr "" + +#: src/views/index-dtf/settings/components/index-settings-governance.tsx:114 +msgid "Controls settings of the vlDAO including vote lock duration and approving revenue tokens" +msgstr "" + +#: src/components/ui/copy-value.tsx:56 +#: src/components/ui/copy.tsx:20 msgid "Copied to clipboard!" msgstr "" -#: src/components/old/button/CopyValue.tsx:14 +#: src/components/ui/copy-value.tsx:55 +#: src/components/ui/copy.tsx:19 msgid "Copy to clipboard" msgstr "" -#: src/views/yield-dtf/governance/components/ProposalList.tsx:210 -msgid "Create proposal" +#: src/components/layout/header/components/app-navigation.tsx:114 +msgid "Create a new overcollateralized Yield DTF" msgstr "" -#: src/views/explorer/components/governance/index.tsx:64 -msgid "Created At" +#: src/views/yield-dtf/deploy/components/Intro.tsx:17 +msgid "Create a new Yield DTF" msgstr "" -#: src/views/index-dtf/governance/components/governance-stats.tsx:39 -msgid "current" +#: src/components/layout/header/components/app-navigation.tsx:81 +msgid "Create New DTF" msgstr "" -#: src/views/index-dtf/governance/components/governance-stats.tsx:93 -#: src/views/index-dtf/governance/components/governance-stats.tsx:104 -#: src/views/yield-dtf/governance/components/GovernanceOverview.tsx:90 -#: src/views/yield-dtf/governance/components/GovernanceOverview.tsx:126 +#: src/views/yield-dtf/governance/components/ProposalList.tsx:191 +msgid "Create proposal" +msgstr "" + +#: src/views/explorer/components/governance/index.tsx:70 +msgid "Created At" +msgstr "" + +#: src/views/yield-dtf/governance/components/GovernanceOverview.tsx:107 #: src/views/yield-dtf/governance/components/GovernanceOverview.tsx:136 -#: src/views/yield-dtf/governance/views/proposal/components/ItemPreview.tsx:83 -#: src/views/yield-dtf/staking/components/overview/StakingStats.tsx:61 -#: src/views/yield-dtf/staking/components/overview/StakingStats.tsx:71 -#: src/views/yield-dtf/staking/components/overview/StakingStats.tsx:81 +#: src/views/yield-dtf/governance/components/GovernanceOverview.tsx:146 +#: src/views/yield-dtf/governance/views/proposal/components/ItemPreview.tsx:79 +#: src/views/yield-dtf/staking/components/overview/staking-stats.tsx:67 +#: src/views/yield-dtf/staking/components/overview/staking-stats.tsx:77 +#: src/views/yield-dtf/staking/components/overview/staking-stats.tsx:87 msgid "Current" msgstr "" -#: src/components/rtoken-setup/components/RolesEdit.tsx:127 +#: src/components/rtoken-setup/components/RolesEdit.tsx:109 msgid "Current holder" msgstr "" -#: src/views/yield-dtf/settings/components/FreezeManager.tsx:103 +#: src/views/yield-dtf/settings/components/freeze-manager.tsx:99 msgid "Current status:" msgstr "" -#: src/components/rtoken-setup/token/TokenConfiguration.tsx:43 +#: src/components/rtoken-setup/token/TokenConfiguration.tsx:42 msgid "Customize" msgstr "" -#: src/components/rtoken-setup/basket/PluginItem.tsx:57 +#: src/views/index-dtf/settings/components/index-settings-governance.tsx:123 +msgid "DAO Governance" +msgstr "" + +#: src/components/rtoken-setup/basket/PluginItem.tsx:50 msgid "Decimals" msgstr "" -#: src/components/rtoken-setup/basket/PluginItem.tsx:63 +#: src/components/rtoken-setup/basket/PluginItem.tsx:56 msgid "Default delay" msgstr "" -#: src/views/earn/index.tsx:79 +#: src/views/earn/views/defi/components/earn-heading.tsx:44 msgid "DeFi protocols oftentimes have incentives for liquidity that are paid in their token or a combination of tokens. By providing liquidity for trading or lending or other activities on these protocols, you can earn rewards that are sometimes quite high! Note that there are always risks (smart contract risks, impermanent loss risks, etc), in providing liquidity on these protocols so please make sure you understand things before blindly diving in." msgstr "" -#: src/views/earn/index.tsx:65 -msgid "DeFi yield opportunities for RTokens in Convex, Curve, Yearn & Beefy" +#: src/views/earn/views/defi/components/earn-heading.tsx:20 +msgid "DeFi yield opportunities for DTFs in Aerodrome, Convex, Beefy, Yearn & Others" msgstr "" -#: src/components/rtoken-setup/token/RevenueSplit.tsx:156 +#: src/components/rtoken-setup/token/RevenueSplit.tsx:169 msgid "Define what portion of the revenue goes to the RToken holders versus RSR stakers. It can also be configured to send a portion of the revenue of an RToken to any arbitrary Ethereum address (wallet or smart contract).<0/><1/>" msgstr "" +#. placeholder {0}: timebased ? 'hours' : 'blocks' #: src/components/rtoken-setup/governance/GovernanceParameters.tsx:73 msgid "Delay (in number of {0}) since the proposal starts until voting ends." msgstr "" -#: src/components/rtoken-setup/token/BackingForm.tsx:28 +#: src/components/rtoken-setup/token/BackingForm.tsx:32 msgid "Delay in seconds" msgstr "" -#: src/components/rtoken-setup/token/OtherForm.tsx:61 +#: src/components/rtoken-setup/token/OtherForm.tsx:64 msgid "Delay in Seconds" msgstr "" -#: src/views/yield-dtf/governance/components/AccountVotes.tsx:72 +#: src/views/yield-dtf/governance/components/AccountVotes.tsx:71 msgid "Delegate" msgstr "" -#: src/views/yield-dtf/governance/components/DelegateModal.tsx:43 +#: src/views/index-dtf/governance/components/delegate-modal.tsx:42 +#: src/views/yield-dtf/governance/components/DelegateModal.tsx:42 msgid "Delegate to" msgstr "" -#: src/views/yield-dtf/governance/components/DelegateModal.tsx:36 +#: src/views/index-dtf/governance/components/delegate-modal.tsx:35 +#: src/views/yield-dtf/governance/components/DelegateModal.tsx:35 msgid "Delegate votes" msgstr "" -#: src/views/yield-dtf/staking/components/stake/EditDelegate.tsx:24 +#: src/views/yield-dtf/staking/components/stake/edit-delegate.tsx:23 msgid "Delegate voting power" msgstr "" -#: src/views/yield-dtf/governance/views/proposal-detail/components/ProposalVote.tsx:170 +#: src/views/index-dtf/governance/views/proposal/components/proposal-vote-button.tsx:19 +#: src/views/yield-dtf/governance/views/proposal-detail/components/ProposalVote.tsx:151 msgid "Delegate voting power for future votes" msgstr "" -#: src/views/yield-dtf/governance/components/AccountVotes.tsx:88 +#: src/views/yield-dtf/governance/components/AccountVotes.tsx:87 msgid "Delegated to self" msgstr "" -#: src/views/yield-dtf/governance/components/AccountVotes.tsx:91 -msgid "Delegated to:" -msgstr "" - -#: src/components/layout/header/components/AppHeader.tsx:39 -msgid "Deploy" -msgstr "" - -#: src/views/yield-dtf/deploy/components/Intro.tsx:19 -msgid "Deploy an RToken" +#: src/views/yield-dtf/governance/components/AccountVotes.tsx:90 +msgid "Delegated to: " msgstr "" -#: src/views/yield-dtf/deploy/components/GovernanceOverview.tsx:100 +#: src/views/yield-dtf/deploy/components/GovernanceOverview.tsx:97 msgid "Deploy Governance" msgstr "" -#: src/views/yield-dtf/deploy/components/DeployOverview.tsx:158 +#: src/views/yield-dtf/deploy/components/DeployOverview.tsx:144 msgid "Deploy RToken" msgstr "" @@ -717,32 +720,36 @@ msgstr "" msgid "Deploy transaction submitted" msgstr "" -#: src/views/discover/components/yield/components/DeployHero.tsx:70 +#: src/views/discover/components/yield/components/DeployHero.tsx:36 msgid "Deploy your own RToken" msgstr "" -#: src/views/yield-dtf/deploy/components/Intro.tsx:22 -msgid "Deploying through this UI doesn't require deep technical knowledge as long as you don't need novel collateral plugins for your baskets. However, we encourage you to talk to someone proficient in the protocol and read the docs to learn more before confirming any transactions." +#: src/views/index-dtf/settings/components/index-settings-basic.tsx:38 +msgid "Deployer" msgstr "" -#: src/components/transactions/table/index.tsx:57 -#: src/views/bridge/components/BridgeHeader.tsx:85 -#: src/views/explorer/components/transactions/useTransactionColumns.tsx:37 -#: src/views/yield-dtf/overview/components/RTokenTransactions.tsx:87 -msgid "Deposit" +#: src/views/index-dtf/settings/components/index-settings-fees.tsx:37 +msgid "Deployer Share" msgstr "" -#: src/views/bridge/components/BridgeFaq.tsx:34 -msgid "Deposits: a few minutes usually, only requires 1x transaction. Withdrawals: 7 days, 3 transactions." +#: src/views/yield-dtf/deploy/components/Intro.tsx:20 +msgid "Deploying through this UI doesn't require deep technical knowledge as long as you don't need novel collateral plugins for your baskets. However, we encourage you to talk to someone proficient in the protocol and read the docs to learn more before confirming any transactions." msgstr "" -#: src/views/explorer/components/governance/index.tsx:43 -#: src/views/yield-dtf/governance/views/proposal/components/ConfirmProposalForm.tsx:81 +#: src/components/transactions/table/index.tsx:56 +#: src/views/explorer/components/transactions/useTransactionColumns.tsx:36 +#: src/views/yield-dtf/overview/components/rtoken-transactions.tsx:84 +msgid "Deposit" +msgstr "" + +#: src/views/explorer/components/governance/index.tsx:49 +#: src/views/yield-dtf/governance/views/proposal/components/ConfirmProposalForm.tsx:68 msgid "Description" msgstr "" -#: src/components/layout/navigation/index.tsx:116 -#: src/components/layout/navigation/TokenNavigation.tsx:217 +#: src/components/layout/navigation/index.tsx:83 +#: src/components/layout/navigation/TokenNavigation.tsx:190 +#: src/views/index-dtf/components/navigation/index.tsx:135 msgid "Details + Roles" msgstr "" @@ -750,261 +757,277 @@ msgstr "" msgid "Discard" msgstr "" -#: src/components/layout/header/components/AppHeader.tsx:29 -msgid "Discover" +#: src/components/layout/header/components/app-navigation.tsx:57 +msgid "Discover DTFs" msgstr "" -#: src/components/layout/header/components/RegisterHelp.tsx:77 -msgid "Discussions of ideas and suggestion that the community has on improving the Reserve Ecosystem" +#: src/components/layout/header/components/app-navigation.tsx:140 +msgid "Discussions of ecosystem ideas" msgstr "" -#: src/components/rtoken-setup/basket/CustomCollateral.tsx:117 -#: src/components/rtoken-setup/components/RolesEdit.tsx:56 +#: src/components/rtoken-setup/basket/CustomCollateral.tsx:112 +#: src/components/rtoken-setup/components/RolesEdit.tsx:51 msgid "Dismiss" msgstr "" -#: src/views/yield-dtf/issuance/components/wrapping/DisplayMode.tsx:15 +#. placeholder {0}: rToken?.symbol +#: src/views/yield-dtf/issuance/components/wrapping/DisplayMode.tsx:19 msgid "Display only {0} related collaterals" msgstr "" -#: src/components/rtoken-setup/token/RevenueSplit.tsx:139 +#: src/views/index-dtf/settings/components/distribute-fees.tsx:47 +msgid "Distribute Fees" +msgstr "" + +#: src/components/rtoken-setup/token/RevenueSplit.tsx:147 msgid "Distributed revenue does not add up to 100%" msgstr "" -#: src/views/yield-dtf/settings/components/ContractsInfo.tsx:29 +#: src/views/yield-dtf/settings/components/contracts-info.tsx:25 msgid "Distributor" msgstr "" -#: src/components/rtoken-setup/basket/BackupBasket.tsx:25 +#: src/components/rtoken-setup/basket/BackupBasket.tsx:26 #: src/components/rtoken-setup/basket/EmergencyCollateral.tsx:128 msgid "Diversity factor" msgstr "" -#: src/views/yield-dtf/settings/components/EmergencyCollateralInfo.tsx:35 +#: src/views/yield-dtf/settings/components/emergency-collateral-info.tsx:30 msgid "Diversity Factor" msgstr "" -#: src/views/yield-dtf/governance/components/GovernanceOverview.tsx:194 +#: src/views/yield-dtf/governance/components/GovernanceOverview.tsx:205 msgid "Documentation" msgstr "" -#: src/components/rtoken-setup/token/OtherForm.tsx:20 -#: src/components/rtoken-setup/token/OtherForm.tsx:34 +#: src/components/layout/header/components/app-navigation.tsx:88 +msgid "DTF Explorer" +msgstr "" + +#: src/views/discover/components/yield/components/RegisterAbout.tsx:56 +msgid "DTFs live on blockchain networks including Ethereum, Base, Binance Smart Chain, enabling worldwide transactions within seconds. Each DTF is 100% backed by other assets on the same blockchain. Users can redeem their DTF tokens for the underlying backing assets at any time without anyone else’s involvement." +msgstr "" + +#: src/components/rtoken-setup/token/OtherForm.tsx:23 +#: src/components/rtoken-setup/token/OtherForm.tsx:37 msgid "Duration in seconds" msgstr "" -#: src/components/rtoken-setup/token/BackingForm.tsx:56 -#: src/components/rtoken-setup/token/BackingForm.tsx:70 +#: src/components/rtoken-setup/token/BackingForm.tsx:60 +#: src/components/rtoken-setup/token/BackingForm.tsx:74 msgid "Duration in Seconds" msgstr "" -#: src/views/yield-dtf/settings/components/BackingInfo.tsx:58 +#: src/views/yield-dtf/settings/components/backing-info.tsx:42 msgid "Dutch auction length" msgstr "" -#: src/components/rtoken-setup/token/BackingForm.tsx:69 +#: src/components/rtoken-setup/token/BackingForm.tsx:73 msgid "Dutch Auction length (s)" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/TraderImplementationProposal.tsx:25 +#: src/views/yield-dtf/governance/views/proposal/components/TraderImplementationProposal.tsx:33 msgid "Dutch trade" msgstr "" -#: src/components/rtoken-setup/basket/BackupBasket.tsx:38 +#: src/components/rtoken-setup/basket/BackupBasket.tsx:39 msgid "Each target unit of your primary basket will have defined emergency collateral to replace with in case of default." msgstr "" -#: src/views/yield-dtf/auctions/components/About.tsx:59 +#: src/views/yield-dtf/auctions/components/About.tsx:48 msgid "Each type of trade can currently happen in only one way; the protocol launches a Gnosis EasyAuction. The Reserve Protocol is designed to make it easy to add other trading methods, but no other methods are currently supported." msgstr "" -#: src/components/layout/header/components/HeaderMenu.tsx:51 -#: src/components/layout/navigation/TokenNavigation.tsx:190 -#: src/views/yield-dtf/overview/components/RTokenEarn.tsx:46 +#: src/components/layout/navigation/TokenNavigation.tsx:163 msgid "Earn" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/ConfirmProposalOverview.tsx:133 +#: src/views/yield-dtf/governance/views/proposal/components/ConfirmProposalOverview.tsx:117 msgid "Edit" msgstr "" -#: src/components/layout/navigation/TokenNavigation.tsx:223 -#: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:22 -#: src/views/yield-dtf/governance/views/proposal/components/ProposalNavigation.tsx:22 -#: src/views/yield-dtf/settings/components/NavigationSidebar.tsx:13 +#: src/components/layout/navigation/TokenNavigation.tsx:196 +#: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:21 +#: src/views/yield-dtf/governance/views/proposal/components/ProposalNavigation.tsx:21 +#: src/views/yield-dtf/settings/components/navigation-sidebar.tsx:12 msgid "Emergency basket" msgstr "" -#: src/views/yield-dtf/settings/components/EmergencyCollateralInfo.tsx:21 +#: src/views/yield-dtf/settings/components/emergency-collateral-info.tsx:16 msgid "Emergency Collateral" msgstr "" -#: src/components/rtoken-setup/basket/BackupBasket.tsx:35 +#: src/components/rtoken-setup/basket/BackupBasket.tsx:36 msgid "Empty backup basket" msgstr "" -#: src/components/rtoken-setup/basket/PrimaryBasket.tsx:40 +#: src/components/rtoken-setup/basket/PrimaryBasket.tsx:54 msgid "Empty Basket" msgstr "" -#: src/views/yield-dtf/auctions/components/useColumns.tsx:53 +#: src/views/yield-dtf/auctions/components/useColumns.tsx:52 msgid "Ended at" msgstr "" -#: src/views/yield-dtf/auctions/batch/components/FinalizedAuctions.tsx:16 -#: src/views/yield-dtf/auctions/dutch/components/EndedDutchAuctions.tsx:16 +#: src/views/yield-dtf/auctions/batch/components/FinalizedAuctions.tsx:19 +#: src/views/yield-dtf/auctions/dutch/components/EndedDutchAuctions.tsx:19 msgid "Ended auctions" msgstr "" -#: src/views/yield-dtf/auctions/components/useColumns.tsx:53 +#: src/views/yield-dtf/auctions/components/useColumns.tsx:52 msgid "Ends at" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/UnregisterProposal.tsx:39 +#: src/views/yield-dtf/governance/views/proposal/components/UnregisterProposal.tsx:44 msgid "Ensure that the asset(s) you are unregistering do not have pending revenue that can be" msgstr "" -#: src/views/discover/components/yield/components/RTokenCard.tsx:261 +#: src/views/discover/components/yield/components/TokenActions.tsx:67 msgid "Est. APY" msgstr "" -#: src/components/rtoken-setup/basket/PluginItem.tsx:112 +#: src/components/rtoken-setup/basket/PluginItem.tsx:105 msgid "Est. APY:" msgstr "" -#: src/views/yield-dtf/staking/components/overview/StakingStats.tsx:54 +#: src/views/yield-dtf/staking/components/overview/staking-stats.tsx:61 msgid "Est. Staking APY" msgstr "" -#: src/components/rtoken-setup/basket/PrimaryBasket.tsx:120 +#: src/components/rtoken-setup/basket/PrimaryBasket.tsx:168 msgid "Estimated basket APY" msgstr "" -#: src/views/yield-dtf/staking/components/GasEstimate.tsx:16 +#: src/views/yield-dtf/staking/components/gas-estimate.tsx:18 msgid "Estimated gas cost" msgstr "" -#: src/components/old/button/TransactionButton.tsx:32 -#: src/components/transaction-modal/EstimatedGasInfo.tsx:13 +#: src/components/transaction-modal/EstimatedGasInfo.tsx:14 +#: src/components/ui/transaction-button.tsx:39 msgid "Estimated gas cost:" msgstr "" -#: src/views/yield-dtf/governance/components/DelegateModal.tsx:50 +#: src/views/index-dtf/governance/components/delegate-modal.tsx:49 +#: src/views/yield-dtf/governance/components/DelegateModal.tsx:49 msgid "ETH address" msgstr "" -#: src/views/yield-dtf/governance/views/proposal-detail/components/ContractProposalDetails.tsx:57 +#: src/views/yield-dtf/governance/views/proposal-detail/components/ContractProposalDetails.tsx:48 msgid "Executable code" msgstr "" +#: src/views/index-dtf/governance/views/proposal/components/proposal-execute-button.tsx:40 +#: src/views/index-dtf/governance/views/proposal/components/proposal-execute-button.tsx:64 #: src/views/yield-dtf/governance/views/proposal-detail/components/ProposalExecute.tsx:30 #: src/views/yield-dtf/governance/views/proposal-detail/components/ProposalExecute.tsx:42 msgid "Execute proposal" msgstr "" -#: src/views/yield-dtf/settings/components/GovernanceInfo.tsx:60 +#: src/views/index-dtf/settings/components/index-settings-governance.tsx:86 +#: src/views/yield-dtf/settings/components/governance-info.tsx:50 msgid "Execution Delay" msgstr "" -#: src/components/rtoken-setup/components/BackButton.tsx:29 -#: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:46 +#: src/components/rtoken-setup/components/BackButton.tsx:28 +#: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:45 msgid "Exit Deployer" msgstr "" -#: src/components/layout/header/components/HeaderMenu.tsx:61 #: src/views/discover/components/yield/discover-yield-dtf.tsx:20 msgid "Explore" msgstr "" -#: src/views/yield-dtf/overview/components/RTokenEarn.tsx:50 +#. placeholder {0}: rToken?.symbol ?? '' +#: src/views/yield-dtf/overview/components/rtoken-earn.tsx:39 msgid "Explore yield opportunities for {0}" msgstr "" -#: src/components/rtoken-setup/token/BackingForm.tsx:84 +#: src/components/rtoken-setup/token/BackingForm.tsx:88 msgid "Extra collateral to keep" msgstr "" -#: src/components/layout/header/components/AppHeader.tsx:34 -msgid "Farm" +#: src/views/explorer/components/tokens/index.tsx:190 +msgid "Featured RTokens" msgstr "" -#: src/views/explorer/components/tokens/index.tsx:233 -msgid "Featured RTokens" +#: src/components/layout/header/components/app-navigation.tsx:120 +msgid "Feedback" msgstr "" -#: src/components/layout/header/components/RegisterHelp.tsx:67 -msgid "File new issues or view & upvote existing feedback." +#: src/views/index-dtf/settings/components/index-settings-fees.tsx:86 +msgid "Fees & Revenue Distribution" msgstr "" -#: src/views/yield-dtf/auctions/dutch/components/AuctionTimeIndicators.tsx:35 +#: src/components/layout/header/components/app-navigation.tsx:122 +msgid "File issues or upvote existing ones" +msgstr "" + +#: src/views/yield-dtf/auctions/dutch/components/AuctionTimeIndicators.tsx:32 msgid "Final price in:" msgstr "" -#: src/views/home/components/Hero.tsx:48 -msgid "First-loss RSR Capital" +#: src/views/index-dtf/settings/components/index-settings-fees.tsx:32 +msgid "Fixed Platform Share" msgstr "" -#: src/views/yield-dtf/governance/views/proposal-detail/components/VoteModal.tsx:48 +#: src/views/index-dtf/governance/views/proposal/components/vote-modal.tsx:56 +#: src/views/yield-dtf/governance/views/proposal-detail/components/VoteModal.tsx:53 msgid "For" msgstr "" -#: src/views/yield-dtf/settings/components/FreezeManager.tsx:102 +#: src/views/yield-dtf/settings/components/freeze-manager.tsx:98 msgid "Freeze State" msgstr "" -#: src/views/explorer/components/transactions/useTransactionColumns.tsx:109 -#: src/views/yield-dtf/overview/components/RTokenTransactions.tsx:141 +#: src/views/explorer/components/transactions/useTransactionColumns.tsx:108 +#: src/views/yield-dtf/overview/components/rtoken-transactions.tsx:151 msgid "From" msgstr "" -#: src/views/bridge/components/BridgeInput.tsx:79 -msgid "From:" -msgstr "" - -#: src/views/yield-dtf/settings/components/FreezeManager.tsx:104 +#: src/views/yield-dtf/settings/components/freeze-manager.tsx:100 msgid "Frozen" msgstr "" -#: src/views/yield-dtf/overview/components/CollateralPieChartWrapper.tsx:108 +#: src/views/yield-dtf/overview/components/collateral-pie-chart-wrapper.tsx:70 msgid "Full exposure view" msgstr "" -#: src/views/bridge/components/FinalizeWithdrawalButton.tsx:34 -msgid "Funds moved" +#: src/views/yield-dtf/settings/components/contracts-info.tsx:24 +msgid "Furnace" msgstr "" -#: src/views/yield-dtf/settings/components/ContractsInfo.tsx:28 -msgid "Furnace" +#: src/components/layout/header/components/app-navigation.tsx:94 +msgid "Get an overview of everything going on" msgstr "" -#: src/views/discover/components/yield/components/DeployHero.tsx:84 +#: src/views/discover/components/yield/components/DeployHero.tsx:50 msgid "Go to the RToken Deployer" msgstr "" -#: src/components/layout/navigation/index.tsx:113 -#: src/components/layout/navigation/TokenNavigation.tsx:212 -#: src/components/layout/navigation/TokenNavigation.tsx:227 -#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:33 -#: src/views/index-dtf/components/navigation/index.tsx:80 -#: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:29 -#: src/views/yield-dtf/governance/views/proposal/components/ProposalNavigation.tsx:19 -#: src/views/yield-dtf/settings/components/NavigationSidebar.tsx:17 +#: src/components/layout/navigation/index.tsx:80 +#: src/components/layout/navigation/TokenNavigation.tsx:185 +#: src/components/layout/navigation/TokenNavigation.tsx:200 +#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:38 +#: src/views/index-dtf/components/navigation/index.tsx:125 +#: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:28 +#: src/views/yield-dtf/governance/views/proposal/components/ProposalNavigation.tsx:18 +#: src/views/yield-dtf/settings/components/navigation-sidebar.tsx:16 msgid "Governance" msgstr "" -#: src/views/yield-dtf/settings/components/GovernanceInfo.tsx:35 +#: src/views/yield-dtf/settings/components/governance-info.tsx:29 msgid "Governance Details" msgstr "" -#: src/views/yield-dtf/governance/components/GovernanceOverview.tsx:152 +#: src/views/yield-dtf/governance/components/GovernanceOverview.tsx:162 msgid "Governance format" msgstr "" -#: src/views/yield-dtf/governance/components/GovernanceOverview.tsx:181 +#: src/views/yield-dtf/governance/components/GovernanceOverview.tsx:192 msgid "Governance forum" msgstr "" -#: src/views/yield-dtf/deploy/components/RTokenSetup.tsx:73 +#: src/views/yield-dtf/deploy/components/RTokenSetup.tsx:65 msgid "Governance gets deployed & your RToken is now usable (if unpaused)" msgstr "" @@ -1012,77 +1035,70 @@ msgstr "" msgid "Governance parameters" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/ProposedRolesPreview.tsx:41 -#: src/views/yield-dtf/governance/views/proposal/components/RolesProposal.tsx:37 +#: src/views/yield-dtf/governance/views/proposal/components/ProposedRolesPreview.tsx:45 +#: src/views/yield-dtf/governance/views/proposal/components/RolesProposal.tsx:42 msgid "Governance roles" msgstr "" -#: src/views/yield-dtf/settings/components/GovernanceInfo.tsx:84 +#: src/views/index-dtf/settings/components/index-settings-fees.tsx:43 +msgid "Governance Share" +msgstr "" + +#: src/views/yield-dtf/settings/components/governance-info.tsx:70 msgid "Governor address" msgstr "" -#: src/views/yield-dtf/overview/components/hero/TokenMandate.tsx:58 +#: src/views/index-dtf/settings/components/index-settings-governance.tsx:46 +msgid "Governor Address" +msgstr "" + +#: src/views/yield-dtf/overview/components/hero/token-mandate.tsx:41 msgid "Governor mandate" msgstr "" -#: src/views/yield-dtf/governance/components/GovernanceOverview.tsx:170 +#: src/views/index-dtf/settings/components/index-settings-roles.tsx:50 +#: src/views/yield-dtf/governance/components/GovernanceOverview.tsx:180 msgid "Guardian" msgstr "" -#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:87 +#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:96 msgid "Guardian address" msgstr "" -#: src/components/transactions/table/index.tsx:92 +#: src/components/transactions/table/index.tsx:91 msgid "Hash" msgstr "" -#: src/components/layout/navigation/TokenNavigation.tsx:191 -#: src/views/yield-dtf/overview/components/HistoricalMetrics.tsx:20 +#: src/components/layout/navigation/TokenNavigation.tsx:164 +#: src/views/yield-dtf/overview/components/historical-metrics.tsx:13 msgid "Historical metrics" msgstr "" -#: src/views/explorer/components/tokens/index.tsx:184 +#: src/views/explorer/components/tokens/index.tsx:164 msgid "Holders APY" msgstr "" -#: src/views/bridge/components/BridgeFaq.tsx:105 -msgid "How do I verify my withdrawal transaction?" -msgstr "" - -#: src/views/bridge/components/BridgeFaq.tsx:39 -msgid "How do withdrawals work?" -msgstr "" - -#: src/views/bridge/components/BridgeFaq.tsx:33 -msgid "How fast will my tokens arrive?" -msgstr "" - -#: src/views/discover/components/yield/components/RegisterAbout.tsx:115 -msgid "If an RToken is listed on Register, it doesn't mean that ABC Labs endorses the safety or risk levels of the RToken or that ABC Labs was involved in the creation of or is in anyway responsible for the RToken. ABC Labs requires Github requests with additional information beyond what is available on the blockchain to give users relevant data to make informed decisions. As a user, please evaluate any new RToken carefully before holding or staking your RSR on them." +#: src/views/discover/components/yield/components/RegisterAbout.tsx:122 +msgid "If a DTF is listed on this app, it doesn't mean that ABC Labs endorses the safety or risk levels of the DTF or that ABC Labs was involved in the creation of or is in anyway responsible for the DTF." msgstr "" -#: src/views/bridge/components/BridgeFaq.tsx:98 -msgid "If you prefer not to wait, instead of making a withdrawal using Register L2 Bridge, you also have the option to utilize a third-party bridge for quicker withdrawals." -msgstr "" - -#: src/views/yield-dtf/settings/components/ListingInfo.tsx:31 +#: src/views/yield-dtf/settings/components/listing-info.tsx:44 msgid "If your token is paused and you have the correct role, you can unpause it here." msgstr "" -#: src/views/yield-dtf/staking/components/unstake/UnstakeModal.tsx:50 +#: src/views/yield-dtf/staking/components/unstake/unstake-modal.tsx:49 msgid "Immediate" msgstr "" -#: src/views/yield-dtf/staking/components/withdraw/index.tsx:12 +#: src/views/yield-dtf/staking/components/withdraw/index.tsx:16 msgid "In Withdraw Process" msgstr "" -#: src/views/discover/components/yield/components/TokenList.tsx:22 +#: src/views/discover/components/yield/components/TokenList.tsx:25 msgid "Including off-chain in-app transactions of RToken in the Reserve App." msgstr "" -#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:112 +#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:121 msgid "Initial RToken state after deployment" msgstr "" @@ -1094,7 +1110,7 @@ msgstr "" msgid "Input delay in hours" msgstr "" -#: src/components/rtoken-setup/basket/CustomCollateral.tsx:107 +#: src/components/rtoken-setup/basket/CustomCollateral.tsx:104 msgid "Input plugin address (not ERC-20 address)" msgstr "" @@ -1102,7 +1118,7 @@ msgstr "" msgid "Input proposal threshold" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/ConfirmProposalForm.tsx:62 +#: src/views/yield-dtf/governance/views/proposal/components/ConfirmProposalForm.tsx:54 msgid "Input proposal title" msgstr "" @@ -1110,37 +1126,37 @@ msgstr "" msgid "Input quorum percent" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/ConfirmProposalForm.tsx:70 +#: src/views/yield-dtf/governance/views/proposal/components/ConfirmProposalForm.tsx:62 msgid "Input RFC link" msgstr "" -#: src/components/rtoken-setup/token/RevenueSplit.tsx:119 +#: src/components/rtoken-setup/token/RevenueSplit.tsx:127 msgid "Input RSR stakers revenue distribution" msgstr "" -#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:88 +#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:97 msgid "Input the guardian ethereum address" msgstr "" -#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:68 +#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:77 msgid "Input the owner ethereum address" msgstr "" -#: src/components/rtoken-setup/token/TokenForm.tsx:28 -#: src/views/yield-dtf/deploy/components/TokenForm.tsx:27 +#: src/components/rtoken-setup/token/TokenForm.tsx:29 +#: src/views/yield-dtf/deploy/components/TokenForm.tsx:31 msgid "Input ticker" msgstr "" -#: src/components/rtoken-setup/token/RevenueSplit.tsx:110 +#: src/components/rtoken-setup/token/RevenueSplit.tsx:118 msgid "Input token holders revenue distribution" msgstr "" -#: src/components/rtoken-setup/token/TokenForm.tsx:19 -#: src/views/yield-dtf/deploy/components/TokenForm.tsx:17 +#: src/components/rtoken-setup/token/TokenForm.tsx:20 +#: src/views/yield-dtf/deploy/components/TokenForm.tsx:21 msgid "Input token name" msgstr "" -#: src/views/tokens/components/TableFilters.tsx:26 +#: src/views/tokens/components/TableFilters.tsx:25 msgid "Input token name or symbol" msgstr "" @@ -1148,185 +1164,186 @@ msgstr "" msgid "Input voting period" msgstr "" -#: src/views/explorer/components/transactions/Filters.tsx:24 +#: src/views/explorer/components/transactions/Filters.tsx:22 msgid "Input wallet" msgstr "" -#: src/components/rtoken-setup/token/OtherForm.tsx:48 +#: src/components/rtoken-setup/token/OtherForm.tsx:51 msgid "Input withdrawal leak %" msgstr "" -#: src/components/transactions/manager/TransactionList.tsx:74 -msgid "Inspect" -msgstr "" - -#: src/views/discover/components/yield/components/CompareTokensTitle.tsx:51 +#: src/views/discover/components/yield/components/CompareTokensTitle.tsx:37 msgid "Inspect collateral backing, mint, stake, redeem & explore additional earn opportunities across DeFi" msgstr "" -#: src/components/layout/navigation/TokenNavigation.tsx:188 -#: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:19 -#: src/views/yield-dtf/governance/views/proposal/components/ProposalNavigation.tsx:16 +#: src/components/layout/navigation/TokenNavigation.tsx:161 +#: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:18 +#: src/views/yield-dtf/governance/views/proposal/components/ProposalNavigation.tsx:15 msgid "Intro" msgstr "" -#: src/components/rtoken-setup/atoms.ts:126 +#: src/components/rtoken-setup/atoms.ts:137 msgid "Invalid ({targetUnit}) backup diversity factor" msgstr "" -#: src/components/rtoken-setup/atoms.ts:111 +#: src/components/rtoken-setup/atoms.ts:122 msgid "Invalid ({targetUnit}) basket distribution" msgstr "" -#: src/components/rtoken-setup/atoms.ts:115 +#: src/components/rtoken-setup/atoms.ts:126 msgid "Invalid ({targetUnit}) basket scale" msgstr "" -#: src/components/rtoken-setup/basket/CustomCollateral.tsx:90 -#: src/components/rtoken-setup/components/RolesEdit.tsx:44 -#: src/views/yield-dtf/staking/components/stake/EditDelegate.tsx:53 +#: src/components/rtoken-setup/basket/CustomCollateral.tsx:89 +#: src/components/rtoken-setup/components/RolesEdit.tsx:38 +#: src/views/yield-dtf/staking/components/stake/edit-delegate.tsx:51 msgid "Invalid address" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/RegisterEdit.tsx:43 +#: src/views/yield-dtf/governance/views/proposal/components/RegisterEdit.tsx:34 msgid "Invalid asset" msgstr "" -#: src/components/rtoken-setup/basket/CustomCollateral.tsx:82 +#: src/components/rtoken-setup/basket/CustomCollateral.tsx:81 msgid "Invalid collateral" msgstr "" -#: src/components/rtoken-setup/token/RevenueSplit.tsx:141 +#: src/components/rtoken-setup/token/RevenueSplit.tsx:149 msgid "Invalid destination address" msgstr "" -#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:81 -#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:97 +#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:90 +#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:106 msgid "Invalid ethereum address" msgstr "" -#: src/components/field/index.tsx:31 +#: src/components/field/index.tsx:37 msgid "Invalid maximum range" msgstr "" -#: src/components/field/index.tsx:33 -msgid "Invalid minimum range" +#: src/components/field/index.tsx:39 +msgid "Invalid minimum range " msgstr "" -#: src/components/field/index.tsx:29 +#: src/components/field/index.tsx:35 msgid "Invalid number" msgstr "" -#: src/components/field/index.tsx:35 +#: src/components/field/index.tsx:41 msgid "Invalid value" msgstr "" -#: src/components/rtoken-setup/token/BackingForm.tsx:124 +#: src/components/rtoken-setup/token/BackingForm.tsx:128 msgid "Issuance amount - allows the issuer to limit the amount of RTokens issued per hour. This matters in the event of an exploit where an attacker tries to issue more RTokens. This buys time for users with pause or freeze permissions to reduce the amount of RTokens that can be issued." msgstr "" -#: src/components/rtoken-setup/token/BackingForm.tsx:111 +#: src/components/rtoken-setup/token/BackingForm.tsx:115 msgid "Issuance rate - allows the issuer to limit the amount of RTokens issued per hour based on a percentage of the current RToken market cap. This matters in the event of an exploit where an attacker tries to issue more RTokens. This buys time for users with pause or freeze permissions to reduce the amount of RTokens that can be issued." msgstr "" -#: src/components/rtoken-setup/token/BackingForm.tsx:122 -#: src/components/rtoken-setup/token/BackingForm.tsx:123 -#: src/views/yield-dtf/settings/components/BackingInfo.tsx:87 +#: src/components/rtoken-setup/token/BackingForm.tsx:126 +#: src/components/rtoken-setup/token/BackingForm.tsx:127 +#: src/views/yield-dtf/settings/components/backing-info.tsx:61 msgid "Issuance throttle amount" msgstr "" -#: src/views/yield-dtf/settings/components/BackingInfo.tsx:80 +#: src/views/yield-dtf/settings/components/backing-info.tsx:55 msgid "Issuance throttle rate" msgstr "" -#: src/components/rtoken-setup/token/BackingForm.tsx:110 +#: src/components/rtoken-setup/token/BackingForm.tsx:114 msgid "Issuance throttle Rate" msgstr "" -#: src/components/rtoken-setup/token/BackingForm.tsx:109 +#: src/components/rtoken-setup/token/BackingForm.tsx:113 msgid "Issuance throttle rate (%)" msgstr "" -#: src/components/transactions/table/index.tsx:50 -#: src/views/explorer/components/transactions/useTransactionColumns.tsx:30 -#: src/views/yield-dtf/overview/components/RTokenTransactions.tsx:80 +#: src/components/transactions/table/index.tsx:49 +#: src/views/explorer/components/transactions/useTransactionColumns.tsx:29 +#: src/views/yield-dtf/overview/components/rtoken-transactions.tsx:77 msgid "Issue" msgstr "" -#: src/views/yield-dtf/settings/components/SettingItem.tsx:60 +#: src/components/layout/header/components/app-navigation.tsx:146 +msgid "Join the conversation or ask questions" +msgstr "" + +#: src/views/yield-dtf/settings/components/setting-item.tsx:60 msgid "Loading..." msgstr "" -#: src/views/yield-dtf/settings/components/FreezeManager.tsx:68 -#: src/views/yield-dtf/settings/components/FreezeManager.tsx:72 +#: src/views/yield-dtf/settings/components/freeze-manager.tsx:67 +#: src/views/yield-dtf/settings/components/freeze-manager.tsx:71 msgid "Long Freeze" msgstr "" -#: src/views/yield-dtf/settings/components/OtherInfo.tsx:26 +#: src/views/yield-dtf/settings/components/other-info.tsx:18 msgid "Long freeze duration" msgstr "" -#: src/components/rtoken-setup/token/OtherForm.tsx:35 -msgid "Long freeze duration - freeze an RToken’s system for a longer period of time. A long-freezer has 6 charges before losing the ability to freeze any more" +#: src/components/rtoken-setup/token/OtherForm.tsx:38 +msgid "Long freeze duration - freeze an RToken's system for a longer period of time. A long-freezer has 6 charges before losing the ability to freeze any more" msgstr "" -#: src/components/rtoken-setup/token/OtherForm.tsx:33 +#: src/components/rtoken-setup/token/OtherForm.tsx:36 msgid "Long freeze duration (s)" msgstr "" -#: src/components/rtoken-setup/basket/CustomCollateral.tsx:136 +#: src/components/rtoken-setup/basket/CustomCollateral.tsx:132 msgid "Made your own collateral?" msgstr "" -#: src/views/yield-dtf/settings/components/ContractsInfo.tsx:20 +#: src/views/yield-dtf/settings/components/contracts-info.tsx:16 msgid "Main" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/Intro.tsx:17 +#: src/views/yield-dtf/governance/views/proposal/components/Intro.tsx:23 msgid "Make proposed changes to the backing basket, emergency collateral, governance params, etc. Changes in multiple areas can be batched into a single proposal although to make voting on issues simpler it may make sense to separate things if unrelated." msgstr "" -#: src/components/rtoken-setup/token/TokenForm.tsx:36 -#: src/views/yield-dtf/deploy/components/TokenForm.tsx:45 -#: src/views/yield-dtf/settings/components/BasicInfo.tsx:24 +#: src/components/rtoken-setup/token/TokenForm.tsx:37 +#: src/views/index-dtf/settings/components/index-settings-basic.tsx:32 +#: src/views/yield-dtf/deploy/components/TokenForm.tsx:49 +#: src/views/yield-dtf/settings/components/basic-info.tsx:20 msgid "Mandate" msgstr "" -#: src/components/rtoken-setup/token/TokenForm.tsx:44 -#: src/views/yield-dtf/deploy/components/TokenForm.tsx:54 +#: src/components/rtoken-setup/token/TokenForm.tsx:45 +#: src/views/yield-dtf/deploy/components/TokenForm.tsx:58 msgid "Mandate cannot be longer than 256 characters" msgstr "" -#: src/components/rtoken-setup/token/TokenForm.tsx:41 -#: src/views/yield-dtf/deploy/components/TokenForm.tsx:51 +#: src/components/rtoken-setup/token/TokenForm.tsx:42 +#: src/views/yield-dtf/deploy/components/TokenForm.tsx:55 msgid "Mandate is required" msgstr "" -#: src/views/discover/components/yield/components/RTokenCard.tsx:167 +#: src/views/discover/components/yield/components/TokenStats.tsx:26 msgid "Market cap:" msgstr "" -#: src/views/yield-dtf/settings/components/BackingInfo.tsx:73 +#: src/views/yield-dtf/settings/components/backing-info.tsx:51 msgid "Max trade slippage" msgstr "" -#: src/components/rtoken-setup/token/BackingForm.tsx:98 +#: src/components/rtoken-setup/token/BackingForm.tsx:102 msgid "Max trade slippage — maximum deviation from oracle prices that any trade can clear at. Why this matters? Acts as a form of slippage protection." msgstr "" -#: src/components/rtoken-setup/token/BackingForm.tsx:96 +#: src/components/rtoken-setup/token/BackingForm.tsx:100 msgid "Max trade slippage (%)" msgstr "" -#: src/components/rtoken-setup/token/OtherForm.tsx:101 +#: src/components/rtoken-setup/token/OtherForm.tsx:104 msgid "Maximum trade for RToken" msgstr "" -#: src/components/rtoken-setup/token/OtherForm.tsx:102 +#: src/components/rtoken-setup/token/OtherForm.tsx:105 msgid "Maximum trade volume - maximum sized trade for any trade involving RToken, in terms of the unit of account eg. USD." msgstr "" -#: src/views/yield-dtf/staking/components/overview/About.tsx:19 +#: src/views/yield-dtf/staking/components/overview/about.tsx:24 msgid "Mechanics" msgstr "" @@ -1334,9 +1351,9 @@ msgstr "" msgid "Meditate peacefully on the stability of a future asset backed reserve currency while your RToken deploys 🧘‍♂️" msgstr "" -#: src/components/transactions/table/index.tsx:49 -#: src/views/explorer/components/transactions/useTransactionColumns.tsx:29 -#: src/views/yield-dtf/overview/components/RTokenTransactions.tsx:79 +#: src/components/transactions/table/index.tsx:48 +#: src/views/explorer/components/transactions/useTransactionColumns.tsx:28 +#: src/views/yield-dtf/overview/components/rtoken-transactions.tsx:76 msgid "Melt" msgstr "" @@ -1344,44 +1361,45 @@ msgstr "" msgid "Melting" msgstr "" -#: src/components/rtoken-setup/token/OtherForm.tsx:88 +#: src/components/rtoken-setup/token/OtherForm.tsx:91 msgid "Minimum trade in USD terms" msgstr "" -#: src/views/yield-dtf/auctions/auctions-sidebar/RevenueAuctionItem.tsx:74 +#: src/views/yield-dtf/auctions/auctions-sidebar/RevenueAuctionItem.tsx:117 msgid "Minimum trade size" msgstr "" -#: src/views/yield-dtf/settings/components/OtherInfo.tsx:43 +#: src/views/yield-dtf/settings/components/other-info.tsx:30 msgid "Minimum trade volume" msgstr "" -#: src/components/rtoken-setup/token/OtherForm.tsx:89 +#: src/components/rtoken-setup/token/OtherForm.tsx:92 msgid "Minimum trade volume - minimum sized trade that can be performed, in terms of the unit of account eg. USD." msgstr "" -#: src/components/rtoken-setup/token/OtherForm.tsx:87 +#: src/components/rtoken-setup/token/OtherForm.tsx:90 msgid "Minimum trade volume ($)" msgstr "" -#: src/components/layout/navigation/TokenNavigation.tsx:197 -#: src/components/transactions/table/index.tsx:46 -#: src/views/explorer/components/transactions/useTransactionColumns.tsx:26 -#: src/views/yield-dtf/issuance/components/issue/Issue.tsx:94 -#: src/views/yield-dtf/overview/components/RTokenTransactions.tsx:76 +#: src/components/layout/navigation/TokenNavigation.tsx:170 +#: src/components/transactions/table/index.tsx:45 +#: src/views/explorer/components/transactions/useTransactionColumns.tsx:25 +#: src/views/yield-dtf/issuance/components/issue/Issue.tsx:96 +#: src/views/yield-dtf/overview/components/rtoken-transactions.tsx:73 msgid "Mint" msgstr "" -#: src/views/yield-dtf/issuance/components/issue/IssuanceInfo.tsx:174 +#: src/views/yield-dtf/issuance/components/issue/IssuanceInfo.tsx:144 msgid "Mint - Global throttle" msgstr "" +#. placeholder {0}: rToken?.symbol #: src/views/yield-dtf/issuance/components/issue/ConfirmIssuance.tsx:101 msgid "Mint {0}" msgstr "" -#: src/components/layout/navigation/index.tsx:110 -#: src/views/index-dtf/components/navigation/index.tsx:75 +#: src/components/layout/navigation/index.tsx:77 +#: src/views/index-dtf/components/navigation/index.tsx:120 msgid "Mint + Redeem" msgstr "" @@ -1389,66 +1407,63 @@ msgstr "" msgid "Mint amount" msgstr "" -#: src/views/yield-dtf/issuance/components/issue/IssuanceInfo.tsx:175 +#: src/views/yield-dtf/issuance/components/issue/Issue.tsx:112 +msgid "Mint disabled" +msgstr "" + +#: src/views/yield-dtf/issuance/components/issue/IssuanceInfo.tsx:145 msgid "Mintable now" msgstr "" -#: src/views/yield-dtf/issuance/components/about/index.tsx:17 +#: src/views/index-dtf/settings/components/index-settings-fees.tsx:103 +msgid "Minting Fee" +msgstr "" + +#: src/views/yield-dtf/issuance/components/about/index.tsx:16 msgid "Minting requires a deposit of the defined collateral tokens in equal value amounts to the RToken smart contracts." msgstr "" -#: src/views/yield-dtf/issuance/components/issue/Issue.tsx:110 +#: src/views/yield-dtf/issuance/components/issue/Issue.tsx:114 msgid "Missing collateral" msgstr "" #: src/components/tables/ListedTokensTable.tsx:41 -#: src/views/explorer/components/tokens/index.tsx:172 -#: src/views/tokens/components/UnlistedTokensTable.tsx:85 +#: src/views/explorer/components/tokens/index.tsx:152 +#: src/views/tokens/components/UnlistedTokensTable.tsx:84 msgid "Mkt Cap" msgstr "" -#: src/utils/index.ts:82 +#: src/utils/index.ts:129 msgid "mth" msgstr "" -#: src/views/yield-dtf/settings/components/BasicInfo.tsx:22 -#: src/views/yield-dtf/settings/components/GovernanceInfo.tsx:38 +#: src/views/index-dtf/settings/components/index-settings-basic.tsx:15 +#: src/views/yield-dtf/settings/components/basic-info.tsx:15 +#: src/views/yield-dtf/settings/components/governance-info.tsx:30 msgid "Name" msgstr "" -#: src/views/bridge/components/BridgeFaq.tsx:106 -msgid "Navigate to the Withdrawal tab and view transactions below. Next to your transaction, use the button to complete the next available action. This action will ask you to complete the next required step to move your transaction forward and receive your withdrawn tokens in your wallet." -msgstr "" - -#: src/views/bridge/components/BridgeFaq.tsx:23 -msgid "Need help bridging?" -msgstr "" - -#: src/views/bridge/components/BridgeHeader.tsx:95 -msgid "Need help?" -msgstr "" - -#: src/components/account/index.tsx:33 -#: src/components/tables/ListedTokensTable.tsx:68 -#: src/views/explorer/components/tokens/index.tsx:152 -#: src/views/tokens/components/TableFilters.tsx:42 -#: src/views/tokens/components/UnlistedTokensTable.tsx:115 +#: src/components/account/index.tsx:38 +#: src/components/tables/ListedTokensTable.tsx:59 +#: src/views/explorer/components/tokens/index.tsx:132 +#: src/views/tokens/components/TableFilters.tsx:41 +#: src/views/tokens/components/UnlistedTokensTable.tsx:109 msgid "Network" msgstr "" -#: src/views/explorer/components/filters/ChainFilter.tsx:23 +#: src/views/explorer/components/filters/ChainFilter.tsx:22 msgid "Networks" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/ProposedBackupPreview.tsx:80 +#: src/views/yield-dtf/governance/views/proposal/components/ProposedBackupPreview.tsx:90 msgid "New backup configuration" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/ProposedBasketPreview.tsx:29 +#: src/views/yield-dtf/governance/views/proposal/components/ProposedBasketPreview.tsx:39 msgid "New primary basket" msgstr "" -#: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:29 +#: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:28 msgid "Next steps" msgstr "" @@ -1456,63 +1471,56 @@ msgstr "" msgid "No actionable revenue available" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/UnregisterEdit.tsx:40 +#: src/views/yield-dtf/governance/views/proposal/components/UnregisterEdit.tsx:34 msgid "No assets to unregister..." msgstr "" -#: src/components/charts/area/AreaChart.tsx:133 +#: src/components/charts/area/AreaChart.tsx:132 msgid "No data" msgstr "" -#: src/components/rtoken-setup/basket/BackupBasket.tsx:82 +#: src/components/rtoken-setup/basket/BackupBasket.tsx:85 msgid "No emergency collateral for target" msgstr "" -#: src/views/yield-dtf/settings/components/EmergencyCollateralInfo.tsx:61 +#: src/views/yield-dtf/settings/components/emergency-collateral-info.tsx:57 msgid "No emergency collateral for this target unit" msgstr "" -#: src/views/yield-dtf/auctions/components/EndedAuctionsSkeleton.tsx:16 +#: src/views/yield-dtf/auctions/components/EndedAuctionsSkeleton.tsx:7 msgid "No ended auctions" msgstr "" -#: src/components/rtoken-setup/components/RolesEdit.tsx:104 +#: src/components/rtoken-setup/components/RolesEdit.tsx:95 msgid "No holders for this role..." msgstr "" -#: src/components/rtoken-setup/basket/CollateralModal.tsx:166 +#: src/components/rtoken-setup/basket/CollateralModal.tsx:150 msgid "No plugins available" msgstr "" -#: src/views/yield-dtf/governance/components/ProposalList.tsx:234 +#: src/views/yield-dtf/governance/components/ProposalList.tsx:199 msgid "No proposals created..." msgstr "" -#: src/components/transactions/table/index.tsx:162 +#: src/components/transactions/table/index.tsx:152 msgid "No transactions" msgstr "" -#: src/components/transactions/manager/TransactionList.tsx:107 -msgid "No transactions in local memory..." -msgstr "" - -#: src/views/yield-dtf/governance/components/TopVoters.tsx:160 +#: src/views/yield-dtf/governance/components/TopVoters.tsx:148 msgid "No voters at this moment..." msgstr "" -#: src/views/yield-dtf/governance/views/proposal-detail/components/ProposalVotes.tsx:167 +#: src/views/index-dtf/governance/views/proposal/components/proposal-detail-votes.tsx:49 +#: src/views/yield-dtf/governance/views/proposal-detail/components/ProposalVotes.tsx:135 msgid "No votes" msgstr "" -#: src/views/bridge/components/BridgeWithdrawals.tsx:60 -msgid "No withdrawals found for connected wallet." +#: src/views/index-dtf/settings/components/index-settings-governance.tsx:122 +msgid "Non-Basket Governance" msgstr "" -#: src/views/bridge/components/BridgeFaq.tsx:84 -msgid "No, if a withdrawal has already been initiated on the Withdraw page it is not possible to cancel it. Once withdrawn, the process needs to be completed." -msgstr "" - -#: src/views/yield-dtf/governance/views/proposal/components/SpellUpgrade.tsx:63 +#: src/views/yield-dtf/governance/views/proposal/components/SpellUpgrade.tsx:66 msgid "None" msgstr "" @@ -1520,120 +1528,116 @@ msgstr "" msgid "Not available" msgstr "" -#: src/views/yield-dtf/settings/components/FreezeManager.tsx:104 +#: src/views/yield-dtf/settings/components/freeze-manager.tsx:100 msgid "Not frozen" msgstr "" -#: src/views/yield-dtf/deploy/components/GovernanceOverview.tsx:132 +#: src/views/yield-dtf/deploy/components/GovernanceOverview.tsx:127 msgid "Not ready to set up governance?" msgstr "" -#: src/views/discover/components/yield/components/RegisterAbout.tsx:158 -msgid "Not sure what you're looking at?" -msgstr "" - -#: src/views/yield-dtf/auctions/batch/components/OngoingAuctions.tsx:16 +#: src/views/yield-dtf/auctions/batch/components/OngoingAuctions.tsx:19 msgid "Ongoing auctions" msgstr "" -#: src/views/yield-dtf/auctions/dutch/components/OngoingDutchAuctions.tsx:14 +#: src/views/yield-dtf/auctions/dutch/components/OngoingDutchAuctions.tsx:13 msgid "Ongoing dutch auctions" msgstr "" -#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:131 +#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:146 msgid "Only the guardian address or governance will be able to unpause" msgstr "" -#: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:25 +#: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:24 msgid "Other" msgstr "" -#: src/components/layout/navigation/TokenNavigation.tsx:226 -#: src/views/yield-dtf/governance/views/proposal/components/ProposalNavigation.tsx:18 -#: src/views/yield-dtf/settings/components/NavigationSidebar.tsx:16 +#: src/components/layout/navigation/TokenNavigation.tsx:199 +#: src/views/yield-dtf/governance/views/proposal/components/ProposalNavigation.tsx:17 +#: src/views/yield-dtf/settings/components/navigation-sidebar.tsx:15 msgid "Other config" msgstr "" -#: src/views/yield-dtf/deploy/components/OtherSetup.tsx:8 +#: src/views/yield-dtf/deploy/components/OtherSetup.tsx:13 msgid "Other parameters" msgstr "" -#: src/views/yield-dtf/settings/components/OtherInfo.tsx:17 +#: src/views/yield-dtf/settings/components/other-info.tsx:11 msgid "Other Parameters" msgstr "" -#: src/views/yield-dtf/overview/components/backing/Risks.tsx:118 +#: src/views/yield-dtf/overview/components/backing/risks.tsx:109 msgid "Other Risks" msgstr "" -#: src/components/layout/navigation/index.tsx:109 -#: src/components/layout/navigation/TokenNavigation.tsx:185 -#: src/views/index-dtf/components/navigation/index.tsx:70 +#: src/components/layout/navigation/index.tsx:76 +#: src/components/layout/navigation/TokenNavigation.tsx:158 +#: src/views/index-dtf/components/navigation/index.tsx:115 msgid "Overview" msgstr "" -#: src/views/yield-dtf/governance/components/GovernanceOverview.tsx:164 +#: src/views/yield-dtf/governance/components/GovernanceOverview.tsx:174 msgid "Owner" msgstr "" -#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:67 +#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:76 msgid "Owner address" msgstr "" -#: src/views/yield-dtf/settings/components/BasicInfo.tsx:38 +#: src/views/yield-dtf/settings/components/basic-info.tsx:32 msgid "Owner Address" msgstr "" -#: src/views/yield-dtf/governance/views/proposal-detail/components/ContractProposalDetails.tsx:128 +#: src/views/yield-dtf/governance/views/proposal-detail/components/ContractProposalDetails.tsx:113 msgid "Parameters" msgstr "" -#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:116 +#: src/components/layout/header/components/app-navigation.tsx:76 +msgid "Participate & Earn" +msgstr "" + +#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:127 msgid "Pause status" msgstr "" -#: src/views/discover/components/yield/components/RTokenCard.tsx:197 +#: src/views/discover/components/yield/components/TokenStats.tsx:46 msgid "Peg:" msgstr "" -#: src/views/yield-dtf/auctions/dutch/components/PendingToSettleAuctions.tsx:19 +#: src/views/yield-dtf/auctions/dutch/components/PendingToSettleAuctions.tsx:24 msgid "Pending auctions to settle" msgstr "" #: src/components/transaction-modal/index.tsx:154 #: src/views/yield-dtf/deploy/components/DeployOverview.tsx:25 -#: src/views/yield-dtf/deploy/components/GovernanceOverview.tsx:24 -#: src/views/yield-dtf/governance/views/proposal/components/ConfirmProposalOverview.tsx:55 +#: src/views/yield-dtf/deploy/components/GovernanceOverview.tsx:25 +#: src/views/yield-dtf/governance/views/proposal/components/ConfirmProposalOverview.tsx:57 msgid "Pending, sign in wallet" msgstr "" -#: src/components/rtoken-setup/token/BackingForm.tsx:42 +#: src/components/rtoken-setup/token/BackingForm.tsx:46 msgid "Period in seconds" msgstr "" -#: src/views/bridge/components/BridgeWithdrawals.tsx:25 -msgid "Phase" -msgstr "" - -#: src/components/transactions/table/index.tsx:92 -#: src/views/explorer/components/transactions/useTransactionColumns.tsx:132 +#: src/components/transactions/table/index.tsx:91 +#: src/views/explorer/components/transactions/useTransactionColumns.tsx:131 msgid "Platform" msgstr "" -#: src/views/yield-dtf/overview/components/CollateralPieChartTooltip.tsx:212 +#: src/views/yield-dtf/overview/components/collateral-pie-chart-tooltip.tsx:178 msgid "Platform exposure" msgstr "" -#: src/views/yield-dtf/staking/components/overview/About.tsx:45 +#: src/views/yield-dtf/staking/components/overview/about.tsx:50 msgid "Please carefully evaluate the RToken before choosing to stake your RSR here. If any of the various collaterals of this RToken default, then the staked RSR will be the first funds that get auctioned off to make up the difference for RToken holders." msgstr "" -#: src/views/yield-dtf/settings/components/GovernancePrompt.tsx:43 +#: src/views/yield-dtf/settings/components/governance-prompt.tsx:24 msgid "Please complete the required governance configuration to complete deployment." msgstr "" -#: src/views/portfolio/components/Portfolio.tsx:141 -#: src/views/yield-dtf/auctions/auctions-sidebar/claim-rewards/components/ClaimFromTraderButton.tsx:75 +#: src/views/portfolio/components/Portfolio.tsx:123 +#: src/views/yield-dtf/auctions/auctions-sidebar/claim-rewards/components/ClaimFromTraderButton.tsx:74 msgid "Please connect your wallet" msgstr "" @@ -1641,15 +1645,15 @@ msgstr "" msgid "Please don't close this window to avoid issues finding your way back here." msgstr "" -#: src/views/discover/components/yield/components/RegisterAbout.tsx:138 +#: src/views/discover/components/yield/components/RegisterAbout.tsx:149 msgid "Please keep in mind that interactions with the Ethereum or Base blockchains are pseudonymous and publicly available." msgstr "" -#: src/views/yield-dtf/settings/components/ListingInfo.tsx:10 +#: src/views/yield-dtf/settings/components/listing-info.tsx:22 msgid "Please read more about how Register manage tokens on our repository" msgstr "" -#: src/views/yield-dtf/auctions/auctions-sidebar/claim-rewards/components/ClaimFromTraderButton.tsx:73 +#: src/views/yield-dtf/auctions/auctions-sidebar/claim-rewards/components/ClaimFromTraderButton.tsx:72 msgid "Please select an asset to claim" msgstr "" @@ -1657,24 +1661,23 @@ msgstr "" msgid "Please sign the transaction in your wallet to continue with the deployment process." msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/ConfirmProposalOverview.tsx:58 +#: src/views/yield-dtf/governance/views/proposal/components/ConfirmProposalOverview.tsx:60 msgid "Please sign the transaction in your wallet to continue with the governance process." msgstr "" -#: src/views/yield-dtf/deploy/components/GovernanceOverview.tsx:27 +#: src/views/yield-dtf/deploy/components/GovernanceOverview.tsx:28 msgid "Please sign the transaction in your wallet to continue with the government configuration process." msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/SimulateProposal.tsx:45 +#: src/views/yield-dtf/governance/views/proposal/components/SimulateProposal.tsx:43 msgid "Please wait while the simulation executes" msgstr "" -#: src/views/earn/hooks/useEarnTableColumns.tsx:70 +#: src/views/earn/hooks/useEarnTableColumns.tsx:62 msgid "Pool" msgstr "" -#: src/components/layout/header/components/HeaderMenu.tsx:56 -#: src/views/portfolio/components/Portfolio.tsx:126 +#: src/views/portfolio/components/Portfolio.tsx:114 msgid "Portfolio" msgstr "" @@ -1683,33 +1686,37 @@ msgid "Preparing transaction" msgstr "" #: src/components/tables/ListedTokensTable.tsx:37 -#: src/views/explorer/components/tokens/index.tsx:168 -#: src/views/tokens/components/UnlistedTokensTable.tsx:81 +#: src/views/explorer/components/tokens/index.tsx:148 +#: src/views/tokens/components/UnlistedTokensTable.tsx:80 msgid "Price" msgstr "" -#: src/components/layout/navigation/TokenNavigation.tsx:222 -#: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:21 -#: src/views/yield-dtf/governance/views/proposal/components/ProposalNavigation.tsx:21 -#: src/views/yield-dtf/governance/views/proposal/components/ProposedBasketPreview.tsx:54 -#: src/views/yield-dtf/settings/components/NavigationSidebar.tsx:12 +#: src/components/layout/navigation/TokenNavigation.tsx:195 +#: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:20 +#: src/views/yield-dtf/governance/views/proposal/components/ProposalNavigation.tsx:20 +#: src/views/yield-dtf/governance/views/proposal/components/ProposedBasketPreview.tsx:64 +#: src/views/yield-dtf/settings/components/navigation-sidebar.tsx:11 msgid "Primary basket" msgstr "" -#: src/components/rtoken-setup/basket/PrimaryBasket.tsx:87 -#: src/views/yield-dtf/settings/components/BasketInfo.tsx:20 +#: src/components/rtoken-setup/basket/PrimaryBasket.tsx:199 +#: src/views/yield-dtf/settings/components/basket-info.tsx:15 msgid "Primary Basket" msgstr "" -#: src/components/rtoken-setup/atoms.ts:102 +#: src/components/rtoken-setup/atoms.ts:113 msgid "Primary basket not defined" msgstr "" -#: src/views/yield-dtf/staking/components/stake/ConfirmStakeButton.tsx:98 +#: src/views/yield-dtf/staking/components/stake/confirm-stake-button.tsx:95 msgid "Proceed in wallet" msgstr "" -#: src/views/earn/hooks/useEarnTableColumns.tsx:130 +#: src/views/yield-dtf/staking/components/withdraw/available-unstake.tsx:76 +msgid "Processing..." +msgstr "" + +#: src/views/earn/hooks/useEarnTableColumns.tsx:102 msgid "Project" msgstr "" @@ -1717,7 +1724,8 @@ msgstr "" msgid "Proposal execution delay (hours)" msgstr "" -#: src/views/yield-dtf/settings/components/GovernanceInfo.tsx:65 +#: src/views/index-dtf/settings/components/index-settings-governance.tsx:70 +#: src/views/yield-dtf/settings/components/governance-info.tsx:54 msgid "Proposal Threshold" msgstr "" @@ -1725,58 +1733,61 @@ msgstr "" msgid "Proposal Threshold (%)" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/ConfirmProposalForm.tsx:57 +#: src/views/yield-dtf/governance/views/proposal/components/ConfirmProposalForm.tsx:49 msgid "Proposal Title" msgstr "" -#: src/views/explorer/components/governance/index.tsx:94 -#: src/views/yield-dtf/governance/components/GovernanceOverview.tsx:112 +#: src/views/explorer/components/governance/index.tsx:97 +#: src/views/index-dtf/governance/components/governance-stats.tsx:74 +#: src/views/yield-dtf/governance/components/GovernanceOverview.tsx:122 msgid "Proposals" msgstr "" -#: src/views/yield-dtf/governance/components/TopVoters.tsx:129 +#: src/views/yield-dtf/governance/components/TopVoters.tsx:130 msgid "Proposals voted" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/Intro.tsx:14 +#. placeholder {0}: rToken?.symbol +#: src/views/yield-dtf/governance/views/proposal/components/Intro.tsx:20 msgid "Propose changes to ${0}" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/ProposalBasketSetup.tsx:70 -msgid "Propose how the basket should be distributed going forward." +#: src/views/yield-dtf/governance/views/proposal/components/ProposalBasketSetup.tsx:55 +msgid "Propose how the basket should be distributed going forward. " msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/ProposalBasketSetup.tsx:100 +#: src/views/yield-dtf/governance/views/proposal/components/ProposalBasketSetup.tsx:86 msgid "Propose new backup configuration" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/ProposalBasketSetup.tsx:80 +#: src/views/yield-dtf/governance/views/proposal/components/ProposalBasketSetup.tsx:66 msgid "Propose new basket" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/ItemPreview.tsx:96 +#: src/views/yield-dtf/governance/views/proposal/components/ItemPreview.tsx:92 msgid "Proposed" msgstr "" +#: src/views/index-dtf/governance/views/proposal/components/vote-modal.tsx:107 #: src/views/yield-dtf/governance/views/proposal-detail/components/VoteModal.tsx:93 msgid "Proposed by" msgstr "" -#: src/components/layout/header/components/RegisterHelp.tsx:71 -#: src/views/yield-dtf/deploy/components/Intro.tsx:52 -#: src/views/yield-dtf/governance/views/proposal/components/Intro.tsx:36 +#: src/views/yield-dtf/deploy/components/Intro.tsx:51 +#: src/views/yield-dtf/governance/views/proposal/components/Intro.tsx:44 msgid "Protocol Docs" msgstr "" -#: src/views/earn/index.tsx:60 -msgid "Provide liquidity across DeFi & earn more with your RTokens" +#: src/views/earn/views/defi/components/earn-heading.tsx:15 +msgid "Provide liquidity across DeFi & earn more with your DTFs" msgstr "" -#: src/views/yield-dtf/governance/views/proposal-detail/components/ProposalQueue.tsx:32 +#: src/views/index-dtf/governance/views/proposal/components/proposal-queue-button.tsx:78 +#: src/views/yield-dtf/governance/views/proposal-detail/components/ProposalQueue.tsx:31 msgid "Queue proposal" msgstr "" -#: src/views/yield-dtf/settings/components/GovernanceInfo.tsx:70 +#: src/views/yield-dtf/settings/components/governance-info.tsx:58 msgid "Quorum" msgstr "" @@ -1788,33 +1799,34 @@ msgstr "" msgid "Quorum?:" msgstr "" -#: src/components/rtoken-setup/token/RevenueSplit.tsx:169 +#: src/components/rtoken-setup/token/RevenueSplit.tsx:183 msgid "Read more about revenue distribution" msgstr "" -#: src/components/rtoken-setup/token/ExternalRevenueSplit.tsx:120 +#: src/components/rtoken-setup/token/ExternalRevenueSplit.tsx:108 msgid "Receiving eth address" msgstr "" -#: src/views/yield-dtf/governance/components/ProposalList.tsx:203 +#: src/views/yield-dtf/governance/components/ProposalList.tsx:183 msgid "Recent proposals" msgstr "" -#: src/views/tokens/components/TableFilters.tsx:72 +#: src/views/tokens/components/TableFilters.tsx:70 msgid "Record limit" msgstr "" -#: src/components/transactions/table/index.tsx:47 -#: src/views/explorer/components/transactions/useTransactionColumns.tsx:27 +#: src/components/transactions/table/index.tsx:46 +#: src/views/explorer/components/transactions/useTransactionColumns.tsx:26 #: src/views/yield-dtf/issuance/components/redeem/RedeemInput.tsx:15 -#: src/views/yield-dtf/overview/components/RTokenTransactions.tsx:77 +#: src/views/yield-dtf/overview/components/rtoken-transactions.tsx:74 msgid "Redeem" msgstr "" -#: src/views/yield-dtf/issuance/components/issue/IssuanceInfo.tsx:194 +#: src/views/yield-dtf/issuance/components/issue/IssuanceInfo.tsx:164 msgid "Redeem - Global throttle" msgstr "" +#. placeholder {0}: rToken?.symbol #: src/views/yield-dtf/issuance/components/redeem/ConfirmRedemption.tsx:95 #: src/views/yield-dtf/issuance/components/redeem/ConfirmRedemption.tsx:96 msgid "Redeem {0}" @@ -1824,220 +1836,213 @@ msgstr "" msgid "Redeem amount" msgstr "" -#: src/views/yield-dtf/issuance/components/issue/IssuanceInfo.tsx:195 +#: src/views/yield-dtf/issuance/components/issue/IssuanceInfo.tsx:165 msgid "Redeemable now" msgstr "" -#: src/components/rtoken-setup/token/BackingForm.tsx:150 +#: src/components/rtoken-setup/token/BackingForm.tsx:154 msgid "Redemption amount - allows the issuer to limit the amount of RTokens redeemed per hour. This matters in the event of an exploit where an attacker tries to redeem RTokens.This buys time for users with pause or freeze permissions to reduce the amount of RTokens that can be redeemed." msgstr "" -#: src/components/rtoken-setup/token/BackingForm.tsx:137 +#: src/components/rtoken-setup/token/BackingForm.tsx:141 msgid "Redemption rate - allows the issuer to limit the amount of RTokens redeemed per hour based on a percentage of the current RToken market cap. This matters in the event of an exploit where an attacker tries to redeem RTokens. This buys time for users with pause or freeze permissions to reduce the amount of RTokens that can be redeemed." msgstr "" -#: src/components/rtoken-setup/token/BackingForm.tsx:148 -#: src/components/rtoken-setup/token/BackingForm.tsx:149 -#: src/views/yield-dtf/settings/components/BackingInfo.tsx:107 +#: src/components/rtoken-setup/token/BackingForm.tsx:152 +#: src/components/rtoken-setup/token/BackingForm.tsx:153 +#: src/views/yield-dtf/settings/components/backing-info.tsx:75 msgid "Redemption throttle amount" msgstr "" -#: src/views/yield-dtf/settings/components/BackingInfo.tsx:98 +#: src/views/yield-dtf/settings/components/backing-info.tsx:69 msgid "Redemption throttle rate" msgstr "" -#: src/components/rtoken-setup/token/BackingForm.tsx:136 +#: src/components/rtoken-setup/token/BackingForm.tsx:140 msgid "Redemption throttle Rate" msgstr "" -#: src/components/rtoken-setup/token/BackingForm.tsx:135 +#: src/components/rtoken-setup/token/BackingForm.tsx:139 msgid "Redemption throttle rate (%)" msgstr "" -#: src/views/index-dtf/deploy/steps/confirm-deploy/simple/index.tsx:39 +#: src/views/index-dtf/deploy/steps/confirm-deploy/simple/index.tsx:54 msgid "Refresh quote" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/RegisterProposal.tsx:26 +#: src/views/yield-dtf/governance/views/proposal/components/RegisterProposal.tsx:31 msgid "Register Assets" msgstr "" -#: src/components/layout/header/components/RegisterHelp.tsx:66 -msgid "Register Feedback" -msgstr "" - -#: src/views/discover/components/yield/components/RegisterAbout.tsx:108 -msgid "Register is an open source project developed and maintained by ABC Labs as the first dApp to interact with the Reserve Protocol and various RTokens deployed with the platform." -msgstr "" - -#: src/views/bridge/components/BridgeFaq.tsx:28 -msgid "Register L2 Bridge enables the transfer of certain digital assets and other data back and forth between Ethereum and Base." -msgstr "" - -#: src/views/tokens/Tokens.tsx:15 +#: src/views/tokens/Tokens.tsx:14 msgid "Register listed RTokens" msgstr "" -#: src/views/yield-dtf/settings/components/ListingInfo.tsx:9 +#: src/views/yield-dtf/settings/components/listing-info.tsx:21 msgid "Register Listing" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/ProposedRegisterPreview.tsx:28 +#: src/views/yield-dtf/governance/views/proposal/components/ProposedRegisterPreview.tsx:32 msgid "Registering assets" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/RegisterProposal.tsx:36 +#: src/views/yield-dtf/governance/views/proposal/components/RegisterProposal.tsx:41 msgid "Registration of an asset plugin enables the RToken to price an underlying ERC20 token. Where an asset plugin for the underlying token already exists, the existing asset plugin is replaced with the new one." msgstr "" -#: src/views/yield-dtf/issuance/components/about/index.tsx:14 -msgid "Regular minting" +#: src/views/yield-dtf/issuance/components/about/index.tsx:13 +msgid "Regular minting " msgstr "" -#: src/views/yield-dtf/settings/components/ContractsInfo.tsx:35 +#: src/views/yield-dtf/settings/components/contracts-info.tsx:29 msgid "Related Contracts" msgstr "" -#: src/components/rtoken-setup/components/RolesEdit.tsx:139 -#: src/views/yield-dtf/governance/views/proposal/components/ItemPreview.tsx:43 -#: src/views/yield-dtf/governance/views/proposal/components/ListItemPreview.tsx:21 -#: src/views/yield-dtf/governance/views/proposal/components/ProposedRevenueSplitPreview.tsx:127 +#: src/components/rtoken-setup/components/RolesEdit.tsx:121 +#: src/views/yield-dtf/governance/views/proposal/components/ItemPreview.tsx:45 +#: src/views/yield-dtf/governance/views/proposal/components/ListItemPreview.tsx:22 +#: src/views/yield-dtf/governance/views/proposal/components/ProposedRevenueSplitPreview.tsx:130 msgid "Remove" msgstr "" -#: src/views/bridge/components/WithdrawalInfoModal.tsx:55 -msgid "Request sent" -msgstr "" - -#: src/views/yield-dtf/settings/components/GovernancePrompt.tsx:36 +#: src/views/yield-dtf/settings/components/governance-prompt.tsx:17 msgid "Required setup:" msgstr "" -#: src/views/yield-dtf/issuance/components/balances/CollateralBalance.tsx:52 +#: src/views/yield-dtf/issuance/components/balances/CollateralBalance.tsx:53 msgid "Required:" msgstr "" -#: src/views/discover/components/yield/components/RegisterAbout.tsx:94 +#: src/views/discover/components/yield/components/RegisterAbout.tsx:101 msgid "Reserve aims to help people around the world maintain their spending power by allowing anyone to create asset-backed currencies with tokenized assets on the Ethereum blockchain in customizable and novel ways." msgstr "" -#: src/components/layout/header/components/RegisterHelp.tsx:86 +#: src/components/layout/header/components/app-navigation.tsx:126 +msgid "Reserve Blog" +msgstr "" + +#: src/components/layout/header/components/app-navigation.tsx:98 msgid "Reserve Bridge" msgstr "" -#: src/components/layout/header/components/RegisterHelp.tsx:81 +#: src/components/layout/header/components/app-navigation.tsx:144 msgid "Reserve Discord" msgstr "" -#: src/components/layout/header/components/RegisterHelp.tsx:76 +#: src/components/layout/header/components/app-navigation.tsx:132 +msgid "Reserve Docs" +msgstr "" + +#: src/components/layout/header/components/app-navigation.tsx:138 msgid "Reserve Forum" msgstr "" -#: src/views/yield-dtf/overview/components/backing/Risks.tsx:49 +#: src/views/yield-dtf/overview/components/backing/risks.tsx:38 msgid "Reserve Protocol Smart-Contract Risk" msgstr "" -#: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:23 -#: src/views/yield-dtf/overview/components/backing/RevenueSplitOverview.tsx:108 +#: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:22 +#: src/views/yield-dtf/overview/components/backing/revenue-split-overview.tsx:104 msgid "Revenue distribution" msgstr "" -#: src/components/rtoken-setup/token/RevenueSplit.tsx:103 -#: src/views/yield-dtf/settings/components/RevenueSplitInfo.tsx:20 +#: src/components/rtoken-setup/token/RevenueSplit.tsx:109 +#: src/views/yield-dtf/settings/components/revenue-split-info.tsx:14 msgid "Revenue Distribution" msgstr "" -#: src/components/layout/navigation/TokenNavigation.tsx:224 -#: src/views/yield-dtf/governance/views/proposal/components/ProposalNavigation.tsx:20 -#: src/views/yield-dtf/settings/components/NavigationSidebar.tsx:14 +#: src/components/layout/navigation/TokenNavigation.tsx:197 +#: src/views/yield-dtf/governance/views/proposal/components/ProposalNavigation.tsx:19 +#: src/views/yield-dtf/settings/components/navigation-sidebar.tsx:13 msgid "Revenue share" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/ProposedRevenueSplitPreview.tsx:104 +#: src/views/yield-dtf/governance/views/proposal/components/ProposedRevenueSplitPreview.tsx:108 msgid "Revenue split" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/ItemPreview.tsx:48 -#: src/views/yield-dtf/governance/views/proposal/components/ListItemPreview.tsx:27 -#: src/views/yield-dtf/governance/views/proposal/components/ProposedBackupPreview.tsx:87 -#: src/views/yield-dtf/governance/views/proposal/components/ProposedBasketPreview.tsx:36 -#: src/views/yield-dtf/governance/views/proposal/components/ProposedRevenueSplitPreview.tsx:136 +#: src/views/yield-dtf/governance/views/proposal/components/ItemPreview.tsx:50 +#: src/views/yield-dtf/governance/views/proposal/components/ListItemPreview.tsx:28 +#: src/views/yield-dtf/governance/views/proposal/components/ProposedBackupPreview.tsx:98 +#: src/views/yield-dtf/governance/views/proposal/components/ProposedBasketPreview.tsx:47 +#: src/views/yield-dtf/governance/views/proposal/components/ProposedRevenueSplitPreview.tsx:140 msgid "Revert" msgstr "" -#: src/views/yield-dtf/staking/components/stake/StakeModal.tsx:90 -#: src/views/yield-dtf/staking/components/unstake/UnstakeModal.tsx:64 +#: src/views/yield-dtf/staking/components/stake/stake-modal.tsx:90 +#: src/views/yield-dtf/staking/components/unstake/unstake-modal.tsx:63 msgid "Review stake" msgstr "" -#: src/views/yield-dtf/settings/components/OtherInfo.tsx:38 +#: src/views/yield-dtf/settings/components/other-info.tsx:26 msgid "Reward ratio" msgstr "" -#: src/components/rtoken-setup/token/OtherForm.tsx:76 +#: src/components/rtoken-setup/token/OtherForm.tsx:79 msgid "Reward ratio - amount of the current reward amount that should be handed out in a single block. The default corresponds to a half life of approximately 15 days." msgstr "" -#: src/components/rtoken-setup/token/OtherForm.tsx:74 +#: src/components/rtoken-setup/token/OtherForm.tsx:77 msgid "Reward ratio (decimals)" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/ConfirmProposalForm.tsx:66 +#: src/views/yield-dtf/governance/views/proposal/components/ConfirmProposalForm.tsx:58 msgid "RFC" msgstr "" -#: src/views/yield-dtf/staking/components/overview/About.tsx:43 +#: src/views/yield-dtf/staking/components/overview/about.tsx:48 msgid "Risk evaluation" msgstr "" -#: src/views/yield-dtf/governance/components/GovernanceOverview.tsx:165 -#: src/views/yield-dtf/governance/components/GovernanceOverview.tsx:171 -#: src/views/yield-dtf/settings/components/FreezeManager.tsx:38 -#: src/views/yield-dtf/settings/components/FreezeManager.tsx:70 -#: src/views/yield-dtf/settings/components/PauseManager.tsx:85 +#: src/views/yield-dtf/governance/components/GovernanceOverview.tsx:175 +#: src/views/yield-dtf/governance/components/GovernanceOverview.tsx:181 +#: src/views/yield-dtf/settings/components/freeze-manager.tsx:37 +#: src/views/yield-dtf/settings/components/freeze-manager.tsx:69 +#: src/views/yield-dtf/settings/components/pause-manager.tsx:82 msgid "Role held by:" msgstr "" -#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:61 -#: src/views/yield-dtf/settings/components/ListingInfo.tsx:34 +#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:68 +#: src/views/index-dtf/settings/components/index-settings-roles.tsx:37 +#: src/views/yield-dtf/settings/components/listing-info.tsx:47 msgid "Roles" msgstr "" -#: src/components/layout/navigation/TokenNavigation.tsx:220 -#: src/views/yield-dtf/settings/components/NavigationSidebar.tsx:10 -#: src/views/yield-dtf/settings/components/RTokenManagement.tsx:52 +#: src/components/layout/navigation/TokenNavigation.tsx:193 +#: src/views/yield-dtf/settings/components/navigation-sidebar.tsx:9 +#: src/views/yield-dtf/settings/components/rtoken-management.tsx:43 msgid "Roles & Controls" msgstr "" -#: src/views/yield-dtf/staking/components/withdraw/AvailableUnstake.tsx:29 +#: src/views/yield-dtf/staking/components/withdraw/available-unstake.tsx:24 msgid "RSR available to withdraw" msgstr "" -#: src/views/yield-dtf/overview/components/charts/StakingChart.tsx:80 +#: src/views/yield-dtf/overview/components/charts/staking-chart.tsx:97 msgid "RSR Staked" msgstr "" -#: src/views/yield-dtf/settings/components/RevenueSplitInfo.tsx:31 +#: src/views/yield-dtf/settings/components/revenue-split-info.tsx:23 msgid "RSR Stakers" msgstr "" -#: src/views/yield-dtf/settings/components/ContractsInfo.tsx:24 +#: src/views/yield-dtf/settings/components/contracts-info.tsx:20 msgid "RSR Trader" msgstr "" -#: src/views/yield-dtf/settings/components/BasicInfo.tsx:26 +#: src/views/yield-dtf/settings/components/basic-info.tsx:22 msgid "RToken Address" msgstr "" -#: src/views/yield-dtf/deploy/components/TransactionDivider.tsx:39 +#: src/views/yield-dtf/deploy/components/TransactionDivider.tsx:50 msgid "RToken Deployment Transaction succeeded" msgstr "" -#: src/components/rtoken-setup/token/TokenForm.tsx:14 +#: src/components/rtoken-setup/token/TokenForm.tsx:15 msgid "RToken Details" msgstr "" -#: src/views/yield-dtf/settings/components/RevenueSplitInfo.tsx:25 +#: src/views/yield-dtf/settings/components/revenue-split-info.tsx:17 msgid "RToken holders" msgstr "" @@ -2045,94 +2050,62 @@ msgstr "" msgid "RToken in Wallet" msgstr "" -#: src/components/layout/header/components/TokenToggle.tsx:37 -msgid "RToken is frozen" -msgstr "" - -#: src/components/layout/header/components/TokenToggle.tsx:39 -msgid "RToken is paused" -msgstr "" - -#: src/components/rtoken-setup/token/TokenForm.tsx:37 -#: src/views/yield-dtf/deploy/components/TokenForm.tsx:46 +#: src/components/rtoken-setup/token/TokenForm.tsx:38 +#: src/views/yield-dtf/deploy/components/TokenForm.tsx:50 msgid "RToken mandate" msgstr "" -#: src/views/home/components/Hero.tsx:38 -msgid "RToken Market Cap" -msgstr "" - -#: src/views/yield-dtf/settings/components/OtherInfo.tsx:48 +#: src/views/yield-dtf/settings/components/other-info.tsx:34 msgid "RToken Maximum trade volume" msgstr "" -#: src/components/rtoken-setup/token/OtherForm.tsx:100 +#: src/components/rtoken-setup/token/OtherForm.tsx:103 msgid "RToken Maximum trade volume ($)" msgstr "" -#: src/views/yield-dtf/settings/components/ContractsInfo.tsx:23 +#: src/views/yield-dtf/settings/components/contracts-info.tsx:19 msgid "RToken Trader" msgstr "" -#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:122 +#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:140 msgid "RToken will be fully functional" msgstr "" -#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:119 +#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:137 msgid "RToken will be left in pause state" msgstr "" -#: src/views/yield-dtf/deploy/components/GovernanceOverview.tsx:94 +#: src/views/yield-dtf/deploy/components/GovernanceOverview.tsx:91 msgid "RToken will be ready to use after this TX if you choose to unpause." msgstr "" -#: src/components/rtoken-selector/SelectedToken.tsx:47 -msgid "RTokens" -msgstr "" - -#: src/views/yield-dtf/overview/components/backing/index.tsx:75 +#: src/views/yield-dtf/overview/components/backing/index.tsx:89 msgid "RTokens are 100% backed by a diversified set of underlying collateral tokens..." msgstr "" -#: src/views/tokens/Tokens.tsx:16 -msgid "RTokens in this list is not an endorsement or audited by us. It’s simply RTokens that have gone through our listing process and don’t seem like clear scams." +#: src/views/tokens/Tokens.tsx:17 +msgid "RTokens in this list is not an endorsement or audited by us. It's simply RTokens that have gone through our listing process and don't seem like clear scams." msgstr "" -#: src/views/discover/components/yield/components/RegisterAbout.tsx:48 -msgid "RTokens live on a blockchain, either Ethereum or Base, which means that they can be transacted worldwide within seconds. They're also 100% backed by other assets living on that same blockchain. The users of the currency can - at any time - redeem their RTokens for backing assets worthe the same value." -msgstr "" - -#: src/components/rtoken-setup/basket/CustomCollateral.tsx:124 -#: src/components/rtoken-setup/components/RolesEdit.tsx:53 -#: src/views/yield-dtf/governance/views/proposal/components/RegisterEdit.tsx:55 -#: src/views/yield-dtf/staking/components/stake/EditDelegate.tsx:31 +#: src/components/rtoken-setup/basket/CustomCollateral.tsx:120 +#: src/components/rtoken-setup/components/RolesEdit.tsx:48 +#: src/views/yield-dtf/governance/views/proposal/components/RegisterEdit.tsx:47 +#: src/views/yield-dtf/staking/components/stake/edit-delegate.tsx:31 msgid "Save" msgstr "" -#: src/views/tokens/components/TableFilters.tsx:20 +#: src/views/tokens/components/TableFilters.tsx:19 msgid "Search" msgstr "" -#: src/views/bridge/components/BridgeTokenModal.tsx:197 -msgid "Search by token symbol" -msgstr "" - -#: src/views/index-dtf/governance/views/propose/components/proposal-type-selection.tsx:38 +#: src/views/index-dtf/governance/views/propose/index.tsx:51 msgid "Select proposal type" msgstr "" -#: src/views/bridge/components/BridgeTokenModal.tsx:185 -msgid "Select token" -msgstr "" - -#: src/views/yield-dtf/auctions/components/useColumns.tsx:32 +#: src/views/yield-dtf/auctions/components/useColumns.tsx:31 msgid "Selling" msgstr "" -#: src/views/bridge/components/WithdrawalInfoModal.tsx:62 -msgid "Send verify tx on Mainnet" -msgstr "" - #: src/views/yield-dtf/auctions/auctions-sidebar/SettleableAuctions.tsx:78 msgid "Settle all" msgstr "" @@ -2141,184 +2114,187 @@ msgstr "" msgid "Settleable auctions" msgstr "" -#: src/views/yield-dtf/settings/components/GovernancePrompt.tsx:40 +#: src/views/yield-dtf/settings/components/governance-prompt.tsx:21 msgid "Setup Governance" msgstr "" -#: src/views/yield-dtf/overview/components/backing/RevenueSplitOverview.tsx:36 +#: src/views/yield-dtf/overview/components/backing/revenue-split-overview.tsx:41 msgid "Shared externally" msgstr "" -#: src/views/yield-dtf/overview/components/backing/RevenueSplitOverview.tsx:31 +#: src/views/yield-dtf/overview/components/backing/revenue-split-overview.tsx:36 msgid "Shared with RSR Stakers" msgstr "" -#: src/views/yield-dtf/overview/components/backing/RevenueSplitOverview.tsx:28 +#: src/views/yield-dtf/overview/components/backing/revenue-split-overview.tsx:33 msgid "Shared with RToken Holders" msgstr "" -#: src/views/yield-dtf/settings/components/FreezeManager.tsx:37 -#: src/views/yield-dtf/settings/components/FreezeManager.tsx:40 +#: src/views/yield-dtf/settings/components/freeze-manager.tsx:36 +#: src/views/yield-dtf/settings/components/freeze-manager.tsx:39 msgid "Short Freeze" msgstr "" -#: src/views/yield-dtf/settings/components/OtherInfo.tsx:21 +#: src/views/yield-dtf/settings/components/other-info.tsx:13 msgid "Short freeze duration" msgstr "" -#: src/components/rtoken-setup/token/OtherForm.tsx:19 +#: src/components/rtoken-setup/token/OtherForm.tsx:22 msgid "Short freeze duration (s)" msgstr "" -#: src/components/rtoken-setup/token/OtherForm.tsx:21 +#: src/components/rtoken-setup/token/OtherForm.tsx:24 msgid "Short freezers have the responsibility of freezing an RToken if anything dangerous or suspicious is happening. This is a one-shot freeze and the role will be revoked after a single use. This field determines how long the RToken will remain frozen until the freeze expires or is extended by another actor." msgstr "" -#: src/views/yield-dtf/governance/views/proposal-detail/components/ContractProposalDetails.tsx:120 +#: src/views/yield-dtf/governance/views/proposal-detail/components/ContractProposalDetails.tsx:105 msgid "Signature" msgstr "" -#: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:52 +#: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:51 msgid "Signing Tx 1" msgstr "" -#: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:56 +#: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:55 msgid "Signing Tx 2" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/SimulateProposal.tsx:54 +#: src/views/yield-dtf/governance/views/proposal/components/SimulateProposal.tsx:56 msgid "Simulate proposal" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/SimulateProposal.tsx:112 +#: src/views/yield-dtf/governance/views/proposal/components/SimulateProposal.tsx:91 msgid "Simulate Proposal" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/SimulateProposal.tsx:34 +#: src/views/yield-dtf/governance/views/proposal/components/SimulateProposal.tsx:32 msgid "Simulation successful ✓" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/SimulateProposal.tsx:35 +#: src/views/yield-dtf/governance/views/proposal/components/SimulateProposal.tsx:33 msgid "Simulation unsuccessful ✘" msgstr "" -#: src/views/yield-dtf/auctions/auctions-sidebar/UnavailableRevenueAuctions.tsx:130 +#: src/views/yield-dtf/auctions/auctions-sidebar/UnavailableRevenueAuctions.tsx:128 msgid "Small revenue auctions" msgstr "" -#: src/views/yield-dtf/settings/components/GovernanceInfo.tsx:42 +#: src/views/yield-dtf/settings/components/governance-info.tsx:34 msgid "Snapshot Delay" msgstr "" -#: src/views/yield-dtf/auctions/components/useColumns.tsx:32 +#: src/views/yield-dtf/auctions/components/useColumns.tsx:31 msgid "Sold" msgstr "" -#: src/views/yield-dtf/issuance/components/about/index.tsx:27 +#: src/views/yield-dtf/issuance/components/about/index.tsx:26 msgid "Some collateral tokens from protocols like Aave and Convex differ technically from other collateral tokens. To ensure proper handling, they must be wrapped in a contract for effective monitoring. Once wrapped, the collateral remains the same but has a new interface for price and appreciation tracking." msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/SpellUpgradePreview.tsx:34 +#: src/views/yield-dtf/governance/views/proposal/components/SpellUpgradePreview.tsx:37 msgid "Spell 1" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/SpellUpgradePreview.tsx:34 +#: src/views/yield-dtf/governance/views/proposal/components/SpellUpgradePreview.tsx:37 msgid "Spell 2" msgstr "" -#: src/views/yield-dtf/deploy/components/TokenForm.tsx:40 +#: src/views/yield-dtf/deploy/components/TokenForm.tsx:44 msgid "St Token Ticker" msgstr "" -#: src/components/layout/navigation/TokenNavigation.tsx:202 -#: src/components/transactions/table/index.tsx:54 -#: src/views/explorer/components/transactions/useTransactionColumns.tsx:34 -#: src/views/yield-dtf/overview/components/RTokenTransactions.tsx:84 +#: src/components/layout/navigation/TokenNavigation.tsx:175 +#: src/components/transactions/table/index.tsx:53 +#: src/views/explorer/components/transactions/useTransactionColumns.tsx:33 +#: src/views/yield-dtf/overview/components/rtoken-transactions.tsx:81 msgid "Stake" msgstr "" -#: src/components/layout/navigation/index.tsx:111 +#: src/components/layout/navigation/index.tsx:78 msgid "Stake + Unstake" msgstr "" -#: src/views/yield-dtf/staking/components/overview/StakingStats.tsx:42 +#: src/views/yield-dtf/staking/components/overview/staking-stats.tsx:49 msgid "Stake pool" msgstr "" -#: src/views/yield-dtf/overview/components/hero/TokenStats.tsx:56 +#: src/views/yield-dtf/overview/components/hero/token-stats.tsx:52 msgid "Stake pool USD value:" msgstr "" -#: src/views/yield-dtf/staking/components/stake/StakeButton.tsx:31 +#: src/views/yield-dtf/staking/components/stake/stake-button.tsx:30 msgid "Stake RSR" msgstr "" -#: src/views/tokens/components/UnlistedTokensTable.tsx:111 +#: src/views/tokens/components/UnlistedTokensTable.tsx:105 msgid "Staked" msgstr "" -#: src/views/explorer/components/tokens/index.tsx:176 -#: src/views/yield-dtf/overview/components/CollateralPieChartWrapper.tsx:167 +#: src/views/explorer/components/tokens/index.tsx:156 +#: src/views/yield-dtf/overview/components/collateral-pie-chart-wrapper.tsx:105 msgid "Staked RSR" msgstr "" -#: src/views/yield-dtf/overview/components/CollateralPieChartTooltip.tsx:229 +#: src/views/yield-dtf/overview/components/collateral-pie-chart-tooltip.tsx:197 msgid "Staked RSR Overcollateralisation" msgstr "" -#: src/views/explorer/components/tokens/index.tsx:188 +#: src/views/explorer/components/tokens/index.tsx:168 msgid "Stakers APY" msgstr "" -#: src/views/yield-dtf/staking/components/overview/About.tsx:7 +#: src/views/yield-dtf/staking/components/overview/about.tsx:12 msgid "Staking RSR" msgstr "" -#: src/views/yield-dtf/deploy/components/TokenForm.tsx:36 +#: src/views/yield-dtf/deploy/components/TokenForm.tsx:40 msgid "Staking token" msgstr "" -#: src/views/yield-dtf/staking/components/unstake/UnstakeModal.tsx:47 +#: src/views/yield-dtf/staking/components/unstake/unstake-modal.tsx:46 msgid "Staking yield share ends" msgstr "" -#: src/components/transactions/table/index.tsx:51 -#: src/views/explorer/components/transactions/useTransactionColumns.tsx:31 -#: src/views/yield-dtf/overview/components/RTokenTransactions.tsx:81 +#: src/components/transactions/table/index.tsx:50 +#: src/views/explorer/components/transactions/useTransactionColumns.tsx:30 +#: src/views/yield-dtf/overview/components/rtoken-transactions.tsx:78 msgid "Start Issue" msgstr "" -#: src/views/bridge/components/BridgeWithdrawals.tsx:28 -#: src/views/explorer/components/governance/index.tsx:70 +#: src/views/explorer/components/governance/index.tsx:76 msgid "Status" msgstr "" -#: src/views/yield-dtf/settings/components/PauseManager.tsx:68 +#: src/views/yield-dtf/settings/components/pause-manager.tsx:65 msgid "Status:" msgstr "" -#: src/views/yield-dtf/deploy/components/GovernanceOverview.tsx:42 -#: src/views/yield-dtf/governance/views/proposal/components/ConfirmProposalOverview.tsx:75 -msgid "Stay patient while the transaction is in progress & don’t close this window to avoid issues finding your way back here." +#: src/views/yield-dtf/deploy/components/GovernanceOverview.tsx:46 +#: src/views/yield-dtf/governance/views/proposal/components/ConfirmProposalOverview.tsx:77 +msgid "Stay patient while the transaction is in progress & don't close this window to avoid issues finding your way back here." msgstr "" -#: src/views/discover/components/yield/components/RegisterAbout.tsx:74 -msgid "Still have questions? Come talk to the Reserve community in our Discord server. We'd be more than happy to help!" +#: src/components/layout/header/components/app-navigation.tsx:128 +msgid "Stay up to date in long form" msgstr "" -#: src/components/rtoken-setup/token/OtherForm.tsx:75 +#: src/views/discover/components/yield/components/RegisterAbout.tsx:81 +msgid "Still have questions? Come talk to us in the Reserve Discord server. We’d be happy to help! You can also" +msgstr "" + +#: src/components/rtoken-setup/token/OtherForm.tsx:78 msgid "stRSR payout fraction 0.0" msgstr "" -#: src/views/yield-dtf/settings/components/ContractsInfo.tsx:27 +#: src/views/yield-dtf/settings/components/contracts-info.tsx:23 msgid "stRSR Token" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/ConfirmProposalOverview.tsx:97 +#: src/views/yield-dtf/governance/views/proposal/components/ConfirmProposalOverview.tsx:95 msgid "Submit proposal on-chain" msgstr "" -#: src/views/yield-dtf/overview/components/charts/SupplyChart.tsx:74 +#: src/views/yield-dtf/overview/components/charts/supply-chart.tsx:85 msgid "Supply" msgstr "" @@ -2326,50 +2302,50 @@ msgstr "" msgid "Surplus below minimum trade" msgstr "" -#: src/views/yield-dtf/settings/components/BasicInfo.tsx:23 +#: src/views/yield-dtf/settings/components/basic-info.tsx:19 msgid "Symbol" msgstr "" -#: src/components/rtoken-setup/basket/PluginItem.tsx:112 +#: src/components/rtoken-setup/basket/PluginItem.tsx:105 msgid "Target:" msgstr "" #: src/components/tables/ListedTokensTable.tsx:53 -#: src/views/explorer/components/tokens/index.tsx:192 -#: src/views/tokens/components/UnlistedTokensTable.tsx:96 +#: src/views/explorer/components/tokens/index.tsx:172 +#: src/views/tokens/components/UnlistedTokensTable.tsx:95 msgid "Target(s)" msgstr "" -#: src/views/yield-dtf/auctions/auctions-sidebar/claim-rewards/components/TraderEmissions.tsx:172 +#: src/views/yield-dtf/auctions/auctions-sidebar/claim-rewards/components/TraderEmissions.tsx:156 msgid "The amount of assets selected affects the gas price, this asset may not be worth claiming yet." msgstr "" -#: src/components/account/index.tsx:43 +#: src/components/account/index.tsx:48 msgid "The configured network \"{currentChain}\" is different from the wallet selected network \"{chainId}\"\". Change your network in the connected wallet." msgstr "" -#: src/views/discover/components/yield/components/DeployHero.tsx:73 +#: src/views/discover/components/yield/components/DeployHero.tsx:39 msgid "The creation of new RToken designs is permissionless. If you are the inventive type and have ideas for what assets should be in the basket, what a good governance looks like, or anything novel that could work within the realms of the protocol, please consider putting those ideas into practice or sharing them with the community." msgstr "" -#: src/components/rtoken-setup/basket/EmergencyCollateral.tsx:145 +#: src/components/rtoken-setup/basket/EmergencyCollateral.tsx:157 msgid "The diversity factor determines the amount of emergency collateral that will be deployed to the RToken basket in the case of a default." msgstr "" -#: src/components/rtoken-setup/token/BackingForm.tsx:71 +#: src/components/rtoken-setup/token/BackingForm.tsx:75 msgid "The dutch auction length is how many seconds long falling-price dutch auctions should be. A longer period will result in less slippage due to better price granularity, and a shorter period will result in more slippage." msgstr "" -#: src/components/rtoken-setup/token/OtherForm.tsx:49 +#: src/components/rtoken-setup/token/OtherForm.tsx:52 msgid "The fraction of RSR stake that should be permitted to withdraw without a refresh. When cumulative withdrawals (or a single withdrawal) exceed this fraction, gas must be paid to refresh all assets." msgstr "" -#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:89 +#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:98 msgid "The guardian has the ability to reject proposals even if they pass. Should be assigned to a multisig or EOA that can be trusted to act as a backstop. It is acceptable if it is relatively slow to act. Only one guardian address should be defined." msgstr "" -#: src/views/yield-dtf/deploy/components/TokenForm.tsx:47 -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." +#: src/views/yield-dtf/deploy/components/TokenForm.tsx:51 +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/components/rtoken-setup/governance/GovernanceParameters.tsx:89 @@ -2384,157 +2360,137 @@ msgstr "" msgid "The minimum percentage of stRSR voter participation (either For or Abstain) on a proposal before it can be passed." msgstr "" -#: src/views/yield-dtf/settings/components/PauseManager.tsx:106 +#: src/views/yield-dtf/settings/components/pause-manager.tsx:97 msgid "The pauser(s) can put the RToken in two states which can be either true or false (no set duration):" msgstr "" -#: src/views/home/components/Hero.tsx:69 -msgid "The projected annual revenue generated by the protocol for RSR stakers, calculated using the current RSR staker APY and the amount of staked RSR for the listed RTokens." -msgstr "" - -#: src/views/home/components/Hero.tsx:59 -msgid "The projected annual revenue generated by the protocol for RToken holders, calculated using the current APY and TVL of the listed RTokens." -msgstr "" - -#: src/views/discover/components/yield/components/RegisterAbout.tsx:91 +#: src/views/discover/components/yield/components/RegisterAbout.tsx:98 msgid "The Reserve Project" msgstr "" -#: src/views/yield-dtf/auctions/components/About.tsx:14 +#: src/views/yield-dtf/auctions/components/About.tsx:17 msgid "The Reserve Protocol makes a few different types of trades" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/ProposalBasketSetup.tsx:65 +#: src/views/yield-dtf/governance/views/proposal/components/ProposalBasketSetup.tsx:50 msgid "The token supply is not enough for changing the primary basket safely, contact the Reserve team for recommendations." msgstr "" -#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:69 +#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:78 msgid "" "The top level decision maker, typically a decentralized governance smart contract, responsible for setting or updating all RToken parameter values, RToken baskets, etc. - The RToken OWNER has the power to:\n" -"grant and revoke roles to any Ethereum account\n" -"pause and unpause the system\n" -"freeze and unfreeze the system\n" -"set governance parameters\n" -"upgrade system contracts" +" grant and revoke roles to any Ethereum account\n" +" pause and unpause the system\n" +" freeze and unfreeze the system\n" +" set governance parameters\n" +" upgrade system contracts" msgstr "" -#: src/views/home/components/Hero.tsx:49 -msgid "The total value of all RSR staked in the protocol" -msgstr "" - -#: src/views/home/components/Hero.tsx:39 -msgid "The total value of all RToken in circulation" -msgstr "" - -#: src/components/rtoken-setup/token/BackingForm.tsx:43 +#: src/components/rtoken-setup/token/BackingForm.tsx:47 msgid "The warmup period is how many seconds should pass after the basket regained the SOUND status before an RToken can be issued and/or a trade can be opened." msgstr "" -#: src/views/bridge/components/BridgeFaq.tsx:78 -msgid "There are network fees involved which are used to pay for the gas costs on Ethereum and Base. There are no additional fees." -msgstr "" - -#: src/views/yield-dtf/settings/components/FreezeManager.tsx:122 -msgid "There’s two freezing roles that put the system in the same state for different durations:" +#: src/views/yield-dtf/settings/components/freeze-manager.tsx:112 +msgid "There's two freezing roles that put the system in the same state for different durations:" msgstr "" -#: src/components/rtoken-setup/components/RolesEdit.tsx:42 +#: src/components/rtoken-setup/components/RolesEdit.tsx:36 msgid "This address already holds this role" msgstr "" -#: src/views/discover/components/yield/components/RegisterAbout.tsx:105 +#: src/views/discover/components/yield/components/RegisterAbout.tsx:112 msgid "This App" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/RegisterEdit.tsx:41 +#: src/views/discover/components/yield/components/RegisterAbout.tsx:115 +msgid "This app is an open source project developed and maintained by ABC Labs to interact with the Reserve Protocol and various DTFs deployed with the protocol." +msgstr "" + +#: src/views/yield-dtf/governance/views/proposal/components/RegisterEdit.tsx:32 msgid "This asset is already (being) registered" msgstr "" -#: src/components/field/index.tsx:27 +#: src/components/field/index.tsx:33 msgid "This field is required" msgstr "" -#: src/components/rtoken-setup/basket/PrimaryBasket.tsx:43 +#: src/components/rtoken-setup/basket/PrimaryBasket.tsx:57 msgid "This is the target collateral basket at the onset of an RToken that defines which collateral needs to be deposited for issuances. The prime basket is directly set by governance, and only changes through successful governance proposals." msgstr "" -#: src/views/bridge/components/BridgeFaq.tsx:92 -msgid "This seven day bridge duration is in place as a challenge period security measure built into the OP Stack." -msgstr "" - -#: src/components/rtoken-setup/token/TokenForm.tsx:27 -#: src/views/yield-dtf/deploy/components/TokenForm.tsx:26 +#: src/components/rtoken-setup/token/TokenForm.tsx:28 +#: src/views/index-dtf/settings/components/index-settings-basic.tsx:21 +#: src/views/yield-dtf/deploy/components/TokenForm.tsx:30 msgid "Ticker" msgstr "" -#: src/views/yield-dtf/deploy/components/TokenForm.tsx:28 +#: src/views/yield-dtf/deploy/components/TokenForm.tsx:32 msgid "Ticker - symbol eg. USD+" msgstr "" -#: src/components/transactions/table/index.tsx:88 -#: src/views/bridge/components/BridgeWithdrawals.tsx:16 -#: src/views/explorer/components/transactions/useTransactionColumns.tsx:105 -#: src/views/yield-dtf/overview/components/RTokenTransactions.tsx:137 +#: src/components/transactions/table/index.tsx:87 +#: src/views/explorer/components/transactions/useTransactionColumns.tsx:104 +#: src/views/yield-dtf/overview/components/rtoken-transactions.tsx:145 msgid "Time" msgstr "" -#: src/views/yield-dtf/settings/components/GovernanceInfo.tsx:75 +#: src/views/yield-dtf/settings/components/governance-info.tsx:62 msgid "Timelock address" msgstr "" -#: src/views/bridge/components/BridgeOutput.tsx:30 -msgid "To:" +#: src/views/index-dtf/settings/components/index-settings-governance.tsx:53 +msgid "Timelock Address" msgstr "" #: src/components/tables/ListedTokensTable.tsx:27 -#: src/views/explorer/components/governance/index.tsx:32 -#: src/views/explorer/components/tokens/index.tsx:158 -#: src/views/explorer/components/transactions/useTransactionColumns.tsx:47 -#: src/views/tokens/components/UnlistedTokensTable.tsx:68 +#: src/views/explorer/components/governance/index.tsx:38 +#: src/views/explorer/components/tokens/index.tsx:138 +#: src/views/explorer/components/transactions/useTransactionColumns.tsx:46 +#: src/views/tokens/components/UnlistedTokensTable.tsx:67 msgid "Token" msgstr "" -#: src/components/layout/navigation/TokenNavigation.tsx:221 -#: src/views/yield-dtf/settings/components/NavigationSidebar.tsx:11 +#: src/components/layout/navigation/TokenNavigation.tsx:194 +#: src/views/yield-dtf/settings/components/navigation-sidebar.tsx:10 msgid "Token details" msgstr "" -#: src/views/yield-dtf/settings/components/BasicInfo.tsx:19 +#: src/views/yield-dtf/settings/components/basic-info.tsx:13 msgid "Token Details" msgstr "" -#: src/views/yield-dtf/overview/components/CollateralPieChartTooltip.tsx:198 +#: src/views/yield-dtf/overview/components/collateral-pie-chart-tooltip.tsx:162 msgid "Token exposure" msgstr "" -#: src/components/rtoken-setup/token/TokenForm.tsx:18 -#: src/views/yield-dtf/deploy/components/TokenForm.tsx:16 +#: src/components/rtoken-setup/token/TokenForm.tsx:19 +#: src/views/yield-dtf/deploy/components/TokenForm.tsx:20 msgid "Token name" msgstr "" -#: src/views/yield-dtf/deploy/components/TokenForm.tsx:18 +#: src/views/yield-dtf/deploy/components/TokenForm.tsx:22 msgid "Token name - the name of the RToken eg. Savings Dollar" msgstr "" -#: src/components/rtoken-setup/token/TokenForm.tsx:23 -#: src/views/yield-dtf/deploy/components/TokenForm.tsx:22 +#: src/components/rtoken-setup/token/TokenForm.tsx:24 +#: src/views/yield-dtf/deploy/components/TokenForm.tsx:26 msgid "Token name required" msgstr "" -#: src/components/rtoken-setup/token/TokenForm.tsx:32 -#: src/views/yield-dtf/deploy/components/TokenForm.tsx:31 +#: src/components/rtoken-setup/token/TokenForm.tsx:33 +#: src/views/yield-dtf/deploy/components/TokenForm.tsx:35 msgid "Token ticker is required" msgstr "" -#: src/views/explorer/components/filters/TokenFilter.tsx:37 +#: src/views/explorer/components/filters/TokenFilter.tsx:36 msgid "Tokens" msgstr "" -#: src/views/yield-dtf/auctions/auctions-sidebar/RevenueAuctionItem.tsx:67 +#: src/views/yield-dtf/auctions/auctions-sidebar/RevenueAuctionItem.tsx:110 msgid "Tokens to match trade" msgstr "" -#: src/views/yield-dtf/governance/components/TopVoters.tsx:147 +#: src/views/yield-dtf/governance/components/TopVoters.tsx:141 msgid "Top voting addresses" msgstr "" @@ -2542,57 +2498,57 @@ msgstr "" msgid "Total % to arbitrary address" msgstr "" -#: src/components/rtoken-setup/basket/PrimaryBasket.tsx:128 +#: src/components/rtoken-setup/basket/PrimaryBasket.tsx:176 msgid "Total initial RToken scale including all targets. If your RToken only has one target unit this will be the same as the basket scale input." msgstr "" -#: src/views/yield-dtf/overview/components/hero/TokenStats.tsx:33 +#: src/views/yield-dtf/overview/components/hero/token-stats.tsx:32 msgid "Total Market Cap" msgstr "" -#: src/views/yield-dtf/staking/components/overview/StakingStats.tsx:47 +#: src/views/yield-dtf/staking/components/overview/staking-stats.tsx:54 msgid "Total RSR staked" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/TraderImplementationProposal.tsx:15 -#: src/views/yield-dtf/governance/views/proposal/components/TraderImplementationProposal.tsx:26 +#: src/views/yield-dtf/governance/views/proposal/components/TraderImplementationProposal.tsx:23 +#: src/views/yield-dtf/governance/views/proposal/components/TraderImplementationProposal.tsx:34 msgid "Trader contract address" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/TraderImplementationProposal.tsx:16 +#: src/views/yield-dtf/governance/views/proposal/components/TraderImplementationProposal.tsx:24 msgid "Trader contract for batch trades." msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/TraderImplementationProposal.tsx:27 +#: src/views/yield-dtf/governance/views/proposal/components/TraderImplementationProposal.tsx:35 msgid "Trader contract for Dutch trades." msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/TraderImplementationProposal.tsx:10 +#: src/views/yield-dtf/governance/views/proposal/components/TraderImplementationProposal.tsx:18 msgid "Trader implementations" msgstr "" -#: src/views/yield-dtf/settings/components/BackingInfo.tsx:45 +#: src/views/yield-dtf/settings/components/backing-info.tsx:32 msgid "Trading delay" msgstr "" -#: src/components/rtoken-setup/token/BackingForm.tsx:29 +#: src/components/rtoken-setup/token/BackingForm.tsx:33 msgid "Trading delay - how many seconds should pass after the basket has been changed, before a rebalancing trade is opened. Why does this matter? To avoid losses due to poor liquidity." msgstr "" -#: src/components/rtoken-setup/token/BackingForm.tsx:27 +#: src/components/rtoken-setup/token/BackingForm.tsx:31 msgid "Trading delay (s)" msgstr "" -#: src/views/yield-dtf/deploy/components/RTokenSetup.tsx:47 -#: src/views/yield-dtf/deploy/components/TransactionDivider.tsx:38 +#: src/views/yield-dtf/deploy/components/RTokenSetup.tsx:48 +#: src/views/yield-dtf/deploy/components/TransactionDivider.tsx:49 msgid "Transaction 1" msgstr "" -#: src/views/yield-dtf/deploy/components/RTokenSetup.tsx:72 +#: src/views/yield-dtf/deploy/components/RTokenSetup.tsx:64 msgid "Transaction 2" msgstr "" -#: src/hooks/useWatchTransaction.ts:52 +#: src/hooks/useWatchTransaction.ts:54 msgid "Transaction confirmed" msgstr "" @@ -2600,40 +2556,37 @@ msgstr "" msgid "Transaction failed" msgstr "" -#: src/hooks/useWatchTransaction.ts:69 +#: src/hooks/useWatchTransaction.ts:71 msgid "Transaction reverted" msgstr "" -#: src/components/transaction-modal/TransactionConfirmedModal.tsx:32 +#: src/components/transaction-modal/transaction-confirmed-modal.tsx:32 +#: src/components/transaction-modal/TransactionConfirmedModal.tsx:28 msgid "Transaction signed!" msgstr "" -#: src/views/yield-dtf/deploy/components/GovernanceOverview.tsx:39 -#: src/views/yield-dtf/governance/views/proposal/components/ConfirmProposalOverview.tsx:72 +#: src/views/yield-dtf/deploy/components/GovernanceOverview.tsx:43 +#: src/views/yield-dtf/governance/views/proposal/components/ConfirmProposalOverview.tsx:74 msgid "Transaction submitted" msgstr "" -#: src/components/layout/navigation/TokenNavigation.tsx:192 -#: src/views/explorer/components/transactions/index.tsx:94 -#: src/views/yield-dtf/overview/components/RTokenTransactions.tsx:213 +#: src/components/layout/navigation/TokenNavigation.tsx:165 +#: src/views/explorer/components/transactions/index.tsx:38 +#: src/views/yield-dtf/overview/components/rtoken-transactions.tsx:220 msgid "Transactions" msgstr "" -#: src/components/transactions/table/index.tsx:48 -#: src/views/explorer/components/transactions/useTransactionColumns.tsx:28 -#: src/views/yield-dtf/overview/components/RTokenTransactions.tsx:78 +#: src/components/transactions/table/index.tsx:47 +#: src/views/explorer/components/transactions/useTransactionColumns.tsx:27 +#: src/views/yield-dtf/overview/components/rtoken-transactions.tsx:75 msgid "Transfer" msgstr "" -#: src/components/layout/header/components/RegisterHelp.tsx:87 -msgid "Transfer RTokens between Ethereum, Base, and Arbitrum" +#: src/components/layout/header/components/app-navigation.tsx:104 +msgid "Transfer DTFs across chains" msgstr "" -#: src/views/bridge/components/BridgeFaq.tsx:41 -msgid "Transferring from Base to Ethereum takes approximately 7 days and requires 3 transactions." -msgstr "" - -#: src/views/yield-dtf/auctions/components/About.tsx:81 +#: src/views/yield-dtf/auctions/components/About.tsx:71 msgid "Trigger an Auction" msgstr "" @@ -2641,11 +2594,11 @@ msgstr "" msgid "Trigger melt" msgstr "" -#: src/views/yield-dtf/staking/components/UnstakeDelay.tsx:23 +#: src/views/yield-dtf/staking/components/unstake-delay.tsx:16 msgid "Trigger Unstake" msgstr "" -#: src/views/yield-dtf/issuance/components/zapV2/ZapToggle.tsx:32 +#: src/views/yield-dtf/issuance/components/zapV2/ZapToggle.tsx:23 msgid "Turn on Zaps to mint using 1 asset" msgstr "" @@ -2653,185 +2606,180 @@ msgstr "" msgid "Tutorial video" msgstr "" -#: src/views/earn/hooks/useEarnTableColumns.tsx:199 +#: src/views/earn/hooks/useEarnTableColumns.tsx:170 msgid "TVL" msgstr "" -#: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:50 +#: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:49 msgid "Tx 1" msgstr "" -#: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:54 +#: src/views/yield-dtf/deploy/components/NavigationSidebar.tsx:53 msgid "Tx 2" msgstr "" -#: src/views/yield-dtf/overview/components/RTokenTransactions.tsx:164 +#: src/views/yield-dtf/overview/components/rtoken-transactions.tsx:175 msgid "Tx Hash" msgstr "" -#: src/components/old/button/TransactionButton.tsx:126 -#: src/components/old/button/TransactionButton.tsx:166 +#: src/components/ui/transaction-button.tsx:140 +#: src/components/ui/transaction-button.tsx:200 msgid "Tx in process..." msgstr "" -#: src/views/explorer/components/filters/TransactionTypeFilter.tsx:37 +#: src/views/explorer/components/filters/TransactionTypeFilter.tsx:35 msgid "Tx Type" msgstr "" -#: src/views/yield-dtf/deploy/components/DeployOverview.tsx:137 +#: src/views/yield-dtf/deploy/components/DeployOverview.tsx:123 msgid "Tx1. RToken Deploy" msgstr "" -#: src/views/yield-dtf/deploy/components/GovernanceOverview.tsx:125 +#: src/views/yield-dtf/deploy/components/GovernanceOverview.tsx:120 msgid "Tx2. Governance" msgstr "" #: src/components/tables/ListedTokensTable.tsx:45 -#: src/views/tokens/components/UnlistedTokensTable.tsx:89 +#: src/views/tokens/components/UnlistedTokensTable.tsx:88 msgid "Txs" msgstr "" -#: src/components/transactions/table/index.tsx:67 -#: src/views/bridge/components/BridgeWithdrawals.tsx:19 -#: src/views/explorer/components/transactions/useTransactionColumns.tsx:69 -#: src/views/yield-dtf/overview/components/RTokenTransactions.tsx:97 +#: src/components/transactions/table/index.tsx:66 +#: src/views/explorer/components/transactions/useTransactionColumns.tsx:68 +#: src/views/yield-dtf/overview/components/rtoken-transactions.tsx:96 msgid "Type" msgstr "" -#: src/views/yield-dtf/overview/components/backing/PlatformExposure.tsx:64 +#: src/views/yield-dtf/overview/components/backing/platform-exposure.tsx:58 msgid "Underlying Platform Exposure" msgstr "" -#: src/views/yield-dtf/overview/components/backing/TokenExposure.tsx:96 +#: src/views/index-dtf/settings/components/index-settings-governance-token.tsx:25 +msgid "Underlying Token" +msgstr "" + +#: src/views/yield-dtf/overview/components/backing/token-exposure.tsx:90 msgid "Underlying Token Exposure" msgstr "" -#: src/components/layout/header/components/RegisterHelp.tsx:72 -msgid "Understand the Reserve Protocol." +#: src/components/layout/header/components/app-navigation.tsx:134 +msgid "Understand the project and protocols" msgstr "" -#: src/views/yield-dtf/settings/components/FreezeManager.tsx:107 +#: src/views/yield-dtf/settings/components/freeze-manager.tsx:103 msgid "Unfreeze" msgstr "" -#: src/views/yield-dtf/auctions/auctions-sidebar/RecollaterizationAlert.tsx:28 +#: src/views/yield-dtf/auctions/auctions-sidebar/RecollaterizationAlert.tsx:24 msgid "Unknown amount of recollateralization auctions left to run" msgstr "" -#: src/views/yield-dtf/settings/components/ListingInfo.tsx:30 +#: src/views/yield-dtf/settings/components/listing-info.tsx:43 msgid "Unpausing" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/UnregisterEdit.tsx:74 +#: src/views/yield-dtf/governance/views/proposal/components/UnregisterEdit.tsx:59 msgid "Unregister" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/UnregisterProposal.tsx:33 +#: src/views/yield-dtf/governance/views/proposal/components/UnregisterProposal.tsx:38 msgid "Unregister Assets" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/ProposedUnregisterPreview.tsx:25 +#: src/views/yield-dtf/governance/views/proposal/components/ProposedUnregisterPreview.tsx:29 msgid "Unregistering assets" msgstr "" -#: src/components/transactions/table/index.tsx:55 -#: src/views/explorer/components/transactions/useTransactionColumns.tsx:35 -#: src/views/yield-dtf/overview/components/RTokenTransactions.tsx:85 +#: src/components/transactions/table/index.tsx:54 +#: src/views/explorer/components/transactions/useTransactionColumns.tsx:34 +#: src/views/yield-dtf/overview/components/rtoken-transactions.tsx:82 msgid "Unstake" msgstr "" -#: src/views/explorer/components/transactions/useTransactionColumns.tsx:39 -#: src/views/yield-dtf/overview/components/RTokenTransactions.tsx:89 +#: src/views/explorer/components/transactions/useTransactionColumns.tsx:38 +#: src/views/yield-dtf/overview/components/rtoken-transactions.tsx:86 msgid "Unstake Cancelled" msgstr "" -#: src/views/yield-dtf/staking/components/unstake/UnstakeButton.tsx:36 +#: src/views/yield-dtf/staking/components/unstake/unstake-button.tsx:35 msgid "Unstake RSR" msgstr "" -#: src/views/yield-dtf/settings/components/OtherInfo.tsx:31 -#: src/views/yield-dtf/staking/components/overview/StakingStats.tsx:67 +#: src/views/yield-dtf/settings/components/other-info.tsx:22 +#: src/views/yield-dtf/staking/components/overview/staking-stats.tsx:73 msgid "Unstaking Delay" msgstr "" -#: src/components/rtoken-setup/token/OtherForm.tsx:62 +#: src/components/rtoken-setup/token/OtherForm.tsx:65 msgid "Unstaking delay - number of seconds that all RSR unstaking must be delayed in order to account for stakers trying to frontrun defaults and needs to be longer than \"governance\" for proper incentives for basket changes." msgstr "" -#: src/components/rtoken-setup/token/OtherForm.tsx:60 +#: src/components/rtoken-setup/token/OtherForm.tsx:63 msgid "Unstaking Delay (s)" msgstr "" -#: src/views/yield-dtf/staking/components/UnstakeDelay.tsx:64 +#: src/views/yield-dtf/staking/components/unstake-delay.tsx:55 msgid "Unstaking delay:" msgstr "" -#: src/views/yield-dtf/staking/components/overview/About.tsx:32 +#: src/views/yield-dtf/staking/components/overview/about.tsx:37 msgid "Unstaking RSR" msgstr "" -#: src/components/account/index.tsx:39 +#: src/components/account/index.tsx:44 msgid "Unsupported" msgstr "" -#: src/views/yield-dtf/issuance/components/wrapping/WrapTypeToggle.tsx:48 +#: src/views/yield-dtf/issuance/components/wrapping/WrapTypeToggle.tsx:29 msgid "Unwrap collaterals" msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/ContractUpgrades.tsx:140 +#: src/views/yield-dtf/governance/views/proposal/components/ContractUpgrades.tsx:141 msgid "Upgrade contract implementations to a newer version. This is usually performed for a protocol update or bugfix." msgstr "" -#: src/views/yield-dtf/governance/views/proposal/components/ContractUpgrades.tsx:125 +#: src/views/yield-dtf/governance/views/proposal/components/ContractUpgrades.tsx:126 msgid "Upgrade contracts" msgstr "" -#: src/views/explorer/components/transactions/useTransactionColumns.tsx:95 -#: src/views/yield-dtf/overview/components/RTokenTransactions.tsx:123 +#: src/views/explorer/components/transactions/useTransactionColumns.tsx:94 msgid "USD Value" msgstr "" -#: src/components/rtoken-setup/basket/CustomCollateral.tsx:139 +#: src/components/rtoken-setup/basket/CustomCollateral.tsx:135 msgid "Use a custom plugin contract address" msgstr "" -#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:41 +#: src/components/rtoken-setup/governance/GovernanceSetup.tsx:48 msgid "Use the Alexios governor format?" msgstr "" -#: src/views/discover/components/yield/components/RegisterAbout.tsx:128 +#: src/views/discover/components/yield/components/RegisterAbout.tsx:139 msgid "User Tracking" msgstr "" -#: src/components/rtoken-setup/basket/CustomCollateral.tsx:124 +#: src/components/rtoken-setup/basket/CustomCollateral.tsx:120 msgid "Validating..." msgstr "" -#: src/views/bridge/components/ProveWithdrawalButton.tsx:52 -msgid "Verify" -msgstr "" - -#: src/views/bridge/components/ProveWithdrawalButton.tsx:40 -msgid "Verifying" -msgstr "" - -#: src/views/yield-dtf/staking/components/stake/ConfirmStakeButton.tsx:72 +#: src/views/yield-dtf/staking/components/stake/confirm-stake-button.tsx:69 msgid "Verifying allowance..." msgstr "" -#: src/views/yield-dtf/staking/components/stake/ConfirmStakeButton.tsx:94 +#: src/views/yield-dtf/staking/components/stake/confirm-stake-button.tsx:91 msgid "Verifying transaction..." msgstr "" -#: src/components/rtoken-setup/basket/PluginItem.tsx:71 +#: src/components/rtoken-setup/basket/PluginItem.tsx:64 +#: src/views/index-dtf/settings/components/index-settings-basic.tsx:46 msgid "Version" msgstr "" -#: src/views/yield-dtf/settings/components/RolesView.tsx:63 +#: src/views/yield-dtf/settings/components/roles-view.tsx:60 msgid "View" msgstr "" -#: src/views/discover/components/yield/components/TokenList.tsx:27 +#: src/views/discover/components/yield/components/TokenList.tsx:31 msgid "View All" msgstr "" @@ -2839,21 +2787,23 @@ msgstr "" msgid "View All, including unlisted" msgstr "" -#: src/views/yield-dtf/staking/components/stake/ConfirmStakeButton.tsx:133 -#: src/views/yield-dtf/staking/components/unstake/ConfirmUnstakeButton.tsx:80 +#: src/views/yield-dtf/staking/components/stake/confirm-stake-button.tsx:131 +#: src/views/yield-dtf/staking/components/unstake/confirm-unstake-button.tsx:89 msgid "View in explorer" msgstr "" -#: src/components/transaction-modal/TransactionConfirmedModal.tsx:40 -#: src/views/yield-dtf/governance/views/proposal-detail/components/VoteModal.tsx:75 -msgid "View on etherscan" +#: src/components/transaction-modal/transaction-confirmed-modal.tsx:41 +#: src/components/transaction-modal/TransactionConfirmedModal.tsx:37 +#: src/views/index-dtf/governance/views/proposal/components/vote-modal.tsx:88 +#: src/views/yield-dtf/governance/views/proposal-detail/components/VoteModal.tsx:74 +msgid "View on" msgstr "" -#: src/views/yield-dtf/deploy/components/TransactionDivider.tsx:51 +#: src/views/yield-dtf/deploy/components/TransactionDivider.tsx:63 msgid "View on Etherscan" msgstr "" -#: src/views/tokens/components/UnlistedTokensTable.tsx:92 +#: src/views/tokens/components/UnlistedTokensTable.tsx:91 msgid "Volume (all time)" msgstr "" @@ -2861,163 +2811,149 @@ msgstr "" msgid "Volume (last 7d)" msgstr "" -#: src/views/yield-dtf/governance/views/proposal-detail/components/VoteModal.tsx:132 +#: src/views/index-dtf/governance/views/proposal/components/vote-modal.tsx:63 +#: src/views/index-dtf/governance/views/proposal/components/vote-modal.tsx:148 +#: src/views/yield-dtf/governance/views/proposal-detail/components/VoteModal.tsx:129 msgid "Vote" msgstr "" -#: src/views/yield-dtf/governance/views/proposal-detail/components/ProposalVote.tsx:189 +#: src/views/index-dtf/governance/views/proposal/components/proposal-vote-button.tsx:60 +#: src/views/yield-dtf/governance/views/proposal-detail/components/ProposalVote.tsx:170 msgid "Vote on-chain" msgstr "" -#: src/views/yield-dtf/governance/components/GovernanceOverview.tsx:122 +#: src/views/index-dtf/governance/components/governance-stats.tsx:79 +#: src/views/yield-dtf/governance/components/GovernanceOverview.tsx:132 msgid "Vote Supply" msgstr "" -#: src/views/yield-dtf/governance/components/TopVoters.tsx:110 +#: src/views/yield-dtf/governance/components/TopVoters.tsx:111 msgid "Vote weight" msgstr "" -#: src/views/yield-dtf/governance/components/TopVoters.tsx:106 +#: src/views/index-dtf/settings/components/index-settings-governance-token.tsx:18 +msgid "Vote-Lock DAO Token" +msgstr "" + +#: src/views/yield-dtf/governance/components/TopVoters.tsx:107 msgid "Votes" msgstr "" -#: src/views/yield-dtf/governance/views/proposal-detail/components/ProposalVotes.tsx:95 +#: src/views/yield-dtf/governance/views/proposal-detail/components/ProposalVotes.tsx:79 msgid "Votes against" msgstr "" -#: src/views/yield-dtf/governance/views/proposal-detail/components/ProposalVotes.tsx:81 +#: src/views/yield-dtf/governance/views/proposal-detail/components/ProposalVotes.tsx:68 msgid "Votes for" msgstr "" +#: src/views/index-dtf/governance/views/proposal/components/vote-modal.tsx:97 #: src/views/yield-dtf/governance/views/proposal-detail/components/VoteModal.tsx:83 msgid "Voting" msgstr "" -#: src/views/yield-dtf/governance/components/GovernanceOverview.tsx:132 +#: src/views/index-dtf/governance/components/governance-stats.tsx:84 +#: src/views/yield-dtf/governance/components/GovernanceOverview.tsx:142 msgid "Voting Addresses" msgstr "" -#: src/views/yield-dtf/governance/components/AccountVotes.tsx:61 +#: src/views/index-dtf/settings/components/index-settings-governance.tsx:60 +msgid "Voting Delay" +msgstr "" + +#: src/views/yield-dtf/governance/components/AccountVotes.tsx:60 msgid "Voting on the RToken you are staked on requires you to delegate your vote to yourself or another Eth address." msgstr "" -#: src/views/yield-dtf/settings/components/GovernanceInfo.tsx:51 +#: src/views/index-dtf/settings/components/index-settings-governance.tsx:65 +#: src/views/yield-dtf/settings/components/governance-info.tsx:42 msgid "Voting Period" msgstr "" -#: src/views/yield-dtf/governance/components/AccountVotes.tsx:84 -#: src/views/yield-dtf/governance/components/GovernanceOverview.tsx:86 +#: src/views/yield-dtf/governance/components/AccountVotes.tsx:83 +#: src/views/yield-dtf/governance/components/GovernanceOverview.tsx:103 msgid "Voting power" msgstr "" -#: src/views/yield-dtf/staking/components/stake/DelegateStake.tsx:29 +#: src/views/yield-dtf/staking/components/stake/delegate-stake.tsx:28 msgid "Voting power delegation" msgstr "" -#: src/views/bridge/components/WithdrawalInfoModal.tsx:59 -msgid "Wait 1 hour" +#: src/views/index-dtf/settings/components/index-settings-governance.tsx:81 +msgid "Voting Quorum" msgstr "" -#: src/views/bridge/components/WithdrawalInfoModal.tsx:66 -msgid "Wait 7 days" -msgstr "" - -#: src/views/yield-dtf/auctions/auctions-sidebar/RecollaterizationAlert.tsx:33 +#: src/views/yield-dtf/auctions/auctions-sidebar/RecollaterizationAlert.tsx:29 msgid "Wait to trigger revenue auctions until after recollateralization has finished." msgstr "" -#: src/views/explorer/components/transactions/Filters.tsx:17 +#: src/views/explorer/components/transactions/Filters.tsx:16 msgid "Wallet" msgstr "" -#: src/views/portfolio/components/Portfolio.tsx:155 +#: src/views/portfolio/components/Portfolio.tsx:135 msgid "Wallet staked RSR + RToken Value" msgstr "" -#: src/components/rtoken-setup/token/BackingForm.tsx:41 +#: src/components/rtoken-setup/token/BackingForm.tsx:45 msgid "Warmup period (s)" msgstr "" -#: src/views/discover/components/yield/components/DeployHero.tsx:97 +#: src/views/discover/components/yield/components/DeployHero.tsx:63 msgid "Watch an intro to RTokens" msgstr "" -#: src/views/discover/components/yield/components/RegisterAbout.tsx:32 -msgid "Welcome to Register - the user interface for registering, inspecting, and interacting with RTokens. \"RToken\" is the generic name given to asset-backed stablecoins created on the Reserve Protocol, the creation of which is entirely permissionless." -msgstr "" - -#: src/views/bridge/components/BridgeFaq.tsx:62 -msgid "What if I have a question, issue or problem?" -msgstr "" - -#: src/views/bridge/components/BridgeFaq.tsx:27 -msgid "What is Register L2 Bridge?" +#: src/views/discover/components/yield/components/RegisterAbout.tsx:39 +msgid "Welcome to Reserve — a platform for creating, exploring, and interacting with Decentralized Token Folios (“DTFs”). A DTF is the generic name given to any onchain asset-backed index. DTFs can be created on Reserve’s Yield Protocol or Index Protocol permissionlessly, by any person or entity." msgstr "" -#: src/views/yield-dtf/settings/components/ListingInfo.tsx:25 +#: src/views/yield-dtf/settings/components/listing-info.tsx:38 msgid "What is Reserve Governor Alexios?" msgstr "" -#: src/views/bridge/components/BridgeFaq.tsx:56 -msgid "What wallet can I use?" -msgstr "" - -#: src/views/yield-dtf/staking/components/overview/About.tsx:9 +#: src/views/yield-dtf/staking/components/overview/about.tsx:14 msgid "When staking RSR, you are putting your RSR at risk in the case of a collateral default in exchange for 1) the rights to govern the RToken and 2) for a portion of the revenue generated by the collateral. The revenue sent to the staked RSR pool will be distributed amongst RSR stakers proportionally to their stake in the pool." msgstr "" -#: src/views/yield-dtf/staking/components/overview/About.tsx:21 +#: src/views/yield-dtf/staking/components/overview/about.tsx:26 msgid "When you stake your RSR, you will receive a stRSR receipt token which represents your ownership in the staked RSR contract. As revenue is distributed, the receipt token will be redeemable for an increasing amount of RSR. If there is a default scenario where the staked RSR is slashed, then the receipt token will be redeemable for a decreased amount of RSR." msgstr "" -#: src/views/yield-dtf/staking/components/overview/About.tsx:34 +#: src/views/yield-dtf/staking/components/overview/about.tsx:39 msgid "When you unstake your stRSR, there will be a delay (defined by governance). This is to eliminate game theory scenarios that would make the backstop RSR staked pool less effective because people would continually be incentivized to unstake and restake." msgstr "" -#: src/views/discover/components/yield/components/RegisterAbout.tsx:59 -msgid "Whenever you see the term \"overcollateralization\", we're referring to the built-in defence mechanism included in RTokens that help protect their stability in the case of any of their backing assets defaulting." -msgstr "" - -#: src/views/discover/components/yield/components/RegisterAbout.tsx:40 -msgid "Whether you're an economist looking to improve the fiat standard, a DeFi-entrepreneur seeking to fill a gap in the market, or simply an innovator with a wild idea, anyone can create their own asset-backed currency." -msgstr "" - -#: src/views/bridge/components/BridgeFaq.tsx:90 -msgid "Why does it take seven days to withdraw?" +#: src/views/discover/components/yield/components/RegisterAbout.tsx:48 +msgid "Whether you’re an economist looking to improve the fiat standard, a DeFi entrepreneur seeking to fill a gap in the market, or simply an innovator with a wild idea, Reserve makes it easy to launch your own asset-backed index." msgstr "" -#: src/components/transactions/table/index.tsx:56 -#: src/components/transactions/table/index.tsx:58 -#: src/views/bridge/components/BridgeHeader.tsx:90 -#: src/views/explorer/components/transactions/useTransactionColumns.tsx:36 -#: src/views/explorer/components/transactions/useTransactionColumns.tsx:38 -#: src/views/yield-dtf/overview/components/RTokenTransactions.tsx:86 -#: src/views/yield-dtf/overview/components/RTokenTransactions.tsx:88 -#: src/views/yield-dtf/staking/components/withdraw/AvailableUnstake.tsx:77 +#: src/components/transactions/table/index.tsx:55 +#: src/components/transactions/table/index.tsx:57 +#: src/views/explorer/components/transactions/useTransactionColumns.tsx:35 +#: src/views/explorer/components/transactions/useTransactionColumns.tsx:37 +#: src/views/yield-dtf/overview/components/rtoken-transactions.tsx:83 +#: src/views/yield-dtf/overview/components/rtoken-transactions.tsx:85 +#: src/views/yield-dtf/staking/components/withdraw/available-unstake.tsx:78 msgid "Withdraw" msgstr "" -#: src/views/yield-dtf/staking/components/UnstakeDelay.tsx:46 +#: src/views/yield-dtf/staking/components/unstake-delay.tsx:32 msgid "Withdraw RSR" msgstr "" -#: src/views/yield-dtf/settings/components/BackingInfo.tsx:36 +#: src/views/yield-dtf/settings/components/backing-info.tsx:24 msgid "Withdrawal leak" msgstr "" -#: src/components/rtoken-setup/token/OtherForm.tsx:47 +#: src/components/rtoken-setup/token/OtherForm.tsx:50 msgid "Withdrawal leak (%)" msgstr "" -#: src/views/bridge/components/BridgeWithdrawals.tsx:41 -msgid "Withdrawal Transactions" -msgstr "" - -#: src/views/yield-dtf/auctions/components/useColumns.tsx:49 +#: src/views/yield-dtf/auctions/components/useColumns.tsx:48 msgid "Worst price" msgstr "" -#: src/views/yield-dtf/issuance/components/wrapping/WrapTypeToggle.tsx:35 +#: src/views/yield-dtf/issuance/components/wrapping/WrapTypeToggle.tsx:20 msgid "Wrap collaterals" msgstr "" @@ -3025,55 +2961,59 @@ msgstr "" msgid "Wrap/Unwrap collateral" msgstr "" -#: src/views/yield-dtf/issuance/components/wrapping/WrapSidebarHeader.tsx:21 +#: src/views/yield-dtf/issuance/components/wrapping/WrapSidebarHeader.tsx:14 msgid "Wrap/Unwrap Tokens" msgstr "" -#: src/views/yield-dtf/issuance/components/about/index.tsx:24 +#: src/views/yield-dtf/issuance/components/about/index.tsx:23 msgid "Wrapping collateral tokens" msgstr "" -#: src/components/rtoken-setup/token/ExternalRevenueSplit.tsx:132 +#: src/components/rtoken-setup/token/ExternalRevenueSplit.tsx:119 msgid "X" msgstr "" -#: src/views/yield-dtf/deploy/components/GovernanceOverview.tsx:135 -msgid "You can leave your RToken paused and come back to setting up governance later." +#: src/components/layout/header/components/app-navigation.tsx:108 +msgid "Yield DTF Creator" msgstr "" -#: src/views/bridge/components/BridgeFaq.tsx:57 -msgid "You can use popular Ethereum wallets like Metamask, Rabby, Coinbase Wallet, and Rainbow Wallet to name a few." +#: src/views/discover/components/yield/components/RegisterAbout.tsx:67 +msgid "Yield DTFs (created on the Reserve Yield Protocol) feature built-in overcollateralization — a defense mechanism that helps protect stability if any backing assets default." msgstr "" -#: src/views/yield-dtf/staking/components/unstake/UnstakeModal.tsx:32 +#: src/views/yield-dtf/deploy/components/GovernanceOverview.tsx:130 +msgid "You can leave your RToken paused and come back to setting up governance later." +msgstr "" + +#: src/views/yield-dtf/staking/components/unstake/unstake-modal.tsx:31 msgid "You receive:" msgstr "" -#: src/views/yield-dtf/deploy/components/RTokenSetup.tsx:48 +#: src/views/yield-dtf/deploy/components/RTokenSetup.tsx:49 msgid "You submit the transaction configuring your RToken design" msgstr "" -#: src/views/yield-dtf/staking/components/stake/StakeModal.tsx:34 -#: src/views/yield-dtf/staking/components/unstake/UnstakeModal.tsx:26 +#: src/views/yield-dtf/staking/components/stake/stake-modal.tsx:34 +#: src/views/yield-dtf/staking/components/unstake/unstake-modal.tsx:25 msgid "You use:" msgstr "" -#: src/views/yield-dtf/deploy/components/DeployOverview.tsx:151 +#: src/views/yield-dtf/deploy/components/DeployOverview.tsx:137 msgid "You will be the temporary owner until governance is deployed in transaction 2." msgstr "" -#: src/views/yield-dtf/staking/components/stake/StakeModal.tsx:41 -msgid "You’ll receive:" +#: src/views/yield-dtf/staking/components/stake/stake-modal.tsx:41 +msgid "You'll receive:" msgstr "" -#: src/views/portfolio/components/Portfolio.tsx:183 +#: src/views/portfolio/components/Portfolio.tsx:152 msgid "Your RTokens" msgstr "" -#: src/views/yield-dtf/staking/components/StakePosition.tsx:25 +#: src/views/yield-dtf/staking/components/stake-position.tsx:29 msgid "Your stake position" msgstr "" -#: src/views/portfolio/components/Portfolio.tsx:193 +#: src/views/portfolio/components/Portfolio.tsx:158 msgid "Your staked RSR" msgstr "" diff --git a/src/setup-tests.ts b/src/setup-tests.ts new file mode 100644 index 000000000..ec9e34b80 --- /dev/null +++ b/src/setup-tests.ts @@ -0,0 +1,49 @@ +import '@testing-library/jest-dom' +import { vi } from 'vitest' + +// Mock @lingui/macro to avoid babel-plugin-macros CommonJS issues +vi.mock('@lingui/macro', () => ({ + t: (strings: TemplateStringsArray) => strings.join(''), + Trans: ({ children }: { children: React.ReactNode }) => children, + Plural: () => null, + Select: () => null, + SelectOrdinal: () => null, + defineMessage: (msg: any) => msg, +})) + +// Mock window.matchMedia for components that use media queries +Object.defineProperty(window, 'matchMedia', { + writable: true, + value: (query: string) => ({ + matches: false, + media: query, + onchange: null, + addListener: () => {}, + removeListener: () => {}, + addEventListener: () => {}, + removeEventListener: () => {}, + dispatchEvent: () => false, + }), +}) + +// Mock ResizeObserver for components that use it +global.ResizeObserver = class ResizeObserver { + observe() {} + unobserve() {} + disconnect() {} +} + +// Mock IntersectionObserver for components that use it +global.IntersectionObserver = class IntersectionObserver { + root = null + rootMargin = '' + thresholds = [] + + constructor() {} + observe() {} + unobserve() {} + disconnect() {} + takeRecords() { + return [] + } +} diff --git a/src/setupTests.ts b/src/setupTests.ts deleted file mode 100644 index 52aaef1d2..000000000 --- a/src/setupTests.ts +++ /dev/null @@ -1,5 +0,0 @@ -// jest-dom adds custom jest matchers for asserting on DOM nodes. -// allows you to do things like: -// expect(element).toHaveTextContent(/react/i) -// learn more: https://github.com/testing-library/jest-dom -import '@testing-library/jest-dom' diff --git a/src/state/chain/atoms/transactionAtoms.ts b/src/state/chain/atoms/transactionAtoms.ts deleted file mode 100644 index 189300623..000000000 --- a/src/state/chain/atoms/transactionAtoms.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { atom } from 'jotai' -import { atomWithStorage } from 'jotai/utils' -import { ReactNode } from 'react' -import { chainIdAtom, walletAtom } from 'state/atoms' -import { getCurrentTime } from 'utils' -import { Address, Hex } from 'viem' - -export interface TransactionState { - hash: Hex - label: string - status: 'loading' | 'success' | 'error' - timestamp: number // unix utc timestamp - block?: number // block mined at - chainId: number - account: Address -} - -// TODO: Check tx status on mount -// TODO: Only store last 50 txs -export const transactionHistoryAtom = atomWithStorage<{ - [x: Hex]: TransactionState -}>('txHistory', {}) - -// Get current txs for wallet&chain -export const currentTxHistoryAtom = atom((get) => { - const history = get(transactionHistoryAtom) - const account = get(walletAtom) - const chainId = get(chainIdAtom) - - return Object.values(history) - .filter((tx) => tx.chainId === chainId && tx.account === account) - .sort((a, b) => b.timestamp - a.timestamp) -}) - -export const addTransactionAtom = atom( - null, - (get, set, [hash, label, status = 'loading']: [Hex, ReactNode, string?]) => { - const account = get(walletAtom) - - if (account && !get(transactionHistoryAtom)[hash]) { - const chainId = get(chainIdAtom) - - try { - set(transactionHistoryAtom, { - ...get(transactionHistoryAtom), - [hash]: { - hash, - label, - timestamp: getCurrentTime(), - chainId, - account, - status, - }, - }) - } catch (e) { - console.error('Error adding transaction', e) - } - } - } -) - -export const updateTransactionAtom = atom( - null, - (get, set, [hash, status, block]: [Hex, 'success' | 'error', number?]) => { - const history = get(transactionHistoryAtom) - - if (history[hash]) { - try { - set(transactionHistoryAtom, { - ...history, - [hash]: { ...history[hash], status, block }, - }) - } catch (e) { - console.error('Error updating transaction', e) - } - } - } -) - -// Can only have 1 running tx at the time, so only check last one -export const isTransactionRunning = atom( - (get) => get(currentTxHistoryAtom)[0]?.status === 'loading' -) diff --git a/src/state/chain/index.tsx b/src/state/chain/index.tsx index a311c44cd..d6592e65d 100644 --- a/src/state/chain/index.tsx +++ b/src/state/chain/index.tsx @@ -8,13 +8,10 @@ import { import '@rainbow-me/rainbowkit/styles.css' import { bitgetWallet, - braveWallet, coinbaseWallet, injectedWallet, ledgerWallet, - metaMaskWallet, rabbyWallet, - rainbowWallet, safeWallet, walletConnectWallet, } from '@rainbow-me/rainbowkit/wallets' @@ -30,16 +27,13 @@ const connectors = connectorsForWallets( groupName: 'Recommended', wallets: [ injectedWallet, - metaMaskWallet, walletConnectWallet, coinbaseWallet, - braveWallet, bitgetWallet, binanceWallet, rabbyWallet, safeWallet, ledgerWallet, - rainbowWallet, ], }, ], diff --git a/src/state/geolocation/DisabledByGeolocationMessage.tsx b/src/state/geolocation/DisabledByGeolocationMessage.tsx index f7dbdae6e..31c40cf42 100644 --- a/src/state/geolocation/DisabledByGeolocationMessage.tsx +++ b/src/state/geolocation/DisabledByGeolocationMessage.tsx @@ -1,9 +1,13 @@ import AlertIcon from 'components/icons/AlertIcon' import { useAtomValue } from 'jotai' import { isRTokenMintEnabled } from 'state/geolocation/atoms' -import { Box, BoxProps, Text } from 'theme-ui' +import { cn } from '@/lib/utils' -const DisabledByGeolocationMessage = ({ sx, ...props }: BoxProps) => { +interface Props { + className?: string +} + +const DisabledByGeolocationMessage = ({ className }: Props) => { const isEnabled = useAtomValue(isRTokenMintEnabled) if (isEnabled.loading || isEnabled.value) { @@ -11,14 +15,10 @@ const DisabledByGeolocationMessage = ({ sx, ...props }: BoxProps) => { } return ( - +
- This feature is not available - + This feature is not available +
) } diff --git a/src/state/rtoken/updaters/RTokenGovernanceUpdater.tsx b/src/state/rtoken/updaters/RTokenGovernanceUpdater.tsx index 32e3a50b1..672d3033d 100644 --- a/src/state/rtoken/updaters/RTokenGovernanceUpdater.tsx +++ b/src/state/rtoken/updaters/RTokenGovernanceUpdater.tsx @@ -1,6 +1,6 @@ import GovernanceAnastasius from 'abis/GovernanceAnastasius' import { gql } from 'graphql-request' -import useQuery from 'hooks/useQuery' +import useQuery from 'hooks/use-query' import useRToken from 'hooks/useRToken' import { useAtomValue, useSetAtom } from 'jotai' import { useEffect, useMemo } from 'react' diff --git a/src/state/updaters/CollateralYieldUpdater.tsx b/src/state/updaters/CollateralYieldUpdater.tsx index da15bbe5c..fd4cb572f 100644 --- a/src/state/updaters/CollateralYieldUpdater.tsx +++ b/src/state/updaters/CollateralYieldUpdater.tsx @@ -1,7 +1,7 @@ +import { useQuery } from '@tanstack/react-query' import { useAtom } from 'jotai' import { useEffect } from 'react' import { CollateralYieldByChain, collateralYieldAtom } from 'state/atoms' -import useSWRImmutable from 'swr/immutable' import { ChainId } from 'utils/chains' import { supportedChainList } from 'utils/constants' @@ -112,9 +112,11 @@ export const symbolMap: Record> = Object.entries( const CollateralYieldUpdater = () => { const [collateralYield, setCollateralYield] = useAtom(collateralYieldAtom) - const { data } = useSWRImmutable('https://yields.llama.fi/pools', (...args) => - fetch(...args).then((res) => res.json()) - ) + const { data } = useQuery({ + queryKey: ['collateral-yields'], + queryFn: () => fetch('https://yields.llama.fi/pools').then((res) => res.json()), + staleTime: 1000 * 60 * 60, // 1 hour - mimics useSWRImmutable behavior + }) useEffect(() => { if (data?.data) { const yields: CollateralYieldByChain = { diff --git a/src/state/wallet/updaters/AccountUpdater.tsx b/src/state/wallet/updaters/AccountUpdater.tsx index b6aa06dcc..f8c221444 100644 --- a/src/state/wallet/updaters/AccountUpdater.tsx +++ b/src/state/wallet/updaters/AccountUpdater.tsx @@ -1,5 +1,5 @@ import { gql } from 'graphql-request' -import { useMultichainQuery } from 'hooks/useQuery' +import { useMultichainQuery } from 'hooks/use-query' import { useAtomValue, useSetAtom } from 'jotai' import { useEffect } from 'react' import { getAddress } from 'viem' diff --git a/src/test-utils.tsx b/src/test-utils.tsx new file mode 100644 index 000000000..381b5a1c6 --- /dev/null +++ b/src/test-utils.tsx @@ -0,0 +1,63 @@ +import { QueryClient, QueryClientProvider } from '@tanstack/react-query' +import { render, RenderOptions } from '@testing-library/react' +import { Provider as JotaiProvider } from 'jotai' +import { ReactElement, ReactNode } from 'react' + +/** + * Creates a QueryClient configured for testing: + * - No retries (fail fast) + * - No caching (isolated tests) + */ +export function createTestQueryClient() { + return new QueryClient({ + defaultOptions: { + queries: { + retry: false, + gcTime: 0, + staleTime: 0, + }, + mutations: { + retry: false, + }, + }, + }) +} + +interface WrapperProps { + children: ReactNode +} + +/** + * Creates a wrapper component with all providers needed for testing. + * Each test gets a fresh QueryClient instance. + */ +export function createWrapper() { + const queryClient = createTestQueryClient() + + return function Wrapper({ children }: WrapperProps) { + return ( + + + {children} + + + ) + } +} + +/** + * Custom render function that wraps component with all providers. + * Use this instead of @testing-library/react's render. + */ +function customRender( + ui: ReactElement, + options?: Omit +) { + return render(ui, { wrapper: createWrapper(), ...options }) +} + +// Re-export everything from testing-library +export * from '@testing-library/react' + +// Override render with our custom version +export { customRender as render } diff --git a/src/theme.ts b/src/theme.ts index 43a056b8c..36282fdc2 100644 --- a/src/theme.ts +++ b/src/theme.ts @@ -1,661 +1,13 @@ -import type { Theme } from 'theme-ui' import 'react-loading-skeleton/dist/skeleton.css' import './app.css' -export const boxShadow = '0px 10px 20px var(--theme-ui-colors-shadow)' -export const transition = 'all .2s ease' -export const centeredContent = { - display: 'flex', - alignItems: 'center', - justifyContent: 'center', - flexDirection: 'column', -} -export const borderRadius = { - inputs: 8, - boxes: 20, - inner: '6px', -} -export const baseButton = { - borderRadius: borderRadius.inputs, - fontWeight: 500, - cursor: 'pointer', - color: '#fff', - backgroundColor: 'primary', - padding: '12px 16px', - - '&:hover': { - filter: 'brightness(0.85)', - }, - '&:disabled': { - backgroundColor: 'disabled', - cursor: 'default', - color: '#484848', - border: 'none', - }, -} - -const baseBadge = { - color: 'text', - backgroundColor: 'border', - fontWeight: 700, - borderRadius: 30, - padding: '6px 14px', -} - -export const baseInput = { - fontFamily: 'body', - borderColor: 'inputBorder', - backgroundColor: 'background', - outline: 'none', - padding: '14px', - paddingLeft: '16px', - borderRadius: borderRadius.inputs, - mozAppearance: 'none', - webkitAppearance: 'none', - '&:disabled': { - backgroundColor: 'border', - borderColor: 'secondary', - cursor: 'default', - }, - '&:hover': { - backgroundColor: 'background', - }, - '&:focus': { - backgroundColor: 'background', - }, -} - -export const smallButton = { - fontSize: 1, - paddingTop: 1, - paddingBottom: 1, - paddingLeft: '10px', - paddingRight: '10px', - borderRadius: 6, -} - -export const mediumButton = { - padding: ['4px 10px 4px 10px', '12px 16px 12px 16px'], - fontSize: [1, 2], - borderRadius: borderRadius.inputs, -} - +// Legacy color values for icon colors only +// TODO: Migrate to CSS variables export const colors = { - base: '#2852F5', - text: '#292929', - shadow: 'rgba(0, 0, 0, 0.05)', - invertedText: '#FFFFFF', - secondaryText: '#666666', - lightText: '#808080', - background: '#FEFBF8', - backgroundNested: '#FEFBF8', - focusedBackground: '#FFFFFF', - cardBackground: '#FEFBF8', - inputBackground: '#E5E5E5', - inputAlternativeBackground: '#f2f2f2', - // contentBackground: '#F9F8F4', - lightGrey: '#f2f2f2', - focusBox: '#f2f2f2', - contentBackground: '#F9EDDD', - reserveBackground: '#F9EDDD', - contentLightBackground: 'rgba(249, 248, 244, 0.5)', - primary: '#015FCB', success: '#11BB8D', - accentAction: '#106D46', - accentBG: '#E5EDF7', - accentText: '#00814B', - secondary: '#E8E8E8', - secondaryBackground: '#E5E5E5', - rBlue: '#2150A9', // TODO: Remove in favor for accent - accent: '#2150A9', - accentInverted: '#2150A9', // Change to white on darkmode - rBlueLight: '#DBE3F1', - border: '#E5E5E5', - borderFocused: '#F8EDDA', - borderSecondary: '#E5E5E5', - darkBorder: '#E0D5C7', - inputBorder: '#D5D5D5', - info: '#20678E', - infoBG: 'rgba(32, 103, 142, 0.15)', - disabled: '#D9D9D9', + accentInverted: '#2150A9', + primary: '#015FCB', danger: '#FF0000', - dangerBG: 'rgba(255, 0, 0, 0.15)', - muted: '#D9D9D9', - warning: '#FF8A00', - modalOverlay: 'rgba(0, 0, 0, 0.2)', - cardAlternative: '#fff', - diva: '#A71EFE', - divaBorder: 'rgba(180, 34, 252, 0.16)', - divaBackground: 'rgba(167, 30, 254, 0.12)', rebalancing: '#FF8A00', - progressBar: 'white', - progressBarBackground: 'black', - bgIcon: '#F2F2F2', - modes: { - dark: { - accentInverted: '#fff', - text: '#E4DEDE', - shadow: 'rgba(0, 0, 0, 0.2)', - rBlueLight: '#0D1321', - secondaryText: '#969696', - invertedText: '#171515', - lightText: '#6F6666', - background: '#0C0F12', - reserveBackground: '#171311', - contentBackground: '#000', - secondaryBackground: '#020303', - contentLightBackground: 'rgba(15, 14, 13, 0.5)', - primary: '#015FCB', - secondary: '#040506', - backgroundNested: '#11171D', - focusedBackground: '#0B0E14', - cardBackground: '#11171D', - focusBox: '#000', - inputBackground: '#000000', - inputAlternativeBackground: '#000000', - disabled: '#242424', - accentAction: '#015fcb', - accentBG: '#0A1A2B', - border: '#212631', - borderFocused: '#181D25', - borderSecondary: '#181D25', - darkBorder: '#181D25', - inputBorder: '#181D25', - success: '#75FBC3', - info: '#20678E', - infoBG: 'rgba(32, 103, 142, 0.4)', - danger: '#FF0000', - dangerBG: 'rgba(255, 0, 0, 0.4)', - muted: '#020303', - warning: '#FF7A00', - modalOverlay: 'rgba(20, 20, 20, 0.6)', - cardAlternative: '#11171D', - diva: '#A71EFE', - divaBorder: 'rgba(180, 34, 252, 0.16)', - divaBackground: 'rgba(167, 30, 254, 0.12)', - rebalancing: '#FF8A00', - progressBar: 'black', - progressBarBackground: 'white', - bgIcon: '#1E1E1E', - }, - }, -} - -export const theme: Theme = { - breakpoints: ['52em', '64em', '72em', '100em'], - space: [0, 4, 8, 16, 24, 32, 40, 48, 80, 256], // 0-9 - fonts: { - body: 'TWK Lausanne, sans-serif, -apple-system, BlinkMacSystemFont', - // heading: 'inherit', - monospace: 'Menlo, monospace', - fontDisplay: 'swap', - }, - fontSizes: [12, 14, 16, 20, 24, 32, 48, 56, 96], - fontWeights: { - body: 300, - heading: 500, - bold: 700, - }, - lineHeights: { - body: 1.5, - heading: 1.125, - }, - colors, - text: { - heading: { - // fontFamily: 'heading', - lineHeight: 'heading', - fontWeight: 'heading', - }, - subtitle: { - fontSize: 2, - display: 'block', - color: 'secondaryText', - }, - title: { - fontSize: 3, - fontWeight: 500, - display: 'block', - }, - sectionTitle: { - fontSize: 4, - fontWeight: 700, - display: 'block', - }, - pageTitle: { - fontSize: 5, - fontWeight: 600, - letterSpacing: '0.01em', - display: 'block', - }, - contentTitle: { - color: 'lightText', - display: 'block', - fontSize: 1, - }, - strong: { - fontWeight: 500, - display: 'block', - }, - bold: { - fontWeight: 700, - display: 'block', - }, - primary: { - color: 'text', - }, - warning: { - color: 'warning', - }, - error: { - color: 'danger', - }, - legend: { - color: 'secondaryText', - }, - accent: { - color: 'accent', - }, - muted: { - color: 'muted', - }, - a: { - transition, - color: 'lightText', - textDecoration: 'underline', - cursor: 'pointer', - '&:hover': { - color: 'text', - }, - }, - }, - styles: { - a: { - transition, - color: 'lightText', - textDecoration: 'none', - cursor: 'pointer', - '&:hover': { - color: 'text', - }, - }, - root: { - fontFamily: 'body', - lineHeight: 'body', - fontWeight: 'body', - color: 'text', - }, - hr: { - borderColor: 'border', - }, - h1: { - variant: 'text.heading', - fontSize: 5, - }, - h2: { - variant: 'text.heading', - fontWeight: 500, - color: 'red', - fontSize: 4, - }, - h3: { - variant: 'text.heading', - fontSize: 3, - }, - h4: { - variant: 'text.heading', - fontSize: 2, - }, - h5: { - variant: 'text.heading', - fontSize: 1, - }, - h6: { - variant: 'text.heading', - fontSize: 0, - }, - pre: { - fontFamily: 'monospace', - overflowX: 'auto', - code: { - color: 'inherit', - }, - }, - code: { - fontFamily: 'monospace', - fontSize: 'inherit', - }, - table: { - margin: 0, - borderCollapse: 'separate', - fontSize: 1, - lineHeight: '16px', - textAlign: 'left', - width: '100%', - position: 'relative', - overflow: 'auto', - borderSpacing: '0 14px', - display: 'flex', - flexDirection: 'column', - - p: { - m: 0, - }, - pre: { - mt: 2, - mb: 0, - }, - }, - th: { - border: 'none', - px: [3, 4], - color: 'secondaryText', - // pl: 3, - fontWeight: 'normal', - }, - tbody: { - 'tr:last-of-type': { - borderBottom: 0, - }, - display: 'table', - width: '100%', - }, - thead: { - display: 'table', - width: '100%', - color: 'lightText', - marginBottom: -20, - }, - td: { - py: [3, 4], - px: [3, 4], - borderBottom: 0, - - '&:first-of-type': { - borderTopLeftRadius: borderRadius.boxes, - borderBottomLeftRadius: borderRadius.boxes, - }, - '&:last-of-type': { - borderTopRightRadius: borderRadius.boxes, - borderBottomRightRadius: borderRadius.boxes, - }, - }, - tdgroup: { - lineHeight: '24px', - background: '#fafbfc', - whiteSpace: 'nowrap', - py: 3, - fontWeight: 'bold', - // fontFamily: 'monospace', - flexDirection: 'row', - alignItems: 'center', - }, - tr: { - backgroundColor: 'contentBackground', - // borderBottom: (t: Theme) => ` 1px solid ${t.colors?.shadow}`, - }, - }, - forms: { - input: { - ...baseInput, - }, - smallInput: { - ...baseInput, - padding: '6px', - paddingLeft: '6px', - }, - checkbox: { - mozAppearance: 'none', - webkitAppearance: 'none', - outline: 'none', - 'input:focus ~ &': { - bg: 'transparent', - backgroundColor: 'transparent', - }, - }, - radio: { - mozAppearance: 'none', - webkitAppearance: 'none', - outline: 'none', - 'input:focus ~ &': { - bg: 'transparent', - backgroundColor: 'transparent', - }, - }, - select: { - ...baseInput, - backgroundColor: 'background', - }, - inputError: { - ...baseInput, - borderColor: 'danger', - color: 'danger', - }, - textarea: { - ...baseInput, - fontFamily: 'inherit', - fontSize: 'inherit', - }, - transparent: { - fontFamily: 'body', - padding: 0, - outline: 'none', - border: 'none', - backgroundColor: 'transparent', - mozAppearance: 'none', - webkitAppearance: 'none', - fontWeight: 700, - fontSize: 4, - }, - }, - cards: { - primary: { - borderRadius: borderRadius.boxes, - padding: 3, - backgroundColor: 'contentBackground', - }, - form: { - borderRadius: borderRadius.boxes, - padding: 3, - border: '3px solid', - borderColor: 'borderFocused', - backgroundColor: 'contentBackground', - }, - inner: { - borderRadius: borderRadius.boxes, - padding: 0, - width: '100%', - height: 'fit-content', - backgroundColor: 'backgroundNested', - }, - section: { - borderRadius: 0, - padding: 4, - width: '100%', - background: 'background', - ':hover': { - background: 'border', - }, - }, - }, - buttons: { - primary: baseButton, - blue: { - ...baseButton, - backgroundColor: 'rBlue', - }, - accent: { - ...baseButton, - backgroundColor: 'accent', - }, - accentAction: { - ...baseButton, - backgroundColor: 'accentBG', - color: 'accent', - fontWeight: 600, - borderRadius: borderRadius.inner, - '&:hover': { - fontWeight: 600, - backgroundColor: 'primary', - color: 'invertedText', - }, - }, - bordered: { - ...baseButton, - outline: '2px solid', - borderColor: 'primary', - color: 'accentInverted', - backgroundColor: 'transparent', - '&:hover': { - backgroundColor: 'focusedBackground', - }, - }, - transparent: { - ...baseButton, - backgroundColor: 'transparent', - border: '1px solid', - borderColor: 'inputBorder', - color: 'text', - '&:hover': { - borderColor: 'text', - }, - }, - hover: { - ...baseButton, - backgroundColor: 'transparent', - border: '1px solid', - borderColor: 'transparent', - - color: 'text', - '&:hover': { - backgroundColor: 'border', - }, - }, - muted: { - ...baseButton, - backgroundColor: 'secondary', - color: 'text', - }, - danger: { - ...baseButton, - backgroundColor: 'dangerBG', - color: 'danger', - }, - error: { - ...baseButton, - '&:disabled': { - backgroundColor: 'disabled', - cursor: 'default', - color: 'danger', - }, - }, - circle: { - ...baseButton, - backgroundColor: 'background', - border: '1px solid', - borderColor: 'border', - color: 'text', - display: 'flex', - borderRadius: '6px', - alignContent: 'center', - alignItems: 'center', - textAlign: 'center', - height: 28, - width: 28, - paddingLeft: 1, - paddingRight: 1, - padding: 1, - }, - }, - badges: { - primary: baseBadge, - muted: { - ...baseBadge, - color: 'text', - backgroundColor: 'focusedBackground', - border: '2px solid', - borderColor: 'border', - }, - info: { - ...baseBadge, - color: 'primary', - backgroundColor: 'focusedBackground', - border: '2px dashed', - borderColor: 'border', - }, - danger: { - ...baseBadge, - color: 'danger', - backgroundColor: 'backgroundNested', - border: '2px solid', - borderColor: 'border', - }, - success: { - ...baseBadge, - color: 'success', - backgroundColor: 'focusedBackground', - border: '2px solid', - borderColor: 'border', - }, - }, - layout: { - wrapper: { - maxWidth: '95em', - marginLeft: 'auto', - marginRight: 'auto', - }, - container: { - boxSizing: 'border-box', - flexShrink: 0, - paddingX: [1, 3], - paddingY: [1, 6], - }, - containerCompact: { - boxSizing: 'border-box', - flexShrink: 0, - paddingX: [1, 6, 6, 8], - paddingY: [1, 6], - }, - borderBox: { - border: '1px solid', - borderColor: 'border', - borderRadius: borderRadius.boxes, - padding: 4, - }, - card: { - backgroundColor: 'contentBackground', - borderRadius: borderRadius.boxes, - }, - centered: { - ...centeredContent, - flexDirection: 'column', - }, - verticalAlign: { - display: 'flex', - alignItems: 'center', - }, - sticky: { - position: 'sticky', - top: 0, - }, - stickyNoHeader: { - position: 'sticky', - top: ['72px', '96px', '112px'], - }, - square: { - marginX: 1, - height: '4px', - width: '4px', - backgroundColor: 'lightText', - }, - tokenView: { - width: '100%', - p: [1, 4], - }, - sectionDivider: { - mx: [-1, -3, -3, -3, -6], - my: [3, 5], - borderColor: 'border', - }, - }, + secondaryText: '#666666', } diff --git a/src/views/bridge/index.tsx b/src/views/bridge/index.tsx index 25707fee7..ad2bb6874 100644 --- a/src/views/bridge/index.tsx +++ b/src/views/bridge/index.tsx @@ -1,5 +1,5 @@ import ChainLogo from '@/components/icons/ChainLogo' -import CopyValue from '@/components/old/button/CopyValue' +import CopyValue from '@/components/ui/copy-value' import TokenLogo from '@/components/token-logo' import StackTokenLogo from '@/components/token-logo/stack-token-logo' import { Button } from '@/components/ui/button' diff --git a/src/views/discover/components/historical-tvl-chart.tsx b/src/views/discover/components/historical-tvl-chart.tsx new file mode 100644 index 000000000..18b801ce9 --- /dev/null +++ b/src/views/discover/components/historical-tvl-chart.tsx @@ -0,0 +1,122 @@ +import { devModeAtom } from '@/state/atoms' +import { ChainId } from '@/utils/chains' +import ChainLogo from 'components/icons/ChainLogo' +import SmallRootIcon from 'components/icons/SmallRootIcon' +import { useAtomValue } from 'jotai' +import { + Area, + AreaChart, + ResponsiveContainer, + Tooltip, + XAxis, + YAxis, +} from 'recharts' +import { formatCurrency } from 'utils' +import { CHAIN_TO_NETWORK, NETWORKS, capitalize } from 'utils/constants' + +const COLORS: Record = { + ethereum: { + fill: 'hsl(var(--tvl))', + stroke: 'hsl(var(--tvl))', + }, + base: { + fill: 'hsl(var(--tvl))', + stroke: 'hsl(var(--tvl))', + }, + arbitrum: { + fill: 'hsl(var(--tvl))', + stroke: 'hsl(var(--tvl))', + }, + bsc: { + fill: 'hsl(var(--tvl))', + stroke: 'hsl(var(--tvl))', + }, +} + +function CustomTooltip({ payload, label, active }: any) { + if (!active || !payload) return null + + const total = payload?.reduce( + (acc: number, item: { value: number }) => acc + item.value, + 0 + ) + + return ( +
+
+ + {new Date(label).toDateString().replace(/^\S+\s/, '')} + + (TVL per network) +
+
+ {(payload as any[]).map( + (item: { name: string; value: number }, index) => ( +
+
+ + {capitalize(item.name)}: +
+ ${formatCurrency(item.value, 0)} +
+ ) + )} +
+
+
+ + Total TVL: +
+ + ${formatCurrency(total, 0)} + +
+
+ ) +} + +interface HistoricalTVLChartProps { + tvlTimeseries?: Array> +} + +const HistoricalTVLChart = ({ tvlTimeseries }: HistoricalTVLChartProps) => { + const isDevMode = useAtomValue(devModeAtom) + const networks = Object.values(NETWORKS).filter( + (n) => isDevMode || n !== ChainId.BSC + ) + + return ( + + + + + } /> + {networks.map((network) => ( + + ))} + + + ) +} + +export default HistoricalTVLChart diff --git a/src/views/discover/components/historical-tvl.tsx b/src/views/discover/components/historical-tvl.tsx index 04702f5af..5c740f298 100644 --- a/src/views/discover/components/historical-tvl.tsx +++ b/src/views/discover/components/historical-tvl.tsx @@ -1,37 +1,43 @@ import { Button } from '@/components/ui/button' import { Skeleton } from '@/components/ui/skeleton' import { trackClick } from '@/hooks/useTrackPage' -import { devModeAtom } from '@/state/atoms' -import { ChainId } from '@/utils/chains' -import ChainLogo from 'components/icons/ChainLogo' -import SmallRootIcon from 'components/icons/SmallRootIcon' -import { useAtomValue } from 'jotai' import { ArrowRight, Clapperboard, Play } from 'lucide-react' -import { useState } from 'react' +import { lazy, Suspense, useState } from 'react' import { Link } from 'react-router-dom' -import { - Area, - AreaChart, - ResponsiveContainer, - Tooltip, - XAxis, - YAxis, -} from 'recharts' -import { Box, Card, Text } from 'theme-ui' import { formatCurrency } from 'utils' -import { - CHAIN_TO_NETWORK, - DTF_VIDEO, - DUNE_DASHBOARD, - NETWORKS, - capitalize, -} from 'utils/constants' +import { DTF_VIDEO, DUNE_DASHBOARD } from 'utils/constants' import tvlDark from '../assets/tvl-dark.png' import tvlLight from '../assets/tvl-light.png' import useAPIProtocolMetrics, { Metrics, } from '../hooks/use-api-protocol-metrics' +// Lazy load the chart component to defer recharts bundle +const HistoricalTVLChart = lazy(() => import('./historical-tvl-chart')) + +// SVG skeleton that mimics an upward-trending stacked area chart +const ChartSkeleton = () => ( +
+ + + + + + + + {/* Upward trending area shape - mimics TVL growth */} + + +
+) + const RoundedImageWithSkeleton = ({ src, alt, @@ -58,113 +64,6 @@ const RoundedImageWithSkeleton = ({ ) } -const COLORS: Record = { - ethereum: { - fill: 'hsl(var(--tvl))', - // stroke: '#fff', - stroke: 'hsl(var(--tvl))', - }, - base: { - fill: 'hsl(var(--tvl))', - // stroke: '#fff', - stroke: 'hsl(var(--tvl))', - }, - arbitrum: { - fill: 'hsl(var(--tvl))', - // stroke: '#fff', - stroke: 'hsl(var(--tvl))', - }, - bsc: { - fill: 'hsl(var(--tvl))', - // stroke: '#fff', - stroke: 'hsl(var(--tvl))', - }, -} - -function CustomTooltip({ payload, label, active }: any) { - if (!active || !payload) return null - - const total = payload?.reduce( - (acc: number, item: { value: number }) => acc + item.value, - 0 - ) - - return ( - - - - {new Date(label).toDateString().replace(/^\S+\s/, '')} - - - (TVL per network) - - - - {(payload as any[]).map( - (item: { name: string; value: number }, index) => ( - - - - {capitalize(item.name)}: - - ${formatCurrency(item.value, 0)} - - ) - )} - - - - - Total TVL: - - - ${formatCurrency(total, 0)} - - - - ) -} - // TODO: Improve loading revenue state, currently have a hardcoded if const Heading = ({ data, @@ -248,50 +147,15 @@ const Heading = ({ ) } -const HistoricalTVLChart = ({ data }: { data?: Metrics }) => { - const isDevMode = useAtomValue(devModeAtom) - const networks = Object.values(NETWORKS).filter( - (n) => isDevMode || n !== ChainId.BSC - ) - - return ( - - - - - } /> - {networks.map((network) => ( - - ))} - - - ) -} - const HistoricalTVL = () => { const data = useAPIProtocolMetrics() return (
- + }> + +
diff --git a/src/views/discover/components/splash/index.tsx b/src/views/discover/components/splash/index.tsx index e00d0dd9c..3b1de316c 100644 --- a/src/views/discover/components/splash/index.tsx +++ b/src/views/discover/components/splash/index.tsx @@ -12,10 +12,18 @@ import useMediaQuery from '@/hooks/useMediaQuery' import { DrawerContent } from '@/components/ui/drawer' import { Drawer } from '@/components/ui/drawer' import { cn } from '@/lib/utils' -import { atomWithStorage } from 'jotai/utils' -import { useAtom } from 'jotai' import { DTF_VIDEO } from '@/utils/constants' +const STORAGE_KEY = 'splashVisible' + +// Read initial value synchronously to avoid flash +const getInitialValue = (): boolean => { + if (typeof window === 'undefined') return false + const stored = localStorage.getItem(STORAGE_KEY) + // First visit (null) = show splash, otherwise parse stored value + return stored === null ? true : stored === 'true' +} + const Flower = (props: SVGProps) => ( { - const [open, setOpen] = useAtom(splashVisibleAtom) + // Use useState with lazy initializer to read localStorage synchronously + const [open, setOpenState] = useState(getInitialValue) const isDesktop = useMediaQuery('(min-width: 967px)') const animationFit = useMediaQuery('(min-height: 760px)') + const setOpen = (value: boolean) => { + setOpenState(value) + localStorage.setItem(STORAGE_KEY, String(value)) + } + if (isDesktop) { return ( diff --git a/src/views/discover/components/yield/components/Announcement.tsx b/src/views/discover/components/yield/components/Announcement.tsx index 6f530462d..f642f961c 100644 --- a/src/views/discover/components/yield/components/Announcement.tsx +++ b/src/views/discover/components/yield/components/Announcement.tsx @@ -1,7 +1,6 @@ -import { Button } from 'components' +import { Button } from '@/components/ui/button' import Sparkles from 'components/icons/Sparkles' import { useState } from 'react' -import { Box, Text } from 'theme-ui' const STORAGE_KEY = '3.0-announcement' @@ -18,40 +17,27 @@ const Announcement = () => { } return ( - - +
+
- - - - Releasing 3.0.0{' '} - of the Reserve Protocol V.1 - - +
+
+
+ Releasing 3.0.0{' '} + of the Reserve Protocol V.1 +
+

Streamlining trades with Dutch Auctions, Fortifying Security, Enhanced Developer Experience & Governance improvements. - - - -

+
+ - - +
+
) } diff --git a/src/views/discover/components/yield/components/CompareTokensTitle.tsx b/src/views/discover/components/yield/components/CompareTokensTitle.tsx index 61b87b799..507520985 100644 --- a/src/views/discover/components/yield/components/CompareTokensTitle.tsx +++ b/src/views/discover/components/yield/components/CompareTokensTitle.tsx @@ -1,24 +1,21 @@ import { Trans } from '@lingui/macro' import BasketCubeIcon from 'components/icons/BasketCubeIcon' -import { Box, BoxProps, Text, useColorMode } from 'theme-ui' +import { useTheme } from 'next-themes' import CompareFilters from './CompareFilters' -const CompareBg = (props: BoxProps) => { - const [colorMode] = useColorMode() +const CompareBg = ({ position }: { position: 'left' | 'right' }) => { + const { resolvedTheme } = useTheme() + const isDark = resolvedTheme === 'dark' return ( - ) @@ -26,47 +23,30 @@ const CompareBg = (props: BoxProps) => { const CompareTokensTitle = () => { return ( - +
- - +
+ - - +
+ Browse RTokens - - + + Inspect collateral backing, mint, stake, redeem & explore additional earn opportunities across DeFi - - + +
- -
- + +
+
- - +
+
) } diff --git a/src/views/discover/components/yield/components/DeployHero.tsx b/src/views/discover/components/yield/components/DeployHero.tsx index 4e963cd18..7e59cd0a4 100644 --- a/src/views/discover/components/yield/components/DeployHero.tsx +++ b/src/views/discover/components/yield/components/DeployHero.tsx @@ -1,13 +1,16 @@ import { Trans } from '@lingui/macro' -import Button from '@/components/old/button' +import { Button } from '@/components/ui/button' +import { cn } from '@/lib/utils' import ExternalArrowIcon from 'components/icons/ExternalArrowIcon' -import { borderRadius } from 'theme' -import { Box, BoxProps, Flex, Image, Text } from 'theme-ui' import DeployerImg from '../assets/deployer_img.png' import { useNavigate } from 'react-router-dom' import { ROUTES } from 'utils/constants' -const DeployHero = (props: BoxProps) => { +interface DeployHeroProps { + className?: string +} + +const DeployHero = ({ className }: DeployHeroProps) => { const navigate = useNavigate() const handleDeploy = () => { @@ -15,61 +18,24 @@ const DeployHero = (props: BoxProps) => { } return ( - - - - - - - - - - +
+
+
+ Deployer +
+
+
+
+

Deploy your own RToken - - +

+

The creation of new RToken designs is permissionless. If you are the inventive type and have ideas for what assets should be in the @@ -78,30 +44,29 @@ const DeployHero = (props: BoxProps) => { putting those ideas into practice or sharing them with the community. - - - - - - - +

+
+ ) } diff --git a/src/views/discover/components/yield/components/EarnButton.tsx b/src/views/discover/components/yield/components/EarnButton.tsx index 853b7b5d6..8b723acaf 100644 --- a/src/views/discover/components/yield/components/EarnButton.tsx +++ b/src/views/discover/components/yield/components/EarnButton.tsx @@ -1,4 +1,5 @@ -import { Button } from 'components' +import { Button } from '@/components/ui/button' +import { cn } from '@/lib/utils' import ChevronRight from 'components/icons/ChevronRight' import EarnIcon from 'components/icons/EarnIcon' import { ListedToken } from 'hooks/useTokenList' @@ -6,18 +7,17 @@ import { useAtomValue } from 'jotai' import { memo } from 'react' import { useNavigate } from 'react-router-dom' import { dtfPoolsAtom } from 'state/pools/atoms' -import { mediumButton } from 'theme' -import { Box, BoxProps, Text } from 'theme-ui' import { BRIDGED_RTOKENS, ROUTES } from 'utils/constants' import { getAddress } from 'viem' import VerticalDivider from './VerticalDivider' import { trackClick } from '@/hooks/useTrackPage' -interface Props extends BoxProps { +interface Props { token: ListedToken + className?: string } -const EarnButton = ({ token, sx, ...props }: Props) => { +const EarnButton = ({ token, className }: Props) => { const navigate = useNavigate() const pools = useAtomValue(dtfPoolsAtom) const earnData = pools[getAddress(token.id)] @@ -37,54 +37,36 @@ const EarnButton = ({ token, sx, ...props }: Props) => { if (!earnData) return null return ( - - +
+ - +
) } export default memo(EarnButton) diff --git a/src/views/discover/components/yield/components/MobileCollateralInfo.tsx b/src/views/discover/components/yield/components/MobileCollateralInfo.tsx index 386ca4bcd..34fd174f3 100644 --- a/src/views/discover/components/yield/components/MobileCollateralInfo.tsx +++ b/src/views/discover/components/yield/components/MobileCollateralInfo.tsx @@ -3,93 +3,52 @@ import CollaterizationIcon from 'components/icons/CollaterizationIcon' import { ListedToken } from 'hooks/useTokenList' import { memo, useState } from 'react' import { ChevronDown, ChevronUp } from 'lucide-react' -import { useNavigate } from 'react-router-dom' -import { Box, BoxProps, Divider, Text } from 'theme-ui' -import CollateralPieChartTooltip from '@/views/yield-dtf/overview/components/CollateralPieChartTooltip' +import CollateralPieChartTooltip from '@/views/yield-dtf/overview/components/collateral-pie-chart-tooltip' -interface Props extends BoxProps { +interface Props { token: ListedToken } const MobileCollateralInfo = ({ token }: Props) => { const [collapsed, setCollapsed] = useState(true) - const navigate = useNavigate() return ( - - - +
+
{ e.stopPropagation() setCollapsed((c) => !c) }} > - +
- + Backing + Overcollaterization: - - - - + +
+
+ {(token.backing + token.overcollaterization).toFixed(0)}% - + {collapsed ? ( - + ) : ( - + )} - - - +
+
- - +
+
- {/* */} - - - +
+
+
) } diff --git a/src/views/discover/components/yield/components/RTokenCard.tsx b/src/views/discover/components/yield/components/RTokenCard.tsx index 8163654b8..521b61639 100644 --- a/src/views/discover/components/yield/components/RTokenCard.tsx +++ b/src/views/discover/components/yield/components/RTokenCard.tsx @@ -1,29 +1,24 @@ -import DgnETHButtonAppendix from '@/components/utils/integrations/dgneth-btn-appendix' -import CollateralPieChartWrapper from '@/views/yield-dtf/overview/components/CollateralPieChartWrapper' -import RTokenAddresses from '@/views/yield-dtf/overview/components/RTokenAddresses' -import { t, Trans } from '@lingui/macro' -import { Button } from 'components' +import CollateralPieChartWrapper from '@/views/yield-dtf/overview/components/collateral-pie-chart-wrapper' +import RTokenAddresses from '@/views/yield-dtf/overview/components/rtoken-addresses' +import { trackClick } from '@/hooks/useTrackPage' +import { ChainId } from '@/utils/chains' +import Help from '@/components/ui/help' import ChainLogo from 'components/icons/ChainLogo' import ChevronRight from 'components/icons/ChevronRight' -import CollaterizationIcon from 'components/icons/CollaterizationIcon' -import MoneyIcon from 'components/icons/MoneyIcon' -import PegIcon from 'components/icons/PegIcon' import TokenLogo from 'components/icons/TokenLogo' import { ListedToken } from 'hooks/useTokenList' import { memo } from 'react' import { useNavigate } from 'react-router-dom' -import { Box, BoxProps, Text } from 'theme-ui' -import { formatCurrency, getTokenRoute } from 'utils' +import { getTokenRoute } from 'utils' import { CHAIN_TAGS, ROUTES } from 'utils/constants' import usePriceETH from '../hooks/usePriceETH' import EarnButton from './EarnButton' import MobileCollateralInfo from './MobileCollateralInfo' -import VerticalDivider from './VerticalDivider' -import { trackClick } from '@/hooks/useTrackPage' -import { ChainId } from '@/utils/chains' -import Help from '@/components/ui/help' +import TokenHeader from './TokenHeader' +import TokenStats from './TokenStats' +import TokenActions from './TokenActions' -interface Props extends BoxProps { +interface Props { token: ListedToken } @@ -52,7 +47,7 @@ const ChainBadge = ({ chain }: { chain: number }) => ( ) // TODO: Component should be splitted -const RTokenCard = ({ token, ...props }: Props) => { +const RTokenCard = ({ token }: Props) => { const navigate = useNavigate() const { priceETHTerms, supplyETHTerms } = usePriceETH(token) @@ -74,246 +69,50 @@ const RTokenCard = ({ token, ...props }: Props) => { ) handleNavigate(ROUTES.OVERVIEW) }} - {...props} > - - +
+
- +
- - - +
+
+
- +
- - +
+
- +
- - - - - - {token.symbol} - - - {priceETHTerms - ? `${priceETHTerms} ${token.targetUnits} ($${formatCurrency( - token.price, - 3 - )})` - : `$${formatCurrency(token.price, 3)}`} - - - +
+
+ +
- - +
+
- - - - - - - - - - - - Market cap: - - - - - ${formatCurrency(token.supply, 0)} - - {supplyETHTerms && ( - - {`(${formatCurrency(supplyETHTerms, 0)} ${ - token.targetUnits - })`} - - )} - - - - - - - Peg: - - - {token?.targetUnits?.split(',').length > 2 - ? `${token?.targetUnits?.split(',').length} targets` - : token.targetUnits} - - - - - - - Backing + Overcollaterization: - - - {(token.backing + token.overcollaterization).toFixed(0)}% - - +
+
+ - - - {token.chain !== ChainId.Arbitrum && ( - - - - )} - - - - - - +
+ +
+
-
-
+
+
) } diff --git a/src/views/discover/components/yield/components/RegisterAbout.tsx b/src/views/discover/components/yield/components/RegisterAbout.tsx index af344f244..718567cae 100644 --- a/src/views/discover/components/yield/components/RegisterAbout.tsx +++ b/src/views/discover/components/yield/components/RegisterAbout.tsx @@ -3,7 +3,6 @@ import { Trans } from '@lingui/macro' import DiscordIcon from 'components/icons/DiscordIcon' import GithubIcon from 'components/icons/GithubIcon' import { Link as RouterLink } from 'react-router-dom' -import { Divider } from 'theme-ui' import { DISCORD_INVITE, PROTOCOL_DOCS, @@ -157,7 +156,7 @@ const About = () => ( ) const DashedDivider = () => ( - +
) /** diff --git a/src/views/discover/components/yield/components/TokenActions.tsx b/src/views/discover/components/yield/components/TokenActions.tsx new file mode 100644 index 000000000..c69fb6548 --- /dev/null +++ b/src/views/discover/components/yield/components/TokenActions.tsx @@ -0,0 +1,76 @@ +import DgnETHButtonAppendix from '@/components/utils/integrations/dgneth-btn-appendix' +import { Button } from '@/components/ui/button' +import { trackClick } from '@/hooks/useTrackPage' +import { ChainId } from '@/utils/chains' +import { t, Trans } from '@lingui/macro' +import { ListedToken } from 'hooks/useTokenList' +import { ROUTES } from 'utils/constants' +import EarnButton from './EarnButton' + +interface TokenActionsProps { + token: ListedToken + onNavigate: (route: string) => void +} + +const TokenActions = ({ token, onNavigate }: TokenActionsProps) => { + return ( +
+ {token.chain !== ChainId.Arbitrum && ( + + + + )} + + + +
+ ) +} + +export default TokenActions diff --git a/src/views/discover/components/yield/components/TokenHeader.tsx b/src/views/discover/components/yield/components/TokenHeader.tsx new file mode 100644 index 000000000..2a2386202 --- /dev/null +++ b/src/views/discover/components/yield/components/TokenHeader.tsx @@ -0,0 +1,35 @@ +import TokenLogo from 'components/icons/TokenLogo' +import { ListedToken } from 'hooks/useTokenList' +import { formatCurrency } from 'utils' + +interface TokenHeaderProps { + token: ListedToken + priceETHTerms: number | undefined +} + +const TokenHeader = ({ token, priceETHTerms }: TokenHeaderProps) => { + return ( +
+ +
+ + {token.symbol} + + + {priceETHTerms + ? `${priceETHTerms} ${token.targetUnits} ($${formatCurrency( + token.price, + 3 + )})` + : `$${formatCurrency(token.price, 3)}`} + +
+
+ ) +} + +export default TokenHeader diff --git a/src/views/discover/components/yield/components/TokenList.tsx b/src/views/discover/components/yield/components/TokenList.tsx index c092ee1de..899c4eb33 100644 --- a/src/views/discover/components/yield/components/TokenList.tsx +++ b/src/views/discover/components/yield/components/TokenList.tsx @@ -1,12 +1,14 @@ import { t, Trans } from '@lingui/macro' -import { SmallButton } from '@/components/old/button' -import { ContentHead } from '@/components/old/info-box' +import { Button } from '@/components/ui/button' import ListedTokensTable from 'components/tables/ListedTokensTable' import { useNavigate } from 'react-router-dom' -import { Box, BoxProps, Flex } from 'theme-ui' import { ROUTES } from 'utils/constants' -const TokenList = (props: BoxProps) => { +interface TokenListProps { + className?: string +} + +const TokenList = ({ className }: TokenListProps) => { const navigate = useNavigate() const handleViewAll = () => { @@ -14,20 +16,22 @@ const TokenList = (props: BoxProps) => { } return ( - - +
+
+

+ {t`Compare RTokens`} +

+

+ {t`Including off-chain in-app transactions of RToken in the Reserve App.`} +

+
- - +
+ +
+
) } diff --git a/src/views/discover/components/yield/components/TokenStats.tsx b/src/views/discover/components/yield/components/TokenStats.tsx new file mode 100644 index 000000000..7c40310c5 --- /dev/null +++ b/src/views/discover/components/yield/components/TokenStats.tsx @@ -0,0 +1,68 @@ +import { Trans } from '@lingui/macro' +import CollaterizationIcon from 'components/icons/CollaterizationIcon' +import MoneyIcon from 'components/icons/MoneyIcon' +import PegIcon from 'components/icons/PegIcon' +import { ListedToken } from 'hooks/useTokenList' +import { formatCurrency } from 'utils' +import VerticalDivider from './VerticalDivider' + +interface TokenStatsProps { + token: ListedToken + supplyETHTerms: number | undefined +} + +const TokenStats = ({ token, supplyETHTerms }: TokenStatsProps) => { + return ( +
+
+ +
+
+
+
+ +
+ + Market cap: + +
+
+ + ${formatCurrency(token.supply, 0)} + + {supplyETHTerms && ( + + {`(${formatCurrency(supplyETHTerms, 0)} ${ + token.targetUnits + })`} + + )} +
+
+ +
+ + + Peg: + + + {token?.targetUnits?.split(',').length > 2 + ? `${token?.targetUnits?.split(',').length} targets` + : token.targetUnits} + +
+ +
+ + + Backing + Overcollaterization: + + + {(token.backing + token.overcollaterization).toFixed(0)}% + +
+
+ ) +} + +export default TokenStats diff --git a/src/views/discover/components/yield/components/VerticalDivider.tsx b/src/views/discover/components/yield/components/VerticalDivider.tsx index 2125c8dc2..287a2d918 100644 --- a/src/views/discover/components/yield/components/VerticalDivider.tsx +++ b/src/views/discover/components/yield/components/VerticalDivider.tsx @@ -1,8 +1,11 @@ -import { FC } from 'react' -import { Box, BoxProps } from 'theme-ui' +import { cn } from '@/lib/utils' -const VerticalDivider: FC = (props) => ( - +interface VerticalDividerProps { + className?: string +} + +const VerticalDivider = ({ className }: VerticalDividerProps) => ( +
= (props) => ( d="M.613.25h.5v5.5h-.5z" /> - +
) export default VerticalDivider diff --git a/src/views/discover/components/yield/components/yield-dtf-list.tsx b/src/views/discover/components/yield/components/yield-dtf-list.tsx index f56537238..4f02f8a98 100644 --- a/src/views/discover/components/yield/components/yield-dtf-list.tsx +++ b/src/views/discover/components/yield/components/yield-dtf-list.tsx @@ -66,7 +66,7 @@ const YieldDTfList = ({ stablecoins = false }: { stablecoins?: boolean }) => { {isLoading && !filteredList.length && } {filteredList.map((token) => ( - + ))} ) diff --git a/src/views/discover/components/yield/hooks/useProtocolStats.ts b/src/views/discover/components/yield/hooks/useProtocolStats.ts index b16dcbbd3..de201398f 100644 --- a/src/views/discover/components/yield/hooks/useProtocolStats.ts +++ b/src/views/discover/components/yield/hooks/useProtocolStats.ts @@ -1,6 +1,6 @@ import dayjs from 'dayjs' import { gql } from 'graphql-request' -import { useMultichainQuery } from 'hooks/useQuery' +import { useMultichainQuery } from 'hooks/use-query' import { useAtomValue, useSetAtom } from 'jotai' import { useEffect } from 'react' import { rsrPriceAtom } from 'state/atoms' diff --git a/src/views/earn/hooks/useRTokenPools.ts b/src/views/earn/hooks/useRTokenPools.ts index bf1e637a0..b25373d44 100644 --- a/src/views/earn/hooks/useRTokenPools.ts +++ b/src/views/earn/hooks/useRTokenPools.ts @@ -1,8 +1,8 @@ +import { useQuery } from '@tanstack/react-query' import rtokens from '@reserve-protocol/rtokens' import { useAtom } from 'jotai' import { useEffect } from 'react' import { Pool, poolsAtom } from 'state/pools/atoms' -import useSWRImmutable from 'swr/immutable' import { StringMap } from 'types' import { EUSD_ADDRESS, RSR_ADDRESS } from 'utils/addresses' import { ChainId } from 'utils/chains' @@ -236,7 +236,11 @@ const mapPools = ( } const useRTokenPools = () => { - const { data, isLoading } = useSWRImmutable('https://yields.llama.fi/pools') + const { data, isLoading } = useQuery({ + queryKey: ['llama-pools'], + queryFn: () => fetch('https://yields.llama.fi/pools').then((res) => res.json()), + staleTime: 1000 * 60 * 60, // 1 hour - mimics useSWRImmutable behavior + }) const earnPools = getEarnPools() const { data: indexDTFs } = useIndexDTFList() diff --git a/src/views/earn/views/defi/components/earn-heading.tsx b/src/views/earn/views/defi/components/earn-heading.tsx index 8a4c9c7bc..0c2057b52 100644 --- a/src/views/earn/views/defi/components/earn-heading.tsx +++ b/src/views/earn/views/defi/components/earn-heading.tsx @@ -1,4 +1,8 @@ -import { MouseoverTooltip } from '@/components/old/tooltip' +import { + Tooltip, + TooltipContent, + TooltipTrigger, +} from '@/components/ui/tooltip' import { Trans, t } from '@lingui/macro' import HelpIcon from 'components/icons/CustomHelpIcon' import { Zap } from 'lucide-react' @@ -26,18 +30,20 @@ const Hero = () => ( const Info = () => { return (
- -
- - - How are APYs so high? - - -
-
+ + +
+ + + How are APYs so high? + + +
+
+ + {t`DeFi protocols oftentimes have incentives for liquidity that are paid in their token or a combination of tokens. By providing liquidity for trading or lending or other activities on these protocols, you can earn rewards that are sometimes quite high! Note that there are always risks (smart contract risks, impermanent loss risks, etc), in providing liquidity on these protocols so please make sure you understand things before blindly diving in.`} + +
) } diff --git a/src/views/explorer/components/MultiselectDropdown.tsx b/src/views/explorer/components/MultiselectDropdown.tsx index dbb9e7d13..898bb2e1a 100644 --- a/src/views/explorer/components/MultiselectDropdown.tsx +++ b/src/views/explorer/components/MultiselectDropdown.tsx @@ -1,8 +1,14 @@ -import { Button } from 'components' -import Popup from '@/components/old/popup' +import { Button } from '@/components/ui/button' +import { + Popover, + PopoverContent, + PopoverTrigger, +} from '@/components/ui/popover' +import { Separator } from '@/components/ui/separator' +import { Switch } from '@/components/ui/switch' +import { cn } from '@/lib/utils' import { useCallback, useState } from 'react' import { ChevronDown, ChevronUp } from 'lucide-react' -import { Box, BoxProps, Divider, Flex, Switch, Text } from 'theme-ui' export interface SelectOption { label: string @@ -10,12 +16,14 @@ export interface SelectOption { icon: React.ReactNode | null } -export interface IMultiselectDropdrown extends Omit { +export interface IMultiselectDropdrown { options: SelectOption[] selected: string[] allOption?: boolean minLimit?: number onChange: (selected: string[]) => void + className?: string + children?: React.ReactNode } const OptionSelection = ({ @@ -65,60 +73,49 @@ const OptionSelection = ({ const lowerBound = allOption ? 0 : minLimit || 0 return ( - - +
+
{allOption && ( - - - All options - - +
+ All options +
- - +
+
)} {options.map((option) => ( - +
{option.icon} - - {option.label} - - + {option.label} +
+ onCheckedChange={() => setValues({ ...values, [option.value]: !values[option.value], }) } /> - - +
+
))} -
+
- - - - - +
+ ) } @@ -129,8 +126,7 @@ const MultiselectDropdrown = ({ allOption = false, minLimit, onChange, - sx, - ...props + className, }: IMultiselectDropdrown) => { const [isVisible, setVisible] = useState(false) @@ -143,48 +139,37 @@ const MultiselectDropdrown = ({ ) return ( - setVisible(false)} - placement="bottom" - content={ - isVisible ? ( - - ) : ( - - ) - } - containerProps={{ - sx: { border: '2px solid', borderColor: 'darkBorder' }, - }} - > - setVisible(!isVisible)} - > - {children} - - {isVisible ? ( - - ) : ( - + + +
- - + > +
{children}
+
+ {isVisible ? ( + + ) : ( + + )} +
+
+
+ + + +
) } diff --git a/src/views/explorer/components/collaterals/index.tsx b/src/views/explorer/components/collaterals/index.tsx index 1ca4d6f60..9ef6f9680 100644 --- a/src/views/explorer/components/collaterals/index.tsx +++ b/src/views/explorer/components/collaterals/index.tsx @@ -1,15 +1,14 @@ import { createColumnHelper } from '@tanstack/react-table' -import { Button } from 'components' +import { Button } from '@/components/ui/button' import BasketCubeIcon from 'components/icons/BasketCubeIcon' import ChainLogo from 'components/icons/ChainLogo' import ExternalArrowIcon from 'components/icons/ExternalArrowIcon' import TokenLogo from 'components/icons/TokenLogo' -import { Table } from '@/components/old/table' +import { Table } from '@/components/ui/legacy-table' import { useAtomValue } from 'jotai' import { useMemo } from 'react' import { collateralYieldAtom } from 'state/atoms' import CollateralYieldUpdater from 'state/updaters/CollateralYieldUpdater' -import { Box, Flex, Link, Text } from 'theme-ui' import { CollateralPlugin } from 'types' import { formatCurrency, formatPercentage, parseDuration } from 'utils' import { atomWithLoadable } from 'utils/atoms/utils' @@ -71,32 +70,29 @@ const PluginList = () => { columnHelper.accessor('chainId', { header: 'Network', cell: (data) => ( - +
- {CHAIN_TAGS[data.getValue()]} - + {CHAIN_TAGS[data.getValue()]} +
), }), columnHelper.accessor('symbol', { header: 'Collateral', cell: (data) => { return ( - - - {data.getValue()} - + {data.getValue()} - + ) }, }), @@ -106,28 +102,27 @@ const PluginList = () => { const address = data.getValue() || data.row.original.erc20 return address ? ( - - + {data.row.original.underlyingToken || data.row.original.symbol} - + - + ) : ( - NA + NA ) }, }), @@ -143,32 +138,32 @@ const PluginList = () => { columnHelper.accessor('maxTradeVolume', { header: 'Max trade', cell: (data) => ( - + {formatCurrency(+data.getValue(), 0, { notation: 'compact', compactDisplay: 'short', })} - + ), }), columnHelper.accessor('delayUntilDefault', { header: 'Default delay', - cell: (data) => {parseDuration(+data.getValue())}, + cell: (data) => {parseDuration(+data.getValue())}, }), columnHelper.accessor('supply', { header: 'Supply', cell: (data) => ( - + {formatCurrency(+data.getValue(), 0, { notation: 'compact', compactDisplay: 'short', })} - + ), }), columnHelper.accessor('apy', { header: 'APY', - cell: (data) => {formatPercentage(data.getValue())}, + cell: (data) => {formatPercentage(data.getValue())}, }), ], [columnHelper] @@ -179,8 +174,6 @@ const PluginList = () => {
+ +
@@ -189,37 +182,33 @@ const PluginList = () => { const Collaterals = () => { return ( - +
- +
- - Available Collaterals - - +

Available Collaterals

+
- - +
+
- -
+ +
) } diff --git a/src/views/explorer/components/filters/ChainFilter.tsx b/src/views/explorer/components/filters/ChainFilter.tsx index f8d7123f9..7aefd13ba 100644 --- a/src/views/explorer/components/filters/ChainFilter.tsx +++ b/src/views/explorer/components/filters/ChainFilter.tsx @@ -1,4 +1,3 @@ -import { Box, Text } from 'theme-ui' import MultiselectDropdrown, { IMultiselectDropdrown, } from '../MultiselectDropdown' @@ -18,15 +17,15 @@ const ChainFilter = (props: Omit) => { }, []) return ( - - +
+ Networks - - + + Number(v))} /> - {props.selected.length} chains + {props.selected.length} chains - +
) } diff --git a/src/views/explorer/components/filters/TokenFilter.tsx b/src/views/explorer/components/filters/TokenFilter.tsx index 7c814221f..78b098831 100644 --- a/src/views/explorer/components/filters/TokenFilter.tsx +++ b/src/views/explorer/components/filters/TokenFilter.tsx @@ -4,7 +4,6 @@ import CirclesIcon from 'components/icons/CirclesIcon' import TokenLogo from 'components/icons/TokenLogo' import useRTokenLogo from 'hooks/useRTokenLogo' import { useMemo } from 'react' -import { Box, Text } from 'theme-ui' import { supportedChainList } from 'utils/constants' import MultiselectDropdrown, { IMultiselectDropdrown, @@ -12,7 +11,7 @@ import MultiselectDropdrown, { } from '../MultiselectDropdown' const TokenFilter = ({ - sx, + className, ...props }: Omit) => { const options = useMemo(() => { @@ -32,19 +31,19 @@ const TokenFilter = ({ }, []) return ( - - +
+ Tokens - - + + - + {props.selected.length ? `${props.selected.length} RTokens` : 'All RTokens'} - + - +
) } diff --git a/src/views/explorer/components/filters/TransactionTypeFilter.tsx b/src/views/explorer/components/filters/TransactionTypeFilter.tsx index 220ca6893..9d4a889fe 100644 --- a/src/views/explorer/components/filters/TransactionTypeFilter.tsx +++ b/src/views/explorer/components/filters/TransactionTypeFilter.tsx @@ -1,7 +1,5 @@ import { Trans } from '@lingui/macro' -import CirclesIcon from 'components/icons/CirclesIcon' import { useMemo } from 'react' -import { Box, Text } from 'theme-ui' import MultiselectDropdrown, { IMultiselectDropdrown, } from '../MultiselectDropdown' @@ -32,19 +30,19 @@ const TransactionTypeFilter = ( }, []) return ( - - +
+ Tx Type - - + + - + {props.selected.length ? `${props.selected.length} selected` : 'All types'} - + - +
) } diff --git a/src/views/explorer/components/governance/Filters.tsx b/src/views/explorer/components/governance/Filters.tsx index 11fca8a4c..3983b7ca4 100644 --- a/src/views/explorer/components/governance/Filters.tsx +++ b/src/views/explorer/components/governance/Filters.tsx @@ -1,7 +1,6 @@ import VoteIcon from 'components/icons/VoteIcon' import { useAtom } from 'jotai' import { useMemo } from 'react' -import { Box, Text } from 'theme-ui' import { PROPOSAL_STATES } from 'utils/constants' import MultiselectDropdrown, { IMultiselectDropdrown, @@ -31,17 +30,17 @@ const ProposalStatusFilter = ( }, []) return ( - - Status - +
+ Status + - + {props.selected.length ? `${props.selected.length} selected` : 'All statuses'} - + - +
) } @@ -53,7 +52,7 @@ const ProposalFilters = () => { } return ( - +
handleChange('tokens', selected)} @@ -62,7 +61,7 @@ const ProposalFilters = () => { selected={filters.status} onChange={(selected) => handleChange('status', selected)} /> - +
) } diff --git a/src/views/explorer/components/governance/index.tsx b/src/views/explorer/components/governance/index.tsx index 1515dfbd5..3cc08b55b 100644 --- a/src/views/explorer/components/governance/index.tsx +++ b/src/views/explorer/components/governance/index.tsx @@ -1,12 +1,12 @@ +import { cn } from '@/lib/utils' import { Trans, t } from '@lingui/macro' import { createColumnHelper } from '@tanstack/react-table' import GovernanceIcon from 'components/icons/GovernanceIcon' -import { Table } from '@/components/old/table' +import { Table } from '@/components/ui/legacy-table' import TokenItem from 'components/token-item' import dayjs from 'dayjs' import useRTokenLogo from 'hooks/useRTokenLogo' import { useMemo } from 'react' -import { Badge, Box, Link, Text } from 'theme-ui' import { StringMap } from 'types' import { getProposalTitle, getTokenRoute } from 'utils' import { PROPOSAL_STATES, ROUTES, formatConstant } from 'utils/constants' @@ -22,9 +22,15 @@ const BADGE_VARIANT: StringMap = { [PROPOSAL_STATES.CANCELED]: 'danger', } +const badgeClasses: StringMap = { + danger: 'bg-destructive/15 text-destructive', + info: 'bg-primary/15 text-primary', + success: 'bg-success/15 text-success', + muted: 'bg-muted text-muted-foreground', +} + const ExploreGovernance = () => { const data = useProposalsData() - // TODO: Proper typing to support the state const columnHelper = createColumnHelper() const columns = useMemo( () => [ @@ -42,40 +48,41 @@ const ExploreGovernance = () => { columnHelper.accessor('description', { header: t`Description`, cell: (data) => ( - - + - + {getProposalTitle(data.getValue())} - - + + - + ), }), columnHelper.accessor('creationTime', { header: t`Created At`, cell: (data) => ( - {dayjs.unix(+data.getValue()).format('YYYY-M-D')} + {dayjs.unix(+data.getValue()).format('YYYY-M-D')} ), }), columnHelper.accessor('status', { header: t`Status`, cell: (data) => ( - {formatConstant(data.getValue())} - + ), }), ], @@ -83,18 +90,14 @@ const ExploreGovernance = () => { ) return ( - - +
+
- +

Proposals - +

- +
{ pagination={{ pageSize: 10 }} columnVisibility={['', '', ['none', 'table-cell'], '']} columns={columns} - sx={{ borderRadius: '0 0 20px 20px' }} - compact /> - + ) } diff --git a/src/views/explorer/components/governance/useProposalsData.ts b/src/views/explorer/components/governance/useProposalsData.ts index d3cc99b2f..dcb5387bf 100644 --- a/src/views/explorer/components/governance/useProposalsData.ts +++ b/src/views/explorer/components/governance/useProposalsData.ts @@ -1,5 +1,5 @@ import { gql } from 'graphql-request' -import { useMultichainQuery } from 'hooks/useQuery' +import { useMultichainQuery } from 'hooks/use-query' import { useAtomValue } from 'jotai' import { useMemo } from 'react' import { ChainId } from 'utils/chains' diff --git a/src/views/explorer/components/revenue/index.tsx b/src/views/explorer/components/revenue/index.tsx index 8ee70e501..ab4254b7d 100644 --- a/src/views/explorer/components/revenue/index.tsx +++ b/src/views/explorer/components/revenue/index.tsx @@ -1,15 +1,13 @@ import rtokens from '@reserve-protocol/rtokens' import { createColumnHelper } from '@tanstack/react-table' import FacadeRead from 'abis/FacadeRead' -import CollapsableBox from '@/components/old/boxes/CollapsableBox' import AuctionsIcon from 'components/icons/AuctionsIcon' import TokenLogo from 'components/icons/TokenLogo' -import { Table } from '@/components/old/table' +import { Table } from '@/components/ui/legacy-table' import TokenItem from 'components/token-item' import { useCallback, useMemo, useState } from 'react' -import { Check, X } from 'lucide-react' +import { Check, X, ChevronDown, ChevronUp } from 'lucide-react' import Skeleton from 'react-loading-skeleton' -import { Box, Flex, Link, Text } from 'theme-ui' import { Trader } from 'types' import { formatCurrency, formatUsdCurrencyCell, getTokenRoute } from 'utils' import { FACADE_ADDRESS, RSR_ADDRESS } from 'utils/addresses' @@ -20,7 +18,7 @@ import { Address, formatEther, formatUnits } from 'viem' import TabMenu from 'components/tab-menu' import CirclesIcon from 'components/icons/CirclesIcon' import ChainLogo from 'components/icons/ChainLogo' -import { Button } from 'components' +import { Button } from '@/components/ui/button' import { useReadContract } from 'wagmi' type RevenueResponse = { @@ -42,7 +40,7 @@ type RevenueCollateral = { surplus: number minTrade: number value: number - buy: string // shorthand + buy: string trader: Trader chain: number buyAddress: Address @@ -80,23 +78,10 @@ type Revenue = { } const ChainBadge = ({ chain }: { chain: number }) => ( - +
- - {CHAIN_TAGS[chain] + ' Native'} - - + {CHAIN_TAGS[chain] + ' Native'} +
) const parseRevenue = (trades: readonly RevenueResponse[], chain: number) => { @@ -140,7 +125,6 @@ const parseRevenue = (trades: readonly RevenueResponse[], chain: number) => { revenue.totalRevenue += amount revenue.availableTrades += 1 - // RSR Trader if (isStakerTrader) { revenue.tokens[trade.rToken].stakersRevenue += amount } else { @@ -242,7 +226,7 @@ const useAvailableRevenue = (): Revenue | undefined => { return result } - return undefined // fetching... + return undefined }, [base, mainnet, arbitrum]) } @@ -262,82 +246,82 @@ const TradesTable = ({ columnHelper.accessor('rTokenAddress', { header: 'RToken', cell: (data) => ( - - + ), }), columnHelper.accessor('buy', { header: 'Buy', cell: (data) => ( - - + ), }), columnHelper.accessor('symbol', { header: 'Sell', cell: (data) => ( - - + ), }), columnHelper.accessor('surplus', { header: 'Surplus', cell: (data) => ( - + {formatCurrency(data.getValue())} {data.row.original.symbol} - + ), }), columnHelper.accessor('minTrade', { header: 'Min. Trade', cell: (data) => ( - +
{data.row.original.surplus >= data.row.original.minTrade ? ( ) : ( )} - + {formatCurrency(data.getValue())} {data.row.original.symbol} - - + +
), }), columnHelper.accessor('value', { @@ -348,8 +332,9 @@ const TradesTable = ({ header: '', cell: (data) => (
{ + const [isOpen, setOpen] = useState(false) + const handleRun = () => { window.open( getTokenRoute(data.address, data.chain, ROUTES.AUCTIONS), @@ -394,53 +380,63 @@ const RTokenRevenueOverview = ({ data }: { data: RevenueDetail }) => { } return ( - - + {/* Collapsable header */} +
setOpen(!isOpen)} + > +
+
{ + e.stopPropagation() + handleRun() + }} role="button" - mr="auto" > - - {data.symbol} - + {data.symbol} - - - - Trades: - {data.n} - +
+
+
+ Trades: + {data.n} + ({data.outstandingTrades} available) - - - - Amount: - ${formatCurrency(data.total)} - -
+
+ Amount: + ${formatCurrency(data.total)} +
+ - - - } - > - - +
+
+
+ {isOpen ? : } +
+
+ + {/* Collapsible content */} + {isOpen && ( + <> +
+ + + )} +
) } @@ -494,43 +490,34 @@ const RevenueOverview = ({ } return ( - - - - Trades: - {data?.trades ?? 0} - - - Available Trades: - {data?.outstandingTrades ?? 0} - - - Revenue: - ${formatCurrency(data?.revenue ?? 0)} - - +
+
+
+ Trades: + {data?.trades ?? 0} +
+
+ Available Trades: + {data?.outstandingTrades ?? 0} +
+
+ Revenue: + ${formatCurrency(data?.revenue ?? 0)} +
+
{type === 'grid' ? ( - +
{data.tokens.map((token) => ( ))} - +
) : ( - +
- +
)} -
+
) } @@ -546,16 +533,14 @@ const AvailableRevenue = () => { ) return ( - - +
+
- - Revenue - +

Revenue

- +
- +
) } diff --git a/src/views/explorer/components/tokens/index.tsx b/src/views/explorer/components/tokens/index.tsx index 167f614ec..503446402 100644 --- a/src/views/explorer/components/tokens/index.tsx +++ b/src/views/explorer/components/tokens/index.tsx @@ -1,4 +1,5 @@ -import { Table, TableProps } from '@/components/old/table' +import { Table, TableProps } from '@/components/ui/legacy-table' +import { cn } from '@/lib/utils' import { Trans, t } from '@lingui/macro' import { Row, createColumnHelper } from '@tanstack/react-table' import BasketCubeIcon from 'components/icons/BasketCubeIcon' @@ -11,8 +12,6 @@ import useRTokenLogo from 'hooks/useRTokenLogo' import useTokenList, { ListedToken } from 'hooks/useTokenList' import { atom, useAtom, useAtomValue, useSetAtom } from 'jotai' import { useMemo, useState } from 'react' -import { borderRadius } from 'theme' -import { Box, Text } from 'theme-ui' import { formatCurrency, formatPercentage, formatUsdCurrencyCell } from 'utils' import { TARGET_UNITS, supportedChainList } from 'utils/constants' import ChainFilter from '../filters/ChainFilter' @@ -24,14 +23,11 @@ const filtersAtom = atom<{ chains: string[]; targets: string[] }>({ const renderSubComponent = ({ row }: { row: Row }) => { return ( - +
         {JSON.stringify(row.original, null, 2)}
       
- +
) } @@ -66,38 +62,22 @@ const TargetFilter = () => { } return ( - +
{options.map(({ text, icon }, index) => ( - handleSelect(index)} > {icon}{' '} - - {text} - - + {text} +
))} -
+ ) } @@ -109,14 +89,14 @@ const Filters = () => { } return ( - +
handleChange('chains', selected)} - mr={3} + className="mr-4" /> - +
) } @@ -191,28 +171,9 @@ const ExploreTokens = (props: Partial) => { columnHelper.accessor('targetUnits', { header: t`Target(s)`, cell: (data) => { - return ( - - {data.getValue()} - - ) + return {data.getValue()} }, }), - // columnHelper.accessor('id', { - // header: '', - // cell: ({ row }) => { - // return row.getIsExpanded() ? ( - // - // ) : ( - // - // ) - // }, - // }), ], [] ) @@ -222,18 +183,14 @@ const ExploreTokens = (props: Partial) => { } return ( - - +
+
- +

Featured RTokens - +

- +
) => { onRowClick={handleClick} sorting sortBy={[{ id: 'supply', desc: true }]} - sx={{ borderRadius: '0 0 20px 20px' }} - compact renderSubComponent={renderSubComponent} {...props} /> - + ) } diff --git a/src/views/explorer/components/transactions/Filters.tsx b/src/views/explorer/components/transactions/Filters.tsx index ba4b245f4..a9c2bd87a 100644 --- a/src/views/explorer/components/transactions/Filters.tsx +++ b/src/views/explorer/components/transactions/Filters.tsx @@ -1,6 +1,5 @@ import { useAtom, useAtomValue, useSetAtom } from 'jotai' import { debouncedWalletInputAtom, filtersAtom } from './atoms' -import { Box, Flex, Text } from 'theme-ui' import ChainFilter from '../filters/ChainFilter' import TokenFilter from '../filters/TokenFilter' import TransactionTypeFilter from '../filters/TransactionTypeFilter' @@ -12,18 +11,17 @@ const WalletFilter = () => { const setValue = useSetAtom(debouncedWalletInputAtom.debouncedValueAtom) return ( - - +
+ Wallet - + setValue(e.target.value)} value={value} placeholder={t`Input wallet`} /> - +
) } @@ -35,10 +33,10 @@ const TransactionFilters = () => { } return ( - +
handleChange('tokens', selected)} /> @@ -50,7 +48,7 @@ const TransactionFilters = () => { selected={filters.chains} onChange={(selected) => handleChange('chains', selected)} /> - +
) } diff --git a/src/views/explorer/components/transactions/index.tsx b/src/views/explorer/components/transactions/index.tsx index c701cd54a..60a861142 100644 --- a/src/views/explorer/components/transactions/index.tsx +++ b/src/views/explorer/components/transactions/index.tsx @@ -1,15 +1,12 @@ import { Trans } from '@lingui/macro' import TransactionsIcon from 'components/icons/TransactionsIcon' -import { Table } from '@/components/old/table' -import { Box, Text } from 'theme-ui' +import { Table } from '@/components/ui/legacy-table' import useTransactionColumns from './useTransactionColumns' import useTransactionData from './useTransactionData' import TransactionFilters from './Filters' -import { useCallback, useEffect } from 'react' +import { useCallback } from 'react' import { useSetAtom } from 'jotai' import { sortByAtom } from './atoms' -import { TransactionRecord } from '@/types' -import { formatEther } from 'viem' const sortKeyMap: Record = { token_symbol: 'token__symbol', @@ -33,68 +30,15 @@ const ExploreTransactions = () => { } }, []) - useEffect(() => { - if (data) { - const result = data.reduce((acc: any, item: any) => { - if (+item.timestamp > 1731562865) { - const amount = Number(formatEther(item.amount)) - const amountUSD = Number(item.amountUSD) - const date = new Date(item.timestamp * 1000) - const formattedDate = `${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')}` - - if (item.type === 'MINT') { - acc[formattedDate] = acc[formattedDate] || { - mint: 0, - mintUSD: 0, - redeem: 0, - redeemUSD: 0, - } - acc[formattedDate].mint += amount - acc[formattedDate].mintUSD += amountUSD - } else if (item.type === 'REDEEM') { - acc[formattedDate] = acc[formattedDate] || { - mint: 0, - mintUSD: 0, - redeem: 0, - redeemUSD: 0, - } - acc[formattedDate].redeem += amount - acc[formattedDate].redeemUSD += amountUSD - } - } - return acc - }, {}) - - const csvRows = [ - ['Date', 'Mint', 'Mint USD', 'Redeem', 'Redeem USD'], - ...Object.entries(result).map(([date, values]: any) => [ - date, - values.mint, - values.mintUSD, - values.redeem, - values.redeemUSD, - ]), - ] - .map((row) => row.join(',')) - .join('\n') - - console.log(csvRows) - } - }, [data]) return ( - - +
+
- +

Transactions - +

- +
{ data={data} pagination={{ pageSize: 10 }} columns={columns} - sx={{ borderRadius: '0 0 20px 20px' }} isLoading={!data.length} - compact /> - + ) } diff --git a/src/views/explorer/components/transactions/useTransactionColumns.tsx b/src/views/explorer/components/transactions/useTransactionColumns.tsx index f130013c6..8016c09dd 100644 --- a/src/views/explorer/components/transactions/useTransactionColumns.tsx +++ b/src/views/explorer/components/transactions/useTransactionColumns.tsx @@ -6,7 +6,6 @@ import TokenItem from 'components/token-item' import dayjs from 'dayjs' import useRTokenLogo from 'hooks/useRTokenLogo' import { useMemo } from 'react' -import { Box, Link, Text } from 'theme-ui' import { StringMap } from 'types' import { formatCurrency, @@ -52,25 +51,25 @@ const useTransactionColumns = () => { ) return ( - - + ) }, }), columnHelper.accessor('type', { header: t`Type`, cell: (data) => ( - + {transactionTypes[data.getValue()] || data.getValue()} - + ), }), columnHelper.accessor('amount', { @@ -115,16 +114,16 @@ const useTransactionColumns = () => { : data.getValue() return ( - - + {shortenAddress(address)} - + - + ) }, }), @@ -132,19 +131,19 @@ const useTransactionColumns = () => { header: t`Platform`, cell: (data) => { return ( - {shortenString(data.row.original.hash)} - + ) }, }), diff --git a/src/views/explorer/components/transactions/useTransactionData.ts b/src/views/explorer/components/transactions/useTransactionData.ts index b28f4008d..648d120f9 100644 --- a/src/views/explorer/components/transactions/useTransactionData.ts +++ b/src/views/explorer/components/transactions/useTransactionData.ts @@ -1,5 +1,5 @@ import { gql } from 'graphql-request' -import { useMultichainQuery } from 'hooks/useQuery' +import { useMultichainQuery } from 'hooks/use-query' import { atom, useAtomValue } from 'jotai' import { useMemo } from 'react' import { supportedChainList } from 'utils/constants' diff --git a/src/views/explorer/index.tsx b/src/views/explorer/index.tsx index 3c9da4ce9..b9074f558 100644 --- a/src/views/explorer/index.tsx +++ b/src/views/explorer/index.tsx @@ -1,5 +1,4 @@ import { NavLink, Outlet } from 'react-router-dom' -import { Box } from 'theme-ui' import { ROUTES } from 'utils/constants' const NavItem = ({ @@ -10,19 +9,13 @@ const NavItem = ({ children: React.ReactNode }) => ( ({ - textDecoration: 'none', - display: 'block', - paddingBottom: !isActive ? '15px' : '12px', - paddingTop: '12px', - // width: 120, - color: 'inherit', - lineHeight: '32px', - fontWeight: isActive ? 'bold' : 'normal', - borderBottom: isActive ? '3px solid' : '0px solid', - borderColor: 'primary', - textAlign: 'center', - })} + className={({ isActive }) => + `block py-3 text-center leading-8 no-underline ${ + isActive + ? 'font-bold border-b-[3px] border-primary pb-[9px]' + : 'border-b-0' + }` + } to={to} > {children} @@ -31,37 +24,26 @@ const NavItem = ({ const Navigation = () => { return ( - +
- - Txs - - Transactions + Txs + Transactions Tokens Collaterals Governance Revenue - +
) } const Explorer = () => ( - +
- +
- - +
+
) export default Explorer diff --git a/src/views/home/components/About.tsx b/src/views/home/components/About.tsx deleted file mode 100644 index 4ac904d62..000000000 --- a/src/views/home/components/About.tsx +++ /dev/null @@ -1,110 +0,0 @@ -import ExternalArrowIcon from 'components/icons/ExternalArrowIcon' -import MovieIcon from 'components/icons/MovieIcon' -import { Box, Image, Text, useColorMode } from 'theme-ui' - -const About = () => { - const [colorMode] = useColorMode() - - return ( - window.open('https://reserve.org/monetarium/', '_blank')} - > - - - - - - - - - - - Monetarium 1 recap - - - Watch the event recap and get notified about Monetarium 2 - - - - - - - - ) -} - -export default About diff --git a/src/views/home/components/Hero.tsx b/src/views/home/components/Hero.tsx deleted file mode 100644 index e41864cda..000000000 --- a/src/views/home/components/Hero.tsx +++ /dev/null @@ -1,351 +0,0 @@ -import { t } from '@lingui/macro' -import Help from 'components/help' -import LeafIcon from 'components/icons/LeafIcon' -import ShieldIcon from 'components/icons/ShieldIcon' -import StackedChainLogo from 'components/icons/StackedChainLogo' -import TreeIcon from 'components/icons/TreeIcon' -import { ArrowUpRight } from 'lucide-react' -import Skeleton from 'react-loading-skeleton' -import { Box, Flex, Grid, Text } from 'theme-ui' -import { formatCurrency } from 'utils' -import { - CHAIN_TO_NETWORK, - capitalize, - supportedChainList, -} from 'utils/constants' -import useProtocolMetrics from '../hooks/useProtocolMetrics' -import HistoricalTVL from './HistoricalTVL' - -const ProtocolStats = () => { - const { - data: { - marketCap, - rsrLockedUSD, - rTokenAnnualizedRevenue, - rsrStakerAnnualizedRevenue, - }, - isLoading, - } = useProtocolMetrics() - - const statInfo = [ - { - icon: , - value: formatCurrency(marketCap, 1, { - notation: 'compact', - compactDisplay: 'short', - }), - valueLong: formatCurrency(marketCap, 0), - title: t`RToken Market Cap`, - tooltip: t`The total value of all RToken in circulation`, - }, - { - icon: , - value: formatCurrency(rsrLockedUSD, 1, { - notation: 'compact', - compactDisplay: 'short', - }), - valueLong: formatCurrency(rsrLockedUSD, 0), - title: t`First-loss RSR Capital`, - tooltip: t`The total value of all RSR staked in the protocol`, - }, - { - icon: , - value: formatCurrency(rTokenAnnualizedRevenue, 1, { - notation: 'compact', - compactDisplay: 'short', - }), - valueLong: formatCurrency(rTokenAnnualizedRevenue, 0), - title: t`Annualized RTokens Revenue`, - tooltip: t`The projected annual revenue generated by the protocol for RToken holders, calculated using the current APY and TVL of the listed RTokens.`, - }, - { - icon: , - value: formatCurrency(rsrStakerAnnualizedRevenue, 1, { - notation: 'compact', - compactDisplay: 'short', - }), - valueLong: formatCurrency(rsrStakerAnnualizedRevenue, 0), - title: t`Annualized RSR Stakers Revenue`, - tooltip: t`The projected annual revenue generated by the protocol for RSR stakers, calculated using the current RSR staker APY and the amount of staked RSR for the listed RTokens.`, - }, - ] - - return ( - - {statInfo.map(({ title, value, valueLong, icon, tooltip }, index) => ( - - {icon} - - - - {title} - - - - - {!isLoading ? ( - <> - - ${value} - - - ${valueLong} - - - ) : ( - - )} - - - - - ))} - - ) -} - -const HeroHeader = () => { - return ( - - - - - The - - Reserve protocol - - on - {supportedChainList.map( - (chainId, index) => - ` ${capitalize(CHAIN_TO_NETWORK[chainId])}${ - index >= supportedChainList.length - 2 - ? index === supportedChainList.length - 1 - ? '' - : ' & ' - : ',' - }` - )} - - - - window.open( - 'https://dune.com/reserve-protocol/reserve-protocol-overview', - '_blank' - ) - } - > - - Full dashboard - - - - - ) -} - -const HeroTVL = () => { - const { - data: { tvl }, - isLoading, - } = useProtocolMetrics() - - return ( - - TVL in Reserve - - {!isLoading ? ( - - ${formatCurrency(tvl, 0)} - - ) : ( - - - - - - - - - )} - - ) -} - -const MobileDuneLink = () => { - return ( - - window.open( - 'https://dune.com/reserve-protocol/reserve-protocol-overview', - '_blank' - ) - } - > - Full Dune Dashboard - - - ) -} - -const Hero = () => ( - - - - - - - - - - - - - - - - - - - - -) - -export default Hero diff --git a/src/views/home/components/HistoricalTVL.tsx b/src/views/home/components/HistoricalTVL.tsx deleted file mode 100644 index a3598cdeb..000000000 --- a/src/views/home/components/HistoricalTVL.tsx +++ /dev/null @@ -1,149 +0,0 @@ -import ChainLogo from 'components/icons/ChainLogo' -import SmallRootIcon from 'components/icons/SmallRootIcon' -import { Area, AreaChart, ResponsiveContainer, Tooltip, XAxis } from 'recharts' -import { colors } from 'theme' -import { Box, Card, Text } from 'theme-ui' -import { formatCurrency } from 'utils' -import { NETWORKS, capitalize } from 'utils/constants' -import useHistoricalTVL from '../hooks/useHistoricalTVL' - -const COLORS: Record = { - ethereum: { - fill: colors.primary, - stroke: colors.primary, - // stroke: '#3B3B3B', - }, - base: { - fill: colors.primary, - stroke: colors.primary, - // stroke: '#1552F0', - }, - arbitrum: { - fill: colors.primary, - stroke: colors.primary, - // stroke: '#162B4E', - }, - bsc: { - fill: colors.primary, - stroke: colors.primary, - // stroke: '#162B4E', - }, -} - -function CustomTooltip({ payload, label, active }: any) { - if (!active || !payload) return null - - const total = payload?.reduce( - (acc: number, item: { value: number }) => acc + item.value, - 0 - ) - - return ( - - - - {new Date(label).toDateString().replace(/^\S+\s/, '')} - - - (TVL per network) - - - - {(payload as any[]).map( - (item: { name: string; value: number }, index) => ( - - - - {capitalize(item.name)}: - - ${formatCurrency(item.value, 0)} - - ) - )} - - - - - Total TVL: - - - ${formatCurrency(total, 0)} - - - - ) -} - -const HistoricalTVL = () => { - const data = useHistoricalTVL() - - return ( - - - - } /> - {Object.keys(NETWORKS).map((network) => ( - - ))} - - - ) -} - -export default HistoricalTVL diff --git a/src/views/home/components/UseCases.tsx b/src/views/home/components/UseCases.tsx deleted file mode 100644 index ff65e4e10..000000000 --- a/src/views/home/components/UseCases.tsx +++ /dev/null @@ -1,172 +0,0 @@ -import TokenLogo from 'components/icons/TokenLogo' -import { useMemo } from 'react' -import { ArrowUpRight, ChevronRight } from 'lucide-react' -import { useNavigate } from 'react-router-dom' -import { Box, Grid, Image, Text, useThemeUI } from 'theme-ui' -import { getTokenRoute } from 'utils' -import { ETHPLUS_ADDRESS, EUSD_ADDRESS, USD3_ADDRESS } from 'utils/addresses' -import { ChainId } from 'utils/chains' -import { ROUTES } from 'utils/constants' - -const UseCases = () => { - const navigate = useNavigate() - const { - theme: { breakpoints }, - } = useThemeUI() - - const useCases = useMemo(() => { - const isMobile = - window.innerWidth <= parseFloat(breakpoints?.[0] || '0') * 16 - - const cases = [ - { - title: 'USD Yield', - description: - 'Diversified blue chip lending exposure + blue chip stables.', - icon: , - link: getTokenRoute( - USD3_ADDRESS[ChainId.Mainnet], - ChainId.Mainnet, - ROUTES.OVERVIEW - ), - }, - { - title: 'DeFi Yield', - description: - 'Provide liquidity across DeFi & earn more with your RTokens.', - icon: , - link: ROUTES.EARN, - }, - { - title: 'ETH Yield', - description: - 'Diversified bluechip liquid staking protocols with automated yield compounding & portfolio rebalancing.', - icon: , - link: getTokenRoute( - ETHPLUS_ADDRESS[ChainId.Mainnet], - ChainId.Mainnet, - ROUTES.OVERVIEW - ), - }, - { - title: 'Censorship Resistant', - description: - 'An overcollateralized stablecoin diversified across top lending protocols and centralized stablecoin issuers.', - icon: , - link: getTokenRoute( - EUSD_ADDRESS[ChainId.Mainnet], - ChainId.Mainnet, - ROUTES.OVERVIEW - ), - }, - ] - - if (isMobile) { - // swap 2nd and 3rd use cases - const temp = cases[1] - cases[1] = cases[2] - cases[2] = temp - } - - return cases - }, [breakpoints, window.innerWidth]) - - return ( - - - Discover the protocol - window.open('https://reserve.org/', '_blank')} - > - - Learn about Reserve - - - - - - {useCases.map(({ title, description, icon, link }, index) => ( - navigate(link)} - > - - - {icon} - {title} - - - - - {description} - - - ))} - - window.open('https://reserve.org/', '_blank')} - > - - Learn about Reserve - - - - - ) -} - -export default UseCases diff --git a/src/views/home/components/historical-tvl.tsx b/src/views/home/components/historical-tvl.tsx deleted file mode 100644 index caab78985..000000000 --- a/src/views/home/components/historical-tvl.tsx +++ /dev/null @@ -1,211 +0,0 @@ -import LeafIcon from '@/components/icons/LeafIcon' -import RootIcon from '@/components/icons/RootIcon' -import { Skeleton } from '@/components/ui/skeleton' -import ChainLogo from 'components/icons/ChainLogo' -import SmallRootIcon from 'components/icons/SmallRootIcon' -import { - Area, - AreaChart, - ResponsiveContainer, - Tooltip, - XAxis, - YAxis, -} from 'recharts' -import { Box, Card, Text } from 'theme-ui' -import { formatCurrency } from 'utils' -import { NETWORKS, capitalize } from 'utils/constants' -import useHistoricalTVL from '../hooks/useHistoricalTVL' -import useProtocolMetrics from '../hooks/useProtocolMetrics' - -const COLORS: Record = { - ethereum: { - fill: '#fff', - stroke: '#fff', - // stroke: '#3B3B3B', - }, - base: { - fill: '#fff', - stroke: '#fff', - // stroke: '#1552F0', - }, - arbitrum: { - fill: '#fff', - stroke: '#fff', - // stroke: '#162B4E', - }, - bsc: { - fill: '#fff', - stroke: '#fff', - // stroke: '#162B4E', - }, -} - -function CustomTooltip({ payload, label, active }: any) { - if (!active || !payload) return null - - const total = payload?.reduce( - (acc: number, item: { value: number }) => acc + item.value, - 0 - ) - - return ( - - - - {new Date(label).toDateString().replace(/^\S+\s/, '')} - - - (TVL per network) - - - - {(payload as any[]).map( - (item: { name: string; value: number }, index) => ( - - - - {capitalize(item.name)}: - - ${formatCurrency(item.value, 0)} - - ) - )} - - - - - Total TVL: - - - ${formatCurrency(total, 0)} - - - - ) -} - -const Heading = () => { - const { - data: { tvl, rsrStakerAnnualizedRevenue, rTokenAnnualizedRevenue }, - isLoading, - } = useProtocolMetrics() - - const revenue = rsrStakerAnnualizedRevenue + rTokenAnnualizedRevenue - - return ( -
- -

TVL in Reserve

- {isLoading ? ( - - ) : ( -

- ${formatCurrency(tvl, 0)} -

- )} - -
- - Annualized protocol revenue: - {isLoading || !revenue ? ( - - ) : ( - - $ - {formatCurrency(revenue, 1, { - notation: 'compact', - compactDisplay: 'short', - })} - - )} -
-
- ) -} - -const HistoricalTVLChart = () => { - const data = useHistoricalTVL() - - return ( - - - - - } /> - {Object.keys(NETWORKS).map((network) => ( - - ))} - - - ) -} - -const HistoricalTVL = () => { - return ( -
- -
- -
-
- ) -} - -export default HistoricalTVL diff --git a/src/views/home/hooks/useHistoricalTVL.ts b/src/views/home/hooks/useHistoricalTVL.ts deleted file mode 100644 index 8a038e349..000000000 --- a/src/views/home/hooks/useHistoricalTVL.ts +++ /dev/null @@ -1,94 +0,0 @@ -import dayjs from 'dayjs' -import { gql } from 'graphql-request' -import { useMultichainQuery } from 'hooks/useQuery' -import { useMemo } from 'react' -import { getUTCStartOfDay } from 'utils' -import { CHAIN_TO_NETWORK, NETWORKS, supportedChainList } from 'utils/constants' - -const protocolMetricsQuery = gql` - query { - dailyStats: financialsDailySnapshots( - orderBy: timestamp - orderDirection: desc - first: 1000 - ) { - timestamp - totalRTokenUSD - rsrLockedUSD - } - } -` -type ProtocolMetricsResponse = { - dailyStats: { - timestamp: number - totalRTokenUSD: string - rsrLockedUSD: string - }[] -} - -export type DailyTVL = { - day: number -} & { - [K in keyof typeof NETWORKS]: number -} - -export const DEFAULT_TVL_BY_CHAIN = Object.keys(NETWORKS).reduce((obj, network) => { - obj[network] = 0 - return obj -}, {} as Record) - -const useHistoricalTVL = (): DailyTVL[] => { - const { data } = useMultichainQuery(protocolMetricsQuery) - - const historicalTVL = useMemo(() => { - if (!data) return [] - - // sum all totalValueLockedUSD per day, per chain - const tvlPerDay = supportedChainList - .flatMap((chain) => { - const metrics = data[chain] as ProtocolMetricsResponse - return ( - metrics?.dailyStats.map( - ({ totalRTokenUSD, rsrLockedUSD, timestamp }) => ({ - totalValueLockedUSD: +totalRTokenUSD + +rsrLockedUSD, - chain, - day: getUTCStartOfDay(timestamp), - }) - ) || [] - ) - }) - .reduce((acc, { totalValueLockedUSD, day, chain }) => { - if (!acc[day]) { - acc[day] = { - day, - ...DEFAULT_TVL_BY_CHAIN, - } - } - acc[day] = { - ...acc[day], - [CHAIN_TO_NETWORK[chain]]: +totalValueLockedUSD, - } - return acc - }, {} as Record) - const sortedTVL = Object.values(tvlPerDay).sort((a, b) => a.day - b.day) - - // if there are zero values for a chain, fill them with the previous non-zero value - Object.keys(NETWORKS).forEach((chain) => { - let lastNonZeroValue = 0 - for (let i = 0; i < sortedTVL.length; i++) { - const tvl = sortedTVL[i] - if (tvl[chain] === 0) { - sortedTVL[i][chain] = lastNonZeroValue - } else { - lastNonZeroValue = tvl[chain] - } - } - }) - - return sortedTVL - }, [data]) - - return historicalTVL -} - -export default useHistoricalTVL diff --git a/src/views/home/hooks/useProtocolMetrics.ts b/src/views/home/hooks/useProtocolMetrics.ts deleted file mode 100644 index 6e772eae8..000000000 --- a/src/views/home/hooks/useProtocolMetrics.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { gql } from 'graphql-request' -import { useMultichainQuery } from 'hooks/useQuery' -import useTokenList from 'hooks/useTokenList' -import { useMemo } from 'react' -import { PROTOCOL_SLUG } from 'utils/constants' - -const protocolMetricsQuery = gql` - query GetProtocolMetrics($id: String!) { - protocol(id: $id) { - totalRTokenUSD - rsrRevenue - rsrLockedUSD - } - } -` - -const DEFAULT_STATS = { - marketCap: 0, - tvl: 0, - rsrLockedUSD: 0, - rTokenAnnualizedRevenue: 0, - rsrStakerAnnualizedRevenue: 0, -} - -const useProtocolMetrics = () => { - const { list, isLoading: loadingList } = useTokenList() - const { data, isLoading } = useMultichainQuery( - protocolMetricsQuery, - { - id: PROTOCOL_SLUG, - }, - { keepPreviousData: true } - ) - - return useMemo(() => { - if (isLoading || loadingList || !data || !list) { - return { data: DEFAULT_STATS, isLoading: true } - } - - const stats = Object.values(data) - .flatMap((d) => d.protocol) - .reduce( - (acc, curr) => ({ - marketCap: acc.marketCap + +curr.totalRTokenUSD, - tvl: acc.tvl + +curr.totalRTokenUSD + +curr.rsrLockedUSD, - rsrLockedUSD: acc.rsrLockedUSD + +curr.rsrLockedUSD, - }), - DEFAULT_STATS - ) - - const rsrStakerAnnualizedRevenue = list.reduce((acc, curr) => { - return acc + (curr.stakingApy / 100) * curr.stakeUsd - }, 0) - - const rTokenAnnualizedRevenue = list.reduce((acc, curr) => { - return acc + (curr.tokenApy / 100) * curr.supply - }, 0) - - return { - data: { ...stats, rsrStakerAnnualizedRevenue, rTokenAnnualizedRevenue }, - isLoading: false, - } - }, [data, list, isLoading, loadingList]) -} - -export default useProtocolMetrics diff --git a/src/views/home/index.tsx b/src/views/home/index.tsx deleted file mode 100644 index 51891477f..000000000 --- a/src/views/home/index.tsx +++ /dev/null @@ -1,169 +0,0 @@ -import { Box, Grid } from 'theme-ui' -import About from './components/About' -import UseCases from './components/UseCases' -import RegisterAbout from '@/views/discover/components/yield/components/RegisterAbout' -import HistoricalTVL from './components/historical-tvl' -import { Button } from '@/components/ui/button' -import { ArrowRight } from 'lucide-react' -import { Link } from 'react-router-dom' -import TokenLogo from '@/components/token-logo' - -const Hero = () => ( -
- -
- hero-splash -
-
-) -const DTFCategory = ({ - title, - description, - subtitle, - image, -}: { - title: string - description: string - subtitle: string - image: string -}) => { - return ( -
-
- -
-

{title} -

-

{subtitle}

-

{description}

-
-

View all {title}

- -
-
- -
- ) -} - -const DTFCategories = () => { - return ( -
-
-

Our DTF Categories

-
-
- - -
-
- ) -} - -const FeaturedDTFs = () => { - return ( -
-
-
- -
- RSR -

Description

-
- -
-
- -
- RSR -

Description

-
- -
-
- -
- RSR -

Description

-
- -
-
-
-
- -
- RSR -

Description

-
- -
-
- -
- RSR -

Description

-
- -
-
- -
- RSR -

Description

-
- -
-
-
- ) -} - -const Home = () => ( -
-
- - - Indexing the world - - -
- - - - -
-) - -export default Home diff --git a/src/views/index-dtf/auctions/views/rebalance/tests/atoms.test.ts b/src/views/index-dtf/auctions/views/rebalance/tests/atoms.test.ts new file mode 100644 index 000000000..929cc2a8a --- /dev/null +++ b/src/views/index-dtf/auctions/views/rebalance/tests/atoms.test.ts @@ -0,0 +1,233 @@ +import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest' +import { renderHook, act } from '@testing-library/react' +import { Provider, useAtomValue, useSetAtom } from 'jotai' +import { createElement, ReactNode } from 'react' + +import { + activeAuctionAtom, + isAuctionOngoingAtom, + rebalanceAuctionsAtom, + Auction, +} from '../atoms' + +// Wrapper component for Jotai Provider +const createWrapper = () => { + return ({ children }: { children: ReactNode }) => + createElement(Provider, null, children) +} + +// Helper to create mock auctions +const createMockAuction = ( + endTimeOffset: number, + id = '1' +): Partial => ({ + id, + endTime: String(Math.floor(Date.now() / 1000) + endTimeOffset), + startTime: String(Math.floor(Date.now() / 1000) - 3600), // Started 1 hour ago + tokens: [], + bids: [], +}) + +// Helper hook to set up test state +const useTestSetup = () => { + const setRebalanceAuctions = useSetAtom(rebalanceAuctionsAtom) + const activeAuction = useAtomValue(activeAuctionAtom) + const isAuctionOngoing = useAtomValue(isAuctionOngoingAtom) + + return { + setRebalanceAuctions, + activeAuction, + isAuctionOngoing, + } +} + +describe('activeAuctionAtom', () => { + beforeEach(() => { + vi.useFakeTimers() + vi.setSystemTime(new Date('2024-01-15T12:00:00Z')) + }) + + afterEach(() => { + vi.useRealTimers() + }) + + it('returns null when no auctions exist', () => { + const wrapper = createWrapper() + const { result } = renderHook(() => useTestSetup(), { wrapper }) + + act(() => { + result.current.setRebalanceAuctions([]) + }) + + expect(result.current.activeAuction).toBeNull() + }) + + it('returns null when all auctions have ended', () => { + const wrapper = createWrapper() + const { result } = renderHook(() => useTestSetup(), { wrapper }) + + act(() => { + result.current.setRebalanceAuctions([ + createMockAuction(-3600, '1'), // Ended 1 hour ago + createMockAuction(-1800, '2'), // Ended 30 min ago + ] as Auction[]) + }) + + expect(result.current.activeAuction).toBeNull() + }) + + it('returns first active auction when multiple exist', () => { + const wrapper = createWrapper() + const { result } = renderHook(() => useTestSetup(), { wrapper }) + + act(() => { + result.current.setRebalanceAuctions([ + createMockAuction(-3600, '1'), // Ended 1 hour ago + createMockAuction(1800, '2'), // Ends in 30 min (first active) + createMockAuction(3600, '3'), // Ends in 1 hour + ] as Auction[]) + }) + + expect(result.current.activeAuction).not.toBeNull() + expect(result.current.activeAuction?.auction.id).toBe('2') + expect(result.current.activeAuction?.index).toBe(2) // 1-based index + }) + + it('returns correct 1-based index for display', () => { + const wrapper = createWrapper() + const { result } = renderHook(() => useTestSetup(), { wrapper }) + + act(() => { + result.current.setRebalanceAuctions([ + createMockAuction(1800, '1'), // Active auction at index 0 + ] as Auction[]) + }) + + expect(result.current.activeAuction?.index).toBe(1) + }) + + it('handles exact endTime boundary (edge case)', () => { + const wrapper = createWrapper() + const { result } = renderHook(() => useTestSetup(), { wrapper }) + + const currentTime = Math.floor(Date.now() / 1000) + + act(() => { + result.current.setRebalanceAuctions([ + // Auction ends exactly at current time - should NOT be active + // because condition is endTime > currentTime + { + ...createMockAuction(0, '1'), + endTime: String(currentTime), + }, + ] as Auction[]) + }) + + // endTime === currentTime means auction has ended (not >) + expect(result.current.activeAuction).toBeNull() + }) + + it('handles auction ending 1 second in the future', () => { + const wrapper = createWrapper() + const { result } = renderHook(() => useTestSetup(), { wrapper }) + + act(() => { + result.current.setRebalanceAuctions([ + createMockAuction(1, '1'), // Ends in 1 second + ] as Auction[]) + }) + + expect(result.current.activeAuction).not.toBeNull() + expect(result.current.activeAuction?.auction.id).toBe('1') + }) + + it('transitions from active to null as time passes', () => { + const wrapper = createWrapper() + const { result } = renderHook(() => useTestSetup(), { wrapper }) + + act(() => { + result.current.setRebalanceAuctions([ + createMockAuction(60, '1'), // Ends in 60 seconds + ] as Auction[]) + }) + + expect(result.current.activeAuction).not.toBeNull() + + // Advance time past the auction end + act(() => { + vi.advanceTimersByTime(61 * 1000) + }) + + // Note: In real app, the atom would need to re-evaluate + // This test verifies the time comparison logic + const newCurrentTime = Math.floor(Date.now() / 1000) + const auctionEndTime = parseInt( + result.current.activeAuction?.auction.endTime || '0' + ) + expect(newCurrentTime).toBeGreaterThan(auctionEndTime) + }) +}) + +describe('isAuctionOngoingAtom', () => { + beforeEach(() => { + vi.useFakeTimers() + vi.setSystemTime(new Date('2024-01-15T12:00:00Z')) + }) + + afterEach(() => { + vi.useRealTimers() + }) + + it('returns false when no auctions exist', () => { + const wrapper = createWrapper() + const { result } = renderHook(() => useTestSetup(), { wrapper }) + + act(() => { + result.current.setRebalanceAuctions([]) + }) + + expect(result.current.isAuctionOngoing).toBe(false) + }) + + it('returns false when all auctions have ended', () => { + const wrapper = createWrapper() + const { result } = renderHook(() => useTestSetup(), { wrapper }) + + act(() => { + result.current.setRebalanceAuctions([ + createMockAuction(-3600, '1'), + createMockAuction(-1800, '2'), + ] as Auction[]) + }) + + expect(result.current.isAuctionOngoing).toBe(false) + }) + + it('returns true when at least one auction is active', () => { + const wrapper = createWrapper() + const { result } = renderHook(() => useTestSetup(), { wrapper }) + + act(() => { + result.current.setRebalanceAuctions([ + createMockAuction(-3600, '1'), // Ended + createMockAuction(1800, '2'), // Active + ] as Auction[]) + }) + + expect(result.current.isAuctionOngoing).toBe(true) + }) + + it('returns true when multiple auctions are active', () => { + const wrapper = createWrapper() + const { result } = renderHook(() => useTestSetup(), { wrapper }) + + act(() => { + result.current.setRebalanceAuctions([ + createMockAuction(1800, '1'), + createMockAuction(3600, '2'), + ] as Auction[]) + }) + + expect(result.current.isAuctionOngoing).toBe(true) + }) +}) diff --git a/src/views/index-dtf/deploy/components/deploy-coming-soon.tsx b/src/views/index-dtf/deploy/components/deploy-coming-soon.tsx index 6dc6fd23f..3641f4c8f 100644 --- a/src/views/index-dtf/deploy/components/deploy-coming-soon.tsx +++ b/src/views/index-dtf/deploy/components/deploy-coming-soon.tsx @@ -8,7 +8,7 @@ import { useAtomValue } from 'jotai' import { Combine, Globe, Palette, Zap } from 'lucide-react' import { useState } from 'react' import { useForm } from 'react-hook-form' -import { useColorMode } from 'theme-ui' +import { useTheme } from 'next-themes' import { z } from 'zod' import SocialMediaInput, { SOCIAL_MEDIA_OPTIONS, @@ -27,8 +27,8 @@ const formSchema = z.object({ type FormData = z.infer const DeployComingSoon = () => { - const [colorMode] = useColorMode() - const isDarkMode = colorMode === 'dark' + const { resolvedTheme } = useTheme() + const isDarkMode = resolvedTheme === 'dark' const account = useAtomValue(walletAtom) const [submitted, setSubmitted] = useState(false) const [submitting, setSubmitting] = useState(false) diff --git a/src/views/index-dtf/deploy/form-fields.ts b/src/views/index-dtf/deploy/form-fields.ts index f2c060ed9..9ff3283c5 100644 --- a/src/views/index-dtf/deploy/form-fields.ts +++ b/src/views/index-dtf/deploy/form-fields.ts @@ -103,14 +103,14 @@ export const DeployFormSchema = z message: 'Chain must be either Mainnet, Base or Binance Smart Chain', } ), - initialValue: z.coerce.number().positive('Initial value must be positive'), + initialValue: z.coerce.number().positive('Initial value must be positive'), tokensDistribution: z.array( z.object({ address: z .string() .refine(isAddressNotStrict, { message: 'Invalid Address' }), percentage: z.coerce - .number() + .number() // .multipleOf(0.01, 'Max precision is 0.01%') .positive('Token distribution must be positive'), }) @@ -128,25 +128,25 @@ export const DeployFormSchema = z .refine(isAddressNotStrict, { message: 'Invalid Address' }) .optional(), folioFee: z.coerce - .number() + .number() .min(0.15, 'Annualized TVL Fee must be 0.15% or greater') .max(10, 'Annualized TVL Fee must be 10% or less'), mintFee: z.coerce - .number() + .number() .min(0.15, 'Mint Fee must be 0.15% or greater') .max(5, 'Mint Fee must be 5% or less'), governanceShare: z.coerce - .number() + .number() .multipleOf(0.01, 'Max precision is 0.01%') .min(0) .max(100), deployerShare: z.coerce - .number() + .number() .multipleOf(0.01, 'Max precision is 0.01%') .min(0) .max(100), fixedPlatformFee: z.coerce - .number() + .number() .multipleOf(0.01, 'Max precision is 0.01%') .min(0) .max(100), @@ -157,7 +157,7 @@ export const DeployFormSchema = z .string() .refine(isAddressNotStrict, { message: 'Invalid Address' }), share: z.coerce - .number() + .number() .multipleOf(0.01, 'Max precision is 0.01%') .min(0) .max(100), @@ -165,7 +165,7 @@ export const DeployFormSchema = z ) .optional(), auctionLength: z.coerce - .number() + .number() .min(0) .max(45, 'Auction length must not exceed 45 minutes'), weightControl: z.boolean(), @@ -193,16 +193,16 @@ export const DeployFormSchema = z }) .optional() ), - basketVotingDelay: z.coerce.number().min(0), - basketVotingPeriod: z.coerce.number().min(0), - basketVotingQuorum: z.coerce.number().min(0).max(100), - basketVotingThreshold: z.coerce.number().min(0).max(100), - basketExecutionDelay: z.coerce.number().min(0), - governanceVotingDelay: z.coerce.number().min(0), - governanceVotingPeriod: z.coerce.number().min(0), - governanceVotingQuorum: z.coerce.number().min(0).max(100), - governanceVotingThreshold: z.coerce.number().min(0).max(100), - governanceExecutionDelay: z.coerce.number().min(0), + basketVotingDelay: z.coerce.number().min(0), + basketVotingPeriod: z.coerce.number().min(0), + basketVotingQuorum: z.coerce.number().min(0).max(100), + basketVotingThreshold: z.coerce.number().min(0).max(100), + basketExecutionDelay: z.coerce.number().min(0), + governanceVotingDelay: z.coerce.number().min(0), + governanceVotingPeriod: z.coerce.number().min(0), + governanceVotingQuorum: z.coerce.number().min(0).max(100), + governanceVotingThreshold: z.coerce.number().min(0).max(100), + governanceExecutionDelay: z.coerce.number().min(0), }) .refine( (data) => @@ -240,78 +240,58 @@ export const DeployFormSchema = z path: ['governanceVoteLock'], } ) - .refine( - (data) => { - if (data.inputType === 'unit') { - return data.tokensDistribution.every( - (token) => - !isNaN(Number(token.percentage)) && Number(token.percentage) > 0 - ) + .superRefine((data, ctx) => { + if (data.inputType === 'unit') { + const allValid = data.tokensDistribution.every( + (token) => + !isNaN(Number(token.percentage)) && Number(token.percentage) > 0 + ) + if (!allValid) { + ctx.addIssue({ + code: 'custom', + message: 'All token units must be valid positive numbers', + path: ['basket'], + }) } + return + } - const total = data.tokensDistribution?.reduce( + const total = + data.tokensDistribution?.reduce( (sum, { percentage }) => sum.plus(new Decimal(percentage)), new Decimal(0) - ) - return total.eq(new Decimal(100)) - }, - (data) => { - if (data.inputType === 'unit') { - return { - message: `All token units must be valid positive numbers`, - path: ['basket'], - } - } + ) || new Decimal(0) - const total = - data.tokensDistribution?.reduce( - (sum, { percentage }) => sum.plus(new Decimal(percentage)), - new Decimal(0) - ) || new Decimal(0) + if (!total.eq(new Decimal(100))) { const difference = new Decimal(100).minus(total) - const absDifference = difference.abs() const displayDifference = absDifference.toDisplayString() - return { + ctx.addIssue({ + code: 'custom', message: `The sum of the tokens distribution must be 100% (${ difference.isPositive() ? `${displayDifference}% missing` : `${displayDifference}% excess` }).`, path: ['basket'], - } + }) } - ) - .refine( - (data) => { - const totalShares = [ - data.governanceShare, - data.deployerShare, - ...(data.additionalRevenueRecipients?.map((r) => r.share) || []), - ] - - const total = totalShares.reduce( - (sum, share) => sum.plus(new Decimal(share || 0)), - new Decimal(0) - ) - - const platformFee = getPlatformFee(data.chain) - return total.plus(new Decimal(platformFee)).eq(new Decimal(100)) - }, - (data) => { - const totalShares = [ - data.governanceShare, - data.deployerShare, - ...(data.additionalRevenueRecipients?.map((r) => r.share) || []), - ] + }) + .superRefine((data, ctx) => { + const totalShares = [ + data.governanceShare, + data.deployerShare, + ...(data.additionalRevenueRecipients?.map((r) => r.share) || []), + ] - const total = totalShares.reduce( - (sum, share) => sum.plus(new Decimal(share || 0)), - new Decimal(0) - ) + const total = totalShares.reduce( + (sum, share) => sum.plus(new Decimal(share || 0)), + new Decimal(0) + ) - const platformFee = getPlatformFee(data.chain) + const platformFee = getPlatformFee(data.chain) + if (!total.plus(new Decimal(platformFee)).eq(new Decimal(100))) { const difference = new Decimal(100).minus( total.plus(new Decimal(platformFee)) ) @@ -319,16 +299,17 @@ export const DeployFormSchema = z const absDifference = difference.abs() const displayDifference = absDifference.toDisplayString() - return { + ctx.addIssue({ + code: 'custom', message: `The sum of governance share, creator share, additional recipients shares and platform share must be 100% (${ difference.isPositive() ? `${displayDifference}% missing` : `${displayDifference}% excess` })`, path: ['revenue-distribution'], - } + }) } - ) + }) .refine( (data) => { // Check if the governance settings are valid @@ -407,11 +388,13 @@ export const DeployFormSchema = z } ) -export const dtfDeployDefaultValues = { +export type DeployInputs = z.output + +export const dtfDeployDefaultValues: DeployInputs = { tokenName: '', symbol: '', mandate: '', - chain: undefined, + chain: 1, initialValue: 1, inputType: 'unit', tokensDistribution: [], @@ -442,5 +425,3 @@ export const dtfDeployDefaultValues = { governanceVotingQuorum: 10, governanceExecutionDelay: 2, } - -export type DeployInputs = z.infer diff --git a/src/views/index-dtf/deploy/index.tsx b/src/views/index-dtf/deploy/index.tsx index e8f8c0198..d6b3b448f 100644 --- a/src/views/index-dtf/deploy/index.tsx +++ b/src/views/index-dtf/deploy/index.tsx @@ -8,7 +8,6 @@ import DeployAccordion from './components/deploy-accordion' import RightPanel from './components/right-panel' import { DeployFormSchema, - DeployInputs, dtfDeployDefaultValues, } from './form-fields' import Updater from './updater' @@ -43,7 +42,7 @@ const DeployerHeader = () => { const IndexTokenDeploy = () => { useTrackPage('create', 'index_dtf') - const form = useForm({ + const form = useForm({ resolver: zodResolver(DeployFormSchema), defaultValues: dtfDeployDefaultValues, }) diff --git a/src/views/index-dtf/deploy/steps/confirm-deploy/index.tsx b/src/views/index-dtf/deploy/steps/confirm-deploy/index.tsx index 48f1cb969..5daef2291 100644 --- a/src/views/index-dtf/deploy/steps/confirm-deploy/index.tsx +++ b/src/views/index-dtf/deploy/steps/confirm-deploy/index.tsx @@ -23,7 +23,7 @@ import SimpleIndexDeploy from './simple' import { inputAmountAtom } from './simple/atoms' import SuccessView from './success' import Ticker from '../../utils/ticker' -import { TransactionButtonContainer } from '@/components/old/button/TransactionButton' +import { TransactionButtonContainer } from '@/components/ui/transaction-button' import { Address } from 'viem' const Header = () => { diff --git a/src/views/index-dtf/deploy/steps/confirm-deploy/manual/components/approve-all-deploy-button.tsx b/src/views/index-dtf/deploy/steps/confirm-deploy/manual/components/approve-all-deploy-button.tsx index e6c0f6565..ae4c1d9e3 100644 --- a/src/views/index-dtf/deploy/steps/confirm-deploy/manual/components/approve-all-deploy-button.tsx +++ b/src/views/index-dtf/deploy/steps/confirm-deploy/manual/components/approve-all-deploy-button.tsx @@ -1,4 +1,4 @@ -import { TransactionButtonContainer } from '@/components/old/button/TransactionButton' +import { TransactionButtonContainer } from '@/components/ui/transaction-button' import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert' import { Button } from '@/components/ui/button' import Spinner from '@/components/ui/spinner' diff --git a/src/views/index-dtf/deploy/steps/confirm-deploy/manual/components/confirm-manual-deploy-button.tsx b/src/views/index-dtf/deploy/steps/confirm-deploy/manual/components/confirm-manual-deploy-button.tsx index de7bdf2f1..9e3fa7fa9 100644 --- a/src/views/index-dtf/deploy/steps/confirm-deploy/manual/components/confirm-manual-deploy-button.tsx +++ b/src/views/index-dtf/deploy/steps/confirm-deploy/manual/components/confirm-manual-deploy-button.tsx @@ -1,7 +1,7 @@ import dtfIndexDeployerAbi from '@/abis/dtf-index-deployer-abi' import TransactionButton, { TransactionButtonContainer, -} from '@/components/old/button/TransactionButton' +} from '@/components/ui/transaction-button' import useContractWrite from '@/hooks/useContractWrite' import { chainIdAtom, walletAtom } from '@/state/atoms' import { getCurrentTime } from '@/utils' @@ -294,7 +294,7 @@ const ConfirmManualDeployButton = () => { loadingText={!!hash ? 'Confirming tx...' : 'Pending, sign in wallet'} onClick={write} text={title} - fullWidth + className="w-full" error={validationError || error || txError} /> diff --git a/src/views/index-dtf/deploy/steps/confirm-deploy/simple/index.tsx b/src/views/index-dtf/deploy/steps/confirm-deploy/simple/index.tsx index da0d303bc..a4808e00f 100644 --- a/src/views/index-dtf/deploy/steps/confirm-deploy/simple/index.tsx +++ b/src/views/index-dtf/deploy/steps/confirm-deploy/simple/index.tsx @@ -1,4 +1,4 @@ -import { TransactionButtonContainer } from '@/components/old/button/TransactionButton' +import { TransactionButtonContainer } from '@/components/ui/transaction-button' import { Button } from '@/components/ui/button' import Copy from '@/components/ui/copy' import Swap, { SlippageSelector } from '@/components/ui/swap' diff --git a/src/views/index-dtf/deploy/steps/confirm-deploy/simple/simple-deploy-button.tsx b/src/views/index-dtf/deploy/steps/confirm-deploy/simple/simple-deploy-button.tsx index d4e481183..f013f8600 100644 --- a/src/views/index-dtf/deploy/steps/confirm-deploy/simple/simple-deploy-button.tsx +++ b/src/views/index-dtf/deploy/steps/confirm-deploy/simple/simple-deploy-button.tsx @@ -1,4 +1,4 @@ -import TransactionButton from '@/components/old/button/TransactionButton' +import TransactionButton from '@/components/ui/transaction-button' import useContractWrite from '@/hooks/useContractWrite' import { ZapResult } from '@/views/yield-dtf/issuance/components/zapV2/api' import { useAtomValue, useSetAtom } from 'jotai' @@ -140,7 +140,7 @@ const SimpleDeployButton = ({ ? `Create ${form?.symbol || 'DTF'}` : `Approve use of ${usedToken.symbol || 'ERC20'}` } - fullWidth + className="w-full" error={ approvalError || approvalValidationError || diff --git a/src/views/index-dtf/deploy/steps/create-dao/index.tsx b/src/views/index-dtf/deploy/steps/create-dao/index.tsx index 4b85aeaf6..b8c8668bd 100644 --- a/src/views/index-dtf/deploy/steps/create-dao/index.tsx +++ b/src/views/index-dtf/deploy/steps/create-dao/index.tsx @@ -26,7 +26,7 @@ import { daoTokenSymbolAtom, formReadyForSubmitAtom, } from '../../atoms' -import { TransactionButtonContainer } from '@/components/old/button/TransactionButton' +import { TransactionButtonContainer } from '@/components/ui/transaction-button' const CreateDAO = () => { const chainId = useAtomValue(chainIdAtom) diff --git a/src/views/index-dtf/governance/components/governance-guardians.tsx b/src/views/index-dtf/governance/components/governance-guardians.tsx index 37668b3d5..72f754bb4 100644 --- a/src/views/index-dtf/governance/components/governance-guardians.tsx +++ b/src/views/index-dtf/governance/components/governance-guardians.tsx @@ -1,4 +1,4 @@ -import CopyValue from '@/components/old/button/CopyValue' +import CopyValue from '@/components/ui/copy-value' import { Skeleton } from '@/components/ui/skeleton' import { cn } from '@/lib/utils' import { chainIdAtom } from '@/state/atoms' diff --git a/src/views/index-dtf/governance/views/proposal/components/proposal-cancel-button.tsx b/src/views/index-dtf/governance/views/proposal/components/proposal-cancel-button.tsx index 35d1be05e..7decfcbb2 100644 --- a/src/views/index-dtf/governance/views/proposal/components/proposal-cancel-button.tsx +++ b/src/views/index-dtf/governance/views/proposal/components/proposal-cancel-button.tsx @@ -1,4 +1,4 @@ -import TransactionButton from '@/components/old/button/TransactionButton' +import TransactionButton from '@/components/ui/transaction-button' import { indexDTFAtom } from '@/state/dtf/atoms' import { PROPOSAL_STATES } from '@/utils/constants' import { t } from '@lingui/macro' @@ -126,19 +126,16 @@ const ProposalCancel = () => { return ( ) } diff --git a/src/views/index-dtf/governance/views/proposal/components/proposal-deadline-alert.tsx b/src/views/index-dtf/governance/views/proposal/components/proposal-deadline-alert.tsx index 24c8cee4f..b14153b9d 100644 --- a/src/views/index-dtf/governance/views/proposal/components/proposal-deadline-alert.tsx +++ b/src/views/index-dtf/governance/views/proposal/components/proposal-deadline-alert.tsx @@ -1,7 +1,6 @@ import { useAtomValue } from 'jotai' import { ReactNode } from 'react' -import { Check, Slash, X } from 'lucide-react' -import { Box, Spinner, Text } from 'theme-ui' +import { Check, Slash, X, Loader2 } from 'lucide-react' import { parseDurationShort } from 'utils' import { PROPOSAL_STATES } from 'utils/constants' import { proposalDetailAtom } from '../atom' @@ -131,7 +130,7 @@ const ProposalAlert = () => { className="flex flex-col items-center justify-center h-full py-4" style={{ color: DEADLINE_STATES[state.state].color }} > - +

{DEADLINE_STATES[state.state].text}

{deadline}

diff --git a/src/views/index-dtf/governance/views/proposal/components/proposal-detail-timeline.tsx b/src/views/index-dtf/governance/views/proposal/components/proposal-detail-timeline.tsx index d9aec1869..223c86a0e 100644 --- a/src/views/index-dtf/governance/views/proposal/components/proposal-detail-timeline.tsx +++ b/src/views/index-dtf/governance/views/proposal/components/proposal-detail-timeline.tsx @@ -14,7 +14,7 @@ import { import { ReactNode } from 'react' import { blockTimestampAtom, chainIdAtom } from 'state/atoms' import { colors } from 'theme' -import { Box, Progress, Text } from 'theme-ui' +import { Progress } from '@/components/ui/progress' import { formatDate, getCurrentTime, parseDuration } from 'utils' import { PROPOSAL_STATES } from 'utils/constants' import { proposalDetailAtom } from '../atom' @@ -55,15 +55,7 @@ const TimelineItem = ({ {showProgress && ( )} @@ -80,13 +72,13 @@ export const TimelineItemCreated = () => { title="Proposal created" surtitle={formatDate(+(proposal?.creationTime || 0) * 1000)} subtitle={ - - By: +
+ By: - +
} /> ) @@ -200,9 +192,9 @@ export const TimelineItemVotingResult = () => { + {TITLE_BY_STATE[proposal?.votingState.state ?? '']} - + } /> ) diff --git a/src/views/index-dtf/governance/views/proposal/components/proposal-detail-votes.tsx b/src/views/index-dtf/governance/views/proposal/components/proposal-detail-votes.tsx index fba35120f..2de22a4ab 100644 --- a/src/views/index-dtf/governance/views/proposal/components/proposal-detail-votes.tsx +++ b/src/views/index-dtf/governance/views/proposal/components/proposal-detail-votes.tsx @@ -1,4 +1,4 @@ -import GoTo from '@/components/old/button/GoTo' +import GoTo from '@/components/ui/go-to' import { ScrollArea } from '@/components/ui/scroll-area' import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs' import BlockiesAvatar from '@/components/utils/blockies-avatar' diff --git a/src/views/index-dtf/governance/views/proposal/components/proposal-execute-button.tsx b/src/views/index-dtf/governance/views/proposal/components/proposal-execute-button.tsx index e7d46e5de..912b55b72 100644 --- a/src/views/index-dtf/governance/views/proposal/components/proposal-execute-button.tsx +++ b/src/views/index-dtf/governance/views/proposal/components/proposal-execute-button.tsx @@ -1,4 +1,4 @@ -import TransactionButton from '@/components/old/button/TransactionButton' +import TransactionButton from '@/components/ui/transaction-button' import { getCurrentTime } from '@/utils' import { t } from '@lingui/macro' import dtfIndexGovernanceAbi from 'abis/dtf-index-governance' @@ -56,13 +56,13 @@ const ProposalExecute = () => { return ( diff --git a/src/views/index-dtf/governance/views/proposal/components/proposal-header.tsx b/src/views/index-dtf/governance/views/proposal/components/proposal-header.tsx index 6f06bf89c..eff5993dc 100644 --- a/src/views/index-dtf/governance/views/proposal/components/proposal-header.tsx +++ b/src/views/index-dtf/governance/views/proposal/components/proposal-header.tsx @@ -1,4 +1,4 @@ -import CopyValue from '@/components/old/button/CopyValue' +import CopyValue from '@/components/ui/copy-value' import { Button } from '@/components/ui/button' import ExplorerAddress from '@/components/utils/explorer-address' import { chainIdAtom } from '@/state/atoms' diff --git a/src/views/index-dtf/governance/views/proposal/components/proposal-queue-button.tsx b/src/views/index-dtf/governance/views/proposal/components/proposal-queue-button.tsx index e5edd7216..f55943ae6 100644 --- a/src/views/index-dtf/governance/views/proposal/components/proposal-queue-button.tsx +++ b/src/views/index-dtf/governance/views/proposal/components/proposal-queue-button.tsx @@ -1,5 +1,5 @@ import dtfIndexGovernance from '@/abis/dtf-index-governance' -import TransactionButton from '@/components/old/button/TransactionButton' +import TransactionButton from '@/components/ui/transaction-button' import { indexDTFAtom } from '@/state/dtf/atoms' import { PROPOSAL_STATES } from '@/utils/constants' import { t } from '@lingui/macro' @@ -70,10 +70,9 @@ const ProposalQueue = () => { return ( { if (hash && status === 'success') { return ( - +

- Transaction successful! + Transaction successful!
- View on{' '} {ETHERSCAN_NAMES[chainId]} - - + +
) } return ( - - +
+ " {proposal?.description ? getProposalTitle(proposal.description) : 'Loading...'} - - - + +
+ Proposed by: - - + + {shortenAddress(proposal?.proposer?.address ?? '')} - + - - - +
+
+ {voteOptions.map((option, index) => ( - {option.value === VOTE_TYPE.FOR && } {option.value === VOTE_TYPE.AGAINST && } {option.value === VOTE_TYPE.ABSTAIN && } - + {option.label} - - + ))} - + diff --git a/src/views/index-dtf/governance/views/propose/views/propose-basket-settings/index.tsx b/src/views/index-dtf/governance/views/propose/views/propose-basket-settings/index.tsx index 624e8bca7..5c9b5f10e 100644 --- a/src/views/index-dtf/governance/views/propose/views/propose-basket-settings/index.tsx +++ b/src/views/index-dtf/governance/views/propose/views/propose-basket-settings/index.tsx @@ -6,7 +6,7 @@ import BasketSettingsProposalSections from './components/basket-settings-proposa import BasketSettingsProposalOverview from './components/basket-settings-proposal-overview' import Updater from './updater' import ConfirmBasketSettingsProposal from './components/confirm-basket-settings-proposal' -import { createProposeBasketSettingsSchema, ProposeBasketSettings } from './form-fields' +import { createProposeBasketSettingsSchema } from './form-fields' import { indexDTFAtom } from '@/state/dtf/atoms' import { useMemo } from 'react' @@ -26,7 +26,7 @@ const IndexDTFBasketSettingsProposal = () => { return createProposeBasketSettingsSchema(Number(quorumDenominator)) }, [quorumDenominator]) - const methods = useForm({ + const methods = useForm({ mode: 'onTouched', reValidateMode: 'onChange', resolver: zodResolver(schema), diff --git a/src/views/index-dtf/governance/views/propose/views/propose-dao-settings/index.tsx b/src/views/index-dtf/governance/views/propose/views/propose-dao-settings/index.tsx index 54633199c..f1b48b7c8 100644 --- a/src/views/index-dtf/governance/views/propose/views/propose-dao-settings/index.tsx +++ b/src/views/index-dtf/governance/views/propose/views/propose-dao-settings/index.tsx @@ -6,7 +6,7 @@ import DaoSettingsProposalSections from './components/dao-settings-proposal-sect import DaoSettingsProposalOverview from './components/dao-settings-proposal-overview' import Updater from './updater' import ConfirmDaoSettingsProposal from './components/confirm-dao-settings-proposal' -import { createProposeDaoSettingsSchema, ProposeDaoSettings } from './form-fields' +import { createProposeDaoSettingsSchema } from './form-fields' import { indexDTFAtom } from '@/state/dtf/atoms' import { useMemo } from 'react' @@ -26,7 +26,7 @@ const IndexDTFDaoSettingsProposal = () => { return createProposeDaoSettingsSchema(Number(quorumDenominator)) }, [quorumDenominator]) - const methods = useForm({ + const methods = useForm({ mode: 'onChange', reValidateMode: 'onChange', resolver: zodResolver(schema), diff --git a/src/views/index-dtf/governance/views/propose/views/propose-dtf-settings/form-fields.ts b/src/views/index-dtf/governance/views/propose/views/propose-dtf-settings/form-fields.ts index c7244b55e..574b506ab 100644 --- a/src/views/index-dtf/governance/views/propose/views/propose-dtf-settings/form-fields.ts +++ b/src/views/index-dtf/governance/views/propose/views/propose-dtf-settings/form-fields.ts @@ -123,33 +123,19 @@ export const createProposeSettingsSchema = (quorumDenominator?: number) => z path: ['roles'], } ) - .refine( - (data) => { - const totalShares = [ - data.governanceShare, - data.deployerShare, - ...(data.additionalRevenueRecipients?.map((r) => r.share) || []), - ] - - const total = totalShares.reduce( - (sum, share) => sum.plus(new Decimal(share || 0)), - new Decimal(0) - ) - - return total.plus(new Decimal(data.fixedPlatformFee)).eq(new Decimal(100)) - }, - (data) => { - const totalShares = [ - data.governanceShare, - data.deployerShare, - ...(data.additionalRevenueRecipients?.map((r) => r.share) || []), - ] + .superRefine((data, ctx) => { + const totalShares = [ + data.governanceShare, + data.deployerShare, + ...(data.additionalRevenueRecipients?.map((r) => r.share) || []), + ] - const total = totalShares.reduce( - (sum, share) => sum.plus(new Decimal(share || 0)), - new Decimal(0) - ) + const total = totalShares.reduce( + (sum, share) => sum.plus(new Decimal(share || 0)), + new Decimal(0) + ) + if (!total.plus(new Decimal(data.fixedPlatformFee)).eq(new Decimal(100))) { const difference = new Decimal(100).minus( total.plus(new Decimal(data.fixedPlatformFee)) ) @@ -157,16 +143,17 @@ export const createProposeSettingsSchema = (quorumDenominator?: number) => z const absDifference = difference.abs() const displayDifference = absDifference.toDisplayString() - return { + ctx.addIssue({ + code: 'custom', message: `The sum of governance share, creator share, additional recipients shares and platform share must be 100% (${ difference.isPositive() ? `${displayDifference}% missing` : `${displayDifference}% excess` })`, path: ['revenue-distribution'], - } + }) } - ) + }) .refine( (data) => { const governanceAddresses = [ diff --git a/src/views/index-dtf/governance/views/propose/views/propose-dtf-settings/index.tsx b/src/views/index-dtf/governance/views/propose/views/propose-dtf-settings/index.tsx index 3a5269d71..8a98ad1f7 100644 --- a/src/views/index-dtf/governance/views/propose/views/propose-dtf-settings/index.tsx +++ b/src/views/index-dtf/governance/views/propose/views/propose-dtf-settings/index.tsx @@ -4,7 +4,7 @@ import Updater from './updater' import DTFSettingsProposalOverview from './components/dtf-settings-proposal-overview' import ConfirmDTFSettingsProposal from './components/confirm-dtf-settings-proposal' import { FormProvider, useForm } from 'react-hook-form' -import { ProposeSettings, createProposeSettingsSchema } from './form-fields' +import { createProposeSettingsSchema } from './form-fields' import { zodResolver } from '@hookform/resolvers/zod' import DTFSettingsProposalSections from './components/dtf-settings-proposal-sections' import { indexDTFAtom } from '@/state/dtf/atoms' @@ -26,7 +26,7 @@ const ProposeDTFSettings = () => { return createProposeSettingsSchema(Number(quorumDenominator)) }, [quorumDenominator]) - const form = useForm({ + const form = useForm({ resolver: zodResolver(schema), mode: 'onChange', // Enable validation on every change }) diff --git a/src/views/index-dtf/issuance/manual/components/approve-all-button.tsx b/src/views/index-dtf/issuance/manual/components/approve-all-button.tsx index a95007d51..5fac74fff 100644 --- a/src/views/index-dtf/issuance/manual/components/approve-all-button.tsx +++ b/src/views/index-dtf/issuance/manual/components/approve-all-button.tsx @@ -1,4 +1,4 @@ -import { TransactionButtonContainer } from '@/components/old/button/TransactionButton' +import { TransactionButtonContainer } from '@/components/ui/transaction-button' import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert' import { Button } from '@/components/ui/button' import Spinner from '@/components/ui/spinner' diff --git a/src/views/index-dtf/issuance/manual/components/index-manual-issuance.tsx b/src/views/index-dtf/issuance/manual/components/index-manual-issuance.tsx index 380b0106e..ed285ad86 100644 --- a/src/views/index-dtf/issuance/manual/components/index-manual-issuance.tsx +++ b/src/views/index-dtf/issuance/manual/components/index-manual-issuance.tsx @@ -1,6 +1,6 @@ import dtfIndexAbi from '@/abis/dtf-index-abi' import dtfIndexAbiV2 from '@/abis/dtf-index-abi-v2' -import { TransactionButtonContainer } from '@/components/old/button/TransactionButton' +import { TransactionButtonContainer } from '@/components/ui/transaction-button' import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert' import { Button } from '@/components/ui/button' import Spinner from '@/components/ui/spinner' diff --git a/src/views/index-dtf/issuance/manual/tests/atoms.test.ts b/src/views/index-dtf/issuance/manual/tests/atoms.test.ts new file mode 100644 index 000000000..ccab01ab2 --- /dev/null +++ b/src/views/index-dtf/issuance/manual/tests/atoms.test.ts @@ -0,0 +1,302 @@ +import { describe, it, expect, beforeEach, vi } from 'vitest' +import { renderHook, act } from '@testing-library/react' +import { Provider, useAtom, useAtomValue, useSetAtom } from 'jotai' +import { parseEther } from 'viem' +import { createElement, ReactNode } from 'react' + +import { + maxMintAmountAtom, + assetDistributionAtom, + balanceMapAtom, + tokensNeedingApprovalAtom, + allowanceMapAtom, + assetAmountsMapAtom, + amountAtom, +} from '../atoms' +import { indexDTFAtom, indexDTFBasketAtom } from '@/state/dtf/atoms' + +// Wrapper component for Jotai Provider +const createWrapper = () => { + return ({ children }: { children: ReactNode }) => + createElement(Provider, null, children) +} + +// Helper hook to set up test state +const useTestSetup = () => { + const setIndexDTF = useSetAtom(indexDTFAtom) + const setAssetDistribution = useSetAtom(assetDistributionAtom) + const setBalanceMap = useSetAtom(balanceMapAtom) + const setIndexDTFBasket = useSetAtom(indexDTFBasketAtom) + const setAmount = useSetAtom(amountAtom) + const setAllowanceMap = useSetAtom(allowanceMapAtom) + const maxMintAmount = useAtomValue(maxMintAmountAtom) + const tokensNeedingApproval = useAtomValue(tokensNeedingApprovalAtom) + + return { + setIndexDTF, + setAssetDistribution, + setBalanceMap, + setIndexDTFBasket, + setAmount, + setAllowanceMap, + maxMintAmount, + tokensNeedingApproval, + } +} + +// Minimal mock for indexDTF +const createMockIndexDTF = (overrides = {}) => + ({ + id: '0x123', + ...overrides, + }) as any + +const createMockToken = (address: string) => ({ + address, + symbol: 'TEST', + name: 'Test Token', + decimals: 18, +}) + +describe('maxMintAmountAtom', () => { + describe('early returns (guard clauses)', () => { + it('returns 0n when indexDTF is undefined', () => { + const wrapper = createWrapper() + const { result } = renderHook(() => useTestSetup(), { wrapper }) + + act(() => { + result.current.setIndexDTF(undefined as any) + result.current.setAssetDistribution({ '0xtoken': parseEther('1') }) + result.current.setBalanceMap({ '0xtoken': parseEther('100') }) + }) + + expect(result.current.maxMintAmount).toBe(0n) + }) + + it('returns 0n when assetDistribution is empty', () => { + const wrapper = createWrapper() + const { result } = renderHook(() => useTestSetup(), { wrapper }) + + act(() => { + result.current.setIndexDTF(createMockIndexDTF()) + result.current.setAssetDistribution({}) + result.current.setBalanceMap({ '0xtoken': parseEther('100') }) + }) + + expect(result.current.maxMintAmount).toBe(0n) + }) + + it('returns 0n when balanceMap is empty', () => { + const wrapper = createWrapper() + const { result } = renderHook(() => useTestSetup(), { wrapper }) + + act(() => { + result.current.setIndexDTF(createMockIndexDTF()) + result.current.setAssetDistribution({ '0xtoken': parseEther('1') }) + result.current.setBalanceMap({}) + }) + + expect(result.current.maxMintAmount).toBe(0n) + }) + + it('returns 0n when asset missing from balanceMap', () => { + const wrapper = createWrapper() + const { result } = renderHook(() => useTestSetup(), { wrapper }) + + act(() => { + result.current.setIndexDTF(createMockIndexDTF()) + result.current.setAssetDistribution({ '0xtokenA': parseEther('1') }) + result.current.setBalanceMap({ '0xtokenB': parseEther('100') }) + }) + + expect(result.current.maxMintAmount).toBe(0n) + }) + + it('returns 0n when balance is exactly 0n (falsy check)', () => { + const wrapper = createWrapper() + const { result } = renderHook(() => useTestSetup(), { wrapper }) + + act(() => { + result.current.setIndexDTF(createMockIndexDTF()) + result.current.setAssetDistribution({ '0xtoken': parseEther('1') }) + result.current.setBalanceMap({ '0xtoken': 0n }) + }) + + // Note: This tests the !balanceMap[asset] check which is true for 0n + expect(result.current.maxMintAmount).toBe(0n) + }) + }) + + describe('calculation correctness', () => { + it('calculates correctly for single asset', () => { + const wrapper = createWrapper() + const { result } = renderHook(() => useTestSetup(), { wrapper }) + + act(() => { + result.current.setIndexDTF(createMockIndexDTF()) + // User has 100 tokens, needs 0.5 per mint -> can mint 200 + result.current.setAssetDistribution({ '0xtoken': parseEther('0.5') }) + result.current.setBalanceMap({ '0xtoken': parseEther('100') }) + }) + + expect(result.current.maxMintAmount).toBe(parseEther('200')) + }) + + it('returns minimum across multiple assets (limiting asset)', () => { + const wrapper = createWrapper() + const { result } = renderHook(() => useTestSetup(), { wrapper }) + + act(() => { + result.current.setIndexDTF(createMockIndexDTF()) + // Asset A: 100 balance / 0.5 needed = 200 possible + // Asset B: 50 balance / 0.25 needed = 200 possible + // Asset C: 30 balance / 0.2 needed = 150 possible (limiting) + result.current.setAssetDistribution({ + '0xtokenA': parseEther('0.5'), + '0xtokenB': parseEther('0.25'), + '0xtokenC': parseEther('0.2'), + }) + result.current.setBalanceMap({ + '0xtokenA': parseEther('100'), + '0xtokenB': parseEther('50'), + '0xtokenC': parseEther('30'), + }) + }) + + expect(result.current.maxMintAmount).toBe(parseEther('150')) + }) + + it('skips assets with zero distribution (no division by zero)', () => { + const wrapper = createWrapper() + const { result } = renderHook(() => useTestSetup(), { wrapper }) + + act(() => { + result.current.setIndexDTF(createMockIndexDTF()) + result.current.setAssetDistribution({ + '0xtokenA': parseEther('0.5'), + '0xtokenB': 0n, // zero distribution - should skip + }) + result.current.setBalanceMap({ + '0xtokenA': parseEther('100'), + '0xtokenB': parseEther('50'), + }) + }) + + // Should only consider tokenA: 100 / 0.5 = 200 + expect(result.current.maxMintAmount).toBe(parseEther('200')) + }) + + it('handles very small balances correctly', () => { + const wrapper = createWrapper() + const { result } = renderHook(() => useTestSetup(), { wrapper }) + + act(() => { + result.current.setIndexDTF(createMockIndexDTF()) + // User has 0.001 tokens, needs 0.0001 per mint -> can mint 10 + result.current.setAssetDistribution({ '0xtoken': parseEther('0.0001') }) + result.current.setBalanceMap({ '0xtoken': parseEther('0.001') }) + }) + + expect(result.current.maxMintAmount).toBe(parseEther('10')) + }) + + it('handles very large balances without overflow', () => { + const wrapper = createWrapper() + const { result } = renderHook(() => useTestSetup(), { wrapper }) + + act(() => { + result.current.setIndexDTF(createMockIndexDTF()) + // 1 billion tokens + const billion = parseEther('1000000000') + result.current.setAssetDistribution({ '0xtoken': parseEther('1') }) + result.current.setBalanceMap({ '0xtoken': billion }) + }) + + expect(result.current.maxMintAmount).toBe(parseEther('1000000000')) + }) + }) + + describe('precision edge cases', () => { + it('handles non-divisible amounts (rounds down)', () => { + const wrapper = createWrapper() + const { result } = renderHook(() => useTestSetup(), { wrapper }) + + act(() => { + result.current.setIndexDTF(createMockIndexDTF()) + // 100 balance / 3 needed = 33.333... -> should floor + result.current.setAssetDistribution({ '0xtoken': parseEther('3') }) + result.current.setBalanceMap({ '0xtoken': parseEther('100') }) + }) + + const maxMint = result.current.maxMintAmount + // Result * 3 should not exceed 100 (verifies floor behavior) + const requiredForResult = (maxMint * parseEther('3')) / parseEther('1') + expect(requiredForResult).toBeLessThanOrEqual(parseEther('100')) + }) + }) +}) + +describe('tokensNeedingApprovalAtom', () => { + it('returns empty array when basket is null', () => { + const wrapper = createWrapper() + const { result } = renderHook(() => useTestSetup(), { wrapper }) + + act(() => { + result.current.setIndexDTFBasket(null as any) + }) + + expect(result.current.tokensNeedingApproval).toEqual([]) + }) + + it('returns tokens where allowance < required', () => { + const wrapper = createWrapper() + const { result } = renderHook(() => useTestSetup(), { wrapper }) + + const tokenA = createMockToken('0xTokenA') + const tokenB = createMockToken('0xTokenB') + + act(() => { + result.current.setIndexDTFBasket([tokenA, tokenB] as any) + result.current.setAmount('10') + result.current.setAssetDistribution({ + '0xTokenA': parseEther('1'), + '0xTokenB': parseEther('1'), + }) + result.current.setAllowanceMap({ + '0xtokena': parseEther('5'), // lowercase - less than required + '0xtokenb': parseEther('20'), // lowercase - enough + }) + }) + + const needsApproval = result.current.tokensNeedingApproval + expect(needsApproval.length).toBe(1) + expect(needsApproval[0].address).toBe('0xTokenA') + }) + + // BUG TEST: Address case sensitivity + it('matches addresses case-insensitively', () => { + const wrapper = createWrapper() + const { result } = renderHook(() => useTestSetup(), { wrapper }) + + const token = createMockToken('0xABCDEF') // mixed case + + act(() => { + result.current.setIndexDTFBasket([token] as any) + result.current.setAmount('10') + result.current.setAssetDistribution({ + '0xABCDEF': parseEther('1'), // original case + }) + result.current.setAllowanceMap({ + '0xabcdef': parseEther('5'), // lowercase + }) + }) + + // This test verifies the bug: allowanceMap uses lowercase but + // assetAmountsMapAtom (requiredAmounts) may not + const needsApproval = result.current.tokensNeedingApproval + + // If bug exists: required would be 0n (no match), so token wouldn't be returned + // If fixed: required would be 10e18, allowance is 5e18, so token IS returned + expect(needsApproval.length).toBe(1) + }) +}) diff --git a/src/views/index-dtf/manage/components/schema.ts b/src/views/index-dtf/manage/components/schema.ts index 7efd41d40..1b122f7d7 100644 --- a/src/views/index-dtf/manage/components/schema.ts +++ b/src/views/index-dtf/manage/components/schema.ts @@ -8,7 +8,7 @@ export const manageFormSchema = z.object({ mobileCover: z.string().optional(), description: z.string().optional(), notesFromCreator: z.string().optional(), - prospectus: z.string().url().optional().or(z.literal('')), + prospectus: z.url().optional().or(z.literal('')), tags: z .array(z.object({ value: z.string(), label: z.string() })) .optional(), @@ -20,16 +20,15 @@ export const manageFormSchema = z.object({ creator: z.object({ name: z.string().optional(), icon: z.string().optional(), - link: z.string().url().optional().or(z.literal('')), + link: z.url().optional().or(z.literal('')), }), curator: z.object({ name: z.string().optional(), icon: z.string().optional(), - link: z.string().url().optional().or(z.literal('')), + link: z.url().optional().or(z.literal('')), }), socials: z.object({ twitter: z - .string() .url() .refine( (url) => !url || url.includes('x.com') || url.includes('twitter.com'), @@ -40,7 +39,6 @@ export const manageFormSchema = z.object({ .optional() .or(z.literal('')), telegram: z - .string() .url() .refine((url) => !url || url.includes('t.me'), { message: 'Must be a valid Telegram URL', @@ -48,7 +46,6 @@ export const manageFormSchema = z.object({ .optional() .or(z.literal('')), discord: z - .string() .url() .refine( (url) => @@ -59,7 +56,7 @@ export const manageFormSchema = z.object({ ) .optional() .or(z.literal('')), - website: z.string().url().optional().or(z.literal('')), + website: z.url().optional().or(z.literal('')), }), files: z.object({ logo: z.instanceof(File).optional(), diff --git a/src/views/index-dtf/manage/components/submit-button.tsx b/src/views/index-dtf/manage/components/submit-button.tsx index cf90e6590..f8b01b846 100644 --- a/src/views/index-dtf/manage/components/submit-button.tsx +++ b/src/views/index-dtf/manage/components/submit-button.tsx @@ -1,4 +1,4 @@ -import { TransactionButtonContainer } from '@/components/old/button/TransactionButton' +import { TransactionButtonContainer } from '@/components/ui/transaction-button' import { Button } from '@/components/ui/button' import Spinner from '@/components/ui/spinner' import { uploadFile } from '@/lib/api-upload' diff --git a/src/views/index-dtf/manage/index.tsx b/src/views/index-dtf/manage/index.tsx index 596ed17a3..1faece328 100644 --- a/src/views/index-dtf/manage/index.tsx +++ b/src/views/index-dtf/manage/index.tsx @@ -45,7 +45,7 @@ const defaultValues: ManageFormValues = { } const IndexDTFManage = () => { - const form = useForm({ + const form = useForm({ resolver: zodResolver(manageFormSchema), defaultValues, mode: 'onChange', diff --git a/src/views/index-dtf/overview/components/charts/price-chart.tsx b/src/views/index-dtf/overview/components/charts/price-chart.tsx index 07c0f72c5..894719bca 100644 --- a/src/views/index-dtf/overview/components/charts/price-chart.tsx +++ b/src/views/index-dtf/overview/components/charts/price-chart.tsx @@ -1,4 +1,3 @@ -import InfoBox from '@/components/old/info-box' import { ChartConfig, ChartContainer } from '@/components/ui/chart' import { Skeleton } from '@/components/ui/skeleton' import { useIsMobile } from '@/hooks/use-media-query' @@ -14,7 +13,6 @@ import dayjs from 'dayjs' import { atom, useAtomValue, useSetAtom } from 'jotai' import { useEffect, useMemo } from 'react' import { Area, AreaChart, Tooltip, TooltipProps, XAxis, YAxis } from 'recharts' -import { Card } from 'theme-ui' import useIndexDTFPriceHistory from '../../hooks/use-dtf-price-history' import IndexCTAsOverviewMobile from '../index-ctas-overview-mobile' import IndexTokenAddress from '../index-token-address' @@ -64,9 +62,12 @@ function CustomTooltip({ ? formatToSignificantDigits(value) : formatCurrency(value, 2) return ( - - - +
+ + ${formattedValue} + + {subtitle} +
) } diff --git a/src/views/index-dtf/overview/components/staking/lock/submit-lock-button.tsx b/src/views/index-dtf/overview/components/staking/lock/submit-lock-button.tsx index fea1ae1bf..ef6b63565 100644 --- a/src/views/index-dtf/overview/components/staking/lock/submit-lock-button.tsx +++ b/src/views/index-dtf/overview/components/staking/lock/submit-lock-button.tsx @@ -1,5 +1,5 @@ import dtfIndexStakingVault from '@/abis/dtf-index-staking-vault' -import TransactionButton from '@/components/old/button/TransactionButton' +import TransactionButton from '@/components/ui/transaction-button' import { walletAtom } from '@/state/atoms' import { portfolioSidebarOpenAtom } from '@/views/portfolio/atoms' import { useAtomValue, useSetAtom } from 'jotai' @@ -63,7 +63,7 @@ export const DelegateButton = () => { loadingText={!!hash ? 'Confirming tx...' : 'Pending, sign in wallet'} onClick={write} text={`Delegate ${stToken?.underlying.symbol}`} - fullWidth + className="w-full" error={error || txError} /> @@ -210,7 +210,7 @@ const SubmitLockButton = () => { ? `Vote lock ${stToken?.underlying.symbol}` : `Approve use of ${stToken?.underlying.symbol}` } - fullWidth + className="w-full" error={ readyToSubmit ? error || txError diff --git a/src/views/index-dtf/overview/components/staking/unlock/submit-unlock-button.tsx b/src/views/index-dtf/overview/components/staking/unlock/submit-unlock-button.tsx index 181386691..0696c3c1d 100644 --- a/src/views/index-dtf/overview/components/staking/unlock/submit-unlock-button.tsx +++ b/src/views/index-dtf/overview/components/staking/unlock/submit-unlock-button.tsx @@ -1,5 +1,5 @@ import dtfIndexStakingVault from '@/abis/dtf-index-staking-vault' -import TransactionButton from '@/components/old/button/TransactionButton' +import TransactionButton from '@/components/ui/transaction-button' import { walletAtom } from '@/state/atoms' import { portfolioSidebarOpenAtom } from '@/views/portfolio/atoms' import { useAtomValue, useSetAtom } from 'jotai' @@ -91,7 +91,7 @@ const SubmitUnlockButton = () => { ? 'Transaction confirmed' : `Begin ${unlockDelay ? `${unlockDelay}-day` : ''} unlock delay` } - fullWidth + className="w-full" error={error || txError} /> diff --git a/src/views/index-dtf/overview/components/zap-mint/submit-zap.tsx b/src/views/index-dtf/overview/components/zap-mint/submit-zap.tsx index 70780a8d8..7c170064e 100644 --- a/src/views/index-dtf/overview/components/zap-mint/submit-zap.tsx +++ b/src/views/index-dtf/overview/components/zap-mint/submit-zap.tsx @@ -1,6 +1,6 @@ import TransactionButton, { TransactionButtonContainer, -} from '@/components/old/button/TransactionButton' +} from '@/components/ui/transaction-button' import FusionTokenLogo from '@/components/token-logo/fusion-token-logo' import { Button } from '@/components/ui/button' import useContractWrite from '@/hooks/useContractWrite' @@ -227,10 +227,7 @@ const SubmitZapButton = ({ ? `${addStepTwoLabel ? 'Step 2. ' : ''}${buttonLabel}` : `${addStepOneLabel ? 'Step 1. ' : ''}Approve use of ${inputSymbol}` } - fullWidth - sx={{ - borderRadius: '12px', - }} + className="w-full rounded-xl" /> diff --git a/src/views/index-dtf/settings/components/distribute-fees.tsx b/src/views/index-dtf/settings/components/distribute-fees.tsx index 9b5741ac6..37ba8f5c2 100644 --- a/src/views/index-dtf/settings/components/distribute-fees.tsx +++ b/src/views/index-dtf/settings/components/distribute-fees.tsx @@ -1,5 +1,5 @@ import dtfIndexAbi from '@/abis/dtf-index-abi' -import { TransactionButtonContainer } from '@/components/old/button/TransactionButton' +import { TransactionButtonContainer } from '@/components/ui/transaction-button' import { Button } from '@/components/ui/button' import { Skeleton } from '@/components/ui/skeleton' import { indexDTFAtom, indexDTFPriceAtom } from '@/state/dtf/atoms' diff --git a/src/views/index-dtf/settings/components/settings-info-card.tsx b/src/views/index-dtf/settings/components/settings-info-card.tsx index 4f95149f4..f40cf8fb9 100644 --- a/src/views/index-dtf/settings/components/settings-info-card.tsx +++ b/src/views/index-dtf/settings/components/settings-info-card.tsx @@ -1,6 +1,5 @@ -import CopyValue from '@/components/old/button/CopyValue' -import { Card } from '@/components/ui/card' import Copy from '@/components/ui/copy' +import { Card } from '@/components/ui/card' import { Skeleton } from '@/components/ui/skeleton' import useScrollTo from '@/hooks/useScrollTo' import { cn } from '@/lib/utils' diff --git a/src/views/portfolio/components/Portfolio.tsx b/src/views/portfolio/components/Portfolio.tsx index cbfd85d29..dad6f224e 100644 --- a/src/views/portfolio/components/Portfolio.tsx +++ b/src/views/portfolio/components/Portfolio.tsx @@ -15,11 +15,12 @@ import { walletAtom, } from 'state/atoms' import { AccountRTokenPosition } from 'state/wallet/updaters/AccountUpdater' -import { Box, BoxProps, Card, Grid, Text } from 'theme-ui' import { formatCurrency, getTokenRoute } from 'utils' import { RSR_ADDRESS } from 'utils/addresses' import { supportedChainList } from 'utils/constants' import { useBalance } from 'wagmi' +import { Card } from '@/components/ui/card' +import { cn } from '@/lib/utils' const PortfolioToken = ({ position }: { position: AccountRTokenPosition }) => { const logo = useRTokenLogo(position.address, position.chain) @@ -34,55 +35,38 @@ const PortfolioToken = ({ position }: { position: AccountRTokenPosition }) => { } return ( - - - - +
+ + {formatCurrency(+position.balance)} {position.symbol} - - + +
- - - = - - ${formatCurrency(+position.usdAmount)} - +
+ = + ${formatCurrency(+position.usdAmount)} +
- - +
+
- + {formatCurrency(position.stakedRSR)} RSR - - + +
- + (${formatCurrency(+position.stakedRSRUsd)}) - - - + +
+
- - +
+ ) } @@ -97,23 +81,27 @@ const AccountRSR = ({ chain }: { chain: number }) => { }) return ( - - +
+
- - - +
+
+ {formatCurrency(Number(data?.formatted ?? 0))} RSR - - + + ${formatCurrency(Number(data?.formatted ?? 0) * rsrPrice)} - - - + +
+
) } -const Portfolio = (props: BoxProps) => { +interface PortfolioProps { + className?: string +} + +const Portfolio = ({ className }: PortfolioProps) => { const rTokens = useAtomValue(accountTokensAtom) const wallet = useAtomValue(walletAtom) const holdings = useAtomValue(accountHoldingsAtom) @@ -121,88 +109,65 @@ const Portfolio = (props: BoxProps) => { if (!wallet) { return ( - - +
+

Portfolio - +

- + - + Please connect your wallet - + - +
) } return ( - - - - +
+
+
+ Wallet staked RSR + RToken Value - - + +

${formatCurrency(holdings)} - - +

+
{supportedChainList.map((chain) => ( - - - + - +
+ + - +
))} -
- +
+
{rTokens?.length > 0 && ( - - +
+ Your RTokens - - - Token - USD value - + +
+ Token + USD value + Your staked RSR - - - - + +
+
+
{rTokens.map((position) => ( ))} - - +
+
)} -
- +
+
) } diff --git a/src/views/portfolio/index.tsx b/src/views/portfolio/index.tsx index d0d4bac92..ec2f761d1 100644 --- a/src/views/portfolio/index.tsx +++ b/src/views/portfolio/index.tsx @@ -1,13 +1,12 @@ -import { Box } from 'theme-ui' import Portfolio from './components/Portfolio' import RegisterAbout from '@/views/discover/components/yield/components/RegisterAbout' const PortfolioWrapper = () => { return ( <> - +
- +
) diff --git a/src/views/tokens/Tokens.tsx b/src/views/tokens/Tokens.tsx index 3991b1b22..9d22dd2e6 100644 --- a/src/views/tokens/Tokens.tsx +++ b/src/views/tokens/Tokens.tsx @@ -1,8 +1,6 @@ import { t } from '@lingui/macro' -import { Container } from 'components' -import { ContentHead } from '@/components/old/info-box' import ListedTokensTable from 'components/tables/ListedTokensTable' -import { Divider } from 'theme-ui' +import { Separator } from '@/components/ui/separator' import DeployHero from '@/views/discover/components/yield/components/DeployHero' import RegisterAbout from '@/views/discover/components/yield/components/RegisterAbout' import UnlistedTokensTable from './components/UnlistedTokensTable' @@ -10,25 +8,28 @@ import UnlistedTokensTable from './components/UnlistedTokensTable' const Tokens = () => { return ( <> - - +
+
+

+ {t`Register listed RTokens`} +

+

+ {t`RTokens in this list is not an endorsement or audited by us. It's simply RTokens that have gone through our listing process and don't seem like clear scams.`} +

+
- - + +
+

+ {t`All unlisted RTokens`} +

+

+ {t`Be aware that anyone can create an RToken that ends up on this list. We don't apply any standards beyond what can be done with the Reserve Protocol.`} +

+
- - + +
) diff --git a/src/views/tokens/components/TableFilters.tsx b/src/views/tokens/components/TableFilters.tsx index a19d76ee7..12ffc91ca 100644 --- a/src/views/tokens/components/TableFilters.tsx +++ b/src/views/tokens/components/TableFilters.tsx @@ -2,7 +2,6 @@ import { Trans, t } from '@lingui/macro' import { Input } from 'components' import Help from 'components/help' import { useAtom, useAtomValue, useSetAtom } from 'jotai' -import { Box, Select, Text } from 'theme-ui' import { CHAIN_TAGS, supportedChainList } from 'utils/constants' import { chainFilterAtom, @@ -15,17 +14,17 @@ const TokenSearchInput = () => { const setValue = useSetAtom(debouncedSearchInputAtom.debouncedValueAtom) return ( - - +
+ Search - + setValue(e.target.value)} value={value} placeholder={t`Input token name or symbol`} /> - +
) } @@ -37,14 +36,13 @@ const ChainSelectFilter = () => { } return ( - - +
+ Network - - @@ -53,8 +51,8 @@ const ChainSelectFilter = () => { {CHAIN_TAGS[chain]} ))} - - + +
) } @@ -66,38 +64,37 @@ const RecordLimitSelect = () => { } return ( - - - +
+
+ Record limit - + - +
- - - + +
) } const RTokenFilters = () => { return ( - +
- +
) } diff --git a/src/views/tokens/components/UnlistedTokensTable.tsx b/src/views/tokens/components/UnlistedTokensTable.tsx index 95eaf75c5..0c49b31b0 100644 --- a/src/views/tokens/components/UnlistedTokensTable.tsx +++ b/src/views/tokens/components/UnlistedTokensTable.tsx @@ -1,14 +1,13 @@ import { t } from '@lingui/macro' import { createColumnHelper } from '@tanstack/react-table' import ChainLogo from 'components/icons/ChainLogo' -import { Table } from '@/components/old/table' +import { Table } from '@/components/ui/legacy-table' import TokenItem from 'components/token-item' import { gql } from 'graphql-request' -import { useMultichainQuery } from 'hooks/useQuery' +import { useMultichainQuery } from 'hooks/use-query' import { useSetAtom } from 'jotai' import { useCallback, useEffect, useMemo, useState } from 'react' import { useNavigate } from 'react-router-dom' -import { Box, Flex, Text } from 'theme-ui' import { StringMap } from 'types' import { formatCurrency, formatUsdCurrencyCell, getTokenRoute } from 'utils' import { LISTED_RTOKEN_ADDRESSES, supportedChainList } from 'utils/constants' @@ -68,12 +67,12 @@ const UnlistedTokensTable = () => { header: t`Token`, cell: (data) => { return ( - +
- +
) }, }), @@ -96,14 +95,9 @@ const UnlistedTokensTable = () => { header: t`Target(s)`, cell: (data) => { return ( - + {data.getValue()} - + ) }, }), @@ -148,12 +142,12 @@ const UnlistedTokensTable = () => { columns={columns} data={data} /> - - Total RTokens unlisted: - +
+ Total RTokens unlisted: + {formatCurrency(rTokenCount, 0)} - - + +
) } diff --git a/src/views/tokens/useUnlistedTokens.ts b/src/views/tokens/useUnlistedTokens.ts index 825349171..3bd4bcf8d 100644 --- a/src/views/tokens/useUnlistedTokens.ts +++ b/src/views/tokens/useUnlistedTokens.ts @@ -1,7 +1,7 @@ import { gql } from 'graphql-request' import { useAtomValue } from 'jotai' import { tokenFilterAtom } from './atoms' -import { useMultichainQuery } from 'hooks/useQuery' +import { useMultichainQuery } from 'hooks/use-query' import { useEffect, useState } from 'react' import { supportedChainList } from 'utils/constants' import { Address, formatEther, getAddress } from 'viem' diff --git a/src/views/yield-dtf/auctions/auctions-sidebar/AvailableRevenueAuctions.tsx b/src/views/yield-dtf/auctions/auctions-sidebar/AvailableRevenueAuctions.tsx index 4c94209b4..31a039443 100644 --- a/src/views/yield-dtf/auctions/auctions-sidebar/AvailableRevenueAuctions.tsx +++ b/src/views/yield-dtf/auctions/auctions-sidebar/AvailableRevenueAuctions.tsx @@ -1,8 +1,8 @@ import { t } from '@lingui/macro' +import { Separator } from '@/components/ui/separator' import AuctionsIcon from 'components/icons/AuctionsIcon' import { atom, useAtomValue, useSetAtom } from 'jotai' import { useEffect } from 'react' -import { Box, Divider } from 'theme-ui' import { auctionsOverviewAtom, selectedAuctionsAtom } from '../atoms' import ConfirmAuction from './ConfirmAuction' import RevenueAuctionItem from './RevenueAuctionItem' @@ -37,20 +37,18 @@ const AvailableRevenueAuctions = () => { title={t`Auctionable revenue`} icon={} subtitle={`${revenueData?.availableAuctions.length ?? 0} auctions`} - mb={3} + className="mb-4" > {(revenueData?.availableAuctions ?? []).map((auction, index) => ( - - {!!index && ( - - )} +
+ {!!index && } setSelectedAuctions(index)} data={auction} /> - +
))} - + ) diff --git a/src/views/yield-dtf/auctions/auctions-sidebar/ConfirmAuction.tsx b/src/views/yield-dtf/auctions/auctions-sidebar/ConfirmAuction.tsx index 5fd30091b..a1e2cb23e 100644 --- a/src/views/yield-dtf/auctions/auctions-sidebar/ConfirmAuction.tsx +++ b/src/views/yield-dtf/auctions/auctions-sidebar/ConfirmAuction.tsx @@ -1,8 +1,14 @@ -import TransactionButton from '@/components/old/button/TransactionButton' +import TransactionButton from '@/components/ui/transaction-button' +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from '@/components/ui/select' import useWatchTransaction from 'hooks/useWatchTransaction' import { atom, useAtom, useAtomValue, useSetAtom } from 'jotai' import { useEffect } from 'react' -import { Box, Select, Text } from 'theme-ui' import { TradeKind, auctionPlatformAtom, @@ -53,39 +59,45 @@ const ConfirmAuction = () => { } }, [status]) - const handleChangeKind = (e: any) => { - setTradeKind(+e.target.value) + const handleChangeKind = (value: string) => { + setTradeKind(+value) } return ( - +
{!isLegacy && ( - - - Run auctions as: - - +
+ +
- - +
+
)} -
+
) } diff --git a/src/views/yield-dtf/auctions/auctions-sidebar/MeltingBox.tsx b/src/views/yield-dtf/auctions/auctions-sidebar/MeltingBox.tsx index cfbd6d725..2781cc3fb 100644 --- a/src/views/yield-dtf/auctions/auctions-sidebar/MeltingBox.tsx +++ b/src/views/yield-dtf/auctions/auctions-sidebar/MeltingBox.tsx @@ -1,6 +1,6 @@ import { t } from '@lingui/macro' import FacadeAct from 'abis/FacadeAct' -import { ExecuteButton } from '@/components/old/button/TransactionButton' +import { ExecuteButton } from '@/components/ui/transaction-button' import MeltIcon from 'components/icons/MeltIcon' import useRToken from 'hooks/useRToken' import { useAtomValue } from 'jotai' @@ -42,13 +42,13 @@ const MeltingBox = () => { subtitle={t`${formatCurrency(revenueData?.pendingToMelt ?? 0)} of ${ rToken?.symbol ?? 'rToken' }`} - mb={3} + className="mb-4" muted={!revenueData?.pendingToMelt || revenueData?.pendingToMelt < 0.1} right={ diff --git a/src/views/yield-dtf/auctions/auctions-sidebar/RecollaterizationAlert.tsx b/src/views/yield-dtf/auctions/auctions-sidebar/RecollaterizationAlert.tsx index 1c121dbbc..77ac54e58 100644 --- a/src/views/yield-dtf/auctions/auctions-sidebar/RecollaterizationAlert.tsx +++ b/src/views/yield-dtf/auctions/auctions-sidebar/RecollaterizationAlert.tsx @@ -1,6 +1,6 @@ import { Trans } from '@lingui/macro' +import { Separator } from '@/components/ui/separator' import { useAtomValue } from 'jotai' -import { Box, Text, Image, Divider } from 'theme-ui' import { auctionsOverviewAtom } from '../atoms' import ConfirmAuction from './ConfirmAuction' @@ -12,32 +12,28 @@ const RecollaterizationAlert = () => { } return ( - - - +
+ + Unknown amount of recollateralization auctions left to run - - + +

Wait to trigger revenue auctions until after recollateralization has finished. - - +

+ - +
) } export default RecollaterizationAlert diff --git a/src/views/yield-dtf/auctions/auctions-sidebar/Revenue.tsx b/src/views/yield-dtf/auctions/auctions-sidebar/Revenue.tsx index f430f8faf..2d283e04e 100644 --- a/src/views/yield-dtf/auctions/auctions-sidebar/Revenue.tsx +++ b/src/views/yield-dtf/auctions/auctions-sidebar/Revenue.tsx @@ -3,7 +3,7 @@ import EmptyBoxIcon from 'components/icons/EmptyBoxIcon' import { atom, useAtomValue } from 'jotai' import { JSXElementConstructor } from 'react' import Skeleton from 'react-loading-skeleton' -import { Box, Flex, Text, useColorMode } from 'theme-ui' +import { useTheme } from 'next-themes' import { auctionsOverviewAtom, auctionsToSettleAtom } from '../atoms' import AvailableRevenueAuctions from './AvailableRevenueAuctions' import MeltingBox from './MeltingBox' @@ -15,8 +15,8 @@ import ClaimRewards from './claim-rewards' import StakingVaultRevenue from './StakingVaultRevenue' const Placeholder = () => { - const [colorMode] = useColorMode() - const isDarkMode = colorMode === 'dark' + const { resolvedTheme } = useTheme() + const isDarkMode = resolvedTheme === 'dark' return ( { } const NoAvailableAuctions = () => ( - +
- + No actionable revenue available - - + +
) // Distribute components between Available/Unavailable and aggregate amounts @@ -99,7 +99,7 @@ const ActionableRevenue = () => { text={t`Above minimum trade volume`} amount={availableAmount + emissions} help="Run and settle auctions." - mt={4} + className="mt-4" loading={isLoading} /> {isLoading && } @@ -123,7 +123,7 @@ const UnavailableRevenue = () => { amount={unavailableAmount} muted help="Revenue auctions that are below the minimum trade or unavailable." - mt={4} + className="mt-4" loading={isLoading} /> {isLoading && } @@ -135,13 +135,13 @@ const UnavailableRevenue = () => { } const Revenue = () => ( - +
- +
) export default Revenue diff --git a/src/views/yield-dtf/auctions/auctions-sidebar/RevenueAuctionItem.tsx b/src/views/yield-dtf/auctions/auctions-sidebar/RevenueAuctionItem.tsx index 469eaebfa..e9c609134 100644 --- a/src/views/yield-dtf/auctions/auctions-sidebar/RevenueAuctionItem.tsx +++ b/src/views/yield-dtf/auctions/auctions-sidebar/RevenueAuctionItem.tsx @@ -1,27 +1,50 @@ import { Trans, t } from '@lingui/macro' -import CollapsableBox from '@/components/old/boxes/CollapsableBox' -import SelectableBox from '@/components/old/boxes/SelectableBox' import GaugeIcon from 'components/icons/GaugeIcon' import TokenLogo from 'components/icons/TokenLogo' -import { Info } from '@/components/old/info-box' import useRToken from 'hooks/useRToken' -import { Text } from 'theme-ui' +import { useState } from 'react' +import { ChevronDown, ChevronUp } from 'lucide-react' import { formatCurrency } from 'utils' import { Auction } from '../atoms' import SwapIcon from './SwapIcon' +import { Checkbox } from '@/components/ui/checkbox' +import { cn } from '@/lib/utils' const UnavailablePlaceholder = ({ isBelowMinTrade, }: { isBelowMinTrade: boolean }) => ( - + {isBelowMinTrade ? ( Surplus below minimum trade ) : ( Not available )} - + +) + +// Info component inlined - simple icon + title + subtitle layout +const Info = ({ + title, + subtitle, + icon, + className, +}: { + title: React.ReactNode + subtitle: React.ReactNode + icon?: React.ReactNode + className?: string +}) => ( +
+ {icon} +
+ + {title} + + {subtitle} +
+
) const RevenueAuctionItem = ({ @@ -31,20 +54,20 @@ const RevenueAuctionItem = ({ data: Auction onSelect(): void }) => { + const [isOpen, setOpen] = useState(false) const isBelowMinTrade = +data.minAmount > +data.amount const rToken = useRToken() + const unavailable = !Number(data.amount) return ( - - } - > +
+ {/* Header with SelectableBox functionality */} +
setOpen(!isOpen)} + > + {/* SelectableBox content */} +
} @@ -52,29 +75,51 @@ const RevenueAuctionItem = ({ data.sell.symbol } for ${data.buy.symbol}`} /> - - } - > - {data.canStart && ( - + {unavailable ? ( + + ) : ( + onSelect()} + onClick={(e) => e.stopPropagation()} + className="cursor-pointer" + /> + )} +
+
+ {/* Chevron */} +
+ {isOpen ? : } +
+
+ + {/* Collapsible content */} + {isOpen && ( + <> +
+ {data.canStart && ( + + } + title={t`Tokens to match trade`} + subtitle={`≈${formatCurrency(data.output)} ${data.buy.symbol}`} + className="mb-4" /> - } - title={t`Tokens to match trade`} - subtitle={`≈${formatCurrency(data.output)} ${data.buy.symbol}`} - mb={3} - /> + )} + } + title={t`Minimum trade size`} + subtitle={`${formatCurrency(+data.minAmount)} ${data.sell.symbol}`} + /> + )} - } - title={t`Minimum trade size`} - subtitle={`${formatCurrency(+data.minAmount)} ${data.sell.symbol}`} - /> - +
) } diff --git a/src/views/yield-dtf/auctions/auctions-sidebar/RevenueBoxContainer.tsx b/src/views/yield-dtf/auctions/auctions-sidebar/RevenueBoxContainer.tsx index 32ca02c9a..68e0c91ed 100644 --- a/src/views/yield-dtf/auctions/auctions-sidebar/RevenueBoxContainer.tsx +++ b/src/views/yield-dtf/auctions/auctions-sidebar/RevenueBoxContainer.tsx @@ -1,9 +1,12 @@ -import { Button } from 'components' +import { Button } from '@/components/ui/button' +import { Card } from '@/components/ui/card' +import { Separator } from '@/components/ui/separator' +import Spinner from '@/components/ui/spinner' import { useState } from 'react' import { ChevronDown, ChevronUp } from 'lucide-react' -import { Box, BoxProps, Card, Divider, Spinner, Text } from 'theme-ui' +import { cn } from '@/lib/utils' -export interface RevenueBoxContainerProps extends BoxProps { +export interface RevenueBoxContainerProps { icon: React.ReactNode title: string subtitle: string @@ -12,6 +15,8 @@ export interface RevenueBoxContainerProps extends BoxProps { defaultOpen?: boolean loading?: boolean right?: React.ReactNode + children?: React.ReactNode + className?: string } const RevenueBoxContainer = ({ @@ -24,65 +29,47 @@ const RevenueBoxContainer = ({ btnLabel = 'Inspect', loading = false, right, - ...props + className, }: RevenueBoxContainerProps) => { const [expanded, setExpanded] = useState(!!defaultOpen) return ( - - - + +
+
{icon} - - - - - {title} - - +
+
+
+ {title} +
{loading ? ( ) : ( - {subtitle} + {subtitle} )} - +
{right ? ( right ) : ( )} - +
{expanded && ( <> - - - {children} - + +
{children}
)}
diff --git a/src/views/yield-dtf/auctions/auctions-sidebar/RevenueOverviewHeader.tsx b/src/views/yield-dtf/auctions/auctions-sidebar/RevenueOverviewHeader.tsx index 2a5ca6497..374358d2f 100644 --- a/src/views/yield-dtf/auctions/auctions-sidebar/RevenueOverviewHeader.tsx +++ b/src/views/yield-dtf/auctions/auctions-sidebar/RevenueOverviewHeader.tsx @@ -1,14 +1,16 @@ import Help from 'components/help' +import Spinner from '@/components/ui/spinner' import { Circle } from 'lucide-react' -import { Box, BoxProps, Spinner, Text } from 'theme-ui' import { formatCurrency } from 'utils' +import { cn } from '@/lib/utils' -interface RevenueOverviewHeader extends BoxProps { +interface RevenueOverviewHeaderProps { text: string help?: string amount?: number muted?: boolean loading?: boolean + className?: string } const RevenueOverviewHeader = ({ @@ -17,35 +19,37 @@ const RevenueOverviewHeader = ({ help, muted, loading = false, - ...props -}: RevenueOverviewHeader) => { + className, +}: RevenueOverviewHeaderProps) => { return ( - - {text} + {text} {loading ? ( - + ) : ( - +
{amount !== undefined && ( - + ${formatCurrency(amount)} - + )} {help && } - +
)} -
+ ) } diff --git a/src/views/yield-dtf/auctions/auctions-sidebar/SettleableAuctions.tsx b/src/views/yield-dtf/auctions/auctions-sidebar/SettleableAuctions.tsx index 671f9fb7f..5f92c4de2 100644 --- a/src/views/yield-dtf/auctions/auctions-sidebar/SettleableAuctions.tsx +++ b/src/views/yield-dtf/auctions/auctions-sidebar/SettleableAuctions.tsx @@ -1,6 +1,6 @@ import { t } from '@lingui/macro' import FacadeAct from 'abis/FacadeAct' -import { ExecuteButton } from '@/components/old/button/TransactionButton' +import { ExecuteButton } from '@/components/ui/transaction-button' import { atom, useAtomValue, useSetAtom } from 'jotai' import { Check } from 'lucide-react' import { chainIdAtom } from 'state/atoms' @@ -72,12 +72,12 @@ const SettleableAuctions = () => { icon={} loading={!settleable} subtitle={t`${settleable?.length ?? 0} auctions`} - mb={3} + className="mb-4" right={ { return ( <> - - - - Current {rTokenVault.name} APY - - {formatPercentage(currentAPY)} - - - - 30d avg {rTokenVault.name} APY - {formatPercentage(avgAPY)} - - - - Current reward period ends - {currentPeriodEnds} - - - - - - Future sdgnETH APY (next period) - - {formatPercentage(nextPeriodAPY)} - - - - - - Delta from 30d avg + +
+
+ Current {rTokenVault.name} APY + {formatPercentage(currentAPY)} +
+
+ 30d avg {rTokenVault.name} APY + {formatPercentage(avgAPY)} +
+ +
+ Current reward period ends + {currentPeriodEnds} +
+ + + +
+ Future sdgnETH APY (next period) + {formatPercentage(nextPeriodAPY)} +
+ +
+
+ Delta from 30d avg - - {`${formatCurrency( +
+ {`${formatCurrency( neededToHitAvg - )} ${rToken.symbol}`} - + )} ${rToken.symbol}`} +
- write?.()} - mt={3} - py={2} - text={ - - Nudge - - - } - /> - + > + {isLoading && } +
+ Nudge + +
+ +
) diff --git a/src/views/yield-dtf/auctions/auctions-sidebar/SwapIcon.tsx b/src/views/yield-dtf/auctions/auctions-sidebar/SwapIcon.tsx index cede92d28..f5b664e67 100644 --- a/src/views/yield-dtf/auctions/auctions-sidebar/SwapIcon.tsx +++ b/src/views/yield-dtf/auctions/auctions-sidebar/SwapIcon.tsx @@ -1,24 +1,20 @@ import TokenLogo from 'components/icons/TokenLogo' -import { Box } from 'theme-ui' const SwapIcon = ({ buy, sell }: { buy: string; sell: string }) => ( - +
- +
) export default SwapIcon diff --git a/src/views/yield-dtf/auctions/auctions-sidebar/UnavailableRevenueAuctions.tsx b/src/views/yield-dtf/auctions/auctions-sidebar/UnavailableRevenueAuctions.tsx index 79ed58c1d..749f0c268 100644 --- a/src/views/yield-dtf/auctions/auctions-sidebar/UnavailableRevenueAuctions.tsx +++ b/src/views/yield-dtf/auctions/auctions-sidebar/UnavailableRevenueAuctions.tsx @@ -1,4 +1,5 @@ -import TransactionButton from '@/components/old/button/TransactionButton' +import TransactionButton from '@/components/ui/transaction-button' +import { Separator } from '@/components/ui/separator' import { t } from '@lingui/macro' import FacadeAct from 'abis/FacadeAct' import AuctionsIcon from 'components/icons/AuctionsIcon' @@ -7,7 +8,6 @@ import useWatchTransaction from 'hooks/useWatchTransaction' import { atom, useAtomValue, useSetAtom } from 'jotai' import { useEffect } from 'react' import { chainIdAtom } from 'state/atoms' -import { Box, Divider } from 'theme-ui' import { FACADE_ACT_ADDRESS } from 'utils/addresses' import { Address, Hex, encodeFunctionData } from 'viem' import { UseSimulateContractParameters } from 'wagmi' @@ -99,16 +99,16 @@ const ConfirmAuction = () => { }, [status]) return ( - +
- +
) } @@ -130,20 +130,18 @@ const UnavailableRevenueAuctions = () => { subtitle={`${revenueData?.unavailableAuctions.length ?? 0} auctions`} btnLabel="Inspect" muted - mb={3} + className="mb-4" > {(revenueData?.unavailableAuctions ?? []).map((auction, index) => ( - - {!!index && ( - - )} +
+ {!!index && } setSelectedAuctions(index)} data={auction} /> - +
))} - + ) diff --git a/src/views/yield-dtf/auctions/auctions-sidebar/claim-rewards/components/ClaimAllRewardsButton.tsx b/src/views/yield-dtf/auctions/auctions-sidebar/claim-rewards/components/ClaimAllRewardsButton.tsx index d5cc89726..155b0cf91 100644 --- a/src/views/yield-dtf/auctions/auctions-sidebar/claim-rewards/components/ClaimAllRewardsButton.tsx +++ b/src/views/yield-dtf/auctions/auctions-sidebar/claim-rewards/components/ClaimAllRewardsButton.tsx @@ -1,6 +1,6 @@ import { t } from '@lingui/macro' import FacadeAct from 'abis/FacadeAct' -import TransactionButton from '@/components/old/button/TransactionButton' +import TransactionButton from '@/components/ui/transaction-button' import useContractWrite from 'hooks/useContractWrite' import useWatchTransaction from 'hooks/useWatchTransaction' import { atom, useAtomValue, useSetAtom } from 'jotai' @@ -41,7 +41,7 @@ const ClaimAllRewardsButton = () => { return ( - +
+ {!erc20s.length && Please select an asset to claim} {!!erc20s.length && !wallet && ( Please connect your wallet )} - + - +
) } diff --git a/src/views/yield-dtf/auctions/auctions-sidebar/claim-rewards/components/TraderEmissions.tsx b/src/views/yield-dtf/auctions/auctions-sidebar/claim-rewards/components/TraderEmissions.tsx index 993d16b06..5b9598749 100644 --- a/src/views/yield-dtf/auctions/auctions-sidebar/claim-rewards/components/TraderEmissions.tsx +++ b/src/views/yield-dtf/auctions/auctions-sidebar/claim-rewards/components/TraderEmissions.tsx @@ -1,53 +1,36 @@ import { t } from '@lingui/macro' -import CollapsableBox from '@/components/old/boxes/CollapsableBox' -import SelectableBox from '@/components/old/boxes/SelectableBox' import Help from 'components/help' import TokenLogo from 'components/icons/TokenLogo' import { useAtomValue } from 'jotai' import { useState } from 'react' -import { Box, BoxProps, Divider, Text } from 'theme-ui' +import { ChevronDown, ChevronUp } from 'lucide-react' import { Trader } from 'types' import { formatCurrency } from 'utils' import { TRADERS, TraderLabels } from 'utils/constants' import { traderRewardsAtom } from '../atoms' import { RewardTokenWithCollaterals } from '../types' import ClaimFromTraderButton from './ClaimFromTraderButton' +import { Checkbox } from '@/components/ui/checkbox' +import { cn } from '@/lib/utils' const MIN_DOLLAR_VALUE = 10 -interface Props extends BoxProps { +interface Props { trader: Trader + className?: string } const TraderIcon = ({ trader }: { trader: Trader }) => ( - +
{TRADERS.map((currentTrader) => ( - ))} - +
) const TraderHeading = ({ @@ -63,29 +46,34 @@ const TraderHeading = ({ selected: boolean disabled?: boolean }) => ( - } - > - +
+
- {TraderLabels[trader]} - {TraderLabels[trader]} + ${formatCurrency(amount)} - - - + +
+
+ {!disabled && ( + onSelect()} + onClick={(e) => e.stopPropagation()} + className="cursor-pointer" + /> + )} +
+
) -const TraderEmissions = ({ trader, ...props }: Props) => { +const TraderEmissions = ({ trader, className }: Props) => { const availableRewards = useAtomValue(traderRewardsAtom) const [selected, setSelected] = useState([]) const [isOpen, setOpen] = useState(false) @@ -126,68 +114,79 @@ const TraderEmissions = ({ trader, ...props }: Props) => { } return ( - - } - > - {availableRewards[trader].tokens.map((erc20) => { - const isSelected = !!selected.find((t) => t.address === erc20.address) - const isBelowMin = erc20.amount < MIN_DOLLAR_VALUE +
+ {/* CollapsableBox header */} +
setOpen(!isOpen)} + > +
+ +
+
+ {isOpen ? : } +
+
- const amountColor = isBelowMin - ? 'secondaryText' - : isSelected - ? 'rBlue' - : 'text' + {/* Collapsible content */} + {isOpen && ( + <> +
+ {availableRewards[trader].tokens.map((erc20) => { + const isSelected = !!selected.find((t) => t.address === erc20.address) + const isBelowMin = erc20.amount < MIN_DOLLAR_VALUE + const unavailable = noBalance || erc20.amount < 1 - return ( - handleSelect(erc20)} - > - - - - {erc20.symbol} - - {isBelowMin && ( - - )} - - ${formatCurrency(erc20.amount)} - - - - ) - })} - - - +
+ + {erc20.symbol} + {isBelowMin && ( + + )} + + ${formatCurrency(erc20.amount)} + +
+
+ {!unavailable && ( + handleSelect(erc20)} + className="cursor-pointer" + /> + )} +
+
+ ) + })} + +
+ + )} +
) } diff --git a/src/views/yield-dtf/auctions/auctions-sidebar/index.tsx b/src/views/yield-dtf/auctions/auctions-sidebar/index.tsx index 8eb7eee1a..1acd17380 100644 --- a/src/views/yield-dtf/auctions/auctions-sidebar/index.tsx +++ b/src/views/yield-dtf/auctions/auctions-sidebar/index.tsx @@ -1,9 +1,9 @@ import { Trans } from '@lingui/macro' -import { Button } from 'components' +import { Button } from '@/components/ui/button' +import { Separator } from '@/components/ui/separator' import Sidebar from 'components/sidebar' import { useAtom, useSetAtom } from 'jotai' import { X } from 'lucide-react' -import { Divider, Flex, Text } from 'theme-ui' import { auctionSidebarAtom } from '../atoms' import Revenue from './Revenue' @@ -11,21 +11,19 @@ const Header = () => { const close = useSetAtom(auctionSidebarAtom) return ( - - +
+ Auctions - - - +
) } @@ -37,13 +35,9 @@ const AuctionsSidebar = () => { } return ( - +
- + ) diff --git a/src/views/yield-dtf/auctions/batch/TradesUpdater.tsx b/src/views/yield-dtf/auctions/batch/TradesUpdater.tsx index 1f413f5f1..2cfd3dae3 100644 --- a/src/views/yield-dtf/auctions/batch/TradesUpdater.tsx +++ b/src/views/yield-dtf/auctions/batch/TradesUpdater.tsx @@ -1,7 +1,7 @@ import dayjs from 'dayjs' import { gql } from 'graphql-request' import useDebounce from 'hooks/useDebounce' -import useQuery from 'hooks/useQuery' +import useQuery from 'hooks/use-query' import useRToken from 'hooks/useRToken' import { useAtomValue, useSetAtom } from 'jotai' import { useEffect } from 'react' diff --git a/src/views/yield-dtf/auctions/batch/components/FinalizedAuctions.tsx b/src/views/yield-dtf/auctions/batch/components/FinalizedAuctions.tsx index b268a93da..ab5210597 100644 --- a/src/views/yield-dtf/auctions/batch/components/FinalizedAuctions.tsx +++ b/src/views/yield-dtf/auctions/batch/components/FinalizedAuctions.tsx @@ -1,31 +1,35 @@ import { Trans } from '@lingui/macro' -import { Table } from '@/components/old/table' +import { Table } from '@/components/ui/legacy-table' import { useAtomValue } from 'jotai' -import { Box, BoxProps, Text } from 'theme-ui' import { endedTradesAtom } from '../../atoms' import EndedAuctionsSkeleton from '../../components/EndedAuctionsSkeleton' import useColumns from '../../components/useColumns' -const FinalizedAuctions = (props: BoxProps) => { +interface FinalizedAuctionsProps { + className?: string +} + +const FinalizedAuctions = ({ className }: FinalizedAuctionsProps) => { const columns = useColumns(true) const data = useAtomValue(endedTradesAtom) return ( - - +
+ Ended auctions - + {data.length ? (
) : ( )} - + ) } diff --git a/src/views/yield-dtf/auctions/batch/components/OngoingAuctions.tsx b/src/views/yield-dtf/auctions/batch/components/OngoingAuctions.tsx index e09c83248..9ff392966 100644 --- a/src/views/yield-dtf/auctions/batch/components/OngoingAuctions.tsx +++ b/src/views/yield-dtf/auctions/batch/components/OngoingAuctions.tsx @@ -1,26 +1,33 @@ import { Trans } from '@lingui/macro' -import { Table } from '@/components/old/table' +import { Table } from '@/components/ui/legacy-table' import { useAtomValue } from 'jotai' -import { Box, BoxProps, Text } from 'theme-ui' import { currentTradesAtom } from '../../atoms' import OngoingAuctionsSkeleton from '../../components/OngoingAuctionsSkeleton' import useColumns from '../../components/useColumns' -const OngoingAuctions = (props: BoxProps) => { +interface OngoingAuctionsProps { + className?: string +} + +const OngoingAuctions = ({ className }: OngoingAuctionsProps) => { const columns = useColumns() const data = useAtomValue(currentTradesAtom) return ( - - +
+ Ongoing auctions - + {data.length ? ( -
+
) : ( )} - + ) } export default OngoingAuctions diff --git a/src/views/yield-dtf/auctions/batch/index.tsx b/src/views/yield-dtf/auctions/batch/index.tsx index 7d5140f9a..1960b735a 100644 --- a/src/views/yield-dtf/auctions/batch/index.tsx +++ b/src/views/yield-dtf/auctions/batch/index.tsx @@ -5,7 +5,7 @@ import TradesUpdater from './TradesUpdater' const BatchAuctions = () => ( <> - + ) diff --git a/src/views/yield-dtf/auctions/components/About.tsx b/src/views/yield-dtf/auctions/components/About.tsx index 11900b7d2..921df107c 100644 --- a/src/views/yield-dtf/auctions/components/About.tsx +++ b/src/views/yield-dtf/auctions/components/About.tsx @@ -1,96 +1,86 @@ -import { t, Trans } from '@lingui/macro' -import { ContentHead } from '@/components/old/info-box' -import { Box, BoxProps, Grid, Link, Text } from 'theme-ui' +import { Trans } from '@lingui/macro' +import { cn } from '@/lib/utils' + +interface AboutProps { + className?: string +} /** * Section: Auction > About auctions footer */ -const About = (props: BoxProps) => ( - - - - - +const About = ({ className }: AboutProps) => ( +
+

About

+
+
+

The Reserve Protocol makes a few different types of trades - +

    - -
  • - [FREQUENT] From collateral to RSR or RToken, in order to - distribute collateral yields. These happen often. -
  • -
    - -
  • - [FREQUENT] From reward tokens to RSR or RToken, in order to - distribute tokens rewards from collateral. These also happen - often. -
  • -
    - - -
  • - [FREQUENT] From RToken to RSR, in order to distribute revenue that - has accrued evenly across all collateral tokens in the basket to - stRSR holders. -
  • -
    - - -
  • - [RARE] From collateral to collateral, in order to execute a basket - change proposal that has passed through governance. -
  • -
    - -
  • - [RARE] RSR to collateral, in order to recollateralize the protocol - from the stRSR over-collateralization, after a basket change. - These auctions should be even rarer, happening when there's a - basket change and insufficient capital to achieve - recollateralization without using the over-collateralization - buffer. -
  • -
    +
  • + [FREQUENT] From collateral to RSR or RToken, in order to distribute + collateral yields. These happen often. +
  • +
  • + [FREQUENT] From reward tokens to RSR or RToken, in order to + distribute tokens rewards from collateral. These also happen often. +
  • +
  • + [FREQUENT] From RToken to RSR, in order to distribute revenue that + has accrued evenly across all collateral tokens in the basket to + stRSR holders. +
  • +
  • + [RARE] From collateral to collateral, in order to execute a basket + change proposal that has passed through governance. +
  • +
  • + [RARE] RSR to collateral, in order to recollateralize the protocol + from the stRSR over-collateralization, after a basket change. These + auctions should be even rarer, happening when there's a basket + change and insufficient capital to achieve recollateralization + without using the over-collateralization buffer. +
- +

Each type of trade can currently happen in only one way; the protocol launches a Gnosis EasyAuction. The Reserve Protocol is designed to make it easy to add other trading methods, but no other methods are currently supported. - - +

+

A good explainer for how Gnosis auctions work can be found {' '} - (in their Github repository) - - - - - + +

+
+
+

Trigger an Auction - - +

+

Anyone can click the button above to check and trigger an auction for any revenue that has accrued or for rebalances that need to happen. Please note that for RTokens with many collateral types in the basket, this may be an expensive transaction to execute. - - - - +

+
+
+
) export default About diff --git a/src/views/yield-dtf/auctions/components/AuctionsHeader.tsx b/src/views/yield-dtf/auctions/components/AuctionsHeader.tsx index 7600ab602..70e950628 100644 --- a/src/views/yield-dtf/auctions/components/AuctionsHeader.tsx +++ b/src/views/yield-dtf/auctions/components/AuctionsHeader.tsx @@ -1,10 +1,9 @@ import { Trans } from '@lingui/macro' -import { Button } from 'components' +import { Button } from '@/components/ui/button' import TabMenu from 'components/tab-menu' import { useAtom, useAtomValue, useSetAtom } from 'jotai' import { useEffect } from 'react' import { isModuleLegacyAtom, rTokenContractsAtom } from 'state/atoms' -import { Box, Text } from 'theme-ui' import { TradeKind, auctionPlatformAtom, auctionSidebarAtom } from '../atoms' import AuctionsIcon from 'components/icons/AuctionsIcon' @@ -27,7 +26,7 @@ const AuctionsHeader = () => { }, [platform, isLegacy, contracts]) return ( - +
{!isLegacy && ( { /> )} - - +
) } diff --git a/src/views/yield-dtf/auctions/components/EndedAuctionsSkeleton.tsx b/src/views/yield-dtf/auctions/components/EndedAuctionsSkeleton.tsx index 486439550..ebef38413 100644 --- a/src/views/yield-dtf/auctions/components/EndedAuctionsSkeleton.tsx +++ b/src/views/yield-dtf/auctions/components/EndedAuctionsSkeleton.tsx @@ -1,21 +1,12 @@ import { Trans } from '@lingui/macro' -import { Box, Text } from 'theme-ui' const EndedAuctionsSkeleton = () => { return ( - - +
+ No ended auctions - - + +
) } diff --git a/src/views/yield-dtf/auctions/components/OngoingAuctionsSkeleton.tsx b/src/views/yield-dtf/auctions/components/OngoingAuctionsSkeleton.tsx index 3d6dc359e..e06f690ca 100644 --- a/src/views/yield-dtf/auctions/components/OngoingAuctionsSkeleton.tsx +++ b/src/views/yield-dtf/auctions/components/OngoingAuctionsSkeleton.tsx @@ -1,6 +1,5 @@ import useRToken from 'hooks/useRToken' import { useSetAtom } from 'jotai' -import { Box, Link, Text } from 'theme-ui' import { auctionSidebarAtom } from '../atoms' const OngoingAuctionsSkeleton = () => { @@ -8,27 +7,19 @@ const OngoingAuctionsSkeleton = () => { const setSidebar = useSetAtom(auctionSidebarAtom) return ( - - +
+ No ongoing {rToken?.symbol ?? 'rtoken'}-related auctions. Check for available auctions/unrealized revenue{' '} - setSidebar(true)} - sx={{ textDecoration: 'underline', color: 'text' }} + {' '} if you want to poke the protocol to start the next auction. - - + +
) } diff --git a/src/views/yield-dtf/auctions/components/useColumns.tsx b/src/views/yield-dtf/auctions/components/useColumns.tsx index 406a384b2..feae01c94 100644 --- a/src/views/yield-dtf/auctions/components/useColumns.tsx +++ b/src/views/yield-dtf/auctions/components/useColumns.tsx @@ -1,15 +1,14 @@ import { t } from '@lingui/macro' -import { SmallButton } from '@/components/old/button' +import { Button } from '@/components/ui/button' import TokenItem from 'components/token-item' import dayjs from 'dayjs' import { useAtomValue, useSetAtom } from 'jotai' import { useMemo } from 'react' import { ArrowUpRight } from 'lucide-react' import { chainIdAtom } from 'state/atoms' -import { Box, Flex, Text } from 'theme-ui' import { formatCurrency, formatCurrencyCell } from 'utils' import { ExplorerDataType, getExplorerLink } from 'utils/getExplorerLink' -import { auctionSidebarAtom, Trade, TradeKind } from '../atoms' +import { auctionSidebarAtom, TradeKind } from '../atoms' import { ChainId } from 'utils/chains' import { createColumnHelper } from '@tanstack/react-table' import { DutchTrade } from '../dutch/atoms' @@ -39,10 +38,10 @@ const useColumns = (ended = false) => { columnHelper.accessor('amount', { header: t`Amount`, cell: (data) => ( - + {formatCurrency(data.getValue())}{' '} {data.row.original.sellingTokenSymbol} - + ), }), columnHelper.accessor('worstCasePrice', { @@ -52,7 +51,7 @@ const useColumns = (ended = false) => { columnHelper.accessor('endAt', { header: ended ? t`Ended at` : t`Ends at`, cell: (data) => ( - {dayjs(+data.getValue() * 1000).format('YYYY-M-D HH:mm')} + {dayjs(+data.getValue() * 1000).format('YYYY-M-D HH:mm')} ), }), columnHelper.accessor('id', { @@ -73,7 +72,7 @@ const useColumns = (ended = false) => { const handleClick = () => { if (isDutch && !data.row.original.isSettled) { - setSidebar(true) + setSidebar() } else if ( data.row.original.isSettled && data.row.original.settleTxHash @@ -98,14 +97,14 @@ const useColumns = (ended = false) => { } return ( - - - +
+ +
) }, }), diff --git a/src/views/yield-dtf/auctions/dutch/components/AuctionActions.tsx b/src/views/yield-dtf/auctions/dutch/components/AuctionActions.tsx index c97b6954b..f730d929d 100644 --- a/src/views/yield-dtf/auctions/dutch/components/AuctionActions.tsx +++ b/src/views/yield-dtf/auctions/dutch/components/AuctionActions.tsx @@ -1,12 +1,11 @@ import DutchTradeAbi from 'abis/DutchTrade' import ERC20 from 'abis/ERC20' -import { ExecuteButton } from '@/components/old/button/TransactionButton' +import { ExecuteButton } from '@/components/ui/transaction-button' import useHasAllowance from 'hooks/useHasAllowance' import { useAtomValue } from 'jotai' import { useCallback, useMemo, useState } from 'react' -import { chainIdAtom, rTokenAssetsAtom, walletAtom } from 'state/atoms' -import { Box, Grid, Text } from 'theme-ui' -import { formatCurrency, isAddress } from 'utils' +import { chainIdAtom, walletAtom } from 'state/atoms' +import { formatCurrency } from 'utils' import { BIGINT_MAX } from 'utils/constants' import { Address, Hex, formatUnits } from 'viem' import { useBalance } from 'wagmi' @@ -70,21 +69,21 @@ const AuctionActions = ({ }, []) return ( - - +
+
{!hasAllowance && ( <> - + Prepare for bidding by approving {data.buyingTokenSymbol} - + )} {hasAllowance && currentPrice !== 0n && ( @@ -93,16 +92,16 @@ const AuctionActions = ({ text={`Bid ${formatCurrency( +formatUnits(currentPrice, data.buyingTokenDecimals) )} ${data.buyingTokenSymbol}`} - ml={3} + className="ml-4" call={hasBalance ? bidCall : undefined} - variant="accentAction" + variant="accent" successLabel="Auction bidded" txLabel={hasBalance ? 'Auction bid' : 'Not enough balance to bid'} disabled={!hasBalance} - small + size="sm" onSuccess={handleBid} /> - + 1 {data.sellingTokenSymbol} ={' '} {formatCurrency( Number(formatUnits(currentPrice, data.buyingTokenDecimals)) / @@ -110,14 +109,14 @@ const AuctionActions = ({ 5 )}{' '} {data.buyingTokenSymbol} - + )} - +
{!bidded && ( )} - +
) } diff --git a/src/views/yield-dtf/auctions/dutch/components/AuctionItem.tsx b/src/views/yield-dtf/auctions/dutch/components/AuctionItem.tsx index d9c4540ad..90887d91f 100644 --- a/src/views/yield-dtf/auctions/dutch/components/AuctionItem.tsx +++ b/src/views/yield-dtf/auctions/dutch/components/AuctionItem.tsx @@ -1,7 +1,10 @@ import CalculatorIcon from 'components/icons/CalculatorIcon' -import { MouseoverTooltip } from '@/components/old/tooltip' +import { + Tooltip, + TooltipContent, + TooltipTrigger, +} from '@/components/ui/tooltip' import { ChevronDown } from 'lucide-react' -import { Box, Text } from 'theme-ui' import { formatCurrency } from 'utils' const AuctionItem = ({ @@ -19,27 +22,28 @@ const AuctionItem = ({ forSymbol?: string price?: number }) => ( - +
{icon} - - - {title} - - +
+ {title} + {formatCurrency(amount, 5)} {symbol} - - + +
{!!price && !!forSymbol && ( - - - - - - + + +
+ + +
+
+ + {`1 ${forSymbol} = ${formatCurrency(price, 3)} ${symbol}`} + +
)} -
+
) export default AuctionItem diff --git a/src/views/yield-dtf/auctions/dutch/components/AuctionTimeIndicators.tsx b/src/views/yield-dtf/auctions/dutch/components/AuctionTimeIndicators.tsx index 7b368f320..5c44102b6 100644 --- a/src/views/yield-dtf/auctions/dutch/components/AuctionTimeIndicators.tsx +++ b/src/views/yield-dtf/auctions/dutch/components/AuctionTimeIndicators.tsx @@ -2,7 +2,7 @@ import { Trans } from '@lingui/macro' import AuctionsIcon from 'components/icons/AuctionsIcon' import { useAtomValue } from 'jotai' import { blockTimestampAtom } from 'state/atoms' -import { Box, Spinner, Text } from 'theme-ui' +import Spinner from '@/components/ui/spinner' import { parseDuration } from 'utils' const AuctionTimeIndicators = ({ @@ -21,40 +21,35 @@ const AuctionTimeIndicators = ({ const isEnding = currentTime >= finalPriceTime return ( - - +
+ {!isEnding && ( <> - + Final price in: - - + + {parseDuration(finalPriceTime - currentTime, { units: ['m'], round: true, })} - + )} {!isEnding && } - - Auction ends in: - - + Auction ends in: + ( {parseDuration(timeLeft, { units: ['m'], round: true, })} ) - - + +
) } diff --git a/src/views/yield-dtf/auctions/dutch/components/DutchAuction.tsx b/src/views/yield-dtf/auctions/dutch/components/DutchAuction.tsx index a205e78ac..bd530e21e 100644 --- a/src/views/yield-dtf/auctions/dutch/components/DutchAuction.tsx +++ b/src/views/yield-dtf/auctions/dutch/components/DutchAuction.tsx @@ -1,6 +1,7 @@ import TokenLogo from 'components/icons/TokenLogo' import { ArrowRight } from 'lucide-react' -import { Box, Card, Divider, Grid } from 'theme-ui' +import { Card } from '@/components/ui/card' +import { Separator } from '@/components/ui/separator' import { Address } from 'viem' import { DutchTrade } from '../atoms' import useAuctionPrices from '../hooks/useAuctionPrices' @@ -18,9 +19,9 @@ const DutchAuction = ({ data }: Props) => { ) return ( - - - + +
+
} @@ -51,10 +52,10 @@ const DutchAuction = ({ data }: Props) => { amount={data.amount * data.worstCasePrice} price={data.worstCasePrice} /> - - +
+ - +
) } diff --git a/src/views/yield-dtf/auctions/dutch/components/EndedDutchAuctions.tsx b/src/views/yield-dtf/auctions/dutch/components/EndedDutchAuctions.tsx index 7ec124676..e97216580 100644 --- a/src/views/yield-dtf/auctions/dutch/components/EndedDutchAuctions.tsx +++ b/src/views/yield-dtf/auctions/dutch/components/EndedDutchAuctions.tsx @@ -1,32 +1,35 @@ import { Trans } from '@lingui/macro' -import { Table } from '@/components/old/table' +import { Table } from '@/components/ui/legacy-table' import { useAtomValue } from 'jotai' -import { Box, BoxProps, Text } from 'theme-ui' import useColumns from '@/views/yield-dtf/auctions/components/useColumns' import { endedDutchTradesAtom } from '../atoms' import EndedAuctionsSkeleton from '@/views/yield-dtf/auctions/components/EndedAuctionsSkeleton' -const EndedDutchAuctions = (props: BoxProps) => { +interface EndedDutchAuctionsProps { + className?: string +} + +const EndedDutchAuctions = ({ className }: EndedDutchAuctionsProps) => { const columns = useColumns(true) const data = useAtomValue(endedDutchTradesAtom) return ( - - +
+ Ended auctions - + {data.length ? (
) : ( )} - + ) } diff --git a/src/views/yield-dtf/auctions/dutch/components/OngoingDutchAuctions.tsx b/src/views/yield-dtf/auctions/dutch/components/OngoingDutchAuctions.tsx index c680151a8..591659eb8 100644 --- a/src/views/yield-dtf/auctions/dutch/components/OngoingDutchAuctions.tsx +++ b/src/views/yield-dtf/auctions/dutch/components/OngoingDutchAuctions.tsx @@ -1,6 +1,5 @@ import { Trans } from '@lingui/macro' import { useAtomValue } from 'jotai' -import { Box, Text } from 'theme-ui' import { ongoingDutchTradesAtom } from '../atoms' import DutchAuction from './DutchAuction' import OngoingAuctionsSkeleton from '@/views/yield-dtf/auctions/components/OngoingAuctionsSkeleton' @@ -9,15 +8,15 @@ const OngoingDutchAuctions = () => { const trades = useAtomValue(ongoingDutchTradesAtom) return ( - - +
+ Ongoing dutch auctions - + {trades.map((trade) => ( ))} {!trades.length && } - +
) } diff --git a/src/views/yield-dtf/auctions/dutch/components/PendingToSettleAuctions.tsx b/src/views/yield-dtf/auctions/dutch/components/PendingToSettleAuctions.tsx index 9f5060835..56a1a1976 100644 --- a/src/views/yield-dtf/auctions/dutch/components/PendingToSettleAuctions.tsx +++ b/src/views/yield-dtf/auctions/dutch/components/PendingToSettleAuctions.tsx @@ -1,11 +1,16 @@ import { Trans } from '@lingui/macro' -import { Table } from '@/components/old/table' +import { Table } from '@/components/ui/legacy-table' import { useAtomValue } from 'jotai' -import { Box, BoxProps, Text } from 'theme-ui' import useColumns from '@/views/yield-dtf/auctions/components/useColumns' import { pendingDutchTradesAtom } from '../atoms' -const PendingToSettleAuctions = (props: BoxProps) => { +interface PendingToSettleAuctionsProps { + className?: string +} + +const PendingToSettleAuctions = ({ + className, +}: PendingToSettleAuctionsProps) => { const columns = useColumns(true) const data = useAtomValue(pendingDutchTradesAtom) @@ -14,12 +19,16 @@ const PendingToSettleAuctions = (props: BoxProps) => { } return ( - - +
+ Pending auctions to settle - -
- + +
+ ) } diff --git a/src/views/yield-dtf/auctions/dutch/components/useDutchTrades.tsx b/src/views/yield-dtf/auctions/dutch/components/useDutchTrades.tsx index ce5fce7ef..5628fa570 100644 --- a/src/views/yield-dtf/auctions/dutch/components/useDutchTrades.tsx +++ b/src/views/yield-dtf/auctions/dutch/components/useDutchTrades.tsx @@ -1,5 +1,5 @@ import { gql } from 'graphql-request' -import useQuery from 'hooks/useQuery' +import useQuery from 'hooks/use-query' import useRToken from 'hooks/useRToken' import { useAtom, useAtomValue, useSetAtom } from 'jotai' import { useEffect } from 'react' diff --git a/src/views/yield-dtf/auctions/dutch/index.tsx b/src/views/yield-dtf/auctions/dutch/index.tsx index d7da5cfcc..08944b61f 100644 --- a/src/views/yield-dtf/auctions/dutch/index.tsx +++ b/src/views/yield-dtf/auctions/dutch/index.tsx @@ -1,4 +1,3 @@ -import { Box } from 'theme-ui' import EndedDutchAuctions from './components/EndedDutchAuctions' import OngoingDutchAuctions from './components/OngoingDutchAuctions' import PendingToSettleAuctions from './components/PendingToSettleAuctions' @@ -8,11 +7,11 @@ const DutchAuctions = () => { useDutchTrades() return ( - +
- +
) } diff --git a/src/views/yield-dtf/auctions/index.tsx b/src/views/yield-dtf/auctions/index.tsx index 5e370ea3f..cc8527e7a 100644 --- a/src/views/yield-dtf/auctions/index.tsx +++ b/src/views/yield-dtf/auctions/index.tsx @@ -1,29 +1,28 @@ import { useAtomValue } from 'jotai' -import { Box, Divider } from 'theme-ui' +import { Separator } from '@/components/ui/separator' import { TradeKind, auctionPlatformAtom } from './atoms' import AuctionsSidebar from './auctions-sidebar' import BatchAuctions from './batch' import About from './components/About' import AuctionsHeader from './components/AuctionsHeader' import DutchAuctions from './dutch' -import { useEffect } from 'react' const Auctions = () => { const platform = useAtomValue(auctionPlatformAtom) return ( - +
- + {platform === TradeKind.BatchTrade ? ( ) : ( )} - + - +
) } diff --git a/src/views/yield-dtf/deploy/components/BackingManager.tsx b/src/views/yield-dtf/deploy/components/BackingManager.tsx index c2a444a9b..eef6a6a83 100644 --- a/src/views/yield-dtf/deploy/components/BackingManager.tsx +++ b/src/views/yield-dtf/deploy/components/BackingManager.tsx @@ -1,14 +1,19 @@ import { Trans } from '@lingui/macro' import BackingForm from 'components/rtoken-setup/token/BackingForm' -import { BoxProps, Card, Divider, Text } from 'theme-ui' +import { Card } from '@/components/ui/card' +import { Separator } from '@/components/ui/separator' -const BackingManager = (props: BoxProps) => { +interface BackingManagerProps { + className?: string +} + +const BackingManager = ({ className }: BackingManagerProps) => { return ( - - + + Backing Manager - - + + ) diff --git a/src/views/yield-dtf/deploy/components/DeployOverview.tsx b/src/views/yield-dtf/deploy/components/DeployOverview.tsx index eb0391d1e..f0296d254 100644 --- a/src/views/yield-dtf/deploy/components/DeployOverview.tsx +++ b/src/views/yield-dtf/deploy/components/DeployOverview.tsx @@ -1,15 +1,15 @@ import { Trans, t } from '@lingui/macro' import Deployer from 'abis/Deployer' -import CopyValue from '@/components/old/button/CopyValue' -import GoTo from '@/components/old/button/GoTo' -import TransactionButton from '@/components/old/button/TransactionButton' +import CopyValue from '@/components/ui/copy-value' +import GoTo from '@/components/ui/go-to' +import TransactionButton from '@/components/ui/transaction-button' +import Spinner from '@/components/ui/spinner' import DeployActionIcon from 'components/icons/DeployActionIcon' import useWatchTransaction from 'hooks/useWatchTransaction' import { useAtomValue } from 'jotai' import { useEffect } from 'react' import { useNavigate } from 'react-router-dom' import { chainIdAtom } from 'state/atoms' -import { Box, BoxProps, Flex, Spinner, Text } from 'theme-ui' import { shortenString } from 'utils' import { DEPLOYER_ADDRESS } from 'utils/addresses' import { ROUTES } from 'utils/constants' @@ -20,16 +20,16 @@ import TransactionError from 'components/transaction-error/TransactionError' const Pending = () => ( <> - - + + Pending, sign in wallet - - + +

Please sign the transaction in your wallet to continue with the deployment process. - +

) @@ -38,42 +38,39 @@ const Mining = ({ hash }: { hash: string }) => { return ( <> - - + + Deploy transaction submitted - - + +

Meditate peacefully on the stability of a future asset backed reserve currency while your RToken deploys 🧘‍♂️ - - +

+

Please don't close this window to avoid issues finding your way back here. - - - {shortenString(hash)} +

+
+ {shortenString(hash)} - +
) } -interface Props extends BoxProps { +interface Props { onDeploy(rtoken: Address): void + className?: string } -const DeployOverview = ({ onDeploy, sx = {}, ...props }: Props) => { +const DeployOverview = ({ onDeploy, className }: Props) => { const navigate = useNavigate() const chainId = useAtomValue(chainIdAtom) const { gas, write, isReady, hash, validationError, error, isLoading } = @@ -117,25 +114,14 @@ const DeployOverview = ({ onDeploy, sx = {}, ...props }: Props) => { }, [status]) return ( - - +
- + Tx1. RToken Deploy - + {(() => { if (isLoading && !hash) { return @@ -147,28 +133,27 @@ const DeployOverview = ({ onDeploy, sx = {}, ...props }: Props) => { return ( <> - +

You will be the temporary owner until governance is deployed in transaction 2. - +

- + ) })()} - - +
+ ) } diff --git a/src/views/yield-dtf/deploy/components/Governance.tsx b/src/views/yield-dtf/deploy/components/Governance.tsx index 93de68aa5..793758792 100644 --- a/src/views/yield-dtf/deploy/components/Governance.tsx +++ b/src/views/yield-dtf/deploy/components/Governance.tsx @@ -1,7 +1,6 @@ import Layout from 'components/rtoken-setup/Layout' import { governanceDefaultValues } from 'components/rtoken-setup/atoms' import { FormProvider, useForm } from 'react-hook-form' -import { Box } from 'theme-ui' import GovernanceOverview from './GovernanceOverview' import NavigationSidebar from './NavigationSidebar' import RTokenSetup from './RTokenSetup' @@ -13,15 +12,15 @@ const Governance = () => { }) return ( - +
- + - +
) } diff --git a/src/views/yield-dtf/deploy/components/GovernanceOverview.tsx b/src/views/yield-dtf/deploy/components/GovernanceOverview.tsx index e70d06eaf..9440583e4 100644 --- a/src/views/yield-dtf/deploy/components/GovernanceOverview.tsx +++ b/src/views/yield-dtf/deploy/components/GovernanceOverview.tsx @@ -1,7 +1,8 @@ import { Trans, t } from '@lingui/macro' -import CopyValue from '@/components/old/button/CopyValue' -import GoTo from '@/components/old/button/GoTo' -import TransactionButton from '@/components/old/button/TransactionButton' +import CopyValue from '@/components/ui/copy-value' +import GoTo from '@/components/ui/go-to' +import TransactionButton from '@/components/ui/transaction-button' +import Spinner from '@/components/ui/spinner' import GovernanceActionIcon from 'components/icons/GovernanceActionIcon' import useRToken from 'hooks/useRToken' import useWatchTransaction from 'hooks/useWatchTransaction' @@ -9,7 +10,7 @@ import { useAtomValue } from 'jotai' import { useEffect } from 'react' import { useNavigate } from 'react-router-dom' import { chainIdAtom } from 'state/atoms' -import { Box, BoxProps, Divider, Flex, Spinner, Text } from 'theme-ui' +import { Separator } from '@/components/ui/separator' import { getTokenRoute, shortenString } from 'utils' import { ROUTES } from 'utils/constants' import { ExplorerDataType, getExplorerLink } from 'utils/getExplorerLink' @@ -19,48 +20,44 @@ import TransactionError from 'components/transaction-error/TransactionError' const Pending = () => ( <> - - + + Pending, sign in wallet - - + +

Please sign the transaction in your wallet to continue with the government configuration process. - +

) -const Mining = ({ hash }: { hash: Hex }) => ( - <> - - - Transaction submitted - - - - Stay patient while the transaction is in progress & don’t close this - window to avoid issues finding your way back here. - - - - {shortenString(hash)} - - - - -) +const Mining = ({ hash }: { hash: Hex }) => { + const chainId = useAtomValue(chainIdAtom) + + return ( + <> + + + Transaction submitted + +

+ + Stay patient while the transaction is in progress & don't close this + window to avoid issues finding your way back here. + +

+
+ {shortenString(hash)} + + +
+ + ) +} const GovernanceStatus = () => { const navigate = useNavigate() @@ -90,55 +87,53 @@ const GovernanceStatus = () => { return ( <> - +

RToken will be ready to use after this TX if you choose to unpause. - +

- + ) } -const GovernanceOverview = (props: BoxProps) => ( - - +interface GovernanceOverviewProps { + className?: string +} + +const GovernanceOverview = ({ className }: GovernanceOverviewProps) => ( +
+
- + Tx2. Governance - + - - - - +
+ +
+ Not ready to set up governance? - - + +

You can leave your RToken paused and come back to setting up governance later. - - - +

+
+
) export default GovernanceOverview diff --git a/src/views/yield-dtf/deploy/components/Intro.tsx b/src/views/yield-dtf/deploy/components/Intro.tsx index 248092f3d..bd26dc857 100644 --- a/src/views/yield-dtf/deploy/components/Intro.tsx +++ b/src/views/yield-dtf/deploy/components/Intro.tsx @@ -1,55 +1,56 @@ import { Trans } from '@lingui/macro' -import { SmallButton } from '@/components/old/button' +import { Button } from '@/components/ui/button' +import { Card } from '@/components/ui/card' import DeployIntroIcon from 'components/icons/DeployIntroIcon' -import { Box, BoxProps, Card, Flex, Text } from 'theme-ui' import { DISCORD_INVITE, PROTOCOL_DOCS } from 'utils/constants' -const Intro = (props: BoxProps) => ( - - +interface IntroProps { + className?: string +} + +const Intro = ({ className }: IntroProps) => ( + +
- - +
+ Create a new Yield DTF -
- + +

Deploying through this UI doesn't require deep technical knowledge as long as you don't need novel collateral plugins for your baskets. However, we encourage you to talk to someone proficient in the protocol and read the docs to learn more before confirming any transactions. - - - +

+ +
) diff --git a/src/views/yield-dtf/deploy/components/NavigationSidebar.tsx b/src/views/yield-dtf/deploy/components/NavigationSidebar.tsx index 8cc4525c8..0233e1623 100644 --- a/src/views/yield-dtf/deploy/components/NavigationSidebar.tsx +++ b/src/views/yield-dtf/deploy/components/NavigationSidebar.tsx @@ -1,11 +1,10 @@ import { t, Trans } from '@lingui/macro' -import { SmallButton } from '@/components/old/button' -import Navigation from 'components/section-navigation/Navigation' +import { Button } from '@/components/ui/button' +import Navigation from '@/components/section-navigation/section-navigation' import { useAtomValue } from 'jotai' import { useMemo } from 'react' import { useNavigate } from 'react-router-dom' import { chainIdAtom, selectedRTokenAtom } from 'state/atoms' -import { Box, Text } from 'theme-ui' import { getTokenRoute } from 'utils' import { ROUTES } from 'utils/constants' @@ -37,25 +36,25 @@ const NavigationSidebar = ({ governance = false }) => { } return ( - - - +
+
+ +
- + Signing Tx 1 - + - + Signing Tx 2 - - + +
) } diff --git a/src/views/yield-dtf/deploy/components/OtherSetup.tsx b/src/views/yield-dtf/deploy/components/OtherSetup.tsx index 901bece3e..703de5c8f 100644 --- a/src/views/yield-dtf/deploy/components/OtherSetup.tsx +++ b/src/views/yield-dtf/deploy/components/OtherSetup.tsx @@ -1,13 +1,18 @@ import { Trans } from '@lingui/macro' import OtherForm from 'components/rtoken-setup/token/OtherForm' -import { BoxProps, Card, Divider, Text } from 'theme-ui' +import { Card } from '@/components/ui/card' +import { Separator } from '@/components/ui/separator' -const OtherSetup = (props: BoxProps) => ( - - +interface OtherSetupProps { + className?: string +} + +const OtherSetup = ({ className }: OtherSetupProps) => ( + + Other parameters - - + + ) diff --git a/src/views/yield-dtf/deploy/components/RTokenSetup.tsx b/src/views/yield-dtf/deploy/components/RTokenSetup.tsx index 84ad2d106..319710b82 100644 --- a/src/views/yield-dtf/deploy/components/RTokenSetup.tsx +++ b/src/views/yield-dtf/deploy/components/RTokenSetup.tsx @@ -2,16 +2,17 @@ import { t } from '@lingui/macro' import BasketSetup from 'components/rtoken-setup/basket/BasketSetup' import GovernanceSetup from 'components/rtoken-setup/governance/GovernanceSetup' import RevenueSplit from 'components/rtoken-setup/token/RevenueSplit' -import SectionWrapper from 'components/section-navigation/SectionWrapper' -import { Box, BoxProps } from 'theme-ui' +import SectionWrapper from '@/components/section-navigation/section-wrapper' +import { cn } from '@/lib/utils' import BackingManager from './BackingManager' import Intro from './Intro' import OtherSetup from './OtherSetup' import TokenParameters from './TokenParameters' import TransactionDivider, { DeploySuccessDivider } from './TransactionDivider' -interface Props extends BoxProps { +interface Props { governance?: boolean + className?: string } const DeploySection = ({ enabled = true }) => { @@ -30,17 +31,17 @@ const DeploySection = ({ enabled = true }) => { - + - + - + - + { const GovernanceSection = ({ enabled = true }) => ( <> - + {!enabled && ( - +
)} ( ) -const RTokenSetup = ({ governance = false, ...props }: Props) => { +const RTokenSetup = ({ governance = false, className }: Props) => { return ( - +
- +
) } diff --git a/src/views/yield-dtf/deploy/components/TokenForm.tsx b/src/views/yield-dtf/deploy/components/TokenForm.tsx index 465abd305..2748cf05d 100644 --- a/src/views/yield-dtf/deploy/components/TokenForm.tsx +++ b/src/views/yield-dtf/deploy/components/TokenForm.tsx @@ -1,23 +1,27 @@ import { t, Trans } from '@lingui/macro' import { FormField } from 'components/field' import { useFormContext } from 'react-hook-form' -import { Box, BoxProps, Text, Divider, Switch } from 'theme-ui' +import { Switch } from '@/components/ui/switch' + +interface TokenFormProps { + className?: string +} /** * View: Deploy -> Token setup */ -const TokenForm = (props: BoxProps) => { - const { watch, register } = useFormContext() +const TokenForm = ({ className }: TokenFormProps) => { + const { watch, setValue } = useFormContext() const [tickerValue, reweightable] = watch(['ticker', 'reweightable']) return ( - +
{ required: t`Token ticker is required`, }} /> - - +
+ Staking token: - {' '} - {tickerValue || 'st'}RSR Token, - + {' '} + {tickerValue || 'st'}RSR Token, + St Token Ticker: - {' '} - {tickerValue || 'st'}RSR - + {' '} + {tickerValue || 'st'}RSR +
{ }, }} /> - - Allow RToken basket to change weights - +
+ Allow RToken basket to change weights +

A re-weightable RToken can have its basket changed in terms of its target units (USD/ETH/BTC/etc…). This flexibility allows for the addition, removal, and update of target units in the basket via @@ -70,17 +70,15 @@ const TokenForm = (props: BoxProps) => { guarantees than holders of non-re-weightable RTokens. This option should only be used if an RToken must be re-weightable in order to accomplish its core goals. - - - - - - - - +

+
+ setValue('reweightable', checked)} + /> +
+
+
) } diff --git a/src/views/yield-dtf/deploy/components/TokenParameters.tsx b/src/views/yield-dtf/deploy/components/TokenParameters.tsx index 06cc7985c..5a2fd12dd 100644 --- a/src/views/yield-dtf/deploy/components/TokenParameters.tsx +++ b/src/views/yield-dtf/deploy/components/TokenParameters.tsx @@ -5,7 +5,8 @@ import { useAtom, useAtomValue } from 'jotai' import { useResetAtom } from 'jotai/utils' import { useFormContext } from 'react-hook-form' import { chainIdAtom, walletChainAtom } from 'state/atoms' -import { Box, BoxProps, Card, Divider, Label, Radio, Text } from 'theme-ui' +import { Card } from '@/components/ui/card' +import { Separator } from '@/components/ui/separator' import { AvailableChain, ChainId } from 'utils/chains' import { CHAIN_TAGS, supportedChainList } from 'utils/constants' import TokenForm from './TokenForm' @@ -35,30 +36,20 @@ const ChainOption = ({ onChange?: (e: React.ChangeEvent) => void }) => { return ( -
+ +
{!data.length && ( - +
- + No voters at this moment... - - + +
)} -
+ ) } diff --git a/src/views/yield-dtf/governance/index.tsx b/src/views/yield-dtf/governance/index.tsx index 541159f8c..46d5706ac 100644 --- a/src/views/yield-dtf/governance/index.tsx +++ b/src/views/yield-dtf/governance/index.tsx @@ -1,27 +1,17 @@ -import { Box, Grid } from 'theme-ui' import GovernanceActions from './components/GovernanceOverview' import ProposalList from './components/ProposalList' import TopVoters from './components/TopVoters' const Governance = () => ( - - - +
+
+
- - + +
- - +
+
) export default Governance diff --git a/src/views/yield-dtf/governance/views/proposal-detail/ProposalHeader.tsx b/src/views/yield-dtf/governance/views/proposal-detail/ProposalHeader.tsx index e67b66815..6e22c1f81 100644 --- a/src/views/yield-dtf/governance/views/proposal-detail/ProposalHeader.tsx +++ b/src/views/yield-dtf/governance/views/proposal-detail/ProposalHeader.tsx @@ -1,6 +1,6 @@ import Address from '@/components/utils/explorer-address' -import { SmallButton } from '@/components/old/button' -import CopyValue from '@/components/old/button/CopyValue' +import { Button } from '@/components/ui/button' +import CopyValue from '@/components/ui/copy-value' import FilesIcon from 'components/icons/FilesIcon' import FingerprintIcon from 'components/icons/FingerprintIcon' import WalletOutlineIcon from 'components/icons/WalletOutlineIcon' @@ -10,7 +10,6 @@ import { useAtomValue } from 'jotai' import { ReactNode } from 'react' import { ArrowLeft, ArrowUpRight } from 'lucide-react' import { useNavigate } from 'react-router-dom' -import { Box, Link, Text } from 'theme-ui' import { shortenString } from 'utils' import { ROUTES } from 'utils/constants' import { proposalDetailAtom } from './atom' @@ -24,32 +23,16 @@ const BackButton = () => { } return ( - - + ) } const Dot = () => ( - - · - +
·
) const StatItem = ({ @@ -61,28 +44,15 @@ const StatItem = ({ icon: ReactNode children: ReactNode }) => ( - - +
+
{icon} - - - - {label} - +
+
+ {label} {children} - - +
+
) const ProposalHeader = () => { @@ -101,107 +71,61 @@ const ProposalHeader = () => { } return ( - - +
+
- - - - - {title} - +
+
+
+ {title} {!!rfcLink && ( - - + {rfcLink} - + - + )} - - - +
+
+
}> - + {proposal?.creationTime ? dayjs.unix(+proposal.creationTime).format('MMM D, YYYY') : 'Loading...'} - + }> - +
{proposal?.proposer && rToken?.chainId && (
)} - +
}> - - +
+ {proposal?.id ? shortenString(proposal.id) : 'Loading...'} - + {!!proposal?.id && ( )} - +
- - - - +
+
+
+
) } export default ProposalHeader diff --git a/src/views/yield-dtf/governance/views/proposal-detail/ProposalSnapshot.tsx b/src/views/yield-dtf/governance/views/proposal-detail/ProposalSnapshot.tsx index e873b6011..15ff53418 100644 --- a/src/views/yield-dtf/governance/views/proposal-detail/ProposalSnapshot.tsx +++ b/src/views/yield-dtf/governance/views/proposal-detail/ProposalSnapshot.tsx @@ -1,10 +1,9 @@ -import Button from '@/components/old/button' +import { Button } from '@/components/ui/button' import useRToken from 'hooks/useRToken' import { useAtomValue } from 'jotai' import { Download } from 'lucide-react' import { useParams } from 'react-router-dom' import { rTokenGovernanceAtom } from 'state/atoms' -import { Text } from 'theme-ui' import useProposalDetail from './useProposalDetail' const JSONToFile = (obj: any, filename: string) => { @@ -47,13 +46,13 @@ const ProposalSnapshot = () => { return ( ) } diff --git a/src/views/yield-dtf/governance/views/proposal-detail/components/ContractProposalDetails.tsx b/src/views/yield-dtf/governance/views/proposal-detail/components/ContractProposalDetails.tsx index 0f4538e82..c4a4bd5c1 100644 --- a/src/views/yield-dtf/governance/views/proposal-detail/components/ContractProposalDetails.tsx +++ b/src/views/yield-dtf/governance/views/proposal-detail/components/ContractProposalDetails.tsx @@ -1,5 +1,5 @@ import { Trans } from '@lingui/macro' -import GoTo from '@/components/old/button/GoTo' +import GoTo from '@/components/ui/go-to' import { MODES } from 'components/dark-mode-toggle' import TabMenu from 'components/tab-menu' import { useAtomValue } from 'jotai' @@ -13,15 +13,6 @@ import { } from 'react-json-view-lite' import 'react-json-view-lite/dist/index.css' import { chainIdAtom } from 'state/atoms' -import { - Box, - BoxProps, - Card, - Divider, - Flex, - Text, - useColorMode, -} from 'theme-ui' import { ExplorerDataType, getExplorerLink } from 'utils/getExplorerLink' import { safeJsonFormat } from '@/views/yield-dtf/deploy/utils' import { @@ -29,45 +20,43 @@ import { ProposalCall, } from '@/views/yield-dtf/governance/atoms' import BasketChangeSummary from './proposal-summary/BasketChangeSummary' +import { Card } from '@/components/ui/card' +import { Separator } from '@/components/ui/separator' +import { useTheme } from 'next-themes' +import { cn } from '@/lib/utils' -interface Props extends BoxProps { +interface Props { data: ContractProposal snapshotBlock?: number - borderColor?: string + className?: string } const CallData = ({ data, - borderColor = 'darkBorder', }: { data: string - borderColor?: string }) => { const [isOpen, setOpen] = useState(false) return ( - - +
setOpen(!isOpen)} > - + Executable code - + {isOpen ? : } - +
{isOpen && ( <> - - - {data} - - + + {data} +
)} - +
) } @@ -75,58 +64,54 @@ const Header = ({ label, address }: { label: string; address: string }) => { const chainId = useAtomValue(chainIdAtom) return ( - - - {label} - +
+ {label} - +
) } const JSONPreview = ({ data }: { data: any }) => { - const [colorMode] = useColorMode() + const { theme } = useTheme() if (data.length > 1) { return ( ) } return ( - + {data && data[0] !== undefined ? typeof data[0] === 'object' ? safeJsonFormat(data[0]) : data[0].toString() : 'None'} - + ) } -const borderColor = 'darkBorder' const RawCallPreview = ({ call }: { call: ProposalCall }) => ( <> - - +
+ Signature - - + + {call.signature}({call.parameters.join(', ')}) - - + +
- + Parameters - + ) @@ -165,24 +150,14 @@ const CallPreview = ({ const isDetailed = detailed === 'summary' return ( - - - +
+ {index + 1}/{total} {isDetailed && 'Set Primary basket'} - + {displayDetailedOption && ( setDetailed(kind)} /> )} - +
{isDetailed ? ( ) : ( )} - - -
+ + + ) } @@ -214,7 +189,7 @@ const CallList = ({ const total = calls.length return ( - +
{calls.map((call, index) => ( ))} - +
) } // Actions setPrimeBasket -const ContractProposalDetails = ({ data, snapshotBlock, ...props }: Props) => { +const ContractProposalDetails = ({ data, snapshotBlock, className }: Props) => { if (!data.calls.length) { return null } return (
diff --git a/src/views/yield-dtf/governance/views/proposal-detail/components/ProposalAlert.tsx b/src/views/yield-dtf/governance/views/proposal-detail/components/ProposalAlert.tsx index e87186905..922c94e94 100644 --- a/src/views/yield-dtf/governance/views/proposal-detail/components/ProposalAlert.tsx +++ b/src/views/yield-dtf/governance/views/proposal-detail/components/ProposalAlert.tsx @@ -1,10 +1,10 @@ import { useAtomValue } from 'jotai' import { ReactNode } from 'react' import { Check, Slash, X } from 'lucide-react' -import { Box, Spinner, Text } from 'theme-ui' import { parseDurationShort } from 'utils' import { PROPOSAL_STATES } from 'utils/constants' import { getProposalStateAtom } from '../atom' +import Spinner from '@/components/ui/spinner' const FinalState = ({ label, @@ -18,38 +18,28 @@ const FinalState = ({ icon: ReactNode }) => { return ( - - {icon} - - {label} - + + {label} + ) } -const FINAL_STATES = { +const FINAL_STATES: Record< + string, + { label: string; color: string; bgColor: string; icon: ReactNode } +> = { [PROPOSAL_STATES.EXECUTED]: { label: 'Executed', - color: 'primary', + color: 'var(--primary)', bgColor: 'rgba(9, 85, 172, 0.10)', icon: , }, @@ -85,14 +75,14 @@ const FINAL_STATES = { }, } -const DEADLINE_STATES = { +const DEADLINE_STATES: Record = { [PROPOSAL_STATES.ACTIVE]: { text: 'Voting period ends in', - color: 'accentInverted', + color: 'var(--accent-inverted)', }, [PROPOSAL_STATES.PENDING]: { text: 'Voting begins in', - color: 'accentInverted', + color: 'var(--accent-inverted)', }, [PROPOSAL_STATES.QUEUED]: { text: 'Execution delay ends in', @@ -130,7 +120,7 @@ const ProposalAlert = () => { return ( } /> @@ -138,25 +128,14 @@ const ProposalAlert = () => { } return ( - - - - {DEADLINE_STATES[state.state].text} - - - {deadline} - - + + {DEADLINE_STATES[state.state].text} + {deadline} + ) } diff --git a/src/views/yield-dtf/governance/views/proposal-detail/components/ProposalCancel.tsx b/src/views/yield-dtf/governance/views/proposal-detail/components/ProposalCancel.tsx index 0886fef67..0ad8a444b 100644 --- a/src/views/yield-dtf/governance/views/proposal-detail/components/ProposalCancel.tsx +++ b/src/views/yield-dtf/governance/views/proposal-detail/components/ProposalCancel.tsx @@ -1,6 +1,6 @@ import { t } from '@lingui/macro' import Timelock from 'abis/Timelock' -import TransactionButton from '@/components/old/button/TransactionButton' +import TransactionButton from '@/components/ui/transaction-button' import useContractWrite from 'hooks/useContractWrite' import useWatchTransaction from 'hooks/useWatchTransaction' import { useAtomValue } from 'jotai' @@ -39,19 +39,16 @@ const ProposalCancel = () => { return ( ) } diff --git a/src/views/yield-dtf/governance/views/proposal-detail/components/ProposalDetailContent.tsx b/src/views/yield-dtf/governance/views/proposal-detail/components/ProposalDetailContent.tsx index 86e713114..f8c8a2951 100644 --- a/src/views/yield-dtf/governance/views/proposal-detail/components/ProposalDetailContent.tsx +++ b/src/views/yield-dtf/governance/views/proposal-detail/components/ProposalDetailContent.tsx @@ -1,9 +1,9 @@ import { useAtomValue } from 'jotai' import { lazy, Suspense, useState } from 'react' -import { Box } from 'theme-ui' import ProposalDetail from '@/views/yield-dtf/governance/components/ProposalDetailPreview' import { proposalDetailAtom } from '../atom' import Skeleton from 'react-loading-skeleton' +import { cn } from '@/lib/utils' const DescriptionMarkdown = lazy(() => import('./ProposalMdDescription')) @@ -26,73 +26,52 @@ const ProposalDetailContent = () => { } return ( - - - - +
+
+
setTab(TABS.DESCRIPTION)} > Description - - +
setTab(TABS.CHANGES)} > Proposed changes - - - +
+
+
{tab === TABS.DESCRIPTION ? ( - +
}> - +
) : ( !!proposal && ( ) )} -
+
) } diff --git a/src/views/yield-dtf/governance/views/proposal-detail/components/ProposalDetailNavigation.tsx b/src/views/yield-dtf/governance/views/proposal-detail/components/ProposalDetailNavigation.tsx index 42e6fecc9..1c28464e7 100644 --- a/src/views/yield-dtf/governance/views/proposal-detail/components/ProposalDetailNavigation.tsx +++ b/src/views/yield-dtf/governance/views/proposal-detail/components/ProposalDetailNavigation.tsx @@ -1,11 +1,10 @@ import { t } from '@lingui/macro' -import Navigation from 'components/section-navigation/Navigation' -import { Box } from 'theme-ui' +import Navigation from '@/components/section-navigation/section-navigation' const ProposalDetailNavigation = ({ sections }: { sections: string[] }) => ( - - - +
+ +
) export default ProposalDetailNavigation diff --git a/src/views/yield-dtf/governance/views/proposal-detail/components/ProposalDetailStats.tsx b/src/views/yield-dtf/governance/views/proposal-detail/components/ProposalDetailStats.tsx index 6ec17c4e8..75bfe3fcf 100644 --- a/src/views/yield-dtf/governance/views/proposal-detail/components/ProposalDetailStats.tsx +++ b/src/views/yield-dtf/governance/views/proposal-detail/components/ProposalDetailStats.tsx @@ -2,7 +2,6 @@ import Governance from 'abis/Governance' import { useAtomValue } from 'jotai' import { useMemo } from 'react' import { Check, Slash, ThumbsDown, ThumbsUp, X } from 'lucide-react' -import { Box, Progress, Text } from 'theme-ui' import { formatEther } from 'viem' import { getProposalStateAtom, proposalDetailAtom } from '../atom' import { colors } from 'theme' @@ -11,6 +10,8 @@ import { rTokenAtom } from 'state/atoms' import { isTimeunitGovernance } from '@/views/yield-dtf/governance/utils' import { PROPOSAL_STATES } from 'utils/constants' import { useReadContracts } from 'wagmi' +import { Progress } from '@/components/ui/progress' +import { cn } from '@/lib/utils' const BooleanIcon = ({ value, @@ -22,21 +23,13 @@ const BooleanIcon = ({ colorFailure?: string }) => { return ( - +
{value ? ( ) : ( )} - +
) } @@ -103,54 +96,31 @@ const ProposalDetailStats = () => { }, [forVotes, againstVotes]) return ( - - +
+ {[PROPOSAL_STATES.ACTIVE, PROPOSAL_STATES.PENDING].includes(state) ? 'Current' : 'Final'}{' '} votes - - div:not(:last-child)': { - borderBottom: '1px solid', - borderColor: 'borderSecondary', - }, - border: '1px solid', - borderColor: 'borderSecondary', - boxShadow: '0px 10px 38px 6px rgba(0, 0, 0, 0.05)', - }} - > - - - + +
+
+
+
- Quorum - - - Quorum +
+
+ {formatPercentage(quorumWeight * 100)} - + - + {formatCurrency(currentQuorum, 0, { notation: 'compact', compactDisplay: 'short', @@ -160,175 +130,108 @@ const ProposalDetailStats = () => { notation: 'compact', compactDisplay: 'short', })} - - - + +
+
- - - - +
+
+
+
- Majority support - - - Majority support +
+
+ {majoritySupport ? 'Yes' : 'No'} - - + + {formatPercentage( (majoritySupport || !majorityWeight ? majorityWeight : 1 - majorityWeight) * 100 )} - - - + +
+
- - - - +
+
+
+
- - - For - +
+
+ For + {formatCurrency(+forVotes, 0, { notation: 'compact', compactDisplay: 'short', })} - - - - - - Against - + +
+
+
+
+ Against + {formatCurrency(+againstVotes, 0, { notation: 'compact', compactDisplay: 'short', })} - - - + +
+
- - - - - - +
+
+
+
+
+
- - Abstain - - +
+ Abstain +
+ {formatCurrency(+abstainVotes, 0, { notation: 'compact', compactDisplay: 'short', })} - - - - + +
+
+
) } diff --git a/src/views/yield-dtf/governance/views/proposal-detail/components/ProposalExecute.tsx b/src/views/yield-dtf/governance/views/proposal-detail/components/ProposalExecute.tsx index 8c0191d8a..f1744428e 100644 --- a/src/views/yield-dtf/governance/views/proposal-detail/components/ProposalExecute.tsx +++ b/src/views/yield-dtf/governance/views/proposal-detail/components/ProposalExecute.tsx @@ -1,6 +1,6 @@ import { t } from '@lingui/macro' import Governance from 'abis/Governance' -import TransactionButton from '@/components/old/button/TransactionButton' +import TransactionButton from '@/components/ui/transaction-button' import useContractWrite from 'hooks/useContractWrite' import useWatchTransaction from 'hooks/useWatchTransaction' import { useAtomValue } from 'jotai' @@ -34,13 +34,13 @@ const ProposalExecute = () => { return ( ) } diff --git a/src/views/yield-dtf/governance/views/proposal-detail/components/ProposalQueue.tsx b/src/views/yield-dtf/governance/views/proposal-detail/components/ProposalQueue.tsx index 711ceb7e6..bf8972d3a 100644 --- a/src/views/yield-dtf/governance/views/proposal-detail/components/ProposalQueue.tsx +++ b/src/views/yield-dtf/governance/views/proposal-detail/components/ProposalQueue.tsx @@ -1,6 +1,6 @@ import { t } from '@lingui/macro' import Governance from 'abis/Governance' -import TransactionButton from '@/components/old/button/TransactionButton' +import TransactionButton from '@/components/ui/transaction-button' import useContractWrite from 'hooks/useContractWrite' import useWatchTransaction from 'hooks/useWatchTransaction' import { useAtomValue } from 'jotai' @@ -23,10 +23,9 @@ const ProposalQueue = () => { return ( { const { proposalId } = useParams() @@ -33,8 +33,8 @@ const ViewExecuteTxButton = () => { return ( ) @@ -66,8 +66,12 @@ const STATES_WITH_ACTIONS = [ PROPOSAL_STATES.EXECUTED, ] +interface ProposalVoteProps { + className?: string +} + // TODO: Validate voting power first? -const ProposalVote = (props: BoxProps) => { +const ProposalVote = ({ className }: ProposalVoteProps) => { const account = useAtomValue(walletAtom) const rToken = useRToken() const chainId = useAtomValue(chainIdAtom) @@ -96,75 +100,52 @@ const ProposalVote = (props: BoxProps) => { hasNoDelegates return ( - - {!FINAL_STATES.includes(state) && ( - - +
+
- Your voting power: - + Your voting power: + {formatCurrency(votePower ? +votePower : 0)} - - - +
+
hasUndelegatedBalance && setDelegateVisible(true)} > - Delegate - - + Delegate +
+
)} - +
- - +
+ {(state === PROPOSAL_STATES.PENDING || state === PROPOSAL_STATES.ACTIVE) && ( - +
{hasUndelegatedBalance ? ( )} - +
)} {state === PROPOSAL_STATES.EXECUTED && } {state === PROPOSAL_STATES.SUCCEEDED && } {state === PROPOSAL_STATES.QUEUED && ( - +
- +
)} {isVoteVisible && setVoteVisible(false)} />} {isDelegateVisible && ( @@ -207,7 +188,7 @@ const ProposalVote = (props: BoxProps) => { onClose={() => setDelegateVisible(false)} /> )} -
+ ) } diff --git a/src/views/yield-dtf/governance/views/proposal-detail/components/ProposalVotes.tsx b/src/views/yield-dtf/governance/views/proposal-detail/components/ProposalVotes.tsx index 20621624c..16b6b8409 100644 --- a/src/views/yield-dtf/governance/views/proposal-detail/components/ProposalVotes.tsx +++ b/src/views/yield-dtf/governance/views/proposal-detail/components/ProposalVotes.tsx @@ -1,14 +1,14 @@ import { Trans } from '@lingui/macro' import BlockiesAvatar from '@/components/utils/blockies-avatar' -import GoTo from '@/components/old/button/GoTo' +import GoTo from '@/components/ui/go-to' import { useEnsAddresses } from 'hooks/useEnsAddresses' import { atom, useAtomValue } from 'jotai' import { useState } from 'react' import { chainIdAtom } from 'state/atoms' -import { Box, Text } from 'theme-ui' import { formatCurrency, shortenAddress } from 'utils' import { ExplorerDataType, getExplorerLink } from 'utils/getExplorerLink' import { proposalDetailAtom } from '../atom' +import { cn } from '@/lib/utils' interface Vote { voter: string @@ -53,88 +53,56 @@ const ProposalVotes = () => { const ensRes: string[] = useEnsAddresses(addresses) return ( - - - - +
+
+
setCurrent(VOTE_TYPE.FOR)} > Votes for - - +
setCurrent(VOTE_TYPE.AGAINST)} > Votes against - - +
setCurrent(VOTE_TYPE.ABSTAIN)} > Abstain - - - +
+
+
- - +
+
{currentVotes.map((vote, index) => ( - - + {!!ensRes[index] ? ensRes[index] : shortenAddress(vote.voter)} - + { ExplorerDataType.ADDRESS )} /> - {formatCurrency(+vote.weight, 0, { notation: 'compact', compactDisplay: 'short', })} - - + +
))} - +
{!currentVotes.length && ( - - +
+ No votes - - + +
)} -
-
+
+
) } diff --git a/src/views/yield-dtf/governance/views/proposal-detail/components/VoteModal.tsx b/src/views/yield-dtf/governance/views/proposal-detail/components/VoteModal.tsx index bcec8b3de..d84951348 100644 --- a/src/views/yield-dtf/governance/views/proposal-detail/components/VoteModal.tsx +++ b/src/views/yield-dtf/governance/views/proposal-detail/components/VoteModal.tsx @@ -1,9 +1,9 @@ import { t, Trans } from '@lingui/macro' import Governance from 'abis/Governance' import { Modal } from 'components' -import GoTo from '@/components/old/button/GoTo' -import TransactionButton from '@/components/old/button/TransactionButton' -import { ModalProps } from '@/components/old/modal' +import GoTo from '@/components/ui/go-to' +import TransactionButton from '@/components/ui/transaction-button' +import { ModalProps } from 'components' import useContractWrite from 'hooks/useContractWrite' import { useAtomValue } from 'jotai' import { useState } from 'react' @@ -15,7 +15,6 @@ import { ThumbsUp, } from 'lucide-react' import { chainIdAtom, rTokenGovernanceAtom } from 'state/atoms' -import { Box, Checkbox, Divider, Flex, Link, Text } from 'theme-ui' import { getProposalTitle, shortenAddress } from 'utils' import { ETHERSCAN_NAMES, @@ -23,6 +22,8 @@ import { getExplorerLink, } from 'utils/getExplorerLink' import { proposalDetailAtom } from '../atom' +import { Separator } from '@/components/ui/separator' +import { Checkbox } from '@/components/ui/checkbox' export const VOTE_TYPE = { AGAINST: 0, @@ -59,83 +60,74 @@ const VoteModal = (props: ModalProps) => { if (hash) { return ( - +

- Transactions signed! + Transactions signed!
- View on{' '} {ETHERSCAN_NAMES[chainId]} - - + +
) } return ( - - +
+ " {proposal?.description ? getProposalTitle(proposal.description) : 'Loading...'} - - - + +
+ Proposed by: - - {shortenAddress(proposal?.proposer || '')} + + {shortenAddress(proposal?.proposer || '')} - - - +
+
+ {voteOptions.map((option, index) => ( - {option.value === VOTE_TYPE.FOR && } {option.value === VOTE_TYPE.AGAINST && } {option.value === VOTE_TYPE.ABSTAIN && } - - {option.label} - - + ))} - + diff --git a/src/views/yield-dtf/governance/views/proposal-detail/components/proposal-summary/BasketChangeSummary.tsx b/src/views/yield-dtf/governance/views/proposal-detail/components/proposal-summary/BasketChangeSummary.tsx index a9c8fbfb1..824824ebb 100644 --- a/src/views/yield-dtf/governance/views/proposal-detail/components/proposal-summary/BasketChangeSummary.tsx +++ b/src/views/yield-dtf/governance/views/proposal-detail/components/proposal-summary/BasketChangeSummary.tsx @@ -5,8 +5,6 @@ import { useAtomValue } from 'jotai' import { ArrowDown, ArrowRight, ArrowUp, Plus, X } from 'lucide-react' import 'react-json-view-lite/dist/index.css' import { collateralYieldAtom } from 'state/atoms' -import { borderRadius } from 'theme' -import { Box, BoxProps, Flex, Grid, Spinner, Text } from 'theme-ui' import { formatPercentage } from 'utils' import { collateralDisplay } from 'utils/constants' import { ProposalCall } from '@/views/yield-dtf/governance/atoms' @@ -15,6 +13,8 @@ import { DiffItem, useBasketChangesSummary, } from '@/views/yield-dtf/governance/hooks' +import Spinner from '@/components/ui/spinner' +import { cn } from '@/lib/utils' const useBasketApy = ( basket: BasketItem, @@ -32,11 +32,12 @@ const useBasketApy = ( }, 0) } -interface IStatusBox extends BoxProps { +interface IStatusBox { status: DiffItem['status'] + className?: string } -const StatusBox = ({ status, sx = {}, ...props }: IStatusBox) => { +const StatusBox = ({ status, className }: IStatusBox) => { const statusMap = { added: { label: 'Add', @@ -62,27 +63,17 @@ const StatusBox = ({ status, sx = {}, ...props }: IStatusBox) => { } return ( - {statusMap[status].icon} - + {statusMap[status].label} - - + + ) } @@ -91,75 +82,55 @@ const BasketDiffItem = ({ item }: { item: DiffItem }) => { const apys = useAtomValue(collateralYieldAtom)[rToken?.chainId ?? 1] || {} return ( - - - - - +
+
+ +
+ {collateralDisplay[item.symbol.toLowerCase()] || item.symbol} - - - {item.targetUnit}| - APY:{' '} - + +
+ {item.targetUnit}| + APY:{' '} + {formatPercentage(apys[item.symbol.toLowerCase()])} - - - - - + +
+
+
+
- {item.status === 'added' ? 'N/A' : formatPercentage(item.oldWeight)} - - + +
- - + {formatPercentage(item.newWeight)} - - + +
- +
) } @@ -177,23 +148,14 @@ const BasketAPYDiff = ({ const currentApy = useBasketApy(snapshot, rToken?.chainId ?? 1, meta) return ( - - 30-day blended APY: - +
+ 30-day blended APY: + {formatPercentage(currentApy)} - + - {formatPercentage(proposedApy)} - + {formatPercentage(proposedApy)} +
) } @@ -214,43 +176,33 @@ const BasketChangeSummary = ({ if (isLoading) { return ( - +
- Loading summary... - + Loading summary... +
) } return ( - - - Collateral token - +
+
+ Collateral token + Old weight / New weight - - - Change - - - + + Change +
+
{data?.diff.map((item) => ( ))} - +
- +
) } diff --git a/src/views/yield-dtf/governance/views/proposal-detail/components/proposal-timeline/TimelineItem.tsx b/src/views/yield-dtf/governance/views/proposal-detail/components/proposal-timeline/TimelineItem.tsx index 2b54cd243..f8a6ef440 100644 --- a/src/views/yield-dtf/governance/views/proposal-detail/components/proposal-timeline/TimelineItem.tsx +++ b/src/views/yield-dtf/governance/views/proposal-detail/components/proposal-timeline/TimelineItem.tsx @@ -15,7 +15,7 @@ import { } from 'lucide-react' import { blockTimestampAtom, chainIdAtom } from 'state/atoms' import { colors } from 'theme' -import { Box, Progress, Text } from 'theme-ui' +import { Progress } from '@/components/ui/progress' import { formatDate, parseDuration } from 'utils' import { PROPOSAL_STATES } from 'utils/constants' import { isTimeunitGovernance } from '@/views/yield-dtf/governance/utils' @@ -41,52 +41,26 @@ const TimelineItem = ({ progress = 0, }: TimelineItemProps) => { return ( - - - +
+
{icon} - - - {!!subtitle && {surtitle}} - {title} - {subtitle || surtitle} - - +
+
+ {!!subtitle &&
{surtitle}
} +
{title}
+
{subtitle || surtitle}
+
+
{showProgress && ( )} -
+
) } @@ -100,10 +74,10 @@ export const TimelineItemCreated = () => { title="Proposal created" surtitle={formatDate(+(proposal?.creationTime || 0) * 1000)} subtitle={ - - By: +
+ By: - +
} /> ) @@ -190,7 +164,7 @@ const VALID_STATES = [ PROPOSAL_STATES.EXECUTED, PROPOSAL_STATES.CANCELED, ] -const TITLE_BY_STATE = { +const TITLE_BY_STATE: Record = { [PROPOSAL_STATES.DEFEATED]: 'Proposal defeated', [PROPOSAL_STATES.QUORUM_NOT_REACHED]: 'Quorum not reached', [PROPOSAL_STATES.EXPIRED]: 'Proposal expired', @@ -199,7 +173,7 @@ const TITLE_BY_STATE = { [PROPOSAL_STATES.EXECUTED]: 'Proposal succeeded', [PROPOSAL_STATES.CANCELED]: 'Proposal succeeded', } -const ICON_BY_STATE = { +const ICON_BY_STATE: Record = { [PROPOSAL_STATES.DEFEATED]: , [PROPOSAL_STATES.QUORUM_NOT_REACHED]: , [PROPOSAL_STATES.EXPIRED]: , @@ -208,14 +182,14 @@ const ICON_BY_STATE = { [PROPOSAL_STATES.EXECUTED]: , [PROPOSAL_STATES.CANCELED]: , } -const COLOR_BY_STATE = { - [PROPOSAL_STATES.DEFEATED]: 'red', - [PROPOSAL_STATES.QUORUM_NOT_REACHED]: 'orange', - [PROPOSAL_STATES.EXPIRED]: 'gray', - [PROPOSAL_STATES.SUCCEEDED]: 'success', - [PROPOSAL_STATES.QUEUED]: 'success', - [PROPOSAL_STATES.EXECUTED]: 'success', - [PROPOSAL_STATES.CANCELED]: 'success', +const COLOR_BY_STATE: Record = { + [PROPOSAL_STATES.DEFEATED]: 'text-red-500', + [PROPOSAL_STATES.QUORUM_NOT_REACHED]: 'text-orange-500', + [PROPOSAL_STATES.EXPIRED]: 'text-gray-500', + [PROPOSAL_STATES.SUCCEEDED]: 'text-green-500', + [PROPOSAL_STATES.QUEUED]: 'text-green-500', + [PROPOSAL_STATES.EXECUTED]: 'text-green-500', + [PROPOSAL_STATES.CANCELED]: 'text-green-500', } export const TimelineItemVotingResult = () => { const proposalState = useAtomValue(getProposalStateAtom) @@ -227,9 +201,9 @@ export const TimelineItemVotingResult = () => { + {TITLE_BY_STATE[proposalState.state]} -
+ } /> ) @@ -271,7 +245,7 @@ const VALID_STATES_END = [ PROPOSAL_STATES.EXECUTED, PROPOSAL_STATES.CANCELED, ] -const TITLE_BY_STATE_END = { +const TITLE_BY_STATE_END: Record = { [PROPOSAL_STATES.QUEUED]: 'Execute proposal', [PROPOSAL_STATES.EXECUTED]: 'Executed', [PROPOSAL_STATES.CANCELED]: 'Canceled', diff --git a/src/views/yield-dtf/governance/views/proposal-detail/components/proposal-timeline/index.tsx b/src/views/yield-dtf/governance/views/proposal-detail/components/proposal-timeline/index.tsx index 97ff1e725..594d36534 100644 --- a/src/views/yield-dtf/governance/views/proposal-detail/components/proposal-timeline/index.tsx +++ b/src/views/yield-dtf/governance/views/proposal-detail/components/proposal-timeline/index.tsx @@ -1,4 +1,3 @@ -import { Box, Text } from 'theme-ui' import { TimelineItemCreated, TimelineItemVotingPeriod, @@ -11,37 +10,17 @@ import { const ProposalTimeline = () => { return ( - - +
+ Status - - +
- - +
@@ -49,9 +28,9 @@ const ProposalTimeline = () => { - - - +
+
+
) } diff --git a/src/views/yield-dtf/governance/views/proposal-detail/index.tsx b/src/views/yield-dtf/governance/views/proposal-detail/index.tsx index be884bc9f..9cff4b459 100644 --- a/src/views/yield-dtf/governance/views/proposal-detail/index.tsx +++ b/src/views/yield-dtf/governance/views/proposal-detail/index.tsx @@ -1,4 +1,3 @@ -import { Box, Grid } from 'theme-ui' import ProposalTimeline from './components/proposal-timeline/index' import ProposalDetailContent from './components/ProposalDetailContent' import ProposalDetailStats from './components/ProposalDetailStats' @@ -8,52 +7,23 @@ import ProposalDetailAtomUpdater from './ProposalDetailAtomUpdater' import ProposalVote from './components/ProposalVote' const GovernanceProposalDetail = () => ( - +
- +
- +
- - - +
+
+
- +
- - - +
+
+
) export default GovernanceProposalDetail diff --git a/src/views/yield-dtf/governance/views/proposal-detail/useProposalDetail.ts b/src/views/yield-dtf/governance/views/proposal-detail/useProposalDetail.ts index 09eb3bb38..835fee232 100644 --- a/src/views/yield-dtf/governance/views/proposal-detail/useProposalDetail.ts +++ b/src/views/yield-dtf/governance/views/proposal-detail/useProposalDetail.ts @@ -1,5 +1,5 @@ import { gql } from 'graphql-request' -import useQuery from 'hooks/useQuery' +import useQuery from 'hooks/use-query' import { useMemo } from 'react' import { formatEther } from 'viem' import { ProposalDetail } from './atom' diff --git a/src/views/yield-dtf/governance/views/proposal/components/ConfirmProposal.tsx b/src/views/yield-dtf/governance/views/proposal/components/ConfirmProposal.tsx index f0ab6f950..384f6dc12 100644 --- a/src/views/yield-dtf/governance/views/proposal/components/ConfirmProposal.tsx +++ b/src/views/yield-dtf/governance/views/proposal/components/ConfirmProposal.tsx @@ -1,4 +1,3 @@ -import { Container, Grid } from 'theme-ui' import useProposalTx from '../hooks/useProposalTx' import ConfirmProposalForm from './ConfirmProposalForm' import ConfirmProposalOverview from './ConfirmProposalOverview' @@ -13,23 +12,27 @@ const ConfirmProposal = () => { } return ( - - - - - - - + +
+ +
+ + +
+
+ ) } diff --git a/src/views/yield-dtf/governance/views/proposal/components/ConfirmProposalForm.tsx b/src/views/yield-dtf/governance/views/proposal/components/ConfirmProposalForm.tsx index 77ca75720..0c1967a76 100644 --- a/src/views/yield-dtf/governance/views/proposal/components/ConfirmProposalForm.tsx +++ b/src/views/yield-dtf/governance/views/proposal/components/ConfirmProposalForm.tsx @@ -4,7 +4,7 @@ import Field from 'components/field' import useRToken from 'hooks/useRToken' import { useSetAtom } from 'jotai' import { lazy, Suspense, useEffect, useMemo, useState } from 'react' -import { Box, Card, Text } from 'theme-ui' +import { Card } from '@/components/ui/card' import { LISTED_RTOKEN_ADDRESSES } from 'utils/constants' import ProposalDetail from '@/views/yield-dtf/governance/components/ProposalDetailPreview' import { proposalDescriptionAtom } from '../atoms' @@ -44,49 +44,36 @@ const ConfirmProposalForm = ({ }, [title, description, rfc, showRFC, setProposalDescription]) return ( - - - +
+ + setTitle(e.target.value)} autoFocus placeholder={t`Input proposal title`} /> {showRFC && ( - + setRFC(e.target.value)} placeholder={t`Input RFC link`} /> )} - + Description - + }> - +
) } diff --git a/src/views/yield-dtf/governance/views/proposal/components/ConfirmProposalOverview.tsx b/src/views/yield-dtf/governance/views/proposal/components/ConfirmProposalOverview.tsx index 9af1270b3..eb4b16988 100644 --- a/src/views/yield-dtf/governance/views/proposal/components/ConfirmProposalOverview.tsx +++ b/src/views/yield-dtf/governance/views/proposal/components/ConfirmProposalOverview.tsx @@ -1,8 +1,9 @@ import { Trans, t } from '@lingui/macro' -import { SmallButton } from '@/components/old/button' -import CopyValue from '@/components/old/button/CopyValue' -import GoTo from '@/components/old/button/GoTo' -import TransactionButton from '@/components/old/button/TransactionButton' +import { Button } from '@/components/ui/button' +import CopyValue from '@/components/ui/copy-value' +import GoTo from '@/components/ui/go-to' +import TransactionButton from '@/components/ui/transaction-button' +import Spinner from '@/components/ui/spinner' import ConfirmProposalActionIcon from 'components/icons/ConfirmProposalActionIcon' import useContractWrite from 'hooks/useContractWrite' import useWatchTransaction from 'hooks/useWatchTransaction' @@ -10,16 +11,17 @@ import { useAtomValue, useSetAtom } from 'jotai' import { useEffect } from 'react' import { useNavigate } from 'react-router-dom' import { chainIdAtom } from 'state/atoms' -import { Box, BoxProps, Flex, Spinner, Text } from 'theme-ui' import { getTokenRoute, shortenString } from 'utils' import { ExplorerDataType, getExplorerLink } from 'utils/getExplorerLink' import { isProposalEditingAtom } from '../atoms' import useRToken from 'hooks/useRToken' import { ROUTES } from 'utils/constants' import { UseSimulateContractParameters } from 'wagmi' +import { cn } from '@/lib/utils' -interface Props extends BoxProps { +interface Props { tx: UseSimulateContractParameters + className?: string } const ProposalStatus = ({ @@ -50,16 +52,16 @@ const ProposalStatus = ({ if (isLoading) { return ( <> - - + + Pending, sign in wallet - - + +

Please sign the transaction in your wallet to continue with the governance process. - +

) } @@ -67,27 +69,23 @@ const ProposalStatus = ({ if (hash) { return ( <> - - + + Transaction submitted - - + +

- Stay patient while the transaction is in progress & don’t close this + Stay patient while the transaction is in progress & don't close this window to avoid issues finding your way back here. - - - {shortenString(hash)} - +

+
+ {shortenString(hash)} + - +
) } @@ -95,8 +93,7 @@ const ProposalStatus = ({ return ( { +const ConfirmProposalOverview = ({ tx, className }: Props) => { const setProposalEditing = useSetAtom(isProposalEditingAtom) return ( - - - - +
+
+ - + Confirm & Submit - - + +

Submit the proposal to be voted on by [stRSR] holders. Note this is an on-chain action and will require gas to propose. - +

- - - +
+
+ ) } diff --git a/src/views/yield-dtf/governance/views/proposal/components/ContractUpgrades.tsx b/src/views/yield-dtf/governance/views/proposal/components/ContractUpgrades.tsx index c5cf7ddce..12c135459 100644 --- a/src/views/yield-dtf/governance/views/proposal/components/ContractUpgrades.tsx +++ b/src/views/yield-dtf/governance/views/proposal/components/ContractUpgrades.tsx @@ -1,19 +1,22 @@ import { Trans } from '@lingui/macro' -import { Button, Input } from 'components' +import { Button } from '@/components/ui/button' +import { Input } from 'components' import { useAtom, useAtomValue } from 'jotai' import { useState } from 'react' import Skeleton from 'react-loading-skeleton' import { rTokenContractsAtom } from 'state/atoms' import { ContractKey } from 'state/rtoken/atoms/rTokenContractsAtom' -import { Box, BoxProps, Card, Divider, Text } from 'theme-ui' +import { Card } from '@/components/ui/card' +import { Separator } from '@/components/ui/separator' import { capitalize } from 'utils/constants' import { contractUpgradesAtom } from '../atoms' import { isAddress } from 'utils' import { Address } from 'viem' -interface IUpgradeContract extends BoxProps { +interface IUpgradeContract { contract: string version: string + className?: string } const EditContract = ({ @@ -29,29 +32,28 @@ const EditContract = ({ const formattedAddress = isAddress(newContract) return ( - +
setContract(e.target.value)} /> - - +
) } -const UpgradeContract = ({ contract, version, ...props }: IUpgradeContract) => { +const UpgradeContract = ({ contract, version, className }: IUpgradeContract) => { const [upgrade, setUpgrade] = useState(false) const [upgrades, setUpgrades] = useAtom(contractUpgradesAtom) const currentUpgrade = upgrades[contract] ?? '' @@ -69,39 +71,38 @@ const UpgradeContract = ({ contract, version, ...props }: IUpgradeContract) => { } return ( - - - +
+
+ {capitalize(contract)} - - + + (v{version}) - - + +
{!upgrade && ( <> - {currentUpgrade} - + {currentUpgrade} +
{currentUpgrade && ( )} - +
)} {upgrade && ( @@ -111,37 +112,37 @@ const UpgradeContract = ({ contract, version, ...props }: IUpgradeContract) => { onDiscard={() => setUpgrade(false)} /> )} -
+
) } -const ContractUpgrades = (props: BoxProps) => { +const ContractUpgrades = ({ className }: { className?: string }) => { const contracts = useAtomValue(rTokenContractsAtom) const contractKeys = Object.keys(contracts || {}) return ( - - + + Upgrade contracts - - + + {!contractKeys.length && } {!!contracts && contractKeys.map((contractKey) => ( ))} - - + +

Upgrade contract implementations to a newer version. This is usually performed for a protocol update or bugfix. - +

) } diff --git a/src/views/yield-dtf/governance/views/proposal/components/ContractUpgradesPreview.tsx b/src/views/yield-dtf/governance/views/proposal/components/ContractUpgradesPreview.tsx index e3fca679a..cc3e7b86a 100644 --- a/src/views/yield-dtf/governance/views/proposal/components/ContractUpgradesPreview.tsx +++ b/src/views/yield-dtf/governance/views/proposal/components/ContractUpgradesPreview.tsx @@ -1,13 +1,17 @@ import { t } from '@lingui/macro' -import { Button } from 'components' +import { Button } from '@/components/ui/button' import { useAtom } from 'jotai' -import { Box, BoxProps, Text } from 'theme-ui' +import { cn } from '@/lib/utils' import { shortenAddress } from 'utils' import { capitalize } from 'utils/constants' import { contractUpgradesAtom } from '../atoms' import PreviewBox from './PreviewBox' -const ContractUpgradesPreview = (props: BoxProps) => { +interface Props { + className?: string +} + +const ContractUpgradesPreview = ({ className }: Props) => { const [upgrades, setUpgrades] = useAtom(contractUpgradesAtom) const contracts = Object.keys(upgrades) @@ -25,26 +29,25 @@ const ContractUpgradesPreview = (props: BoxProps) => { return ( {contracts.map((contract) => ( - - - {capitalize(contract)} - {shortenAddress(upgrades[contract])} - +
+
+ {capitalize(contract)} + {shortenAddress(upgrades[contract])} +
- +
))}
) diff --git a/src/views/yield-dtf/governance/views/proposal/components/Intro.tsx b/src/views/yield-dtf/governance/views/proposal/components/Intro.tsx index 06442be8c..5031cffa9 100644 --- a/src/views/yield-dtf/governance/views/proposal/components/Intro.tsx +++ b/src/views/yield-dtf/governance/views/proposal/components/Intro.tsx @@ -1,42 +1,49 @@ import { Trans } from '@lingui/macro' -import { SmallButton } from '@/components/old/button' -import { Text, BoxProps, Card, Flex } from 'theme-ui' +import { Button } from '@/components/ui/button' +import { Card } from '@/components/ui/card' import ProposalIntroIcon from 'components/icons/ProposalIntroIcon' import useRToken from 'hooks/useRToken' import { PROTOCOL_DOCS } from '@/utils/constants' +import { cn } from '@/lib/utils' -const Intro = (props: BoxProps) => { +interface Props { + className?: string +} + +const Intro = ({ className }: Props) => { const rToken = useRToken() return ( - + - + Propose changes to ${rToken?.symbol} - - + +

Make proposed changes to the backing basket, emergency collateral, governance params, etc. Changes in multiple areas can be batched into a single proposal although to make voting on issues simpler it may make sense to separate things if unrelated. - - - +

+ +
) } diff --git a/src/views/yield-dtf/governance/views/proposal/components/ItemPreview.tsx b/src/views/yield-dtf/governance/views/proposal/components/ItemPreview.tsx index 1c77209ab..2653e6d07 100644 --- a/src/views/yield-dtf/governance/views/proposal/components/ItemPreview.tsx +++ b/src/views/yield-dtf/governance/views/proposal/components/ItemPreview.tsx @@ -1,28 +1,30 @@ import { t, Trans } from '@lingui/macro' -import { SmallButton } from '@/components/old/button' +import { Button } from '@/components/ui/button' import { ArrowRight, Plus, Square, X } from 'lucide-react' import { useFormContext } from 'react-hook-form' -import { Box, BoxProps, Text } from 'theme-ui' import { ParameterChange } from '../hooks/useParametersChanges' import { isAddress, shortenAddress } from 'utils' -interface ParameterPreviewProps extends BoxProps { +interface ParameterPreviewProps { values: ParameterChange + className?: string } -interface ParameterChangePreview extends BoxProps { +interface ParameterChangePreview { title: string subtitle: string current: string proposed: string onRevert?(): void + className?: string } -interface ListChangePreviewProps extends BoxProps { +interface ListChangePreviewProps { isNew: boolean subtitle?: string value: string onRevert(): void + className?: string } export const ListChangePreview = ({ @@ -30,24 +32,24 @@ export const ListChangePreview = ({ value, subtitle = '', onRevert, - ...props + className, }: ListChangePreviewProps) => ( - +
{isNew ? ( ) : ( )} - - +
+ {isNew ? Add : Remove} {subtitle} - - {value} - - + + {value} +
+ +
) export const ParameterChangePreview = ({ @@ -56,57 +58,51 @@ export const ParameterChangePreview = ({ current, proposed, onRevert, - ...props + className, }: ParameterChangePreview) => ( - - - - - {title} - - {subtitle} - +
+
+
+ {title} + {subtitle} +
{!!onRevert && ( - + )} - - +
+
- - +
+ Current - - {isAddress(current) ? shortenAddress(current) : current} - + + {isAddress(current) ? shortenAddress(current) : current} +
- +
- - +
+ Proposed - - + + {isAddress(proposed) ? shortenAddress(proposed) : proposed} - - - - - + +
+
+
+
) export const ParameterPreview = ({ values, - ...props + className, }: ParameterPreviewProps) => { const { resetField } = useFormContext() const { field, current, proposed } = values @@ -122,7 +118,7 @@ export const ParameterPreview = ({ current={current} proposed={proposed} onRevert={handleRevert} - {...props} + className={className} /> ) } diff --git a/src/views/yield-dtf/governance/views/proposal/components/ListItemPreview.tsx b/src/views/yield-dtf/governance/views/proposal/components/ListItemPreview.tsx index 138534736..13c3f9443 100644 --- a/src/views/yield-dtf/governance/views/proposal/components/ListItemPreview.tsx +++ b/src/views/yield-dtf/governance/views/proposal/components/ListItemPreview.tsx @@ -1,33 +1,34 @@ import { Trans } from '@lingui/macro' -import { SmallButton } from '@/components/old/button' +import { Button } from '@/components/ui/button' import { Plus, X } from 'lucide-react' -import { Box, BoxProps, Text } from 'theme-ui' +import { cn } from '@/lib/utils' -interface Props extends BoxProps { +interface Props { isNew: boolean label: string onRevert?(): void + className?: string } -const ListItemPreview = ({ isNew, label, onRevert, ...props }: Props) => ( - +const ListItemPreview = ({ isNew, label, onRevert, className }: Props) => ( +
{isNew ? ( ) : ( )} - - +
+ {isNew ? Add : Remove} - - {label} - + + {label} +
{!!onRevert && ( - + )} -
+
) export default ListItemPreview diff --git a/src/views/yield-dtf/governance/views/proposal/components/PreviewBox.tsx b/src/views/yield-dtf/governance/views/proposal/components/PreviewBox.tsx index b616f8b0a..67dd33230 100644 --- a/src/views/yield-dtf/governance/views/proposal/components/PreviewBox.tsx +++ b/src/views/yield-dtf/governance/views/proposal/components/PreviewBox.tsx @@ -1,12 +1,14 @@ import { Trans } from '@lingui/macro' import { useState } from 'react' import { ChevronDown, ChevronUp } from 'lucide-react' -import { Box, BoxProps, Text } from 'theme-ui' +import { cn } from '@/lib/utils' -interface Props extends BoxProps { +interface Props { count: number // number of changes title: string collapsed?: boolean + children?: React.ReactNode + className?: string } const PreviewBox = ({ @@ -14,40 +16,34 @@ const PreviewBox = ({ title, children, collapsed = true, - ...props + className, }: Props) => { const [visible, setVisible] = useState(!collapsed) return ( - - +
setVisible(!visible)} - sx={{ - borderBottom: visible ? '1px solid' : 'none', - borderColor: 'border', - cursor: 'pointer', - }} - pb={visible ? 3 : 0} > - - - - {count} - - +
+
+ {count} + Change in: - - - - {title} - - + +
+ {title} +
+
{visible ? : } - - +
+
{visible && children} -
+ ) } diff --git a/src/views/yield-dtf/governance/views/proposal/components/Proposal.tsx b/src/views/yield-dtf/governance/views/proposal/components/Proposal.tsx index e01d1ea82..e29903072 100644 --- a/src/views/yield-dtf/governance/views/proposal/components/Proposal.tsx +++ b/src/views/yield-dtf/governance/views/proposal/components/Proposal.tsx @@ -1,22 +1,11 @@ -import { Grid } from 'theme-ui' import ProposalForm from './ProposalForm' import ProposalOverview from './ProposalOverview' const Proposal = () => ( - +
- +
) export default Proposal diff --git a/src/views/yield-dtf/governance/views/proposal/components/ProposalBasketSetup.tsx b/src/views/yield-dtf/governance/views/proposal/components/ProposalBasketSetup.tsx index 52cec0595..4404db2e7 100644 --- a/src/views/yield-dtf/governance/views/proposal/components/ProposalBasketSetup.tsx +++ b/src/views/yield-dtf/governance/views/proposal/components/ProposalBasketSetup.tsx @@ -1,49 +1,29 @@ import { Trans } from '@lingui/macro' -import { SmallButton } from '@/components/old/button' +import { Button } from '@/components/ui/button' import OverviewIcon from 'components/icons/OverviewIcon' import BackupBasket from 'components/rtoken-setup/basket/BackupBasket' import CollateralModal from 'components/rtoken-setup/basket/CollateralModal' import PrimaryBasket from 'components/rtoken-setup/basket/PrimaryBasket' -import SectionWrapper from 'components/section-navigation/SectionWrapper' +import SectionWrapper from '@/components/section-navigation/section-wrapper' import { useAtom, useAtomValue } from 'jotai' import { useState } from 'react' -import { Box, BoxProps, Card, Text } from 'theme-ui' +import { Card } from '@/components/ui/card' import { isNewBackupProposedAtom, isNewBasketProposedAtom } from '../atoms' import { rTokenAtom, rTokenConfigurationAtom } from 'state/atoms' +import { cn } from '@/lib/utils' -const Overlay = ({ children, ...props }: BoxProps) => ( - - - +interface OverlayProps { + children: React.ReactNode + className?: string +} + +const Overlay = ({ children, className }: OverlayProps) => ( +
+
+
{children} - - +
+
) const PrimaryBasketWarning = ({ onPropose }: { onPropose(): void }) => { @@ -55,12 +35,17 @@ const PrimaryBasketWarning = ({ onPropose }: { onPropose(): void }) => { : false return ( - +
- + Change primary basket - - + +

{warning ? ( The token supply is not enough for changing the primary basket @@ -71,35 +56,36 @@ const PrimaryBasketWarning = ({ onPropose }: { onPropose(): void }) => { Propose how the basket should be distributed going forward.{' '} )} - - + +

) } const BackupBasketWarning = ({ onPropose }: { onPropose(): void }) => ( - +
- + Change backup basket - - + +

Backup configuration tracks primary basket changes to update its values. This may not be desired on a proposal, you can choose to propose new changes. - - +

+ +
) const ProposalBasketSetup = ({ startIndex }: { startIndex: number }) => { @@ -117,7 +103,7 @@ const ProposalBasketSetup = ({ startIndex }: { startIndex: number }) => { return ( <> - + {!isNewBasketProposed && ( @@ -129,7 +115,7 @@ const ProposalBasketSetup = ({ startIndex }: { startIndex: number }) => { - + {!isNewBackupProposed && ( diff --git a/src/views/yield-dtf/governance/views/proposal/components/ProposalForm.tsx b/src/views/yield-dtf/governance/views/proposal/components/ProposalForm.tsx index db69cf1cc..f70bdb411 100644 --- a/src/views/yield-dtf/governance/views/proposal/components/ProposalForm.tsx +++ b/src/views/yield-dtf/governance/views/proposal/components/ProposalForm.tsx @@ -1,6 +1,5 @@ import RevenueSplit from 'components/rtoken-setup/token/RevenueSplit' -import SectionWrapper from 'components/section-navigation/SectionWrapper' -import { Box } from 'theme-ui' +import SectionWrapper from '@/components/section-navigation/section-wrapper' import BackingManager from '@/views/yield-dtf/deploy/components/BackingManager' import OtherSetup from '@/views/yield-dtf/deploy/components/OtherSetup' import Intro from './Intro' @@ -28,19 +27,19 @@ const sections = [ ] const ProposalForm = () => ( - +
{sections.map((Component, index) => ( ))} - +
) export default ProposalForm diff --git a/src/views/yield-dtf/governance/views/proposal/components/ProposalNavigation.tsx b/src/views/yield-dtf/governance/views/proposal/components/ProposalNavigation.tsx index 43ca827fe..093a8bc60 100644 --- a/src/views/yield-dtf/governance/views/proposal/components/ProposalNavigation.tsx +++ b/src/views/yield-dtf/governance/views/proposal/components/ProposalNavigation.tsx @@ -1,10 +1,9 @@ import { t, Trans } from '@lingui/macro' -import { SmallButton } from '@/components/old/button' -import Navigation from 'components/section-navigation/Navigation' +import { Button } from '@/components/ui/button' +import Navigation from '@/components/section-navigation/section-navigation' import useRToken from 'hooks/useRToken' import { useMemo } from 'react' import { useNavigate } from 'react-router-dom' -import { Box } from 'theme-ui' import { ROUTES } from 'utils/constants' const ProposalNavigation = () => { @@ -33,14 +32,14 @@ const ProposalNavigation = () => { } return ( - - - +
+
+ +
- +
) } diff --git a/src/views/yield-dtf/governance/views/proposal/components/ProposalOverview.tsx b/src/views/yield-dtf/governance/views/proposal/components/ProposalOverview.tsx index 07f195b7e..03b8c8e18 100644 --- a/src/views/yield-dtf/governance/views/proposal/components/ProposalOverview.tsx +++ b/src/views/yield-dtf/governance/views/proposal/components/ProposalOverview.tsx @@ -1,11 +1,16 @@ import { Trans } from '@lingui/macro' import { useAtomValue, useSetAtom } from 'jotai' -import { Box, BoxProps, Button, Flex, Text } from 'theme-ui' +import { Button } from '@/components/ui/button' import { isProposalEditingAtom, isProposalValidAtom } from '../atoms' import CreateProposalActionIcon from 'components/icons/CreateProposalActionIcon' import ProposalPreview from './ProposalPreview' +import { cn } from '@/lib/utils' -const ProposalOverview = (props: BoxProps) => { +interface Props { + className?: string +} + +const ProposalOverview = ({ className }: Props) => { const isValid = useAtomValue(isProposalValidAtom) const setProposalEditing = useSetAtom(isProposalEditingAtom) @@ -15,49 +20,28 @@ const ProposalOverview = (props: BoxProps) => { } return ( - - - +
+
+
- + Confirm changes made - - + +

Preview of function calls & adding of a proposal description is added in the next step. - +

- - - - +
+ +
+
) } diff --git a/src/views/yield-dtf/governance/views/proposal/components/ProposalPreview.tsx b/src/views/yield-dtf/governance/views/proposal/components/ProposalPreview.tsx index c5b2275c2..08c1078a6 100644 --- a/src/views/yield-dtf/governance/views/proposal/components/ProposalPreview.tsx +++ b/src/views/yield-dtf/governance/views/proposal/components/ProposalPreview.tsx @@ -1,4 +1,4 @@ -import { Box, BoxProps } from 'theme-ui' +import { cn } from '@/lib/utils' import ProposedBackupPreview from './ProposedBackupPreview' import ProposedBasketPreview from './ProposedBasketPreview' import ProposedParametersPreview from './ProposedParametersPreview' @@ -9,18 +9,22 @@ import ProposedRegisterPreview from './ProposedRegisterPreview' import ContractUpgradesPreview from './ContractUpgradesPreview' import SpellUpgradePreview from './SpellUpgradePreview' -const ProposalPreview = (props: BoxProps) => ( - - - - - - - - - - - +interface Props { + className?: string +} + +const ProposalPreview = ({ className }: Props) => ( +
+ + + + + + + + + +
) export default ProposalPreview diff --git a/src/views/yield-dtf/governance/views/proposal/components/ProposedBackupPreview.tsx b/src/views/yield-dtf/governance/views/proposal/components/ProposedBackupPreview.tsx index 1ee824858..b7292c9b2 100644 --- a/src/views/yield-dtf/governance/views/proposal/components/ProposedBackupPreview.tsx +++ b/src/views/yield-dtf/governance/views/proposal/components/ProposedBackupPreview.tsx @@ -1,8 +1,9 @@ import { t, Trans } from '@lingui/macro' -import { SmallButton } from '@/components/old/button' +import { Button } from '@/components/ui/button' +import { Checkbox } from '@/components/ui/checkbox' import { backupCollateralAtom } from 'components/rtoken-setup/atoms' import { useAtom, useAtomValue } from 'jotai' -import { Box, BoxProps, Checkbox, Text } from 'theme-ui' +import { cn } from '@/lib/utils' import { autoRegisterBackupAssetsAtom, backupChangesAtom, @@ -16,7 +17,11 @@ import { ParameterChangePreview } from './ItemPreview' import ListItemPreview from './ListItemPreview' import PreviewBox from './PreviewBox' -const ProposedBackupPreview = (props: BoxProps) => { +interface Props { + className?: string +} + +const ProposedBackupPreview = ({ className }: Props) => { const [isNewBackupProposed, setProposeNewBackup] = useAtom( isNewBackupProposedAtom ) @@ -74,39 +79,44 @@ const ProposedBackupPreview = (props: BoxProps) => { return ( <> - - - +
+
+ New backup configuration - - + +
- +
{!!count && ( {diversityFactor.map((change) => ( { ))} {collateralChanges.map((change) => ( handleRevertCollateral(change)} label={change.collateral.symbol} @@ -127,7 +137,7 @@ const ProposedBackupPreview = (props: BoxProps) => { {priorityChanges.map((change) => ( { +interface Props { + className?: string +} + +const ProposedBasketPreview = ({ className }: Props) => { const [isNewBasketProposed, setProposeNewBasket] = useAtom( isNewBasketProposedAtom ) @@ -23,39 +28,44 @@ const ProposedBasketPreview = (props: BoxProps) => { return ( <> - - - +
+
+ New primary basket - - + +
- +
{!!basketChanges.length && ( {basketChanges.map((change, index) => ( { +interface Props { + className?: string +} + +const ProposedParametersPreview = ({ className }: Props) => { const changes = useAtomValue(parametersChangesAtom) if (!changes.length) { @@ -16,11 +20,10 @@ const ProposedParametersPreview = (props: BoxProps) => { {changes.map((change) => ( - + ))} ) diff --git a/src/views/yield-dtf/governance/views/proposal/components/ProposedRegisterPreview.tsx b/src/views/yield-dtf/governance/views/proposal/components/ProposedRegisterPreview.tsx index 0cc326956..f2037e56a 100644 --- a/src/views/yield-dtf/governance/views/proposal/components/ProposedRegisterPreview.tsx +++ b/src/views/yield-dtf/governance/views/proposal/components/ProposedRegisterPreview.tsx @@ -1,12 +1,16 @@ import { t } from '@lingui/macro' import { useAtom } from 'jotai' -import { BoxProps } from 'theme-ui' +import { cn } from '@/lib/utils' import { shortenAddress } from 'utils' import { registerAssetsProposedAtom } from '../atoms' import { ListChangePreview } from './ItemPreview' import PreviewBox from './PreviewBox' -const ProposedRegisterPreview = (props: BoxProps) => { +interface Props { + className?: string +} + +const ProposedRegisterPreview = ({ className }: Props) => { const [proposedAssetsToRegister, setProposedAssetsToRegister] = useAtom( registerAssetsProposedAtom ) @@ -23,10 +27,9 @@ const ProposedRegisterPreview = (props: BoxProps) => { return ( {proposedAssetsToRegister.map((asset) => ( { onRevert={() => handleRevert(asset)} isNew={true} value={shortenAddress(asset)} - mt={3} + className="mt-4" /> ))} diff --git a/src/views/yield-dtf/governance/views/proposal/components/ProposedRevenueSplitPreview.tsx b/src/views/yield-dtf/governance/views/proposal/components/ProposedRevenueSplitPreview.tsx index 9c8804dc6..843543230 100644 --- a/src/views/yield-dtf/governance/views/proposal/components/ProposedRevenueSplitPreview.tsx +++ b/src/views/yield-dtf/governance/views/proposal/components/ProposedRevenueSplitPreview.tsx @@ -1,12 +1,12 @@ import { t, Trans } from '@lingui/macro' -import { SmallButton } from '@/components/old/button' +import { Button } from '@/components/ui/button' import { ExternalAddressSplit, revenueSplitAtom, } from 'components/rtoken-setup/atoms' import { useAtom, useAtomValue } from 'jotai' import { Plus, X } from 'lucide-react' -import { Box, BoxProps, Text } from 'theme-ui' +import { cn } from '@/lib/utils' import { shortenAddress } from 'utils' import { revenueSplitChangesAtom } from '../atoms' import { @@ -28,7 +28,11 @@ const getDistributionSubtitle = (change: DistributionChange) => { return change.key[0].toUpperCase() + change.key.substring(1) } -const ProposedRevenueSplitPreview = (props: BoxProps) => { +interface Props { + className?: string +} + +const ProposedRevenueSplitPreview = ({ className }: Props) => { const { distributions, externals, count } = useAtomValue( revenueSplitChangesAtom ) @@ -99,14 +103,13 @@ const ProposedRevenueSplitPreview = (props: BoxProps) => { return ( {distributions.map((change) => ( { /> ))} {externals.map((change) => ( - +
{change.isNew ? ( ) : ( )} - - +
+ {change.isNew ? Add : Remove} - - {shortenAddress(change.split.address)} - - + {shortenAddress(change.split.address)} +
+ +
))}
) diff --git a/src/views/yield-dtf/governance/views/proposal/components/ProposedRolesPreview.tsx b/src/views/yield-dtf/governance/views/proposal/components/ProposedRolesPreview.tsx index fc1306fbb..27f25cbb1 100644 --- a/src/views/yield-dtf/governance/views/proposal/components/ProposedRolesPreview.tsx +++ b/src/views/yield-dtf/governance/views/proposal/components/ProposedRolesPreview.tsx @@ -1,13 +1,17 @@ import { t } from '@lingui/macro' import { useAtom, useAtomValue } from 'jotai' -import { BoxProps } from 'theme-ui' +import { cn } from '@/lib/utils' import { shortenAddress } from 'utils' import { proposedRolesAtom, roleChangesAtom } from '../atoms' import { RoleChange } from '../hooks/useRoleChanges' import { ListChangePreview } from './ItemPreview' import PreviewBox from './PreviewBox' -const ProposedRolesPreview = (props: BoxProps) => { +interface Props { + className?: string +} + +const ProposedRolesPreview = ({ className }: Props) => { const changes = useAtomValue(roleChangesAtom) const [proposedRoles, setProposedRoles] = useAtom(proposedRolesAtom) @@ -36,10 +40,9 @@ const ProposedRolesPreview = (props: BoxProps) => { return ( {changes.map((change) => ( { onRevert={() => handleRevert(change)} isNew={change.isNew} value={shortenAddress(change.address)} - mt={3} + className="mt-4" /> ))} diff --git a/src/views/yield-dtf/governance/views/proposal/components/ProposedUnregisterPreview.tsx b/src/views/yield-dtf/governance/views/proposal/components/ProposedUnregisterPreview.tsx index 30b03cae7..3e081cab5 100644 --- a/src/views/yield-dtf/governance/views/proposal/components/ProposedUnregisterPreview.tsx +++ b/src/views/yield-dtf/governance/views/proposal/components/ProposedUnregisterPreview.tsx @@ -1,12 +1,16 @@ import { t } from '@lingui/macro' import { useAtom } from 'jotai' -import { BoxProps } from 'theme-ui' +import { cn } from '@/lib/utils' import { shortenAddress } from 'utils' import { unregisterAssetsAtom } from '../atoms' import { ListChangePreview } from './ItemPreview' import PreviewBox from './PreviewBox' -const ProposedUnregisterPreview = (props: BoxProps) => { +interface Props { + className?: string +} + +const ProposedUnregisterPreview = ({ className }: Props) => { const [assetsToUnregister, setAssetsToUnregister] = useAtom(unregisterAssetsAtom) @@ -20,10 +24,9 @@ const ProposedUnregisterPreview = (props: BoxProps) => { return ( {assetsToUnregister.map((asset) => ( { onRevert={() => handleRevert(asset)} isNew={false} value={shortenAddress(asset)} - mt={3} + className="mt-4" /> ))} diff --git a/src/views/yield-dtf/governance/views/proposal/components/RegisterEdit.tsx b/src/views/yield-dtf/governance/views/proposal/components/RegisterEdit.tsx index 750140b8a..76bb58d99 100644 --- a/src/views/yield-dtf/governance/views/proposal/components/RegisterEdit.tsx +++ b/src/views/yield-dtf/governance/views/proposal/components/RegisterEdit.tsx @@ -1,10 +1,7 @@ import { Trans } from '@lingui/macro' import { Input } from 'components' -import { SmallButton } from '@/components/old/button' -import { useAtomValue } from 'jotai' +import { Button } from '@/components/ui/button' import { useState } from 'react' -import { rTokenAssetsAtom } from 'state/atoms' -import { Box, BoxProps, Text } from 'theme-ui' import { isAddress } from 'utils' const NewAssetAddress = ({ @@ -22,45 +19,41 @@ const NewAssetAddress = ({ addresses.findIndex((a) => a.toLowerCase() === address.toLowerCase()) !== -1 return ( - +
setAddress(e.target.value)} /> {((address && !isValid) || isExisting) && ( - + {isExisting ? ( This asset is already (being) registered ) : ( Invalid asset )} - + )} - { setAddress('') onSave(address) }} - ml={3} + className="ml-6" > Save - - + +
) } -interface RoleEditProps extends Omit { +interface RoleEditProps { onChange(address: string): void addresses: string[] + className?: string } const RegisterEdit = ({ onChange, addresses }: RoleEditProps) => { diff --git a/src/views/yield-dtf/governance/views/proposal/components/RegisterProposal.tsx b/src/views/yield-dtf/governance/views/proposal/components/RegisterProposal.tsx index 43c3a94e7..62e998ced 100644 --- a/src/views/yield-dtf/governance/views/proposal/components/RegisterProposal.tsx +++ b/src/views/yield-dtf/governance/views/proposal/components/RegisterProposal.tsx @@ -1,11 +1,16 @@ import { Trans } from '@lingui/macro' import { useAtom, useAtomValue } from 'jotai' import { rTokenAssetsAtom } from 'state/atoms' -import { BoxProps, Card, Divider, Text } from 'theme-ui' +import { Card } from '@/components/ui/card' +import { Separator } from '@/components/ui/separator' import { registerAssetsProposedAtom } from '../atoms' import RegisterEdit from './RegisterEdit' -const RegisterProposal = (props: BoxProps) => { +interface RegisterProposalProps { + className?: string +} + +const RegisterProposal = ({ className }: RegisterProposalProps) => { const [proposedAssetsToRegister, setProposedAssetsToRegister] = useAtom( registerAssetsProposedAtom ) @@ -21,25 +26,25 @@ const RegisterProposal = (props: BoxProps) => { } return ( - - + + Register Assets - - + + - + - +

Registration of an asset plugin enables the RToken to price an underlying ERC20 token. Where an asset plugin for the underlying token already exists, the existing asset plugin is replaced with the new one. - +

) } diff --git a/src/views/yield-dtf/governance/views/proposal/components/RolesProposal.tsx b/src/views/yield-dtf/governance/views/proposal/components/RolesProposal.tsx index 30791fd3d..f01165c65 100644 --- a/src/views/yield-dtf/governance/views/proposal/components/RolesProposal.tsx +++ b/src/views/yield-dtf/governance/views/proposal/components/RolesProposal.tsx @@ -3,7 +3,8 @@ import RolesEdit from 'components/rtoken-setup/components/RolesEdit' import { useAtom, useAtomValue } from 'jotai' import { useEffect } from 'react' import { rTokenGovernanceAtom, rTokenManagersAtom } from 'state/atoms' -import { Box, BoxProps, Card, Divider, Text } from 'theme-ui' +import { Card } from '@/components/ui/card' +import { Separator } from '@/components/ui/separator' import { RoleKey } from 'types' import { proposedRolesAtom } from '../atoms' @@ -18,7 +19,11 @@ const roleMap: { { roleKey: 'guardians', title: 'Guardians' }, ] -const RolesProposal = (props: BoxProps) => { +interface RolesProposalProps { + className?: string +} + +const RolesProposal = ({ className }: RolesProposalProps) => { const rTokenRoles = useAtomValue(rTokenManagersAtom) const { guardians = [] } = useAtomValue(rTokenGovernanceAtom) const [roles, setProposedRoles] = useAtom(proposedRolesAtom) @@ -32,20 +37,20 @@ const RolesProposal = (props: BoxProps) => { } return ( - - + + Governance roles - - + + {roleMap.map(({ title, roleKey }, index) => ( - - {!!index && } +
+ {!!index && } handleChange(roleKey, value)} /> - +
))}
) diff --git a/src/views/yield-dtf/governance/views/proposal/components/SimulateProposal.tsx b/src/views/yield-dtf/governance/views/proposal/components/SimulateProposal.tsx index 325f2afc9..22222b325 100644 --- a/src/views/yield-dtf/governance/views/proposal/components/SimulateProposal.tsx +++ b/src/views/yield-dtf/governance/views/proposal/components/SimulateProposal.tsx @@ -1,29 +1,27 @@ import { Trans, t } from '@lingui/macro' -import { LoadingButton } from '@/components/old/button' +import { Button } from '@/components/ui/button' import ExternalArrowIcon from 'components/icons/ExternalArrowIcon' import IssuanceIcon from 'components/icons/IssuanceIcon' import Tenderly from 'components/icons/logos/Tenderly' import { useResetAtom } from 'jotai/utils' import { useEffect } from 'react' -import { Box, BoxProps, Flex, Link, Spinner, Text } from 'theme-ui' +import { Loader2 } from 'lucide-react' import { TenderlySimulation } from 'types' import { TENDERLY_SHARING_URL } from 'utils/constants' import { simulationStateAtom } from '../../proposal-detail/atom' import useProposalSimulation from '../hooks/useProposalSimulation' import { UseSimulateContractParameters } from 'wagmi' +import { cn } from '@/lib/utils' -interface Props extends BoxProps { +interface Props { tx: UseSimulateContractParameters + className?: string } const getButtonStyles = (sim: TenderlySimulation | null) => { - if (!sim) return {} + if (!sim) return '' - return { - color: `var(--theme-ui-colors-${ - sim?.transaction?.status ? 'success' : 'warning' - }) !important`, - } + return sim?.transaction?.status ? 'text-green-500' : 'text-warning' } const ProposalStatus = () => { @@ -40,96 +38,71 @@ const ProposalStatus = () => { if (isLoading) { return ( <> - - + +

Please wait while the simulation executes - +

) } return ( <> - + > + {sim ? simResult : t`Simulate proposal`} + {error && ( - +

Simulation Error. Please try again later. - +

)} {sim && ( - <> - - - View on{' '} - - Tenderly - - - - +
+ + View on{' '} + + Tenderly + + +
)} ) } -const SimulateProposal = ({ tx, ...props }: Props) => { +const SimulateProposal = ({ tx, className }: Props) => { return ( - - +
- +
- + Simulate Proposal - - + +

Simulate your proposal to see the outcome of its execution. A report of its execution will be generated - +


- - Powered by +
+ Powered by - +
-
- - +
+
+
) } diff --git a/src/views/yield-dtf/governance/views/proposal/components/SpellUpgrade.tsx b/src/views/yield-dtf/governance/views/proposal/components/SpellUpgrade.tsx index 443bd4b78..ff2477d94 100644 --- a/src/views/yield-dtf/governance/views/proposal/components/SpellUpgrade.tsx +++ b/src/views/yield-dtf/governance/views/proposal/components/SpellUpgrade.tsx @@ -2,7 +2,8 @@ import { Trans } from '@lingui/macro' import DocsLink from '@/components/utils/docs-link' import { atom, useAtom, useAtomValue, useSetAtom } from 'jotai' import { chainIdAtom } from 'state/atoms' -import { Box, BoxProps, Card, Divider, Label, Radio, Text } from 'theme-ui' +import { Card } from '@/components/ui/card' +import { Separator } from '@/components/ui/separator' import { ChainId } from 'utils/chains' import { ExplorerDataType, getExplorerLink } from 'utils/getExplorerLink' import { proposedRolesAtom, spellUpgradeAtom } from '../atoms' @@ -17,7 +18,7 @@ export const spellAddressAtom = atom((get) => { return SPELL_CONTRACTS[chainId] }) -const SpellUpgrade = (props: BoxProps) => { +const SpellUpgrade = ({ className }: { className?: string }) => { const [spell, setSpell] = useAtom(spellUpgradeAtom) const chainId = useAtomValue(chainIdAtom) const spellContract = useAtomValue(spellAddressAtom) @@ -38,11 +39,11 @@ const SpellUpgrade = (props: BoxProps) => { if (!spellContract) return null return ( - - - + +
+ 3.4.0 Upgrade spells - + { ExplorerDataType.ADDRESS )} /> - - - -
) } diff --git a/src/views/yield-dtf/governance/views/proposal/components/UnregisterProposal.tsx b/src/views/yield-dtf/governance/views/proposal/components/UnregisterProposal.tsx index bc01e924c..e6b7a1e4b 100644 --- a/src/views/yield-dtf/governance/views/proposal/components/UnregisterProposal.tsx +++ b/src/views/yield-dtf/governance/views/proposal/components/UnregisterProposal.tsx @@ -1,13 +1,18 @@ import { Trans } from '@lingui/macro' -import { Box, BoxProps, Card, Divider, Link, Text } from 'theme-ui' import { useAtom, useAtomValue } from 'jotai' import { rTokenAssetsAtom } from 'state/atoms' import { rtokenAllActiveCollateralsAtom } from 'components/rtoken-setup/atoms' +import { Card } from '@/components/ui/card' +import { Separator } from '@/components/ui/separator' import UnregisterEdit from './UnregisterEdit' import { unregisterAssetsAtom } from '../atoms' import useRToken from 'hooks/useRToken' -const UnregisterProposal = (props: BoxProps) => { +interface UnregisterProposalProps { + className?: string +} + +const UnregisterProposal = ({ className }: UnregisterProposalProps) => { const rToken = useRToken() const registeredErc20s = useAtomValue(rTokenAssetsAtom) const [assetsToUnregister, setAssetsToUnregister] = @@ -28,27 +33,28 @@ const UnregisterProposal = (props: BoxProps) => { } return ( - - + + Unregister Assets - - + + - - + + Ensure that the asset(s) you are unregistering do not have pending revenue that can be {' '} - auctioned - + . - + ) } diff --git a/src/views/yield-dtf/governance/views/proposal/components/UpgradeHelper.tsx b/src/views/yield-dtf/governance/views/proposal/components/UpgradeHelper.tsx index bebfd7134..516681cd0 100644 --- a/src/views/yield-dtf/governance/views/proposal/components/UpgradeHelper.tsx +++ b/src/views/yield-dtf/governance/views/proposal/components/UpgradeHelper.tsx @@ -1,14 +1,12 @@ -import { Button } from 'components' -import Sparkles from 'components/icons/Sparkles' +import { Button } from '@/components/ui/button' import { useSetAtom } from 'jotai' import { useState } from 'react' -import { Box, BoxProps, Link, Text } from 'theme-ui' import { isAssistedUpgradeAtom } from '../atoms' import { useNavigate } from 'react-router-dom' import useRToken from 'hooks/useRToken' import { ROUTES } from 'utils/constants' -const UpgradeHelper = (props: BoxProps) => { +const UpgradeHelper = ({ className }: { className?: string }) => { const navigate = useNavigate() const rToken = useRToken() @@ -24,54 +22,47 @@ const UpgradeHelper = (props: BoxProps) => { } return ( - - - - Upgrade to the 3.0.0 Release{' '} - of the Reserve Protocol - - +
+
+ Upgrade to the 3.0.0 Release{' '} + of the Reserve Protocol +
+

To harness the powerful new upgrades on {rToken?.symbol} (announcement{' '} - - here - + here + ) , consider using the upgrade helper.

For a more in-depth explanation of what this proposal entails, see this{' '} - - video - + video + . - - - -

+
+ - {' '} - +
{' '} + ) } diff --git a/src/views/yield-dtf/governance/views/proposal/components/forms/ProposalGovernanceParams.tsx b/src/views/yield-dtf/governance/views/proposal/components/forms/ProposalGovernanceParams.tsx index 53c8ff64f..cb71dd5cb 100644 --- a/src/views/yield-dtf/governance/views/proposal/components/forms/ProposalGovernanceParams.tsx +++ b/src/views/yield-dtf/governance/views/proposal/components/forms/ProposalGovernanceParams.tsx @@ -1,7 +1,7 @@ import GovernanceParameters from 'components/rtoken-setup/governance/GovernanceParameters' import { useAtomValue } from 'jotai' import { rTokenGovernanceAtom } from 'state/atoms' -import { Box, Card } from 'theme-ui' +import { Card } from '@/components/ui/card' import { isTimeunitGovernance } from '@/views/yield-dtf/governance/utils' const ProposalGovernanceParams = () => { @@ -9,7 +9,7 @@ const ProposalGovernanceParams = () => { const isTimeunit = isTimeunitGovernance(governance.name) return ( - + ) diff --git a/src/views/yield-dtf/governance/views/proposal/index.tsx b/src/views/yield-dtf/governance/views/proposal/index.tsx index 347506905..23d20acec 100644 --- a/src/views/yield-dtf/governance/views/proposal/index.tsx +++ b/src/views/yield-dtf/governance/views/proposal/index.tsx @@ -14,7 +14,6 @@ import { import ConfirmProposal from './components/ConfirmProposal' import Proposal from './components/Proposal' import Updater from './updater' -import { Box } from 'theme-ui' import { keccak256, stringToBytes } from 'viem' const paramsAtom = atom((get) => { @@ -74,12 +73,12 @@ const GovernanceProposal = () => { }, [tokenParameters]) return ( - +
{isEditing && !isAssistedUpgrade ? : } - +
) } diff --git a/src/views/yield-dtf/issuance/components/about/index.tsx b/src/views/yield-dtf/issuance/components/about/index.tsx index 890115d61..5c5668b8a 100644 --- a/src/views/yield-dtf/issuance/components/about/index.tsx +++ b/src/views/yield-dtf/issuance/components/about/index.tsx @@ -1,29 +1,28 @@ import { Trans } from '@lingui/macro' -import { SmallButton } from '@/components/old/button' +import { Button } from '@/components/ui/button' import { useSetAtom } from 'jotai' -import { Box, Flex, Text } from 'theme-ui' import { wrapSidebarAtom } from '@/views/yield-dtf/issuance/atoms' const About = () => { const setWrapping = useSetAtom(wrapSidebarAtom) return ( - - - +
+
+ Regular minting - - + +

Minting requires a deposit of the defined collateral tokens in equal value amounts to the RToken smart contracts. - +

- + Wrapping collateral tokens - - + +

Some collateral tokens from protocols like Aave and Convex differ technically from other collateral tokens. To ensure proper handling, @@ -31,19 +30,20 @@ const About = () => { wrapped, the collateral remains the same but has a new interface for price and appreciation tracking. - - - +

+ +
+
+
) } diff --git a/src/views/yield-dtf/issuance/components/balances/CollateralBalance.tsx b/src/views/yield-dtf/issuance/components/balances/CollateralBalance.tsx index f35277442..19fe2aabd 100644 --- a/src/views/yield-dtf/issuance/components/balances/CollateralBalance.tsx +++ b/src/views/yield-dtf/issuance/components/balances/CollateralBalance.tsx @@ -3,17 +3,18 @@ import TokenBalance from 'components/token-balance' import { useAtomValue } from 'jotai' import { Circle } from 'lucide-react' import { balancesAtom } from 'state/atoms' -import { Box, BoxProps, Flex, Progress, Text } from 'theme-ui' +import { cn } from '@/lib/utils' import { Token } from 'types' import { formatCurrency } from 'utils' import { formatUnits } from 'viem' import { quantitiesAtom } from '@/views/yield-dtf/issuance/atoms' -interface Props extends BoxProps { +interface Props { token: Token + className?: string } -const CollateralBalance = ({ token, ...props }: Props) => { +const CollateralBalance = ({ token, className }: Props) => { const quantities = useAtomValue(quantitiesAtom) const balances = useAtomValue(balancesAtom) @@ -22,7 +23,7 @@ const CollateralBalance = ({ token, ...props }: Props) => { ) } @@ -33,34 +34,35 @@ const CollateralBalance = ({ token, ...props }: Props) => { current && balances[token.address].value >= quantities[token.address] return ( - - +
+
- +
- - - - +
+
+
+ Required: - {' '} - - {formatCurrency(required, 6)} - - - {!isValid && } - + {' '} + {formatCurrency(required, 6)} +
+ {!isValid && ( +
+
+
+ )} +
) } diff --git a/src/views/yield-dtf/issuance/components/balances/index.tsx b/src/views/yield-dtf/issuance/components/balances/index.tsx index 51426082f..6a4ef2faa 100644 --- a/src/views/yield-dtf/issuance/components/balances/index.tsx +++ b/src/views/yield-dtf/issuance/components/balances/index.tsx @@ -1,32 +1,32 @@ import { Trans } from '@lingui/macro' -import { Card } from 'components' import TokenBalance from 'components/token-balance' import TrackAsset from 'components/track-asset' import useRToken from 'hooks/useRToken' import { useAtomValue } from 'jotai' import { rTokenBalanceAtom } from 'state/atoms' -import { Box, Flex, Grid, Spinner, Text } from 'theme-ui' +import { Card } from '@/components/ui/card' +import Spinner from '@/components/ui/spinner' import CollateralBalance from './CollateralBalance' const CollateralBalances = () => { const rToken = useRToken() return ( - - +
+

Available collateral - - +

+
{!rToken?.collaterals && } {rToken?.collaterals.map((collateral) => ( ))} - - +
+
) } @@ -35,19 +35,19 @@ const RTokenBalance = () => { const balance = useAtomValue(rTokenBalanceAtom) return ( - - +
+

RToken in Wallet - - +

+
{!!rToken && } - - +
+
) } @@ -56,18 +56,13 @@ const RTokenBalance = () => { */ const Balances = () => { return ( - - + +
- ({ - borderLeft: ['none', `1px solid ${theme.colors.darkBorder}`], - borderTop: [`1px solid ${theme.colors.darkBorder}`, 'none'], - })} - > +
- - +
+
) } diff --git a/src/views/yield-dtf/issuance/components/issue/CollateralApprovals.tsx b/src/views/yield-dtf/issuance/components/issue/CollateralApprovals.tsx index 739fe9a8f..830599fd7 100644 --- a/src/views/yield-dtf/issuance/components/issue/CollateralApprovals.tsx +++ b/src/views/yield-dtf/issuance/components/issue/CollateralApprovals.tsx @@ -1,6 +1,6 @@ import ERC20 from 'abis/ERC20' import USDT from 'abis/USDT' -import TransactionButton from '@/components/old/button/TransactionButton' +import TransactionButton from '@/components/ui/transaction-button' import OverviewIcon from 'components/icons/OverviewIcon' import TokenItem from 'components/token-item' import useContractWrite from 'hooks/useContractWrite' @@ -8,9 +8,10 @@ import useRToken from 'hooks/useRToken' import useWatchTransaction from 'hooks/useWatchTransaction' import { useAtomValue } from 'jotai' import { useEffect, useMemo, useState } from 'react' -import { CheckCircle, ChevronDown, ChevronUp } from 'lucide-react' +import { CheckCircle, ChevronDown, ChevronUp, Loader2 } from 'lucide-react' import { chainIdAtom } from 'state/atoms' -import { Box, BoxProps, Divider, Flex, Spinner, Text } from 'theme-ui' +import { Separator } from '@/components/ui/separator' +import { cn } from '@/lib/utils' import { Token } from 'types' import { formatCurrency } from 'utils' import { ChainId } from 'utils/chains' @@ -18,11 +19,12 @@ import { BIGINT_MAX } from 'utils/constants' import { Address, formatUnits } from 'viem' import { quantitiesAtom } from '@/views/yield-dtf/issuance/atoms' -interface CollateralApprovalProps extends BoxProps { +interface CollateralApprovalProps { collateral: Token amount?: bigint allowance: boolean loading: boolean + className?: string } const CollateralApproval = ({ @@ -30,7 +32,7 @@ const CollateralApproval = ({ allowance, collateral, loading, - ...props + className, }: CollateralApprovalProps) => { const chainId = useAtomValue(chainIdAtom) const rToken = useRToken() @@ -81,40 +83,40 @@ const CollateralApproval = ({ }, [status]) return ( - - +
+
- +
{!amount ? ( - + ) : ( - + ({formatCurrency(Number(formatUnits(amount, collateral.decimals)), 6)} ) - + )} {!!amount && ( - +
{isLoading && !hash && ( - Sign in wallet + Sign in wallet )} {hash && status !== 'success' && ( - Pending + Pending )} {(status === 'success' || allowance) && ( - Confirmed + Confirmed )} {!hash && !isLoading && !allowance && ( )} - +
)} -
+
) } @@ -131,45 +133,31 @@ const CollateralApprovals = ({ const isFetching = !hasAllowance && !pending.length return ( - - +
setVisible(!isVisible)} > - Collateral approvals - + Collateral approvals +
{hasAllowance && !!quantities && ( )} - {!quantities && } + {!quantities && } {!hasAllowance && pending.length && ( - ({pending.length}) + ({pending.length}) )} - - +
+
{isVisible ? : } - +
{isVisible && ( - - +
+ {rToken?.collaterals.map((collateral) => ( ))} - +
)} -
+
) } diff --git a/src/views/yield-dtf/issuance/components/issue/CollateralDistribution.tsx b/src/views/yield-dtf/issuance/components/issue/CollateralDistribution.tsx index 8a6068c2a..d556f9352 100644 --- a/src/views/yield-dtf/issuance/components/issue/CollateralDistribution.tsx +++ b/src/views/yield-dtf/issuance/components/issue/CollateralDistribution.tsx @@ -1,67 +1,55 @@ import { Trans } from '@lingui/macro' import OverviewIcon from 'components/icons/OverviewIcon' import TokenItem from 'components/token-item' -import { ChevronDown, ChevronUp } from 'lucide-react' +import { ChevronDown, ChevronUp, Loader2 } from 'lucide-react' import { useState } from 'react' -import { Box, BoxProps, Divider, Flex, Spinner, Text } from 'theme-ui' +import { Separator } from '@/components/ui/separator' +import { cn } from '@/lib/utils' import { BigNumberMap, Token } from 'types' import { getAddress } from 'viem' import CollateralValue from './CollateralValue' -interface Props extends BoxProps { +interface Props { collaterals: Token[] quantities: BigNumberMap | null prices?: (number | undefined)[] + className?: string } const CollateralDistribution = ({ collaterals, quantities, prices, - sx = {}, - ...props + className, }: Props) => { const [isVisible, setVisible] = useState(false) return ( - - setVisible(!isVisible)} > - + Collateral distribution - - + +
{isVisible ? : } - +
{isVisible && ( - - +
+ {collaterals.map((collateral, i) => ( - - +
- +
{quantities && quantities[getAddress(collateral.address)] ? ( ) : ( - + )} -
+
))} -
+
)} -
+ ) } diff --git a/src/views/yield-dtf/issuance/components/issue/CollateralValue.tsx b/src/views/yield-dtf/issuance/components/issue/CollateralValue.tsx index 6b05d471e..60a24d4ae 100644 --- a/src/views/yield-dtf/issuance/components/issue/CollateralValue.tsx +++ b/src/views/yield-dtf/issuance/components/issue/CollateralValue.tsx @@ -1,5 +1,4 @@ import { FC, memo } from 'react' -import { Text } from 'theme-ui' import { formatCurrency } from 'utils' import { formatUnits } from 'viem' @@ -15,16 +14,16 @@ const CollateralValue: FC = ({ price, }) => { return ( - + {formatCurrency(Number(formatUnits(quantity, decimals)))} {price !== undefined && ( - + {' '} ($ {formatCurrency(Number(formatUnits(quantity, decimals)) * price, 6)}) - + )} - + ) } diff --git a/src/views/yield-dtf/issuance/components/issue/ConfirmIssuance.tsx b/src/views/yield-dtf/issuance/components/issue/ConfirmIssuance.tsx index f08438b75..a542b88ae 100644 --- a/src/views/yield-dtf/issuance/components/issue/ConfirmIssuance.tsx +++ b/src/views/yield-dtf/issuance/components/issue/ConfirmIssuance.tsx @@ -93,12 +93,12 @@ const ConfirmIssuance = ({ onClose }: { onClose: () => void }) => { return 'Please grant collateral allowance' } - return t`Begin minting ${formatCurrency(Number(amount))} ${rToken?.symbol}` + return t`Begin minting ${formatCurrency(Number(amount))} ${rToken?.symbol ?? ''}` } return ( - +
+
{icon} - - {title} - - - - - - {subtitle} - - - +

{title}

+
+
+
+ {subtitle} +
+ {formatCurrency(available, 0)} - - {rToken?.symbol} - - - - Time until fully charged + + {rToken?.symbol} +
+
+
+ Time until fully charged {timeUntilCharged > 0 ? ( - + {timeUntilCharged < 1 ? '<1' : timeUntilCharged.toFixed(0)} minute {timeUntilCharged >= 1.5 ? 's' : ''} - + ) : ( - Fully Charged + Fully Charged )} - - - 0-100% Recharge time - 1h - - - - Current max charge - - - - +
+
+ 0-100% Recharge time + 1h +
+
+
+ Current max charge + +
+
+ {formatCurrency(max, 0)} - - {rToken?.symbol} - - - - + + {rToken?.symbol} +
+
+
+
) } -const IssuanceInfo = (props: BoxProps) => { +const IssuanceInfo = ({ className }: { className?: string }) => { const rToken = useRToken() const { tokenSupply, @@ -168,7 +138,7 @@ const IssuanceInfo = (props: BoxProps) => { ]) return ( - +
} title={t`Mint - Global throttle`} @@ -177,18 +147,18 @@ const IssuanceInfo = (props: BoxProps) => { max={maxMint} timeUntilCharged={timeUntilFullyChargedMint} tooltipContent={ - + The mint max charge is either{' '} {(issuanceThrottleRate * 100).toFixed(1)}% of {rToken?.symbol}{' '} supply or a lower bound of{' '} - + {formatCurrency(issuanceThrottleAmount, 0)} - {' '} + {' '} {rToken?.symbol}, whichever is the higher amount. - + } /> - + } title={t`Redeem - Global throttle`} @@ -197,20 +167,20 @@ const IssuanceInfo = (props: BoxProps) => { max={maxRedeem} timeUntilCharged={timeUntilFullyChargedRedeem} tooltipContent={ - + The redeem max charge is either{' '} {(redemptionThrottleRate * 100).toFixed(1)}% of {rToken?.symbol}{' '} supply or a lower bound of{' '} - + {formatCurrency(redemptionThrottleAmount, 0)} - {' '} + {' '} {rToken?.symbol}, whichever is the higher amount. If that exceeds the total supply, the limit is set to the total supply of{' '} {rToken?.symbol}. - + } /> - +
) } export default IssuanceInfo diff --git a/src/views/yield-dtf/issuance/components/issue/Issue.tsx b/src/views/yield-dtf/issuance/components/issue/Issue.tsx index 6fcbbda25..3c7e1eadd 100644 --- a/src/views/yield-dtf/issuance/components/issue/Issue.tsx +++ b/src/views/yield-dtf/issuance/components/issue/Issue.tsx @@ -1,6 +1,6 @@ import { t, Trans } from '@lingui/macro' import FacadeRead from 'abis/FacadeRead' -import { Button } from 'components' +import { Button } from '@/components/ui/button' import useRToken from 'hooks/useRToken' import { useAtom, useAtomValue, useSetAtom } from 'jotai' import mixpanel from 'mixpanel-browser/src/loaders/loader-module-core' @@ -12,7 +12,7 @@ import { rTokenStateAtom, walletAtom, } from 'state/atoms' -import { Card } from 'theme-ui' +import { Card } from '@/components/ui/card' import { FACADE_ADDRESS } from 'utils/addresses' import { issueAmountAtom, @@ -92,10 +92,10 @@ const Issue = () => { }} /> )} - + {!!quote && assets && Object.keys(quote).map((quoteNonce, index) => { return ( - - handleSelection(Number(quoteNonce))} > - - + + {basketNonce === Number(quoteNonce) ? 'Current' : 'Previous'}{' '} basket - - - - + + + +
{Object.keys(quote[quoteNonce]).map((erc20) => ( - +
- + {formatCurrency( +formatUnits( quote[quoteNonce][erc20].amount, assets[erc20].token.decimals ) )} - + {!!quote[quoteNonce][erc20].loss && ( - + ({formatCurrency(quote[quoteNonce][erc20].loss)}) - + )} - +
))} -
- +
+ ) })}
diff --git a/src/views/yield-dtf/issuance/components/redeem/RedemptionQuote.tsx b/src/views/yield-dtf/issuance/components/redeem/RedemptionQuote.tsx index fe8a4a9e0..8991b405b 100644 --- a/src/views/yield-dtf/issuance/components/redeem/RedemptionQuote.tsx +++ b/src/views/yield-dtf/issuance/components/redeem/RedemptionQuote.tsx @@ -3,7 +3,6 @@ import useRToken from 'hooks/useRToken' import { atom, useAtomValue, useSetAtom } from 'jotai' import { ChevronRight } from 'lucide-react' import { chainIdAtom, isModuleLegacyAtom, rTokenStateAtom } from 'state/atoms' -import { Box, Text } from 'theme-ui' import { BigNumberMap } from 'types' import CollateralDistribution from '../issue/CollateralDistribution' import { @@ -38,7 +37,7 @@ const CurrentRedemptionQuote = () => { return ( { const setNonceSelection = useSetAtom(customRedeemModalAtom) return ( - setNonceSelection(true)} > - + {basketNonce === selectedNonce ? 'Redeem with current basket' : 'Redeem with previous basket'} - + - + ) } diff --git a/src/views/yield-dtf/issuance/components/redeem/index.tsx b/src/views/yield-dtf/issuance/components/redeem/index.tsx index 0efa0cadb..1c00fffe1 100644 --- a/src/views/yield-dtf/issuance/components/redeem/index.tsx +++ b/src/views/yield-dtf/issuance/components/redeem/index.tsx @@ -1,6 +1,7 @@ import { Trans } from '@lingui/macro' -import { Button, Card } from 'components' +import { Button } from '@/components/ui/button' import useRToken from 'hooks/useRToken' +import { Card } from '@/components/ui/card' import { useAtomValue, useSetAtom } from 'jotai' import { useEffect, useState } from 'react' import { isValidRedeemAmountAtom } from '@/views/yield-dtf/issuance/atoms' @@ -26,12 +27,11 @@ const Redeem = () => { return ( <> {confirming && setConfirming(false)} />} - + - - + +
) } diff --git a/src/views/yield-dtf/issuance/components/wrapping/WrapTypeToggle.tsx b/src/views/yield-dtf/issuance/components/wrapping/WrapTypeToggle.tsx index 76e267568..20614f26d 100644 --- a/src/views/yield-dtf/issuance/components/wrapping/WrapTypeToggle.tsx +++ b/src/views/yield-dtf/issuance/components/wrapping/WrapTypeToggle.tsx @@ -1,53 +1,34 @@ import { Trans } from '@lingui/macro' -import { Box } from 'theme-ui' import { isWrappingAtom } from './atoms' import { useAtom } from 'jotai' +import { cn } from '@/lib/utils' const WrapTypeToggle = () => { const [wrapping, setWrapping] = useAtom(isWrappingAtom) return ( - - setWrapping(true)} > Wrap collaterals - - +
setWrapping(false)} > Unwrap collaterals - - +
+
) } diff --git a/src/views/yield-dtf/issuance/components/zapV2/RTokenZapIssuance.tsx b/src/views/yield-dtf/issuance/components/zapV2/RTokenZapIssuance.tsx index 64d62c14c..e60317b9b 100644 --- a/src/views/yield-dtf/issuance/components/zapV2/RTokenZapIssuance.tsx +++ b/src/views/yield-dtf/issuance/components/zapV2/RTokenZapIssuance.tsx @@ -1,5 +1,5 @@ import { ArrowDown } from 'lucide-react' -import { Box, Divider } from 'theme-ui' +import { Card } from '@/components/ui/card' import ZapOperationDetails from './ZapOperationDetails' import ZapRedeemDisabled from './ZapRedeemDisabled' import ZapTabs from './ZapTabs' @@ -7,59 +7,31 @@ import ZapInputContainer from './input/ZapInputContainer' import ZapOutputContainer from './output/ZapOutputContainer' import ZapSubmit from './submit/ZapSubmit' +const InputOutputSeparator = () => ( +
+
+
+ +
+
+
+) + const RTokenZapIssuance = ({ disableRedeem }: { disableRedeem: boolean }) => { return ( - - + +
- - - +
+
- - - - - - - - - - - + + + - - +
+
) } diff --git a/src/views/yield-dtf/issuance/components/zapV2/ZapError.tsx b/src/views/yield-dtf/issuance/components/zapV2/ZapError.tsx index e1811fc95..9789170b9 100644 --- a/src/views/yield-dtf/issuance/components/zapV2/ZapError.tsx +++ b/src/views/yield-dtf/issuance/components/zapV2/ZapError.tsx @@ -1,5 +1,4 @@ import { ReactNode } from 'react' -import { Box, Text } from 'theme-ui' export type ZapErrorType = { title: string @@ -14,23 +13,15 @@ const ZapError = ({ error }: { error?: ZapErrorType }) => { if (!error) return null return ( - - + {error.title} - - {error.message} - + + {error.message} + ) } diff --git a/src/views/yield-dtf/issuance/components/zapV2/ZapOperationDetails.tsx b/src/views/yield-dtf/issuance/components/zapV2/ZapOperationDetails.tsx index 130f5a9dc..4a7da6cae 100644 --- a/src/views/yield-dtf/issuance/components/zapV2/ZapOperationDetails.tsx +++ b/src/views/yield-dtf/issuance/components/zapV2/ZapOperationDetails.tsx @@ -1,5 +1,5 @@ import GasIcon from 'components/icons/GasIcon' -import { Box, Text } from 'theme-ui' +import { cn } from '@/lib/utils' import { formatCurrency } from 'utils' import { useZap } from './context/ZapContext' import ZapRate from './overview/ZapRate' @@ -18,56 +18,43 @@ const ZapOperationDetails = () => { }, [tokenIn?.price, amountIn, setCollapsed, isExpensiveZap]) return ( - - +
{ e.stopPropagation() setCollapsed((c) => !c) }} - pl={3} - pr="12px" > - +
- +
- + Estimated gas cost:{' '} - + ${gasCost ? formatCurrency(+gasCost, 2) : 0} - - - - + + +
+
{collapsed ? ( ) : ( )} -
- +
- - - + +
+
) } diff --git a/src/views/yield-dtf/issuance/components/zapV2/ZapRedeemDisabled.tsx b/src/views/yield-dtf/issuance/components/zapV2/ZapRedeemDisabled.tsx index f19607bd0..ee1d49182 100644 --- a/src/views/yield-dtf/issuance/components/zapV2/ZapRedeemDisabled.tsx +++ b/src/views/yield-dtf/issuance/components/zapV2/ZapRedeemDisabled.tsx @@ -1,5 +1,4 @@ -import { Button } from 'components' -import { Box, Text } from 'theme-ui' +import { Button } from '@/components/ui/button' import { useZap } from './context/ZapContext' const ZapRedeemDisabled = ({ disableRedeem }: { disableRedeem: boolean }) => { @@ -7,35 +6,17 @@ const ZapRedeemDisabled = ({ disableRedeem }: { disableRedeem: boolean }) => { if (operation !== 'redeem' || !disableRedeem) return null return ( - - +
+ Zap Redeem not available during re-collateralization - + - +
) } diff --git a/src/views/yield-dtf/issuance/components/zapV2/ZapTabs.tsx b/src/views/yield-dtf/issuance/components/zapV2/ZapTabs.tsx index 412d16623..25bfe4f22 100644 --- a/src/views/yield-dtf/issuance/components/zapV2/ZapTabs.tsx +++ b/src/views/yield-dtf/issuance/components/zapV2/ZapTabs.tsx @@ -1,6 +1,5 @@ import TabMenu from 'components/tab-menu' import { Minus, Plus } from 'lucide-react' -import { Box } from 'theme-ui' import { useZap } from './context/ZapContext' import ZapSettings from './settings/ZapSettings' import ZapRefreshButton from './refresh/ZapRefreshButton' @@ -25,10 +24,7 @@ const ZapTabs = () => { }, [chainId]) return ( - +
{ background="border" onMenuChange={setOperation} /> - +
- - +
+
) } diff --git a/src/views/yield-dtf/issuance/components/zapV2/ZapToggle.tsx b/src/views/yield-dtf/issuance/components/zapV2/ZapToggle.tsx index e7c4e643d..3f9138a10 100644 --- a/src/views/yield-dtf/issuance/components/zapV2/ZapToggle.tsx +++ b/src/views/yield-dtf/issuance/components/zapV2/ZapToggle.tsx @@ -1,7 +1,7 @@ import { Trans } from '@lingui/macro' -import Help from 'components/help' +import { Switch } from '@/components/ui/switch' +import { cn } from '@/lib/utils' import { Zap as ZapIcon } from 'lucide-react' -import { Box, Switch, Text } from 'theme-ui' const ZapToggle = ({ zapEnabled, @@ -10,49 +10,22 @@ const ZapToggle = ({ zapEnabled: boolean setZapEnabled: (value: boolean) => void }) => { - const handleToggle = (e: React.ChangeEvent) => { - setZapEnabled(e.target.checked) - } - return ( - - +
- + Turn on Zaps to mint using 1 asset - - - - Beta - - + +
- -
+ + ) } diff --git a/src/views/yield-dtf/issuance/components/zapV2/ZapToggleBottom.tsx b/src/views/yield-dtf/issuance/components/zapV2/ZapToggleBottom.tsx index 39c9ac1cd..4a7e64dc4 100644 --- a/src/views/yield-dtf/issuance/components/zapV2/ZapToggleBottom.tsx +++ b/src/views/yield-dtf/issuance/components/zapV2/ZapToggleBottom.tsx @@ -1,7 +1,6 @@ -import { Button } from 'components' +import { Button } from '@/components/ui/button' import Help from 'components/help' import AsteriskIcon from 'components/icons/AsteriskIcon' -import { Box, Text } from 'theme-ui' import { useZap } from './context/ZapContext' const ZapToggleBottom = ({ @@ -12,35 +11,23 @@ const ZapToggleBottom = ({ const { operation } = useZap() return ( - - +
+
- Having issues minting? Zaps are in beta + Having issues minting? Zaps are in beta - +
- +
) } diff --git a/src/views/yield-dtf/issuance/components/zapV2/context/ZapContext.tsx b/src/views/yield-dtf/issuance/components/zapV2/context/ZapContext.tsx index d8daa2ffe..ddb42ce0a 100644 --- a/src/views/yield-dtf/issuance/components/zapV2/context/ZapContext.tsx +++ b/src/views/yield-dtf/issuance/components/zapV2/context/ZapContext.tsx @@ -1,3 +1,4 @@ +import { useQuery } from '@tanstack/react-query' import { useChainlinkPrice } from 'hooks/useChainlinkPrice' import useDebounce from 'hooks/useDebounce' import { useAtomValue } from 'jotai' @@ -10,6 +11,7 @@ import { useContext, useEffect, useMemo, + useRef, useState, } from 'react' import { @@ -23,8 +25,6 @@ import { walletAtom, } from 'state/atoms' import { isRTokenMintEnabled } from 'state/geolocation/atoms' -import useSWR from 'swr' -import { Link, Text } from 'theme-ui' import { formatCurrency } from 'utils' import { ChainId } from 'utils/chains' import { CHAIN_TAGS, REGISTER_BUGS } from 'utils/constants' @@ -153,8 +153,6 @@ export const ZapProvider: FC> = ({ children }) => { const [amountIn, _setAmountIn] = useState('') const [selectedToken, setSelectedToken] = useState() const [error, setError] = useState() - const [retries, setRetries] = useState(0) - const [isRetrying, setIsRetrying] = useState(false) const chainId = useAtomValue(chainIdAtom) const account = useAtomValue(walletAtom) || undefined @@ -346,37 +344,41 @@ export const ZapProvider: FC> = ({ children }) => { 500 ) + const retriesRef = useRef(0) + const isRetryingRef = useRef(false) + const { data, isLoading, - isValidating, + isFetching, error: apiError, - mutate: refetch, - } = useSWR(endpoint, fetcher, { - onSuccess(data, _, __) { - // if data.error exists, it means the zap failed. - if (data.error && retries < 10 && !isRetrying) { - setIsRetrying(true) - setTimeout(() => { - setRetries((r) => r + 1) - refetch() - setIsRetrying(false) - }, 500) - } else { - setRetries(0) - setIsRetrying(false) - } - }, - onErrorRetry: (_, __, ___, revalidate, { retryCount }) => { - // Only retry up to 10 times. - if (retryCount >= 10) return - - // Retry after 5 seconds. - setTimeout(() => revalidate({ retryCount }), 500) - }, - refreshInterval: openSubmitModal ? 0 : REFRESH_INTERVAL, + refetch, + } = useQuery({ + queryKey: ['zap-quote', endpoint], + queryFn: () => fetcher(endpoint!), + enabled: !!endpoint, + retry: 10, + retryDelay: 500, + refetchInterval: openSubmitModal ? false : REFRESH_INTERVAL, }) + // Handle retry on data.error (API returned error in response body) + useEffect(() => { + if (data?.error && retriesRef.current < 10 && !isRetryingRef.current) { + isRetryingRef.current = true + setTimeout(() => { + retriesRef.current += 1 + refetch() + isRetryingRef.current = false + }, 500) + } else if (!data?.error) { + retriesRef.current = 0 + isRetryingRef.current = false + } + }, [data, refetch]) + + const isValidating = isFetching && !isLoading + const [amountOut, minAmountOut, priceImpact, zapDustUSD, gasCost, spender] = useMemo(() => { if (!data || !data.result) { @@ -468,13 +470,13 @@ export const ZapProvider: FC> = ({ children }) => { setError({ title: 'Failed to find a route', message: ( - + {(apiError?.message || data?.error || 'An unknown error occurred') + '. Please try again. If the problem persists, please '}{' '} - + contact support. - - + + ), color: 'danger', secondaryColor: 'rgba(255, 0, 0, 0.20)', @@ -530,12 +532,7 @@ export const ZapProvider: FC> = ({ children }) => { setError, priceImpact, endpoint, - refetch, - retries, - setRetries, setOpenSubmitModal, - isRetrying, - setIsRetrying, rToken, chainId, account, diff --git a/src/views/yield-dtf/issuance/components/zapV2/input/ZapInput.tsx b/src/views/yield-dtf/issuance/components/zapV2/input/ZapInput.tsx index bdb5a0217..582cfde45 100644 --- a/src/views/yield-dtf/issuance/components/zapV2/input/ZapInput.tsx +++ b/src/views/yield-dtf/issuance/components/zapV2/input/ZapInput.tsx @@ -1,6 +1,5 @@ import { NumericalInput } from 'components' import { useMemo } from 'react' -import { Box, Text } from 'theme-ui' import { useZap } from '../context/ZapContext' const ZapInput = () => { @@ -8,7 +7,7 @@ const ZapInput = () => { const symbol = useMemo(() => tokenIn?.symbol ?? '', [tokenIn]) return ( - +
{ onChange={setAmountIn} /> {!!amountIn && ( - - {amountIn} - - {symbol} - - +
+ {amountIn} + {symbol} +
)} - +
) } diff --git a/src/views/yield-dtf/issuance/components/zapV2/input/ZapInputContainer.tsx b/src/views/yield-dtf/issuance/components/zapV2/input/ZapInputContainer.tsx index 2a6cd897e..b2e1dcf79 100644 --- a/src/views/yield-dtf/issuance/components/zapV2/input/ZapInputContainer.tsx +++ b/src/views/yield-dtf/issuance/components/zapV2/input/ZapInputContainer.tsx @@ -1,4 +1,4 @@ -import { Box, Text } from 'theme-ui' +import { cn } from '@/lib/utils' import ZapInput from './ZapInput' import ZapTokenSelector from '../token-selector/ZapTokenSelector' import ZapInputMaxButton from './ZapInputMaxButton' @@ -9,49 +9,28 @@ const ZapInputContainer = () => { const { operation } = useZap() return ( - - - You use: +
+ You use: - +
- {operation === 'mint' && } - -
+ + ) } diff --git a/src/views/yield-dtf/issuance/components/zapV2/input/ZapInputMaxButton.tsx b/src/views/yield-dtf/issuance/components/zapV2/input/ZapInputMaxButton.tsx index bf78a8160..d1ea5f079 100644 --- a/src/views/yield-dtf/issuance/components/zapV2/input/ZapInputMaxButton.tsx +++ b/src/views/yield-dtf/issuance/components/zapV2/input/ZapInputMaxButton.tsx @@ -1,5 +1,4 @@ -import { Button } from 'components' -import { Box, Text } from 'theme-ui' +import { Button } from '@/components/ui/button' import { formatCurrency } from 'utils' import { useZap } from '../context/ZapContext' import TokenLogo from 'components/icons/TokenLogo' @@ -14,29 +13,28 @@ const ZapInputMaxButton = () => { }, [tokenIn.balance]) return ( - +
{operation === 'redeem' && } - - - Balance - +
+
+ Balance + {formatCurrency(+(tokenIn.balance ?? '0'), decimalsFormat, { notation: 'compact', compactDisplay: 'short', })} - - + +
- - +
+
) } diff --git a/src/views/yield-dtf/issuance/components/zapV2/input/ZapInputUSD.tsx b/src/views/yield-dtf/issuance/components/zapV2/input/ZapInputUSD.tsx index ea4065196..345f2b919 100644 --- a/src/views/yield-dtf/issuance/components/zapV2/input/ZapInputUSD.tsx +++ b/src/views/yield-dtf/issuance/components/zapV2/input/ZapInputUSD.tsx @@ -1,6 +1,5 @@ import { useMemo } from 'react' import Skeleton from 'react-loading-skeleton' -import { Text } from 'theme-ui' import { formatCurrency } from 'utils' import { useZap } from '../context/ZapContext' @@ -14,7 +13,7 @@ const ZapInputUSD = () => { if (!amountUSD) return - return ${amountUSD} + return ${amountUSD} } export default ZapInputUSD diff --git a/src/views/yield-dtf/issuance/components/zapV2/minters-modal/SocialMediaInput.tsx b/src/views/yield-dtf/issuance/components/zapV2/minters-modal/SocialMediaInput.tsx index 940a20d48..21b9a0d5f 100644 --- a/src/views/yield-dtf/issuance/components/zapV2/minters-modal/SocialMediaInput.tsx +++ b/src/views/yield-dtf/issuance/components/zapV2/minters-modal/SocialMediaInput.tsx @@ -1,13 +1,18 @@ -import { Button, Input } from 'components' +import { Button } from '@/components/ui/button' +import { Input } from 'components' import DiscordColorIcon from 'components/icons/DiscordColorIcon' import TelegramIcon from 'components/icons/TelegramIcon' import XIcon from 'components/icons/XIcon' -import Popup from '@/components/old/popup' +import { + Popover, + PopoverContent, + PopoverTrigger, +} from '@/components/ui/popover' import { useAtomValue } from 'jotai' import { useCallback, useEffect, useState } from 'react' import { ChevronDown, ChevronUp, Mail } from 'lucide-react' import { walletAtom } from 'state/atoms' -import { Box, BoxProps } from 'theme-ui' +import { cn } from '@/lib/utils' import { useZap } from '../context/ZapContext' const STORAGE_URL = import.meta.env.VITE_STORAGE_URL || '' @@ -50,81 +55,59 @@ const Dropdown = ({ selected, options, onSelectOption, - sx, - ...props + className, }: { selected: SocialMediaOption options: SocialMediaOption[] onSelectOption: (option: SocialMediaOption) => void -} & BoxProps) => { + className?: string +}) => { const [isVisible, setVisible] = useState(false) return ( - setVisible(false)} - placement="bottom-start" - content={ - + + +
+ {selected.icon} +
+ {isVisible ? ( + + ) : ( + + )} +
+ + +
{options.map((option) => ( - { onSelectOption(option) setVisible(false) }} > {option.icon} - +
{option.name} - +
))} -
- } - > - setVisible(!isVisible)} - > - {selected.icon} - - {isVisible ? ( - - ) : ( - - )} - - +
+
+ ) } -const SocialMediaInput = ({ sx, ...props }: BoxProps) => { +const SocialMediaInput = ({ className }: { className?: string }) => { const account = useAtomValue(walletAtom) const [value, setValue] = useState('') const [submitted, setSubmitted] = useState(false) @@ -174,9 +157,8 @@ const SocialMediaInput = ({ sx, ...props }: BoxProps) => { } return ( - { }} /> onChange(e.target.value)} disabled={submitted} onKeyDown={(e) => { if (e.key === 'Enter') { @@ -206,12 +182,8 @@ const SocialMediaInput = ({ sx, ...props }: BoxProps) => { /> {submitted ? ( ) : ( )} - +
) } diff --git a/src/views/yield-dtf/issuance/components/zapV2/minters-modal/index.tsx b/src/views/yield-dtf/issuance/components/zapV2/minters-modal/index.tsx index 789c7afbe..1541a137c 100644 --- a/src/views/yield-dtf/issuance/components/zapV2/minters-modal/index.tsx +++ b/src/views/yield-dtf/issuance/components/zapV2/minters-modal/index.tsx @@ -1,118 +1,51 @@ -import { keyframes, useTheme } from '@emotion/react' -import { Button } from 'components' +import { Button } from '@/components/ui/button' import BankIcon from 'components/icons/BankIcon' import { ChevronLeft } from 'lucide-react' -import { Box, Text } from 'theme-ui' import { useZap } from '../context/ZapContext' import SocialMediaInput from './SocialMediaInput' -const slideOut = keyframes` - from { - right: 0; - } - to { - right: -395px; - } -` - const MintersModal = () => { const { showEliteProgramModal, setShowEliteProgramModal } = useZap() - const theme = useTheme() if (!showEliteProgramModal) return null return ( - - +
- - - +
+
+ Congratulations 🎉 - - - You’ve unlocked an invitation to Reserve Institutional’s elite program + + + You've unlocked an invitation to Reserve Institutional's elite program for large RToken holders. Participants enjoy access to: - - - 1:1 support from Reserve Institutional - Online & IRL invite-only events - Exclusive alpha and insights - + +
    +
  • 1:1 support from Reserve Institutional
  • +
  • Online & IRL invite-only events
  • +
  • Exclusive alpha and insights
  • +
- - +
+ ) } diff --git a/src/views/yield-dtf/issuance/components/zapV2/output/ZapOutput.tsx b/src/views/yield-dtf/issuance/components/zapV2/output/ZapOutput.tsx index 5c2553c7b..104393123 100644 --- a/src/views/yield-dtf/issuance/components/zapV2/output/ZapOutput.tsx +++ b/src/views/yield-dtf/issuance/components/zapV2/output/ZapOutput.tsx @@ -1,5 +1,4 @@ import Skeleton from 'react-loading-skeleton' -import { Text } from 'theme-ui' import { useZap } from '../context/ZapContext' const ZapOutput = () => { @@ -9,7 +8,7 @@ const ZapOutput = () => { return } - return {amountOut} + return {amountOut} } export default ZapOutput diff --git a/src/views/yield-dtf/issuance/components/zapV2/output/ZapOutputBalance.tsx b/src/views/yield-dtf/issuance/components/zapV2/output/ZapOutputBalance.tsx index 78acc6f40..58a3d35d6 100644 --- a/src/views/yield-dtf/issuance/components/zapV2/output/ZapOutputBalance.tsx +++ b/src/views/yield-dtf/issuance/components/zapV2/output/ZapOutputBalance.tsx @@ -1,5 +1,4 @@ import TokenLogo from 'components/icons/TokenLogo' -import { Box, Text } from 'theme-ui' import { formatCurrency } from 'utils' import { useZap } from '../context/ZapContext' @@ -7,20 +6,20 @@ const ZapOutputBalance = () => { const { tokenOut, operation } = useZap() return ( - +
{operation === 'mint' && } - - Balance +
+ Balance {tokenOut.balance && ( - + {formatCurrency(+tokenOut.balance, 2, { notation: 'compact', compactDisplay: 'short', })} - + )} - - +
+
) } diff --git a/src/views/yield-dtf/issuance/components/zapV2/output/ZapOutputContainer.tsx b/src/views/yield-dtf/issuance/components/zapV2/output/ZapOutputContainer.tsx index 7ca8a6d89..a0e640b2d 100644 --- a/src/views/yield-dtf/issuance/components/zapV2/output/ZapOutputContainer.tsx +++ b/src/views/yield-dtf/issuance/components/zapV2/output/ZapOutputContainer.tsx @@ -1,4 +1,4 @@ -import { Box, Text } from 'theme-ui' +import { cn } from '@/lib/utils' import { useZap } from '../context/ZapContext' import ZapTokenSelector from '../token-selector/ZapTokenSelector' import ZapOutput from './ZapOutput' @@ -9,52 +9,29 @@ const ZapOutputContainer = () => { const { tokenOut, operation, loadingZap } = useZap() return ( - - You receive: - +
+ You receive: +
{!loadingZap && ( - - {tokenOut.symbol} - + {tokenOut.symbol} )} - - +
+
- - +
{operation === 'redeem' && } - - +
+
) } diff --git a/src/views/yield-dtf/issuance/components/zapV2/output/ZapOutputUSD.tsx b/src/views/yield-dtf/issuance/components/zapV2/output/ZapOutputUSD.tsx index e036fefb3..fa36555d3 100644 --- a/src/views/yield-dtf/issuance/components/zapV2/output/ZapOutputUSD.tsx +++ b/src/views/yield-dtf/issuance/components/zapV2/output/ZapOutputUSD.tsx @@ -1,5 +1,4 @@ import Skeleton from 'react-loading-skeleton' -import { Box, Text } from 'theme-ui' import { formatCurrency } from 'utils' import { useZap } from '../context/ZapContext' import Help from 'components/help' @@ -12,30 +11,27 @@ const ZapOutputUSD = () => { } return ( - - +
+ ${formatCurrency((tokenOut?.price || 0) * Number(amountOut), 2)} - + {zapDustUSD !== undefined && zapDustUSD !== 0 && ( <> - + {' '} +{' '} - + ${formatCurrency(+zapDustUSD, 2)} - {' '} + {' '} in dust - + )} - +
) } diff --git a/src/views/yield-dtf/issuance/components/zapV2/overview/ZapDetails.tsx b/src/views/yield-dtf/issuance/components/zapV2/overview/ZapDetails.tsx index e7722672d..7017f1747 100644 --- a/src/views/yield-dtf/issuance/components/zapV2/overview/ZapDetails.tsx +++ b/src/views/yield-dtf/issuance/components/zapV2/overview/ZapDetails.tsx @@ -1,69 +1,56 @@ +import { cn } from '@/lib/utils' import Skeleton from 'react-loading-skeleton' -import { Box, BoxProps, Text } from 'theme-ui' import { PRICE_IMPACT_THRESHOLD } from '../constants' import { useZap } from '../context/ZapContext' import { formatNumber, formatSlippage } from '../utils' import ZapGasCost from './ZapGasCost' import ZapRate from './ZapRate' -interface Props extends BoxProps { +interface Props { hideGasCost?: boolean + className?: string } -const ZapDetails = ({ hideGasCost, ...props }: Props) => { +const ZapDetails = ({ hideGasCost, className }: Props) => { const { priceImpact, slippage, loadingZap, minAmountOut, tokenOut } = useZap() return ( - - - Price Impact +
+
+ Price Impact {loadingZap ? ( ) : ( - PRICE_IMPACT_THRESHOLD ? 'danger' : 'text', - }} + PRICE_IMPACT_THRESHOLD + ? 'text-destructive' + : 'text-foreground' + )} > {formatNumber(priceImpact || 0, 2)}% - + )} - - - Max. slippage - - {formatSlippage(slippage)} - - +
+
+ Max. slippage + {formatSlippage(slippage)} +
{minAmountOut && ( - - Min. amount out - +
+ Min. amount out + {minAmountOut} {tokenOut?.symbol} - - + +
)} - - Rate - - +
+ Rate + +
{!hideGasCost && } -
+
) } diff --git a/src/views/yield-dtf/issuance/components/zapV2/overview/ZapGasCost.tsx b/src/views/yield-dtf/issuance/components/zapV2/overview/ZapGasCost.tsx index cfab1510a..8754161b7 100644 --- a/src/views/yield-dtf/issuance/components/zapV2/overview/ZapGasCost.tsx +++ b/src/views/yield-dtf/issuance/components/zapV2/overview/ZapGasCost.tsx @@ -1,30 +1,30 @@ +import { cn } from '@/lib/utils' import GasIcon from 'components/icons/GasIcon' -import { Box, BoxProps, Text } from 'theme-ui' import { formatCurrency } from 'utils' import { useZap } from '../context/ZapContext' import Skeleton from 'react-loading-skeleton' -const ZapGasCost = (props: BoxProps) => { +interface Props { + className?: string +} + +const ZapGasCost = ({ className }: Props) => { const { gasCost, loadingZap } = useZap() return ( - - Estimated gas cost - +
+ Estimated gas cost +
{loadingZap ? ( ) : ( - + ${gasCost ? formatCurrency(+gasCost, 2) : 0} - + )} - - +
+
) } diff --git a/src/views/yield-dtf/issuance/components/zapV2/overview/ZapRate.tsx b/src/views/yield-dtf/issuance/components/zapV2/overview/ZapRate.tsx index 9390e33d5..8b629b7d3 100644 --- a/src/views/yield-dtf/issuance/components/zapV2/overview/ZapRate.tsx +++ b/src/views/yield-dtf/issuance/components/zapV2/overview/ZapRate.tsx @@ -1,9 +1,12 @@ import { useMemo } from 'react' -import { Text, TextProps } from 'theme-ui' import { formatCurrency } from 'utils' import { useZap } from '../context/ZapContext' -const ZapRate = (props: TextProps) => { +interface Props { + className?: string +} + +const ZapRate = ({ className }: Props) => { const { tokenIn, tokenOut } = useZap() const rate = useMemo( @@ -13,9 +16,9 @@ const ZapRate = (props: TextProps) => { ) return ( - + 1 {tokenIn.symbol} = {formatCurrency(rate, 5)} {tokenOut.symbol} - + ) } diff --git a/src/views/yield-dtf/issuance/components/zapV2/refresh/ZapRefreshButton.tsx b/src/views/yield-dtf/issuance/components/zapV2/refresh/ZapRefreshButton.tsx index d7b33918f..45b76406b 100644 --- a/src/views/yield-dtf/issuance/components/zapV2/refresh/ZapRefreshButton.tsx +++ b/src/views/yield-dtf/issuance/components/zapV2/refresh/ZapRefreshButton.tsx @@ -1,5 +1,5 @@ import { useState } from 'react' -import { IconButton } from 'theme-ui' +import { cn } from '@/lib/utils' import { useZap } from '../context/ZapContext' import RefreshIcon from './RefreshIcon' @@ -24,22 +24,14 @@ const RefreshButton = () => { } return ( - @@ -51,7 +43,7 @@ const RefreshButton = () => { ) : ( )} - + ) } diff --git a/src/views/yield-dtf/issuance/components/zapV2/settings/ZapSettings.tsx b/src/views/yield-dtf/issuance/components/zapV2/settings/ZapSettings.tsx index 91d7d60da..b8d5ad187 100644 --- a/src/views/yield-dtf/issuance/components/zapV2/settings/ZapSettings.tsx +++ b/src/views/yield-dtf/issuance/components/zapV2/settings/ZapSettings.tsx @@ -1,5 +1,4 @@ import { Settings } from 'lucide-react' -import { IconButton } from 'theme-ui' import { useZap } from '../context/ZapContext' import ZapSettingsModal from './ZapSettingsModal' @@ -9,19 +8,12 @@ const ZapSettings = () => { return ( <> {openSettings && } - setOpenSettings(true)} > - + ) } diff --git a/src/views/yield-dtf/issuance/components/zapV2/settings/ZapSettingsCollectDust.tsx b/src/views/yield-dtf/issuance/components/zapV2/settings/ZapSettingsCollectDust.tsx index 1f4371f94..ca4d88ed0 100644 --- a/src/views/yield-dtf/issuance/components/zapV2/settings/ZapSettingsCollectDust.tsx +++ b/src/views/yield-dtf/issuance/components/zapV2/settings/ZapSettingsCollectDust.tsx @@ -1,40 +1,23 @@ -import { Box, Checkbox, Text } from 'theme-ui' +import { Checkbox } from '@/components/ui/checkbox' import { useZap } from '../context/ZapContext' const ZapSettingsCollectDust = () => { const { collectDust, setCollectDust } = useZap() return ( - -
) diff --git a/src/views/yield-dtf/issuance/components/zapV2/token-selector/ZapManualMint.tsx b/src/views/yield-dtf/issuance/components/zapV2/token-selector/ZapManualMint.tsx index 08392bd22..63d80d880 100644 --- a/src/views/yield-dtf/issuance/components/zapV2/token-selector/ZapManualMint.tsx +++ b/src/views/yield-dtf/issuance/components/zapV2/token-selector/ZapManualMint.tsx @@ -1,28 +1,26 @@ import CirclesIcon from 'components/icons/CirclesIcon' -import { Box, Text } from 'theme-ui' import { useZap } from '../context/ZapContext' -import { Button } from 'components' +import { Button } from '@/components/ui/button' const ZapManualMint = () => { const { operation, setZapEnabled } = useZap() return ( - +
- + Bring your own collateral - - + +
- - +
+
) } diff --git a/src/views/yield-dtf/issuance/components/zapV2/token-selector/ZapTokenSelector.tsx b/src/views/yield-dtf/issuance/components/zapV2/token-selector/ZapTokenSelector.tsx index 8957d3128..08f6a9fb0 100644 --- a/src/views/yield-dtf/issuance/components/zapV2/token-selector/ZapTokenSelector.tsx +++ b/src/views/yield-dtf/issuance/components/zapV2/token-selector/ZapTokenSelector.tsx @@ -1,5 +1,4 @@ import { ChevronDown } from 'lucide-react' -import { Box } from 'theme-ui' import { useZap } from '../context/ZapContext' import ZapTokenSelected from './ZapTokenSelected' import ZapTokensModal from './ZapTokensModal' @@ -10,30 +9,15 @@ const ZapTokenSelector = () => { return ( <> {openTokenSelector && } - setOpenTokenSelector(true)} > - +
- - +
+ ) } diff --git a/src/views/yield-dtf/issuance/components/zapV2/token-selector/ZapTokensModal.tsx b/src/views/yield-dtf/issuance/components/zapV2/token-selector/ZapTokensModal.tsx index bf51f932e..bd846f253 100644 --- a/src/views/yield-dtf/issuance/components/zapV2/token-selector/ZapTokensModal.tsx +++ b/src/views/yield-dtf/issuance/components/zapV2/token-selector/ZapTokensModal.tsx @@ -1,10 +1,10 @@ import { Modal } from 'components' import TokenLogo from 'components/icons/TokenLogo' -import { SearchInput } from '@/components/old/input' +import { SearchInput } from '@/components/ui/input' import { useMemo, useState } from 'react' import { ArrowUpRight, X } from 'lucide-react' -import { colors } from 'theme' -import { Box, Button, Divider, Link, Text } from 'theme-ui' +import { Separator } from '@/components/ui/separator' +import { Button } from '@/components/ui/button' import { formatCurrency, shortenString } from 'utils' import { ExplorerDataType, getExplorerLink } from 'utils/getExplorerLink' import { Address } from 'viem' @@ -23,59 +23,41 @@ const ZapTokenList = ({ }[] }) => { return ( - +
{entries.map( ({ address, symbol, selectToken, explorerLink, balance }) => ( - - - +
+ {symbol} - - - + + +
+
+ {formatCurrency(+balance, 5)} +
+
) )} -
+ ) } @@ -113,58 +95,39 @@ const ZapTokensModal = () => { setOpenTokenSelector(false)} closeOnClickAway hideCloseButton > - - - +
+
+ {operation === 'mint' ? 'Mint' : 'Redeem'} using - + - - +
+
setSearch(e.target.value)} + inputClassName="bg-muted" /> - + - + - - +
+
) } diff --git a/src/views/yield-dtf/issuance/index.tsx b/src/views/yield-dtf/issuance/index.tsx index 927f3dad4..1a4c0719a 100644 --- a/src/views/yield-dtf/issuance/index.tsx +++ b/src/views/yield-dtf/issuance/index.tsx @@ -1,7 +1,7 @@ import { useAtomValue } from 'jotai' import { chainIdAtom, rTokenStateAtom } from 'state/atoms' import DisabledByGeolocationMessage from 'state/geolocation/DisabledByGeolocationMessage' -import { Box, Divider, Grid } from 'theme-ui' +import { Separator } from '@/components/ui/separator' import About from './components/about' import Balances from './components/balances' import Issue from './components/issue' @@ -25,46 +25,40 @@ const IssuanceMethods = () => { const { isCollaterized } = useAtomValue(rTokenStateAtom) return ( - +
{zapEnabled && chainId !== ChainId.Arbitrum ? ( - - - +
+ + - +
) : ( - - - - +
+ + + {chainId !== ChainId.Arbitrum && ( )} - - + +
- +
- +
)} - - +
+ {!zapEnabled && ( <> - + )} - - +
+
) } @@ -75,9 +69,9 @@ const Issuance = () => { return ( - +
- +
) } diff --git a/src/views/yield-dtf/overview/atoms.ts b/src/views/yield-dtf/overview/atoms.ts index 65c056b33..705f819fa 100644 --- a/src/views/yield-dtf/overview/atoms.ts +++ b/src/views/yield-dtf/overview/atoms.ts @@ -1,9 +1,7 @@ import { atom } from 'jotai' import { btcPriceAtom, - ethPriceAtom, rTokenBackingDistributionAtom, - rTokenPriceAtom, rTokenStateAtom, } from 'state/atoms' import { TARGET_UNITS } from 'utils/constants' diff --git a/src/views/yield-dtf/overview/components/CollateralPieChartWrapper.tsx b/src/views/yield-dtf/overview/components/CollateralPieChartWrapper.tsx deleted file mode 100644 index a378df985..000000000 --- a/src/views/yield-dtf/overview/components/CollateralPieChartWrapper.tsx +++ /dev/null @@ -1,184 +0,0 @@ -import { t } from '@lingui/macro' -import ChevronRight from 'components/icons/ChevronRight' -import CircleIcon from 'components/icons/CircleIcon' -import { MouseoverTooltipContent } from '@/components/old/tooltip' -import { ListedToken } from 'hooks/useTokenList' -import { FC, memo, useMemo, useState } from 'react' -import { Box, Button, Text } from 'theme-ui' -import { stringToColor } from 'utils' -import CollateralPieChartTooltip from './CollateralPieChartTooltip' -import HelpIcon from 'components/icons/CustomHelpIcon' -import CollaterizationIcon from 'components/icons/CollaterizationIcon' -import { useAtomValue } from 'jotai' -import { collateralsMetadataAtom } from 'state/cms/atoms' -import CollateralPieChart from './CollateralPieChart' - -type Props = { - token: ListedToken -} - -const CollateralPieChartWrapper: FC = ({ token }) => { - const [isHovered, setIsHovered] = useState(false) - const metadata = useAtomValue(collateralsMetadataAtom) - - const chartData = useMemo( - () => - token.collaterals.map((c) => { - const cmsCollateral = - metadata?.[c.symbol.toLowerCase().replace('-vault', '')] - return { - name: c.symbol, - value: - +(token.collateralDistribution[c.id.toLowerCase()]?.dist ?? 0) * - 100, - color: cmsCollateral?.color || stringToColor(c.id), - project: cmsCollateral?.protocol?.name || 'GENERIC', - projectColor: cmsCollateral?.protocol?.color || 'gray', - } - }), - [] - ) - - return ( - } - > - setIsHovered(true)} - onMouseLeave={() => setIsHovered(false)} - > - - {/* To preserve space */} - - - - - - {token.isCollaterized ? ( - {t`Backing`} - ) : ( - - Rebalancing - - )} - - - {token.isCollaterized && ( - - {token.backing.toFixed(0)}% - - )} - - - - - } - bottomInformation={ - - - - {t`Staked RSR`} - - - - {token.overcollaterization.toFixed(0)}% - - - - - } - isRebalancing={!token.isCollaterized} - /> - - - ) -} - -export default memo(CollateralPieChartWrapper) diff --git a/src/views/yield-dtf/overview/components/backing/AssetBreakdown.tsx b/src/views/yield-dtf/overview/components/backing/asset-breakdown.tsx similarity index 73% rename from src/views/yield-dtf/overview/components/backing/AssetBreakdown.tsx rename to src/views/yield-dtf/overview/components/backing/asset-breakdown.tsx index f376a0f2e..d6f8a5b5f 100644 --- a/src/views/yield-dtf/overview/components/backing/AssetBreakdown.tsx +++ b/src/views/yield-dtf/overview/components/backing/asset-breakdown.tsx @@ -4,12 +4,11 @@ import LayersIcon from 'components/icons/LayersIcon' import RiskIcon from 'components/icons/RiskIcon' import TabMenu from 'components/tab-menu' import { useCallback, useMemo, useState } from 'react' -import { Box, Card, Flex } from 'theme-ui' -import BackingOverview from './BackingOverview' -import CollateralExposure from './CollateralExposure' -import PlatformExposure from './PlatformExposure' -import Risks from './Risks' -import TokenExposure from './TokenExposure' +import BackingOverview from './backing-overview' +import CollateralExposure from './collateral-exposure' +import PlatformExposure from './platform-exposure' +import Risks from './risks' +import TokenExposure from './token-exposure' const tabComponents = { collaterals: CollateralExposure, @@ -61,20 +60,15 @@ const AssetBreakdown = () => { const Current = tabComponents[current as keyof typeof tabComponents] return ( - - +
+
- - +
+
- - +
+
) } diff --git a/src/views/yield-dtf/overview/components/backing/BackingBuffer.tsx b/src/views/yield-dtf/overview/components/backing/backing-buffer.tsx similarity index 51% rename from src/views/yield-dtf/overview/components/backing/BackingBuffer.tsx rename to src/views/yield-dtf/overview/components/backing/backing-buffer.tsx index a3cc85944..fa29b4337 100644 --- a/src/views/yield-dtf/overview/components/backing/BackingBuffer.tsx +++ b/src/views/yield-dtf/overview/components/backing/backing-buffer.tsx @@ -1,3 +1,4 @@ +import { cn } from '@/lib/utils' import Help from 'components/help' import BackingBufferIcon from 'components/icons/BackingBufferIcon' import ProgressBar from 'components/progress-bar' @@ -10,10 +11,9 @@ import { rTokenPriceAtom, rTokenStateAtom, } from 'state/atoms' -import { Box, BoxProps, Text } from 'theme-ui' import { formatCurrency, formatPercentage } from 'utils' -const BuckingBuffer = ({ ...props }: BoxProps) => { +const BuckingBuffer = ({ className }: { className?: string }) => { const rToken = useRToken() const backing = useAtomValue(rTokenBackingDistributionAtom) const rTokenState = useAtomValue(rTokenStateAtom) @@ -37,91 +37,56 @@ const BuckingBuffer = ({ ...props }: BoxProps) => { }, [backing, rTokenPrice, rTokenState]) return ( - - - - +
+
+
+
- + Revenue distribution backing buffer - - - - - | - - + +
+
+ | + {rToken?.symbol || ''} buffer as % of mcap: - - {percentageOfMCap} - - - + + {percentageOfMCap} +
+
+
- +
{backing ? ( - + + Current value in buffer:{' '} - - ${actual} - + + ${actual} + } backgroundText={ - + 100% at current mcap:{' '} - ${required} - + ${required} + } /> ) : ( )} - - - +
+
+ Collateral yield is distributed as revenue when the backing buffer is full - + - - +
+
) } diff --git a/src/views/yield-dtf/overview/components/backing/BackingOverview.tsx b/src/views/yield-dtf/overview/components/backing/backing-overview.tsx similarity index 53% rename from src/views/yield-dtf/overview/components/backing/BackingOverview.tsx rename to src/views/yield-dtf/overview/components/backing/backing-overview.tsx index 59be23b78..e372c857a 100644 --- a/src/views/yield-dtf/overview/components/backing/BackingOverview.tsx +++ b/src/views/yield-dtf/overview/components/backing/backing-overview.tsx @@ -11,9 +11,8 @@ import { rTokenPriceAtom, rTokenStateAtom, } from 'state/atoms' -import { Box, Card, Flex, Text } from 'theme-ui' import { formatCurrency } from 'utils' -import CollateralsChart from './CollateralsChart' +import CollateralsChart from './collaterals-chart' import { rTokenTargetPriceAtom } from '@/views/yield-dtf/overview/atoms' // TODO: TARGET PEG PRICE (ETH+) @@ -40,79 +39,59 @@ const BackingOverview = ({ current }: { current: string }) => { const data = useAtomValue(backingOverviewAtom) return ( - - - +
+
+
- 1 {data.symbol} - + 1 {data.symbol} +
- +
{!!data.pegData ? ( <> - + {formatCurrency(data.pegData.price)} {data.pegData.unit} - - + + ${formatCurrency(data?.price)} - + ) : ( - ${formatCurrency(data?.price)} + + ${formatCurrency(data?.price)} + )} - - - +
+
+
- Blended Yield - - {data.yield.toFixed(2)}% - - - + Blended Yield + {data.yield.toFixed(2)}% +
+
- - +
+
- + Backing - + {data.isCollaterized ? ( - + {data.backing.toFixed(0)}% - + ) : ( - + Rebalancing - + )} - - +
+
- Staked RSR - - {data.staked.toFixed(0)}% - - - + Staked RSR + {data.staked.toFixed(0)}% +
+
) } diff --git a/src/views/yield-dtf/overview/components/backing/CollateralExposure.tsx b/src/views/yield-dtf/overview/components/backing/collateral-exposure.tsx similarity index 59% rename from src/views/yield-dtf/overview/components/backing/CollateralExposure.tsx rename to src/views/yield-dtf/overview/components/backing/collateral-exposure.tsx index 8c6fc9891..3b40d7c83 100644 --- a/src/views/yield-dtf/overview/components/backing/CollateralExposure.tsx +++ b/src/views/yield-dtf/overview/components/backing/collateral-exposure.tsx @@ -1,7 +1,8 @@ import { Trans } from '@lingui/macro' -import { Button } from 'components' -import CopyValue from '@/components/old/button/CopyValue' -import GoTo from '@/components/old/button/GoTo' +import { cn } from '@/lib/utils' +import { Button } from '@/components/ui/button' +import CopyValue from '@/components/ui/copy-value' +import GoTo from '@/components/ui/go-to' import CollaterizationIcon from 'components/icons/CollaterizationIcon' import HiperlinkIcon from 'components/icons/HiperlinkIcon' import TokenLogo from 'components/icons/TokenLogo' @@ -17,10 +18,8 @@ import { CollateralDetail, rTokenCollateralDetailedAtom, } from 'state/rtoken/atoms/rTokenBackingDistributionAtom' -import { Box, Card, Flex, Grid, Text } from 'theme-ui' import { formatCurrency, shortenAddress } from 'utils' import { ExplorerDataType, getExplorerLink } from 'utils/getExplorerLink' -import VerticalDivider from '@/views/discover/components/yield/components/VerticalDivider' import { PROTOCOL_DOCS } from '@/utils/constants' interface DetailedCollateralWithMeta extends CollateralDetail { @@ -66,62 +65,47 @@ const CollateralDetails = ({ const chainId = useAtomValue(chainIdAtom) const [expanded, setExpanded] = useState(false) const backingType = useAtomValue(backingTypeAtom) - const usdValueLabelProps = collateral.valueTarget - ? { - variant: 'legend', - sx: { fontWeight: 400 }, - } - : {} return ( - - setExpanded(!expanded)} - sx={{ - cursor: 'pointer', - '&:hover': { backgroundColor: ['none', 'inputBackground'] }, - }} - p={[3, 4]} + className="grid grid-cols-1 sm:grid-cols-[3fr_1fr_1fr_1fr] cursor-pointer hover:sm:bg-muted p-3 sm:p-4" > - +
- + {collateral.distribution.toFixed(2)}% - - {collateral.displayName} - - - - Yield:{' '} - - {collateral.yield.toFixed(2)}% - - - - - Value: - + + {collateral.displayName} +
+
+ Yield: + {collateral.yield.toFixed(2)}% +
+ +
+ Value: {!!collateral.valueTarget && !!collateral.valueSingleTarget && ( - + {formatCurrency( backingType === 'total' ? collateral.valueTarget : collateral.valueSingleTarget )}{' '} {collateral.targetUnit} - + )} - + {!!collateral.valueTarget && '('}$ {formatCurrency( backingType === 'total' @@ -129,59 +113,49 @@ const CollateralDetails = ({ : collateral.valueSingleUsd )} {!!collateral.valueTarget && ')'} - - + +
- +
- - +
+ {!!expanded && ( - - {collateral.description} - +
+

{collateral.description}

+
{!!collateral.website && ( )} - - - +
+
+ {shortenAddress(collateral.address)} - + - - - +
+
+
)} - +
) } @@ -208,18 +182,18 @@ const CollateralList = () => { if (!sortedCollaterals) { return ( - +
- +
) } return ( - +
{sortedCollaterals?.map((collateral) => ( ))} - +
) } @@ -236,19 +210,11 @@ const Header = () => { ) return ( - +
- + Collateral Exposure - + { background="border" onMenuChange={setBackingType} /> - +
) } const CollateralExposure = () => { return ( - +
- - Token - Yield - Value - Detail - +
+ Token + Yield + Value + Detail +
- +
) } diff --git a/src/views/yield-dtf/overview/components/backing/CollateralsChart.tsx b/src/views/yield-dtf/overview/components/backing/collaterals-chart.tsx similarity index 95% rename from src/views/yield-dtf/overview/components/backing/CollateralsChart.tsx rename to src/views/yield-dtf/overview/components/backing/collaterals-chart.tsx index e459a7855..4d5b6f640 100644 --- a/src/views/yield-dtf/overview/components/backing/CollateralsChart.tsx +++ b/src/views/yield-dtf/overview/components/backing/collaterals-chart.tsx @@ -4,7 +4,7 @@ import { useMemo } from 'react' import { rTokenBackingDistributionAtom, rTokenStateAtom } from 'state/atoms' import { stringToColor } from 'utils' import { COLLATERAL_STATUS } from 'utils/constants' -import CollateralPieChart from '../CollateralPieChart' +import CollateralPieChart from '../collateral-pie-chart' import { collateralsMetadataAtom } from 'state/cms/atoms' const basketDistAtom = atom((get) => { @@ -47,7 +47,7 @@ const CollateralsChart = () => { }, [JSON.stringify(basketDist), rToken?.address]) return ( { @@ -69,49 +68,36 @@ const BackingResume = () => { const unitCount = useAtomValue(unitCountAtom) const legend = useAtomValue(pegsAtom) - if (unitCount > 2) return + if (unitCount > 2) return
return ( - +

{legend ? legend : } - +

) } const Backing = () => ( - - +
+
- +

Backing & Risk - - - +

+
+

RTokens are 100% backed by a diversified set of underlying collateral tokens... - +

- +
- +
- +
) export default Backing diff --git a/src/views/yield-dtf/overview/components/backing/PlatformExposure.tsx b/src/views/yield-dtf/overview/components/backing/platform-exposure.tsx similarity index 62% rename from src/views/yield-dtf/overview/components/backing/PlatformExposure.tsx rename to src/views/yield-dtf/overview/components/backing/platform-exposure.tsx index 85ddb42e6..c2db722fe 100644 --- a/src/views/yield-dtf/overview/components/backing/PlatformExposure.tsx +++ b/src/views/yield-dtf/overview/components/backing/platform-exposure.tsx @@ -1,13 +1,11 @@ import { Trans } from '@lingui/macro' -import { Button } from 'components' +import { Button } from '@/components/ui/button' import HiperlinkIcon from 'components/icons/HiperlinkIcon' import LayersIcon from 'components/icons/LayersIcon' -import TokenLogo from 'components/icons/TokenLogo' import { atom, useAtomValue } from 'jotai' import Skeleton from 'react-loading-skeleton' import { collateralsMetadataAtom } from 'state/cms/atoms' import { rTokenCollateralDetailedAtom } from 'state/rtoken/atoms/rTokenBackingDistributionAtom' -import { Box, Card, Image, Text } from 'theme-ui' interface PlatformDetails { name: string @@ -53,52 +51,43 @@ const PlatformExposure = () => { const exposure = useAtomValue(dataAtom) return ( - - +
+
- + Underlying Platform Exposure - - + +
{!exposure && } {exposure?.map((data) => ( - - - - +
+ {data.name} + {data.distribution.toFixed(2)}% - - - {data.name} - - - - {data.description} - - + + {data.name} +
+

{data.description}

+
- - +
+
))} -
+
) } diff --git a/src/views/yield-dtf/overview/components/backing/RevenueSplitOverview.tsx b/src/views/yield-dtf/overview/components/backing/revenue-split-overview.tsx similarity index 65% rename from src/views/yield-dtf/overview/components/backing/RevenueSplitOverview.tsx rename to src/views/yield-dtf/overview/components/backing/revenue-split-overview.tsx index c4019a54d..441c15e22 100644 --- a/src/views/yield-dtf/overview/components/backing/RevenueSplitOverview.tsx +++ b/src/views/yield-dtf/overview/components/backing/revenue-split-overview.tsx @@ -1,4 +1,5 @@ import { Trans } from '@lingui/macro' +import { cn } from '@/lib/utils' import AsteriskIcon from 'components/icons/AsteriskIcon' import RevenueSplitIcon from 'components/icons/RevenueSplitIcon' import TokenLogo, { CurrentRTokenLogo } from 'components/icons/TokenLogo' @@ -7,21 +8,25 @@ import { useMemo } from 'react' import { ArrowRight, ArrowUpRight } from 'lucide-react' import Skeleton from 'react-loading-skeleton' import { chainIdAtom, rTokenRevenueSplitAtom } from 'state/atoms' -import { borderRadius } from 'theme' -import { Box, BoxProps, Link, Text } from 'theme-ui' import { shortenAddress } from 'utils' import { ExplorerDataType, getExplorerLink } from 'utils/getExplorerLink' import { Address } from 'viem' type RevenueType = 'holders' | 'stakers' | 'external' -interface IRevenueBox extends BoxProps { +interface IRevenueBox { type: RevenueType distribution: number address?: Address + className?: string } -const RevenueBox = ({ type, distribution, address, ...props }: IRevenueBox) => { +const RevenueBox = ({ + type, + distribution, + address, + className, +}: IRevenueBox) => { const chainId = useAtomValue(chainIdAtom) const [title, icon] = useMemo(() => { if (type === 'holders') { @@ -37,39 +42,30 @@ const RevenueBox = ({ type, distribution, address, ...props }: IRevenueBox) => { }, [type]) return ( - {icon} - - - {title} - - {distribution.toFixed(2)}% - +
+ {title} + {distribution.toFixed(2)}% +
{type === 'external' && !!address && ( - - {shortenAddress(address)} + {shortenAddress(address)} - + )} -
+ ) } @@ -97,22 +93,22 @@ const splitDataAtom = atom((get) => { ] as { type: RevenueType; distribution: number; address?: Address }[] }) -const RevenueSplitOverview = (props: BoxProps) => { +const RevenueSplitOverview = ({ className }: { className?: string }) => { const data = useAtomValue(splitDataAtom) return ( - - +
+
- + Revenue distribution - - + +
{!data && } - +
{data?.map((item, index) => )} - - +
+
) } diff --git a/src/views/yield-dtf/overview/components/backing/Risks.tsx b/src/views/yield-dtf/overview/components/backing/risks.tsx similarity index 57% rename from src/views/yield-dtf/overview/components/backing/Risks.tsx rename to src/views/yield-dtf/overview/components/backing/risks.tsx index 0a9f3bf57..4e6ff761a 100644 --- a/src/views/yield-dtf/overview/components/backing/Risks.tsx +++ b/src/views/yield-dtf/overview/components/backing/risks.tsx @@ -4,24 +4,14 @@ import AsteriskIcon from 'components/icons/AsteriskIcon' import RBrand from 'components/icons/RBrand' import RiskIcon from 'components/icons/RiskIcon' import { useMemo } from 'react' -import { Box, BoxProps, Card, Flex, Link, Text } from 'theme-ui' -const Brand = (props: BoxProps) => { +const Brand = ({ className }: { className?: string }) => { return ( - - + ) } @@ -32,15 +22,13 @@ const Section = ({ title: string description: React.ReactNode }) => ( - - +
+
- - {title} - - + {title} +
{description} - +
) const Risks = () => { @@ -49,55 +37,64 @@ const Risks = () => { { title: t`Reserve Protocol Smart-Contract Risk`, description: ( - - Because the Reserve protocol is built using smart contracts, it’s +

+ Because the Reserve protocol is built using smart contracts, it's possible that undiscovered bugs or vulnerabilities in these contracts could be exploited, resulting in loss of user funds. - Accordingly, the protocol’s contracts undergo{' '} - regular and rigorous security audits. - - + +

), }, { title: 'Collateral Plugin Wrappers', description: ( - +

There are a{' '} - + handful of risks - {' '} - associated with any given RToken’s collateral assets, including - assets’ redeemability, the health of their reserves, price + {' '} + 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). - +

), }, { title: 'Governance', description: ( - +

Because RTokens are governed in a decentralized manner by those - staking their RSR on the RToken, the possibility of “governance - attacks” exists. While{' '} - undesirable governance outcomes - {' '} - are possible, the protocol’s design ensures that there is sufficient + {' '} + are possible, the protocol's design ensures that there is sufficient incentivisation for responsible, balanced governance decisions. Built-in delays throughout the governance cycle also provide additional layers of security. Nevertheless, research on a specific - RToken’s governance structure is strongly recommended. - + RToken's governance structure is strongly recommended. +

), }, ], @@ -105,34 +102,31 @@ const Risks = () => { ) return ( - - +
+
- + Other Risks - - + +
{content.map((item, index) => (
))} - +
- + This list is not intended to be conclusive.{' '} - You can read more about risk in the Reserve docs. - - - - + + +
+
) } diff --git a/src/views/yield-dtf/overview/components/backing/TokenExposure.tsx b/src/views/yield-dtf/overview/components/backing/token-exposure.tsx similarity index 56% rename from src/views/yield-dtf/overview/components/backing/TokenExposure.tsx rename to src/views/yield-dtf/overview/components/backing/token-exposure.tsx index f30a84a9f..06f5efe42 100644 --- a/src/views/yield-dtf/overview/components/backing/TokenExposure.tsx +++ b/src/views/yield-dtf/overview/components/backing/token-exposure.tsx @@ -1,7 +1,7 @@ import { Trans } from '@lingui/macro' -import { Button } from 'components' -import CopyValue from '@/components/old/button/CopyValue' -import GoTo from '@/components/old/button/GoTo' +import { Button } from '@/components/ui/button' +import CopyValue from '@/components/ui/copy-value' +import GoTo from '@/components/ui/go-to' import BluechipLogo from 'components/icons/BluechipIcon' import CirclesIcon from 'components/icons/CirclesIcon' import HiperlinkIcon from 'components/icons/HiperlinkIcon' @@ -11,12 +11,10 @@ import Skeleton from 'react-loading-skeleton' import { chainIdAtom } from 'state/atoms' import { collateralsMetadataAtom } from 'state/cms/atoms' import { rTokenCollateralDetailedAtom } from 'state/rtoken/atoms/rTokenBackingDistributionAtom' -import { Box, Card, Text } from 'theme-ui' import { shortenAddress } from 'utils' import { ExplorerDataType, getExplorerLink } from 'utils/getExplorerLink' -import VerticalDivider from '@/views/discover/components/yield/components/VerticalDivider' -interface TokenExposure { +interface TokenExposureData { symbol: string distribution: number rating?: string @@ -35,7 +33,7 @@ const dataAtom = atom((get) => { return null } - const tokenDetails: Record = {} + const tokenDetails: Record = {} for (const collateral of collaterals) { const meta = metadata[collateral.symbol.toLowerCase().replace('-vault', '')] @@ -85,90 +83,76 @@ const TokenExposure = () => { const data = useAtomValue(dataAtom) return ( - - +
+
- + Underlying Token Exposure - - + +
{!data && } - {data?.map((data) => ( - ( +
- - - - {data.distribution.toFixed(2)}% - - - {data.symbol} - - - - {data.description} - - +
+ + + {item.distribution.toFixed(2)}% + + {item.symbol} +
+

{item.description}

+
- {!!data.rating && ( + {!!item.rating && ( )} - - {!!data.address && ( - - - {!!data.address && shortenAddress(data.address)} - - +
+ {!!item.address && ( +
+ + {!!item.address && shortenAddress(item.address)} + + - +
)} - - +
+
))} - +
) } diff --git a/src/views/yield-dtf/overview/components/charts/APYChart.tsx b/src/views/yield-dtf/overview/components/charts/apy-chart.tsx similarity index 93% rename from src/views/yield-dtf/overview/components/charts/APYChart.tsx rename to src/views/yield-dtf/overview/components/charts/apy-chart.tsx index ce03008b9..600254000 100644 --- a/src/views/yield-dtf/overview/components/charts/APYChart.tsx +++ b/src/views/yield-dtf/overview/components/charts/apy-chart.tsx @@ -1,16 +1,14 @@ import { t } from '@lingui/macro' import AreaChart from 'components/charts/area/AreaChart' -import TabMenu from 'components/tab-menu' import dayjs from 'dayjs' import { gql } from 'graphql-request' -import useQuery, { useMultiFetch } from 'hooks/useQuery' +import useQuery, { useMultiFetch } from 'hooks/use-query' import useRToken from 'hooks/useRToken' import useTimeFrom from 'hooks/useTimeFrom' import { useAtomValue } from 'jotai' import { useMemo, useState } from 'react' import { estimatedApyAtom, rsrPriceAtom, rTokenPriceAtom } from 'state/atoms' import { symbolMap } from 'state/updaters/CollateralYieldUpdater' -import { Box, BoxProps } from 'theme-ui' import { formatPercentage, getUTCStartOfDay } from 'utils' import { ChainId } from 'utils/chains' import { TIME_RANGES } from 'utils/constants' @@ -78,7 +76,7 @@ type APYOptions = (typeof APY_OPTIONS)[number]['key'] const today = getUTCStartOfDay(Date.now() / 1000) -const APYChart = (props: BoxProps) => { +const APYChart = ({ className }: { className?: string }) => { const rToken = useRToken() const rsrPrice = useAtomValue(rsrPriceAtom) const rTokenPrice = useAtomValue(rTokenPriceAtom) @@ -304,20 +302,8 @@ const APYChart = (props: BoxProps) => { }} currentRange={current} onRangeChange={handleChange} - sx={{ - backgroundColor: 'backgroundNested', - borderRadius: '16px', - border: '12px solid', - borderColor: 'backgroundNested', - }} + className={className} moreActions={ - // - // setSelectedOption(key as APYOptions)} - // /> - // { filename={`${rToken?.symbol}-historical-apy-${current}.csv`} /> } - {...props} /> ) } diff --git a/src/views/yield-dtf/overview/components/charts/index.tsx b/src/views/yield-dtf/overview/components/charts/index.tsx index b3f4e4ace..5b1e05a4f 100644 --- a/src/views/yield-dtf/overview/components/charts/index.tsx +++ b/src/views/yield-dtf/overview/components/charts/index.tsx @@ -1,15 +1,15 @@ -import APYChart from './APYChart' -import PriceChart from './PriceChart' -import StakingChart from './StakingChart' -import SupplyChart from './SupplyChart' +import APYChart from './apy-chart' +import PriceChart from './price-chart' +import StakingChart from './staking-chart' +import SupplyChart from './supply-chart' const HistoricalCharts = () => { return (
- - - - + + + +
) } diff --git a/src/views/yield-dtf/overview/components/charts/PriceChart.tsx b/src/views/yield-dtf/overview/components/charts/price-chart.tsx similarity index 92% rename from src/views/yield-dtf/overview/components/charts/PriceChart.tsx rename to src/views/yield-dtf/overview/components/charts/price-chart.tsx index a2ba0407c..7aeba657f 100644 --- a/src/views/yield-dtf/overview/components/charts/PriceChart.tsx +++ b/src/views/yield-dtf/overview/components/charts/price-chart.tsx @@ -3,13 +3,12 @@ import AreaChart from 'components/charts/area/AreaChart' import TabMenu from 'components/tab-menu' import dayjs from 'dayjs' import { gql } from 'graphql-request' -import useQuery from 'hooks/useQuery' +import useQuery from 'hooks/use-query' import useRToken from 'hooks/useRToken' import useTimeFrom from 'hooks/useTimeFrom' import { useAtomValue } from 'jotai' import { useEffect, useMemo, useState } from 'react' import { rTokenPriceAtom } from 'state/atoms' -import { Box, BoxProps } from 'theme-ui' import { formatCurrency } from 'utils' import { TIME_RANGES } from 'utils/constants' import ExportCSVButton from './ExportCSVButton' @@ -52,7 +51,7 @@ const PRICE_OPTIONS = [ }, ] -const PriceChart = (props: BoxProps) => { +const PriceChart = ({ className }: { className?: string }) => { const rToken = useRToken() const [current, setCurrent] = useState(TIME_RANGES.MONTH) const [currentPrice, setCurrentPrice] = useState<'ETH' | 'USD'>('USD') @@ -137,14 +136,9 @@ const PriceChart = (props: BoxProps) => { domain={['auto', 'auto']} currentRange={current} onRangeChange={handleChange} - sx={{ - backgroundColor: 'backgroundNested', - borderRadius: '16px', - border: '12px solid', - borderColor: 'backgroundNested', - }} + className={className} moreActions={ - +
{rToken?.targetUnits === 'ETH' && ( { rows={data?.token?.snapshots || []} filename={`${rToken?.symbol}-historical-price-${current}.csv`} /> - +
} - {...props} /> ) } diff --git a/src/views/yield-dtf/overview/components/charts/StakingChart.tsx b/src/views/yield-dtf/overview/components/charts/staking-chart.tsx similarity index 90% rename from src/views/yield-dtf/overview/components/charts/StakingChart.tsx rename to src/views/yield-dtf/overview/components/charts/staking-chart.tsx index 6ff6d0a2e..ea463e0d5 100644 --- a/src/views/yield-dtf/overview/components/charts/StakingChart.tsx +++ b/src/views/yield-dtf/overview/components/charts/staking-chart.tsx @@ -2,13 +2,12 @@ import { t } from '@lingui/macro' import AreaChart from 'components/charts/area/AreaChart' import dayjs from 'dayjs' import { gql } from 'graphql-request' -import useQuery from 'hooks/useQuery' +import useQuery from 'hooks/use-query' import useRToken from 'hooks/useRToken' import useTimeFrom from 'hooks/useTimeFrom' import { useAtomValue } from 'jotai' import { useMemo, useState } from 'react' import { rsrPriceAtom } from 'state/atoms' -import { BoxProps } from 'theme-ui' import { formatCurrency } from 'utils' import { TIME_RANGES } from 'utils/constants' import { formatEther } from 'viem' @@ -39,7 +38,7 @@ const dailyPriceQuery = gql` } ` -const StakingChart = (props: BoxProps) => { +const StakingChart = ({ className }: { className?: string }) => { const rToken = useRToken() const rsrPrice = useAtomValue(rsrPriceAtom) const [current, setCurrent] = useState(TIME_RANGES.MONTH) @@ -101,12 +100,7 @@ const StakingChart = (props: BoxProps) => { timeRange={TIME_RANGES} currentRange={current} onRangeChange={handleChange} - sx={{ - backgroundColor: 'backgroundNested', - borderRadius: '16px', - border: '12px solid', - borderColor: 'backgroundNested', - }} + className={className} moreActions={ { filename={`${rToken?.symbol}-historical-staking-${current}.csv`} /> } - {...props} /> ) } diff --git a/src/views/yield-dtf/overview/components/charts/SupplyChart.tsx b/src/views/yield-dtf/overview/components/charts/supply-chart.tsx similarity index 90% rename from src/views/yield-dtf/overview/components/charts/SupplyChart.tsx rename to src/views/yield-dtf/overview/components/charts/supply-chart.tsx index 430e2f616..2139117d2 100644 --- a/src/views/yield-dtf/overview/components/charts/SupplyChart.tsx +++ b/src/views/yield-dtf/overview/components/charts/supply-chart.tsx @@ -2,13 +2,12 @@ import { t } from '@lingui/macro' import AreaChart from 'components/charts/area/AreaChart' import dayjs from 'dayjs' import { gql } from 'graphql-request' -import useQuery from 'hooks/useQuery' +import useQuery from 'hooks/use-query' import useRToken from 'hooks/useRToken' import useTimeFrom from 'hooks/useTimeFrom' import { useAtomValue } from 'jotai' import { useMemo, useState } from 'react' import { rTokenStateAtom } from 'state/atoms' -import { BoxProps } from 'theme-ui' import { formatCurrency } from 'utils' import { TIME_RANGES } from 'utils/constants' import { formatEther } from 'viem' @@ -39,7 +38,7 @@ const dailyPriceQuery = gql` } ` -const SupplyChart = (props: BoxProps) => { +const SupplyChart = ({ className }: { className?: string }) => { const rToken = useRToken() const { tokenSupply: supply } = useAtomValue(rTokenStateAtom) const [current, setCurrent] = useState(TIME_RANGES.MONTH) @@ -89,12 +88,7 @@ const SupplyChart = (props: BoxProps) => { timeRange={TIME_RANGES} currentRange={current} onRangeChange={handleChange} - sx={{ - backgroundColor: 'backgroundNested', - borderRadius: '16px', - border: '12px solid', - borderColor: 'backgroundNested', - }} + className={className} moreActions={ { filename={`${rToken?.symbol}-historical-supply-${current}.csv`} /> } - {...props} /> ) } diff --git a/src/views/yield-dtf/overview/components/CollateralPieChartTooltip.tsx b/src/views/yield-dtf/overview/components/collateral-pie-chart-tooltip.tsx similarity index 61% rename from src/views/yield-dtf/overview/components/CollateralPieChartTooltip.tsx rename to src/views/yield-dtf/overview/components/collateral-pie-chart-tooltip.tsx index 51a7b6241..21f836398 100644 --- a/src/views/yield-dtf/overview/components/CollateralPieChartTooltip.tsx +++ b/src/views/yield-dtf/overview/components/collateral-pie-chart-tooltip.tsx @@ -8,7 +8,6 @@ import { useAtomValue } from 'jotai' import { FC, memo, useMemo } from 'react' import { rsrPriceAtom } from 'state/atoms' import { collateralsMetadataAtom } from 'state/cms/atoms' -import { Box, Card, Divider, Grid, Text } from 'theme-ui' import { formatCurrency } from 'utils' type ItemProps = { @@ -23,34 +22,15 @@ type CollateralPieChartTooltipProps = { const Item: FC = ({ logo, name, value }) => { return ( - - - +
+
+
- {name} - - {value.toFixed(0)}% - - + {name} +
+ {value.toFixed(0)}% +
+
) } @@ -154,31 +134,13 @@ const CollateralPieChartTooltip: FC = ({ ) return ( - - - +
+
+
- {t`Collateral(s)`} - - + {t`Collateral(s)`} +
+
{collateralItems.map((item) => ( = ({ value={item.value} /> ))} - - - - +
+
+
+
- {t`Token exposure`} - - + {t`Token exposure`} +
+
{tokenItems.map((item) => ( = ({ value={item.value} /> ))} - - - - +
+
+
+
- {t`Platform exposure`} - - + {t`Platform exposure`} +
+
{platformItems.map((item) => ( = ({ value={item.value} /> ))} - - - - - +
+
+
+
+
- - +
+ {t`Staked RSR Overcollateralisation`} - - + + {token.overcollaterization.toFixed(0)}% - - - - ${rsrUSD} - - + +
+
+ ${rsrUSD} +
+
) } diff --git a/src/views/yield-dtf/overview/components/collateral-pie-chart-wrapper.tsx b/src/views/yield-dtf/overview/components/collateral-pie-chart-wrapper.tsx new file mode 100644 index 000000000..92ca7165c --- /dev/null +++ b/src/views/yield-dtf/overview/components/collateral-pie-chart-wrapper.tsx @@ -0,0 +1,126 @@ +import { cn } from '@/lib/utils' +import { + Tooltip, + TooltipContent, + TooltipTrigger, +} from '@/components/ui/tooltip' +import { t } from '@lingui/macro' +import ChevronRight from 'components/icons/ChevronRight' +import CircleIcon from 'components/icons/CircleIcon' +import CollaterizationIcon from 'components/icons/CollaterizationIcon' +import HelpIcon from 'components/icons/CustomHelpIcon' +import { ListedToken } from 'hooks/useTokenList' +import { useAtomValue } from 'jotai' +import { FC, memo, useMemo, useState } from 'react' +import { collateralsMetadataAtom } from 'state/cms/atoms' +import { stringToColor } from 'utils' +import CollateralPieChart from './collateral-pie-chart' +import CollateralPieChartTooltip from './collateral-pie-chart-tooltip' + +type Props = { + token: ListedToken +} + +const CollateralPieChartWrapper: FC = ({ token }) => { + const [isHovered, setIsHovered] = useState(false) + const metadata = useAtomValue(collateralsMetadataAtom) + + const chartData = useMemo( + () => + token.collaterals.map((c) => { + const cmsCollateral = + metadata?.[c.symbol.toLowerCase().replace('-vault', '')] + return { + name: c.symbol, + value: + +(token.collateralDistribution[c.id.toLowerCase()]?.dist ?? 0) * + 100, + color: cmsCollateral?.color || stringToColor(c.id), + project: cmsCollateral?.protocol?.name || 'GENERIC', + projectColor: cmsCollateral?.protocol?.color || 'gray', + } + }), + [] + ) + + return ( + + +
setIsHovered(true)} + onMouseLeave={() => setIsHovered(false)} + > + + {/* To preserve space */} +
+ +
+
+ + {token.isCollaterized ? ( + {t`Backing`} + ) : ( + Rebalancing + )} +
+
+ {token.isCollaterized && ( + + {token.backing.toFixed(0)}% + + )} + +
+
+
+ } + bottomInformation={ +
+
+ + {t`Staked RSR`} +
+
+ + {token.overcollaterization.toFixed(0)}% + + +
+
+ } + isRebalancing={!token.isCollaterized} + /> +
+
+ + + +
+ ) +} + +export default memo(CollateralPieChartWrapper) diff --git a/src/views/yield-dtf/overview/components/CollateralPieChart.tsx b/src/views/yield-dtf/overview/components/collateral-pie-chart.tsx similarity index 90% rename from src/views/yield-dtf/overview/components/CollateralPieChart.tsx rename to src/views/yield-dtf/overview/components/collateral-pie-chart.tsx index de5ee67de..8e78e3e8f 100644 --- a/src/views/yield-dtf/overview/components/CollateralPieChart.tsx +++ b/src/views/yield-dtf/overview/components/collateral-pie-chart.tsx @@ -1,11 +1,11 @@ +import { cn } from '@/lib/utils' import TokenLogo from 'components/icons/TokenLogo' import React, { FC, ReactNode, useMemo } from 'react' import { Cell, Pie, PieChart, Tooltip } from 'recharts' import { colors } from 'theme' -import { Box, BoxProps } from 'theme-ui' import { formatPercentage } from 'utils' -interface ChartProps extends BoxProps { +interface ChartProps { data: { name: string value: number @@ -19,6 +19,7 @@ interface ChartProps extends BoxProps { bottomInformation?: ReactNode showTooltip?: boolean isRebalancing?: boolean + className?: string } // Value % between 0-100 @@ -54,7 +55,7 @@ const CollateralChart: FC = ({ bottomInformation, showTooltip = false, isRebalancing = false, - ...props + className, }) => { const filteredData = useMemo( () => @@ -64,20 +65,18 @@ const CollateralChart: FC = ({ [data] ) return ( - +
{topInformation} - - +
+
- - +
+
= ({ {...getAngles(staked)} /> - - +
+
{bottomInformation} -
+
) } diff --git a/src/views/yield-dtf/overview/components/hero/TokenInfo.tsx b/src/views/yield-dtf/overview/components/hero/TokenInfo.tsx deleted file mode 100644 index 5897ab6a9..000000000 --- a/src/views/yield-dtf/overview/components/hero/TokenInfo.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import { useAtomValue } from 'jotai' -import { rTokenMetaAtom } from 'state/rtoken/atoms/rTokenAtom' -import { Box, Grid, Text } from 'theme-ui' -import { CurrentRTokenLogo } from 'components/icons/TokenLogo' -import TokenAddresses from './TokenAddresses' - -const TokenName = () => { - const rToken = useAtomValue(rTokenMetaAtom) - - return ( - - - - {rToken?.name ?? ''} - - - ({rToken?.symbol ?? ''}) - - - ) -} - -const TokenInfo = () => { - return ( - - - - - ) -} - -export default TokenInfo diff --git a/src/views/yield-dtf/overview/components/hero/index.tsx b/src/views/yield-dtf/overview/components/hero/index.tsx index 1ceb86d45..e929a15cf 100644 --- a/src/views/yield-dtf/overview/components/hero/index.tsx +++ b/src/views/yield-dtf/overview/components/hero/index.tsx @@ -1,26 +1,15 @@ -import { Box, Grid } from 'theme-ui' -import TokenInfo from './TokenInfo' -import TokenMandate from './TokenMandate' -import TokenStats from './TokenStats' +import TokenInfo from './token-info' +import TokenMandate from './token-mandate' +import TokenStats from './token-stats' const Hero = () => ( - +
- +
- - +
+
) export default Hero diff --git a/src/views/yield-dtf/overview/components/hero/OverviewActions.tsx b/src/views/yield-dtf/overview/components/hero/overview-actions.tsx similarity index 69% rename from src/views/yield-dtf/overview/components/hero/OverviewActions.tsx rename to src/views/yield-dtf/overview/components/hero/overview-actions.tsx index 8e2b6ce58..8f9fc9426 100644 --- a/src/views/yield-dtf/overview/components/hero/OverviewActions.tsx +++ b/src/views/yield-dtf/overview/components/hero/overview-actions.tsx @@ -1,18 +1,21 @@ -import { Trans } from '@lingui/macro' -import { Button } from 'components' +import { Button } from '@/components/ui/button' +import { + Popover, + PopoverContent, + PopoverTrigger, +} from '@/components/ui/popover' import DgnETHButtonAppendix from '@/components/utils/integrations/dgneth-btn-appendix' -import Popup from '@/components/old/popup' +import { ChainId } from '@/utils/chains' +import { Trans } from '@lingui/macro' import useRToken from 'hooks/useRToken' import { atom, useAtomValue } from 'jotai' -import { useState } from 'react' import { MoreHorizontal } from 'lucide-react' +import { useState } from 'react' import { useNavigate } from 'react-router-dom' import { estimatedApyAtom, rTokenListAtom } from 'state/atoms' import { rTokenMetaAtom } from 'state/rtoken/atoms/rTokenAtom' -import { Box, Card, Link } from 'theme-ui' import { formatCurrency } from 'utils' import { ROUTES } from 'utils/constants' -import { ChainId } from '@/utils/chains' interface Socials { label: string @@ -29,10 +32,9 @@ const tokenSocialsAtom = atom((get) => { const socials: Socials[] = [] - // TODO: Currently only doing X/Website as those are the only applicable for current listed rtokens if (tokenList[token.address].social?.twitter) { socials.push({ - label: 'X', + label: 'Twitter', href: tokenList[token.address].social?.twitter ?? '', }) } @@ -58,26 +60,20 @@ const SocialList = ({ socials: Socials[] onClick(): void }) => ( - +
{socials.map((social) => ( - {social.label} - + ))} - +
) const TokenSocials = () => { @@ -90,50 +86,39 @@ const TokenSocials = () => { } return ( - setVisible(false)} - content={ + + + + + setVisible(false)} /> - } - > - - + + ) } const OverviewActions = () => { const rToken = useRToken() const navigate = useNavigate() - // TODO: Grab this from theGraph? const { holders, stakers, basket } = useAtomValue(estimatedApyAtom) return ( - +
{rToken?.chainId !== ChainId.Arbitrum && ( - +
) } diff --git a/src/views/yield-dtf/overview/components/hero/TokenAddresses.tsx b/src/views/yield-dtf/overview/components/hero/token-addresses.tsx similarity index 54% rename from src/views/yield-dtf/overview/components/hero/TokenAddresses.tsx rename to src/views/yield-dtf/overview/components/hero/token-addresses.tsx index e17adddb6..3034b3438 100644 --- a/src/views/yield-dtf/overview/components/hero/TokenAddresses.tsx +++ b/src/views/yield-dtf/overview/components/hero/token-addresses.tsx @@ -1,14 +1,18 @@ -import CopyValue from '@/components/old/button/CopyValue' -import GoTo from '@/components/old/button/GoTo' +import CopyValue from '@/components/ui/copy-value' +import GoTo from '@/components/ui/go-to' +import { + Popover, + PopoverContent, + PopoverTrigger, +} from '@/components/ui/popover' +import { cn } from '@/lib/utils' import ChainLogo from 'components/icons/ChainLogo' import StackedChainLogo from 'components/icons/StackedChainLogo' -import Popup from '@/components/old/popup' import { useAtomValue } from 'jotai' -import { useMemo, useState } from 'react' import { ChevronDown } from 'lucide-react' +import { useMemo, useState } from 'react' import { chainIdAtom, selectedRTokenAtom } from 'state/atoms' import { rTokenMetaAtom } from 'state/rtoken/atoms/rTokenAtom' -import { Box, Text } from 'theme-ui' import { shortenAddress } from 'utils' import { AvailableChain } from 'utils/chains' import { BRIDGED_RTOKENS } from 'utils/constants' @@ -30,27 +34,26 @@ const BridgeTokenList = () => { }, [current, chainId]) return ( - +
{tokenAddresses.map((token, i) => ( - 0 && 'mt-2')} key={token.address} > - {shortenAddress(token.address)} + {shortenAddress(token.address)} - +
))} -
+
) } @@ -73,44 +76,39 @@ const TokenAddresses = () => { const isBridged = availableChains.length > 1 return ( - setVisible(false)} - content={} - placement="auto-start" - > - isBridged && setVisible(!isVisible)} - > - - - {!!rToken && shortenAddress(rToken.address)} - - {isBridged && } - {!isBridged && rToken && ( - <> - - - - )} - - + + +
isBridged && setVisible(!isVisible)} + > + + + {!!rToken && shortenAddress(rToken.address)} + + {isBridged && } + {!isBridged && rToken && ( + <> + + + + )} +
+
+ + + +
) } export default TokenAddresses diff --git a/src/views/yield-dtf/overview/components/hero/token-info.tsx b/src/views/yield-dtf/overview/components/hero/token-info.tsx new file mode 100644 index 000000000..f25a81b22 --- /dev/null +++ b/src/views/yield-dtf/overview/components/hero/token-info.tsx @@ -0,0 +1,29 @@ +import { CurrentRTokenLogo } from 'components/icons/TokenLogo' +import { useAtomValue } from 'jotai' +import { rTokenMetaAtom } from 'state/rtoken/atoms/rTokenAtom' +import TokenAddresses from './token-addresses' + +const TokenName = () => { + const rToken = useAtomValue(rTokenMetaAtom) + + return ( +
+ + {rToken?.name ?? ''} + + ({rToken?.symbol ?? ''}) + +
+ ) +} + +const TokenInfo = () => { + return ( +
+ + +
+ ) +} + +export default TokenInfo diff --git a/src/views/yield-dtf/overview/components/hero/TokenMandate.tsx b/src/views/yield-dtf/overview/components/hero/token-mandate.tsx similarity index 55% rename from src/views/yield-dtf/overview/components/hero/TokenMandate.tsx rename to src/views/yield-dtf/overview/components/hero/token-mandate.tsx index 4953b2e59..4ac6b37a7 100644 --- a/src/views/yield-dtf/overview/components/hero/TokenMandate.tsx +++ b/src/views/yield-dtf/overview/components/hero/token-mandate.tsx @@ -5,7 +5,6 @@ import { useAtomValue } from 'jotai' import { useState } from 'react' import Skeleton from 'react-loading-skeleton' import { rTokenListAtom } from 'state/atoms' -import { Box, Text } from 'theme-ui' const OffChainNote = () => { const rToken = useRToken() @@ -17,22 +16,18 @@ const OffChainNote = () => { } return ( - - + setExpanded(!expanded)} > {expanded ? '-' : '+'} Description - + {expanded && ( - - {rTokenList[rToken.address]?.about} - +

{rTokenList[rToken.address]?.about}

)} -
+ ) } @@ -40,28 +35,16 @@ const TokenMandate = () => { const rToken = useRToken() return ( - +
- + Governor mandate - - + +

{rToken?.mandate ? rToken.mandate : } - +

- +
) } diff --git a/src/views/yield-dtf/overview/components/hero/TokenStats.tsx b/src/views/yield-dtf/overview/components/hero/token-stats.tsx similarity index 64% rename from src/views/yield-dtf/overview/components/hero/TokenStats.tsx rename to src/views/yield-dtf/overview/components/hero/token-stats.tsx index cdc51f044..6787ad35a 100644 --- a/src/views/yield-dtf/overview/components/hero/TokenStats.tsx +++ b/src/views/yield-dtf/overview/components/hero/token-stats.tsx @@ -1,11 +1,10 @@ +import { rTokenTargetPriceAtom } from '@/views/yield-dtf/overview/atoms' import { Trans } from '@lingui/macro' import StakedIcon from 'components/icons/StakedIcon' import { atom, useAtomValue } from 'jotai' import { rTokenPriceAtom, rTokenStateAtom, rsrPriceAtom } from 'state/atoms' -import { Box, Text } from 'theme-ui' import { formatCurrency } from 'utils' -import OverviewActions from './OverviewActions' -import { rTokenTargetPriceAtom } from '@/views/yield-dtf/overview/atoms' +import OverviewActions from './overview-actions' const rTokenOverviewAtom = atom((get) => { const state = get(rTokenStateAtom) @@ -29,45 +28,42 @@ const TokenMetrics = () => { return ( <> - + Total Market Cap - + {data?.pegData ? ( - - +
+

{formatCurrency(data.pegData.supply, 0)} {data.pegData.unit} - - +

+ (${formatCurrency(data?.supply ?? 0, 0)}) - - + +
) : ( - +

${formatCurrency(data?.supply ?? 0, 0)} - +

)} - +
- + Stake pool USD value: - - + + ${formatCurrency(data?.staked ?? 0, 0)} - - + +
) } const TokenStats = () => ( - +
- +
) export default TokenStats diff --git a/src/views/yield-dtf/overview/components/HistoricalMetrics.tsx b/src/views/yield-dtf/overview/components/historical-metrics.tsx similarity index 58% rename from src/views/yield-dtf/overview/components/HistoricalMetrics.tsx rename to src/views/yield-dtf/overview/components/historical-metrics.tsx index 41b6a8e83..1d506a111 100644 --- a/src/views/yield-dtf/overview/components/HistoricalMetrics.tsx +++ b/src/views/yield-dtf/overview/components/historical-metrics.tsx @@ -1,31 +1,24 @@ import { Trans } from '@lingui/macro' -import { Suspense, lazy } from 'react' import { TrendingUp } from 'lucide-react' +import { Suspense, lazy } from 'react' import Skeleton from 'react-loading-skeleton' -import { Box, Card, Text } from 'theme-ui' const Charts = lazy(() => import('./charts')) const HistoricalMetrics = () => ( - - +
+
- +

Historical metrics - - - +

+
+
}> - - +
+
) export default HistoricalMetrics diff --git a/src/views/yield-dtf/overview/components/RTokenAddresses.tsx b/src/views/yield-dtf/overview/components/rtoken-addresses.tsx similarity index 56% rename from src/views/yield-dtf/overview/components/RTokenAddresses.tsx rename to src/views/yield-dtf/overview/components/rtoken-addresses.tsx index c54b93e07..a8a056663 100644 --- a/src/views/yield-dtf/overview/components/RTokenAddresses.tsx +++ b/src/views/yield-dtf/overview/components/rtoken-addresses.tsx @@ -1,17 +1,20 @@ -import CopyValue from '@/components/old/button/CopyValue' +import CopyValue from '@/components/ui/copy-value' +import { + Popover, + PopoverContent, + PopoverTrigger, +} from '@/components/ui/popover' import BridgeMinimalistIcon from 'components/icons/BridgeMinimalistIcon' import ChainLogo from 'components/icons/ChainLogo' -import Popup from '@/components/old/popup' import { ListedToken } from 'hooks/useTokenList' -import { FC, memo, useMemo, useState } from 'react' import { ArrowUpRight, ChevronDown, ChevronUp } from 'lucide-react' +import { FC, memo, useMemo, useState } from 'react' import { colors } from 'theme' -import { Box, BoxProps, Link, Text } from 'theme-ui' import { shortenString } from 'utils' import { BRIDGED_RTOKENS, CHAIN_TAGS } from 'utils/constants' import { ExplorerDataType, getExplorerLink } from 'utils/getExplorerLink' -interface Props extends BoxProps { +interface Props { token: ListedToken } @@ -29,33 +32,32 @@ const RTokenAddressItem: FC = ({ withChain = false, }) => { return ( - +
{withChain && } - +
{withChain && ( - - +
+ {`${CHAIN_TAGS[chain]}`} - + {isBridged && } - +
)} - - {shortenString(address)} - -
- + {shortenString(address)} +
+
- e.stopPropagation()} > - - - + +
+
) } @@ -63,17 +65,7 @@ const RTokenAddressesList: FC<{ tokenList: RTokenAddressItemProps[] }> = ({ tokenList, }) => { return ( - +
{tokenList.map((t) => ( = ({ withChain /> ))} - +
) } @@ -109,32 +101,27 @@ const RTokenAddresses: FC = ({ token }) => { } return ( - setVisible(false)} - placement="bottom" - zIndex={0} - content={} - > - { - e.stopPropagation() - setVisible(!isVisible) - }} - > - {isVisible ? ( - - ) : ( - - )} - - - + + +
{ + e.stopPropagation() + setVisible(!isVisible) + }} + > + {isVisible ? ( + + ) : ( + + )} + +
+
+ + + +
) } diff --git a/src/views/yield-dtf/overview/components/RTokenEarn.tsx b/src/views/yield-dtf/overview/components/rtoken-earn.tsx similarity index 77% rename from src/views/yield-dtf/overview/components/RTokenEarn.tsx rename to src/views/yield-dtf/overview/components/rtoken-earn.tsx index fab7cf7e5..11b018143 100644 --- a/src/views/yield-dtf/overview/components/RTokenEarn.tsx +++ b/src/views/yield-dtf/overview/components/rtoken-earn.tsx @@ -4,7 +4,6 @@ import useRToken from 'hooks/useRToken' import { atom, useAtomValue } from 'jotai' import { selectedRTokenAtom } from 'state/atoms' import { poolsAtom } from 'state/pools/atoms' -import { Box, Text } from 'theme-ui' import PoolsTable from 'views/earn/components/pools-table' const rTokenPoolsAtom = atom((get) => { @@ -33,23 +32,17 @@ const RTokenEarn = () => { const rToken = useRToken() return ( - - +
+
- +

Explore yield opportunities for {rToken?.symbol ?? ''} - - +

+
- +
) } diff --git a/src/views/yield-dtf/overview/components/RTokenTransactions.tsx b/src/views/yield-dtf/overview/components/rtoken-transactions.tsx similarity index 58% rename from src/views/yield-dtf/overview/components/RTokenTransactions.tsx rename to src/views/yield-dtf/overview/components/rtoken-transactions.tsx index 316884041..db0910004 100644 --- a/src/views/yield-dtf/overview/components/RTokenTransactions.tsx +++ b/src/views/yield-dtf/overview/components/rtoken-transactions.tsx @@ -1,17 +1,16 @@ +import DataTable from '@/components/ui/data-table' import { Trans, t } from '@lingui/macro' -import { createColumnHelper } from '@tanstack/react-table' +import { ColumnDef } from '@tanstack/react-table' import ChainLogo from 'components/icons/ChainLogo' import DebankIcon from 'components/icons/DebankIcon' import TransactionsIcon from 'components/icons/TransactionsIcon' -import { Table } from '@/components/old/table' import { gql } from 'graphql-request' -import useQuery from 'hooks/useQuery' +import useQuery from 'hooks/use-query' import { useAtomValue } from 'jotai' import { useMemo } from 'react' import { chainIdAtom, selectedRTokenAtom } from 'state/atoms' import { formatCurrency, - formatUsdCurrencyCell, getCurrentTime, relativeTime, shortenAddress, @@ -67,9 +66,8 @@ const rTokenTransactionsQuery = gql` } ` -const useTransactionColumns = () => { +const useTransactionColumns = (): ColumnDef[] => { const chainId = useAtomValue(chainIdAtom) - const columnHelper = createColumnHelper() const transactionTypes: Record = useMemo( () => ({ MINT: t`Mint`, @@ -90,60 +88,72 @@ const useTransactionColumns = () => { [] ) - return useMemo(() => { - return [ - columnHelper.accessor('type', { + return useMemo( + (): ColumnDef[] => [ + { + accessorKey: 'type', + header: t`Type`, - cell: (data) => ( - - {transactionTypes[data.getValue()] || data.getValue()} - - ), - }), - columnHelper.accessor('amount', { + cell: ({ getValue }) => { + const value = getValue() as string + return ( + + {transactionTypes[value] || value} + + ) + }, + }, + { + accessorKey: 'amount', header: t`Amount`, - cell: (data) => { - const parsed = formatEther(data.getValue()) - let symbol = data.row.original.token.symbol + cell: ({ getValue, row }) => { + const parsed = formatEther(getValue() as bigint) + let symbol = row.original.token.symbol if ( - data.row.original.type === 'STAKE' || - data.row.original.type === 'UNSTAKE' || - data.row.original.type === 'WITHDRAW' || - data.row.original.type === 'DEPOSIT' || - data.row.original.type === 'WITHDRAWAL' + row.original.type === 'STAKE' || + row.original.type === 'UNSTAKE' || + row.original.type === 'WITHDRAW' || + row.original.type === 'DEPOSIT' || + row.original.type === 'WITHDRAWAL' ) { symbol = 'RSR' } - return `${formatCurrency(+parsed)} ${symbol}` - }, - }), - columnHelper.accessor('amountUSD', { - header: t`USD Value`, - cell: (data) => { - if (isNaN(+data.getValue())) { - return `$${data.getValue()}` - } - return formatUsdCurrencyCell(data as any) + const amountUSD = row.original.amountUSD + const usdDisplay = isNaN(+amountUSD) + ? `$${amountUSD}` + : `$${formatCurrency(+amountUSD)}` + + return ( +
+ {usdDisplay} + + ({`${formatCurrency(+parsed)} ${symbol}`}) + +
+ ) }, - }), - columnHelper.accessor('id', { - header: t`Chain`, - cell: () => , - }), - columnHelper.accessor('timestamp', { + }, + // { + // accessorKey: 'id', + // header: t`Chain`, + // cell: () => , + // }, + { + accessorKey: 'timestamp', header: t`Time`, - cell: (data) => relativeTime(data.getValue(), getCurrentTime()), - }), - columnHelper.accessor('from.id', { + cell: ({ getValue }) => + relativeTime(getValue() as number, getCurrentTime()), + }, + { + accessorKey: 'from.id', header: t`From`, - cell: (data) => { + cell: ({ getValue, row }) => { const address = - data.row.original.type === 'MINT' || - data.row.original.type === 'ISSUE' - ? data.row.original.to.id - : data.getValue() + row.original.type === 'MINT' || row.original.type === 'ISSUE' + ? row.original.to.id + : (getValue() as string) return (
@@ -159,13 +169,14 @@ const useTransactionColumns = () => {
) }, - }), - columnHelper.accessor('hash', { + }, + { + accessorKey: 'hash', header: t`Tx Hash`, - cell: (data) => ( + cell: ({ getValue }) => ( { rel="noopener noreferrer" className="underline hover:no-underline text-legend" > - {shortenString(data.getValue())} + {shortenString(getValue() as string)} ), - }), - ] - }, [chainId]) + }, + ], + [chainId, transactionTypes] + ) } const TransactionsTable = () => { @@ -189,13 +201,12 @@ const TransactionsTable = () => { const columns = useTransactionColumns() return ( -
) } @@ -205,7 +216,7 @@ const RTokenTransactions = () => {
-

+

Transactions

diff --git a/src/views/yield-dtf/overview/hooks/useTokenMetrics.ts b/src/views/yield-dtf/overview/hooks/useTokenMetrics.ts index 11cdd5ca2..335a5d4f0 100644 --- a/src/views/yield-dtf/overview/hooks/useTokenMetrics.ts +++ b/src/views/yield-dtf/overview/hooks/useTokenMetrics.ts @@ -1,5 +1,5 @@ import { gql } from 'graphql-request' -import useQuery from 'hooks/useQuery' +import useQuery from 'hooks/use-query' import { useAtomValue } from 'jotai' import { useMemo } from 'react' import { rTokenPriceAtom, rsrPriceAtom } from 'state/atoms' diff --git a/src/views/yield-dtf/overview/index.tsx b/src/views/yield-dtf/overview/index.tsx index 0fc78f8cf..56526a62b 100644 --- a/src/views/yield-dtf/overview/index.tsx +++ b/src/views/yield-dtf/overview/index.tsx @@ -1,15 +1,14 @@ -import SectionContainer from 'components/section-navigation/SectionContainer' -import SectionWrapper from 'components/section-navigation/SectionWrapper' +import SectionContainer from '@/components/section-navigation/section-container' +import SectionWrapper from '@/components/section-navigation/section-wrapper' import { useAtomValue } from 'jotai' import mixpanel from 'mixpanel-browser/src/loaders/loader-module-core' import { useEffect } from 'react' import { selectedRTokenAtom } from 'state/atoms' -import { Divider } from 'theme-ui' -import Hero from './components/hero' -import RTokenEarn from './components/RTokenEarn' -import RTokenTransactions from './components/RTokenTransactions' import Backing from './components/backing' -import HistoricalMetrics from './components/HistoricalMetrics' +import Hero from './components/hero' +import HistoricalMetrics from './components/historical-metrics' +import RTokenEarn from './components/rtoken-earn' +import RTokenTransactions from './components/rtoken-transactions' import StargateWarning from './components/StargateWarning' // Move state management of tracking on an separate component to avoid re-renders @@ -27,28 +26,32 @@ const Tracking = () => { return null } +const SectionDivider = () => ( +
+) + /** * RToken Overview * */ const Overview = () => ( - + - + - + - + - + diff --git a/src/views/yield-dtf/settings/components/BackingInfo.tsx b/src/views/yield-dtf/settings/components/BackingInfo.tsx deleted file mode 100644 index e6d55e950..000000000 --- a/src/views/yield-dtf/settings/components/BackingInfo.tsx +++ /dev/null @@ -1,121 +0,0 @@ -import { t, Trans } from '@lingui/macro' -import { InfoItem } from '@/components/old/info-box' -import useRToken from 'hooks/useRToken' -import { useAtomValue } from 'jotai' -import { isModuleLegacyAtom, rTokenConfigurationAtom } from 'state/atoms' -import { Card, Text, Divider } from 'theme-ui' -import { formatCurrency, formatPercentage, parseDuration } from 'utils' - -/** - * View: Settings > Display RToken backing contracts configuration - */ -const BackingInfo = () => { - const rToken = useRToken() - const params = useAtomValue(rTokenConfigurationAtom) - const { auctions: isLegacy, issuance: isIssuanceLegacy } = - useAtomValue(isModuleLegacyAtom) - - const placeholder = 'Loading...' - - return ( - - - Backing Parameters - - - {!isIssuanceLegacy && ( - <> - - - - )} - - - {!isLegacy && ( - - )} - - - - - - - - ) -} - -export default BackingInfo diff --git a/src/views/yield-dtf/settings/components/BasicInfo.tsx b/src/views/yield-dtf/settings/components/BasicInfo.tsx deleted file mode 100644 index bdae6a7b4..000000000 --- a/src/views/yield-dtf/settings/components/BasicInfo.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import { t, Trans } from '@lingui/macro' -import { InfoItem } from '@/components/old/info-box' -import useRToken from 'hooks/useRToken' -import { useAtomValue } from 'jotai' -import { rTokenGovernanceAtom } from 'state/atoms' -import { Card, Text, Divider } from 'theme-ui' -import { shortenAddress } from 'utils' - -/** - * View: Settings > Display RToken basic info - */ -const BasicInfo = () => { - const rToken = useRToken() - const { governor, timelock } = useAtomValue(rTokenGovernanceAtom) - - return ( - - - Token Details - - - - - - - - - - ) -} - -export default BasicInfo diff --git a/src/views/yield-dtf/settings/components/BasketInfo.tsx b/src/views/yield-dtf/settings/components/BasketInfo.tsx deleted file mode 100644 index 620c2dcf8..000000000 --- a/src/views/yield-dtf/settings/components/BasketInfo.tsx +++ /dev/null @@ -1,53 +0,0 @@ -import { Trans } from '@lingui/macro' -import GoTo from '@/components/old/button/GoTo' -import TokenItem from 'components/token-item' -import { useAtomValue } from 'jotai' -import { chainIdAtom, rTokenBasketAtom } from 'state/atoms' -import { Box, BoxProps, Card, Text, Divider } from 'theme-ui' -import { ExplorerDataType, getExplorerLink } from 'utils/getExplorerLink' - -/** - * View: Settings > Display RToken primary basket composition - */ -const BasketInfo = (props: BoxProps) => { - const basket = useAtomValue(rTokenBasketAtom) - const units = Object.keys(basket) - const chainId = useAtomValue(chainIdAtom) - - return ( - - - Primary Basket - - {units.map((unit, unitIndex) => ( - - - - {unit} Basket - - {basket[unit].collaterals.map((collateral, index) => ( - - - {+basket[unit].distribution[index]}% - - - ))} - - ))} - - ) -} - -export default BasketInfo diff --git a/src/views/yield-dtf/settings/components/ContractsInfo.tsx b/src/views/yield-dtf/settings/components/ContractsInfo.tsx deleted file mode 100644 index 68cd02e6a..000000000 --- a/src/views/yield-dtf/settings/components/ContractsInfo.tsx +++ /dev/null @@ -1,85 +0,0 @@ -import { t, Trans } from '@lingui/macro' -import { InfoItem } from '@/components/old/info-box' -import useRToken from 'hooks/useRToken' -import { useAtomValue } from 'jotai' -import { chainIdAtom, rTokenAssetsAtom, rTokenContractsAtom } from 'state/atoms' -import { ContractKey } from 'state/rtoken/atoms/rTokenContractsAtom' -import { BoxProps, Card, Divider, Text } from 'theme-ui' -import { shortenAddress } from 'utils' -import { RSR_ADDRESS } from 'utils/addresses' - -/** - * View: Settings > Display RToken related contracts - */ -const ContractsInfo = (props: BoxProps) => { - const contracts = useAtomValue(rTokenContractsAtom) - const assets = useAtomValue(rTokenAssetsAtom) ?? {} - const rToken = useRToken() - const chainId = useAtomValue(chainIdAtom) - const contractList: [string, ContractKey][] = [ - [t`Main`, 'main'], - [t`Backing Manager`, 'backingManager'], - [t`Basket Handler`, 'basketHandler'], - [t`RToken Trader`, 'rTokenTrader'], - [t`RSR Trader`, 'rsrTrader'], - [t`Broker`, 'broker'], - [t`Asset Registry`, 'assetRegistry'], - [rToken?.stToken?.name ?? t`stRSR Token`, 'stRSR'], - [t`Furnace`, 'furnace'], - [t`Distributor`, 'distributor'], - ] - - return ( - - - Related Contracts - - - {contractList.map(([label, prop], index) => ( - - {shortenAddress(contracts[prop].address)} - - v{contracts[prop].version} - - - ) - } - address={contracts ? contracts[prop]?.address : 'Loading...'} - mt={index ? 3 : 0} - /> - ))} - - {shortenAddress(assets[rToken.address].address)} - - v{assets[rToken.address].version} - - - ) - } - address={assets[rToken?.address ?? '']?.address || ''} - mt={3} - /> - - - ) -} - -export default ContractsInfo diff --git a/src/views/yield-dtf/settings/components/EmergencyCollateralInfo.tsx b/src/views/yield-dtf/settings/components/EmergencyCollateralInfo.tsx deleted file mode 100644 index 57c8b60da..000000000 --- a/src/views/yield-dtf/settings/components/EmergencyCollateralInfo.tsx +++ /dev/null @@ -1,70 +0,0 @@ -import { Trans } from '@lingui/macro' -import GoTo from '@/components/old/button/GoTo' -import DiversityFactorIcon from 'components/icons/DiversityFactorIcon' -import TokenItem from 'components/token-item' -import { useAtomValue } from 'jotai' -import { chainIdAtom, rTokenBackupAtom, rTokenBasketAtom } from 'state/atoms' -import { Box, BoxProps, Card, Flex, Text, Divider } from 'theme-ui' -import { ExplorerDataType, getExplorerLink } from 'utils/getExplorerLink' - -/** - * View: Settings > Display RToken emergency collaterals per target unit - */ -const EmergencyCollateralInfo = (props: BoxProps) => { - const units = Object.keys(useAtomValue(rTokenBasketAtom)) - const backupBasket = useAtomValue(rTokenBackupAtom) - const chainId = useAtomValue(chainIdAtom) - - return ( - - - Emergency Collateral - - {units.map((unit, unitIndex) => ( - - - - {unit} Backups - - {backupBasket && backupBasket[unit]?.collaterals.length ? ( - <> - - - - - Diversity Factor - - - {backupBasket[unit].diversityFactor} - - {backupBasket[unit].collaterals.map((collateral, index) => ( - - - {index + 1} - - - ))} - - ) : ( - - No emergency collateral for this target unit - - )} - - ))} - - ) -} - -export default EmergencyCollateralInfo diff --git a/src/views/yield-dtf/settings/components/GovernanceInfo.tsx b/src/views/yield-dtf/settings/components/GovernanceInfo.tsx deleted file mode 100644 index ecdfc85c4..000000000 --- a/src/views/yield-dtf/settings/components/GovernanceInfo.tsx +++ /dev/null @@ -1,93 +0,0 @@ -import { t, Trans } from '@lingui/macro' -import { InfoItem } from '@/components/old/info-box' -import { useAtomValue } from 'jotai' -import { rTokenGovernanceAtom, secondsPerBlockAtom } from 'state/atoms' -import { BoxProps, Card, Text, Divider } from 'theme-ui' -import { formatPercentage, parseDuration, shortenAddress } from 'utils' -import { isTimeunitGovernance } from '@/views/yield-dtf/governance/utils' - -const getLegend = ( - isTimepoint: boolean, - secondsPerBlock: number, - duration?: string -) => { - const multiplier = isTimepoint ? 1 : secondsPerBlock - const period = parseDuration((Number(duration) || 0) * multiplier) - - if (isTimepoint) { - return period - } - - return period + ` (${duration} blocks)` -} - -/** - * View: Settings > Display RToken governance configuration - */ -const GovernanceInfo = (props: BoxProps) => { - const governance = useAtomValue(rTokenGovernanceAtom) - const secondsPerBlock = useAtomValue(secondsPerBlockAtom) - const isTimeunit = isTimeunitGovernance(governance.name) - - return ( - - - Governance Details - - - - {!!governance.timelock && ( - <> - - - - - - - - )} - {!!governance.governor && ( - - )} - - ) -} - -export default GovernanceInfo diff --git a/src/views/yield-dtf/settings/components/GovernancePrompt.tsx b/src/views/yield-dtf/settings/components/GovernancePrompt.tsx deleted file mode 100644 index e62b06401..000000000 --- a/src/views/yield-dtf/settings/components/GovernancePrompt.tsx +++ /dev/null @@ -1,61 +0,0 @@ -import { Trans } from '@lingui/macro' -import useRToken from 'hooks/useRToken' -import { AlertCircle } from 'lucide-react' -import { useNavigate } from 'react-router-dom' -import { Box, Button, Flex, Text } from 'theme-ui' -import { ROUTES } from 'utils/constants' - -/** - * Display "Configure governance" prompt to owners on settings - * - * ? Only required to finish RToken setup - */ -const GovernancePrompt = () => { - const navigate = useNavigate() - - return ( - - - - - - - Required setup: - - - - Setup Governance - - - - Please complete the required governance configuration to complete - deployment. - - - - - - - ) -} - -export default GovernancePrompt diff --git a/src/views/yield-dtf/settings/components/OtherInfo.tsx b/src/views/yield-dtf/settings/components/OtherInfo.tsx deleted file mode 100644 index e8645ce3a..000000000 --- a/src/views/yield-dtf/settings/components/OtherInfo.tsx +++ /dev/null @@ -1,55 +0,0 @@ -import { t, Trans } from '@lingui/macro' -import { InfoItem } from '@/components/old/info-box' -import { useAtomValue } from 'jotai' -import { rTokenConfigurationAtom } from 'state/atoms' -import { Card, Divider, Text } from 'theme-ui' -import { formatCurrency, parseDuration } from 'utils' - -/** - * View: Settings > Display RToken contracts configuration - */ -const OtherInfo = () => { - const params = useAtomValue(rTokenConfigurationAtom) - - return ( - - - Other Parameters - - - - - - - - - - ) -} - -export default OtherInfo diff --git a/src/views/yield-dtf/settings/components/RTokenManagement.tsx b/src/views/yield-dtf/settings/components/RTokenManagement.tsx deleted file mode 100644 index 4ff04a298..000000000 --- a/src/views/yield-dtf/settings/components/RTokenManagement.tsx +++ /dev/null @@ -1,64 +0,0 @@ -import { Trans } from '@lingui/macro' -import Main from 'abis/Main' -import DocsLink from '@/components/utils/docs-link' -import useRToken from 'hooks/useRToken' -import { useAtomValue } from 'jotai' -import { accountRoleAtom, chainIdAtom } from 'state/atoms' -import { Card, Flex, Text, Divider as _Divider } from 'theme-ui' -import { FACADE_WRITE_ADDRESS } from 'utils/addresses' -import { Address, stringToHex } from 'viem' -import FreezeManager from './FreezeManager' -import GovernancePrompt from './GovernancePrompt' -import PauseManager from './PauseManager' -import { useReadContract } from 'wagmi' - -const Divider = () => <_Divider sx={{ borderColor: 'border' }} my={4} mx={-4} /> - -const useGovernanceSetupRequired = () => { - const rToken = useRToken() - const chainId = useAtomValue(chainIdAtom) - const accountRole = useAtomValue(accountRoleAtom) - - // If the main contract still has OWNER role, then governance setup is pending - const { data } = useReadContract({ - address: rToken?.main as Address, - abi: Main, - functionName: 'hasRole', - chainId, - args: [ - stringToHex('OWNER', { size: 32 }), - FACADE_WRITE_ADDRESS[chainId] as Address, - ], - }) - - return data && !!accountRole?.owner -} - -/** - * Manage RToken - * TODO: Allow owner to edit RToken - */ -const RTokenManagement = () => { - const isGovernanceSetupRequired = useGovernanceSetupRequired() - - if (isGovernanceSetupRequired) { - return - } - - return ( - - - - Roles & Controls - - - - - - - - - ) -} - -export default RTokenManagement diff --git a/src/views/yield-dtf/settings/components/RTokenOverview.tsx b/src/views/yield-dtf/settings/components/RTokenOverview.tsx deleted file mode 100644 index 4e57349dc..000000000 --- a/src/views/yield-dtf/settings/components/RTokenOverview.tsx +++ /dev/null @@ -1,45 +0,0 @@ -import SectionContainer from 'components/section-navigation/SectionContainer' -import SectionWrapper from 'components/section-navigation/SectionWrapper' -import BackingInfo from './BackingInfo' -import BasicInfo from './BasicInfo' -import BasketInfo from './BasketInfo' -import ContractsInfo from './ContractsInfo' -import EmergencyCollateralInfo from './EmergencyCollateralInfo' -import GovernanceInfo from './GovernanceInfo' -import OtherInfo from './OtherInfo' -import RTokenManagement from './RTokenManagement' -import RevenueSplitInfo from './RevenueSplitInfo' - -const RTokenOverview = () => ( - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -) - -export default RTokenOverview diff --git a/src/views/yield-dtf/settings/components/RevenueSplitInfo.tsx b/src/views/yield-dtf/settings/components/RevenueSplitInfo.tsx deleted file mode 100644 index a07a6be86..000000000 --- a/src/views/yield-dtf/settings/components/RevenueSplitInfo.tsx +++ /dev/null @@ -1,67 +0,0 @@ -import { t, Trans } from '@lingui/macro' -import GoTo from '@/components/old/button/GoTo' -import { InfoItem } from '@/components/old/info-box' -import { useAtomValue } from 'jotai' -import { chainIdAtom, rTokenRevenueSplitAtom } from 'state/atoms' -import { Box, BoxProps, Card, Text, Divider } from 'theme-ui' -import { shortenAddress } from 'utils' -import { ExplorerDataType, getExplorerLink } from 'utils/getExplorerLink' - -/** - * View: Settings > Display RToken revenue split (addresses) - */ -const RevenueSplitInfo = (props: BoxProps) => { - const distribution = useAtomValue(rTokenRevenueSplitAtom) - const chainId = useAtomValue(chainIdAtom) - - return ( - - - Revenue Distribution - - - {distribution?.holders || 0}%} - mb={3} - /> - {distribution?.stakers || 0}%} - mb={3} - /> - {!!distribution && - distribution.external.map((dist, index) => ( - - - {shortenAddress(dist.address)} - - - } - right={{dist.total}%} - /> - - RToken/RSR split:{' '} - - {dist.holders}/{dist.stakers} - - - - ))} - - ) -} - -export default RevenueSplitInfo diff --git a/src/views/yield-dtf/settings/components/RolesView.tsx b/src/views/yield-dtf/settings/components/RolesView.tsx deleted file mode 100644 index 02cea7243..000000000 --- a/src/views/yield-dtf/settings/components/RolesView.tsx +++ /dev/null @@ -1,69 +0,0 @@ -import { Trans } from '@lingui/macro' -import GoTo from '@/components/old/button/GoTo' -import Popup from '@/components/old/popup' -import { useAtomValue } from 'jotai' -import { useState } from 'react' -import { chainIdAtom } from 'state/atoms' -import { Box, Card, Text } from 'theme-ui' -import { shortenAddress } from 'utils' -import { ExplorerDataType, getExplorerLink } from 'utils/getExplorerLink' - -const RoleList = ({ roles }: { roles: string[] }) => { - const chainId = useAtomValue(chainIdAtom) - - return ( - - {roles.map((address, index) => ( - - {shortenAddress(address)} - - - ))} - - ) -} - -/** - * View: Settings > Display RToken role list - */ -const RolesView = ({ roles }: { roles: string[] }) => { - const [isVisible, setVisible] = useState(false) - const chainId = useAtomValue(chainIdAtom) - - if (roles.length <= 1) { - return ( - - - {roles[0] ? shortenAddress(roles[0]) : 'None'} - - {!!roles[0] && ( - - )} - - ) - } - - return ( - setVisible(false)} - content={} - > - setVisible(!isVisible)} - > - View - - - ) -} - -export default RolesView diff --git a/src/views/yield-dtf/settings/components/SettingItem.tsx b/src/views/yield-dtf/settings/components/SettingItem.tsx deleted file mode 100644 index 3497081f6..000000000 --- a/src/views/yield-dtf/settings/components/SettingItem.tsx +++ /dev/null @@ -1,72 +0,0 @@ -import { t } from '@lingui/macro' -import { LoadingButton } from '@/components/old/button' -import { Box, Flex, BoxProps, Image, Text } from 'theme-ui' - -interface ItemProps extends BoxProps { - icon?: string - title: string - subtitle: string - value?: string | JSX.Element - action?: string - actionVariant?: string - loading?: boolean - onAction?(): void -} - -const SettingItem = ({ - icon, - title, - subtitle, - value, - action, - actionVariant = 'muted', - loading = false, - onAction, - ...props -}: ItemProps) => { - return ( - - - {!!icon ? ( - - ) : ( - - )} - - {title} - - {subtitle} - {!!value && {value}} - - - - - {!!action && ( - - )} - - - ) -} - -export default SettingItem diff --git a/src/views/yield-dtf/settings/components/backing-info.tsx b/src/views/yield-dtf/settings/components/backing-info.tsx new file mode 100644 index 000000000..312945aca --- /dev/null +++ b/src/views/yield-dtf/settings/components/backing-info.tsx @@ -0,0 +1,86 @@ +import { t } from '@lingui/macro' +import useRToken from '@/hooks/useRToken' +import { useAtomValue } from 'jotai' +import { isModuleLegacyAtom, rTokenConfigurationAtom } from '@/state/atoms' +import { formatCurrency, formatPercentage, parseDuration } from '@/utils' +import { InfoCard, InfoCardItem } from './settings-info-card' + +const BackingInfo = () => { + const rToken = useRToken() + const params = useAtomValue(rTokenConfigurationAtom) + const { auctions: isLegacy, issuance: isIssuanceLegacy } = + useAtomValue(isModuleLegacyAtom) + + return ( + + {!isIssuanceLegacy && ( + <> + + + + )} + + + {!isLegacy && ( + + )} + + + + + + + + ) +} + +export default BackingInfo diff --git a/src/views/yield-dtf/settings/components/basic-info.tsx b/src/views/yield-dtf/settings/components/basic-info.tsx new file mode 100644 index 000000000..2b1f52782 --- /dev/null +++ b/src/views/yield-dtf/settings/components/basic-info.tsx @@ -0,0 +1,40 @@ +import { t, Trans } from '@lingui/macro' +import useRToken from '@/hooks/useRToken' +import { useAtomValue } from 'jotai' +import { rTokenGovernanceAtom } from '@/state/atoms' +import { shortenAddress } from '@/utils' +import { InfoCard, InfoCardItem } from './settings-info-card' + +const BasicInfo = () => { + const rToken = useRToken() + const { governor, timelock } = useAtomValue(rTokenGovernanceAtom) + + return ( + + + + + + + + + ) +} + +export default BasicInfo diff --git a/src/views/yield-dtf/settings/components/basket-info.tsx b/src/views/yield-dtf/settings/components/basket-info.tsx new file mode 100644 index 000000000..62a0518a4 --- /dev/null +++ b/src/views/yield-dtf/settings/components/basket-info.tsx @@ -0,0 +1,49 @@ +import { t, Trans } from '@lingui/macro' +import GoTo from '@/components/go-to' +import TokenItem from '@/components/token-item' +import { useAtomValue } from 'jotai' +import { chainIdAtom, rTokenBasketAtom } from '@/state/atoms' +import { ExplorerDataType, getExplorerLink } from '@/utils/getExplorerLink' +import { InfoCard } from './settings-info-card' + +const BasketInfo = () => { + const basket = useAtomValue(rTokenBasketAtom) + const units = Object.keys(basket) + const chainId = useAtomValue(chainIdAtom) + + return ( + +
+ {units.map((unit, unitIndex) => ( +
+ {unitIndex > 0 &&
} + + {unit} Basket + + {basket[unit].collaterals.map((collateral, index) => ( +
+ + + {+basket[unit].distribution[index]}% + + +
+ ))} +
+ ))} +
+
+ ) +} + +export default BasketInfo diff --git a/src/views/yield-dtf/settings/components/contracts-info.tsx b/src/views/yield-dtf/settings/components/contracts-info.tsx new file mode 100644 index 000000000..840b7c783 --- /dev/null +++ b/src/views/yield-dtf/settings/components/contracts-info.tsx @@ -0,0 +1,71 @@ +import { t } from '@lingui/macro' +import useRToken from '@/hooks/useRToken' +import { useAtomValue } from 'jotai' +import { chainIdAtom, rTokenAssetsAtom, rTokenContractsAtom } from '@/state/atoms' +import { ContractKey } from '@/state/rtoken/atoms/rTokenContractsAtom' +import { shortenAddress } from '@/utils' +import { RSR_ADDRESS } from '@/utils/addresses' +import { InfoCard, InfoCardItem } from './settings-info-card' + +const ContractsInfo = () => { + const contracts = useAtomValue(rTokenContractsAtom) + const assets = useAtomValue(rTokenAssetsAtom) ?? {} + const rToken = useRToken() + const chainId = useAtomValue(chainIdAtom) + const contractList: [string, ContractKey][] = [ + [t`Main`, 'main'], + [t`Backing Manager`, 'backingManager'], + [t`Basket Handler`, 'basketHandler'], + [t`RToken Trader`, 'rTokenTrader'], + [t`RSR Trader`, 'rsrTrader'], + [t`Broker`, 'broker'], + [t`Asset Registry`, 'assetRegistry'], + [rToken?.stToken?.name ?? t`stRSR Token`, 'stRSR'], + [t`Furnace`, 'furnace'], + [t`Distributor`, 'distributor'], + ] + + return ( + + {contractList.map(([label, prop], index) => ( + + {shortenAddress(contracts[prop].address)} + + v{contracts[prop].version} + + + ) + } + address={contracts ? contracts[prop]?.address : undefined} + /> + ))} + + {shortenAddress(assets[rToken.address].address)} + + v{assets[rToken.address].version} + + + ) + } + address={assets[rToken?.address ?? '']?.address || undefined} + /> + + + ) +} + +export default ContractsInfo diff --git a/src/views/yield-dtf/settings/components/emergency-collateral-info.tsx b/src/views/yield-dtf/settings/components/emergency-collateral-info.tsx new file mode 100644 index 000000000..ec0a95e95 --- /dev/null +++ b/src/views/yield-dtf/settings/components/emergency-collateral-info.tsx @@ -0,0 +1,67 @@ +import { t, Trans } from '@lingui/macro' +import GoTo from '@/components/go-to' +import DiversityFactorIcon from '@/components/icons/DiversityFactorIcon' +import TokenItem from '@/components/token-item' +import { useAtomValue } from 'jotai' +import { chainIdAtom, rTokenBackupAtom, rTokenBasketAtom } from '@/state/atoms' +import { ExplorerDataType, getExplorerLink } from '@/utils/getExplorerLink' +import { InfoCard } from './settings-info-card' + +const EmergencyCollateralInfo = () => { + const units = Object.keys(useAtomValue(rTokenBasketAtom)) + const backupBasket = useAtomValue(rTokenBackupAtom) + const chainId = useAtomValue(chainIdAtom) + + return ( + +
+ {units.map((unit, unitIndex) => ( +
+ {unitIndex > 0 &&
} + + {unit} Backups + + {backupBasket && backupBasket[unit]?.collaterals.length ? ( + <> +
+
+ + + Diversity Factor + +
+ + {backupBasket[unit].diversityFactor} + +
+ {backupBasket[unit].collaterals.map((collateral, index) => ( +
+ + {index + 1} + +
+ ))} + + ) : ( + + No emergency collateral for this target unit + + )} +
+ ))} +
+
+ ) +} + +export default EmergencyCollateralInfo diff --git a/src/views/yield-dtf/settings/components/FreezeManager.tsx b/src/views/yield-dtf/settings/components/freeze-manager.tsx similarity index 77% rename from src/views/yield-dtf/settings/components/FreezeManager.tsx rename to src/views/yield-dtf/settings/components/freeze-manager.tsx index b2796bddd..f21107820 100644 --- a/src/views/yield-dtf/settings/components/FreezeManager.tsx +++ b/src/views/yield-dtf/settings/components/freeze-manager.tsx @@ -1,17 +1,16 @@ import { Trans, t } from '@lingui/macro' -import Main from 'abis/Main' -import useContractWrite from 'hooks/useContractWrite' -import useRToken from 'hooks/useRToken' -import useWatchTransaction from 'hooks/useWatchTransaction' +import Main from '@/abis/Main' +import useContractWrite from '@/hooks/useContractWrite' +import useRToken from '@/hooks/useRToken' +import useWatchTransaction from '@/hooks/useWatchTransaction' import { useAtomValue } from 'jotai' import { accountRoleAtom, rTokenManagersAtom, rTokenStateAtom, -} from 'state/atoms' -import { Box, Flex, Text } from 'theme-ui' -import RolesView from './RolesView' -import SettingItem from './SettingItem' +} from '@/state/atoms' +import RolesView from './roles-view' +import SettingItem from './setting-item' const ShortFreeze = () => { const { freezers } = useAtomValue(rTokenManagersAtom) @@ -33,7 +32,7 @@ const ShortFreeze = () => { return ( } @@ -66,7 +65,7 @@ const LongFreeze = () => { return ( } action={isAvailable ? t`Long Freeze` : ''} @@ -77,9 +76,6 @@ const LongFreeze = () => { ) } -/** - * View: Settings > Display RToken actions for freezers and long freezers - */ const FreezeManager = () => { const rToken = useRToken() const accountRole = useAtomValue(accountRoleAtom) @@ -103,31 +99,25 @@ const FreezeManager = () => { subtitle={t`Current status:`} value={isFrozen ? t`Frozen` : t`Not frozen`} icon="freeze" - mb={3} + className="mb-3" action={isAvailable ? t`Unfreeze` : ''} onAction={write} actionVariant="danger" loading={isLoading} /> - - - - +
+
+
+ - There’s two freezing roles that put the system in the same state + There's two freezing roles that put the system in the same state for different durations: - + - - +
+
) } diff --git a/src/views/yield-dtf/settings/components/governance-info.tsx b/src/views/yield-dtf/settings/components/governance-info.tsx new file mode 100644 index 000000000..42a1b7559 --- /dev/null +++ b/src/views/yield-dtf/settings/components/governance-info.tsx @@ -0,0 +1,79 @@ +import { t } from '@lingui/macro' +import { useAtomValue } from 'jotai' +import { rTokenGovernanceAtom, secondsPerBlockAtom } from '@/state/atoms' +import { formatPercentage, parseDuration, shortenAddress } from '@/utils' +import { isTimeunitGovernance } from '@/views/yield-dtf/governance/utils' +import { InfoCard, InfoCardItem } from './settings-info-card' + +const getLegend = ( + isTimepoint: boolean, + secondsPerBlock: number, + duration?: string +) => { + const multiplier = isTimepoint ? 1 : secondsPerBlock + const period = parseDuration((Number(duration) || 0) * multiplier) + + if (isTimepoint) { + return period + } + + return period + ` (${duration} blocks)` +} + +const GovernanceInfo = () => { + const governance = useAtomValue(rTokenGovernanceAtom) + const secondsPerBlock = useAtomValue(secondsPerBlockAtom) + const isTimeunit = isTimeunitGovernance(governance.name) + + return ( + + + {!!governance.timelock && ( + <> + + + + + + + + )} + {!!governance.governor && ( + + )} + + ) +} + +export default GovernanceInfo diff --git a/src/views/yield-dtf/settings/components/governance-prompt.tsx b/src/views/yield-dtf/settings/components/governance-prompt.tsx new file mode 100644 index 000000000..9ce559aa4 --- /dev/null +++ b/src/views/yield-dtf/settings/components/governance-prompt.tsx @@ -0,0 +1,41 @@ +import { Trans } from '@lingui/macro' +import { AlertCircle } from 'lucide-react' +import { useNavigate } from 'react-router-dom' +import { Button } from '@/components/ui/button' +import { ROUTES } from '@/utils/constants' + +const GovernancePrompt = () => { + const navigate = useNavigate() + + return ( +
+
+
+
+ + + Required setup: + +
+

+ Setup Governance +

+

+ + Please complete the required governance configuration to complete + deployment. + +

+ +
+
+
+ ) +} + +export default GovernancePrompt diff --git a/src/views/yield-dtf/settings/components/ListingInfo.tsx b/src/views/yield-dtf/settings/components/listing-info.tsx similarity index 56% rename from src/views/yield-dtf/settings/components/ListingInfo.tsx rename to src/views/yield-dtf/settings/components/listing-info.tsx index 918236c06..b92e52c16 100644 --- a/src/views/yield-dtf/settings/components/ListingInfo.tsx +++ b/src/views/yield-dtf/settings/components/listing-info.tsx @@ -1,32 +1,45 @@ import { t } from '@lingui/macro' -import { InfoBox } from 'components' -import { SmallButton } from '@/components/old/button' -import { Box, BoxProps, Flex } from 'theme-ui' +import { Button } from '@/components/ui/button' +import { cn } from '@/lib/utils' -const ListingInfo = (props: BoxProps) => ( - +interface InfoBoxProps { + title: string + subtitle: string + className?: string +} + +const InfoBox = ({ title, subtitle, className }: InfoBoxProps) => ( +
+ {title} + {subtitle} +
+) + +const ListingInfo = ({ className }: { className?: string }) => ( +
- - + +
@@ -34,7 +47,7 @@ const ListingInfo = (props: BoxProps) => ( title={t`Roles`} subtitle="Please read more about the different roles in Alexios and the Reserve protocol in the documentation." /> -
+
) export default ListingInfo diff --git a/src/views/yield-dtf/settings/components/NavigationSidebar.tsx b/src/views/yield-dtf/settings/components/navigation-sidebar.tsx similarity index 64% rename from src/views/yield-dtf/settings/components/NavigationSidebar.tsx rename to src/views/yield-dtf/settings/components/navigation-sidebar.tsx index dd0ce8241..4385146ab 100644 --- a/src/views/yield-dtf/settings/components/NavigationSidebar.tsx +++ b/src/views/yield-dtf/settings/components/navigation-sidebar.tsx @@ -1,10 +1,9 @@ import { t } from '@lingui/macro' -import Navigation from 'components/section-navigation/Navigation' +import Navigation from '@/components/section-navigation/section-navigation' import { useMemo } from 'react' -import { Box, BoxProps } from 'theme-ui' +import { cn } from '@/lib/utils' -const NavigationSidebar = (props: BoxProps) => { - // TODO: Listen for lang +const NavigationSidebar = ({ className }: { className?: string }) => { const sections = useMemo( () => [ t`Roles & Controls`, @@ -21,9 +20,9 @@ const NavigationSidebar = (props: BoxProps) => { ) return ( - +
- +
) } diff --git a/src/views/yield-dtf/settings/components/other-info.tsx b/src/views/yield-dtf/settings/components/other-info.tsx new file mode 100644 index 000000000..2ba6cfea1 --- /dev/null +++ b/src/views/yield-dtf/settings/components/other-info.tsx @@ -0,0 +1,41 @@ +import { t } from '@lingui/macro' +import { useAtomValue } from 'jotai' +import { rTokenConfigurationAtom } from '@/state/atoms' +import { formatCurrency, parseDuration } from '@/utils' +import { InfoCard, InfoCardItem } from './settings-info-card' + +const OtherInfo = () => { + const params = useAtomValue(rTokenConfigurationAtom) + + return ( + + + + + + + + + ) +} + +export default OtherInfo diff --git a/src/views/yield-dtf/settings/components/PauseManager.tsx b/src/views/yield-dtf/settings/components/pause-manager.tsx similarity index 70% rename from src/views/yield-dtf/settings/components/PauseManager.tsx rename to src/views/yield-dtf/settings/components/pause-manager.tsx index 02b94b5b2..df58422f7 100644 --- a/src/views/yield-dtf/settings/components/PauseManager.tsx +++ b/src/views/yield-dtf/settings/components/pause-manager.tsx @@ -1,9 +1,9 @@ import { Trans, t } from '@lingui/macro' -import Main from 'abis/Main' -import MainLegacy from 'abis/MainLegacy' -import useContractWrite from 'hooks/useContractWrite' -import useRToken from 'hooks/useRToken' -import useWatchTransaction from 'hooks/useWatchTransaction' +import Main from '@/abis/Main' +import MainLegacy from '@/abis/MainLegacy' +import useContractWrite from '@/hooks/useContractWrite' +import useRToken from '@/hooks/useRToken' +import useWatchTransaction from '@/hooks/useWatchTransaction' import { useAtomValue } from 'jotai' import { accountRoleAtom, @@ -11,11 +11,10 @@ import { rTokenContractsAtom, rTokenManagersAtom, rTokenStateAtom, -} from 'state/atoms' -import { Box, Flex, Text } from 'theme-ui' +} from '@/state/atoms' import { Abi } from 'viem' -import RolesView from './RolesView' -import SettingItem from './SettingItem' +import RolesView from './roles-view' +import SettingItem from './setting-item' enum PAUSE_TYPES { ISSUANCE, @@ -34,7 +33,7 @@ const Pausing = ({ const contracts = useAtomValue(rTokenContractsAtom) const { tradingPaused, issuancePaused } = useAtomValue(rTokenStateAtom) let pauseLabel = legacy ? '' : 'Trading' - let isPaused = tradingPaused // applies for legacy too + let isPaused = tradingPaused const hasRole = !!accountRole?.pauser || !!accountRole?.owner if (type === PAUSE_TYPES.ISSUANCE) { @@ -46,7 +45,7 @@ const Pausing = ({ accountRole && contracts && hasRole && rToken?.main ? { address: rToken.main, - abi: legacy ? (MainLegacy as Abi) : (Main as Abi), // Loose type infer because of optional abi + abi: legacy ? (MainLegacy as Abi) : (Main as Abi), functionName: isPaused ? `unpause${pauseLabel}` : `pause${pauseLabel}`, @@ -56,14 +55,12 @@ const Pausing = ({ const { isMining } = useWatchTransaction({ hash, - label: `${isPaused ? 'Unpause' : 'Pause'} ${pauseLabel.toLowerCase()} ${ - rToken?.symbol - }`, + label: `${isPaused ? 'Unpause' : 'Pause'} ${pauseLabel.toLowerCase()} ${rToken?.symbol}`, }) return ( ( subtitle={t`Role held by:`} value={} icon="danger" - mb={3} + className="mb-3" /> ) @@ -93,32 +90,23 @@ const PauseActions = () => { const { main: isLegacy } = useAtomValue(isModuleLegacyAtom) return ( - - - - +
+
+
+ The pauser(s) can put the RToken in two states which can be either true or false (no set duration): - + {!isLegacy && } - - +
+
) } -/** - * View: Settings > Actions for an Rtoken pauser (pause/unpause) - */ const PauseManager = () => ( <> diff --git a/src/views/yield-dtf/settings/components/revenue-split-info.tsx b/src/views/yield-dtf/settings/components/revenue-split-info.tsx new file mode 100644 index 000000000..0fe2dd660 --- /dev/null +++ b/src/views/yield-dtf/settings/components/revenue-split-info.tsx @@ -0,0 +1,57 @@ +import { t } from '@lingui/macro' +import GoTo from '@/components/go-to' +import { useAtomValue } from 'jotai' +import { chainIdAtom, rTokenRevenueSplitAtom } from '@/state/atoms' +import { shortenAddress } from '@/utils' +import { ExplorerDataType, getExplorerLink } from '@/utils/getExplorerLink' +import { InfoCard, InfoCardItem } from './settings-info-card' + +const RevenueSplitInfo = () => { + const distribution = useAtomValue(rTokenRevenueSplitAtom) + const chainId = useAtomValue(chainIdAtom) + + return ( + + {distribution?.holders || 0}%} + border={false} + /> + {distribution?.stakers || 0}%} + /> + {!!distribution && + distribution.external.map((dist) => ( +
+ + {shortenAddress(dist.address)} + +
+ } + right={{dist.total}%} + /> +
+ RToken/RSR split:{' '} + + {dist.holders}/{dist.stakers} + +
+
+ ))} + + ) +} + +export default RevenueSplitInfo diff --git a/src/views/yield-dtf/settings/components/roles-view.tsx b/src/views/yield-dtf/settings/components/roles-view.tsx new file mode 100644 index 000000000..61765cdd1 --- /dev/null +++ b/src/views/yield-dtf/settings/components/roles-view.tsx @@ -0,0 +1,70 @@ +import { Trans } from '@lingui/macro' +import GoTo from '@/components/go-to' +import { + Popover, + PopoverContent, + PopoverTrigger, +} from '@/components/ui/popover' +import { Card } from '@/components/ui/card' +import { useAtomValue } from 'jotai' +import { useState } from 'react' +import { chainIdAtom } from '@/state/atoms' +import { shortenAddress } from '@/utils' +import { ExplorerDataType, getExplorerLink } from '@/utils/getExplorerLink' + +const RoleList = ({ roles }: { roles: string[] }) => { + const chainId = useAtomValue(chainIdAtom) + + return ( + + {roles.map((address, index) => ( +
+ {shortenAddress(address)} + +
+ ))} +
+ ) +} + +const RolesView = ({ roles }: { roles: string[] }) => { + const [isOpen, setIsOpen] = useState(false) + const chainId = useAtomValue(chainIdAtom) + + if (roles.length <= 1) { + return ( +
+ + {roles[0] ? shortenAddress(roles[0]) : 'None'} + + {!!roles[0] && ( + + )} +
+ ) + } + + return ( + + + setIsOpen(!isOpen)} + > + View + + + + + + + ) +} + +export default RolesView diff --git a/src/views/yield-dtf/settings/components/rtoken-management.tsx b/src/views/yield-dtf/settings/components/rtoken-management.tsx new file mode 100644 index 000000000..793b73ab9 --- /dev/null +++ b/src/views/yield-dtf/settings/components/rtoken-management.tsx @@ -0,0 +1,56 @@ +import { t } from '@lingui/macro' +import Main from '@/abis/Main' +import DocsLink from '@/components/utils/docs-link' +import useRToken from '@/hooks/useRToken' +import { useAtomValue } from 'jotai' +import { accountRoleAtom, chainIdAtom } from '@/state/atoms' +import { FACADE_WRITE_ADDRESS } from '@/utils/addresses' +import { Address, stringToHex } from 'viem' +import FreezeManager from './freeze-manager' +import GovernancePrompt from './governance-prompt' +import PauseManager from './pause-manager' +import { useReadContract } from 'wagmi' +import { InfoCard } from './settings-info-card' + +const useGovernanceSetupRequired = () => { + const rToken = useRToken() + const chainId = useAtomValue(chainIdAtom) + const accountRole = useAtomValue(accountRoleAtom) + + const { data } = useReadContract({ + address: rToken?.main as Address, + abi: Main, + functionName: 'hasRole', + chainId, + args: [ + stringToHex('OWNER', { size: 32 }), + FACADE_WRITE_ADDRESS[chainId] as Address, + ], + }) + + return data && !!accountRole?.owner +} + +const RTokenManagement = () => { + const isGovernanceSetupRequired = useGovernanceSetupRequired() + + if (isGovernanceSetupRequired) { + return + } + + return ( + } + secondary + > +
+ +
+ +
+
+ ) +} + +export default RTokenManagement diff --git a/src/views/yield-dtf/settings/components/rtoken-overview.tsx b/src/views/yield-dtf/settings/components/rtoken-overview.tsx new file mode 100644 index 000000000..534c882b8 --- /dev/null +++ b/src/views/yield-dtf/settings/components/rtoken-overview.tsx @@ -0,0 +1,45 @@ +import SectionContainer from '@/components/section-navigation/section-container' +import SectionWrapper from '@/components/section-navigation/section-wrapper' +import BackingInfo from './backing-info' +import BasicInfo from './basic-info' +import BasketInfo from './basket-info' +import ContractsInfo from './contracts-info' +import EmergencyCollateralInfo from './emergency-collateral-info' +import GovernanceInfo from './governance-info' +import OtherInfo from './other-info' +import RTokenManagement from './rtoken-management' +import RevenueSplitInfo from './revenue-split-info' + +const RTokenOverview = () => ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +) + +export default RTokenOverview diff --git a/src/views/yield-dtf/settings/components/setting-item.tsx b/src/views/yield-dtf/settings/components/setting-item.tsx new file mode 100644 index 000000000..c6688c12d --- /dev/null +++ b/src/views/yield-dtf/settings/components/setting-item.tsx @@ -0,0 +1,68 @@ +import { t } from '@lingui/macro' +import { Button } from '@/components/ui/button' +import { cn } from '@/lib/utils' +import { Loader2 } from 'lucide-react' + +interface SettingItemProps { + icon?: string + title: string + subtitle: string + value?: string | JSX.Element + action?: string + actionVariant?: 'muted' | 'danger' + loading?: boolean + onAction?(): void + className?: string +} + +const SettingItem = ({ + icon, + title, + subtitle, + value, + action, + actionVariant = 'muted', + loading = false, + onAction, + className, +}: SettingItemProps) => { + return ( +
+
+ {!!icon ? ( + + ) : ( +
+ )} +
+ {title} +
+ {subtitle} + {!!value && {value}} +
+
+
+
+ {!!action && ( + + )} +
+
+ ) +} + +export default SettingItem diff --git a/src/views/yield-dtf/settings/components/settings-info-card.tsx b/src/views/yield-dtf/settings/components/settings-info-card.tsx new file mode 100644 index 000000000..955c04d9d --- /dev/null +++ b/src/views/yield-dtf/settings/components/settings-info-card.tsx @@ -0,0 +1,125 @@ +import { Card } from '@/components/ui/card' +import Copy from '@/components/ui/copy' +import { Skeleton } from '@/components/ui/skeleton' +import useScrollTo from '@/hooks/useScrollTo' +import { cn } from '@/lib/utils' +import { chainIdAtom } from '@/state/atoms' +import { ExplorerDataType, getExplorerLink } from '@/utils/getExplorerLink' +import { useAtomValue } from 'jotai' +import { ArrowUpRight } from 'lucide-react' +import { useEffect } from 'react' +import { Link } from 'react-router-dom' + +const IconWrapper = ({ Component }: { Component: React.ElementType }) => ( +
+ +
+) + +const InfoCard = ({ + title, + action, + children, + secondary = false, + className, + id, +}: { + title: string + action?: React.ReactNode + children: React.ReactNode + secondary?: boolean + className?: string + id?: string +}) => { + const scrollTo = useScrollTo(id || '') + + useEffect(() => { + const section = window.location.hash.slice(1) + if (section && section === id) { + scrollTo() + } + }, [id, scrollTo]) + + return ( + +
+

+ {title} +

+ {action} +
+
+ {children} +
+
+ ) +} + +const InfoCardItem = ({ + label, + icon, + value, + className, + address, + bold = true, + border = true, + right, +}: { + label: string + icon?: React.ReactNode + value?: React.ReactNode + className?: string + bold?: boolean + address?: string + border?: boolean + right?: React.ReactNode +}) => { + const chainId = useAtomValue(chainIdAtom) + + return ( +
+ {icon} +
+
+ {label} +
+ {value === undefined ? ( + + ) : ( + {value} + )} +
+ {!!address && ( +
+
+ +
+ + + +
+ )} + {!!right &&
{right}
} +
+ ) +} + +export { InfoCard, InfoCardItem, IconWrapper } diff --git a/src/views/yield-dtf/settings/index.tsx b/src/views/yield-dtf/settings/index.tsx index a6a20973a..d0769fc8d 100644 --- a/src/views/yield-dtf/settings/index.tsx +++ b/src/views/yield-dtf/settings/index.tsx @@ -1,21 +1,10 @@ -import { Grid } from 'theme-ui' -import RTokenOverview from './components/RTokenOverview' +import RTokenOverview from './components/rtoken-overview' const Settings = () => { return ( - +
- +
) } diff --git a/src/views/yield-dtf/staking/Staking.tsx b/src/views/yield-dtf/staking/Staking.tsx deleted file mode 100644 index 204c2a4e1..000000000 --- a/src/views/yield-dtf/staking/Staking.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import { Box, Grid } from 'theme-ui' -import StakeContainer from './components/StakeContainer' -import Overview from './components/overview' -import Withdraw from './components/withdraw' -import StakePosition from './components/StakePosition' - -const Staking = () => ( - - - - - - - - - - -) - -export default Staking diff --git a/src/views/yield-dtf/staking/atoms.ts b/src/views/yield-dtf/staking/atoms.ts index 4466bbbb9..03938f314 100644 --- a/src/views/yield-dtf/staking/atoms.ts +++ b/src/views/yield-dtf/staking/atoms.ts @@ -89,12 +89,12 @@ const accountStakeHistoryAtom = atomWithLoadable(async (get) => { exchangeRate: string amount: string rsrAmount: bigint - isStake: string + isStake: string | boolean }[]) { const recordAmount = Number(record.amount) const recordExchangeRate = Number(record.exchangeRate) - if (record.isStake) { + if (record.isStake === 'true' || record.isStake === true) { stakes.push([recordAmount, recordExchangeRate, Number(record.rsrAmount)]) } else { let stakesRewarded = 0 diff --git a/src/views/yield-dtf/staking/components/AmountPreview.tsx b/src/views/yield-dtf/staking/components/AmountPreview.tsx deleted file mode 100644 index 08ca24cfa..000000000 --- a/src/views/yield-dtf/staking/components/AmountPreview.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import TokenLogo from 'components/icons/TokenLogo' -import { Box, BoxProps, Text } from 'theme-ui' -import { formatCurrency } from 'utils' - -interface IAmountPreview extends BoxProps { - title: string - amount: number - usdAmount: number - symbol: string - src?: string -} - -const AmountPreview = ({ - title, - amount, - usdAmount, - symbol, - src, - ...props -}: IAmountPreview) => ( - - - - {title} - - {formatCurrency(amount, 5)} {symbol} - - ${formatCurrency(usdAmount, 2)} - - -) - -export default AmountPreview diff --git a/src/views/yield-dtf/staking/components/GasEstimate.tsx b/src/views/yield-dtf/staking/components/GasEstimate.tsx deleted file mode 100644 index c0f79dd58..000000000 --- a/src/views/yield-dtf/staking/components/GasEstimate.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import { Trans } from '@lingui/macro' -import GasIcon from 'components/icons/GasIcon' -import { Box, BoxProps, Spinner, Text } from 'theme-ui' -import { formatCurrency } from 'utils' - -interface IGasEstimate extends BoxProps { - total: number - breakdown?: { label: string; value: number }[] -} - -const GasEstimate = ({ total, breakdown, ...props }: IGasEstimate) => { - return ( - - - - Estimated gas cost: - - {total ? ( - ${formatCurrency(total, 3)} - ) : ( - - )} - - {/* */} - - ) -} - -export default GasEstimate diff --git a/src/views/yield-dtf/staking/components/InputOutputSeparator.tsx b/src/views/yield-dtf/staking/components/InputOutputSeparator.tsx deleted file mode 100644 index 1d2e25c89..000000000 --- a/src/views/yield-dtf/staking/components/InputOutputSeparator.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import { ArrowDown } from 'lucide-react' -import { borderRadius } from 'theme' -import { Box, Divider } from 'theme-ui' - -const InputOutputSeparator = () => ( - - - - - - - -) - -export default InputOutputSeparator diff --git a/src/views/yield-dtf/staking/components/InputPostfix.tsx b/src/views/yield-dtf/staking/components/InputPostfix.tsx deleted file mode 100644 index 4b006d2a9..000000000 --- a/src/views/yield-dtf/staking/components/InputPostfix.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import { Box, Text } from 'theme-ui' - -const InputPostfix = ({ - amount, - symbol, -}: { - amount: string - symbol: string -}) => ( - - {amount} - - {symbol} - - -) - -export default InputPostfix diff --git a/src/views/yield-dtf/staking/components/StakePosition.tsx b/src/views/yield-dtf/staking/components/StakePosition.tsx deleted file mode 100644 index d00b44102..000000000 --- a/src/views/yield-dtf/staking/components/StakePosition.tsx +++ /dev/null @@ -1,90 +0,0 @@ -import { Trans } from '@lingui/macro' -import { useAtomValue } from 'jotai' -import { Box, BoxProps, Divider, Text } from 'theme-ui' -import { accountCurrentPositionAtom, rateAtom, stRsrTickerAtom } from '../atoms' -import TokenLogo from 'components/icons/TokenLogo' -import { rsrPriceAtom, stRsrBalanceAtom } from 'state/atoms' -import { formatCurrency } from 'utils' -import TrendingIcon from 'components/icons/TrendingIcon' - -const StakePosition = (props: BoxProps) => { - const ticker = useAtomValue(stRsrTickerAtom) - const rate = useAtomValue(rateAtom) - const balance = useAtomValue(stRsrBalanceAtom) - const rsrPrice = useAtomValue(rsrPriceAtom) - let rewards = useAtomValue(accountCurrentPositionAtom) - - // Prevent the case when the user withdraws and rewards get stuck awaiting for subgraph - if (!balance.value && rewards) { - rewards = 0 - } - - return ( - - - Your stake position - - - - - - {formatCurrency(+balance.balance, 2, { - notation: 'compact', - compactDisplay: 'short', - })} - - - {ticker} - - - - - - = - - - - - Exchangeable for - - - - {formatCurrency(+balance.balance * rate, 2, { - notation: 'compact', - compactDisplay: 'short', - })} - {' '} - RSR - - - - ${formatCurrency(+balance.balance * rate * rsrPrice)} - - - - - - - - Rewards - - - - {formatCurrency(rewards, 2, { - notation: 'compact', - compactDisplay: 'short', - })} - {' '} - RSR - - - - ${formatCurrency(rewards * rsrPrice)} - - - - - ) -} - -export default StakePosition diff --git a/src/views/yield-dtf/staking/components/UnstakeDelay.tsx b/src/views/yield-dtf/staking/components/UnstakeDelay.tsx deleted file mode 100644 index 0c47265fc..000000000 --- a/src/views/yield-dtf/staking/components/UnstakeDelay.tsx +++ /dev/null @@ -1,78 +0,0 @@ -import { Trans } from '@lingui/macro' -import CollapsableBox from '@/components/old/boxes/CollapsableBox' -import { useAtomValue } from 'jotai' -import { ArrowRight } from 'lucide-react' -import { Box, BoxProps, Text } from 'theme-ui' -import { unstakeDelayAtom } from '../atoms' - -export const UnstakeFlow = () => { - const delay = useAtomValue(unstakeDelayAtom) - - return ( - - - - - Trigger Unstake - - 1 Transaction - - - - - - {delay} Delay - - Wait entire period - - - - - - Withdraw RSR - - 1 Transaction - - - ) -} - -// TODO: Fix types, react version mismatch -const UnstakeDelay = (props: BoxProps) => { - const delay = useAtomValue(unstakeDelayAtom) - return ( - // @ts-ignore - - - Unstaking delay: - - - {delay} - - - } - {...props} - > - - - ) -} - -export default UnstakeDelay diff --git a/src/views/yield-dtf/staking/components/amount-preview.tsx b/src/views/yield-dtf/staking/components/amount-preview.tsx new file mode 100644 index 000000000..2b81ad9c2 --- /dev/null +++ b/src/views/yield-dtf/staking/components/amount-preview.tsx @@ -0,0 +1,34 @@ +import TokenLogo from 'components/icons/TokenLogo' +import { formatCurrency } from 'utils' +import { cn } from '@/lib/utils' + +interface AmountPreviewProps { + title: string + amount: number + usdAmount: number + symbol: string + src?: string + className?: string +} + +const AmountPreview = ({ + title, + amount, + usdAmount, + symbol, + src, + className, +}: AmountPreviewProps) => ( +
+ +
+ {title} +
+ {formatCurrency(amount, 5)} {symbol} +
+ ${formatCurrency(usdAmount, 2)} +
+
+) + +export default AmountPreview diff --git a/src/views/yield-dtf/staking/components/ExchangeRate.tsx b/src/views/yield-dtf/staking/components/exchange-rate.tsx similarity index 78% rename from src/views/yield-dtf/staking/components/ExchangeRate.tsx rename to src/views/yield-dtf/staking/components/exchange-rate.tsx index 81bc53946..547c32024 100644 --- a/src/views/yield-dtf/staking/components/ExchangeRate.tsx +++ b/src/views/yield-dtf/staking/components/exchange-rate.tsx @@ -1,5 +1,4 @@ import { useAtomValue } from 'jotai' -import { Box, Text } from 'theme-ui' import { formatCurrency } from 'utils' import { rateAtom, stRsrTickerAtom } from '@/views/yield-dtf/staking/atoms' @@ -8,11 +7,11 @@ const ExchangeRate = () => { const rate = useAtomValue(rateAtom) return ( - - +
+ 1 {ticker} = {formatCurrency(rate, 5)} RSR - - + +
) } diff --git a/src/views/yield-dtf/staking/components/gas-estimate.tsx b/src/views/yield-dtf/staking/components/gas-estimate.tsx new file mode 100644 index 000000000..e8689b768 --- /dev/null +++ b/src/views/yield-dtf/staking/components/gas-estimate.tsx @@ -0,0 +1,29 @@ +import { Trans } from '@lingui/macro' +import GasIcon from 'components/icons/GasIcon' +import { formatCurrency } from 'utils' +import { cn } from '@/lib/utils' +import { Skeleton } from '@/components/ui/skeleton' + +interface GasEstimateProps { + total: number + breakdown?: { label: string; value: number }[] + className?: string +} + +const GasEstimate = ({ total, breakdown, className }: GasEstimateProps) => { + return ( +
+ + + Estimated gas cost: + + {total ? ( + ${formatCurrency(total, 3)} + ) : ( + + )} +
+ ) +} + +export default GasEstimate diff --git a/src/views/yield-dtf/staking/components/input-output-separator.tsx b/src/views/yield-dtf/staking/components/input-output-separator.tsx new file mode 100644 index 000000000..5c6948a98 --- /dev/null +++ b/src/views/yield-dtf/staking/components/input-output-separator.tsx @@ -0,0 +1,13 @@ +import { ArrowDown } from 'lucide-react' + +const InputOutputSeparator = () => ( +
+
+
+ +
+
+
+) + +export default InputOutputSeparator diff --git a/src/views/yield-dtf/staking/components/input-postfix.tsx b/src/views/yield-dtf/staking/components/input-postfix.tsx new file mode 100644 index 000000000..c6d02a2fd --- /dev/null +++ b/src/views/yield-dtf/staking/components/input-postfix.tsx @@ -0,0 +1,14 @@ +const InputPostfix = ({ + amount, + symbol, +}: { + amount: string + symbol: string +}) => ( +
+ {amount} + {symbol} +
+) + +export default InputPostfix diff --git a/src/views/yield-dtf/staking/components/overview/StakeApy.tsx b/src/views/yield-dtf/staking/components/overview/StakeApy.tsx deleted file mode 100644 index 5f82550ba..000000000 --- a/src/views/yield-dtf/staking/components/overview/StakeApy.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import { useAtomValue } from 'jotai' -import { estimatedApyAtom } from 'state/atoms' -import { Box, Text } from 'theme-ui' -import { formatPercentage } from 'utils' - -const StakeApy = () => { - const { stakers } = useAtomValue(estimatedApyAtom) - - return ( - - - Est. Staking Yield:{' '} - - {formatPercentage(stakers || 0)} - - - - Manually estimated APY calculated from basket averaged yield.
- Calculation: (avgCollateralYield * - rTokenMarketCap) / rsrStaked -
-
- ) -} - -export default StakeApy diff --git a/src/views/yield-dtf/staking/components/overview/StakingMetricCharts.tsx b/src/views/yield-dtf/staking/components/overview/StakingMetricCharts.tsx deleted file mode 100644 index 7fc413eea..000000000 --- a/src/views/yield-dtf/staking/components/overview/StakingMetricCharts.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import { StakeMetricType } from '@/views/yield-dtf/staking/atoms' -import ExchangeRate from './ExchangeRate' -import StakeHistory from './StakeHistory' - -const Views = { - [StakeMetricType.Exchange]: ExchangeRate, - [StakeMetricType.Staked]: StakeHistory, -} - -const StakingMetricCharts = ({ current }: { current: StakeMetricType }) => { - const Component = Views[current] - - return -} - -export default StakingMetricCharts diff --git a/src/views/yield-dtf/staking/components/overview/StakingMetrics.tsx b/src/views/yield-dtf/staking/components/overview/StakingMetrics.tsx deleted file mode 100644 index 34a18b0b8..000000000 --- a/src/views/yield-dtf/staking/components/overview/StakingMetrics.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import TabMenu from 'components/tab-menu' -import { useAtomValue } from 'jotai' -import { Suspense, lazy, useMemo, useState } from 'react' -import { Box, Spinner } from 'theme-ui' -import { - StakeMetricType, - stRsrTickerAtom, -} from '@/views/yield-dtf/staking/atoms' - -const StakingMetricCharts = lazy(() => import('./StakingMetricCharts')) - -const Skeleton = () => ( - - - -) - -const StakingMetrics = () => { - const [current, setCurrent] = useState(StakeMetricType.Exchange) - const ticker = useAtomValue(stRsrTickerAtom) - const options = useMemo( - () => [ - { - key: StakeMetricType.Exchange, - label: `${ticker}/RSR`, - }, - { - key: StakeMetricType.Staked, - label: 'Staked RSR', - }, - ], - [ticker] - ) - - return ( - - setCurrent(+key)} - mb={3} - /> - }> - - - - ) -} - -export default StakingMetrics diff --git a/src/views/yield-dtf/staking/components/overview/StakingStats.tsx b/src/views/yield-dtf/staking/components/overview/StakingStats.tsx deleted file mode 100644 index 22e1e39ac..000000000 --- a/src/views/yield-dtf/staking/components/overview/StakingStats.tsx +++ /dev/null @@ -1,92 +0,0 @@ -import { t, Trans } from '@lingui/macro' -import Help from 'components/help' -import IconInfo from '@/components/old/info-icon' -import useRToken from 'hooks/useRToken' -import useTokenStats from 'hooks/useTokenStats' -import { useAtomValue } from 'jotai' -import { - estimatedApyAtom, - rTokenBackingDistributionAtom, - rTokenConfigurationAtom, -} from 'state/atoms' -import { Box, BoxProps, Grid, Image, Text } from 'theme-ui' -import { formatCurrency, formatPercentage, parseDuration } from 'utils' - -const StakingStats = (props: BoxProps) => { - const { stakers } = useAtomValue(estimatedApyAtom) - const distribution = useAtomValue(rTokenBackingDistributionAtom) - const params = useAtomValue(rTokenConfigurationAtom) - const rToken = useRToken() - const stats = useTokenStats(rToken?.address.toLowerCase() ?? '') - - return ( - - - - - - Stake pool - - - } - title={t`Total RSR staked`} - text={`${formatCurrency(stats.staked)}`} - /> - - - - - Est. Staking APY - - - - - } - title={t`Current`} - text={formatPercentage(stakers || 0)} - /> - - - - Unstaking Delay - - } - title={t`Current`} - text={parseDuration(+params?.unstakingDelay || 0)} - /> - - - - Backing + Staked - - } - title={t`Current`} - text={`${ - (distribution?.backing ?? 0) + (distribution?.staked ?? 0) - }%`} - /> - - - - ) -} - -export default StakingStats diff --git a/src/views/yield-dtf/staking/components/overview/About.tsx b/src/views/yield-dtf/staking/components/overview/about.tsx similarity index 66% rename from src/views/yield-dtf/staking/components/overview/About.tsx rename to src/views/yield-dtf/staking/components/overview/about.tsx index 14c73a601..5db028f08 100644 --- a/src/views/yield-dtf/staking/components/overview/About.tsx +++ b/src/views/yield-dtf/staking/components/overview/about.tsx @@ -1,6 +1,11 @@ -import { Trans, t } from '@lingui/macro' -import ExpandableContent from '@/components/old/expandable-content' -import { Box, BoxProps, Text } from 'theme-ui' +import { Trans } from '@lingui/macro' +import { cn } from '@/lib/utils' +import { + Accordion, + AccordionContent, + AccordionItem, + AccordionTrigger, +} from '@/components/ui/accordion' const faqs = [ { @@ -52,12 +57,29 @@ const faqs = [ }, ] -const About = (props: BoxProps) => ( - - {faqs.map((faq, i) => ( - - ))} - +interface AboutProps { + className?: string +} + +const About = ({ className }: AboutProps) => ( +
+ + {faqs.map((faq, i) => ( + + + {faq.title} + + + {faq.content} + + + ))} + +
) export default About diff --git a/src/views/yield-dtf/staking/components/overview/ExchangeRate.tsx b/src/views/yield-dtf/staking/components/overview/exchange-rate.tsx similarity index 86% rename from src/views/yield-dtf/staking/components/overview/ExchangeRate.tsx rename to src/views/yield-dtf/staking/components/overview/exchange-rate.tsx index a03b98748..54c746e17 100644 --- a/src/views/yield-dtf/staking/components/overview/ExchangeRate.tsx +++ b/src/views/yield-dtf/staking/components/overview/exchange-rate.tsx @@ -1,13 +1,12 @@ import AreaChart from 'components/charts/area/AreaChart' import dayjs from 'dayjs' import { gql } from 'graphql-request' -import useQuery from 'hooks/useQuery' +import useQuery from 'hooks/use-query' import useRToken from 'hooks/useRToken' import useTimeFrom from 'hooks/useTimeFrom' import { useAtomValue } from 'jotai' import { useMemo, useState } from 'react' import { rTokenStateAtom } from 'state/atoms' -import { Box, BoxProps, Text } from 'theme-ui' import { formatCurrency } from 'utils' import { TIME_RANGES } from 'utils/constants' import { stRsrTickerAtom } from '@/views/yield-dtf/staking/atoms' @@ -26,7 +25,7 @@ const query = gql` } ` -const ExchangeRate = (props: BoxProps) => { +const ExchangeRate = () => { const rToken = useRToken() const { exchangeRate: rate } = useAtomValue(rTokenStateAtom) const [current, setCurrent] = useState(TIME_RANGES.YEAR) @@ -69,13 +68,13 @@ const ExchangeRate = (props: BoxProps) => { height={160} title={ !rate ? ( - Loading history... + Loading history... ) : ( <> - 1 {stToken} ={' '} - + 1 {stToken} ={' '} + {formatCurrency(rate, 5)} RSR - + ) } diff --git a/src/views/yield-dtf/staking/components/overview/index.tsx b/src/views/yield-dtf/staking/components/overview/index.tsx index 29d075de1..8d88e0ddc 100644 --- a/src/views/yield-dtf/staking/components/overview/index.tsx +++ b/src/views/yield-dtf/staking/components/overview/index.tsx @@ -1,17 +1,20 @@ -import { Box, BoxProps } from 'theme-ui' -import About from './About' -import StakingMetrics from './StakingMetrics' -import UnstakeDelayOverview from './UnstakeDelayOverview' -import StakeApy from './StakeApy' +import { cn } from '@/lib/utils' +import About from './about' +import StakingMetrics from './staking-metrics' +import UnstakeDelayOverview from './unstake-delay-overview' +import StakeApy from './stake-apy' -const Overview = (props: BoxProps) => ( - +interface OverviewProps { + className?: string +} + +const Overview = ({ className }: OverviewProps) => ( +
- - - + +
) export default Overview diff --git a/src/views/yield-dtf/staking/components/overview/stake-apy.tsx b/src/views/yield-dtf/staking/components/overview/stake-apy.tsx new file mode 100644 index 000000000..8df09c687 --- /dev/null +++ b/src/views/yield-dtf/staking/components/overview/stake-apy.tsx @@ -0,0 +1,25 @@ +import { useAtomValue } from 'jotai' +import { estimatedApyAtom } from 'state/atoms' +import { formatPercentage } from 'utils' + +const StakeApy = () => { + const { stakers } = useAtomValue(estimatedApyAtom) + + return ( +
+
+ Est. Staking Yield:{' '} + + {formatPercentage(stakers || 0)} + +
+

+ Manually estimated APY calculated from basket averaged yield.
+ Calculation: (avgCollateralYield * + rTokenMarketCap) / rsrStaked +

+
+ ) +} + +export default StakeApy diff --git a/src/views/yield-dtf/staking/components/overview/StakeHistory.tsx b/src/views/yield-dtf/staking/components/overview/stake-history.tsx similarity index 87% rename from src/views/yield-dtf/staking/components/overview/StakeHistory.tsx rename to src/views/yield-dtf/staking/components/overview/stake-history.tsx index 275cfa470..ef01cf252 100644 --- a/src/views/yield-dtf/staking/components/overview/StakeHistory.tsx +++ b/src/views/yield-dtf/staking/components/overview/stake-history.tsx @@ -1,11 +1,10 @@ import AreaChart from 'components/charts/area/AreaChart' import dayjs from 'dayjs' import { gql } from 'graphql-request' -import useQuery from 'hooks/useQuery' +import useQuery from 'hooks/use-query' import useRToken from 'hooks/useRToken' import useTimeFrom from 'hooks/useTimeFrom' import { useMemo, useState } from 'react' -import { BoxProps, Text } from 'theme-ui' import { formatCurrency } from 'utils' import { TIME_RANGES } from 'utils/constants' import { formatEther } from 'viem' @@ -34,7 +33,7 @@ const dailyQuery = gql` } } ` -const StakeHistory = (props: BoxProps) => { +const StakeHistory = () => { const rToken = useRToken() const [current, setCurrent] = useState(TIME_RANGES.MONTH) const fromTime = useTimeFrom(current) @@ -75,17 +74,17 @@ const StakeHistory = (props: BoxProps) => { height={160} title={ !currentValue ? ( - Loading history... + Loading history... ) : ( <> - Total staked:{' '} - + Total staked:{' '} + {formatCurrency(currentValue, 2, { notation: 'compact', compactDisplay: 'short', })}{' '} RSR - + ) } diff --git a/src/views/yield-dtf/staking/components/overview/StakeRewardsHistory.tsx b/src/views/yield-dtf/staking/components/overview/stake-rewards-history.tsx similarity index 86% rename from src/views/yield-dtf/staking/components/overview/StakeRewardsHistory.tsx rename to src/views/yield-dtf/staking/components/overview/stake-rewards-history.tsx index 05aaca904..bb47c3962 100644 --- a/src/views/yield-dtf/staking/components/overview/StakeRewardsHistory.tsx +++ b/src/views/yield-dtf/staking/components/overview/stake-rewards-history.tsx @@ -1,11 +1,10 @@ import AreaChart from 'components/charts/area/AreaChart' import dayjs from 'dayjs' import { gql } from 'graphql-request' -import useQuery from 'hooks/useQuery' +import useQuery from 'hooks/use-query' import useRToken from 'hooks/useRToken' import useTimeFrom from 'hooks/useTimeFrom' import { useMemo, useState } from 'react' -import { BoxProps, Text } from 'theme-ui' import { formatCurrency } from 'utils' import { TIME_RANGES } from 'utils/constants' @@ -22,7 +21,7 @@ const dailyQuery = gql` } } ` -const StakeRewardsHistory = (props: BoxProps) => { +const StakeRewardsHistory = () => { const rToken = useRToken() const [current, setCurrent] = useState(TIME_RANGES.MONTH) const fromTime = useTimeFrom(current) @@ -62,17 +61,17 @@ const StakeRewardsHistory = (props: BoxProps) => { height={160} title={ !currentValue ? ( - Loading history... + Loading history... ) : ( <> - Total staked:{' '} - + Total staked:{' '} + {formatCurrency(currentValue, 2, { notation: 'compact', compactDisplay: 'short', })}{' '} RSR - + ) } diff --git a/src/views/yield-dtf/staking/components/overview/staking-metrics.tsx b/src/views/yield-dtf/staking/components/overview/staking-metrics.tsx new file mode 100644 index 000000000..3d7d8f857 --- /dev/null +++ b/src/views/yield-dtf/staking/components/overview/staking-metrics.tsx @@ -0,0 +1,41 @@ +import { useAtomValue } from 'jotai' +import { Suspense, lazy } from 'react' +import { Skeleton } from '@/components/ui/skeleton' +import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs' +import { stRsrTickerAtom } from '@/views/yield-dtf/staking/atoms' + +const ExchangeRate = lazy(() => import('./exchange-rate')) +const StakeHistory = lazy(() => import('./stake-history')) + +const ChartSkeleton = () => ( +
+ +
+) + +const StakingMetrics = () => { + const ticker = useAtomValue(stRsrTickerAtom) + + return ( +
+ + + {ticker}/RSR + Staked RSR + + + }> + + + + + }> + + + + +
+ ) +} + +export default StakingMetrics diff --git a/src/views/yield-dtf/staking/components/overview/staking-stats.tsx b/src/views/yield-dtf/staking/components/overview/staking-stats.tsx new file mode 100644 index 000000000..893a4d67c --- /dev/null +++ b/src/views/yield-dtf/staking/components/overview/staking-stats.tsx @@ -0,0 +1,98 @@ +import { t, Trans } from '@lingui/macro' +import Help from 'components/help' +import useRToken from 'hooks/useRToken' +import useTokenStats from 'hooks/useTokenStats' +import { useAtomValue } from 'jotai' +import { + estimatedApyAtom, + rTokenBackingDistributionAtom, + rTokenConfigurationAtom, +} from 'state/atoms' +import { formatCurrency, formatPercentage, parseDuration } from 'utils' +import { cn } from '@/lib/utils' + +const IconInfo = ({ + icon, + title, + text, +}: { + icon: React.ReactNode + title: string + text: string +}) => ( +
+ {icon} +
+ {title} + {text} +
+
+) + +interface StakingStatsProps { + className?: string +} + +const StakingStats = ({ className }: StakingStatsProps) => { + const { stakers } = useAtomValue(estimatedApyAtom) + const distribution = useAtomValue(rTokenBackingDistributionAtom) + const params = useAtomValue(rTokenConfigurationAtom) + const rToken = useRToken() + const stats = useTokenStats(rToken?.address.toLowerCase() ?? '') + + return ( +
+
+
+
+ + Stake pool + +
+ } + title={t`Total RSR staked`} + text={`${formatCurrency(stats.staked)}`} + /> +
+
+
+ + Est. Staking APY + + +
+ } + title={t`Current`} + text={formatPercentage(stakers || 0)} + /> +
+
+ + Unstaking Delay + + } + title={t`Current`} + text={parseDuration(+params?.unstakingDelay || 0)} + /> +
+
+ + Backing + Staked + + } + title={t`Current`} + text={`${ + (distribution?.backing ?? 0) + (distribution?.staked ?? 0) + }%`} + /> +
+
+
+ ) +} + +export default StakingStats diff --git a/src/views/yield-dtf/staking/components/overview/UnstakeDelayOverview.tsx b/src/views/yield-dtf/staking/components/overview/unstake-delay-overview.tsx similarity index 64% rename from src/views/yield-dtf/staking/components/overview/UnstakeDelayOverview.tsx rename to src/views/yield-dtf/staking/components/overview/unstake-delay-overview.tsx index 893a1ffd0..6f091d349 100644 --- a/src/views/yield-dtf/staking/components/overview/UnstakeDelayOverview.tsx +++ b/src/views/yield-dtf/staking/components/overview/unstake-delay-overview.tsx @@ -2,9 +2,8 @@ import { atom, useAtomValue } from 'jotai' import { useState } from 'react' import { Minus, Plus } from 'lucide-react' import { rTokenConfigurationAtom } from 'state/atoms' -import { Box, Text } from 'theme-ui' import { parseDuration } from 'utils' -import UnstakeDelay, { UnstakeFlow } from '../UnstakeDelay' +import { UnstakeFlow } from '../unstake-delay' const delayAtom = atom((get) => { const params = get(rTokenConfigurationAtom) @@ -17,29 +16,26 @@ const UnstakeDelayOverview = () => { const [isOpen, setOpen] = useState(false) return ( - - +
setOpen(!isOpen)} > - Unstake delay - - {delay} - + Unstake delay + {delay} {isOpen ? : } - +
{isOpen && ( <> - +

Funds will be used in the case of a collateral default during the unstaking delay and up until the point of the manually triggered withdraw transaction. - +

)} -
+
) } diff --git a/src/views/yield-dtf/staking/components/StakeContainer.tsx b/src/views/yield-dtf/staking/components/stake-container.tsx similarity index 74% rename from src/views/yield-dtf/staking/components/StakeContainer.tsx rename to src/views/yield-dtf/staking/components/stake-container.tsx index 55d28733a..549425000 100644 --- a/src/views/yield-dtf/staking/components/StakeContainer.tsx +++ b/src/views/yield-dtf/staking/components/stake-container.tsx @@ -1,10 +1,9 @@ import TabMenu from 'components/tab-menu' import { useState } from 'react' import { Minus, Plus } from 'lucide-react' -import { Box, Card } from 'theme-ui' +import { Card } from '@/components/ui/card' import Stake from './stake' import Unstake from './unstake' -import { boxShadow } from 'theme' const MenuOptions = [ { key: 1, label: 'Stake', icon: }, @@ -19,17 +18,13 @@ const Header = ({ isStaking: boolean }) => { return ( - +
onChange(!!key)} /> - +
) } @@ -37,7 +32,7 @@ const StakeContainer = () => { const [isStaking, setIsStaking] = useState(true) return ( - +
{isStaking ? : } diff --git a/src/views/yield-dtf/staking/components/stake-position.tsx b/src/views/yield-dtf/staking/components/stake-position.tsx new file mode 100644 index 000000000..93c23bc03 --- /dev/null +++ b/src/views/yield-dtf/staking/components/stake-position.tsx @@ -0,0 +1,88 @@ +import { Trans } from '@lingui/macro' +import { useAtomValue } from 'jotai' +import { accountCurrentPositionAtom, rateAtom, stRsrTickerAtom } from '../atoms' +import TokenLogo from 'components/icons/TokenLogo' +import { rsrPriceAtom, stRsrBalanceAtom } from 'state/atoms' +import { formatCurrency } from 'utils' +import TrendingIcon from 'components/icons/TrendingIcon' +import { cn } from '@/lib/utils' + +interface StakePositionProps { + className?: string +} + +const StakePosition = ({ className }: StakePositionProps) => { + const ticker = useAtomValue(stRsrTickerAtom) + const rate = useAtomValue(rateAtom) + const balance = useAtomValue(stRsrBalanceAtom) + const rsrPrice = useAtomValue(rsrPriceAtom) + let rewards = useAtomValue(accountCurrentPositionAtom) + + // Prevent the case when the user withdraws and rewards get stuck awaiting for subgraph + if (!balance.value && rewards) { + rewards = 0 + } + + return ( +
+

+ Your stake position +

+
+
+ + + {formatCurrency(+balance.balance, 2, { + notation: 'compact', + compactDisplay: 'short', + })} + + + {ticker} + +
+
+
+ = + +
+ Exchangeable for +
+ + {formatCurrency(+balance.balance * rate, 2, { + notation: 'compact', + compactDisplay: 'short', + })} + {' '} + RSR +
+
+ + ${formatCurrency(+balance.balance * rate * rsrPrice)} + +
+
+ + +
+ Rewards +
+ + {formatCurrency(rewards, 2, { + notation: 'compact', + compactDisplay: 'short', + })} + {' '} + RSR +
+
+ + ${formatCurrency(rewards * rsrPrice)} + +
+
+
+ ) +} + +export default StakePosition diff --git a/src/views/yield-dtf/staking/components/stake/StakeOutput.tsx b/src/views/yield-dtf/staking/components/stake/StakeOutput.tsx deleted file mode 100644 index 4be5369e4..000000000 --- a/src/views/yield-dtf/staking/components/stake/StakeOutput.tsx +++ /dev/null @@ -1,67 +0,0 @@ -import TokenLogo from 'components/icons/TokenLogo' -import { useAtomValue } from 'jotai' -import { stRsrBalanceAtom } from 'state/atoms' -import { borderRadius } from 'theme' -import { Box, Text } from 'theme-ui' -import { formatCurrency } from 'utils' -import { stRsrTickerAtom } from '@/views/yield-dtf/staking/atoms' -import { stakeAmountUsdAtom, stakeOutputAtom } from './atoms' - -const StRsrBalance = () => { - const balance = useAtomValue(stRsrBalanceAtom) - - return ( - - - - Balance - - - {formatCurrency(+balance.balance, 2, { - notation: 'compact', - compactDisplay: 'short', - })} - - - ) -} - -const StakeOutput = () => { - const ticker = useAtomValue(stRsrTickerAtom) - const stAmount = useAtomValue(stakeOutputAtom) - const usdAmount = useAtomValue(stakeAmountUsdAtom) - - return ( - - You receive: - - {formatCurrency(stAmount)} - - {ticker} - - - - - ${formatCurrency(usdAmount, 2)} - - - - - ) -} - -export default StakeOutput diff --git a/src/views/yield-dtf/staking/components/stake/ActionOverview.tsx b/src/views/yield-dtf/staking/components/stake/action-overview.tsx similarity index 69% rename from src/views/yield-dtf/staking/components/stake/ActionOverview.tsx rename to src/views/yield-dtf/staking/components/stake/action-overview.tsx index b9dd13cf3..5a53f4e47 100644 --- a/src/views/yield-dtf/staking/components/stake/ActionOverview.tsx +++ b/src/views/yield-dtf/staking/components/stake/action-overview.tsx @@ -1,8 +1,7 @@ import { useStaticGasEstimate } from 'hooks/useGasEstimate' -import { Box } from 'theme-ui' -import ExchangeRate from '../ExchangeRate' -import GasEstimate from '../GasEstimate' import { useAtomValue } from 'jotai' +import ExchangeRate from '../exchange-rate' +import GasEstimate from '../gas-estimate' import { stakeAmountAtom } from './atoms' const APPROVE_AND_STAKE_GAS_ESTIMATE = 400000 @@ -15,15 +14,15 @@ const Gas = () => { return null } - return + return } export const ActionOverview = () => { return ( - +
- +
) } diff --git a/src/views/yield-dtf/staking/components/stake/ConfirmStakeButton.tsx b/src/views/yield-dtf/staking/components/stake/confirm-stake-button.tsx similarity index 69% rename from src/views/yield-dtf/staking/components/stake/ConfirmStakeButton.tsx rename to src/views/yield-dtf/staking/components/stake/confirm-stake-button.tsx index 66ff2c606..bec1b2db2 100644 --- a/src/views/yield-dtf/staking/components/stake/ConfirmStakeButton.tsx +++ b/src/views/yield-dtf/staking/components/stake/confirm-stake-button.tsx @@ -1,6 +1,5 @@ import { Trans, t } from '@lingui/macro' -import { Button } from 'components' -import { TransactionButtonContainer } from '@/components/old/button/TransactionButton' +import { Button } from '@/components/ui/button' import CheckCircleIcon from 'components/icons/CheckCircleIcon' import GasIcon from 'components/icons/GasIcon' import TransactionsIcon from 'components/icons/TransactionsIcon' @@ -9,10 +8,10 @@ import useApproveAndExecute from 'hooks/useApproveAndExecute' import { useStaticGasEstimate } from 'hooks/useGasEstimate' import { useAtomValue } from 'jotai' import { chainIdAtom } from 'state/atoms' -import { Box, Link, Spinner, Text } from 'theme-ui' import { formatCurrency } from 'utils' import { ExplorerDataType, getExplorerLink } from 'utils/getExplorerLink' import { stakeAllowanceAtom, stakeTransactionAtom } from './atoms' +import { Skeleton } from '@/components/ui/skeleton' const APPROVE_GAS_ESTIMATE = 400000 const STAKE_AND_DELEGATE_GAS_ESTIMATE = 350000 @@ -22,19 +21,19 @@ const GasEstimate = ({ gasLimit }: { gasLimit: number }) => { const [total] = useStaticGasEstimate([gasLimit]) return ( - - Estimated gas cost: - +
+ Estimated gas cost: +
{total ? ( - + ${formatCurrency(total, 3)} - + ) : ( - + )} - - +
+
) } @@ -57,33 +56,31 @@ const ConfirmStakeButton = () => { } = useApproveAndExecute(call, allowance, 'Stake') const errorMsg = error ? ( - - - {error} - - +
+ {error} +
) : null if (validatingAllowance) { return ( - - - +
+ + Verifying allowance... - - + +
) } if (!hasAllowance && !isLoading && !isApproved) { return ( - +
- {errorMsg} - +
) } @@ -107,7 +104,7 @@ const ConfirmStakeButton = () => { const statusText = getStatusText() return ( - +
{allowance && (isApproved || !hasAllowance) && ( { success={isApproved} /> )} - +
- - +
+ {!executeHash ? 'Confirm Stake' : 'Transaction submitted'} - + {executeHash ? ( - View in explorer - + ) : ( - {statusText} + {statusText} )} - - {!!statusText && !isConfirmed && } +
+ {!!statusText && !isConfirmed && ( + + )} {isConfirmed && } -
- +
+
) } return ( - +
{ : STAKE_GAS_ESTIMATE } /> - {errorMsg} - +
) } export default ConfirmStakeButton diff --git a/src/views/yield-dtf/staking/components/stake/DelegateStake.tsx b/src/views/yield-dtf/staking/components/stake/delegate-stake.tsx similarity index 52% rename from src/views/yield-dtf/staking/components/stake/DelegateStake.tsx rename to src/views/yield-dtf/staking/components/stake/delegate-stake.tsx index 627df1fa2..8531484ff 100644 --- a/src/views/yield-dtf/staking/components/stake/DelegateStake.tsx +++ b/src/views/yield-dtf/staking/components/stake/delegate-stake.tsx @@ -1,9 +1,8 @@ import { Trans } from '@lingui/macro' -import VoteIcon from 'components/icons/VoteIcon' import { Edit2 } from 'lucide-react' -import { Box, Divider, IconButton, Text } from 'theme-ui' import { shortenAddress } from 'utils' -import EditDelegate from './EditDelegate' +import EditDelegate from './edit-delegate' +import { Button } from '@/components/ui/button' const DelegateStake = ({ editing, @@ -24,24 +23,29 @@ const DelegateStake = ({ onDismiss={() => onEdit(false)} /> ) : ( - - +
+ Voting power delegation: - + {value ? ( - - {shortenAddress(value)} - onEdit(true)}> +
+ {shortenAddress(value)} + +
) : ( - + Connect your wallet - + )} -
+
)} ) diff --git a/src/views/yield-dtf/staking/components/stake/EditDelegate.tsx b/src/views/yield-dtf/staking/components/stake/edit-delegate.tsx similarity index 57% rename from src/views/yield-dtf/staking/components/stake/EditDelegate.tsx rename to src/views/yield-dtf/staking/components/stake/edit-delegate.tsx index 6b4f7ef11..f64e8699a 100644 --- a/src/views/yield-dtf/staking/components/stake/EditDelegate.tsx +++ b/src/views/yield-dtf/staking/components/stake/edit-delegate.tsx @@ -1,9 +1,8 @@ import { Trans } from '@lingui/macro' import { Input } from 'components' -import { SmallButton } from '@/components/old/button' import { useState } from 'react' -import { Box, Text } from 'theme-ui' import { isAddress } from 'utils' +import { Button } from '@/components/ui/button' const EditDelegate = ({ onSave, @@ -18,42 +17,41 @@ const EditDelegate = ({ const isValid = !!isAddress(address) return ( - - - +
+
+ Delegate voting power - - + + +
setAddress(e.target.value)} /> {address && !isValid && ( - + Invalid address - + )} - +
) } diff --git a/src/views/yield-dtf/staking/components/stake/index.tsx b/src/views/yield-dtf/staking/components/stake/index.tsx index 22b4fa704..654b136f2 100644 --- a/src/views/yield-dtf/staking/components/stake/index.tsx +++ b/src/views/yield-dtf/staking/components/stake/index.tsx @@ -1,18 +1,17 @@ -import { Box } from 'theme-ui' -import InputOutputSeparator from '../InputOutputSeparator' -import ActionOverview from './ActionOverview' -import StakeButton from './StakeButton' -import StakeInput from './StakeInput' -import StakeOutput from './StakeOutput' +import InputOutputSeparator from '../input-output-separator' +import ActionOverview from './action-overview' +import StakeButton from './stake-button' +import StakeInput from './stake-input' +import StakeOutput from './stake-output' const Stake = () => ( - +
- +
) export default Stake diff --git a/src/views/yield-dtf/staking/components/stake/StakeButton.tsx b/src/views/yield-dtf/staking/components/stake/stake-button.tsx similarity index 75% rename from src/views/yield-dtf/staking/components/stake/StakeButton.tsx rename to src/views/yield-dtf/staking/components/stake/stake-button.tsx index 7a48d8588..8e7ac38d5 100644 --- a/src/views/yield-dtf/staking/components/stake/StakeButton.tsx +++ b/src/views/yield-dtf/staking/components/stake/stake-button.tsx @@ -1,12 +1,11 @@ import { Trans } from '@lingui/macro' -import { Button } from 'components' -import { TransactionButtonContainer } from '@/components/old/button/TransactionButton' +import { Button } from '@/components/ui/button' import { useAtomValue } from 'jotai' import mixpanel from 'mixpanel-browser/src/loaders/loader-module-core' import { useCallback, useState } from 'react' import { selectedRTokenAtom } from 'state/atoms' import { isValidStakeAmountAtom } from './atoms' -import StakeModal from './StakeModal' +import StakeModal from './stake-modal' const StakeButton = () => { const [isOpen, setOpen] = useState(false) @@ -26,11 +25,11 @@ const StakeButton = () => { return ( <> - - - +
{isOpen && } ) diff --git a/src/views/yield-dtf/staking/components/stake/StakeInput.tsx b/src/views/yield-dtf/staking/components/stake/stake-input.tsx similarity index 61% rename from src/views/yield-dtf/staking/components/stake/StakeInput.tsx rename to src/views/yield-dtf/staking/components/stake/stake-input.tsx index ed8fe6022..b54baa6e2 100644 --- a/src/views/yield-dtf/staking/components/stake/StakeInput.tsx +++ b/src/views/yield-dtf/staking/components/stake/stake-input.tsx @@ -1,13 +1,12 @@ -import { Button, NumericalInput } from 'components' +import { Button } from '@/components/ui/button' +import { NumericalInput } from 'components' import TokenLogo from 'components/icons/TokenLogo' import { useAtom, useAtomValue, useSetAtom } from 'jotai' import { useEffect } from 'react' import { rsrBalanceAtom, rsrPriceAtom } from 'state/atoms' -import { borderRadius } from 'theme' -import { Box, Text } from 'theme-ui' import { formatCurrency } from 'utils' import { stakeAmountAtom } from './atoms' -import InputPostfix from '../InputPostfix' +import InputPostfix from '../input-postfix' const StakeInputField = () => { const [amount, setAmount] = useAtom(stakeAmountAtom) @@ -19,7 +18,7 @@ const StakeInputField = () => { }, []) return ( - +
{ onChange={setAmount} /> {!!amount && } - +
) } @@ -40,13 +39,9 @@ const StakeUsdAmount = () => { } return ( - + ${formatCurrency(price * Number(amount), 2)} - + ) } @@ -55,41 +50,31 @@ const StakeBalance = () => { const setAmount = useSetAtom(stakeAmountAtom) return ( - +
- - Balance - - + Balance + {formatCurrency(+balance.balance, 2, { notation: 'compact', compactDisplay: 'short', })} - - - +
) } const StakeInput = () => ( - - You stake: +
+ You stake: - - +
- - +
+
) export default StakeInput diff --git a/src/views/yield-dtf/staking/components/stake/StakeModal.tsx b/src/views/yield-dtf/staking/components/stake/stake-modal.tsx similarity index 87% rename from src/views/yield-dtf/staking/components/stake/StakeModal.tsx rename to src/views/yield-dtf/staking/components/stake/stake-modal.tsx index 0f95dcf2c..bc2ad5d6c 100644 --- a/src/views/yield-dtf/staking/components/stake/StakeModal.tsx +++ b/src/views/yield-dtf/staking/components/stake/stake-modal.tsx @@ -14,11 +14,11 @@ import { stakeAmountUsdAtom, stakeOutputAtom, } from './atoms' -import AmountPreview from '../AmountPreview' -import ConfirmStakeButton from './ConfirmStakeButton' -import DelegateStake from './DelegateStake' +import AmountPreview from '../amount-preview' +import ConfirmStakeButton from './confirm-stake-button' +import DelegateStake from './delegate-stake' import { stRsrTickerAtom } from '@/views/yield-dtf/staking/atoms' -import UnstakeDelay from '../UnstakeDelay' +import UnstakeDelay from '../unstake-delay' const AmountsPreview = () => { const amount = useAtomValue(stakeAmountAtom) @@ -35,10 +35,10 @@ const AmountsPreview = () => { amount={Number(amount)} usdAmount={usdAmount} symbol="RSR" - mb="3" + className="mb-3" /> { }, [currentDelegate]) return ( - - + + {!isLegacy && ( { + const balance = useAtomValue(stRsrBalanceAtom) + + return ( +
+ + Balance + + {formatCurrency(+balance.balance, 2, { + notation: 'compact', + compactDisplay: 'short', + })} + +
+ ) +} + +const StakeOutput = () => { + const ticker = useAtomValue(stRsrTickerAtom) + const stAmount = useAtomValue(stakeOutputAtom) + const usdAmount = useAtomValue(stakeAmountUsdAtom) + + return ( +
+ You receive: +
+ {formatCurrency(stAmount)} + {ticker} +
+
+ + ${formatCurrency(usdAmount, 2)} + + +
+
+ ) +} + +export default StakeOutput diff --git a/src/views/yield-dtf/staking/components/unstake-delay.tsx b/src/views/yield-dtf/staking/components/unstake-delay.tsx new file mode 100644 index 000000000..a226c4bc9 --- /dev/null +++ b/src/views/yield-dtf/staking/components/unstake-delay.tsx @@ -0,0 +1,65 @@ +import { Trans } from '@lingui/macro' +import { useAtomValue } from 'jotai' +import { ArrowRight, ChevronDown, ChevronUp } from 'lucide-react' +import { useState } from 'react' +import { unstakeDelayAtom } from '../atoms' +import { cn } from '@/lib/utils' + +export const UnstakeFlow = () => { + const delay = useAtomValue(unstakeDelayAtom) + + return ( +
+
+
+ + Trigger Unstake + + 1 Transaction +
+ +
+
+ + {delay} Delay + + Wait entire period +
+ +
+
+ + Withdraw RSR + + 1 Transaction +
+
+ ) +} + +interface UnstakeDelayProps { + className?: string +} + +const UnstakeDelay = ({ className }: UnstakeDelayProps) => { + const delay = useAtomValue(unstakeDelayAtom) + const [isOpen, setOpen] = useState(false) + + return ( +
+
setOpen(!isOpen)} + > + + Unstaking delay: + + {delay} + {isOpen ? : } +
+ {isOpen && } +
+ ) +} + +export default UnstakeDelay diff --git a/src/views/yield-dtf/staking/components/unstake/UnstakeOutput.tsx b/src/views/yield-dtf/staking/components/unstake/UnstakeOutput.tsx deleted file mode 100644 index 4803d471e..000000000 --- a/src/views/yield-dtf/staking/components/unstake/UnstakeOutput.tsx +++ /dev/null @@ -1,67 +0,0 @@ -import TokenLogo from 'components/icons/TokenLogo' -import { useAtomValue } from 'jotai' -import { rsrBalanceAtom, rsrPriceAtom } from 'state/atoms' -import { borderRadius } from 'theme' -import { Box, Text } from 'theme-ui' -import { formatCurrency } from 'utils' -import { rateAtom } from '@/views/yield-dtf/staking/atoms' -import { unStakeAmountAtom } from './atoms' - -const RsrBalance = () => { - const balance = useAtomValue(rsrBalanceAtom) - - return ( - - - - Balance - - - {formatCurrency(+balance.balance, 2, { - notation: 'compact', - compactDisplay: 'short', - })} - - - ) -} - -const UnstakeOutput = () => { - const amount = useAtomValue(unStakeAmountAtom) - const rate = useAtomValue(rateAtom) - const price = useAtomValue(rsrPriceAtom) - - return ( - - You receive: - - {amount ? formatCurrency(Number(amount) * rate) : '0'} - - RSR - - - - - ${formatCurrency(price * (Number(amount) * rate), 2)} - - - - - ) -} - -export default UnstakeOutput diff --git a/src/views/yield-dtf/staking/components/unstake/ActionOverview.tsx b/src/views/yield-dtf/staking/components/unstake/action-overview.tsx similarity index 64% rename from src/views/yield-dtf/staking/components/unstake/ActionOverview.tsx rename to src/views/yield-dtf/staking/components/unstake/action-overview.tsx index 865564692..cb9061496 100644 --- a/src/views/yield-dtf/staking/components/unstake/ActionOverview.tsx +++ b/src/views/yield-dtf/staking/components/unstake/action-overview.tsx @@ -1,7 +1,6 @@ import { useAtomValue } from 'jotai' -import { Box } from 'theme-ui' -import ExchangeRate from '../ExchangeRate' -import GasEstimate from '../GasEstimate' +import ExchangeRate from '../exchange-rate' +import GasEstimate from '../gas-estimate' import { unStakeAmountAtom, unstakeGasEstimateAtom } from './atoms' const Gas = () => { @@ -12,15 +11,15 @@ const Gas = () => { return null } - return + return } export const ActionOverview = () => { return ( - +
- +
) } diff --git a/src/views/yield-dtf/staking/components/unstake/ConfirmUnstakeButton.tsx b/src/views/yield-dtf/staking/components/unstake/confirm-unstake-button.tsx similarity index 70% rename from src/views/yield-dtf/staking/components/unstake/ConfirmUnstakeButton.tsx rename to src/views/yield-dtf/staking/components/unstake/confirm-unstake-button.tsx index 1a8c87b03..17ce65ef4 100644 --- a/src/views/yield-dtf/staking/components/unstake/ConfirmUnstakeButton.tsx +++ b/src/views/yield-dtf/staking/components/unstake/confirm-unstake-button.tsx @@ -1,6 +1,5 @@ import { Trans } from '@lingui/macro' -import { Button } from 'components' -import { TransactionButtonContainer } from '@/components/old/button/TransactionButton' +import { Button } from '@/components/ui/button' import CheckCircleIcon from 'components/icons/CheckCircleIcon' import GasIcon from 'components/icons/GasIcon' import TransactionsIcon from 'components/icons/TransactionsIcon' @@ -9,30 +8,30 @@ import useWatchTransaction from 'hooks/useWatchTransaction' import { useAtomValue } from 'jotai' import { useMemo } from 'react' import { chainIdAtom } from 'state/atoms' -import { Box, Link, Spinner, Text } from 'theme-ui' import { formatCurrency } from 'utils' import { ExplorerDataType, getExplorerLink } from 'utils/getExplorerLink' import { unstakeDelayAtom } from '@/views/yield-dtf/staking/atoms' import { unstakeGasEstimateAtom, unstakeTransactionAtom } from './atoms' import { UseSimulateContractParameters } from 'wagmi' +import { Skeleton } from '@/components/ui/skeleton' const GasEstimate = () => { const estimate = useAtomValue(unstakeGasEstimateAtom) return ( - - Estimated gas cost: - +
+ Estimated gas cost: +
{estimate ? ( - + ${formatCurrency(estimate, 3)} - + ) : ( - + )} - - +
+
) } @@ -73,44 +72,47 @@ const ConfirmUnstakeButton = () => { if (!errorMsg && (isLoading || hash)) { return ( - +
- - +
+ {status === 'success' && `${delay} cooldown started`} {hash && status !== 'success' && 'Transaction submitted'} {!hash && 'Confirm Unstake'} - + {hash ? ( - View in explorer - + ) : ( - Proceed in wallet + Proceed in wallet )} - - {status !== 'success' ? : } - +
+ {status !== 'success' ? ( + + ) : ( + + )} +
) } return ( - +
- {!!errorMsg && ( - - - {errorMsg} - - +
+ {errorMsg} +
)} - +
) } diff --git a/src/views/yield-dtf/staking/components/unstake/index.tsx b/src/views/yield-dtf/staking/components/unstake/index.tsx index 5105ecdf2..22fcc7f74 100644 --- a/src/views/yield-dtf/staking/components/unstake/index.tsx +++ b/src/views/yield-dtf/staking/components/unstake/index.tsx @@ -1,19 +1,18 @@ -import { Box } from 'theme-ui' -import InputOutputSeparator from '../InputOutputSeparator' -import ActionOverview from './ActionOverview' -import UnstakeButton from './UnstakeButton' -import UnstakeInput from './UnstakeInput' -import UnstakeOutput from './UnstakeOutput' +import InputOutputSeparator from '../input-output-separator' +import ActionOverview from './action-overview' +import UnstakeButton from './unstake-button' +import UnstakeInput from './unstake-input' +import UnstakeOutput from './unstake-output' const Unstake = () => { return ( - +
- +
) } diff --git a/src/views/yield-dtf/staking/components/unstake/UnstakeButton.tsx b/src/views/yield-dtf/staking/components/unstake/unstake-button.tsx similarity index 81% rename from src/views/yield-dtf/staking/components/unstake/UnstakeButton.tsx rename to src/views/yield-dtf/staking/components/unstake/unstake-button.tsx index 080938773..0cfc5bdcd 100644 --- a/src/views/yield-dtf/staking/components/unstake/UnstakeButton.tsx +++ b/src/views/yield-dtf/staking/components/unstake/unstake-button.tsx @@ -1,11 +1,10 @@ import { Trans } from '@lingui/macro' -import { Button } from 'components' -import { TransactionButtonContainer } from '@/components/old/button/TransactionButton' +import { Button } from '@/components/ui/button' import { useAtomValue } from 'jotai' import mixpanel from 'mixpanel-browser/src/loaders/loader-module-core' import { useCallback, useState } from 'react' import { rTokenTradingAvailableAtom, selectedRTokenAtom } from 'state/atoms' -import UnstakeModal from './UnstakeModal' +import UnstakeModal from './unstake-modal' import { isValidUnstakeAmountAtom } from './atoms' const UnstakeButton = () => { @@ -27,15 +26,15 @@ const UnstakeButton = () => { return ( <> - +
- +
{isOpen && } ) diff --git a/src/views/yield-dtf/staking/components/unstake/UnstakeInput.tsx b/src/views/yield-dtf/staking/components/unstake/unstake-input.tsx similarity index 64% rename from src/views/yield-dtf/staking/components/unstake/UnstakeInput.tsx rename to src/views/yield-dtf/staking/components/unstake/unstake-input.tsx index 3a6195abc..c9e323705 100644 --- a/src/views/yield-dtf/staking/components/unstake/UnstakeInput.tsx +++ b/src/views/yield-dtf/staking/components/unstake/unstake-input.tsx @@ -1,13 +1,12 @@ -import { Button, NumericalInput } from 'components' +import { Button } from '@/components/ui/button' +import { NumericalInput } from 'components' import TokenLogo from 'components/icons/TokenLogo' import { useAtom, useAtomValue, useSetAtom } from 'jotai' import { useEffect } from 'react' import { rsrPriceAtom, stRsrBalanceAtom } from 'state/atoms' -import { borderRadius } from 'theme' -import { Box, Text } from 'theme-ui' import { formatCurrency } from 'utils' import { rateAtom, stRsrTickerAtom } from '@/views/yield-dtf/staking/atoms' -import InputPostfix from '../InputPostfix' +import InputPostfix from '../input-postfix' import { unStakeAmountAtom } from './atoms' const UnstakeInputField = () => { @@ -21,7 +20,7 @@ const UnstakeInputField = () => { }, []) return ( - +
{ onChange={setAmount} /> {!!amount && } - +
) } @@ -43,13 +42,9 @@ const UnstakeUsdAmount = () => { } return ( - + ${formatCurrency(price * (Number(amount) * rate), 2)} - + ) } @@ -58,41 +53,31 @@ const UnstakeBalance = () => { const setAmount = useSetAtom(unStakeAmountAtom) return ( - +
- - Balance - - + Balance + {formatCurrency(+balance.balance, 2, { notation: 'compact', compactDisplay: 'short', })} - - - +
) } const UnstakeInput = () => ( - - You unstake: +
+ You unstake: - - +
- - +
+
) export default UnstakeInput diff --git a/src/views/yield-dtf/staking/components/unstake/UnstakeModal.tsx b/src/views/yield-dtf/staking/components/unstake/unstake-modal.tsx similarity index 81% rename from src/views/yield-dtf/staking/components/unstake/UnstakeModal.tsx rename to src/views/yield-dtf/staking/components/unstake/unstake-modal.tsx index 84b9f8fc4..2bf55a3c4 100644 --- a/src/views/yield-dtf/staking/components/unstake/UnstakeModal.tsx +++ b/src/views/yield-dtf/staking/components/unstake/unstake-modal.tsx @@ -3,11 +3,10 @@ import { Modal } from 'components' import ShowMore from 'components/transaction-modal/ShowMore' import { useAtomValue, useSetAtom } from 'jotai' import { useCallback } from 'react' -import { Box, Text } from 'theme-ui' import { rateAtom, stRsrTickerAtom } from '@/views/yield-dtf/staking/atoms' -import AmountPreview from '../AmountPreview' -import UnstakeDelay from '../UnstakeDelay' -import ConfirmUnstakeButton from './ConfirmUnstakeButton' +import AmountPreview from '../amount-preview' +import UnstakeDelay from '../unstake-delay' +import ConfirmUnstakeButton from './confirm-unstake-button' import { unStakeAmountAtom } from './atoms' import { rsrPriceAtom } from 'state/atoms' @@ -33,23 +32,23 @@ const UnstakePreview = () => { amount={rsrAmount} usdAmount={usdAmount} symbol="RSR" - mt="3" + className="mt-3" /> ) } const UnstakeExtra = () => ( - + - - +
+ Staking yield share ends: - - + + Immediate - - + +
) diff --git a/src/views/yield-dtf/staking/components/unstake/unstake-output.tsx b/src/views/yield-dtf/staking/components/unstake/unstake-output.tsx new file mode 100644 index 000000000..19e5a1509 --- /dev/null +++ b/src/views/yield-dtf/staking/components/unstake/unstake-output.tsx @@ -0,0 +1,47 @@ +import TokenLogo from 'components/icons/TokenLogo' +import { useAtomValue } from 'jotai' +import { rsrBalanceAtom, rsrPriceAtom } from 'state/atoms' +import { formatCurrency } from 'utils' +import { rateAtom } from '@/views/yield-dtf/staking/atoms' +import { unStakeAmountAtom } from './atoms' + +const RsrBalance = () => { + const balance = useAtomValue(rsrBalanceAtom) + + return ( +
+ + Balance + + {formatCurrency(+balance.balance, 2, { + notation: 'compact', + compactDisplay: 'short', + })} + +
+ ) +} + +const UnstakeOutput = () => { + const amount = useAtomValue(unStakeAmountAtom) + const rate = useAtomValue(rateAtom) + const price = useAtomValue(rsrPriceAtom) + + return ( +
+ You receive: +
+ {amount ? formatCurrency(Number(amount) * rate) : '0'} + RSR +
+
+ + ${formatCurrency(price * (Number(amount) * rate), 2)} + + +
+
+ ) +} + +export default UnstakeOutput diff --git a/src/views/yield-dtf/staking/components/withdraw/AvailableUnstake.tsx b/src/views/yield-dtf/staking/components/withdraw/available-unstake.tsx similarity index 65% rename from src/views/yield-dtf/staking/components/withdraw/AvailableUnstake.tsx rename to src/views/yield-dtf/staking/components/withdraw/available-unstake.tsx index a5affd308..8abb1de4a 100644 --- a/src/views/yield-dtf/staking/components/withdraw/AvailableUnstake.tsx +++ b/src/views/yield-dtf/staking/components/withdraw/available-unstake.tsx @@ -1,6 +1,5 @@ import { Trans, t } from '@lingui/macro' import StRSR from 'abis/StRSR' -import TransactionButton from '@/components/old/button/TransactionButton' import TokenLogo from 'components/icons/TokenLogo' import useContractWrite from 'hooks/useContractWrite' import useRToken from 'hooks/useRToken' @@ -13,22 +12,18 @@ import { rsrPriceAtom, walletAtom, } from 'state/atoms' -import { boxShadow } from 'theme' -import { Box, BoxProps, Card, Text } from 'theme-ui' import { formatCurrency } from 'utils' import { pendingRSRSummaryAtom } from '@/views/yield-dtf/staking/atoms' +import { cn } from '@/lib/utils' +import { Button } from '@/components/ui/button' const Header = () => ( - +
- + RSR available to withdraw - - + +
) const AvailableBalance = () => { @@ -36,15 +31,15 @@ const AvailableBalance = () => { const price = useAtomValue(rsrPriceAtom) return ( - +
- - {formatCurrency(availableAmount)} RSR - +
+ {formatCurrency(availableAmount)} RSR + ${formatCurrency(availableAmount * price)} - - - + +
+
) } @@ -71,27 +66,34 @@ const ConfirmWithdraw = () => { const { isMining } = useWatchTransaction({ hash, label: 'Withdraw RSR' }) return ( - + disabled={!isReady || isLoading || isMining} + > + {isLoading || isMining ? ( + Processing... + ) : ( + Withdraw + )} + ) } -const AvailableUnstake = (props: BoxProps) => { +interface AvailableUnstakeProps { + className?: string +} + +const AvailableUnstake = ({ className }: AvailableUnstakeProps) => { return ( - +
- +
- - +
+
) } diff --git a/src/views/yield-dtf/staking/components/withdraw/CooldownUnstake.tsx b/src/views/yield-dtf/staking/components/withdraw/cooldown-unstake.tsx similarity index 62% rename from src/views/yield-dtf/staking/components/withdraw/CooldownUnstake.tsx rename to src/views/yield-dtf/staking/components/withdraw/cooldown-unstake.tsx index bb296762e..bf3d1bbba 100644 --- a/src/views/yield-dtf/staking/components/withdraw/CooldownUnstake.tsx +++ b/src/views/yield-dtf/staking/components/withdraw/cooldown-unstake.tsx @@ -1,6 +1,5 @@ import { t } from '@lingui/macro' import StRSR from 'abis/StRSR' -import TransactionButton from '@/components/old/button/TransactionButton' import SpinnerIcon from 'components/icons/SpinnerIcon' import TokenLogo from 'components/icons/TokenLogo' import useContractWrite from 'hooks/useContractWrite' @@ -8,27 +7,22 @@ import useRToken from 'hooks/useRToken' import useWatchTransaction from 'hooks/useWatchTransaction' import { useAtomValue } from 'jotai' import { rTokenStateAtom, rsrPriceAtom } from 'state/atoms' -import { Box, BoxProps, Card, Text } from 'theme-ui' import { formatCurrency } from 'utils' import { pendingRSRSummaryAtom, unstakeDelayAtom, } from '@/views/yield-dtf/staking/atoms' +import { cn } from '@/lib/utils' +import { Button } from '@/components/ui/button' const Header = () => { const delay = useAtomValue(unstakeDelayAtom) return ( - +
- - RSR in {delay} Cooldown - - + RSR in {delay} Cooldown +
) } @@ -37,15 +31,15 @@ const AvailableBalance = () => { const price = useAtomValue(rsrPriceAtom) return ( - +
- - {formatCurrency(pendingAmount)} RSR - +
+ {formatCurrency(pendingAmount)} RSR + ${formatCurrency(pendingAmount * price)} - - - + +
+
) } @@ -66,36 +60,37 @@ const ConfirmWithdraw = () => { const { isMining } = useWatchTransaction({ hash, label: 'Cancel unstake' }) return ( - + disabled={!isReady || isLoading || isMining} + > + {isLoading || isMining ? 'Processing...' : t`Cancel unstake`} + ) } -const CooldownUnstake = (props: BoxProps) => { +interface CooldownUnstakeProps { + className?: string +} + +const CooldownUnstake = ({ className }: CooldownUnstakeProps) => { const { pendingAmount } = useAtomValue(pendingRSRSummaryAtom) return ( - +
{!pendingAmount ? ( - - No RSR in cooldown - + No RSR in cooldown ) : ( - +
- +
)} -
+
) } diff --git a/src/views/yield-dtf/staking/components/withdraw/index.tsx b/src/views/yield-dtf/staking/components/withdraw/index.tsx index 177c99137..e4e886278 100644 --- a/src/views/yield-dtf/staking/components/withdraw/index.tsx +++ b/src/views/yield-dtf/staking/components/withdraw/index.tsx @@ -1,19 +1,23 @@ import { Trans } from '@lingui/macro' -import { Box, BoxProps, Text } from 'theme-ui' -import AvailableUnstake from './AvailableUnstake' -import CooldownUnstake from './CooldownUnstake' -import Updater from './Updater' +import { cn } from '@/lib/utils' +import AvailableUnstake from './available-unstake' +import CooldownUnstake from './cooldown-unstake' +import Updater from './updater' -const Withdraw = (props: BoxProps) => { +interface WithdrawProps { + className?: string +} + +const Withdraw = ({ className }: WithdrawProps) => { return ( <> - - +
+

In Withdraw Process - - - - +

+ + +
) diff --git a/src/views/yield-dtf/staking/components/withdraw/Updater.tsx b/src/views/yield-dtf/staking/components/withdraw/updater.tsx similarity index 100% rename from src/views/yield-dtf/staking/components/withdraw/Updater.tsx rename to src/views/yield-dtf/staking/components/withdraw/updater.tsx diff --git a/src/views/yield-dtf/staking/index.tsx b/src/views/yield-dtf/staking/index.tsx index 7ae5469c5..71ff3a583 100644 --- a/src/views/yield-dtf/staking/index.tsx +++ b/src/views/yield-dtf/staking/index.tsx @@ -1 +1,19 @@ -export { default } from './Staking' +import StakeContainer from './components/stake-container' +import Overview from './components/overview' +import Withdraw from './components/withdraw' +import StakePosition from './components/stake-position' + +const Staking = () => ( +
+
+
+ + + +
+ +
+
+) + +export default Staking diff --git a/src/views/yield-dtf/staking/tests/stake-calculation.test.ts b/src/views/yield-dtf/staking/tests/stake-calculation.test.ts new file mode 100644 index 000000000..82770bccc --- /dev/null +++ b/src/views/yield-dtf/staking/tests/stake-calculation.test.ts @@ -0,0 +1,360 @@ +import { describe, it, expect } from 'vitest' + +/** + * This file tests the stake/unstake LIFO matching logic used in accountStakeHistoryAtom. + * + * The logic is extracted here for testing. The actual atom at atoms.ts uses this same algorithm + * but wrapped in async GraphQL fetching. + * + * BUG VERIFICATION: The isStake field from subgraph is a string ("true"/"false"), not boolean. + * The current implementation uses `if (record.isStake)` which treats "false" as truthy. + */ + +type StakeRecord = { + exchangeRate: string + amount: string + rsrAmount: bigint + isStake: string // This is a string from the subgraph, not boolean! +} + +// This is the exact logic from accountStakeHistoryAtom, extracted for testing +function calculateStakeHistory(records: StakeRecord[]) { + let stakes: [number, number, number][] = [] + let totalRewardBalance = 0 + + for (const record of records) { + const recordAmount = Number(record.amount) + const recordExchangeRate = Number(record.exchangeRate) + + // CURRENT IMPLEMENTATION - potentially buggy + // This treats "false" string as truthy + if (record.isStake) { + stakes.push([recordAmount, recordExchangeRate, Number(record.rsrAmount)]) + } else { + let stakesRewarded = 0 + let unstake = recordAmount + + for (let i = 0; i < stakes.length; i++) { + const [stakeAmount, stakeExchangeRate, stakeRsrAmount] = stakes[i] + const snapshotRsrAmount = + Math.min(unstake, stakeAmount) * stakeExchangeRate + const currentRsrAmount = + Math.min(unstake, stakeAmount) * recordExchangeRate + + totalRewardBalance += currentRsrAmount - snapshotRsrAmount + + if (stakeAmount > unstake) { + stakes[i] = [ + stakeAmount - unstake, + stakeExchangeRate, + stakeRsrAmount - snapshotRsrAmount, + ] + break + } else if (stakeAmount === unstake) { + stakesRewarded++ + break + } else { + unstake = unstake - stakeAmount + stakesRewarded++ + } + } + stakes = stakes.slice(stakesRewarded) + } + } + + return { stakes, totalRewardBalance } +} + +// FIXED version for comparison +function calculateStakeHistoryFixed(records: StakeRecord[]) { + let stakes: [number, number, number][] = [] + let totalRewardBalance = 0 + + for (const record of records) { + const recordAmount = Number(record.amount) + const recordExchangeRate = Number(record.exchangeRate) + + // FIXED: Compare string value explicitly + if (record.isStake === 'true' || (record.isStake as any) === true) { + stakes.push([recordAmount, recordExchangeRate, Number(record.rsrAmount)]) + } else { + let stakesRewarded = 0 + let unstake = recordAmount + + for (let i = 0; i < stakes.length; i++) { + const [stakeAmount, stakeExchangeRate, stakeRsrAmount] = stakes[i] + const snapshotRsrAmount = + Math.min(unstake, stakeAmount) * stakeExchangeRate + const currentRsrAmount = + Math.min(unstake, stakeAmount) * recordExchangeRate + + totalRewardBalance += currentRsrAmount - snapshotRsrAmount + + if (stakeAmount > unstake) { + stakes[i] = [ + stakeAmount - unstake, + stakeExchangeRate, + stakeRsrAmount - snapshotRsrAmount, + ] + break + } else if (stakeAmount === unstake) { + stakesRewarded++ + break + } else { + unstake = unstake - stakeAmount + stakesRewarded++ + } + } + stakes = stakes.slice(stakesRewarded) + } + } + + return { stakes, totalRewardBalance } +} + +describe('Stake LIFO Calculation Logic', () => { + describe('basic stake/unstake flow', () => { + it('handles single stake without unstake', () => { + const records: StakeRecord[] = [ + { + exchangeRate: '1.0', + amount: '100', + rsrAmount: 100n, + isStake: 'true', + }, + ] + + const result = calculateStakeHistoryFixed(records) + + expect(result.stakes.length).toBe(1) + expect(result.stakes[0][0]).toBe(100) // amount + expect(result.totalRewardBalance).toBe(0) + }) + + it('calculates rewards on full unstake', () => { + const records: StakeRecord[] = [ + { + exchangeRate: '1.0', + amount: '100', + rsrAmount: 100n, + isStake: 'true', + }, + { + // Exchange rate increased - user earned rewards + exchangeRate: '1.1', + amount: '100', + rsrAmount: 100n, + isStake: 'false', + }, + ] + + const result = calculateStakeHistoryFixed(records) + + expect(result.stakes.length).toBe(0) // All unstaked + // Rewards: 100 * 1.1 - 100 * 1.0 = 10 + expect(result.totalRewardBalance).toBeCloseTo(10, 5) + }) + + it('handles partial unstake (LIFO matching)', () => { + const records: StakeRecord[] = [ + { + exchangeRate: '1.0', + amount: '100', + rsrAmount: 100n, + isStake: 'true', + }, + { + exchangeRate: '1.1', + amount: '50', // Partial unstake + rsrAmount: 50n, + isStake: 'false', + }, + ] + + const result = calculateStakeHistoryFixed(records) + + expect(result.stakes.length).toBe(1) + expect(result.stakes[0][0]).toBe(50) // 100 - 50 remaining + // Rewards on 50 tokens: 50 * 1.1 - 50 * 1.0 = 5 + expect(result.totalRewardBalance).toBeCloseTo(5, 5) + }) + + it('handles multiple stakes with full unstake spanning entries', () => { + const records: StakeRecord[] = [ + { + exchangeRate: '1.0', + amount: '50', + rsrAmount: 50n, + isStake: 'true', + }, + { + exchangeRate: '1.0', + amount: '50', + rsrAmount: 50n, + isStake: 'true', + }, + { + // Unstake 75 - spans first stake (50) + part of second (25) + exchangeRate: '1.2', + amount: '75', + rsrAmount: 75n, + isStake: 'false', + }, + ] + + const result = calculateStakeHistoryFixed(records) + + expect(result.stakes.length).toBe(1) + expect(result.stakes[0][0]).toBe(25) // 100 - 75 remaining + // Rewards: 75 * 1.2 - 75 * 1.0 = 15 + expect(result.totalRewardBalance).toBeCloseTo(15, 5) + }) + }) + + describe('BUG: isStake string type handling', () => { + it('BUG TEST: treats isStake="false" correctly as unstake', () => { + // This test verifies the bug where "false" string is truthy + const records: StakeRecord[] = [ + { + exchangeRate: '1.0', + amount: '100', + rsrAmount: 100n, + isStake: 'true', + }, + { + exchangeRate: '1.1', + amount: '100', + rsrAmount: 100n, + isStake: 'false', // String "false", not boolean false + }, + ] + + // Current buggy implementation + const buggyResult = calculateStakeHistory(records) + + // Fixed implementation + const fixedResult = calculateStakeHistoryFixed(records) + + // BUG: The buggy version treats "false" as truthy, so it ADDS another stake + // instead of processing an unstake + expect(buggyResult.stakes.length).toBe(2) // Bug: added as stake + expect(fixedResult.stakes.length).toBe(0) // Fixed: processed as unstake + + // Bug: No rewards calculated because unstake wasn't processed + expect(buggyResult.totalRewardBalance).toBe(0) + expect(fixedResult.totalRewardBalance).toBeCloseTo(10, 5) // Correct rewards + }) + + it('handles boolean true correctly', () => { + const records: StakeRecord[] = [ + { + exchangeRate: '1.0', + amount: '100', + rsrAmount: 100n, + isStake: true as any, // Some implementations might send boolean + }, + ] + + const result = calculateStakeHistoryFixed(records) + expect(result.stakes.length).toBe(1) + }) + + it('handles boolean false correctly', () => { + const records: StakeRecord[] = [ + { + exchangeRate: '1.0', + amount: '100', + rsrAmount: 100n, + isStake: 'true', + }, + { + exchangeRate: '1.1', + amount: '100', + rsrAmount: 100n, + isStake: false as any, // Some implementations might send boolean + }, + ] + + const result = calculateStakeHistoryFixed(records) + expect(result.stakes.length).toBe(0) + expect(result.totalRewardBalance).toBeCloseTo(10, 5) + }) + }) + + describe('edge cases', () => { + it('handles empty records array', () => { + const result = calculateStakeHistoryFixed([]) + + expect(result.stakes.length).toBe(0) + expect(result.totalRewardBalance).toBe(0) + }) + + it('handles exact stake-unstake match', () => { + const records: StakeRecord[] = [ + { + exchangeRate: '1.0', + amount: '100', + rsrAmount: 100n, + isStake: 'true', + }, + { + exchangeRate: '1.0', // Same rate - no rewards + amount: '100', + rsrAmount: 100n, + isStake: 'false', + }, + ] + + const result = calculateStakeHistoryFixed(records) + + expect(result.stakes.length).toBe(0) + expect(result.totalRewardBalance).toBe(0) // No change in exchange rate + }) + + it('handles negative rewards (exchange rate dropped)', () => { + const records: StakeRecord[] = [ + { + exchangeRate: '1.0', + amount: '100', + rsrAmount: 100n, + isStake: 'true', + }, + { + exchangeRate: '0.9', // Rate dropped - loss + amount: '100', + rsrAmount: 100n, + isStake: 'false', + }, + ] + + const result = calculateStakeHistoryFixed(records) + + expect(result.stakes.length).toBe(0) + // Loss: 100 * 0.9 - 100 * 1.0 = -10 + expect(result.totalRewardBalance).toBeCloseTo(-10, 5) + }) + + it('handles large amounts without precision loss', () => { + const records: StakeRecord[] = [ + { + exchangeRate: '1.0', + amount: '1000000000', // 1 billion + rsrAmount: 1000000000n, + isStake: 'true', + }, + { + exchangeRate: '1.000001', // Small increase + amount: '1000000000', + rsrAmount: 1000000000n, + isStake: 'false', + }, + ] + + const result = calculateStakeHistoryFixed(records) + + expect(result.stakes.length).toBe(0) + // Rewards: 1B * 1.000001 - 1B * 1.0 = 1000 + expect(result.totalRewardBalance).toBeCloseTo(1000, 0) + }) + }) +}) diff --git a/tailwind.config.ts b/tailwind.config.ts index 49e7dd437..338489c79 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -131,6 +131,14 @@ const config = { transform: 'rotate(360deg)', }, }, + 'slide-left': { + from: { left: '50%' }, + to: { left: 'calc(50% - 150px)' }, + }, + 'slide-out-right': { + from: { right: '0' }, + to: { right: '-395px' }, + }, }, animation: { 'accordion-down': 'accordion-down 0.2s ease-out', @@ -140,6 +148,8 @@ const config = { 'width-expand': 'width-expand 0.4s cubic-bezier(0.25, 0.8, 0.25, 1) forwards', 'spin-slow': 'spin-slow 4s linear infinite', + 'slide-left': 'slide-left 0.5s forwards', + 'slide-out-right': 'slide-out-right 0.5s forwards', }, }, }, diff --git a/tsconfig.json b/tsconfig.json index 9ba8c63f9..783c11070 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -14,7 +14,7 @@ "noEmit": true, "noFallthroughCasesInSwitch": true, "jsx": "react-jsx", - "types": ["vite/client"], + "types": ["vite/client", "vitest/globals"], "baseUrl": "src", "paths": { "@/*": ["./*"] diff --git a/vite.config.ts b/vite.config.ts index 6ef9e9a3c..de9ba1a71 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,134 +1,89 @@ import { sentryVitePlugin } from '@sentry/vite-plugin' -import { defineConfig } from 'vite' +import { defineConfig } from 'vitest/config' import react from '@vitejs/plugin-react' import viteTsconfigPaths from 'vite-tsconfig-paths' -import path from 'path' import { lingui } from '@lingui/vite-plugin' import { viteStaticCopy } from 'vite-plugin-static-copy' -// https://vitejs.dev/config/ +const isTest = process.env.NODE_ENV === 'test' || process.env.VITEST + export default defineConfig({ plugins: [ react({ babel: { plugins: [ - 'macros', - [ - '@locator/babel-jsx/dist', - { - env: 'development', - }, - ], + // Skip lingui macros in test - we mock @lingui/macro directly + ...(!isTest ? ['macros'] : []), + ['@locator/babel-jsx/dist', { env: 'development' }], // Click-to-source in dev ], }, }), - lingui(), - viteTsconfigPaths(), + // Skip lingui plugin in test - interferes with vi.mock + ...(!isTest ? [lingui()] : []), + viteTsconfigPaths(), // Resolves tsconfig paths (@/, utils/, etc.) viteStaticCopy({ targets: [ - { - src: 'node_modules/@reserve-protocol/rtokens/images/*', - dest: 'svgs', - }, - { - src: '_headers', - dest: '', - }, + { src: 'node_modules/@reserve-protocol/rtokens/images/*', dest: 'svgs' }, + { src: '_headers', dest: '' }, // Cloudflare security headers ], }), - { - name: 'configure-response-headers', - configureServer(server) { - server.middlewares.use((req, res, next) => { - res.setHeader('X-Frame-Options', 'SAMEORIGIN') - res.setHeader( - 'Strict-Transport-Security', - 'max-age=63072000; includeSubDomains; preload' - ) - res.setHeader( - 'Content-Security-Policy', - "object-src 'none'; base-uri 'self'; frame-ancestors 'none';" - ) - next() - }) - }, - }, - sentryVitePlugin({ - org: 'abc-labs-0g', - project: 'register', - }), + sentryVitePlugin({ org: 'abc-labs-0g', project: 'register' }), ], + define: { - 'import.meta.env.VITE_GIT_SHA': JSON.stringify( - process.env.CF_PAGES_COMMIT_SHA - ), + 'import.meta.env.VITE_GIT_SHA': JSON.stringify(process.env.CF_PAGES_COMMIT_SHA), }, + build: { outDir: 'build', sourcemap: true, rollupOptions: { output: { manualChunks: (id) => { - // Skip non-node_modules - if (!id.includes('node_modules')) { - return undefined; - } + if (!id.includes('node_modules')) return undefined - // Core React dependencies - if (id.includes('react-dom')) { - return 'react-dom'; - } - if (id.includes('react') && !id.includes('react-')) { - return 'react'; + // Wallet stack - large, updates together (check first, most specific) + if ( + id.includes('@rainbow-me/rainbowkit') || + id.includes('wagmi') || + id.includes('@wagmi') || + id.includes('viem') || + id.includes('@walletconnect') || + id.includes('@coinbase/wallet-sdk') || + id.includes('@reown/') || + id.includes('ox/_esm') // viem dependency + ) { + return 'wallet' } - // Large libraries that should be separate - if (id.includes('@rainbow-me/rainbowkit')) { - return 'rainbowkit'; - } - if (id.includes('wagmi') || id.includes('@wagmi')) { - return 'wagmi'; - } - if (id.includes('viem')) { - return 'viem'; - } - if (id.includes('@walletconnect')) { - return 'walletconnect'; - } - if (id.includes('@coinbase/wallet-sdk')) { - return 'coinbase'; - } + // Core React - check after wallet to avoid circular deps + if (id.includes('/react-dom/')) return 'react-dom' + if (id.includes('/react/') && !id.includes('react-')) return 'react' // UI libraries - if (id.includes('@radix-ui')) { - return 'radix-ui'; - } - if (id.includes('recharts')) { - return 'charts'; - } + if (id.includes('@radix-ui') || id.includes('recharts')) return 'ui' - // Other vendor libs - if (id.includes('ethers')) { - return 'ethers'; - } - if (id.includes('@tanstack')) { - return 'tanstack'; + // Data/state management + if ( + id.includes('@tanstack') || + id.includes('jotai') || + id.includes('graphql') + ) { + return 'data' } - if (id.includes('jotai')) { - return 'jotai'; - } - } - } - } - }, - resolve: { - alias: { - components: path.resolve('src/components/'), - types: path.resolve('src/types/'), - utils: path.resolve('src/utils/'), - '@': path.resolve(__dirname, './src'), + + // Legacy - can remove when ethers is fully removed + if (id.includes('ethers')) return 'ethers' + + // Everything else goes to vendor chunk + return 'vendor' + }, + }, }, }, + + // Aliases handled by viteTsconfigPaths - no need to duplicate here + optimizeDeps: { exclude: ['ts-node'], include: [ @@ -140,18 +95,16 @@ export default defineConfig({ '@radix-ui/react-select', '@radix-ui/react-tabs', ], - esbuildOptions: { - target: 'es2020', - // Help with tree shaking - treeShaking: true - } }, + server: { port: 3000, }, + test: { - include: ['src/lib/**/*.test.{ts,.tsx}'], + include: ['src/**/tests/**/*.test.{ts,tsx}'], globals: true, - environment: 'node', + environment: 'jsdom', + setupFiles: ['./src/setup-tests.ts'], }, })