$ cat ~/projects/pruv-finance.mdx

PRUV.Finance

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.