qcrypt-rng / docs /next-phase /TESTNET_DEPLOYMENT.md
rocRevyAreGoals15's picture
fixing ui
86deab0
# Testnet Deployment Guide (Phase 2 Task 5)
**Document:** Testnet deployment of QuantumRandomnessOracle contracts
**Last Updated:** 2026-03-23
**Status:** Ready for deployment
---
## Overview
This guide covers the deployment of the `QuantumRandomnessOracle` smart contract to major testnets and the integration with the QCrypt RNG API for end-to-end validation.
---
## Target Testnets
| Chain | Testnet | Chain ID | RPC URL | Explorer |
|-------|---------|----------|---------|----------|
| Ethereum | Sepolia | 11155111 | `https://rpc.sepolia.org` | [sepolia.etherscan.io](https://sepolia.etherscan.io) |
| Polygon | Amoy | 80002 | `https://rpc.amoy.polygon.technology` | [amoy.polygonscan.com](https://amoy.polygonscan.com) |
| BSC | BSC Testnet | 97 | `https://data-seed-prebsc-1-s1.binance.org:8545` | [testnet.bscscan.com](https://testnet.bscscan.com) |
| Avalanche | Fuji | 43113 | `https://api.avax-test.network/ext/bc/C/rpc` | [testnet.snowtrace.io](https://testnet.snowtrace.io) |
| Fantom | Fantom Testnet | 4002 | `https://rpc.testnet.fantom.network` | [testnet.ftmscan.com](https://testnet.ftmscan.com) |
---
## Prerequisites
### 1. Node.js and Dependencies
```bash
cd quantum-oracle/contracts
npm install
```
### 2. Environment Variables
Create a `.env` file in `quantum-oracle/contracts/`:
```bash
# Deployment private key (DO NOT use production keys on testnets)
PRIVATE_KEY=your_testnet_deployer_private_key
# RPC URLs (optional, defaults are configured)
SEPOLIA_RPC_URL=https://rpc.sepolia.org
POLYGON_AMOY_RPC_URL=https://rpc.amoy.polygon.technology
BSC_TESTNET_RPC_URL=https://data-seed-prebsc-1-s1.binance.org:8545
AVALANCHE_FUJI_RPC_URL=https://api.avax-test.network/ext/bc/C/rpc
FANTOM_TESTNET_RPC_URL=https://rpc.testnet.fantom.network
# Block explorer API keys (for verification)
ETHERSCAN_API_KEY=your_etherscan_api_key
POLYGONSCAN_API_KEY=your_polygonscan_api_key
BSCSCAN_API_KEY=your_bscscan_api_key
SNOWTRACE_API_KEY=your_snowtrace_api_key
FTMSCAN_API_KEY=your_ftmscan_api_key
```
### 3. Fund Deployer Account
Obtain testnet tokens for each network:
- **Sepolia ETH:** [faucet.sepolia.org](https://faucet.sepolia.org) or [sepoliafaucet.com](https://sepoliafaucet.com)
- **Polygon Amoy MATIC:** [faucet.polygon.technology](https://faucet.polygon.technology)
- **BSC Testnet BNB:** [testnet.binance.org/faucet](https://testnet.binance.org/faucet)
- **Avalanche Fuji AVAX:** [faucet.avax.network](https://faucet.avax.network)
- **Fantom Testnet FTM:** [faucet.fantom.network](https://faucet.fantom.network)
**Recommended funding:** 0.1-0.5 native tokens per network for deployment and testing.
---
## Deployment Steps
### Option 1: Deploy to All Testnets (Recommended)
```bash
cd quantum-oracle/contracts
npx hardhat run scripts/deploy-all-testnets.js --network sepolia
```
This script:
1. Deploys to all 5 testnets sequentially
2. Waits for 5 confirmations per deployment
3. Verifies contracts on block explorers (if API keys provided)
4. Saves deployment info to `deployments/` folder
### Option 2: Deploy to Single Network
```bash
# Deploy to Sepolia
npx hardhat run scripts/deploy.js --network sepolia
# Deploy to Polygon Amoy
npx hardhat run scripts/deploy.js --network polygonAmoy
# Deploy to BSC Testnet
npx hardhat run scripts/deploy.js --network bscTestnet
```
### Option 3: Deploy to Specific Networks
```bash
# Deploy to selected networks only
npx hardhat run scripts/deploy-all-testnets.js --network sepolia sepolia polygonAmoy bscTestnet
```
---
## Contract Addresses
**After deployment, update this table:**
| Chain | Contract | Address | Deployment TX | Verified |
|-------|----------|---------|---------------|----------|
| Sepolia | QuantumRandomnessOracle | `TBD` | `TBD` | ☐ |
| Polygon Amoy | QuantumRandomnessOracle | `TBD` | `TBD` | ☐ |
| BSC Testnet | QuantumRandomnessOracle | `TBD` | `TBD` | ☐ |
| Avalanche Fuji | QuantumRandomnessOracle | `TBD` | `TBD` | ☐ |
| Fantom Testnet | QuantumRandomnessOracle | `TBD` | `TBD` | ☐ |
Deployment artifacts are saved to `quantum-oracle/contracts/deployments/`:
- `deployment-{network}.json` - Individual network deployment
- `deployment-summary.json` - Combined summary
- `DEPLOYMENT_REPORT.md` - Human-readable report
---
## API Configuration
### Update Environment Variables
Add deployed contract addresses to your `.env` file in the main project root:
```bash
# Oracle contract addresses (testnets)
ORACLE_CONTRACT_SEPOLIA=0x...
ORACLE_CONTRACT_POLYGON_AMOY=0x...
ORACLE_CONTRACT_BSC_TESTNET=0x...
ORACLE_CONTRACT_AVALANCHE_FUJI=0x...
ORACLE_CONTRACT_FANTOM_TESTNET=0x...
# Testnet RPC URLs (for API backend)
TESTNET_RPC_SEPOLIA=https://rpc.sepolia.org
TESTNET_RPC_POLYGON_AMOY=https://rpc.amoy.polygon.technology
TESTNET_RPC_BSC_TESTNET=https://data-seed-prebsc-1-s1.binance.org:8545
TESTNET_RPC_AVALANCHE_FUJI=https://api.avax-test.network/ext/bc/C/rpc
TESTNET_RPC_FANTOM_TESTNET=https://rpc.testnet.fantom.network
# Chain IDs
TESTNET_CHAIN_ID_SEPOLIA=11155111
TESTNET_CHAIN_ID_POLYGON_AMOY=80002
TESTNET_CHAIN_ID_BSC_TESTNET=97
TESTNET_CHAIN_ID_AVALANCHE_FUJI=43113
TESTNET_CHAIN_ID_FANTOM_TESTNET=4002
```
### Update `app/config.py`
Add testnet configuration to the settings:
```python
# Testnet Oracle Configuration
testnet_oracle_contracts = {
"sepolia": os.getenv("ORACLE_CONTRACT_SEPOLIA", ""),
"polygon_amoy": os.getenv("ORACLE_CONTRACT_POLYGON_AMOY", ""),
"bsc_testnet": os.getenv("ORACLE_CONTRACT_BSC_TESTNET", ""),
"avalanche_fuji": os.getenv("ORACLE_CONTRACT_AVALANCHE_FUJI", ""),
"fantom_testnet": os.getenv("ORACLE_CONTRACT_FANTOM_TESTNET", ""),
}
```
---
## End-to-End Validation
### 1. Configure Chain in API
Use the `/oracle/fulfillment/configure-chain` endpoint:
```bash
# Configure Sepolia
curl -X POST "http://localhost:8000/api/v2/oracle/fulfillment/configure-chain" \
-d "chain=ethereum" \
-d "rpc_url=https://rpc.sepolia.org" \
-d "private_key=YOUR_TEST_KEY" \
-d "explorer_url=https://sepolia.etherscan.io" \
-d "chain_id=11155111" \
-d "currency_symbol=SepoliaETH"
```
### 2. Create Oracle Request
```bash
curl -X POST "http://localhost:8000/api/v2/oracle/fulfillment/request" \
-d "chain=ethereum" \
-d "contract_address=0xYOUR_CONTRACT_ADDRESS" \
-d "num_bytes=32" \
-d "num_qubits=16" \
-d "async_fulfillment=true"
```
### 3. Check Request Status
```bash
curl "http://localhost:8000/api/v2/oracle/fulfillment/status/{request_id}"
```
### 4. Verify On-Chain
Check the transaction on the block explorer:
- Commitment submission transaction
- Reveal transaction (after 2-block delay)
- Randomness value matches API response
### Validation Checklist
- [ ] Contract deployed and verified on block explorer
- [ ] API can connect to testnet RPC
- [ ] Commitment transaction submitted successfully
- [ ] Reveal transaction submitted after delay
- [ ] Randomness delivered to requester contract
- [ ] On-chain randomness matches API-generated value
- [ ] Gas costs within expected range (< 0.01 ETH per fulfillment)
---
## Gas Requirements
Estimated gas costs for oracle operations:
| Operation | Gas Limit | Sepolia (gwei) | Cost (ETH) |
|-----------|-----------|----------------|------------|
| Commit | ~50,000 | 20 | 0.001 |
| Reveal | ~100,000 | 20 | 0.002 |
| **Total** | **~150,000** | **20** | **~0.003** |
**Note:** Actual gas costs vary by network congestion and contract complexity.
---
## Troubleshooting
### Deployment Fails
**Error: "insufficient funds for gas * price + value"**
- Solution: Fund deployer account with more testnet tokens
**Error: "nonce too low"**
- Solution: Wait for pending transactions to confirm or increase gas price
**Error: "contract creation code storage out of gas"**
- Solution: Increase gas limit in deployment script
### API Cannot Connect
**Error: "Could not detect network"**
- Solution: Verify RPC URL is correct and accessible
**Error: "invalid sender"**
- Solution: Ensure private key matches the account funding transactions
### Fulfillment Fails
**Error: "Commitment not yet submitted"**
- Solution: Check that commit transaction was confirmed before reveal
**Error: "Commit-reveal delay not elapsed"**
- Solution: Wait 2 blocks between commit and reveal
**Error: "Commitment mismatch"**
- Solution: Verify randomness value matches the commitment hash
---
## Security Notes
⚠️ **Testnet Only:** These deployments are for testing and development. Do not use testnet contracts or keys in production.
⚠️ **Private Key Security:** Never commit private keys to version control. Use environment variables or secure key management.
⚠️ **Gas Limits:** Set appropriate gas limits to prevent front-running and MEV attacks in production.
---
## Next Steps
After successful testnet deployment and validation:
1. **Mainnet Deployment:** Deploy to production networks (Ethereum, Polygon, BSC, etc.)
2. **Security Audit:** Complete security review per `docs/next-phase/SECURITY_AUDIT_CHECKLIST.md`
3. **Monitoring:** Set up alerts for oracle fulfillment failures
4. **Documentation:** Update user-facing docs with contract addresses
---
## References
- [Hardhat Documentation](https://hardhat.org/docs)
- [Ethers.js Documentation](https://docs.ethers.org)
- [Chainlist](https://chainlist.org) - Network RPCs and Chain IDs
- [QCrypt Oracle Service](../../app/blockchain/oracle_service.py)
---
*Last updated: 2026-03-23*