# Project export: Elevyn

This document was generated by HackStack to give an AI agent context about a hackathon project. Sections are labeled with their provenance; content marked as truncated was cut to keep this document small.

## Project metadata

- Hackathon: Cal Hacks 11.0
- Tagline: Elevyn empowers creators to monetize exclusive content and fundraisers through blockchain-powered payments, allowing supporters to unlock premium content and contribute transparently.
- Devpost: https://devpost.com/software/elevyn-unlock-premium-content-with-decentralized-funding
- GitHub: https://github.com/Yash-kumar7/Elevyn
- Result: winner ([MLH] Best Use of Midnight)
- Team: 1 GitHub contributor(s) — Yash (2 commits)

## Devpost submission (written by the team)

### Inspiration

The inspiration for Elevyn came from the need to empower creators and fundraisers by offering a decentralized platform where they can monetize their content securely and transparently. We wanted to bridge the gap between content creators and their supporters while integrating the benefits of blockchain technology for seamless transactions and ownership.

### What it does

Elevyn allows creators to sell exclusive content and raise funds for causes through a decentralized platform. Contributors can make payments in cryptocurrency, and upon successful payment, they gain access to premium content such as videos, tutorials, or unique digital assets hosted on Eluv.io. It also offers a transparent way to support social causes or fund creative projects. With the integration of Midnight, the platform enhances privacy for both creators and supporters by enabling secure, confidential transactions. How I built it Elevyn is built using a combination of React.js for the front-end and Node.js/Express for the backend. The platform integrates with the Ripple (XRP) network for cryptocurrency payments and Sui blockchain for logging donations. The content is hosted and accessed through Eluv.io, ensuring secure and decentralized delivery of premium content. Additionally, Midnight is integrated to ensure privacy and anonymity for users, allowing for private transactions without compromising on blockchain transparency. Challenges I ran into One of the main challenges was integrating the different blockchain systems (Ripple and Sui) with the content delivery platform. Ensuring that access to the content was granted only after successful payments and that the content could be delivered securely through Eluv.io also posed technical hurdles. Balancing decentralization with ease of use for non-technical users was another challenge. Accomplishments that I am proud of I am proud to have successfully built a decentralized platform that integrates blockchain payments and secure content delivery. Elevyn provides a seamless user experience where supporters can unlock premium content in exchange for cryptocurrency, supporting creators transparently. The successful integration of multiple blockchain systems and content delivery was a significant accomplishment. What I learned Throughout the project, we learned a lot about decentralized technologies, blockchain integrations, and managing cryptocurrency transactions. The project pushed us to deepen our understanding of how blockchain can be applied to creative industries and how to handle secure content distribution in a decentralized manner.

### What's next

: The next steps for Elevyn involve expanding the types of content creators can sell and adding more flexible payment methods. We plan to introduce more blockchain networks for payments and further enhance the platform's security and scalability. Additionally, we aim to add more community features for creators and supporters to interact and engage on the platform.

## README (from the GitHub repository)

Elevyn

## Detected evidence (automated analysis)

Indexed codebase: 54 recognized source files, 95 KB.
- CSS (language) — detected in the code
- Express (technology) — detected in the code
- HTML (language) — detected in the code
- JavaScript (language) — detected in the code
- React (technology) — detected in the code
- TypeScript (language) — detected in the code
- Node.js (technology) — claimed on Devpost, not found in the code

## Codebase structure (from repository index)

### Files (90 of 90)

```
backend/.gitignore
backend/auth.js
backend/eluvioAccess.js
backend/index.js
backend/package.json
backend/ripplePayment.js
backend/suiDonationLogger.js
frontend/.gitignore
frontend/package.json
frontend/public/index.html
frontend/public/manifest.json
frontend/public/robots.txt
frontend/README.md
frontend/src/App.css
frontend/src/App.js
frontend/src/App.test.js
frontend/src/components/ChatModal.js
frontend/src/components/ContentOffers.js
frontend/src/components/CrowdfundingOffers.js
frontend/src/components/Donate.js
frontend/src/components/Home.js
frontend/src/components/Login.js
frontend/src/components/Register.js
frontend/src/components/VideoAccess.js
frontend/src/index.css
frontend/src/index.js
frontend/src/reportWebVitals.js
frontend/src/services/AuthService.js
frontend/src/services/DonationService.js
frontend/src/setupTests.js
midnight/code/.dockerignore
midnight/code/.editorconfig
midnight/code/.gitignore
midnight/code/.nvmrc
midnight/code/.prettierrc.json
midnight/code/.yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs
midnight/code/.yarn/releases/yarn-4.1.0.cjs
midnight/code/.yarnrc.yml
midnight/code/compact/.eslintrc.cjs
midnight/code/compact/package.json
midnight/code/compact/src/run-compactc.cjs
midnight/code/compact/turbo.json
midnight/code/LICENSE
midnight/code/main/donation/contract/.eslintignore
midnight/code/main/donation/contract/.eslintrc.cjs
midnight/code/main/donation/contract/.vscode/launch.json
midnight/code/main/donation/contract/.vscode/tasks.json
midnight/code/main/donation/contract/jest.config.ts
midnight/code/main/donation/contract/js-resolver.cjs
midnight/code/main/donation/contract/package.json
midnight/code/main/donation/contract/src/counter.compact
midnight/code/main/donation/contract/src/index.ts
midnight/code/main/donation/contract/src/test/counter-simulator.ts
midnight/code/main/donation/contract/src/test/counter.test.ts
midnight/code/main/donation/contract/src/witnesses.ts
midnight/code/main/donation/contract/tsconfig.build.json
midnight/code/main/donation/contract/tsconfig.json
midnight/code/main/donation/donation-cli/.eslintrc.cjs
midnight/code/main/donation/donation-cli/.prettierrc.json
midnight/code/main/donation/donation-cli/jest.api.config.ts
midnight/code/main/donation/donation-cli/jest.config.ts
midnight/code/main/donation/donation-cli/jest.e2e.config.ts
midnight/code/main/donation/donation-cli/js-resolver.cjs
midnight/code/main/donation/donation-cli/package.json
midnight/code/main/donation/donation-cli/proof-server-testnet.yml
midnight/code/main/donation/donation-cli/proof-server.yml
midnight/code/main/donation/donation-cli/src/api.ts
midnight/code/main/donation/donation-cli/src/cli.ts
midnight/code/main/donation/donation-cli/src/common-types.ts
midnight/code/main/donation/donation-cli/src/config.ts
midnight/code/main/donation/donation-cli/src/index.ts
midnight/code/main/donation/donation-cli/src/logger-utils.ts
midnight/code/main/donation/donation-cli/src/standalone.ts
midnight/code/main/donation/donation-cli/src/test/commons.ts
midnight/code/main/donation/donation-cli/src/test/counter.api.test.ts
midnight/code/main/donation/donation-cli/src/test/counter.e2e.test.ts
midnight/code/main/donation/donation-cli/src/test/jest.setup.ts
midnight/code/main/donation/donation-cli/src/testnet-local.ts
midnight/code/main/donation/donation-cli/src/testnet-remote-start-proof-server.ts
midnight/code/main/donation/donation-cli/src/testnet-remote.ts
midnight/code/main/donation/donation-cli/standalone-latest.yml
midnight/code/main/donation/donation-cli/standalone.yml
midnight/code/main/donation/donation-cli/tsconfig.build.json
midnight/code/main/donation/donation-cli/tsconfig.json
midnight/code/main/donation/README.md
midnight/code/NOTICE
midnight/code/package.json
midnight/code/README.md
midnight/code/turbo.json
README.md
```

### Dependencies

- backend/package.json: @eluvio/elv-client-js@^4.0.100, @mysten/sui@^1.13.0, bcryptjs@^2.4.3, body-parser@^1.19.0, cors@^2.8.5, dotenv@^10.0.0, express@^4.17.1, jsonwebtoken@^8.5.1, ripple-lib@^1.10.0, xrpl@^4.0.0
- frontend/package.json: @emotion/react@^11.13.3, @emotion/styled@^11.13.0, @mui/icons-material@^6.1.4, @mui/material@^6.1.4, @testing-library/jest-dom@^5.17.0, @testing-library/react@^13.4.0, @testing-library/user-event@^13.5.0, axios@^1.7.7, react@^18.3.1, react-dom@^18.3.1, react-router-dom@^6.27.0, react-scripts@5.0.1, web-vitals@^2.1.4
- midnight/code/compact/package.json: eslint@^8.52.0, ts-node@^10.9.2, typescript@^5.2.2
- midnight/code/main/donation/contract/package.json: @midnight-ntwrk/compact@workspace:*, eslint@^8.52.0, jest@^29.7.0, typescript@^5.2.2
- midnight/code/main/donation/donation-cli/package.json: @midnight-ntwrk/counter-contract@workspace:*, @types/jest@^29.5.11, @types/ws@^8.5.9, allure-commandline@^2.28.0, allure-jest@^2.15.1, allure-js-commons@^2.15.1, eslint@^8.52.0, jest@^29.7.0, pino@^8.16.1, ts-jest@^29.1.2, typescript@^5.2.2, ws@^8.14.2
- midnight/code/package.json: @midnight-ntwrk/compact-runtime@^0.7.0, @midnight-ntwrk/dapp-connector-api@^1.2.1, @midnight-ntwrk/ledger@^3.0.2, @midnight-ntwrk/midnight-js-contracts@0.2.5, @midnight-ntwrk/midnight-js-fetch-zk-config-provider@0.2.5, @midnight-ntwrk/midnight-js-http-client-proof-provider@0.2.5, @midnight-ntwrk/midnight-js-indexer-public-data-provider@0.2.5, @midnight-ntwrk/midnight-js-level-private-state-provider@0.2.5, @midnight-ntwrk/midnight-js-network-id@0.2.5, @midnight-ntwrk/midnight-js-node-zk-config-provider@0.2.5, @midnight-ntwrk/midnight-js-types@0.2.5, @midnight-ntwrk/midnight-js-utils@0.2.5, @midnight-ntwrk/wallet@^3.6.3, @midnight-ntwrk/wallet-api@^3.4.2, @types/jest@^29.5.6, @types/node@^18.18.6, @typescript-eslint/eslint-plugin@^6.8.0, @typescript-eslint/parser@^6.8.0, eslint@^8.52.0, eslint-config-prettier@^9.0.0, eslint-plugin-import@^2.28.1, eslint-plugin-n@^16.2.0, eslint-plugin-prettier@^5.0.1, eslint-plugin-promise@^6.1.1, fast-check@^3.15.0, fp-ts@^2.16.1, io-ts@^2.2.20, jest@^29.7.0, jest-fast-check@^2.0.0, jest-gh-md-reporter@^0.0.2, jest-html-reporters@^3.1.4, jest-junit@^16.0.0, pino@^8.16.0, pino-pretty@^10.2.3, prettier@^3.0.3, rxjs@^7.8.1, testcontainers@^10.3.2, ts-jest@^29.1.1, ts-node@^10.9.1, turbo@^2.2.1, typescript@^5.2.2

### Recent commits (newest first)

- removing code
- adidng more sui code
- adding code

## Key source files (fetched from GitHub, selected and truncated for size)

### backend/package.json

```
{
    "name": "donation-tracker-backend",
    "version": "1.0.0",
    "description": "Backend for Decentralized Donation Tracker using Ripple and Sui",
    "main": "index.js",
    "type": "module",
    "scripts": {
        "start": "node index.js"
    },
    "dependencies": {
        "@eluvio/elv-client-js": "^4.0.100",
        "@mysten/sui": "^1.13.0",
        "bcryptjs": "^2.4.3",
        "body-parser": "^1.19.0",
        "cors": "^2.8.5",
        "dotenv": "^10.0.0",
        "express": "^4.17.1",
        "jsonwebtoken": "^8.5.1",
        "ripple-lib": "^1.10.0",
        "xrpl": "^4.0.0"
    },
    "author": "Yash Kumar",
    "license": "MIT"
}

```

### frontend/package.json

```
{
  "name": "frontend",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "@emotion/react": "^11.13.3",
    "@emotion/styled": "^11.13.0",
    "@mui/icons-material": "^6.1.4",
    "@mui/material": "^6.1.4",
    "@testing-library/jest-dom": "^5.17.0",
    "@testing-library/react": "^13.4.0",
    "@testing-library/user-event": "^13.5.0",
    "axios": "^1.7.7",
    "react": "^18.3.1",
    "react-dom": "^18.3.1",
    "react-router-dom": "^6.27.0",
    "react-scripts": "5.0.1",
    "web-vitals": "^2.1.4"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },
  "eslintConfig": {
    "extends": [
      "react-app",
      "react-app/jest"
    ]
  },
  "browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version"
    ]
  }
}

```

### midnight/code/package.json

```
{
  "packageManager": "yarn@4.1.0",
  "workspaces": [
    "compact",
    "main/counter/*"
  ],
  "scripts": {
    "compact": "turbo run compact",
    "build": "turbo run build",
    "test": "turbo run test",
    "test-e2e": "turbo run test-e2e",
    "lint": "turbo run lint",
    "check": "turbo run check --ignore packages/dao-ui-tests",
    "welcome-participant-ui": "turbo run start --filter=welcome-participant-ui",
    "welcome-organizer-cli": "turbo run start --filter=welcome-organizer-cli",
    "welcome-organizer-ui": "turbo run start --filter=welcome-organizer-ui",
    "bboard-ui": "turbo run start --filter=bboard-ui"
  },
  "resolutions": {
    "@midnight-ntwrk/compact-runtime/@midnight-ntwrk/onchain-runtime": "^0.2.2",
    "@midnight-ntwrk/zswap": "^3.0.2"
  },
  "dependencies": {
    "@midnight-ntwrk/compact-runtime": "^0.7.0",
    "@midnight-ntwrk/dapp-connector-api": "^1.2.1",
    "@midnight-ntwrk/ledger": "^3.0.2",
    "@midnight-ntwrk/midnight-js-contracts": "0.2.5",
    "@midnight-ntwrk/midnight-js-fetch-zk-config-provider": "0.2.5",
    "@midnight-ntwrk/midnight-js-http-client-proof-provider": "0.2.5",
    "@midnight-ntwrk/midnight-js-indexer-public-data-provider": "0.2.5",
    "@midnight-ntwrk/midnight-js-level-private-state-provider": "0.2.5",
    "@midnight-ntwrk/midnight-js-network-id": "0.2.5",
    "@midnight-ntwrk/midnight-js-node-zk-config-provider": "0.2.5",
    "@midnight-ntwrk/midnight-js-types": "0.2.5",
    "@midnight-ntwrk/midnight-js-utils": "0.2.5",
    "@midnight-ntwrk/wallet": "^3.6.3",
    "@midnight-ntwrk/wallet-api": "^3.4.2",
    "fp-ts": "^2.16.1",
    "io-ts": "^2.2.20",
    "pino": "^8.16.0",
    "pino-pretty": "^10.2.3",
    "rxjs": "^7.8.1"
  },
  "devDependencies": {
    "@types/jest": "^29.5.6",
    "@types/node": "^18.18.6",
    "@typescript-eslint/eslint-plugin": "^6.8.0",
    "@typescript-eslint/parser": "^6.8.0",
    "eslint": "^8.52.0",
    "eslint-config-prettier": "^9.0.0",
    "eslint-plugin-import": "^2.28.1",
    "eslint-plugin-n": "^16.2.0",
    "eslint-plugin-prettier": "^5.0.1",
    "eslint-plugin-promise": "^6.1.1",
    "fast-check": "^3.15.0",
    "jest": "^29.7.0",
    "jest-fast-check": "^2.0.0",
    "jest-gh-md-reporter": "^0.0.2",
    "jest-html-reporters": "^3.1.4",
    "jest-junit": "^16.0.0",
    "prettier": "^3.0.3",
    "testcontainers": "^10.3.2",
    "ts-jest": "^29.1.1",
    "ts-node": "^10.9.1",
    "turbo": "^2.2.1",
    "typescript": "^5.2.2"
  }
}

```

### midnight/code/compact/package.json

```
{
  "name": "@midnight-ntwrk/compact",
  "description": "Compact fetcher",
  "author": "IOG",
  "license": "Apache-2.0",
  "private": true,
  "version": "0.19.0",
  "type": "module",
  "bin": {
    "run-compactc": "src/run-compactc.cjs"
  },
  "devDependencies": {
    "eslint": "^8.52.0",
    "ts-node": "^10.9.2",
    "typescript": "^5.2.2"
  }
}

```

### midnight/code/main/donation/contract/package.json

```
{
  "name": "@midnight-ntwrk/counter-contract",
  "type": "module",
  "main": "dist/index.js",
  "module": "dist/index.js",
  "types": "./dist/index.d.ts",
  "exports": {
    ".": {
      "types": "./dist/index.d.ts",
      "require": "./dist/index.js",
      "import": "./dist/index.js",
      "default": "./dist/index.js"
    }
  },
  "scripts": {
    "compact": "run-compactc src/counter.compact ./src/managed/counter",
    "test": "NODE_OPTIONS=--experimental-vm-modules jest",
    "prepack": "yarn build",
    "build": "rm -rf dist && tsc --project tsconfig.build.json && cp -Rf ./src/managed ./dist/managed && cp ./src/counter.compact ./dist",
    "lint": "eslint src",
    "typecheck": "tsc -p tsconfig.json --noEmit"
  },
  "devDependencies": {
    "@midnight-ntwrk/compact": "workspace:*",
    "eslint": "^8.52.0",
    "jest": "^29.7.0",
    "typescript": "^5.2.2"
  }
}

```

### midnight/code/main/donation/donation-cli/package.json

```
{
  "name": "@midnight-ntwrk/counter-cli",
  "version": "0.1.0",
  "author": "IOG",
  "license": "MIT",
  "private": true,
  "type": "module",
  "scripts": {
    "testnet-remote": "node --experimental-specifier-resolution=node dist/testnet-remote.js",
    "testnet-remote-ps": "node --experimental-specifier-resolution=node dist/testnet-remote-start-proof-server.js",
    "testnet-local": "node --experimental-specifier-resolution=node dist/testnet-local.js",
    "standalone": "docker compose -f standalone.yml pull && node --experimental-specifier-resolution=node dist/standalone.js",
    "prepack": "yarn build",
    "test": "yarn test-api",
    "test-api": "docker compose -f standalone.yml pull && DEBUG='testcontainers' NODE_OPTIONS=--experimental-vm-modules jest --passWithNoTests --detectOpenHandles --forceExit -c jest.api.config.ts",
    "test-e2e": "docker compose -f standalone.yml pull && DEBUG='testcontainers' NODE_OPTIONS=--experimental-vm-modules jest --passWithNoTests --detectOpenHandles --forceExit -c jest.e2e.config.ts",
    "build": "rm -rf dist && tsc --project tsconfig.build.json",
    "lint": "eslint src"
  },
  "dependencies": {
    "@midnight-ntwrk/counter-contract": "workspace:*",
    "pino": "^8.16.1",
    "ws": "^8.14.2"
  },
  "devDependencies": {
    "@types/jest": "^29.5.11",
    "@types/ws": "^8.5.9",
    "allure-commandline": "^2.28.0",
    "allure-jest": "^2.15.1",
    "allure-js-commons": "^2.15.1",
    "eslint": "^8.52.0",
    "jest": "^29.7.0",
    "ts-jest": "^29.1.2",
    "typescript": "^5.2.2"
  }
}

```

### backend/index.js

```javascript
import express from 'express';
import cors from 'cors';
import { config } from 'dotenv';
import { router as authRouter } from './auth.js';
import { processRipplePayment } from './ripplePayment.js';
import { logDonationOnSui } from './suiDonationLogger.js';

config(); // Load environment variables

const app = express();
const accessData = {}; // In-memory storage for video access

app.use(cors());
app.use(express.json());

// User Authentication routes
app.use('/auth', authRouter);

// Route to check video access
app.get('/api/check-access', (req, res) => {
  const { address } = req.query;

  // Check if the user's address exists in the accessData object
  const userAccess = accessData[address];

  if (!userAccess) {
    return res.status(403).json({ accessGranted: false, message: "No access found." });
  }

  const now = new Date();

  // Check if the access has expired
  if (now > new Date(userAccess.expiresAt)) {
    return res.status(403).json({ accessGranted: false, message: "Access expired." });
  }

  // Access is valid, return the video URL
  res.json({ accessGranted: true, videoUrl: userAccess.videoUrl });
});

// Endpoint to handle donations and payments
app.post('/donate', async (req, res) => {
  const { donorAddress, amount } = req.body;

  try {
    // 1. Process Ripple Payment (XRP)
    const xrpResult = await processRipplePayment(donorAddress, amount);

    // Extract transaction hash and delivered amount from the XRP response
    const xrpTransactionHash = xrpResult.result.hash;
    const deliveredAmount = xrpResult.result.meta.delivered_amount;

    // Ensure valid transaction details
    if (!xrpTransactionHash || !deliveredAmount) {
      throw new Error('Failed to retrieve valid XRP transaction details.');
    }

    console.log("XRP Transaction Hash:", xrpTransactionHash);
    console.log("Delivered Amount:", deliveredAmount);

    // 2. Log donation on Sui (assuming success)
    await logDonationOnSui(process.env.PLATFORM_SUI_ADDRESS, xrpTransactionHash, deliveredAmount);

    // Set expiration time for video access (e.g., 24 hours)
    const expiryDate = new Date();
    expiryDate.setHours(expiryDate.getHours() + 24); // 24-hour access

    // Save access details (Replace this with DB logic if needed)
    accessData[donorAddress] = {
      expiresAt: expiryDate,
      videoUrl: "https://embed.v3.contentfabric.io/?p=&net=main&oid=iq__3XdMYpt2hmj8gSuwvvfQCFyR7qGN&mt=v&ct=h&ath=aessjcEHCikeZjmhjjkQem8frWYnsHypWLNAkirSgmrNWsdMeqK2NKFncbXSHVowsKtF7w9kpEPorJm2WdTbs7AByXXntsmjmJoLe9vc1zhon6B7rqWeCycXZ4vXXAzp3HKFu5fryuB68SeLHVMsZTdjymstGdc9768vBcL7EF1dt1evpn69rnXe3e41emzR8cDivPfL2A1LxzDhQF82hBZiTYoef6zFmgxpS6y7yLr3kXcKYfsy4AihhSqPNNwmg6jqcKEdbRYtNAfQNUnEhUgcbS5656UhMEUgMkkPgjHtdYQcLTNEhi2BHLGS3UAfjhixRXCGVQW5sUhJpWM2KGEp2nDb45wjk6nJ8CahUobqx5ELfuQpPZfDihJ5Gj8TmmrEUo1XfknBx3H"  // Replace with actual Eluv.io video URL
    };

    // Respond with a success message and expiration time
    res.json({
      message: 'Payment successful! You have 24-hour access to the video.',
      expiresAt: expiryDate,
      videoUrl: accessData[donorAddress].videoUrl // Sending the video URL back
    });

  } catch (error) {
    console.error('Error processing payment:', error);
    res.status(500).json({ message: 'Payment processing failed', error: error.message });
  }
});

// Start the server
const PORT = process.env.PORT || 5000;
app.listen(PORT, () => {
  console.log(`Server is running on port ${PORT}`);
});

```

### frontend/src/index.js

```javascript
import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>
);

```

### frontend/src/App.js

```javascript
import React, { useState } from 'react';
import { BrowserRouter as Router, Route, Routes } from 'react-router-dom';
import Login from './components/Login';
import Register from './components/Register';
import Donate from './components/Donate';
import Home from './components/Home'; 
import ContentOffers from './components/ContentOffers';
import VideoAccess from './components/VideoAccess';
import CrowdfundingOffers from './components/CrowdfundingOffers';

function App() {
  const [token, setToken] = useState(null);

  return (
    <Router>
      <div>
        <Routes>
          <Route path="/" element={<Home />} />
          <Route path="/login" element={<Login setToken={setToken} />} />
          <Route path="/register" element={<Register />} />
          <Route path="/donate" element={token ? <Donate token={token} /> : <Login setToken={setToken} />} />
          <Route path="/content-offers" element={<ContentOffers />} />
          <Route path="/crowdfunding" element={<CrowdfundingOffers />} />
          <Route path="/video-access" element={<VideoAccess />} />
        </Routes>
      </div>
    </Router>
  );
}

export default App;

```

### midnight/code/main/donation/donation-cli/src/index.ts

```typescript
export * from './api';
export * from './cli';

```

[46 more indexed source files omitted to keep this export small. The full file list is in the Codebase structure section above.]