Skip to main content
GrantCovenant releases funds tranche-by-tranche as milestones are approved by the authority. Contract path: contracts/core/distribution/GrantCovenant.cash CashScript version: ^0.13.0

Constructor Parameters (Bytecode-Embedded)

ParameterTypeDescription
vaultIdbytes32Links to source vault
authorityHashbytes20Controls milestone releases and administration
milestonesTotalintTotal number of milestones (1..255)
amountPerMilestoneintAmount released per milestone
totalAmountintmilestonesTotal × amountPerMilestone

NFT State (40 bytes)

[0]:    status
[1]:    flags
[2]:    milestones_completed (uint8)
[3-10]: total_released (uint64)
[11-15]: last_release_timestamp (5 bytes)
[16-35]: recipient_hash (bytes20, mutable if FLAG_TRANSFERABLE)
[36-39]: reserved

Transaction Structure

All functions spend covenant state from tx.inputs[0].
FunctionRequired outputsNotes
releaseMilestonetx.outputs[0] recipient payout, tx.outputs[1] updated covenant UTXOUpdates milestone counters and last release timestamp.
pausetx.outputs[0] updated covenant UTXOStatus ACTIVE -> PAUSED.
resumetx.outputs[0] updated covenant UTXOStatus PAUSED -> ACTIVE.
canceltx.outputs[0] authority payoutConsumes campaign UTXO.
transfertx.outputs[0] updated covenant UTXORewrites mutable recipient_hash.

Functions

releaseMilestone(sig authSig, pubkey authPubkey)

Authority-only tranche release. Validation
  • Authority identity/signature check.
  • Status must be ACTIVE.
  • milestonesCompleted < milestonesTotal.
Output rules
  • tx.outputs[0] pays current recipient_hash with amountPerMilestone (BCH or FT mode by flag bit2).
  • tx.outputs[1] must preserve covenant bytecode/token category and commit:
    • milestones_completed + 1
    • total_released + amountPerMilestone
    • last_release_timestamp = tx.locktime
    • status = COMPLETED after final milestone, otherwise ACTIVE

pause() / resume() / cancel()

Authority-only admin paths. Pause / Resume
  • pause requires ACTIVE plus cancelable flag bit0.
  • resume requires PAUSED.
  • Both require output 0 as covenant continuation output.
Cancel
  • Requires status ACTIVE or PAUSED, and cancelable flag bit0.
  • Computes remainingAmount = totalAmount - totalReleased, requires remainingAmount > 0.
  • tx.outputs[0] must pay authority with remaining BCH/FT.

transfer(sig recipientSig, pubkey recipientPubkey, bytes20 newRecipientHash)

Recipient-only reassignment of future milestone payouts. Validation
  • Current recipient_hash must match signer.
  • Transferable flag bit1 must be set.
  • Status must be ACTIVE.
Output rule
  • tx.outputs[0] must preserve covenant bytecode/token category and keep same state except new recipient_hash.