Milestone 3 — Complete
Hello team,
Following our commitment to regular updates on this thread, here is our Milestone 3 progress report. We consider all goals completed.
The services run on production-grade infrastructure (AWS, mainnet contract, prod issuer portal) while remaining a demo/reference implementation with no live end-user population at this time — institutions adopting the stack may use these same services (DHT, piñata, AWS), but most probably will plug in their own identity provider, token services, and operational policies.
All our code is open sources, and any institution may use it.
We are in conversations with organizations interested in testing our solution for Milestone 4
As always we are open to comments and suggestions.
Milestone 3 deliverables — status
Scope per post #33.
| # |
Deliverable |
Status |
Highlights |
| — |
Mainnet launch of the Rootstock-enabled SSI sandbox |
Complete |
DidManifestRegistry on Rootstock mainnet (chain 30). Prod identity API, issuer portal, and mobile production profiles wired to mainnet. |
| 1 |
Backend API adapted to interact with Rootstock mainnet |
Complete |
Prod node on chain 30; contract 0xCc8dfB72BA18f6cBd626A1e609F8864707d77EdF. GitHub Actions → SSM deploy to identity-web3-node-prod. |
| 2 |
Issuer hardening (add authentication) |
Complete |
Amazon Cognito + NextAuth on prod issuer portal. Session-gated UI and /api/proxy; server-only identity API key. |
| 3 |
Issuer working against Rootstock mainnet |
Complete |
Prod issuer calls mainnet-enabled identity API. Approvals trigger Rootstock writes via Web3RegistryWorkerService. |
| 4 |
Validator apps working against Rootstock (open source) |
Complete |
IDA-Verificador-App and IDA-Ciudadano-App production profiles on chain 30. Open-source repos on GitHub. |
| 5 |
Add English language (validator request) |
Complete |
Spanish and English in issuer web and both mobile apps (i18n / language switcher). |
| 6 |
Ensure IPFS option besides Pinata |
Complete |
IpfsGateway abstraction; alternatives evaluated (Filebase, Storacha, Kubo, IPFS Cluster). Report: docs/IPFS-Pinata-Replacement-Options-Report.md. |
| 7 |
Infrastructure set-up for production readiness (Amazon + web2) |
Complete |
Prod EC2, Elastic IP, nginx/TLS, dual Amplify apps, Cognito, OIDC+SSM deploy, Tenderly on testnet and mainnet. |
| 8 |
Demo credential issuance + validation flow E2E |
Complete |
Citizen request → issuer approval → IPFS → Rootstock write → Verifier validation. Proven on testnet in M1/M2; mainnet stack exercised in M3. |
Highlights this period
Rootstock mainnet backend
-
Contract: 0xCc8dfB72BA18f6cBd626A1e609F8864707d77EdF (chain 30)
-
Prod API: identity node with mainnet WEB3_* configuration; smoke GET /requests → 200 on prod instance
-
Deploy: identity-web3-node-prod, tag-based GitHub Actions → SSM
Issuer portal (sandbox authentication)
Working APPS
APKs to test the applications working on mainnet
English + Spanish
IPFS storage options
We documented that Pinata is not a lock-in: the backend already defines a provider-agnostic IpfsGateway interface, includes a Kubo-compatible adapter sketch, and we published a full alternatives evaluation for operators and integrators.
Full report (in repo): docs/IPFS-Pinata-Replacement-Options-Report.md
Options at a glance
| # |
Deliverable |
Status |
Highlights |
| 1 |
Filebase |
Paid SaaS |
IPFS Pinning Service API, S3-style ops; recommended paid default for standards alignment. |
| 2 |
Storacha |
Paid SaaS |
Managed pinning + Filecoin-backed persistence; Protocol Labs ecosystem. |
| 3 |
Kubo |
Self-hosted |
Full control; kuboCompatibleGateway.service.ts in repo (sketch, not yet production-tested). |
| 4 |
IPFS Cluster |
Self-hosted |
HA pinning across multiple peers; best self-hosted production pattern. |
Pinata remains the recommended option.
Production Alerts
We migrated our alerts to mainnet.
Responses to community questions
1. Issuer hardening — what security features are included?
Issuer hardening in this milestone is meant to protect the instance from abuse, and to showcase that RBAC can be implemented. GIven that each organization has its own authentication mechanisms in place, adding complexity to this instalation, at this time, yields no benefit. A production organization would typically replace or augment this with its own IdP (Azure AD, Okta, etc.) and SSO — which aligns with Milestone 4.
| Human access | Amazon Cognito User Pool (prod): email as username, email verification before use, password policy (minimum 12 characters, upper/lower/number/symbol) |
| Session | NextAuth (JWT session); unauthenticated users redirected to /login |
| Application routes | Next.js middleware (withAuth) protects all issuer pages except login and auth callbacks |
| API bridge | /api/proxy requires a valid server session before calling the identity backend |
| Backend API | NestJS ApiKeyAuthGuard on issuer endpoints; API key is server-only (IDENTITY_API_KEY), never exposed to the browser for issuance calls |
| Signup abuse | Self-service signup with email confirmation code; duplicate-account and password-policy errors surfaced to the user |
MFA: Amazon Cognito supports TOTP/SMS MFA natively. For this sandbox we prioritized email-verified accounts and strong password policy; MFA can be enforced in Cognito with one console/policy change when an institution hardens for production. We document this in IDA-Emisor-Web/docs/COGNITO_AUTH.md.
Bottom line: Unauthorized parties cannot issue credentials via the portal without passing Cognito authentication and holding a valid session; they also cannot call issuance APIs without the server-held API key. This meets the M3 “issuer hardening” intent for an alpha sandbox.
2. Mainnet monitoring & alerting
Testnet (Milestone 2): Tenderly alert rules were configured and verified with screenshots on the testnet contract (ManifestCidSet, ManifestCidDeleted, ownership transfer events).
Mainnet (Milestone 3): The same monitoring approach is applied to the production mainnet deployment:
| Item | Detail |
|------|--------|
| Contract | 0xCc8dfB72BA18f6cBd626A1e609F8864707d77EdF on Rootstock mainnet (chain 30) |
| Platform | Tenderly — contract verified, event-decoded |
| Alert rules | Parallel to testnet: CID set, CID delete, ownership transfer on DidManifestRegistry |
| Validation | Alerts active on the Tenderly project; mainnet writes from the identity backend are observable on Blockscout |
Notification channels:
| Channel | Status |
|---------|--------|
| Email | Active for sandbox operations (same pattern as M2 verification) |
| Slack / webhooks | Tenderly supports Slack, webhooks, PagerDuty, etc.; webhook destination is configured for the ops project so production incidents can route to team channels without dashboard-only monitoring |
| Institutional deploys | Operators point Tenderly (or Alchemy/Moralis equivalents) at their own Slack/on-call stack — documented in prod runbooks |
We can share mainnet alert-rule screenshots on request (same layout as M2 testnet evidence). The monitoring pattern is production-ready; channel choice is an operator preference, and webhook/Slack is supported for this deployment.
3. Documentation & localization (English / Spanish, M4 bilingual guides)
Clarification on “English support”: Yes — we mean both Spanish and English across the user-facing sandbox:
| Component | Languages |
|-----------|-----------|
| IDA-Verificador-App | Spanish + English (react-i18next, in-app switcher) |
| IDA-Ciudadano-App | Spanish + English |
| IDA-Emisor-Web | Spanish + English (I18nProvider, EN/ES toggle) |
This addresses the validator request from Milestone 1 review (issuer/verifier were previously Spanish-only).
Milestone 4 developer guides: Yes — the final comprehensive guides for developers and institutions (M4) will be published in a bilingual format (Spanish and English) so the open-source reference implementation is accessible to the global Rootstock developer community and our Latin American pilot partners. Technical docs in the repo (docs/, contract README, deployment runbooks) will follow the same EN/ES pattern where they are user-facing; API/architecture references remain English-primary with Spanish companion pages for onboarding.
Work completed (May 2026 sessions)
Consolidated from implementation work on the prod issuer and mainnet cutover:
-
Cognito dev + prod pools, NextAuth, Amplify env rollout
-
Session-gated /api/proxy, server-only IDENTITY_API_KEY
-
Custom /api/auth/signup and /api/auth/confirm (Cognito Hosted UI signup workaround)
-
Prod issuer connected to mainnet identity API
-
API key rotation and alignment on prod instance
-
IPFS alternatives evaluation report published
Links
| Resource | URL |
|----------|-----|
| Mainnet contract | Rootstock address details for 0xCc8dfB72BA18f6cBd626A1e609F8864707d77EdF | Blockscout |
| Issuer portal (prod) | https://main.d1fkse5la21xp8.amplifyapp.com/ |
| Issuer portal (testnet) | https://dev.d259s5nn01m0g8.amplifyapp.com/ |
| Identity repo | GitHub - Ikabott-MRM/identity: Decentralized identity for governments and organizations. · GitHub |
| Issuer web repo | GitHub - Ikabott-MRM/IDA-Emisor-Web · GitHub |
| IPFS options report | docs/IPFS-Pinata-Replacement-Options-Report.md (in identity monorepo / SSI docs) |
Regards,
mrmtech