| This repository is for reference and is not a fully-functional or regulation-compliant DPP application. It was built to showcase how IOTA components can power real-world use cases, using Digital Product Passports as one example. |
This repository demonstrates how multiple products from the IOTA portfolio can be orchestrated to build a Digital Product Passport (DPP).
In the demo scenario, you act as a Repairer operating inside a permissioned environment supervised by a Root of Authority (e.g., a public agency) and a Manufacturer. The authorization chain is:
Root of Authority ──authorize──▶ Manufacturer ──authorize──▶ Repairer
This demonstrator integrates several IOTA technologies:
| Capability | IOTA Product |
|---|---|
| Tokenized incentives | NFT Reward System |
| Ledger & transaction explorer | IOTA Explorer |
| On-ledger access control | IOTA Hierarchies |
| Feeless user experience | IOTA Gas Station |
| Product traceability | IOTA Custom Notarization |
| Decentralized identity | IOTA Identity |
| User wallet & Tx signing | IOTA Wallet & Nightly Wallet |
Before starting, ensure you have the following tools installed:
- Docker
- Rust
- IOTA CLI:
cargo install --locked \ --git https://github.com/iotaledger/iota.git \ --tag v1.6.1 \ --features tracing iota - Lefthook: it manages git hooks
- Install on MacOS:
brew install lefthook. For more supported installations see: https://lefthook.dev/installation/index.html - After installing: update your terminal session and install hooks:
lefthook install
- Install on MacOS:
- Hashicorp Copywrite: it manages copywrite header on source files
Follow these steps to prepare the DPP environment:
make init-accountsThis will create the Root of Authority, Manufacturer, and Gas Station accounts.
make faucetmake init-hierarchiesHere you can find IOTA_HIERARCHIES_PKG_ID Copy the generated FEDERATION_ID.
make publish-custom-notarization-contractFrom the Transaction Save the following outputs:
- IOTA_CUSTOM_NOTARIZATION_PKG_ID
- WHITELIST_ID
- ADMIN_CAP_ID
- VAULT_ID
- LCCTreasuryCap
You must generate one per environment, given they are deployed to different domains.
make init-didsHere you can find IDENTITY_PKG_ID.
Save the output for the DID and the domain linkage configuration.
Save the JWT credential accordinly to the environment; for development place it at frontend/public/.well-known/did-configuration.dev.json or at frontend/public/.well-known/did-configuration.prod.json for production.
Here you must also generate one per environment.
export IOTA_CUSTOM_NOTARIZATION_PKG_ID=<IOTA_CUSTOM_NOTARIZATION_PKG_ID>
export FEDERATION_ID=<FEDERATION_ID>
export MANUFACTURER_DID=<MANUFACTURER_DID>Use the corresponding MANUFACTURER_DID for the target environment.
make create-new-productSave the generated PRODUCT_ID.
make mint-llc make top-up-reward-poolTo run the frontend application:
-
Create an .env file in the project root based on the .env.example.
-
Convert your Gas Station secret key to base64 and insert it into config.yaml:
iota keytool convert [GAS_STATION_SECRET_KEY]- Start the application: Configure the DNS, the Traefik load balancer and allocate the VM.
make dev-start- Open your browser and navigate to:
http://localhost:3000/introduction/1
The project backend is developed in Rust and provides:
- Endpoint:
/rolesfor IOTA Hierarchies role management - Authentication: API key via
x-api-keyheader - Documentation: Backend API docs
The backend includes automated configuration scripts:
init_accounts: Main account creationfaucet: Testnet account fundinginit_hierarchies: Hierarchies federation setupinit_dids: Decentralized identity generation- Documentation: Backend Scripts docs
backend/src/
├── lib/ # Modular libraries
│ ├── keystore.rs # Keystore/wallet management
│ ├── identity.rs # DID/credential operations
│ ├── transaction.rs # Signing/execution
│ ├── lib.rs
│ └── utils.rs
├── routes/ # API routing
├── handlers/ # Business logic
├── services/ # Blockchain services
├── scripts/ # Setup automation
└── config/
-
The IOTA Identity integration is implemented with domain linkage support.
-
The Custom Notarization smart-contract is intentionally simplified for demonstration purposes.
-
Backend documentation available in
backend/docs/. -
The app works better with Chrome based browsers.