resolves #67 Co-authored-by: johba <johba@harb.eth> Reviewed-on: https://codeberg.org/johba/harb/pulls/70
264 lines
9 KiB
Markdown
264 lines
9 KiB
Markdown
# Changelog: Version Validation System & Tax Rate Index Refactoring
|
|
|
|
## Date: 2025-10-07
|
|
|
|
## Summary
|
|
This release implements a comprehensive version validation system to ensure contract-indexer-frontend compatibility and completes the tax rate index refactoring to eliminate fragile decimal lookups.
|
|
|
|
## Major Features
|
|
|
|
### 1. Version Validation System
|
|
|
|
**Contract Changes:**
|
|
- `onchain/src/Kraiken.sol`: Added `VERSION = 1` constant (line 28)
|
|
- Public constant for runtime validation
|
|
- Must be incremented for breaking changes to TAX_RATES, events, or data structures
|
|
|
|
**kraiken-lib:**
|
|
- `kraiken-lib/src/version.ts` (NEW): Central version tracking
|
|
- `KRAIKEN_LIB_VERSION = 1`
|
|
- `COMPATIBLE_CONTRACT_VERSIONS = [1]`
|
|
- `isCompatibleVersion()` validation function
|
|
- `getVersionMismatchError()` for detailed error reporting
|
|
- `kraiken-lib/package.json`: Added `./version` export
|
|
|
|
**Ponder Indexer:**
|
|
- `services/ponder/src/helpers/version.ts` (NEW): Contract version validation
|
|
- Reads `VERSION` from deployed contract at startup
|
|
- Validates against `COMPATIBLE_CONTRACT_VERSIONS`
|
|
- **Fails hard (exit 1)** on mismatch to prevent indexing wrong data
|
|
- `services/ponder/src/kraiken.ts`: Integrated version check on first Transfer event
|
|
- `services/ponder/ponder-env.d.ts`: Fixed permissions (chmod 666)
|
|
|
|
**Frontend:**
|
|
- `web-app/src/composables/useVersionCheck.ts` (NEW): Version validation composable
|
|
- Validates `KRAIKEN_LIB_VERSION` loads correctly
|
|
- Placeholder for future GraphQL-based 3-way validation
|
|
- Warns (doesn't fail) on mismatch
|
|
|
|
**CI/CD:**
|
|
- `.github/workflows/validate-version.yml` (NEW): Automated version validation
|
|
- Validates contract VERSION is in COMPATIBLE_CONTRACT_VERSIONS
|
|
- Runs on PRs and pushes to master/main
|
|
- Prevents merging incompatible versions
|
|
|
|
**Documentation:**
|
|
- `VERSION_VALIDATION.md` (NEW): Complete architecture and workflows
|
|
- System architecture diagram
|
|
- Version bump workflow
|
|
- Troubleshooting guide
|
|
- Maintenance guidelines
|
|
|
|
### 2. Podman Orchestration Fix
|
|
|
|
**Problem:** Podman's dependency graph validator fails with "container not found in input list" errors when containers have `depends_on` metadata.
|
|
|
|
**Solution:**
|
|
- `podman-compose.yml`: Removed ALL `depends_on` declarations from:
|
|
- bootstrap
|
|
- ponder
|
|
- webapp
|
|
- landing
|
|
- txn-bot
|
|
- caddy
|
|
|
|
- `scripts/dev.sh`: Implemented phased startup with explicit health checks:
|
|
1. Create all containers (`podman-compose up --no-start`)
|
|
2. Start anvil & postgres, wait for healthy
|
|
3. Start bootstrap, wait for completion
|
|
4. Start ponder, wait for healthy
|
|
5. Start webapp/landing/txn-bot
|
|
6. Start caddy
|
|
|
|
**Result:** Stack starts reliably without dependency graph errors.
|
|
|
|
### 3. Tax Rate Index Refactoring (Completion)
|
|
|
|
**Web App:**
|
|
- `web-app/src/composables/useSnatchSelection.ts`:
|
|
- Replaced `position.taxRate >= maxTaxRateDecimal` with `posIndex >= selectedTaxRateIndex`
|
|
- Fixed test data to match index-based logic
|
|
|
|
- `web-app/src/composables/usePositions.ts`:
|
|
- Replaced decimal-based sorting with index-based sorting
|
|
- Changed threshold calculation from average percentage to average index
|
|
|
|
- `web-app/src/components/collapse/CollapseActive.vue`:
|
|
- Changed low tax detection from decimal to index comparison
|
|
|
|
- `web-app/src/views/GraphView.vue`: **DELETED** (dead code, 63 lines)
|
|
|
|
**Ponder:**
|
|
- `services/ponder/ponder.schema.ts`:
|
|
- **CRITICAL FIX**: Import `TAX_RATE_OPTIONS` from kraiken-lib instead of hardcoded array
|
|
- Added `taxRateIndex` column to positions table
|
|
- Added index on `taxRateIndex` column
|
|
|
|
- `services/ponder/src/stake.ts`:
|
|
- Extract and store `taxRateIndex` from contract events
|
|
|
|
**Tests:**
|
|
- `kraiken-lib/src/tests/taxRates.test.ts`: Fixed Jest ES module compatibility
|
|
- `kraiken-lib/jest.config.js` → `kraiken-lib/jest.config.cjs`: Renamed for CommonJS
|
|
- `web-app/src/composables/__tests__/useSnatchSelection.spec.ts`: Fixed test data inconsistencies
|
|
|
|
## File Changes
|
|
|
|
### Added Files (7)
|
|
1. `.github/workflows/validate-version.yml` - CI/CD validation
|
|
2. `VERSION_VALIDATION.md` - Documentation
|
|
3. `kraiken-lib/src/version.ts` - Version tracking
|
|
4. `kraiken-lib/jest.config.cjs` - Jest config
|
|
5. `services/ponder/src/helpers/version.ts` - Ponder validation
|
|
6. `web-app/src/composables/useVersionCheck.ts` - Frontend validation
|
|
7. `scripts/sync-tax-rates.mjs` - Tax rate sync script
|
|
|
|
### Deleted Files (2)
|
|
1. `web-app/src/views/GraphView.vue` - Dead code
|
|
2. `kraiken-lib/jest.config.js` - Replaced with .cjs
|
|
|
|
### Modified Files (29)
|
|
1. `.gitignore` - Added test artifacts, logs, ponder state
|
|
2. `CLAUDE.md` - Added Version Validation and Podman Orchestration sections
|
|
3. `kraiken-lib/AGENTS.md` - Added version.ts to Key Modules
|
|
4. `kraiken-lib/package.json` - Added ./version export
|
|
5. `kraiken-lib/src/index.ts` - Export version validation functions
|
|
6. `kraiken-lib/src/taxRates.ts` - Generated tax rates with checksums
|
|
7. `kraiken-lib/src/tests/taxRates.test.ts` - Fixed Jest compatibility
|
|
8. `onchain/src/Kraiken.sol` - Added VERSION constant
|
|
9. `podman-compose.yml` - Removed all depends_on declarations
|
|
10. `scripts/build-kraiken-lib.sh` - Updated build process
|
|
11. `scripts/dev.sh` - Implemented phased startup
|
|
12. `services/ponder/AGENTS.md` - Updated documentation
|
|
13. `services/ponder/ponder-env.d.ts` - Fixed permissions
|
|
14. `services/ponder/ponder.schema.ts` - Import from kraiken-lib, add taxRateIndex
|
|
15. `services/ponder/src/kraiken.ts` - Added version validation
|
|
16. `services/ponder/src/stake.ts` - Store taxRateIndex
|
|
17. `tests/e2e/01-acquire-and-stake.spec.ts` - Test updates
|
|
18. `web-app/README.md` - Documentation updates
|
|
19. `web-app/env.d.ts` - Type updates
|
|
20. `web-app/src/components/StakeHolder.vue` - Index-based logic
|
|
21. `web-app/src/components/collapse/CollapseActive.vue` - Index comparison
|
|
22. `web-app/src/components/fcomponents/FSelect.vue` - Index handling
|
|
23. `web-app/src/composables/__tests__/useSnatchSelection.spec.ts` - Fixed tests
|
|
24. `web-app/src/composables/useAdjustTaxRates.ts` - Index-based adjustments
|
|
25. `web-app/src/composables/usePositions.ts` - Index-based sorting and threshold
|
|
26. `web-app/src/composables/useSnatchSelection.ts` - Index-based filtering
|
|
27. `web-app/src/composables/useStake.ts` - Index handling
|
|
28-29. Various documentation and configuration updates
|
|
|
|
## Breaking Changes
|
|
|
|
### For Contract Deployments
|
|
- **New VERSION constant must be present** in Kraiken.sol
|
|
- Ponder will fail to start if VERSION is missing or incompatible
|
|
|
|
### For Ponder
|
|
- **Schema migration required**: Add `taxRateIndex` column to positions table
|
|
- **Database reset recommended**: Delete `.ponder/` directory before starting
|
|
- **New import required**: Import TAX_RATE_OPTIONS from kraiken-lib
|
|
|
|
### For kraiken-lib Consumers
|
|
- **New export**: `kraiken-lib/version` must be built
|
|
- Run `./scripts/build-kraiken-lib.sh` to regenerate dist/
|
|
|
|
## Migration Guide
|
|
|
|
### Updating to This Version
|
|
|
|
1. **Stop the stack:**
|
|
```bash
|
|
./scripts/dev.sh stop
|
|
```
|
|
|
|
2. **Clean Ponder state:**
|
|
```bash
|
|
rm -rf services/ponder/.ponder/
|
|
```
|
|
|
|
3. **Rebuild kraiken-lib:**
|
|
```bash
|
|
./scripts/build-kraiken-lib.sh
|
|
```
|
|
|
|
4. **Rebuild contracts (if needed):**
|
|
```bash
|
|
cd onchain && forge build
|
|
```
|
|
|
|
5. **Start the stack:**
|
|
```bash
|
|
./scripts/dev.sh start
|
|
```
|
|
|
|
6. **Verify version validation:**
|
|
```bash
|
|
podman logs harb_ponder_1 | grep "version validated"
|
|
```
|
|
Should output: `✓ Contract version validated: v1 (kraiken-lib v1)`
|
|
|
|
### Future Version Bumps
|
|
|
|
When making breaking changes to TAX_RATES, events, or data structures:
|
|
|
|
1. **Increment VERSION in Kraiken.sol:**
|
|
```solidity
|
|
uint256 public constant VERSION = 2;
|
|
```
|
|
|
|
2. **Update COMPATIBLE_CONTRACT_VERSIONS in kraiken-lib/src/version.ts:**
|
|
```typescript
|
|
export const KRAIKEN_LIB_VERSION = 2;
|
|
export const COMPATIBLE_CONTRACT_VERSIONS = [2]; // Or [1, 2] for backward compat
|
|
```
|
|
|
|
3. **Rebuild and redeploy:**
|
|
```bash
|
|
./scripts/build-kraiken-lib.sh
|
|
rm -rf services/ponder/.ponder/
|
|
cd onchain && forge script script/Deploy.s.sol
|
|
```
|
|
|
|
## Validation
|
|
|
|
### Unit Tests
|
|
- ✅ kraiken-lib tests pass
|
|
- ✅ web-app tests pass
|
|
- ✅ Ponder codegen succeeds
|
|
- ✅ onchain tests pass
|
|
|
|
### Integration Tests
|
|
- ✅ Stack starts without dependency errors
|
|
- ✅ Ponder validates contract version successfully
|
|
- ✅ Ponder indexes events with taxRateIndex
|
|
- ✅ GraphQL endpoint responds
|
|
- ✅ Version validation logs appear in Ponder output
|
|
|
|
### Manual Verification
|
|
```bash
|
|
# Check Ponder logs for version validation
|
|
podman logs harb_ponder_1 | grep "version validated"
|
|
# Output: ✓ Contract version validated: v1 (kraiken-lib v1)
|
|
|
|
# Check contract VERSION
|
|
cast call $KRAIKEN_ADDRESS "VERSION()" --rpc-url http://localhost:8545
|
|
# Output: 1
|
|
|
|
# Query positions with taxRateIndex
|
|
curl -X POST http://localhost:42069/graphql \
|
|
-d '{"query":"{ positions { id taxRateIndex taxRate } }"}'
|
|
```
|
|
|
|
## Known Issues
|
|
|
|
None. All blocking issues resolved.
|
|
|
|
## Contributors
|
|
|
|
- Claude Code (Anthropic)
|
|
|
|
## References
|
|
|
|
- Full architecture: `VERSION_VALIDATION.md`
|
|
- Podman orchestration: `CLAUDE.md` § Podman Orchestration
|
|
- Tax rate system: `kraiken-lib/src/taxRates.ts`
|