Files
salvium-rs/test/TESTNET_PLAN.md
T
Matt Hess bc9412b5da ● Add BURN transaction support and security hardening
- Add buildBurnTransaction() and createBurnTransaction()
  - destination_asset_type = "BURN" for burned coins
  - 9 unit tests + integration test for BURN transactions
  - Remove hardcoded test mnemonics (use env vars)
  - Add pre-commit hook to detect potential secrets
  - Add testnet testing plan (test/TESTNET_PLAN.md)
  - Update .gitignore for secret files
2026-01-25 00:13:39 +00:00

324 lines
7.9 KiB
Markdown

# Salvium-JS Testnet Testing Plan
**Status:** Pending - to be executed near project completion
---
## Security: No Secrets in Git
**Pre-commit hook installed:** `.githooks/pre-commit` scans for potential secrets before commit.
**Setup:** Run `git config core.hooksPath .githooks` to enable.
**Protected patterns:**
- 25-word mnemonic phrases
- 64-character hex strings (potential keys)
- Files matching `*.env`, `*.key`, `wallet*.json`, etc.
**Git history audit (2026-01-25):** No real wallet credentials found in history. Only test patterns (`bacon bacon...`, `abbey abbey...`) which are recognizable fake mnemonics.
---
## Prerequisites
### Testnet Setup
- [ ] Testnet daemon URL (or run local testnet node)
- [ ] Testnet wallet with funds (need testnet SAL faucet or mining)
- [ ] Second wallet for receiving transactions
### Environment Variables
**CRITICAL: All wallet secrets MUST come from environment variables. Never hardcode mnemonics, master keys, view keys, or spend keys in test files.**
```bash
# Primary wallet (choose one method)
export WALLET_SEED="testnet wallet 25 word mnemonic"
# OR
export MASTER_KEY="64-character-hex-master-key"
# OR (for view-only testing)
export VIEW_SECRET_KEY="64-char-hex"
export SPEND_PUBLIC_KEY="64-char-hex"
# Secondary wallet for receiving
export WALLET_SEED_2="second wallet mnemonic for receiving"
# Daemon
export DAEMON_URL="http://localhost:28081" # Testnet port
```
### Supported Key Formats
| Variable | Format | Description |
|----------|--------|-------------|
| `WALLET_SEED` | 25 words | Full wallet from mnemonic |
| `MASTER_KEY` | 64 hex chars | Raw 32-byte seed |
| `VIEW_SECRET_KEY` | 64 hex chars | View-only: view secret |
| `SPEND_PUBLIC_KEY` | 64 hex chars | View-only: spend pubkey |
| `SPEND_SECRET_KEY` | 64 hex chars | Optional: spend secret |
---
## Test Categories
### 1. Wallet Sync & Balance Detection
**Test:** Full sync from genesis
```bash
WALLET_SEED="..." bun test/integration-sync.test.js
```
**Verify:**
- [ ] CN outputs detected correctly
- [ ] CARROT outputs detected correctly
- [ ] Subaddress outputs detected (both CN and CARROT)
- [ ] Integrated address outputs detected
- [ ] Key images computed correctly
- [ ] Spent outputs marked as spent
- [ ] Balance matches expected value
- [ ] Stake/yield outputs identified
**Test:** Partial sync (resume from height)
```bash
START_HEIGHT=10000 WALLET_SEED="..." bun test/integration-sync.test.js
```
---
### 2. TRANSFER Transaction
**Test:** Send SAL to standard address
```bash
WALLET_SEED="..." \
RECIPIENT="SLVx..." \
AMOUNT=1.0 \
DRY_RUN=false \
bun test/transfer-integration.test.js
```
**Verify:**
- [ ] Transaction builds without error
- [ ] CLSAG signatures valid
- [ ] Bulletproofs+ range proofs valid
- [ ] Transaction accepted by daemon
- [ ] Transaction appears in mempool
- [ ] Transaction confirmed in block
- [ ] Recipient wallet detects the output
- [ ] Change output returns to sender
**Test:** Send to subaddress
- [ ] CN subaddress recipient
- [ ] CARROT subaddress recipient
**Test:** Send to integrated address
- [ ] Payment ID embedded correctly
- [ ] Recipient detects with payment ID
---
### 3. STAKE Transaction
**Test:** Create stake
```bash
WALLET_SEED="..." \
STAKE_AMOUNT=100.0 \
DRY_RUN=false \
bun test/stake-integration.test.js
```
**Verify:**
- [ ] txType = 6 (STAKE)
- [ ] unlock_time = current_height + STAKE_LOCK_PERIOD
- [ ] source_asset_type = "SAL"
- [ ] destination_asset_type = "SAL"
- [ ] Transaction accepted by daemon
- [ ] Stake output locked until unlock_time
- [ ] After unlock, RETURN transaction received
- [ ] Yield amount correct per consensus rules
**Test:** Verify lock period
- [ ] Mainnet: 21600 blocks (~30 days)
- [ ] Testnet: 20 blocks (for quick testing)
---
### 4. BURN Transaction
**Test:** Burn SAL
```bash
WALLET_SEED="..." \
BURN_AMOUNT=0.1 \
DRY_RUN=false \
bun test/burn-integration.test.js
```
**Verify:**
- [ ] txType = 5 (BURN)
- [ ] destination_asset_type = "BURN"
- [ ] amount_burnt matches requested amount
- [ ] unlock_time = 0 (no lock)
- [ ] Transaction accepted by daemon
- [ ] Burned coins permanently removed from supply
- [ ] Change output returns correctly
**Test:** Burn SAL1 (if available)
```bash
ASSET_TYPE=SAL1 WALLET_SEED="..." BURN_AMOUNT=0.1 bun test/burn-integration.test.js
```
---
### 5. CONVERT Transaction (When Implemented)
**Test:** Convert SAL to SAL1
```bash
WALLET_SEED="..." \
FROM_ASSET=SAL \
TO_ASSET=SAL1 \
AMOUNT=10.0 \
DRY_RUN=false \
bun test/convert-integration.test.js
```
**Verify:**
- [ ] txType = 4 (CONVERT)
- [ ] source_asset_type correct
- [ ] destination_asset_type correct
- [ ] Oracle price used correctly
- [ ] Slippage limit enforced
- [ ] Transaction accepted by daemon
- [ ] Converted amount received
---
### 6. AUDIT Transaction (When Implemented)
**Test:** Create audit disclosure
```bash
WALLET_SEED="..." \
AUDIT_TYPE=full \
DRY_RUN=false \
bun test/audit-integration.test.js
```
**Verify:**
- [ ] txType = 8 (AUDIT)
- [ ] Disclosure data correct
- [ ] Transaction accepted by daemon
---
### 7. Address Generation
**Test:** All address types generate correctly
```bash
bun test/address-integration.test.js
```
**Verify:**
- [ ] Legacy (CN) main address - starts with SLVx
- [ ] Legacy subaddress - starts with SLVs
- [ ] Legacy integrated address - starts with SLVi
- [ ] CARROT main address - starts with salv
- [ ] CARROT subaddress - starts with salvs
- [ ] CARROT integrated address - starts with salvi
- [ ] All addresses decode back to correct keys
---
### 8. Signature Verification
**Test:** Verify our signatures against daemon
```bash
bun test/signature-verification.test.js
```
**Verify:**
- [ ] CLSAG signatures we create pass daemon verification
- [ ] Bulletproofs+ we create pass daemon verification
- [ ] Message signatures verify correctly
---
### 9. RPC Methods
**Test:** All daemon RPC methods work
```bash
bun test/rpc.integration.js $DAEMON_URL
```
**Verify:**
- [ ] getInfo
- [ ] getBlockCount
- [ ] getBlock / getBlockByHeight
- [ ] getTransactions
- [ ] sendRawTransaction
- [ ] getOuts (for ring member selection)
- [ ] getOutputDistribution
- [ ] Salvium-specific: getSupplyInfo, getYieldInfo
---
### 10. Edge Cases
**Multi-input transactions:**
- [ ] Transaction with 2+ inputs
- [ ] Mixed CN and CARROT inputs (if applicable)
**Dust handling:**
- [ ] Very small outputs
- [ ] sweepDust function (when implemented)
**Error handling:**
- [ ] Insufficient funds error
- [ ] Invalid address error
- [ ] Network errors (daemon unreachable)
- [ ] Invalid transaction rejection
---
## Test Execution Order
1. **Wallet Sync** - Verify we can scan blockchain correctly
2. **Address Generation** - Verify addresses work
3. **TRANSFER** - Basic send/receive
4. **STAKE** - Staking functionality
5. **BURN** - Burning functionality
6. **CONVERT** - Asset conversion (when ready)
7. **AUDIT** - Compliance features (when ready)
8. **Edge Cases** - Stress testing
---
## Integration Test Scripts Needed
| Script | Status | Description |
|--------|--------|-------------|
| `integration-sync.test.js` | ✅ Exists | Wallet sync |
| `transfer-integration.test.js` | ❌ TODO | Send transactions |
| `stake-integration.test.js` | ❌ TODO | Stake creation |
| `burn-integration.test.js` | ✅ Exists | Burn transactions |
| `convert-integration.test.js` | ❌ TODO | Asset conversion |
| `audit-integration.test.js` | ❌ TODO | Audit transactions |
| `address-integration.test.js` | ❌ TODO | Address roundtrip |
| `signature-verification.test.js` | ❌ TODO | Sig verification |
---
## Success Criteria
All tests pass with:
- [ ] Zero transaction rejections
- [ ] Zero balance discrepancies
- [ ] Zero parsing errors
- [ ] All transaction types confirmed on-chain
- [ ] Recipient wallets detect all sent outputs
---
## Notes
- Always use testnet first - never test with real mainnet funds
- Keep test amounts small (0.01-1 SAL)
- Document any daemon version requirements
- Record block heights of test transactions for debugging