diff --git a/apps/website/src/pages/index.tsx b/apps/website/src/pages/index.tsx new file mode 100644 index 00000000..73f8ed4c --- /dev/null +++ b/apps/website/src/pages/index.tsx @@ -0,0 +1,37 @@ +import React from 'react'; +import Head from 'next/head'; +import Link from 'next/link'; + +export default function Home() { + return ( + <> + + Nester — DeFi Yield Optimizer + + +
+

Nester

+

+ Decentralized yield optimization on Stellar +

+
+ + Launch App + + + Security + +
+
+ + ); +} diff --git a/apps/website/src/pages/security.module.css b/apps/website/src/pages/security.module.css new file mode 100644 index 00000000..e2ed2157 --- /dev/null +++ b/apps/website/src/pages/security.module.css @@ -0,0 +1 @@ +/* Security page specific styles if needed */ diff --git a/apps/website/src/pages/security.test.tsx b/apps/website/src/pages/security.test.tsx new file mode 100644 index 00000000..acb7d8f8 --- /dev/null +++ b/apps/website/src/pages/security.test.tsx @@ -0,0 +1,49 @@ +import React from 'react'; +import { render, screen } from '@testing-library/react'; +import SecurityPage from './security'; + +describe('SecurityPage', () => { + it('renders without errors', () => { + render(); + expect(screen.getByText('Security & Audit')).toBeInTheDocument(); + }); + + it('displays audit status as Pending', () => { + render(); + expect(screen.getByText('Pending')).toBeInTheDocument(); + }); + + it('lists all contracts in scope', () => { + render(); + const contracts = [ + 'vault', + 'vault_token', + 'allocation_strategy', + 'yield_registry', + 'nester', + 'treasury', + 'timelock', + ]; + contracts.forEach((contract) => { + expect(screen.getByText(contract)).toBeInTheDocument(); + }); + }); + + it('links to the threat model document', () => { + render(); + const link = screen.getByText('threat model document'); + expect(link).toBeInTheDocument(); + expect(link.closest('a')).toHaveAttribute('href', '/AUDIT_THREAT_MODEL.md'); + }); + + it('has a bug bounty section with contact email', () => { + render(); + expect(screen.getByText('Bug Bounty')).toBeInTheDocument(); + const emailLink = screen.getByText('security@nester.finance'); + expect(emailLink).toBeInTheDocument(); + expect(emailLink.closest('a')).toHaveAttribute( + 'href', + 'mailto:security@nester.finance' + ); + }); +}); diff --git a/apps/website/src/pages/security.tsx b/apps/website/src/pages/security.tsx new file mode 100644 index 00000000..4bc7e457 --- /dev/null +++ b/apps/website/src/pages/security.tsx @@ -0,0 +1,119 @@ +import React from 'react'; +import Head from 'next/head'; +import Link from 'next/link'; + +const contractsInScope = [ + 'vault', + 'vault_token', + 'allocation_strategy', + 'yield_registry', + 'nester', + 'treasury', + 'timelock', +]; + +export default function SecurityPage() { + return ( + <> + + Security & Audit | Nester + + +
+
+

+ Security & Audit +

+ + {/* Smart Contract Audit Section */} +
+

+ Smart Contract Audit +

+
+ + Pending + +

+ Audit scheduled — details will be announced once confirmed with + the auditor. +

+
+
+

+ Threat Model +

+

+ Review our{' '} + + threat model document + {' '} + for a detailed analysis of potential risks and mitigations. +

+
+
+

+ Contracts in Scope +

+
    + {contractsInScope.map((contract) => ( +
  • {contract}
  • + ))} +
+
+
+ + {/* Bug Bounty Section */} +
+

+ Bug Bounty +

+

+ We encourage responsible disclosure of security vulnerabilities. + If you discover a bug or security issue in any of our smart + contracts or infrastructure, please report it privately. +

+
+

+ Disclosure Process +

+
    +
  1. + Email your findings to{' '} + + security@nester.finance + +
  2. +
  3. + Include a detailed description of the vulnerability and steps + to reproduce. +
  4. +
  5. + Allow us reasonable time to investigate and address the issue + before public disclosure. +
  6. +
  7. + We will acknowledge receipt within 48 hours and provide + updates throughout the remediation process. +
  8. +
+
+

+ For critical vulnerabilities, we offer a bug bounty reward at our + discretion. Thank you for helping keep Nester safe! +

+
+
+
+ + ); +}