$ cat ~/projects/pruv-finance.mdx
PRUV.Finance
Backend services for tokenized asset issuance and redemption, integrating Solidity smart contracts with secure off-chain transaction processing.
- NestJS
- PostgreSQL
- Solidity
- Google Cloud Storage
- Docker
Context
PRUV.Finance is a tokenization platform — real-world assets (think invoices, receivables, fractional ownership) are mirrored on-chain as ERC-20 tokens. The hard part isn't the Solidity; it's the off-chain service that has to keep the on-chain state and the canonical record in sync without ever lying to either side.
What I built
- PostgreSQL schema modeling issuers, assets, token supplies, redemption requests, and audit events. The schema is the source of truth for everything not on-chain; the smart contracts are the source of truth for ownership. Reconciliation is a daily batch job, not a per-request check.
- NestJS services for the lifecycle: asset registration → on-chain mint → off-chain indexing → redemption flow. Each step is a discrete module with its own DTOs and a single repository.
- CI/CD with GitLab: lint, unit tests, integration tests against a disposable Postgres, then a canary deploy to GCS-backed containers. The pipeline replaced a manual release checklist that used to take an afternoon.
Outcome
Releases went from a once-a-week manual ritual to a push-button deploy. The bigger win is that the off-chain/on-chain boundary is now obvious in the codebase — there's exactly one place that talks to the chain, and everything else goes through Postgres.
The thing I'd do differently: make the reconciliation job write to a structured audit log from day one. We added it later, and retrofitting event IDs into the existing flow was a week of pain that didn't have to happen.