Skip to content
LogoLogo

Programming model

A policy is a Noir library crate that defines one Rule value. weld build generates three thin bin packages (one per phase), each with a main that recomputes the context, checks the params commitment, and calls the phase method. The developer never writes main, never sees the five publics, never hashes anything, and never calls assert: rules return a Verdict, and the generated main asserts it.

// examples/corridor/src/lib.nr
use weld::{Rule, Ctx, Initiate, Accept, Reject, Verdict, Attest};
use weld::schema::v1::*;
 
#[weld::params]
struct Params {
    cap: u128,
    blocked_countries: [Field; 8],
}
 
#[weld::policy(params = Params)]
struct Corridor;
 
impl Rule<Params> for Corridor {
    fn on_initiate(p: Params, ctx: Ctx<Initiate>) -> (Verdict, Attest) {
        let note = ctx.recipient_note();            // shared region
        let v = Verdict::require(note.amount <= p.cap, "corridor/over-cap");
        let _inputs = ctx.inputs();                  // sender_private region
        (v, Attest::none())
    }
 
    fn on_accept(p: Params, ctx: Ctx<Accept>) -> (Verdict, Attest) {
        let record = ctx.payload().record();         // payload region
        let mut v = Verdict::ok();
        for c in p.blocked_countries {
            v = v.and(Verdict::require(record.beneficiary_country() != c, "corridor/blocked"));
        }
        (v, Attest::none())
    }
    // on_reject: default impl permits.
}