David, 3-nov-2026, tras la primera auditoría de fuera (Mathi, f9c3664a): poner al día los
README de todos los crates y repositorios. La plantilla de la casa está en
docs/ORIGIN_README_PARA_PERSONAS_V1.md del monorepo, y el inventario le daba a Charon 11
crates sin README y 5 de contratos de mayo.
- Los 11 crates tienen ya su README en la forma corta: qué es, su estado con dónde
comprobarlo, lo que no hace todavía, sus pruebas medidas hoy (cargo test -p, que suman
365 en ba5d1d8) y quién lo cuida. Una línea en inglés en cada uno.
- Tres crates son esqueletos que el runtime no usa (bridges, consensus, tokenomics), y su
README lo dice y señala dónde vive lo real.
- Los contratos de ink! llevan arriba su estado verdadero. Compilaban y pasaban sus pruebas
como crates de Rust en junio (6663dbd), pero nunca se han construido con cargo-contract ni
desplegado. En el de NFT, además, lo que ya no vale: el 91/9, la regalía del 5 % y la quema,
sustituidos el 2-nov por el 6 % para la LLC y el 3 % para el tesoro común.
- El README del repositorio corrige esa misma frase: decía que nunca se habían compilado.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Audit ultra 2026-07-04 (dimensión ink-contracts): slash() checaba solo
caller==slashing_authority, existencia y amount<=stake.amount — NUNCA el
stake.state. Y withdraw() ponía state=Withdrawable pero NO ceroaba stake.amount.
⇒ tras un withdraw, el slashing_authority podía slashear el stake retirado
(amount<=stake.amount pasaba con el principal ya devuelto), pagando el
treasury_share desde el pool de OTROS stakers (insolvencia + doble decremento
de total_staked). Alcanzable por el Tribunal (autoridad confiable), no cubierto
por FIX-1 (CEI) ni FIX-6 (fake APR).
Fix: (a) guard de estado en slash() — solo Active|Unbonding; Withdrawable/Slashed
→ InvalidState. (b) withdraw() cero stake.amount + rewards_accumulated tras
computar to_return. +test E2E (ink v6, set_contract_balance). Contrato 5 tests
verde. (No desplegado — fase futura; endurecido antes de que sea dinero real.)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Build + tests verde: emission pallet 5 + runtime 28 (incl. emission_pallet_index_13)
+ staking contract 4. Verificacion adversarial ultracode (2 skeptics): correctitud
+ seguridad CONFIRMADAS (split exacto, sin overflow, autor solo-desde-Aura sin
input de usuario, mint-None-seguro, sin dispatchable explotable, APR removal
honesto). 'partial' solo por cobertura de tests en ramas triviales (None /
reward==0), NO por vulnerabilidad.
Cierra V2-CA2 (la cadena no tenia emision -> los validadores ganaban 0 OGC):
NUEVO pallet origin-chain-emission (Index 13):
- on_initialize cada bloque: identifica al autor Aura (FindAuthor =
pallet_session::FindAccountFromAuthorIndex<Runtime, Aura>), mintea un
BlockReward (10 OGC, ~5.26% inflacion anual) y lo reparte:
- 70% al autor (el validador que produjo el bloque).
- 20% al treasury (og/gvtry — la MISMA cuenta-vault de governance FIX-6).
- 10% al subsidy pool (og/subsy — proof-of-equity que financia el subsidio
de hardware anti-clasista #16).
- El residual del split va al subsidy (no pierde unidades por redondeo de bps).
- TotalEmitted trackea la inflacion acumulada on-chain. mint_into (fungible::
Mutate) = emision real (aumenta total issuance).
- El autor viene SOLO de FindAuthor/Aura (no de input de usuario) -> nadie puede
mintear a una cuenta arbitraria. Si FindAuthor devuelve None, no mintea. Sin
overflow (saturating_mul/div, 10^19 << u128::MAX).
sub_mult ORTOGONAL (David 2026-06-10): el subsidy pool financia el subsidio de
hardware SIN importar la suscripcion premium. Esta emision lo alimenta; el
OnChargeTransaction de Stage 2 lo consumira.
Remover APR falso (V1/V2 fake APR): staking contract default_chn3 reward rates
8/5/3% -> 0. Era enganoso (no habia motor que los pagara; los campos
reward_rate_bps se almacenaban pero NUNCA se leian, rewards_accumulated jamas se
acreditaba). Los validadores ahora cobran via la emision real; las tasas de
staking reales las define Stage 2 (NPoS por stake).
FIX-6 Stage 1 COMPLETO (con v0.0.56 treasury real): emision + treasury real +
APR removido. Stage 2: NPoS (pallet_staking + EraPayout) + fee unificado
(OnChargeTransaction con sub_mult ortogonal).
FOLLOW-UPS (low, documentados): anadir tests de cobertura para las ramas
FindAuthor==None (no mintea) y reward==0 (requieren un 2o mock runtime);
BlockReward fijo (decay schedule = Stage 2); el subsidy pool acumula pero no se
consume hasta el OnChargeTransaction de Stage 2; genesis mainnet del treasury
vault (pre-launch).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
REMEDIATION_ROADMAP_V1 FIX-1 (V1-C1 reentrancy + V1-C4 zero-burn). Los 3
templates ahora COMPILAN contra ink! 6.0.0-beta.1 + tests verde (12/12).
Hallazgo (honesto): los templates se shippearon "scaffold compile-only" pero
nunca compilaron contra su versión pinneada de ink!. ink! v6 / pallet-revive es
H160-Address + U256 nativo (no AccountId + Balance, modelo viejo). Esta
migración los vuelve reales (compilando + testeados).
Migración ink! v6:
- AccountId -> Address (H160) en parties / storage / events / reads / params.
- transfer() + transferred_value() -> U256 (+ helper u256_to_balance saturante).
- derive StorageLayout en tipos de storage (EscrowState/Milestone/Stake/...).
- doctest fences sin lenguaje -> text (diagramas ASCII del lifecycle).
- workspace: contracts/* excluidos (toolchain PolkaVM/pallet-revive distinta).
FIX-1 hardening:
- CEI (Checks-Effects-Interactions): muta TODO el storage ANTES de cualquier
transfer() -> una reentrada ve el estado final y falla sus checks. Sitios:
escrow confirm_milestone/resolve_dispute, staking withdraw/slash,
nft mint/transfer. Cierra V1-C1. (nft mint encontrado más allá de la lista
del roadmap; mismo patrón explotable -> incluido).
- Burn real (V1-C4): elimina transfer([0;32]) (que no reduce emisión y ensucia
la cuenta cero); el burn se RETIENE en el contrato (fuera de circulación),
a barrer por el primitivo de burn del runtime -> una sola semántica, no dos.
(staking slash, nft mint).
- Tests de guarda de estado (la C de CEI) añadidos en los 3 contratos.
Pendiente E2E (node-gated, requiere VPS + nodo pallet-revive):
- Correctitud económica native<->eth (NATIVE_TO_ETH_RATIO): asumido 1:1; debe
validarse en nodo real antes de testnet/mainnet.
- Tests reales de reentrancy/double-spend: el env off-chain de #[ink::test] no
modela el revert-on-Err ni la semántica de balances -> serían engañosos.
- V1-H7 (suma milestones == total_amount): no incluido en este commit.
- credential-mint + mdk-reconciliation necesitan la misma migración ink! v6.
Cross-pillar: DC ORIGIN_ATTESTATION_SIGNING_PAYLOAD_V1 abierto con Ergon
(payload postcard canónico + domain-separation FIX-3) — gate del verificador
de attestation on-chain. OAGIP-D10 (Charon identity attestation) definido a
Palace para el protocolo.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>