feat(ink): escrow auto-release (C.2) + NFT modelo delegación documentado (C.1)

Decisiones C de David (2026-07-04):

ESCROW — Opción 2 (auto-release por tiempo, el tiempo como juez determinista):
El audit encontró [HIGH] que si alguien depositaba pero nunca marcaba un
milestone, los fondos quedaban ATRAPADOS (solo salían por disputa+árbitro), y los
campos auto_release_blocks/last_release_block eran código MUERTO. Fix: nueva
`claim_auto_release` (permisionless) que, tras `auto_release_blocks` sin actividad
ni disputa, libera el remanente al beneficiario (menos fee) y cierra el escrow.
`deposit()` arranca el reloj. CRÍTICO para la economía M2M: una AGI que contrata a
otra no queda en limbo porque alguien olvidó un hito. El depositor disconforme
levanta disputa ANTES del vencimiento. +test E2E (ink v6). Campos ya no muertos.

NFT — Opción 1 (delegación ERC-721 estándar, modularidad ADR-0057): el audit
marcó que un spender aprobado puede mover el token con pago cero. NO es bug — es
el estándar Web3 ("si no confías, no apruebes"). La venta con precio pactado +
split 91/9 vive en un contrato de MARKETPLACE SEPARADO (acoplar rompería los NFTs
al actualizar reglas de venta). Documentado el modelo en `transfer`. Sin cambio de
código. Contratos: escrow 6 tests, nft 4 tests verde.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
davidherranandClaude Fable 5 committed 2026-07-07 21:30:13 -05:00
1 parent 114721c24a
commit 0d56e0bcbf
2 files changed
+115 -1

No files matched your search

+11
View File
@@ -492,6 +492,17 @@ mod origin_nft_mint {
/// Transfer canonical de token con sale_price (secondary sale).
/// Royalty 5% canonical paid al original creator from sale_price.
///
/// **Modelo de delegación (David Opción C.1, 2026-07-04, audit ultra):**
/// el guard es `caller == owner || approved`, semántica ERC-721 ESTÁNDAR —
/// una aprobación ES delegación total ("si no confías, no apruebes"). Que un
/// spender aprobado pueda mover el token con `sale_price = 0` NO es un bug:
/// es el estándar de oro Web3. La lógica de VENTA con precio pactado + la
/// división 91/9 (creador/tesorería) NO vive aquí: vivirá en un contrato de
/// **marketplace SEPARADO** (disciplina de costuras de traits, ADR-0057) —
/// meterla aquí acoplaría el NFT base al marketplace y romper los NFTs al
/// actualizar las reglas de venta. `sale_price` aquí es un pago opcional que
/// fluye al vendedor + royalty; el precio-obligatorio es cancha del marketplace.
///
/// Flow canonical:
/// 1. Verify paused == false
/// 2. Verify token exists canonical