Files
arkhe-origin-chain/contracts/origin-escrow
davidherranandClaude Opus 4.8 6663dbdc0f fix(contracts): FIX-1 contract-safety + migración ink! v6 (escrow/staking/nft)
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>
2026-06-09 17:45:02 -05:00
..

origin-escrow — Multi-party Escrow Contract Template (Slice 3.3)

Second foundational template del Origin Contract Atelier. Multi-party escrow + time-locked milestones + dispute-enabled via Pillar 6 Tribunal integration.

Use cases canonical

Use case Parties Flow típico
Freelance contracts Cliente + Freelancer + Tribunal Deposit → milestones met → progressive releases
OMC marketplace (Marihan) Buyer + Seller + Tribunal Deposit → asset delivered → release. Dispute → refund.
Institutional partnerships Universidad + Researcher + Tribunal Multi-milestone investigation funding
Refundable event tickets Organizer + Holder + Tribunal Deposit guarantee → event held → release. Cancel → refund.

State machine canonical

   ┌──────► Created ──deposit──► Active ──confirm_milestone──► Releasing
   │                                │
   │                                ├──raise_dispute──► Disputed
   │                                │                      │
   │                                │                      └──resolve_dispute──► Completed
   │                                │
   │                                └──all milestones complete──► Completed
   └────────────────────────────────────────────────────────────────┘

5 estados terminales: Created → Active → Disputed → Releasing → Completed.

Inmutables compliance

Inmutable Enforcement
#16 HTS anti-clasista escrow_fee_bps capped 5% BM V2 §5.3 ceiling. Pi 5 institutional rate Phase 3.x
#26 Content-Addressed Immutability terms_hash + description_hash BLAKE3 inmutable post-deploy
#37 Free perpetua 9 read methods sin payment (state, depositor, beneficiary, milestones, etc.)
#41 AGI Cross-Species AGI accounts pueden ser any party (depositor, beneficiary, arbiter)

Resolution canonical (Tribunal options)

4 resolution patterns canonical para Tribunal:

  1. ReleaseToBeneficiary: 100% remaining → beneficiary (work completed satisfactorily)
  2. RefundToDepositor: 100% remaining → depositor (work not delivered / fraud)
  3. SplitFifty: 50/50 split (partial completion / shared responsibility)
  4. Custom { depositor_bps, beneficiary_bps }: arbitrary split (e.g., 30/70 partial completion)

Invariant compile-detect: depositor_bps + beneficiary_bps == 10_000 (100%).

Tests canonical (3 unit tests)

  1. constructor_canonical_invariants — valid params + initial state Created
  2. excessive_fee_rejected_canonical — 6% fee rejected (>5% ceiling)
  3. same_party_depositor_beneficiary_rejected — same address rejected

Cross-pillar integration

  • Pillar 4 Origin Chain (Charon): deploy vía pallet-revive Index 11
  • Pillar 6 Nexus Services (Mathi): Tribunal contract address = arbiter parameter
  • Pillar 2 OMC Marketplace (Marihan): escrow integrado a marketplace purchases
  • Pillar 1 Hosting (Larihana): refundable hosting fees future use case

Deploy

cd contracts/origin-escrow
cargo contract build --release
# → target/ink/origin_escrow.polkavm

Deploy via Polkadot.js Apps OR Origin Contract Atelier (Phase 3.x maduración).


— Charon ⚓ (Pilar 4, Phase 3 Slice 3.3 SCAFFOLD shipped 2026-05-27)