Thank you for your interest in contributing! Open-Audit is a community-driven project and every contribution — from fixing a typo to adding a full translation blueprint — makes the Stellar ecosystem more transparent.
- Code of Conduct
- Getting Started
- Development Setup
- Running Tests
- Code Standards
- How to Add a Translation Blueprint
- Submitting a Pull Request
- Good First Issues
Be respectful, inclusive, and constructive. We follow the Contributor Covenant.
- Fork the repository on GitHub.
- Clone your fork locally:
git clone https://github.com/YOUR_USERNAME/open-audit.git cd open-audit - Add the upstream remote:
git remote add upstream https://github.com/your-org/open-audit.git
- Node.js >= 18 (we recommend using nvm)
- npm >= 9
npm installcp .env.example .env.localEdit .env.local with your preferred Stellar network endpoints. The defaults point to testnet, which is safe for development.
npm run devThe app will be available at http://localhost:3000.
# Run all tests once
npm test
# Run tests in watch mode (development)
npm run test:watch
# Run type checking
npx tsc --noEmit
# Run linting
npm run lintAll tests live alongside the code they test in __tests__ directories or as *.test.ts files.
Please read CODE_STANDARDS.md before writing any code. The most important rules:
- Standard function declarations only — no arrow functions for component or utility definitions.
- No
anytypes — use proper TypeScript interfaces. - Prettier formatting — run
npm run formatbefore committing.
This is the most impactful contribution you can make. A blueprint teaches Open-Audit how to translate a specific contract's events.
Find the Contract ID and its ABI/event schema. Soroswap, Blend Protocol, and Phoenix DEX all publish their schemas publicly.
Create /lib/translator/blueprints/your-contract-name.ts:
import type { TranslationBlueprint } from "../types";
// Use standard function declarations — no arrow functions
export function createYourContractBlueprint(): TranslationBlueprint {
return {
contractId: "CXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
contractName: "Your Contract Name",
translate: function (event) {
const topic = event.topics[0];
if (topic === "your_event_topic_hex") {
const amount = decodeAmount(event.data);
const from = decodeAddress(event.topics[1]);
const to = decodeAddress(event.topics[2]);
return `${from} transferred ${amount} TOKEN to ${to}`;
}
return null; // Return null if this blueprint can't translate the event
},
};
}Open /lib/translator/registry.ts and import + register your blueprint:
import { createYourContractBlueprint } from "./blueprints/your-contract-name";
// Add to the blueprints array in buildRegistry()
createYourContractBlueprint(),Add a test in /lib/translator/__tests__/your-contract-name.test.ts with a real raw event from the network.
- Create a feature branch:
git checkout -b feat/your-feature-name - Make your changes following the code standards.
- Run
npm run lintandnpm run format— fix any issues. - Run
npx tsc --noEmit— fix any type errors. - Commit with a clear message:
git commit -m "feat: add Soroswap swap translation blueprint" - Push and open a PR against
main.
- Code follows CODE_STANDARDS.md
- No
anytypes introduced - All functions use standard declarations (no arrow functions)
- Linting passes (
npm run lint) - Type checking passes (
npx tsc --noEmit) - PR description explains what was changed and why
Check /docs/good-first-issues.json for beginner-friendly tasks, or look for issues labeled good first issue on GitHub.
Questions? Open a Discussion on GitHub or reach out in the Stellar Developer Discord.