feat(emission): FIX-6 Stage 1 — emision que paga validadores (V2-CA2) + remover APR falso
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>
This commit is contained in:
1 parent
1a9e37021d
commit
e6a803b54f
8 files changed
+413
-3
No files matched your search
@@ -416,6 +416,44 @@ impl origin_chain_governance::Config for Runtime {
|
||||
type TreasuryPalletId = GovernanceTreasuryPalletId;
|
||||
}
|
||||
|
||||
// ============================================================
|
||||
// origin_chain_emission::Config — FIX-6 Stage 1 (audit V2-CA2)
|
||||
// ============================================================
|
||||
//
|
||||
// En cada bloque mintea EmissionBlockReward y lo reparte: 70% al autor (el
|
||||
// validador Aura), 20% al treasury (og/gvtry, la MISMA cuenta de governance),
|
||||
// 10% al subsidy pool (og/subsy, proof-of-equity que financia el subsidio de
|
||||
// hardware #16 — ortogonal a la suscripción, David 2026-06-10). Cierra "los
|
||||
// validadores ganan 0 OGC". FindAuthor = el mapeo Aura→validador de session.
|
||||
//
|
||||
// BlockReward 10 OGC × ~5.256M bloques/año ≈ 52.6M OGC/año ≈ 5.26% inflación
|
||||
// sobre el genesis de 1B (materializa la emisión del 40% Ecosystem BM V2).
|
||||
// Stage 2 introduce pallet_staking NPoS sobre este substrate.
|
||||
parameter_types! {
|
||||
/// Recompensa por bloque: 10 OGC (~5% inflación anual).
|
||||
pub const EmissionBlockReward: Balance = 10 * OGC;
|
||||
/// 70% al autor (validador Aura).
|
||||
pub const EmissionAuthorShareBps: u16 = 7_000;
|
||||
/// 20% al treasury (el residual 10% va al subsidy pool).
|
||||
pub const EmissionTreasuryShareBps: u16 = 2_000;
|
||||
/// PalletId del subsidy pool (proof-of-equity, #16 anti-clasista).
|
||||
pub const EmissionSubsidyPalletId: frame_support::PalletId =
|
||||
frame_support::PalletId(*b"og/subsy");
|
||||
}
|
||||
|
||||
impl origin_chain_emission::Config for Runtime {
|
||||
type RuntimeEvent = RuntimeEvent;
|
||||
type Currency = crate::Balances;
|
||||
/// Aura → validador account vía pallet_session (FindAccountFromAuthorIndex).
|
||||
type FindAuthor = pallet_session::FindAccountFromAuthorIndex<Runtime, crate::Aura>;
|
||||
type BlockReward = EmissionBlockReward;
|
||||
type AuthorShareBps = EmissionAuthorShareBps;
|
||||
type TreasuryShareBps = EmissionTreasuryShareBps;
|
||||
// Reusa el MISMO vault de governance (og/gvtry) para el treasury.
|
||||
type TreasuryPalletId = GovernanceTreasuryPalletId;
|
||||
type SubsidyPalletId = EmissionSubsidyPalletId;
|
||||
}
|
||||
|
||||
// ============================================================
|
||||
// pallet_revive::Config — Phase 3 Slice 3.1 v0.0.39 wired
|
||||
// ============================================================
|
||||
|
||||
Reference in new issue
Block a user