Integration Examples

How ZKontract leverages zk_escrow_v2.aleo for trustless bounty payments

Overview

ZKontract is a decentralized bounty platform built on Aleo that uses zk_escrow_v2.aleo as its core payment infrastructure. This integration demonstrates the versatility and composability of the escrow protocol.

🔗 Key Integration Point:

ZKontract's main program (zkontract_v2.aleo) imports and calls zk_escrow_v2.aleo functions to manage bounty payments securely.

How ZKontract Uses ZK Escrow v2

1

Bounty Creation

When a user posts a bounty on ZKontract, they deposit credits into an escrow through thepost_bounty function.

async transition post_bounty(
    caller: address,
    bounty_id: u64,
    creator_address: address,
    payment_amount: u64
) -> Future {
    assert_eq(caller, creator_address);
    assert(payment_amount > 0u64);
    assert(bounty_id > 0u64);

    // Create escrow - set creator as recipient for potential cancellation
    let escrow_future: Future = zk_escrow_v2.aleo/create_escrow(
        bounty_id,
        creator_address,
        payment_amount
    );
    
    return finalize_post_bounty(escrow_future, bounty_id, creator_address, payment_amount);
}
2

Proposal Submission

Contributors submit proposals for bounties through a separate submission system. Proposal data is stored off-chain (S3), while the escrow remains locked on-chain.

  • ✅ Proposal ID and metadata stored in database
  • ✅ Files uploaded to S3 storage
  • ✅ Escrow remains locked until bounty owner decides
3

Accepting Proposal (Payment)

When the bounty creator accepts a proposal, ZKontract calls the escrow'srelease function to pay the contributor.

async transition accept_proposal(
    caller: address,
    bounty_id: u64,
    proposal_id: u64,
    creator_address: address,
    payment_amount: u64,
    proposer_address: address
) -> Future {
    assert_eq(caller, creator_address); // Only creator can accept
    assert(payment_amount > 0u64);
    
    let composite_proposal_id: u64 = bounty_id * 1000000u64 + proposal_id;

    // Release escrow to proposer
    let release_future: Future = zk_escrow_v2.aleo/release(
        bounty_id,
        payment_amount,
        proposer_address  // Contributor receives payment
    );
    
    return finalize_accept_proposal(release_future, bounty_id, composite_proposal_id);
}
4

Cancelling Bounty (Refund)

If the bounty creator wants to cancel before accepting a proposal, they can retrieve their funds using the cancel_bounty_escrow function.

async transition cancel_bounty_escrow(
    caller: address,
    bounty_id: u64,
    payment_amount: u64
) -> Future {
    assert(bounty_id > 0u64);
    assert(payment_amount > 0u64);
    
    // Cancel escrow - return funds to the bounty creator
    let cancel_future: Future = zk_escrow_v2.aleo/cancel(
        bounty_id,
        payment_amount,
        caller  // Creator gets refund
    );
    
    return finalize_cancel_bounty_escrow(cancel_future, bounty_id, caller);
}

System Architecture

ZKontract Frontend
User Interface
→
zkontract_v2.aleo
Main Contract
→
zk_escrow_v2.aleo
Escrow Protocol
Data Flow: The ZKontract contract acts as an intermediary, managing bounty logic while delegating all payment handling to the escrow contract. This separation of concerns ensures security and reusability.

Benefits of This Integration

🔒Security Through Separation

By using a dedicated, audited escrow contract, ZKontract inherits battle-tested payment security without reimplementing complex logic.

🧩Composability

The modular design allows other projects to use zk_escrow_v2.aleo for their own use cases, creating a shared payment infrastructure.

⚡Gas Efficiency

Reusing an existing contract reduces deployment costs and ensures optimized transaction fees for all escrow operations.

🔄Upgradability

If the escrow contract receives updates or improvements, all integrated projects can benefit without changing their code.

Import Declaration

The ZKontract contract imports zk_escrow_v2.aleo at the top of the file:

import zk_escrow_v2.aleo;

program zkontract_v2.aleo {
    // Bounty mappings and logic...
    
    async transition post_bounty(
        caller: address,
        bounty_id: u64,
        creator_address: address,
        payment_amount: u64
    ) -> Future {
        // Create escrow for this bounty
        let escrow_future: Future = zk_escrow_v2.aleo/create_escrow(
            bounty_id,
            creator_address,
            payment_amount
        );
        
        return finalize_post_bounty(
            escrow_future,
            bounty_id,
            creator_address,
            payment_amount
        );
    }
}

Learn More

ZKontract Repository: github.com/mikenike360/ZKontract
ZK Escrow v2 Repository: github.com/mikenike360/ZKescrow
Aleo Documentation: developer.aleo.org