From 9473c56139a37c806904ad452e70a524f9ebde6c Mon Sep 17 00:00:00 2001 From: Rogzy Date: Mon, 2 Mar 2026 18:44:28 +0100 Subject: [PATCH 01/14] [COURSE] Add SCR401 Delving Into Simplicity Co-Authored-By: Claude Opus 4.6 --- courses/scr401/assets/thumbnail.webp | Bin 0 -> 28260 bytes courses/scr401/course.yml | 39 + courses/scr401/en.md | 753 ++++++++++++++++++ courses/scr401/quizz/000/en.yml | 12 + courses/scr401/quizz/001/en.yml | 12 + courses/scr401/quizz/002/en.yml | 12 + courses/scr401/quizz/003/en.yml | 12 + courses/scr401/quizz/004/en.yml | 12 + courses/scr401/quizz/005/en.yml | 11 + courses/scr401/quizz/006/en.yml | 12 + courses/scr401/quizz/007/en.yml | 12 + courses/scr401/quizz/008/en.yml | 13 + courses/scr401/quizz/009/en.yml | 12 + courses/scr401/quizz/010/en.yml | 12 + courses/scr401/quizz/011/en.yml | 13 + courses/scr401/quizz/012/en.yml | 13 + courses/scr401/quizz/013/en.yml | 13 + courses/scr401/quizz/014/en.yml | 13 + courses/scr401/quizz/015/en.yml | 13 + courses/scr401/quizz/016/en.yml | 13 + courses/scr401/quizz/017/en.yml | 13 + courses/scr401/quizz/018/en.yml | 13 + courses/scr401/quizz/019/en.yml | 14 + .../russell-oconnor/assets/profile.webp | Bin 0 -> 31076 bytes professors/russell-oconnor/en.yml | 4 + professors/russell-oconnor/professor.yml | 15 + 26 files changed, 1061 insertions(+) create mode 100644 courses/scr401/assets/thumbnail.webp create mode 100644 courses/scr401/course.yml create mode 100644 courses/scr401/en.md create mode 100644 courses/scr401/quizz/000/en.yml create mode 100644 courses/scr401/quizz/001/en.yml create mode 100644 courses/scr401/quizz/002/en.yml create mode 100644 courses/scr401/quizz/003/en.yml create mode 100644 courses/scr401/quizz/004/en.yml create mode 100644 courses/scr401/quizz/005/en.yml create mode 100644 courses/scr401/quizz/006/en.yml create mode 100644 courses/scr401/quizz/007/en.yml create mode 100644 courses/scr401/quizz/008/en.yml create mode 100644 courses/scr401/quizz/009/en.yml create mode 100644 courses/scr401/quizz/010/en.yml create mode 100644 courses/scr401/quizz/011/en.yml create mode 100644 courses/scr401/quizz/012/en.yml create mode 100644 courses/scr401/quizz/013/en.yml create mode 100644 courses/scr401/quizz/014/en.yml create mode 100644 courses/scr401/quizz/015/en.yml create mode 100644 courses/scr401/quizz/016/en.yml create mode 100644 courses/scr401/quizz/017/en.yml create mode 100644 courses/scr401/quizz/018/en.yml create mode 100644 courses/scr401/quizz/019/en.yml create mode 100644 professors/russell-oconnor/assets/profile.webp create mode 100644 professors/russell-oconnor/en.yml create mode 100644 professors/russell-oconnor/professor.yml diff --git a/courses/scr401/assets/thumbnail.webp b/courses/scr401/assets/thumbnail.webp new file mode 100644 index 0000000000000000000000000000000000000000..72fefec483530aecf6f8be6037e3bf61c7dedc9c GIT binary patch literal 28260 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 literal 0 HcmV?d00001 diff --git a/courses/scr401/course.yml b/courses/scr401/course.yml new file mode 100644 index 00000000000..e16d0c089c5 --- /dev/null +++ b/courses/scr401/course.yml @@ -0,0 +1,39 @@ +id: 1f6d0544-c6f0-42c6-a8ef-acf485807b9d + +topic: protocol + +subtopic: simplicity +type: theory + +level: expert + +hours: 8 + +teaching_format: self_paced + +professors_id: + - a3b29adb-43ee-49f4-9582-b37e9cf72858 + +contributor_names: + - rogzy + +published_at: 2026-03-02 + +tags: + - simplicity + - liquid + - scripting + - combinators + - type-system + +original_language: en + +proofreading: + - language: en + last_contribution_date: 2026-03-02 + urgency: 1 + contributor_names: + - rogzy + reward: 0 + +license: CC-BY-SA-V4 diff --git a/courses/scr401/en.md b/courses/scr401/en.md new file mode 100644 index 00000000000..dc45d6a5e98 --- /dev/null +++ b/courses/scr401/en.md @@ -0,0 +1,753 @@ +--- +name: Delving Into Simplicity +goal: Understand Simplicity's design philosophy, type system, and combinator-based approach to blockchain computation. +objectives: + - Understand why blockchain computation requires a fundamentally different language design + - Master the three composition methods; sequential, parallel, and conditional + - Learn Simplicity's type system including unit, sum, product, and boolean types + - Understand the nine core combinators and the completeness theorem + - Build practical data structures and computations from Simplicity primitives +--- + +A deep dive into Simplicity, the next-generation Bitcoin scripting language activated on the Liquid Network. This course explores its type system, its nine core combinators, and how complex computations — from boolean logic to SHA-256 — are built from minimal primitives. Based on the ["Delving Simplicity"](https://delvingbitcoin.org/t/delving-simplicity-part-three-fundamental-ways-of-combining-computations/1902) article series by [Dr. Russell O'Connor](https://r6.ca/) (Blockstream Research). + ++++ + +# Introduction + +c362889b-c630-435f-911b-724c4eca505b + +## Course overview + +cdcc40b6-c985-45b4-9bee-6f931e984476 + +Welcome to SCR401 — Delving Into Simplicity! + +This course is based on the **"Delving Simplicity"** article series written by [Dr. Russell O'Connor](https://r6.ca/), an Infrastructure Tech Developer at [Blockstream](https://blockstream.com/) and the creator of Simplicity. The original articles were published on the [Delving Bitcoin](https://delvingbitcoin.org/u/roconnor-blockstream/summary) forum and form the primary source material for this course. We are grateful for his pioneering work, which made this educational content possible. + +### What you will learn + +This course explores the design philosophy and mathematical foundations behind Simplicity, the next-generation scripting language activated on the [Liquid Network](https://blockstream.com/press-releases/2025-07-31-blockstream-launches-simplicity/) in July 2025. It is structured in four main parts: + +1. **A Blockchain Perspective on Computation** — Why blockchain computation demands a fundamentally different language, and the three ways to combine operations +2. **Core Simplicity and Its Type System** — The minimal type system, the nine core combinators, and the completeness theorem +3. **Building Data Types and Computations** — From boolean logic to SHA-256, constructing real programs from first principles +4. **The Road Ahead** — Future developments, side effects, and the broader vision + +### Prerequisites + +This is an **expert-level** course (approximately 8 hours). You should be comfortable with: +- Basic Bitcoin scripting concepts (what transaction validation does) +- Fundamental programming concepts (types, functions, composition) +- Some familiarity with mathematical notation is helpful but not required — we introduce everything as we go + +### Key resources + +- **Original articles**: ["Delving Simplicity"](https://delvingbitcoin.org/u/roconnor-blockstream/summary) by Dr. Russell O'Connor on Delving Bitcoin +- **Simplicity repository**: [BlockstreamResearch/simplicity](https://github.com/BlockstreamResearch/simplicity) — source code and Rocq formal proofs +- **Official website**: [simplicity-lang.org](https://simplicity-lang.org/) — documentation and SimplicityHL reference +- **Blockstream blog**: [Simplicity on GitHub](https://blog.blockstream.com/en-simplicity-github/) — technical overview + +Ready to dive into one of the most elegant pieces of Bitcoin engineering? Let's go! + +## What is Simplicity? + +d04f3960-d7fb-44e1-b5a3-25b33d03fd38 + +If you're coming to this course without a background in Simplicity, this chapter will orient you before we dive into the deep end. + +### Simplicity in a nutshell + +Simplicity is a **smart contract language for Bitcoin** (and the Liquid sidechain). It was designed from scratch by Dr. Russell O'Connor starting in 2017 and activated on the Liquid Network in July 2025, after years of formal verification and development. + +Unlike Ethereum's Solidity — which is a general-purpose, high-level language — Simplicity is intentionally minimal. It has: +- **Three type formers** (unit, sum, product) +- **Nine combinators** (basic operations and composition rules) +- **No loops, no recursion, no dynamic memory** + +From just these primitives, you can build any computation you need for transaction validation — from boolean logic to full SHA-256 hashing. + +### What can you do with Simplicity today? + +Simplicity is already powering real applications on the Liquid Network. The most notable example is the [Simplicity DEX](https://docs.simplicity-lang.org/use-cases/simplicity-dex/) — a structured options marketplace where users can create and trade call and put options on L-BTC using USDt as collateral, with no price oracle required. The open-source [Deadcat](https://github.com/Resolvr-io/deadcat) protocol implements this, and the [Swaption](https://swaption.io/) app provides a user-facing interface. You can watch a [demo of the DEX in action](https://www.youtube.com/watch?v=4c8bvD6oomw). Beyond DeFi, Simplicity enables any advanced spending condition — vaults, covenants, complex multisig schemes — that would be impossible or unsafe in Bitcoin Script. + +### What this course is — and isn't + +This is **not** a hands-on coding tutorial. You won't write Simplicity programs here. If you're looking for that, check out: +- [simplicity-lang.org](https://simplicity-lang.org/) — official documentation and the SimplicityHL high-level language +- The [Simplicity GitHub repository](https://github.com/BlockstreamResearch/simplicity) — reference implementation, examples, and Rocq proofs +- The [Blockstream blog post](https://blog.blockstream.com/en-simplicity-github/) on getting started + +What this course **is** about: the **philosophical and technical choices** behind Simplicity's design. Why was this language created this way? Why only nine combinators? Why no recursion? Why does it matter that the type system connects to Gentzen's sequent calculus? + +Think of it as understanding **why the engine was built this way** rather than learning to drive the car. + +### Who is this for? + +This course is ideal for: +- **Protocol developers** who want to understand Simplicity's foundations before writing code +- **Bitcoin researchers** interested in the formal verification and type-theoretic approach +- **Computer scientists** curious about the connection between sequent calculus and blockchain computation +- **Advanced bitcoiners** who want to go beyond surface-level understanding of Liquid's scripting capabilities + +If terms like "sum types", "combinators", or "sequent calculus" are entirely new to you, don't worry — we explain everything from scratch. But be prepared for a dense, mathematical journey. + +### From articles to course + +The original "Delving Simplicity" series by Dr. O'Connor is structured as technical blog posts. This course reorganizes and annotates that material into a progressive learning path with quizzes to test your understanding along the way. The ideas, definitions, and proofs are his — we've adapted the format for structured education. + +# A Blockchain Perspective on Computation + +7a7690a5-ea70-4d3d-a9c5-299115661db5 + +## Why Simplicity Exists + +ab030a7a-053d-407f-932b-d71f699f2d0d + +Bitcoin's transaction validation is a significantly different application from regular programming language design. It operates under a unique set of constraints that no general-purpose language was built to handle. Understanding these constraints is essential to understanding why Simplicity was created. + +### The Unique Constraints of Blockchain Computation + +When a Bitcoin transaction is validated, the computation happens under strict resource limitations. Block space is expensive, execution must be deterministic, and every node on the network must arrive at exactly the same result. This creates several design principles that shape everything about how Simplicity works: + +**Pruning unexecuted branches.** In a blockchain context, you don't want to store code that never runs. If a transaction script has multiple execution paths, only the taken path should consume block space. Simplicity's design ensures that unexecuted branches can be pruned from the blockchain entirely. + +**Quasi-linear preprocessing.** Before a Simplicity program executes, the network needs to validate it. This preprocessing step — which includes type checking and resource estimation — must run in quasi-linear time. There's no room for exponential blowups during validation. + +**Static analysis over dynamic metering.** Unlike Ethereum's gas model, which meters execution dynamically, Simplicity allows static analysis to determine resource bounds before execution begins. You know ahead of time exactly how much computation a program requires. + +**No dynamic memory allocation.** During execution, Simplicity programs don't allocate memory dynamically. Everything is determined by the types at compile time. This eliminates entire classes of bugs and attack vectors. + +### What Simplicity Is Not + +Simplicity is not a general-purpose programming language. You wouldn't write a web server or a game in it. It's designed for one purpose: expressing the conditions under which Bitcoin (or Liquid) transactions are valid. This narrow focus allows for a radically minimal design. + +The fundamental question that Simplicity answers is this: given a set of basic blockchain operations — checking signatures, hashing data, inspecting transaction fields — what are the methods for combining these operations into more complex ones? + +The answer, as we'll see in this course, is that there are exactly three fundamental ways to combine computations. + +## Sequential Composition + +c45df1f0-9cef-4d66-bdc3-f75eb158f7a3 + +The most fundamental way to combine two operations is to link them sequentially: the output of one operation becomes the input of the next. + +### The Pipeline Model + +Imagine you have two operations: +- Operation **f** takes an input of type A and produces an output of type B +- Operation **g** takes an input of type B and produces an output of type C + +Sequential composition chains them together: the output of **f** flows directly into **g**, creating a new composite operation that takes an A and produces a C. + +``` + [f] → B → [g] → C +``` + +This is the most intuitive form of composition. It's what happens when you pipe commands in a Unix shell, or when you chain function calls in any programming language. + +### Key Properties + +Sequential composition has several important properties: + +1. **Associativity**: Chaining (f then g) then h is the same as chaining f then (g then h) +2. **Recursiveness**: The composite operation (f then g) is itself an operation, so it can be composed further +3. **Type safety**: The output type of the first operation must match the input type of the second + +### In Bitcoin Script + +In Bitcoin Script, sequential composition is achieved simply by concatenating scripts. When you write `OP_DUP OP_HASH160`, the DUP operation produces a value that HASH160 immediately consumes. The stack serves as the implicit connector between operations. + +### In Simplicity + +In Simplicity, sequential composition is made explicit through the `comp` combinator (also written as `⨾` or `>>>`). If `f : A ⊢ B` and `g : B ⊢ C`, then: + +``` +comp f g : A ⊢ C +``` + +The semantics are straightforward: `⟦comp f g⟧(a) = ⟦g⟧(⟦f⟧(a))` — apply f first, then apply g to the result. + +## Parallel Composition + +8ede59a8-10b0-43ad-a3c0-87695e5e5ef4 + +The second fundamental way to combine operations is to run them in parallel on the same input. + +### Running Operations Side by Side + +Given two operations that both accept the same input type: +- Operation **f** takes input A and produces output B +- Operation **g** takes input A and produces output C + +Parallel composition gives both operations the same input and collects both results into a pair: + +``` + [f] → B ─┐ + (B, C) + [g] → C ─┘ +``` + +The result is a **product type** — a pair containing both outputs. Whether the two operations physically execute simultaneously or one after the other doesn't matter; what matters is that they both receive the same unmodified input. + +### Product Types + +The product type `B × C` contains pairs of values `⟨b, c⟩`. These are like tuples or structs in other languages. In Simplicity, product types are the fundamental way to bundle multiple pieces of data together. + +### In Bitcoin Script + +Bitcoin Script achieves parallel composition through stack manipulation. You can duplicate the top of the stack with `OP_DUP`, then apply different operations to the copies. It's less elegant but functionally equivalent. + +### In Simplicity + +Parallel composition uses the `pair` combinator (also written as `▵` or `&&&`): + +``` +pair f g : A ⊢ B × C +``` + +Semantics: `⟦pair f g⟧(a) = ⟨⟦f⟧(a), ⟦g⟧(a)⟩` — apply both f and g to the same input, pair the results. + +## Conditional Composition + +7f38ccc5-bd5b-4404-aef0-1928ecb97c90 + +The third and final fundamental composition method introduces choice: given two alternative operations, which one executes depends on the input. + +### Sum Types and Tagged Unions + +Before we can define conditional composition, we need the concept of a **sum type**. A sum type `A + B` is a tagged union — a value that is either a left-tagged value of type A, or a right-tagged value of type B. The tag (a single bit) tells you which alternative the value represents. + +We write left-tagged values as `σᴸ(a)` and right-tagged values as `σᴿ(b)`. + +### Branching on the Tag + +Given two operations: +- Operation **f** handles the "left" case (input of type A) +- Operation **g** handles the "right" case (input of type B) + +Conditional composition inspects the tag and routes execution accordingly: + +``` + [f] → D + [g] → D +``` + +Both branches must produce the same output type. This ensures that no matter which path is taken, the rest of the program can proceed without knowing which branch executed. + +### In Bitcoin Script + +Bitcoin Script uses `OP_IF ... OP_ELSE ... OP_ENDIF` for conditional execution. A value on the stack determines which branch runs. This is Bitcoin's original mechanism for expressing choice. + +### In Simplicity + +Simplicity uses the `case` combinator, which provides conditional composition along with a shared environment: + +``` +case f g : (A + B) × C ⊢ D +``` + +The extra type C acts as a shared environment that both branches can access. This is more powerful than a simple `if-then-else` because both branches receive context alongside their specific data. + +### Why Only Three Methods? + +These three composition methods — sequential, parallel, and conditional — are not arbitrary choices. They arise from fundamental mathematical structures. Sequential composition corresponds to function composition. Parallel composition corresponds to the product construction. Conditional composition corresponds to the coproduct (sum) construction. Together, they form a complete basis for expressing any computation over finite types, as we'll prove in Part 2 of this course. + +### No Recursion + +Notably absent from this list is recursion. Simplicity deliberately excludes unbounded recursion. In a blockchain context, you need guaranteed termination and predictable resource usage. Recursive covenants that compute across multiple transactions better serve iterative needs without blowing up block space within a single transaction. + +# Core Simplicity and Its Type System + +dabbd97b-4fad-4c16-a189-6d768c97c82d + +## Simplicity Types + +4067acaa-8b28-4741-9a0a-66013897e28b + +Simplicity's type system is remarkably minimal. There are exactly three ways to form types, and from these three, all the data structures you need can be built. + +### The Unit Type (𝟙) + +The unit type, written `𝟙` or `ONE`, contains exactly one value: the empty tuple `⟨⟩`. Think of it as a zero-bit data type — it carries no information. While this seems useless, it plays a crucial role as a building block. It's the starting point from which all other types are constructed. + +### Sum Types (A + B) + +A sum type `A + B` represents a tagged union of two types. A value of type `A + B` is either: +- `σᴸ(a)` — a left-tagged value where `a` has type A, or +- `σᴿ(b)` — a right-tagged value where `b` has type B + +The tag is a single bit that distinguishes which variant you have. Even when A and B are the same type, left-tagged and right-tagged values are distinct: `σᴸ(a)` ≠ `σᴿ(a)`. + +### The Boolean Type (𝟚) + +The simplest useful sum type is `𝟙 + 𝟙`, written `𝟚` or `TWO`. This is a one-bit data type with exactly two values: +- `σᴸ⟨⟩` — conventionally represents **false** or **0** +- `σᴿ⟨⟩` — conventionally represents **true** or **1** + +This is how Simplicity represents single bits. Everything from cryptographic hashes to transaction signatures is ultimately built from this type. + +### Product Types (A × B) + +A product type `A × B` contains pairs of values `⟨a, b⟩`. This is how you bundle two pieces of data together — like a struct with exactly two fields. + +### Counting Values + +You can think of types arithmetically: +- `𝟙` has 1 value +- `𝟚` = `𝟙 + 𝟙` has 1 + 1 = 2 values +- `𝟚 × 𝟚` has 2 × 2 = 4 values +- `𝟚 + 𝟚` has 2 + 2 = 4 values (but structured differently!) + +This arithmetic interpretation is not just a mnemonic — it precisely captures the number of distinct values each type can hold. + +### No Function Types + +Critically, Simplicity's types do not include function types. Simplicity is a **first-order** language. Functions exist as combinators that transform data, but data itself never contains functions. This restriction is essential for the static analysis properties that blockchains require. + +## Basic Operations and Composition Combinators + +dc247e58-a753-4a46-9e4b-62fbb7e8f1b7 + +Simplicity expressions denote operations with typed inputs and outputs. We write `f : A ⊢ B` to mean "f is an operation that takes input of type A and produces output of type B." + +### The Two Basic Operations + +Simplicity starts with just two primitive operations: + +**Identity (`iden`).** The identity operation passes its input through unchanged: +``` +iden : A ⊢ A +⟦iden⟧(a) = a +``` + +**Unit (`unit`).** The unit operation discards its input and returns the empty tuple: +``` +unit : A ⊢ 𝟙 +⟦unit⟧(a) = ⟨⟩ +``` + +Both are families of operations — there's one `iden` and one `unit` for every Simplicity type. + +### The Three Composition Combinators + +We already met these in Part 1, but now we can state them precisely with types: + +**Sequential Composition (`comp`):** +``` +If f : A ⊢ B and g : B ⊢ C, then +comp f g : A ⊢ C +⟦comp f g⟧(a) = ⟦g⟧(⟦f⟧(a)) +``` + +**Parallel Composition (`pair`):** +``` +If f : A ⊢ B and g : A ⊢ C, then +pair f g : A ⊢ B × C +⟦pair f g⟧(a) = ⟨⟦f⟧(a), ⟦g⟧(a)⟩ +``` + +**Conditional Composition (`case`):** +``` +If f : A × C ⊢ D and g : B × C ⊢ D, then +case f g : (A + B) × C ⊢ D +⟦case f g⟧⟨σᴸ(a), c⟩ = ⟦f⟧⟨a, c⟩ +⟦case f g⟧⟨σᴿ(b), c⟩ = ⟦g⟧⟨b, c⟩ +``` + +The `case` combinator is slightly more powerful than a simple conditional because it distributes a shared environment (type C) to both branches. + +### Values vs. Expressions + +An important distinction: Simplicity expressions are operations (functions), not values. The notation `scribe b : A ⊢ B` represents the unique expression that always returns the value `b`, regardless of input. For example: + +``` +scribe ⟨σᴸ⟨⟩, σᴿ⟨⟩⟩ = pair (injl unit) (injr unit) : A ⊢ 𝟚 × 𝟚 +``` + +This is analogous to Bitcoin Script's `OP_1`, which is not the value 1 — it's the operation that pushes 1 onto the stack. + +## Extractors, Injectors, and the Sequent Calculus + +19e0aa6a-f1e1-4307-8646-2c676d3ea937 + +Beyond the two basic operations and three composition combinators, Simplicity has four more combinators that complete its core. These handle the mechanics of accessing data within product and sum types. + +### Extractors: take and drop + +These combinators reach into product types to access their components: + +**take** extracts the left element: +``` +If f : A ⊢ C, then +take f : A × B ⊢ C +⟦take f⟧⟨a, b⟩ = ⟦f⟧(a) +``` + +**drop** extracts the right element: +``` +If f : B ⊢ C, then +drop f : A × B ⊢ C +⟦drop f⟧⟨a, b⟩ = ⟦f⟧(b) +``` + +Think of `take` and `drop` as projection operators. `take iden` gives you the left element of a pair. `drop iden` gives you the right element. + +### Injectors: injl and injr + +These combinators wrap values with tags to create sum type values: + +**injl** wraps with a left tag: +``` +If f : A ⊢ B, then +injl f : A ⊢ B + C +⟦injl f⟧(a) = σᴸ(⟦f⟧(a)) +``` + +**injr** wraps with a right tag: +``` +If f : A ⊢ C, then +injr f : A ⊢ B + C +⟦injr f⟧(a) = σᴿ(⟦f⟧(a)) +``` + +### The Nine Core Rules + +In total, Simplicity has exactly nine core combinators: + +| Combinator | Purpose | +|---|---| +| `iden` | Pass input through | +| `unit` | Discard input | +| `comp` | Sequential composition | +| `pair` | Parallel composition | +| `case` | Conditional composition | +| `take` | Extract left from product | +| `drop` | Extract right from product | +| `injl` | Inject into left of sum | +| `injr` | Inject into right of sum | + +### Connection to the Sequent Calculus + +These nine rules closely resemble the conjunctive-disjunctive fragment of Gentzen's sequent calculus — a foundational system in mathematical logic. Just as the Curry-Howard correspondence links lambda calculus to natural deduction, Simplicity represents a tweaked variant of the functional interpretation of Gentzen's sequent calculus. + +This connection isn't just theoretical elegance. The sequent calculus formulation ensures that types in the premises are always smaller than in the conclusions. The **Bit Machine** — Simplicity's abstract stack machine interpreter — exploits this property to minimize data copying during execution. + +## Completeness of Simplicity + +7770b8e6-4a4f-40d0-87cc-11d378a6f5ad + +The most remarkable property of Simplicity is its completeness theorem: **for any function between two Simplicity types, there exists some Simplicity expression that denotes it.** + +### What Completeness Means + +Despite having only nine combinators, Simplicity can express every possible function from any type A to any type B. If you can describe the function's behavior on all possible inputs, you can build a Simplicity expression that implements it. + +### How the Proof Works + +The proof is constructive — it actually shows you how to build the expression. The method is conceptually simple: + +1. **Decompose the input**: Using nested `case` expressions, fully decompose any input of any type into its constituent bits +2. **Build a lookup table**: For each possible input, use `scribe` to produce the corresponding output +3. **Assemble**: The nested cases and scribes together form a giant lookup table that implements the function + +For example, to implement a function on `𝟚 × 𝟚` (which has 4 possible inputs), you'd build a tree of case expressions that tests each bit and maps to the correct output. + +### Practical Implications + +The completeness theorem guarantees that Simplicity's nine combinators are a sufficient foundation for any blockchain computation. You never need to add new primitives to express a function — the language is already capable of expressing it. + +However, the lookup-table construction produces expressions of astronomical size for large types. A function on 256-bit inputs would require a lookup table with 2²⁵⁶ entries — clearly impractical. This is why Part 3 of this course focuses on building efficient expressions that exploit the structure of computations, rather than brute-forcing everything through lookup tables. + +### Formal Verification + +The completeness theorem has been formally verified in the Rocq proof assistant (formerly Coq). The proof is part of the official Simplicity repository and has been machine-checked for correctness. + +# Building Data Types and Computations + +7cbc15b8-739e-4452-99de-3fa9b3feb119 + +## Boolean Logic in Simplicity + +e6a198ac-1ac7-4ce7-9292-9d56b49613b7 + +With only three type formers and nine combinators, Simplicity may seem too minimal for practical use. This part demonstrates how abstractions are built up from these basics — the same way computers are built from logic gates. + +### The Boolean Type Revisited + +Recall that the boolean type `𝟚 = 𝟙 + 𝟙` has two values: +- `σᴸ⟨⟩` = false (0) +- `σᴿ⟨⟩` = true (1) + +Boolean operations take one or two bits as input and produce a bit as output. Let's build them from scratch. + +### Logical AND + +The AND function is defined as: + +``` +and ≔ case (injl unit) (drop iden) : 𝟚 × 𝟚 ⊢ 𝟚 +``` + +How does this work? The input is `⟨bit₁, bit₂⟩`. The `case` combinator branches on the first bit: + `injl unit` produces `σᴸ⟨⟩` + `drop iden` extracts bit₂ + +This matches the truth table for AND: false AND anything = false; true AND x = x. + +### Logical OR + +``` +or ≔ case (drop iden) (injr unit) : 𝟚 × 𝟚 ⊢ 𝟚 +``` + + `drop iden` + `injr unit` + +### Logical NOT + +``` +not ≔ copair (injr unit) (injl unit) : 𝟚 ⊢ 𝟚 +``` + +This uses a helper combinator `copair`, defined as: +``` +copair f g ≔ iden ▵ unit ⨾ case (take f) (take g) : A + B ⊢ C +``` + +The `copair` adds a trivial environment to enable the case combinator to work on pure sum types. + +For NOT: if input is false, return true; if true, return false. + +### Logical XOR + +``` +xor ≔ case (drop iden) (drop not) : 𝟚 × 𝟚 ⊢ 𝟚 +``` + +- If bit₁ is false: return bit₂ unchanged +- If bit₁ is true: return NOT bit₂ + +These four operations form a complete basis for boolean logic. Every other boolean function can be built from them. + +## Bit Adders and Arithmetic + +f5bd93d1-3e64-49ce-8876-41a8bfcc22eb + +With boolean logic in hand, we can build arithmetic circuits. The approach mirrors how hardware engineers construct adders from logic gates. + +### The Half-Adder + +A half-adder takes two single bits and produces: +- A **carry** bit (the AND of the inputs) +- A **sum** bit (the XOR of the inputs) + +``` +half-adder ≔ and ▵ xor : 𝟚 × 𝟚 ⊢ 𝟚 × 𝟚 +``` + +This uses parallel composition to compute both outputs simultaneously. For inputs `⟨a, b⟩`, the output is `⟨a AND b, a XOR b⟩`. + +### Access Notation + +To manage deeply nested pairs, Simplicity uses a shorthand notation: +- `O f` abbreviates `take f` (take the left/first element) +- `I f` abbreviates `drop f` (take the right/second element) +- `H` abbreviates `iden` (the whole thing) + +With this notation, navigating nested tuples becomes like navigating a binary tree: +- `O H` = first element of a pair +- `I H` = second element +- `O O H` = first element of the first element +- `I O H` = first element of the second element + +This resembles De Bruijn indices, with O and I acting as binary digits representing positions in a tree structure. + +### The Full-Adder + +A full-adder takes three inputs — two bits and a carry-in — and produces a carry-out and a sum. The input type is `(𝟚 × 𝟚) × 𝟚`: + +``` +full-adder ≔ take half-adder ▵ I H ⨾ + O O H ▵ (O I H ▵ I H ⨾ half-adder) ⨾ + (O H ▵ I O H ⨾ or) ▵ I I H + : (𝟚 × 𝟚) × 𝟚 ⊢ 𝟚 × 𝟚 +``` + +The logic works in three stages: +1. Apply half-adder to the first two bits, preserving the carry-in +2. Apply half-adder to the first sum and the carry-in +3. OR the two carry outputs together, return the final sum + +### Multi-bit Words + +Bit vectors represent integers. Simplicity uses nested product types for power-of-two lengths: +- `𝟚²` = `𝟚 × 𝟚` (2-bit) +- `𝟚⁴` = `𝟚² × 𝟚²` (4-bit) +- `𝟚³²` (32-bit words) +- `𝟚²⁵⁶` (256-bit — used for hashes and keys) + +A ripple carry adder chains full-adders across all bits: + +``` +full-adder-n ≔ zip-accum-right-n full-adder : (𝟚ⁿ × 𝟚ⁿ) × 𝟚 ⊢ 𝟚 × 𝟚ⁿ +``` + +From addition, subtraction, multiplication, division, and all bitwise operations follow by recursive composition. + +## Vectors, Buffers, and Data Structures + +8dc8748f-6e52-42a3-9404-77da22d2d2cb + +Simplicity's type system, despite its minimalism, supports surprisingly rich data structures. + +### Fixed-Length Vectors + +Vectors are built from iterated products with power-of-two lengths: +- `A² = A × A` +- `A⁴ = A² × A²` +- `A⁸ = A⁴ × A⁴` + +### Mapping Over Vectors + +For any operation `f : A ⊢ B`, we can map it over a vector using parallel composition: +- `f² ≔ f ▵ f : A² ⊢ B²` (apply f to both elements) +- `f⁴ ≔ f² ▵ f² : A⁴ ⊢ B⁴` +- `f⁸ ≔ f⁴ ▵ f⁴ : A⁸ ⊢ B⁸` + +### Folding Over Vectors + +For a function `f : A × B ⊢ B` that combines an element with an accumulator: + +``` +fold-right-2 f ≔ O O H ▵ (O I H ▵ I H ⨾ f) ⨾ f : A² × B ⊢ B +fold-right-4 f ≔ fold-right-2 (fold-right-2 f) : A⁴ × B ⊢ B +``` + +This recursively folds over vector elements from right to left. + +### Option Types + +The option type wraps a value with a presence/absence tag: + +``` +Option A ≔ 𝟙 + A +``` + +A value of type `Option A` is either `σᴸ⟨⟩` (nothing/none) or `σᴿ(a)` (some value a). + +For mapping: `f? ≔ copair (injl unit) (injr f) : Option A ⊢ Option B` + +For monadic bind: `bind f ≔ copair (injl unit) f : Option A ⊢ Option B` + +### Variable-Length Buffers + +Buffers represent partially filled vectors using option types: +- `Aᑉ² ≔ Option A` (0 or 1 elements) +- `Aᑉ⁴ ≔ Option A² × Aᑉ²` (0 to 3 elements) +- `Aᑉ⁸ ≔ Option A⁴ × Aᑉ⁴` (0 to 7 elements) + +The type `Xᑉ⁸` expands to `(1 + X⁴) × ((1 + X²) × (1 + X))`, which as a polynomial yields `1 + X + X² + ... + X⁷` — representing collections of 0 to 7 elements. + +Stack operations like push and pop are definable: +- `push-e3541a33-f57c-4efb-b59b-c6c887061475 + +The constructions from the previous chapters aren't just theoretical exercises — they lead to real cryptographic implementations. + +### SHA-256 in Simplicity + +The SHA-256 block compression function can be fully expressed in Simplicity: + +``` +sha256-hash-block : 𝟚²⁵⁶ × 𝟚⁵¹² ⊢ 𝟚²⁵⁶ +``` + +This takes a 256-bit hash state and a 512-bit message block, and produces a new 256-bit hash state. The implementation uses all the building blocks we've covered: boolean logic, multi-bit arithmetic, and vector operations. + +The SHA-256 implementation is formally verified in the Rocq proof assistant (formerly Coq), with a machine-checked proof that it correctly implements the standard. + +### The Role of Jets + +Raw Simplicity execution of SHA-256 would be impractically slow — the expression tree is enormous. This is where **jets** come in. + +A jet is a native implementation of a Simplicity expression. The network agrees that when a particular Simplicity expression appears (identified by its Merkle root), it can be replaced with an optimized native implementation. The Simplicity expression serves as a formal specification — it defines exactly what the jet must compute — while the jet provides practical performance. + +Common jets include: +- Arithmetic operations (add, subtract, multiply) +- Cryptographic primitives (SHA-256, SHA-512, secp256k1) +- Signature verification +- Bitwise operations + +### DAG Serialization + +You might worry that Simplicity expressions grow exponentially as they get more complex. In practice, they don't. Simplicity expressions are serialized as **directed acyclic graphs (DAGs)**, not trees. When a sub-expression appears multiple times, it's stored once and referenced multiple times. This keeps expression sizes growing linearly, not exponentially. + +### Higher-Level Languages + +Nobody writes raw Simplicity by hand for production use. The language **SimplicityHL** provides a higher-level syntax that compiles down to Simplicity expressions. SimplicityHL handles: +- Variable naming and scope +- Automatic environment management +- Library imports +- Familiar control flow syntax + +The low-level Simplicity expressions we've studied in this course are the compilation target — the "assembly language" that SimplicityHL generates. + +## The Road Ahead + +c29188f6-dd5b-40b3-afbc-4cbd9a6a30d9 + +This course has covered the pure computational core of Simplicity. But a blockchain scripting language needs more than pure computation — it needs to interact with transactions. + +### Side Effects + +Future installments of the "Delving Simplicity" series will introduce: + +**Assertions (fail).** A mechanism for computations to fail, which is essential for transaction validation. If a condition isn't met (e.g., an invalid signature), the computation must be able to reject the transaction. + +**Witness data.** A way to provide input data (like signatures) that isn't part of the program itself but is provided at spending time. + +**Transaction introspection.** Combinators that read fields from the transaction being validated — amounts, script hashes, lock times, and more. + +### Programs and Addresses + +Part V of the series will cover how Simplicity programs are structured for deployment: +- How programs are committed to the blockchain +- The Merkle tree structure of Simplicity programs +- Address generation and spending conditions + +### The Broader Vision + +Simplicity represents a fundamentally different approach to blockchain scripting. Instead of adding features incrementally (as Bitcoin Script does with new opcodes), Simplicity provides a minimal, mathematically complete foundation. New functionality comes from composition, not from expanding the language. + +With its activation on the Liquid Network, Simplicity has moved from theory to practice. The concepts you've learned in this course — composition, types, combinators, and data construction — are now powering real transactions on a production blockchain. + +### Further Resources + +- **Delving Simplicity series**: The [original article series](https://delvingbitcoin.org/u/roconnor-blockstream/summary) by Dr. Russell O'Connor on the Delving Bitcoin forum — the primary source for this course +- **Simplicity GitHub repository**: [BlockstreamResearch/simplicity](https://github.com/BlockstreamResearch/simplicity) — source code and Rocq formal proofs +- **Simplicity language website**: [simplicity-lang.org](https://simplicity-lang.org/) — official documentation and SimplicityHL reference +- **Blockstream announcement**: [Simplicity activation on Liquid](https://blockstream.com/press-releases/2025-07-31-blockstream-launches-simplicity/) (July 2025) + +# Final Section + +96952535-4aa6-4e78-91e2-d12e9df895d4 + +## Reviews & Ratings + +fb0b0133-39ea-497b-bd36-198be42c4fab +true + +## Final Exam + +2cc5e818-abcb-4a0a-9991-7a492c572e2d +true + +## Conclusion + +8ade24bd-a84f-4d25-8f64-bdfa8b58926c +true diff --git a/courses/scr401/quizz/000/en.yml b/courses/scr401/quizz/000/en.yml new file mode 100644 index 00000000000..513adbf362f --- /dev/null +++ b/courses/scr401/quizz/000/en.yml @@ -0,0 +1,12 @@ +question: Why does Simplicity exclude dynamic memory allocation during execution? +answer: To enable static analysis and eliminate entire classes of bugs and attack vectors. +wrong_answers: + - Because the Liquid Network doesn't support memory operations. + - To reduce the programming learning curve for developers. + - Because Bitcoin Script also lacks dynamic memory allocation. +explanation: >- + Simplicity avoids dynamic memory allocation so that all resource usage + can be determined statically before execution. This enables predictable + resource bounds and eliminates vulnerabilities related to memory management, + which is critical in a blockchain validation context. +reviewed: false diff --git a/courses/scr401/quizz/001/en.yml b/courses/scr401/quizz/001/en.yml new file mode 100644 index 00000000000..cd6167e3afc --- /dev/null +++ b/courses/scr401/quizz/001/en.yml @@ -0,0 +1,12 @@ +question: What does sequential composition produce when chaining operation f (A → B) with operation g (B → C)? +answer: A single composite operation from A to C, where f's output feeds directly into g. +wrong_answers: + - A pair containing both outputs of type B and C. + - A conditional that chooses between f and g based on the input. + - Two separate operations that run independently. +explanation: >- + Sequential composition chains two operations end-to-end. The output of the + first operation becomes the input of the second. In Simplicity, this is + expressed with the comp combinator: comp f g applies f first, then g to + the result. +reviewed: false diff --git a/courses/scr401/quizz/002/en.yml b/courses/scr401/quizz/002/en.yml new file mode 100644 index 00000000000..1612c939b51 --- /dev/null +++ b/courses/scr401/quizz/002/en.yml @@ -0,0 +1,12 @@ +question: In parallel composition, what happens to the input? +answer: Both operations receive the same identical input, and their outputs are combined into a product type (pair). +wrong_answers: + - The input is split in half, with each operation receiving one part. + - One operation processes the input first, and the other receives the modified result. + - The input is tagged and routed to one of the two operations. +explanation: >- + Parallel composition gives the same unmodified input to both operations + simultaneously. The results are bundled into a product type (pair). In + Simplicity, this uses the pair combinator, written f ▵ g, which produces + ⟨f(a), g(a)⟩ for input a. +reviewed: false diff --git a/courses/scr401/quizz/003/en.yml b/courses/scr401/quizz/003/en.yml new file mode 100644 index 00000000000..fbe287d127c --- /dev/null +++ b/courses/scr401/quizz/003/en.yml @@ -0,0 +1,12 @@ +question: What is a sum type (A + B) in Simplicity? +answer: A tagged union where a value is either a left-tagged value of type A or a right-tagged value of type B. +wrong_answers: + - A type that contains all values from both A and B simultaneously. + - An arithmetic addition of the two types' sizes. + - A function type that maps from A to B. +explanation: >- + A sum type A + B is a tagged union. Each value carries a one-bit tag + indicating whether it's a left variant (of type A) or a right variant + (of type B). Even when A and B are the same type, left-tagged and + right-tagged values remain distinct. +reviewed: false diff --git a/courses/scr401/quizz/004/en.yml b/courses/scr401/quizz/004/en.yml new file mode 100644 index 00000000000..faee85bac59 --- /dev/null +++ b/courses/scr401/quizz/004/en.yml @@ -0,0 +1,12 @@ +question: How many core combinators does Simplicity have? +answer: Nine (iden, unit, comp, pair, case, take, drop, injl, injr). +wrong_answers: + - Three (sequential, parallel, conditional). + - Five (comp, pair, case, take, drop). + - Twelve (nine core plus three extension combinators). +explanation: >- + Simplicity has exactly nine core combinators. Two basic operations + (iden and unit), three composition methods (comp, pair, case), and four + accessors (take, drop for products, injl and injr for sums). These nine + are sufficient to express any computable function between Simplicity types. +reviewed: false diff --git a/courses/scr401/quizz/005/en.yml b/courses/scr401/quizz/005/en.yml new file mode 100644 index 00000000000..393dcdebcde --- /dev/null +++ b/courses/scr401/quizz/005/en.yml @@ -0,0 +1,11 @@ +question: What does the 'take' combinator do? +answer: It extracts the left component from a product type, discarding the right. +wrong_answers: + - It removes an element from a sum type. + - It sequentially composes two operations. + - It wraps a value with a left tag to create a sum type. +explanation: >- + The take combinator is an extractor for product types. Given take f + applied to a pair ⟨a, b⟩, it discards b and applies f to a. Combined + with iden, take iden extracts the first element of any pair. +reviewed: false diff --git a/courses/scr401/quizz/006/en.yml b/courses/scr401/quizz/006/en.yml new file mode 100644 index 00000000000..bad9609983e --- /dev/null +++ b/courses/scr401/quizz/006/en.yml @@ -0,0 +1,12 @@ +question: What does the completeness theorem guarantee about Simplicity? +answer: That any function between two Simplicity types can be expressed using the nine core combinators. +wrong_answers: + - That Simplicity programs always terminate in constant time. + - That Simplicity can simulate any Turing machine. + - That every Simplicity program has a unique representation. +explanation: >- + The completeness theorem proves that for any function between finite + Simplicity types, there exists a Simplicity expression that computes it. + The constructive proof builds a lookup table using nested case and scribe + expressions. This has been formally verified in the Rocq proof assistant. +reviewed: false diff --git a/courses/scr401/quizz/007/en.yml b/courses/scr401/quizz/007/en.yml new file mode 100644 index 00000000000..a9c1c264611 --- /dev/null +++ b/courses/scr401/quizz/007/en.yml @@ -0,0 +1,12 @@ +question: How is the boolean type (𝟚) defined in Simplicity? +answer: As the sum type 𝟙 + 𝟙, containing exactly two values (false and true). +wrong_answers: + - As a product type 𝟙 × 𝟙 with one value. + - As a special primitive type built into the language. + - As a 32-bit integer type restricted to 0 and 1. +explanation: >- + The boolean type 𝟚 is defined as 𝟙 + 𝟙, a sum of two unit types. + The left-tagged value σᴸ⟨⟩ represents false (0) and the right-tagged + value σᴿ⟨⟩ represents true (1). This is a one-bit data type built + entirely from Simplicity's three type formers. +reviewed: false diff --git a/courses/scr401/quizz/008/en.yml b/courses/scr401/quizz/008/en.yml new file mode 100644 index 00000000000..99c6af83044 --- /dev/null +++ b/courses/scr401/quizz/008/en.yml @@ -0,0 +1,13 @@ +question: How does the logical AND operation work in Simplicity? +answer: It branches on the first bit — if false, returns false; if true, returns the second bit. +wrong_answers: + - It multiplies two boolean values using the product type. + - It uses a lookup table with all four possible input combinations. + - It applies the XOR combinator followed by the NOT combinator. +explanation: >- + AND is defined as case (injl unit) (drop iden). The case combinator + branches on the first bit. If it's false (left-tagged), injl unit + returns false regardless of the second bit. If it's true (right-tagged), + drop iden returns the second bit unchanged. This matches the AND truth + table. +reviewed: false diff --git a/courses/scr401/quizz/009/en.yml b/courses/scr401/quizz/009/en.yml new file mode 100644 index 00000000000..5fddc7ca972 --- /dev/null +++ b/courses/scr401/quizz/009/en.yml @@ -0,0 +1,12 @@ +question: What does a half-adder compute? +answer: The carry (AND) and sum (XOR) of two input bits. +wrong_answers: + - The sum of two multi-bit integers with carry propagation. + - The average of two bits rounded down. + - The bitwise OR and AND of two input bits. +explanation: >- + A half-adder takes two single bits and produces two outputs using + parallel composition: the carry bit (AND of inputs) and the sum bit + (XOR of inputs). In Simplicity it's defined as and ▵ xor, running + both operations on the same input pair. +reviewed: false diff --git a/courses/scr401/quizz/010/en.yml b/courses/scr401/quizz/010/en.yml new file mode 100644 index 00000000000..e967ec0dd7e --- /dev/null +++ b/courses/scr401/quizz/010/en.yml @@ -0,0 +1,12 @@ +question: How are fixed-length vectors built in Simplicity's type system? +answer: Through iterated product types with power-of-two lengths (e.g., A⁴ = A² × A²). +wrong_answers: + - Using a special array type constructor built into the language. + - Through recursive sum types that chain elements together. + - Using variable-length buffers with a fixed maximum. +explanation: >- + Simplicity builds vectors from nested product types. A² is A × A, + A⁴ is A² × A², A⁸ is A⁴ × A⁴, and so on. This gives power-of-two + sized collections. For example, 𝟚²⁵⁶ (a 256-bit hash) is built by + nesting products 8 levels deep from the boolean type. +reviewed: false diff --git a/courses/scr401/quizz/011/en.yml b/courses/scr401/quizz/011/en.yml new file mode 100644 index 00000000000..54f4397852f --- /dev/null +++ b/courses/scr401/quizz/011/en.yml @@ -0,0 +1,13 @@ +question: What is the role of jets in Simplicity? +answer: Jets are optimized native implementations that replace specific Simplicity expressions for practical performance. +wrong_answers: + - Jets are a compilation step that converts Simplicity to Bitcoin Script. + - Jets are network messages that broadcast Simplicity programs to nodes. + - Jets are debugging tools for testing Simplicity expressions. +explanation: >- + A jet is a native implementation that the network agrees to substitute + for a particular Simplicity expression (identified by its Merkle root). + The Simplicity expression serves as a formal specification of what the + jet computes, while the native code provides practical execution speed. + Common jets handle arithmetic and cryptographic operations like SHA-256. +reviewed: false diff --git a/courses/scr401/quizz/012/en.yml b/courses/scr401/quizz/012/en.yml new file mode 100644 index 00000000000..935f6748eb5 --- /dev/null +++ b/courses/scr401/quizz/012/en.yml @@ -0,0 +1,13 @@ +question: Why are Simplicity expressions serialized as DAGs rather than trees? +answer: To prevent exponential growth — shared sub-expressions are stored once and referenced multiple times. +wrong_answers: + - Because trees cannot represent conditional branching. + - To enable parallel execution on multi-core processors. + - Because the Liquid Network protocol requires DAG format. +explanation: >- + Simplicity expressions naturally form trees that could grow exponentially + as complexity increases. By serializing as directed acyclic graphs (DAGs), + sub-expressions that appear multiple times are stored once and referenced + by multiple parents. This keeps actual program sizes growing linearly + rather than exponentially. +reviewed: false diff --git a/courses/scr401/quizz/013/en.yml b/courses/scr401/quizz/013/en.yml new file mode 100644 index 00000000000..d00bb86d35f --- /dev/null +++ b/courses/scr401/quizz/013/en.yml @@ -0,0 +1,13 @@ +question: Why does Simplicity use static analysis instead of a dynamic gas model like Ethereum? +answer: To determine resource bounds before execution begins, guaranteeing predictable validation costs. +wrong_answers: + - Because static analysis is faster to implement for developers. + - Because Ethereum's gas model was patented and unavailable. + - Because Simplicity programs are too short to need metering. +explanation: >- + Simplicity's static analysis allows the network to know exactly how + much computation a program requires before it runs. This eliminates + the unpredictability of dynamic metering, prevents denial-of-service + via resource exhaustion, and enables nodes to reject programs that + exceed limits without wasting computation. +reviewed: false diff --git a/courses/scr401/quizz/014/en.yml b/courses/scr401/quizz/014/en.yml new file mode 100644 index 00000000000..a76cc993482 --- /dev/null +++ b/courses/scr401/quizz/014/en.yml @@ -0,0 +1,13 @@ +question: What is the unit type (𝟙) and why is it useful despite carrying no information? +answer: It contains a single value (the empty tuple) and serves as the base building block from which all other types are constructed. +wrong_answers: + - It represents the number 1 and is used for arithmetic. + - It is a debugging type that logs execution traces. + - It stores a single bit of data for boolean operations. +explanation: >- + The unit type 𝟙 has exactly one value — the empty tuple ⟨⟩. While + it carries zero bits of information, it is essential as the seed + from which sum and product types build up all useful data types. + For example, the boolean type 𝟚 is 𝟙 + 𝟙, constructed entirely + from unit types. +reviewed: false diff --git a/courses/scr401/quizz/015/en.yml b/courses/scr401/quizz/015/en.yml new file mode 100644 index 00000000000..1045f8d18ae --- /dev/null +++ b/courses/scr401/quizz/015/en.yml @@ -0,0 +1,13 @@ +question: Why does the 'case' combinator include a shared environment type C in its signature? +answer: So that both branches can access shared context data alongside the tagged input value. +wrong_answers: + - To limit the size of the input to prevent stack overflows. + - To enable recursive calls between the two branches. + - To store the output of the previous combinator in the chain. +explanation: >- + The case combinator has signature (A + B) × C ⊢ D. The extra type C + acts as a shared environment that both the left branch (f : A × C ⊢ D) + and right branch (g : B × C ⊢ D) can access. This is more powerful + than a simple if-then-else because branches receive both their specific + data and contextual information needed for computation. +reviewed: false diff --git a/courses/scr401/quizz/016/en.yml b/courses/scr401/quizz/016/en.yml new file mode 100644 index 00000000000..e1ae1d0eac6 --- /dev/null +++ b/courses/scr401/quizz/016/en.yml @@ -0,0 +1,13 @@ +question: What is the relationship between Simplicity and Gentzen's sequent calculus? +answer: Simplicity's nine core combinators correspond to a tweaked functional interpretation of the conjunctive-disjunctive fragment of the sequent calculus. +wrong_answers: + - Simplicity was directly translated from sequent calculus proofs into code. + - Gentzen's sequent calculus is used at runtime to type-check Simplicity programs. + - They are unrelated; the similarity is coincidental. +explanation: >- + The nine core rules of Simplicity closely resemble rules in Gentzen's + sequent calculus, analogous to the Curry-Howard correspondence between + lambda calculus and natural deduction. This connection ensures that + types in the premises are smaller than in conclusions, which the Bit + Machine exploits for efficient execution with minimal data copying. +reviewed: false diff --git a/courses/scr401/quizz/017/en.yml b/courses/scr401/quizz/017/en.yml new file mode 100644 index 00000000000..88012c01ad7 --- /dev/null +++ b/courses/scr401/quizz/017/en.yml @@ -0,0 +1,13 @@ +question: How does the access notation (O, I, H) work in Simplicity? +answer: O abbreviates 'take' (left element), I abbreviates 'drop' (right element), and H abbreviates 'iden' (whole value), allowing binary-tree navigation of nested tuples. +wrong_answers: + - O means output, I means input, and H means halt. + - They are variable names assigned automatically by the compiler. + - O selects odd-indexed elements, I selects even-indexed elements, H selects the head. +explanation: >- + The O/I/H shorthand provides a compact way to navigate nested pairs. + O f is take f (extract left), I f is drop f (extract right), and H is + iden (the whole value). Sequences like I O H mean drop(take(iden)), + extracting the first element of the second element. This resembles + De Bruijn indices with binary digits as tree positions. +reviewed: false diff --git a/courses/scr401/quizz/018/en.yml b/courses/scr401/quizz/018/en.yml new file mode 100644 index 00000000000..71bfc27749f --- /dev/null +++ b/courses/scr401/quizz/018/en.yml @@ -0,0 +1,13 @@ +question: How are variable-length buffers represented in Simplicity's type system? +answer: As nested products of option types, where each option layer represents the presence or absence of a power-of-two sized block. +wrong_answers: + - Using a special dynamic array type built into the language. + - Through recursive sum types that grow on each function call. + - As fixed-size vectors padded with zero values. +explanation: >- + Buffers use nested option types. For example, Xᑉ⁸ expands to + (1 + X⁴) × ((1 + X²) × (1 + X)), which as a polynomial yields + 1 + X + X² + ... + X⁷ — representing collections of 0 to 7 elements. + Each option layer indicates whether a power-of-two block is present, + effectively encoding the length in binary. +reviewed: false diff --git a/courses/scr401/quizz/019/en.yml b/courses/scr401/quizz/019/en.yml new file mode 100644 index 00000000000..ea6a6d1aa66 --- /dev/null +++ b/courses/scr401/quizz/019/en.yml @@ -0,0 +1,14 @@ +question: What is SimplicityHL and why is it needed? +answer: A higher-level language that compiles down to Simplicity expressions, handling variable naming, scope, and environment management automatically. +wrong_answers: + - A hardware description language for mining ASICs that run Simplicity. + - A graphical IDE for visually connecting Simplicity combinators. + - A testing framework for running Simplicity programs in a sandbox. +explanation: >- + Raw Simplicity becomes inscrutable at production complexity levels because + all data access must be done through nested take/drop combinators. SimplicityHL + provides familiar programming constructs — named variables, scoping, library + imports, and control flow — that compile down to Simplicity combinator + expressions. End users write SimplicityHL while Simplicity serves as + the formally verified compilation target. +reviewed: false diff --git a/professors/russell-oconnor/assets/profile.webp b/professors/russell-oconnor/assets/profile.webp new file mode 100644 index 0000000000000000000000000000000000000000..80773f4c8a818c3f7db1d21f6afcf4c9bf6bbcc0 GIT binary patch literal 31076 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 REb_qvXwgq(bMnX_000V@LdO6A literal 0 HcmV?d00001 diff --git a/professors/russell-oconnor/en.yml b/professors/russell-oconnor/en.yml new file mode 100644 index 00000000000..5bcbe05b3e2 --- /dev/null +++ b/professors/russell-oconnor/en.yml @@ -0,0 +1,4 @@ +bio: | + Dr. Russell O'Connor is an Infrastructure Tech Developer at Blockstream and the creator of Simplicity, a next-generation smart contract language for Bitcoin. He holds a Ph.D. in Science from Radboud University Nijmegen and a bachelor's degree in Pure Mathematics and Computer Science from the University of Waterloo. His work at Blockstream Research has contributed to landmark Bitcoin innovations including Taproot. Simplicity, which he designed from scratch starting in 2017, was activated on the Liquid Network in July 2025 after years of formal verification and development. + +short_bio: Creator of Simplicity at Blockstream Research diff --git a/professors/russell-oconnor/professor.yml b/professors/russell-oconnor/professor.yml new file mode 100644 index 00000000000..26d614e5806 --- /dev/null +++ b/professors/russell-oconnor/professor.yml @@ -0,0 +1,15 @@ +id: a3b29adb-43ee-49f4-9582-b37e9cf72858 +name: Russell O'Connor + +links: + twitter: + website: http://r6.ca/ + github: https://github.com/oconnorr + +company: Blockstream + +tags: + - simplicity + - development + - protocol + - research From 71bd13e3b9277336ff811b5a7fcbe3165719d136 Mon Sep 17 00:00:00 2001 From: Rogzy Date: Mon, 2 Mar 2026 21:13:56 +0100 Subject: [PATCH 02/14] local content update From d056aa601b3a63bdd81822a3b9d443564511f602 Mon Sep 17 00:00:00 2001 From: Rogzy Date: Mon, 2 Mar 2026 21:40:50 +0100 Subject: [PATCH 03/14] local content update From 2a1a3278c8a13b74ee28ddab730fe13d511f8e7c Mon Sep 17 00:00:00 2001 From: Rogzy Date: Mon, 2 Mar 2026 22:10:21 +0100 Subject: [PATCH 04/14] local content update From 002331347655f8904b09a3fc6bab05838a30a4f4 Mon Sep 17 00:00:00 2001 From: Rogzy Date: Mon, 2 Mar 2026 22:19:24 +0100 Subject: [PATCH 05/14] [COURSE] Replace SCR401 with SCR403 Simplicity course Co-Authored-By: Claude Opus 4.6 --- courses/scr401/assets/thumbnail.webp | Bin 28260 -> 0 bytes courses/scr401/en.md | 753 ------------------- courses/scr403/assets/en/001.webp | Bin 0 -> 6407 bytes courses/scr403/assets/en/002.webp | Bin 0 -> 10372 bytes courses/scr403/assets/en/003.webp | Bin 0 -> 12277 bytes courses/scr403/assets/thumbnail.webp | Bin 0 -> 143264 bytes courses/{scr401 => scr403}/course.yml | 7 +- courses/scr403/en.md | 767 ++++++++++++++++++++ courses/{scr401 => scr403}/quizz/000/en.yml | 0 courses/scr403/quizz/000/question.yml | 14 + courses/{scr401 => scr403}/quizz/001/en.yml | 0 courses/scr403/quizz/001/question.yml | 14 + courses/{scr401 => scr403}/quizz/002/en.yml | 0 courses/scr403/quizz/002/question.yml | 14 + courses/{scr401 => scr403}/quizz/003/en.yml | 0 courses/scr403/quizz/003/question.yml | 14 + courses/{scr401 => scr403}/quizz/004/en.yml | 0 courses/scr403/quizz/004/question.yml | 14 + courses/{scr401 => scr403}/quizz/005/en.yml | 0 courses/scr403/quizz/005/question.yml | 14 + courses/{scr401 => scr403}/quizz/006/en.yml | 0 courses/scr403/quizz/006/question.yml | 14 + courses/{scr401 => scr403}/quizz/007/en.yml | 0 courses/scr403/quizz/007/question.yml | 14 + courses/{scr401 => scr403}/quizz/008/en.yml | 0 courses/scr403/quizz/008/question.yml | 14 + courses/{scr401 => scr403}/quizz/009/en.yml | 0 courses/scr403/quizz/009/question.yml | 14 + courses/{scr401 => scr403}/quizz/010/en.yml | 0 courses/scr403/quizz/010/question.yml | 14 + courses/{scr401 => scr403}/quizz/011/en.yml | 0 courses/scr403/quizz/011/question.yml | 14 + courses/{scr401 => scr403}/quizz/012/en.yml | 0 courses/scr403/quizz/012/question.yml | 14 + courses/{scr401 => scr403}/quizz/013/en.yml | 0 courses/scr403/quizz/013/question.yml | 14 + courses/{scr401 => scr403}/quizz/014/en.yml | 0 courses/scr403/quizz/014/question.yml | 14 + courses/{scr401 => scr403}/quizz/015/en.yml | 0 courses/scr403/quizz/015/question.yml | 14 + courses/{scr401 => scr403}/quizz/016/en.yml | 0 courses/scr403/quizz/016/question.yml | 14 + courses/{scr401 => scr403}/quizz/017/en.yml | 0 courses/scr403/quizz/017/question.yml | 14 + courses/{scr401 => scr403}/quizz/018/en.yml | 0 courses/scr403/quizz/018/question.yml | 14 + courses/{scr401 => scr403}/quizz/019/en.yml | 0 courses/scr403/quizz/019/question.yml | 14 + courses/scr403/quizz/020/en.yml | 12 + courses/scr403/quizz/020/question.yml | 14 + courses/scr403/quizz/021/en.yml | 12 + courses/scr403/quizz/021/question.yml | 14 + courses/scr403/quizz/022/en.yml | 12 + courses/scr403/quizz/022/question.yml | 14 + courses/scr403/quizz/023/en.yml | 13 + courses/scr403/quizz/023/question.yml | 14 + courses/scr403/quizz/024/en.yml | 11 + courses/scr403/quizz/024/question.yml | 14 + courses/scr403/quizz/025/en.yml | 12 + courses/scr403/quizz/025/question.yml | 14 + courses/scr403/quizz/026/en.yml | 11 + courses/scr403/quizz/026/question.yml | 14 + courses/scr403/quizz/027/en.yml | 12 + courses/scr403/quizz/027/question.yml | 14 + 64 files changed, 1260 insertions(+), 754 deletions(-) delete mode 100644 courses/scr401/assets/thumbnail.webp delete mode 100644 courses/scr401/en.md create mode 100644 courses/scr403/assets/en/001.webp create mode 100644 courses/scr403/assets/en/002.webp create mode 100644 courses/scr403/assets/en/003.webp create mode 100644 courses/scr403/assets/thumbnail.webp rename courses/{scr401 => scr403}/course.yml (87%) create mode 100644 courses/scr403/en.md rename courses/{scr401 => scr403}/quizz/000/en.yml (100%) create mode 100644 courses/scr403/quizz/000/question.yml rename courses/{scr401 => scr403}/quizz/001/en.yml (100%) create mode 100644 courses/scr403/quizz/001/question.yml rename courses/{scr401 => scr403}/quizz/002/en.yml (100%) create mode 100644 courses/scr403/quizz/002/question.yml rename courses/{scr401 => scr403}/quizz/003/en.yml (100%) create mode 100644 courses/scr403/quizz/003/question.yml rename courses/{scr401 => scr403}/quizz/004/en.yml (100%) create mode 100644 courses/scr403/quizz/004/question.yml rename courses/{scr401 => scr403}/quizz/005/en.yml (100%) create mode 100644 courses/scr403/quizz/005/question.yml rename courses/{scr401 => scr403}/quizz/006/en.yml (100%) create mode 100644 courses/scr403/quizz/006/question.yml rename courses/{scr401 => scr403}/quizz/007/en.yml (100%) create mode 100644 courses/scr403/quizz/007/question.yml rename courses/{scr401 => scr403}/quizz/008/en.yml (100%) create mode 100644 courses/scr403/quizz/008/question.yml rename courses/{scr401 => scr403}/quizz/009/en.yml (100%) create mode 100644 courses/scr403/quizz/009/question.yml rename courses/{scr401 => scr403}/quizz/010/en.yml (100%) create mode 100644 courses/scr403/quizz/010/question.yml rename courses/{scr401 => scr403}/quizz/011/en.yml (100%) create mode 100644 courses/scr403/quizz/011/question.yml rename courses/{scr401 => scr403}/quizz/012/en.yml (100%) create mode 100644 courses/scr403/quizz/012/question.yml rename courses/{scr401 => scr403}/quizz/013/en.yml (100%) create mode 100644 courses/scr403/quizz/013/question.yml rename courses/{scr401 => scr403}/quizz/014/en.yml (100%) create mode 100644 courses/scr403/quizz/014/question.yml rename courses/{scr401 => scr403}/quizz/015/en.yml (100%) create mode 100644 courses/scr403/quizz/015/question.yml rename courses/{scr401 => scr403}/quizz/016/en.yml (100%) create mode 100644 courses/scr403/quizz/016/question.yml rename courses/{scr401 => scr403}/quizz/017/en.yml (100%) create mode 100644 courses/scr403/quizz/017/question.yml rename courses/{scr401 => scr403}/quizz/018/en.yml (100%) create mode 100644 courses/scr403/quizz/018/question.yml rename courses/{scr401 => scr403}/quizz/019/en.yml (100%) create mode 100644 courses/scr403/quizz/019/question.yml create mode 100644 courses/scr403/quizz/020/en.yml create mode 100644 courses/scr403/quizz/020/question.yml create mode 100644 courses/scr403/quizz/021/en.yml create mode 100644 courses/scr403/quizz/021/question.yml create mode 100644 courses/scr403/quizz/022/en.yml create mode 100644 courses/scr403/quizz/022/question.yml create mode 100644 courses/scr403/quizz/023/en.yml create mode 100644 courses/scr403/quizz/023/question.yml create mode 100644 courses/scr403/quizz/024/en.yml create mode 100644 courses/scr403/quizz/024/question.yml create mode 100644 courses/scr403/quizz/025/en.yml create mode 100644 courses/scr403/quizz/025/question.yml create mode 100644 courses/scr403/quizz/026/en.yml create mode 100644 courses/scr403/quizz/026/question.yml create mode 100644 courses/scr403/quizz/027/en.yml create mode 100644 courses/scr403/quizz/027/question.yml diff --git a/courses/scr401/assets/thumbnail.webp b/courses/scr401/assets/thumbnail.webp deleted file mode 100644 index 72fefec483530aecf6f8be6037e3bf61c7dedc9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28260 zcmV(lK=i*-Nk&FoZU6vRMM6+kP&gn^ZU6vKSpl5^DxU%t0X|VCkVYe-A)_O-$H+?f{uf`$f_?Wg?Dl%MLq>c4G&>3oj<%YXa-Y5#-Z1OKnKXYda|4^{t1 z@?-Ts;eX=(Q~oXcPx?RJynFwX#^0uYb>hSGKUqJN|8;+^|8e=d{pZo&+&{|yjp`Bn zZ|Gm`U$~#&K3F@o`yJl#JKmul$NfwE_xJDd|M!2x`o(IM=09K$@t@p(+J9g6Xa4_( zr`x~m`v`w9|1o$=$s<2T!jzqNE1&9hhYM_LCe7?`^p?Z;NU5Fw~0e?rVs9#H@ab-F+bIwr!5WBEBYAPo0@aKm|b7Y~hMUYPTEpflxY7c!fV$Q3N z*6z}rt*S{Uh|h;2uh>|WQLx$pOQaXB4e7cEAZSp0I3Z~NFkS^y`;lGj-BqK=OsE&@ zHYM+Ml(&aE6lzlOd74%?H~={#*=BB2zf%0qY68 zai6gHFao(IO^srkZsV7x&@|#}hQdi9t;^Eq#yTVGaid($A6ht+c3+kSb2cWqEOjO2 zI)%85xG>dKr;#6Sh;XJQ#zh8_FuJn>^`5G7;1Qbp${_{zpi8f9S<+cl8Sac+Ym1pg zQv>q#UJ0yb(srybl0B2N7jH=AEcL*k5_1|f>&Uk@FfnX+;a{&IOmWj@?zjxNQ$Mt? zI?$5@QKAu9oY4f^&AE61Qb6{J86fSd|HqmxFCnXUHMJSv2B_VsVz0zL*_bYY@ej`+ zO7s2^puAwr`*S~^FQ<~GVa-_~typKAl1kVCT8HZe>~t*=R?R6*B25)W-pMEzb`}j6U*TT z`6!LfTnN*INBsTCcLAOhTmiHtVeFvvs=-6rIAubM4;VtUQw!HeL^Eug&8%g(c()}9 z?Arq`frc$j(7Uby2)^cS8C{h0f~o;`5W_%3ywOD@%I;6)-RQ_Cn$~Ay%!dx(&{_(i z??5*BO%1}H4yXP^D>XcarB zzI8H;fk_{VQ)!}FGl@3ME)~Rk0l^0pjU?J&sUv<5Gv%-Js~spX@2eaJxV8@F%N{4S zG9V5i6D+f zDrZtmoV~?rAxs>h{X=Xp+rkkE>S}_{Z#iuL$ zYs?vcZgt-SHjUayM>%c(pdk?G3g@k&RfI&~KwR#NfF$tgw>gA3HoP3(My1G_&vRK;|5hf-yzlyMX@IuzDq32DGJo#3nwUS=|qb0DRr6X>nm8;Xlb0 zsPSUTnaG?pQ@GTBg%t$B!-}rKvRSc`6?d#l>I@tB;lgnoZN2N~U#EGgb7JE9A##ZN zhsD?jeU(%Ex=uAQ$o)(gX=C-(|9P9|IX9Diq|-h9WUi#WJq=i1T>(8nmM&NTvKAKk zoz>kB_cv8&JtrzzwlABy1JrkH7fLBQTvF)UAJ;9%9;gFl=r1DhY zduik=24Eiz1^xM`4wglLstHP*=ac-2>;%by9MbfUASuWVbYZ6Q^BN|kt7@IU{pJ5P zX8Cq8!c1cYl$pd`6#CU2FV=Q@e*$;;(+>R%E-xri2FlVR%|~3^XEJv*4Y-+S;1Q!2Bp6)dIDo96+K-h4Xen< z+sKQ5%lc$)5Gv0S8*hBZygFS_v374y(n&S!vnAvxoOFs!%xkbV1!dni8bXR3vdPB^ z&4qr^f(YTCW;zDL)jGVN^GY(%W#VJzD3t*0@0_#jYY^hT3E&=d3VS-njiU=%WH+r ze}Rw#N%Wuo)oGQBIv8T&{_-fO%@Qqub|NGLw-+_6Qeu8uBQWf;n;he99c{SQZ@w+K#dw2& zgVZV+15lc>=ut8g<1f|E>0FoeP8zZvX#Shfido)gGISaAksTA_4~?R+i?Oo7@mJVA zmdyre3|7y6S=GKu-M)rVJzy72d3;`>M&6pX5@%6bs zwZX$=niEg1QBYOlqYg&V;^hUSSsHiU=orUfr_Vs=e11QH1hF`tKu`&_V<(Y3GQr0m zq3aL-&hHGePR?Y{vCjTtwqPcVVN>{epxdjsYF5#;K~ULc`u;Yf%$+sHz`kKwhqRE* zn2Pcl4u%;&<0LNho96nPN%wH<2-Q(k-zntB^Q!JfnyOSS zgkB_A#(k64K(KbAK(^9vQQccxdlAm^{w$jjx3?=(fl?c(;ZMD7RwP*SY(CR>$*#v1 zxpe}IN^bDNfV|cqT0-S@<&r;=&mXKHuWN*a_RQc!q=8W1hTuioFZlZLIEyn+om|c$ z0T@^r%5gLg&^@D)kB4ZUwcU2)E0MMTAWSE{jaJTESdZG)u7{IYw6IW}cgaSgU}yeW zrQfr4QvQXxq7JM3^)58%WK(^(Oj1(_X|k5rveI2=Q;vy$Snd>5F$9yzq!f}T_M4pIBi;UbBR1ONd3+<-tE?w&v^ zm)CJV)kf2M-%8!#K-4_Fw|aRLBMtfxKk-C0g#{86sz_o>0c*<;30TMHQd3%lz>cN+YX@SB1ZEzQ9}VYIg;W#+ttwhrAwgsBRd z)!z`zGDT3BRj2lH;_yyvXvxx8iqWin07^T5%Mns%3GADn05{5XssKos;LKJ^pzYp> zf`Oip>wL-p&%C7t2Wv(Fhl~t?+tA<=NI&GeZk;Y^pta{{mVM@p@DB&lw`XfAM&BCO9Q>23d)WqSj$svn=IGPlvl-D0!6(8%@|8?%Q?dclBl-c z<|tVmYJl#Q!VMcKy;`A{Ykl2k0txlMNWd7qS#dK3%Av?Q5}_QXmj`_KuHtbHq5CN#vAw+kBEPn zx$-&~ZmmF(`^>}i58$>y%U&v8N&#zNj!gf7mo?D;6RO!&l_vJIagpPcw}h`iT{$~k z_64pZC|i+HNArrFZXW0+sg`&H2-D7~a}U9vF+?VYBJ!CL&p79aEysIbsST#7^&NZ( zPl2{Hs34kAou@~UqPaMun&j}Bf%Znt@Nv`ieKcB}{^o4-5sNN11ijbol~ii<%4jOUpy`J(gH#!cA5jZ9IT=lsXM=~%?Lz|Uo9P|q`n_*>VmrzgI4 zPGGw{VZvZ}P;+J3i*x^y%?H|#dtW}wpy&5YUp?+qr!g0&pwcOZ^VCOUtTFGJ-%iRe zdJprnThTvnrCt2rO{lhceRvzG5IZr6^`TG+lwvOYEQ`BM6wTCU0Yq)d^=Pz}$5Yyg zQZJ`Y$Oan7whdjM{aY#fkN!efK<;VBT0~ki&TCH`ie@~EcF;r1pyBHTNj|izHI{pU z@c$ez6nSq3HQ1h1h6UA6J&~h{OYikS>0Yt%uecSc3=4y6(}9=Zs%bJ!EGZVG441iF za3rqMw?hCJQ1qN*EQv!k$dl3>3#O$_+yfD>oAUAf0dQswao)&15SXvGt)hi6UDUEX zMaL^D&COzbxgi_zrRgJx1pMEDALW?kxNy%ENfTXSk3)jY%sjDnb3k{N3v!m0W+9Ua z`MU+q8x2g2It}Z1w0`nh)FJT+wW#%Q5}E=f)+~+A-dog26Med-Jn+I*s#6-YRgn`1D(ykFH)0WJyHr(sm%*k zr#KSTWUc=R#j#Z9E*h&~qI9WdsfLo4(*U3QKAtCCN)5D{5#zh)UlDOE1&y=0U&?8- zdK^7Yp=ad3@~x?Y#y!`7V7H5{_Yf5tvMAoR1}cw`oQ-T zDNj`F7)nPgEVy#u8xK#ld8~@ZX>ISVLS7t^)$5jyL<3gJp#uG7;yG({GcS4e*4WQ9 zZjr4U;JrLyzX-hF5;LtxzP0H{Qg6x1-$*I{qR)uusMcvW1Ym09dyq=G;>x2eC&vZ< zl0sk+AOY?H`U*7i5F#0ytrJ;H=1~5N^%{DMMH^PG`ue)ldyA*d7TE065{Vp6LoJz= z?%&{G(-rW0d=|-2pZL6|_b6~9Vq|8f-M&`Q>h6_*okjK|E<n)#req5%fQqseNde!zpSps#8k zmFccm0P9|Md}L>F{b=XB?CS&XahHKCKdnmwIng@=AlrG$Kqg@mV}|$Kad5I8vsb@x zT{^bzv}ow0OVzW!gYR?-<$K$FyIg+3^KEpdkF1uhRbn?I%h?Rcx76Ax+85-kx>hJsJ_|J8}%cO{nnlq1Af^86vMbF+Mi_&%LRtzj_+eWvpU7 zYHqjRrAom?Jpi*t3Esgi<*Cm+)j@J+HBCILQOj=(t;6;W{{@*Se;%qIq1@| z&f6-G0h;^Q)U^4h1BJ~j$Y9R;u9 zx$2U!z#k-wbU9)S9AT1PV`<9}uSUI3U#uxHY)A(RB(=%OTd+3K%XT)f`rq$`lLUH6)F=uXg~>m62(PAwT}r+{Un|l z!dCiqZNBx5yj^vU3+eAvm8dx)f{}~~DC5_(2tJSU+-h3Xi7TYVd}W%k_R+t9VfV>c zfTVHnmC~m)kJI~AdKa{iAL)mrJw^1m{B!3pSLiq(5GYsS_id|4n-a4LFYVm-$wMB5 z`dj`L0(mA7iG=Kx;;ka)gKxHdvXSU23 zLWTqC;y2s=VMo69m(Fs9sA=SPf0rxPSY~Ch8;v~HzT=vxNC;J~-XCxQf2>?&OxsM# z6?Z@f9G;{SLPzAizL_XH-;YpEZuikdAIw~_{as-~S>|zTpnJ>JTfe-fIJ^XAT!?UO z)dYqsJ2e#XG>byz2Mfxl(Uts32q9xBaK^y(3u}V z2gqUZEgUwq2_9C)HBim`Ez~`D1@@G~56yOHuGP7ca3Xulozj4)7g6AP{9zAXOIHyN zxaEyqy+k!&l~p5dGQof82roV11UQQh2eYE^V)7e2zZxV1cPy;6p^J zEk%Qpk*zZ<_<#F$7D9-|PwKWCl z!+9SSw`q5O)I1Nd)8+~gZh(2B(3E4HLMutyMNZ_vtZI{hLKLA%7w|FxEzTn=tMfnr z$S_BwWgr3?$MOb~5;BvSaR@i(xyXg-u(@QGnb^8!Eble>B@8c@GkvM>K~w*f+iadY z-v&m44DzsTK|yp;*vBOzXp}|b(t??US5N&QBjDeF;V8ojfOWy6zfAayfdx4I=GL_S zdRGv~o@?kb8&W|YM=S^TJGa5VN~W<6eC+qSKB-C=L_lj*y__vj;xD&=r)QO=@S+o+^Qfq|NAK>FFMAlv zYUqWqqZu6)0G(_`ZhXV5HKVu@Crmk>XpzZxKU}EAyZu|-y~83Y=AKQm8C#Gc-L#x3 z@`W>}SKuY@tA5j<^B5HM`~gEhqn07Be=7O?3AqKas3c~#_0FV$RT^ECWkg%~0Y4gs zPE``Zz3jKyjlWxEyS%o7@ll2ev*mUuIvIe*Y5z~Op1O5zxT{ZrPndh^nbTA6O%qxHy+k4kB;Qu^N9DQKlUoD>h zA*6)gvr=<72>qQ~)$Due-%p$6WSE3pjlVC@l4RGt!!7%!{?-8~L5kbl0-Uj83L^TB z+kb*aI*C{Ur?uYrz$O^cxf8y#l*g!N^P=Tf+$uoymBcr5kuThXxNquu`u&GCBA^(6 z#-j6hE7PDqrMuW#v1SjzS^?`ZQ{}j~j)1NL>6ohr720y|t&w?MOZzpZ>PCS>OcUl; z`Z~t(Ti)TKdrY%gp?yygWvy$Tz|Brk@u%ufs?aLK>@6DxIwLw>gC!;uMv`&<^W3(x zYRb5|r%U$(0g&BOejJuIQyJf$_BI8tXq6$9k@9rs@IJ;q*RZP^nh5L&=Xa+uG#?Hx zf=W@kpv9H_1kOXN3uVqZ%Igt|RlgxH;n{b@X@5!Dsi||-Y-fadab4mkuby1;Q3~$y z9^byJ+-yZjJ?gvCS^c7g6^_r6Bt&_TOtnVY55`Ooh*aRanWqi@k{LRWX9%c45EGpl zANO+ed=c0>dte7pKryS3)pD^fckA^TYfB#No<{|Dms_W|X$;}o_CJRkAYF#bFJoUg z&>-ON8B}Mmzpk~y3JX3x@ZE89!J}j2$YoAY&AccvTPEvlO!EUak=%P!%V2<{HPU37 zi4X}Pv$YI{Ce;Gv+x9u>6Q`?EW)wHZLBbJ(QBrz#tvFGBDL(HvYE_ZvKtxO)B5Epa z=QwM^eU&Y$pJD%+Hm$JQC1tS37uqB9y`wt7W$-4;hJfp1?DFuY`^Y+^)7b z4&<}~3At7JwDx^h6YtkPA%{{Qf#qj6ISG(iU~3F;oqNZjv}yP(&T0k@O@?7!c;QzJ z@teprZ6t!M5FhYWCetghxk)ls(xfyqQX~Dfv8T4x4eGw+QJt6I0*3Wc^a`B#Gj58TxM4HEVYJwnCNq0; z-=rApU>~S`yd4LD`1)=wMY3Xl=y(ea#aMB_LTh>LE(ZYEl|R`dcF;KK5_#8B$BjZE z1FR068>ukbXp@_jP;HXZsui=Zz=P+QEe!C@eKfOKm$(+tp*SC2DI-?TrGk(09uU&mELvEa)Sr zszXJYL}hdd{tek7zUlKHxdc4Q2zeD;k-2x&`EQj{mD(?z=rvs~TBjook%?Rm#RM(D zLr{qwiH0dpUYk>2V38HCr9BE=xP4E%2L|GG-&ZMVz-(eSlr9`5vmKqe%)=w*r(r@f zp(wr1H2D4VH&Y<7gK%K;CB9UY{6olW6(j|sO|)Xgw*2ye*|q&T zbtzR75Sp5ui7JQ&wYXl?U>gY*gXWpkFgIs zr&|G^C2*08(+8RggKy1s2KuwMA;`Qlmf885Li&Z$37FbPW(%nH3pcf8wRE@4V&*_l zG#F&)kIHt1q7b*2BJS2Gr#(;X^zE{*Kri(%i>M4VmzTC@x~`;TtGb-ovew}o_I2_< z;{zJ@tBcvuBYPFFP1LBhE8N?q1qLNoc53e?q`pxQ4Pu<0j~BZdnmIyj!X>&(D+O1< zcVr7SsxpZh7*e%0RqLEuGpiXX;}S3taZ)o=P5?4U;TW3Ooai&&EF$nx*NW=IK&shjCR6V# zp2_uWPf<8Llli3Rf5=>@vJ5%JveL~Nt0JBg%mHbe8G;qLI?|Ik1=qZHQQk{5l!c*{ z@e1K5A1F2mz;1m8r3ahcC!WJ}-el6a07Z8SQcsm&rJ2ajcGJaM!q9a;Y=E+%BsS^s z!nK09G>&bX#)jIz?$49LSd8UQz1uBD-|}F8p($NMMy0gDz)lQ<7%AhPX5IM7yo3<8 zl9bv*s$|;7qv6+FinT<%sZK@)Vu(EI&%NmcbX}lpH&Oa1mJuJR_@ppCu2g{WpG<77 z#tXBuCypi(fmXaeo>>RHNu;iiMZG@Yy}%aiZ9Hjob_pgF7J{qnUab=C|2N#gP#J61 z&zboU0-c~-m`c*D^@ZAC-{mU0tQZ>xWOUEBkNWH0{dvr?8WD~`%!M0?R~O>uTi({E z&sQ(t6yf;fO8`67JVx%e2E=DZG!vQP>73oj2NTR4XeD?3PmQ@OntkR#LzDG|^Jk!! z(sBe?x2_>dTAr?pnzmdd3-ExNtVPMz7yey76hzp{ObJ4W?SAeNE>oA#R3|O{%)^YQr;J zz4u{p0+%s|3vcD$v<7t2ytOW3Sk{W}=?;U!wh-=<15LflGE>$|uWKFWr@m6~5VoQ7 zsL2)=|Fm3kvRo=H6CpHx#;+}szWcvr3EO!N0ksTFn+%UP#Zmy*f^*iz007sx*S)wR zb4No_i5_b_kwfkZ`5I(D4L{-w7aG;E?KDmr z4k)>X!3U*dAcmX z?=a2rqhLsUW|_;|&1EG90Q;)FbLrc_Um*ancSo0NEqDUZhQnXO4fv?Mx_x!VNmzB> zo?j2Re98xbJ;Pv|ake*@wu-s{Fs)|L>X$~HJYTp>V3$|T3X4HPSTbWgDH{7a+}WqP zdxITiDZ0IE?W=s*>Z+gklo5iBkh)9vgjQ?_0)*}Kokw9EA3H_mYjHE~<|Bq!qRq-; zP?vXaydRxCJS|flF9YiQS~AwbT?E(KSJF!Ca&4zJ4Ad@Ce=)j?U#lefGTr|`B zSWm^a%{j7nBW#}-3ExF$tW2O>PxRG(lLaFaq_o|R!EdvAw#ESzlOdo7qD6yIUiE32 z@oK1I!w-e@&{TMTGLP%5SUPm4QtE1aIx!NhxIgO%-FtOfq8DbPihIkI?u~pMDPkB{ zNq`SBi6Au+LCmtXV%`mcqm4&8TiAT&j>j}9Jv83yYY!5vY>3O5JvpVvIfIy!+CFcr)G4!^kJ?kp8@7z_FDj9RVhC))c#qGv6fXCm>>mNJL5Em;FcAX{3?7qtPqZP8R8sQjVa3nYpq z8qlF4(4;i#JxQ%9hMP08`vM@Z z6CDh*dvf;fFE~ZNggUU~0`KiaW8AD2Ho5LYHO#D|-)H)m^~MAbVc5!(Ca79QB*d0( z>6~L4clLAa6|qDF>{tVhN?zfA;;LV%am*g{YwNUgKP0mu_uX8I^9%)AE2#n6Hs)i} zs+}5>Q4g`Plp4=Ux%Osy;157`wLBj2@Y-QWu#k-&Bg=j-bO9P`Jlgpmot^iAm->&x zlsp(0>6DHoG`S4fo8$aqeN{DHfdI67JN-$TSC2eT<-C{nAVO?Y1~lCGQ(8^h(UNZO zT3YAnc6w5VvlNc>v`+v8Z?{B4@{80sd(*F9=3Qu4BVjGGmo$Hu#ml8meVYKfdGegl zCUL@%{QW_2_Mhjhy6mx<*JWP|hH-mNB}rjO?ksmz4(unO5L9wSn1R|@x_(!K**A%R ztuh;P8yysxwW6xnT7IG-^7TVKO4{`|&y@y1h@%9o*7Y-(0gUbnRe!k64sDmEQ8^U1 zQv5>PH||&{gjr@j4f-G{hsFe>S}Zz08cH-ZKxRzV(xVCL;ZM1VFvd8+$P|^kxKHC7 z4nC{o3rkzflT2+09znf#O~=|Vfa$_NnMl-1qCnfk@HEfaYC0ykiqH5sai%J1hecvO zx41xO&pstzs#%yGq4xNw>ME9k+QjLX(fu<245o76r+k48Qf` zn1u^{F2^35h=Y_KaTFbv7woM z9JjY&;-lkI7tZ5htHUpKBLM*^Y+f!jrDjxQX+Wpb88sjKc9Q%Af!p_+*tpIYq&4Yv zs=So&KRJ)n?)pdSJmn-40Ex>V2o1(IyC=gJbc&ub*O1<1YK<0U>Y7oj4|W-r-af;; zXc9V+4XL`^3x@8i>EKcZKGQ5R6^*|!AD2smAz^!$)Qs|eB=Fak<-k*>oFn6_%$c4U z;3J^OTkpot>t&V_5L$(VVVx`!kI^erAJrb4Tv^a}ED{ih*3RQ{l!vJLSZMar zK`;I96tnk>HdG*BHkZgmOal;+WWtJxo-?)+wrJTXLHXH3axfea-go}n31nQQ%i$%B zTxMfHYfM1B%b_{7bU^?1|eI+F$vMsW|Ql^1W z1Gb4p$mz=P^opzVlouwy_rNpbTA>q~ky(C@Gz z7$Fo}pfv&ScgUnoh0!{ghsOA?@_g$$L4(TkwS&Qqn(j9eq=Q$0U`oyh5gz7+scN+? zNEji&f_@X-vVonA8<;`f-z>-z$Bp+XQ9&dWSwi8Ao!$Ux(%COY@;1gtt!mxjxkEb6 z1%b8rvZYbQCeJ`4K#;SUMX2@ULP;8DLGB3mqS6e_qIB~L}=6AL9`)DkTx6Rg2dWm;x1UjdxOAa@d z)Dw6PB}1lLjTP@Ac=R7Hc^s1-Oe^suu*}&F2?>+O20OB1`Gsn>7@J=4#Z3+;7C|mZ z6zS!S^0Il{4qx`=+kK&{FH6w)&t+hnXbYumDPdBuoGaD@Sq)$N*<(LV9|^O@Pt(@s zz~W|6EdXYb5ixH|7$!;&D@rlj#=(=eTv^G_JzXChL|_2(aM62QJ=zlr3=liqvJU+R0E2ZwcO1#A9@>uDKjOy6VKB z$+#A@VB4f?r`uO%Sv4rd9>(0zhMVz4_^!U~vbgf1xUTczVkO^;WULYg7&3osi?&T+ zrpU$V17i?jkgihrp`Dcu0W9XT9??(ILCrsl_}Rg#mWo?cLvCrc_(0*sKCbfC0q#tc zA|Ub7XGv1iF(PwfL2xDc>?0=fgJ27!2QGS6F%P1P^eSCgT4;y+C+|a(z%X^R!uk0P z1eL)MU7E53;NX%r1tAwh_|7*C$~eb0dz&&$a*w=@zx7Bp%^5VjABufCLh8Nh8v%8` zeBH>w*k5NHMr-;fIp!H5Ys0!&6YAl**C?xl5I?epgZFy6Ui`IjZuLowM}v~Sv71uD zxZ;J4i4GR!isI=>CU=fZjfn!i#35@Y*hADB{I`>P=tal7%e#pG0>OnIl|E}zg)AtG zX#LN*Sc5)|Tnd`k)0rp3b%4Mn%2u^VUH_Q=jk4HZc9>w+8vN?X$3;7@$N&*wcaM%0Fiv6w3bxmT<~EVJxs_d#Nc(b16dmp23_=t|N_E!h~?-=$rUFTRxef zJJ^AHUDQiG7Eeg|J}o4uJNeStj}ruoC$K@Y?8RTA8u7FfGG%!zBldmM?8@S&MHTQ} ziILzEAGk<6aW}uY8iOU5a6oCDe{1%Z>E*&PsjYc}I2zX?I3#t|OXr3sqwhBPJ zDQ#zx9?up%JQjb>8cLCRNZjm+tLsLHC2Fe%O%uAg*R$Y^R*_gPO?CW9rY>U{kQ+uKkmSqm7R{fLBn{+I` zMwHH%_C@uJ+r=8|)HL9_xn(EZTV1bzC4^juf!|xJ^7X9bDJ*Lh=>1CP(^ia(asv+q zgGQ|pKd;_g)8-u~oKhEC$GYBt!q^w=DvoWc(YV)x`6K&IhttiZ=L*C}*`U6*m@ zMzU^}6hlZ0(z57buUVrMkX(mF$12RainWc!4sBYgCK>!B*(`W|zd2_Gm*7Qkbsp9} z$1JcmZbm^JO!s(qJA z&(mn7ff_PA*r-^F_m!E`tz5#@o5HA4yjJI@(-C`8&~`K9Y>xYI6s>4W_2+_P5R+ zRdA*g_5*B1X|$j7y+d(ntNM4xX2xb+-1G}?3}A)bIQK$Lio2-TsoVfpKQ;bB9&%Pr z#_Rm{JXk?^@D!K&(`1hr?X;Re@3kw#LqipBwH>!018bCMtntduU!?sicHgbt);fj9 zTl{h6cjR{SWG;AD*YkTJTX^4u%W04cNr^L$1pSAUFujH_u6yWN%EuhTwSI+?!jGhm-N1py(D5Ixy%)C^0GQezL} zYywNedc1%`dE9=*I!4~jbEtX1`bKYIR356H3pXe>7un@~W%zN?dqi3fA$0 z`J`Mn93KQ*8g%lxJlSWY$cI`y(ULxhluY}gh9Ji zXx1dm%ysn$8Fl6?gx3s}A_`%RVh>G~Z(TJe)Yu^I;iu3ZMo({AEek0Lh@9y)V=mnR z34>EVgk^dnA8NFTbD^-N2lK#qbx2>BfSTyL(4t}anve4!WGJs>@iNnzq~Cu`kzwiY zdPRRvnU7VirF2-u54gF+yXu42(v@uyCV z(C&{8jYPIDyEvc^?;SjkY6ejTrM;fEYRnbLC#zC}T;U_kRXq~;>s=J>ZU5}!Hl(t& z`V&I5fvE9XmZHBFv8&iqBJEX;Q&0=sNd}D0slBhV}o!s!LpbV8&q9=H@25 zww$jze#mGnSir)0K6~iQEP)d=r_?&u?r7(u$jpKk6N-Vq%zW%y^V@> zd)l}GF8AnY@(dwXOzUps z8TnY)0NqdJ*yGB|5kR%DG*m-F0n+eV&Zs@=Fk*K$PRBxkmYZR-QkLSQ^uId=(KG2n z=pGG8Q*$i{E~dKR`)1mdx`rrR$^C6MkUPli`v2)CYg390aM&HmMN^tSttqYuMOE}; zBfF;A;W+QjnmdO#=W$w+qHWRBLa+7df^7F6kSI;&)oaCn>q?P=+OKb2{ZYdPe^cnK zNJILigG-|_1`(3h1|b`U-^@ybJeEwDUX)xRCR{rEn9BImQpX~2bNzU)L)-?+oz%?A zAV)v^7xpnA2J~?D6z^;9tz0gO?m#3BY5j2BaLqzSP)pB9X=SF+~DyHGWe6R+IZ~F}k0pjd+0>I6nQ_Nu05MD7#4Z(F z`7p8Cd}oj2UOY11aX@@$`75Git*QT(+{1}~;# zNqCMxQO_^xinz~a?6Q~Vk3d#HhV&#QOrQFD?dCOaNz11SI(&XXT0M3(OgjmCqB94w z8nm2hh3wS-N`$=NSG>NangdD9jQe18XgL!*U(f28_Lan@DFf_fPa!Se=L84lQtCXm z+u8190mOjqoRl&gqAC~;I~or1E76>O@G6~b6(rNuVrP^OHKr_{c%a5T@+Tpe)QpGs z!6;|lEeVWkv-DU6xw`bn)qW}y$imbQ z0jF{X@n&=SJ75gV$~n*c;pwrkL8=$1aIb}!yYK)OpLoKt!p7VKHUf^>&5&1wICZEw zeZps|85=#SkG2VW{~EC@Kl-JH<4YvUmS2&$1ua?6gZrS9=6IAC#Jti58dR!e=7hZ} zR=^DsD^M7rTz(6D7$GSeb;#2^f+^Cpt->FIQ^tfJnx!GiOVAxrQSY<525(ZC z+-vxZ?y^)33{b3J1W8RIN=d5`AYPoGr6Lj*Wgq%v1+pe#0Xs?Y3*}>V+&TP_fsxLE zCYnA$6(?=6wUEMp<=WXC8yY7v96Esy%%6kS8h^_P2N|uMvPQy~wSfX+e=TmCzKTIk z#vp%ej2;UVRntjGag{odZzTP<5vgp1_aS^365f4jt?G1!Kl z$W4iB4Ni?wpjCa8rz%G@pYUm=N2>kSQ*D$#jsoTu=MGZ^hZl3O;T!&Lw~=nk95XAz z)GW2EFu^U5DqQv-a3${rL-}y{mfu0s@jp>kn8W4TeOEg)eqcSzX9m;(RcRQ?`_y3! z-@DoqO*#{bEf3FR{Q6~?f%8a;$}I=xizufAr(OPm8Q5&9StCPvChc(h^b6J+&b`iQ za&(lbS!GMVH6gHgudS0mmA}HMV;SOinEzikZzSpndLLy6$(TXtEO0S8v$RP)r}>md zciI4Edry@EK)e@*E=gwB&bzMsV?T$LO0KoS^zZrv7`PRDO(vn|v-QGU-w@vqgcHG~Ug|78e%eOPe&p0Gce|(pZ?@V zYh$*Xk?A2Z1vradvb1O}#|-*%SVwKCp#G|ni!*0;j?P=G$m>HgTQ@oLU#Owh5T z*h+$LfreNP)Q&b@=FX9@lQSzp1vpAD!+v-+6;@8$hZWmVX+K|OGU)B)9w2dBSiEO% zb3YAIje-#={9lW~b6O8knSmxzwre*d5JhCUM=+C5864O^zLo{6k6pLj0UX)F(x4=^ z`@X_0oAFVh^^SlFSVPg6HFZ0ihl6@*TxTzSP%kytGka!=@T9S}40G0L+g+1jvNh6D zPU1=%p0}j;4s#)vDIj44Pmh8SR zk(w7MYlW6Qfz0_2>Xt-U-MxPcjNFKe?7w{FQWiKsUMXAY_QGHZn;%)^$B1i85dLk; zERid&D3z#ST$EVIJFiFztWkQow~8gpsd1*9&+Q5kFo*`a5cd$92M(%ok;`+@&zw6@ zi~j=coyJ#_No}te6c*XRVFRdIC9-+Ng-TN7Lk{|Ep!i$Zt%MegI(nL?hjDDopwD||&FR--aZ9gWq!%`L;r?(`4lOZgqNqD=~8zqFf4 zlI}C`GU94;+ai-IonJlexlw;QJYY9m7U#F|S>3tN@Wuf+Ka8m64ipZf0kh;O-s=*P zjx5_x2qU;2XiG4oU+%KLvk%Gj7MZ_!D4qYKsa#Rbggw+&{18S>Ki(y%Ev9H>@Nc_H z=U_NX?^U_{W&9~R29!0O3-UYo^Y%s)`*s#ryAH-BX7kb@k;Z> zhX`SQQV)%5Ria3l&bO`9li!}RXSrQ?*m*k8p$GDGpxo74A^mm2R7eVA(+=>^<`^W- z_s^iyLDH`hR! z{?>!v=EN>c+s#mn!(??BDO4{2E_>$?TRxfJ)nuBt#<;o2CTsU}wwv+3$<2Ukrlkk~ zYO$MLET-#@lCGqQyOAD>_*Oz?$vAqg+FH*ntYft*IV2Xl)m?bRupbC~39EF7&YNNt z(WOBTA0y0CfGZEjp>M^=pRUa>Ab$#umc?--X8%jTk>{d3&k_r56G^reV!QL^gXwdZ)BX$Y1; z20q%0dv@j61V|JkYoni<+rRwiV~e>Ohrme|5kZF#Dd)KwU<%Q)AiES0CdG3Z30QF^ zcQ?*>Xc_2EcA!rCw`U2KO1R`^fyR87{pmM(7Dz@ zR0*>%sh7#^DL0{U;|O01f#MBXyfMpCBa?_BJ8}%}&t2RZ-GYPcmjnp(IftaBTLD;> z8iRK4(|+gmQ3UJwjS)%IV(rJ7Uok960dkVbV9ny-ML}!tnfh|x<`5Yzf9SSaSLZMd zyhc1%b*Dn~vUqse@`qMcId`rqukkg@lExLCp7@*>Pu_9okVw09#@(@EgosD= zr*=%7_uB=vGvLQ@!=4Owx#`4FHF1%(hx18vwF8MovF{1HKyox%tOxNie8J#ea#uy@ z8@g}5Idh#m=!o3>Va8)W+6?rq(PHCd$d+k$80lle7PT$;I$G=0P5TKQG@{yB+l}$? zPT~jn0JmrVYZ)j2&aiUz2!~I~Y70r*oGp=&E7MXSt-|`tJd5E!MO7aWs$iZG2=A zi-crlXRwsuYGePYvP-OYZ+|sD@()mZ`T&eb%P=|p?pwzTn&cj?;pPb6&QV?ToenrA zz~~~to8co<%)YTLx(Ct#c%m@ua+mDX`#e)K+J;0# zq{CWgK6}kfd}LDTVbE9T0F;r?2TDmRB#BknHRof}&(!8bvw{&&qft++Qp-@;p@R+p zKJ`Xz?5a{O$r`|%FD7hbDPZJ%ws}h?gZ;vfUNbfXE&~zF3I^&9Pw{(pMbB(-b{Adv zwwYWZo_fNVG9=_i9+8giJAcD+`44oDsiYu z{G(eJSL)qAr9xa4YzmaPu9K2Q9w+~7U|!wvU66;!m&|0%h@!CY-6gA%RXPxtQk_+s ziC4MbR`jsl^R28_a>9@GF$J&1Or*5|Gbm!|ZWLaF)-i3n*%kil6J9Kz z*2>ao5sXi!FLL&zCPWmROtATBmG8zTd@Oj6%3pE31}y}fyv6D=O2tR}U0vlhuyo#f zkv-`Y^AXhB3~wq$(*jvfw?k>xyB(!1K?<`` z-Oa<$)OWve_uI|)%Zf-3Izdv;%cjK&S4m~Y3Mm8PYkazN1Eei$!W>n}V(Xo)mKE!r zXl!iIR0Ic8PAIm2h53+z4aF9@k~W+QY&%c?(4Ky1M@~vD3$nT4!3D=x7>|N~Z?1na@9DodIGQl!3nQAs@a`MW5+cuaJi;C0aFuQ&29+lZ&ul zV}2753lZT4$p|^;x-(hjm^2VBs2aZUvp3{5E80fad$2;jfXrJq&6)6J{NQ?SYC3&h zVYysA7;$tiB~$m_up2*$dFPimzfPk6Op_g`{w3#~<1@^AkLvTXe|85cI7+D zhE~OEmkmGb4U(*!{hP4tCKZ`YbBqjo=3y1&S)(}YRm6rsNLx!79P}{FAAHNa z8=ZxU#6Re(ajnk!Gdl8I#iK+hMK#8XF~K6pZN8UR$7!6rkopoAVt|nrOSkR_@2e-4 z_trkXCcv&{y|+E}c#G&zz=Ma*`xF{rdxVE8R!;fQb0d$c$`-ryNnIBFTbt~zQGyi( zZ(<(Z6uG-n{%4Gh4EeWE++O%UV88{MJ?<%+bOhh-81Fb629_yKtxSD0Az9PN$!2-; z?}16kmFodHfns8dypdXN3T`k^RfBiE2S1g$TXW5h^xae97r7&*lg>ZH-gH9xNb`*KI-#s1cSqFGHYx zpqK0KQ%lP!csLV!jENmRp40e?0Qm30P+ca}6YR6CeW#b#| zeIGKYlD~I!mxa^TuWl_(9>nG`qYgrJz+I#<7wK--f(l`vhTl(0K_UEx7bW9>NNvNa z7ycd}Jyv%Lt7ubCn?yGWRZpxlK3MF9^2kbI0cH2tSkv{tDu^uP<<5cTuk?7Y$8~N) zZlkSH;e5H{h6o?aGx{B9!S}ymfAD7$6S2Simr7;<2f)sL_j*ntKe;^#xU9H9OQR{# zoQ}4OYgxZJz|zfSL^_iD`li=WK@1Aq&P_$c;%@zwBadf=djMib&Vc&6LUhd-r?OJ( z$=_f=ReP_OMuAid&4Za7$5jnBXp<|Sguaipxzx097b8H>$o(RJJi7l z=&+0Sb*q%UxdVaY@KCyzr{~Nt%FHM!6N%`8(R@S0+2;n^9H$;0YOq>7`bh3`-q&|j zID|aq!x|+nOX?w~?z#80J>hX6x_cxmvi&WaYD?8D>=rLk+TBFtNq6N*?rvl>CJb7g z;snvFvEu$UHbO>AI#%&|_H=p&o7;x3xvGCQ;CjKv{_b~wqeIu{FFRyYAPKYTsZAHA z6kspbfsjMgN6NjZ7mE;cPkl-17}&8qp_dGbtF~*d0|*;XjU#Qz_g%+@{>par!ZNIB zI4PW-=#e&PcRn|OsDmj3)q@#wS)d@mkreo2>l<*6*oU|)WYe+k0B2_4RhQsZWNz` z;CR|w2_9qf`A0``#YS^ab7c5diO^s{@E>VOgYDg7HjWwqut+X?u1tk z2TI=EvF=RVJOZ}M_w36I2-bEjhOex#=}xqR^(Hm>`eCi|?|Nl&||HakDO#KM&EsW%RQ9lc=$!PM4YE_$2q#wUb14aau!c9TX3q$VuehjDNX77ju z**6u0^-&QL^|NsRkIDEBfXmkOs26d45Zw5|laLNUi}zZ4)UPmRS4RMlSN`R}AeBlT zdBeaDDuHoPxYD%!8mvZ3wN3TXV^^CLBMCAWyJ0bWrWw#eEPyq%3g7LR?K5tSq9#z; zH(HE{NM{sqWd%j%TH?Jq4OeUSl$q~)sr}b0<4F^eC_r`di4%yxzX`TP7K$t;zz;xKPCq z?1F<`ME9Y|PZ7zC>Vz!D6$q+XU2$pEdLB+EO?yj4S9IV~4??`a;Zl3r3i^6N>5}h; zFOi_0Tf8NXIuhGQ>-W;_9MH(ryzg#hAk2vIL5svIIeXuzJZ1>DmO@FE6D_5)ZQdJO zPejS%S?at^^o6Cs;IZ~NQuE|H#}U2ub3hGkc`tq&g7VgvF?5?@ZUJ3}(64_bM=orE zO~@V@C4y;X53iw?m+I(LkdPV8mTaPqetiT_+Deg&Zm88OTbl2gf0FQ{f#}+YNju;t zyfA|_I#S43r}mufs|6()ED+BNi{FGAS$+4WDfI5Rd-@4Z@_e6C|1)P5s}Ka5gSuU3 z+fXIX@RhppSEIzN0Mk35}FlT5^s`dK&i(V4N(mQ8%p1DT`g z)w!H{V#4SZ(p-P#6MgitQEA{t&OMBeydZoXlwji12!|d#%_o}PV zYd0YO2JV)A_=Q;6)tK)ggW+P-4lm&8=epTu`l!kg4dN7^@lG&;U$T2=FgSnRWhUM! z@-=P2AtZEo4C$2)K;-G1aWUE3#zdz%Qp6|WBOxuAicycZ3qY`h-nA#Dt%v!s$MvUs z2Br}^=-g1@96pHd6-{XwLO(i|*l&Io71|}dZec%`iQ~*B(U(<4q6R2GI>zz!R#POp z_%5pMiy%w&k?Y)6a1=HYI%k`7i8Y$L)K0b|?}-g)T@WTyDn^XcEMm+xaFAfKu9vM@ z8g25Kx7-!bB!i)~lO?6~X%#mcT*CVH$p#46dM=rmf;HvKRf+hLL>1aM@ms{PYtaB( z;#hHnVT};-q0jS47+{zAw!sd!E9pME+p-pthC>KA^4mcF*`xzo6EEL6^4K$@Za!A> zXVJeRtvKZ*Xjw(u*zNg2lBEz{%keT_}o)ZI^Y zxpm{D^j~PpvSR^y57dw;`K@L4r82Xx*?g$kd2YC&wv9c`U@?q4IolcK@C;ouB|^A0+~Br-Qa*wQS}<&Cb=KYa-uRD zwX}47wHjjvvD^Q5r}3qTcgFKsF>6Q&nhn1Wx2?=`n?C7L3-$ot^yaSG-C4Xv#r7ZY zx@c44ncuykdv}$Ospo!efSHH(I+BvpW}Xw;OZ$~0lwK?MZ@;>!9&8oNU+Il`Ce40V z#>V`{wV2F|H9T4u3HxQY;^ibX&ZyG0fE~dv3}d+o7M1&VewVxPS)TGKTcYz<+?A|Q zhW(EE|3dJFV`($T4W#55inTmxn0*M0u_dBBz-iLgL%ffMSyUaknR~(r<`3qS zcqf>`d-B2iC&??tWABP_iN0<5m$}PR`A)?waG7m(u@81fp;3+!tlEZ)T z*`|2D6vZ|-Y%r#Lsy5ett=n88gDA1VH^o1B&A^!ojmNpyZ*~N7zRE3;MEX1^SQ8!~ zBehKZ@Ml5UHIR*8bYHxE4qrSpDj~RuJB=4lU+~e}$Mn=h>RWe(4pObuwT6X&`Gj{v zH;tzFO%7LI(x>8iSEu5h^gC6miWD|5=i_e;$Z2s$h@!(n@y|XH2ccg&%jwH5GAO+_ z(dA{VJg+W&sV|~8Aia3HXydy;Dz5j;fpOws1nF&$wDsD(_L_7T^ttp{9EKDKHk=mn zKk&N+#L;pB2$}niuLcVVYaazZLePt-Gbwc?Dmz#*o5pMG&0MYc-GqmlV-Z6h*0RxR zz-V;*4&Na`=~OvlQGPTq%_E37nPVC_N{uGZQi74@g#R6h2ywjiU8@X3;6eZt&KoF= zv_(pnVghtHWOnJX(OW;*rlM4_xQ_zfnT)S0&kj?FwGzN3IxldBrY#Q5fmtBxiNtx( zy>t(3&(nES-FSbdU{eO9X&W($QD06wz#=M{p=Lgq>z#F<#{LyPDDuJ zMu*M%UR4Z?q*79PFn^h_2E_)lw0V7K1%KKu-E*W77(Lb)e6+7GdNsR9{B6L>N{$Uq zSb0Y2P1s+!E`5Y1l@?ipXpLdY7$_iJkOHmg_t+9-WgZN<&Y+TF1l$nKf8(fVh1I8Z zbPTAF(}qZO)En7rg`*Hpoc1Zh5-gMjJj=t-c5@R(U%GE#%xQFJj( zR!#K0rXL^KD~hJ-d3W$7LRebnVF%>PGrE>|mKoM(Gd2^@Owfja#Hq`3Mp*6KP;Vg_ zL?mxg>3|$pP5fEL@ zWJWA4gs@L>M6U^)uXMaePW2BXG1_dIi}{*6{O;fWPOgWalZckb1ou>MS96%ccb`=> z85?M!1mJ85MqQQ4>g&3s<&5j$`XTCu)WGkvkk#^tL#BIjR}Myf+wOlB4$G4S8YL;IE2 zm9M!JR34Zgc5wV0CYm-_SNC7J20F40FR}Yw7|BsflU^}rmr@Xk-YY?EMnjs8eH3## z8_9-Yk$F$(z2@q@SL=%?bCw+zO2(;xiZ1boGBdo;ouPk!@3n@$ z0wBoHm#WEPG&EshlIpy$n2~Np%tH`3Q8k^y_e0sL1vq@&^*n4+Ya@dP zgw|SA#3IkS0JBuLq+&EJN|oECg9vBI4(mOWD93V_>~;i;lW4)BN4EN*S4SRL>tb9@h~!n@ zm3VRLI16oSrutq}jaz8zUJ-Z-mE04%t6ANL8DQKTHLeC6bXQt03=0j3Lr2BKp~SyC#(H8E+qFyg>RNb zyf4D1kLIp~=8Hx+(Mp)bx%KH;g!Xwu9R%+5s8UK3~7%X`&t323UO$i?YY&Z(B5 zl_<39u>`wjA<$r)}>>1kaflLSvh8e~jj{GKT*PhcNS zhm3Fb47^N}qnY|h|#o7aNZP^;qDLpGWlXVQ>)W%#pBUz(gBY0B`eh(;As{H zrLF!W2uP!YR1WKEf6y+DWEg8_3URNl@|So0C0CR%j#e{!+jcNWr+faz4&~Zb7Ec*8 zB{A)q)0h>xW1h?>;q!|e4Tr1M8}E{<#9BLWg*)-UkCyh599xX>MwhwLq@V8@Vjk=3 zEDQ91b6xZU-{?v)eOdvAOeJ#vcehe4i%o$=F6^Rb1uk;>Ge?BP`r2WhioNhCu|P#P zu!j?#clDGQU0|z-3K8%N;+@l9h!@eFjDES_ORm;rfv}dY!2nqp&OXUb+zO#zT2f5_ zJIg@8ms3w@gL^F+TS8dU9I@CcF^24Zq-`J_$+avKy^d%(^ciO{Axb$CAd)S=Z4v#8 zDXzxLwRnde=!glmQ1`p2tv3>rDQeplb8es+&l0zWomd2Rp4q9kF_SXcH4bC?_`%&d z5@usdSI;KHyOhLEL{R=yaP~;XK}-U*9^C%L9bGaM8=1wfh3RR3lcb(nl?9--=jam> zpnlf|cAVo;>k#%!IkwhZb-|LrZomwPb$y z_HNyS}ZOLypP{)pw$F%xwH_-7Exrcwq6|8FRHJfe>$+GUnV^cp40+CQ-bFB9w?ak4bvcx3_j>}Yf> zedjhGy0#RU0^B&?q*}H%^0*{tKN>hy*b=xswq9@Zp9$`@_a298J>A-ZnzW}PB|QPs z&7bTjaGs?@q^N&BTf7wrnRBrPrg4p^Y7WWw z%;MX1;leTjRpoCLI4!<*8KSrcjJXG8>w#BE!GC&CW#SLfFynp&mE4+Q2<7qW)DbTr z4n9-4uX-uKDK4@D%}ue(B3sy@J1AVo2skDI=5vjqDhj!Ra1PC=Hn_;wa9WOCgcynR0IOBqSg+HJv#j54!1AGQj>s z(C6q~8a~**HslP2aj9DD$E9=O7WQxJv~{GCtto87)!`OZyh~~Sf~)+t%YDZD#l9ah zJ*6-aV|q4Z+BTMx3v{DvF6WPik+0ULUytJYyFd8h0!*9#bqjy8U&&S$x;XK z28J#2fF;{}1(+j@NR(7!5{{fszUA`lgip(QUWI~N!5YtgIayLpCZ2~F1OEZKx_Udy`W>@Q{2)Ij4x(EWkd+E z)jyBy;~E`9+xsJdwe1>y&VX_gP7OcJbtIuy*0w6f8=WVo?B)dG0GH!z(x((e!`1%#SQHVL zb<)ez=Jy7VF}EA~SDsPruV2H|k&ov3hY_001ufP6xBSc(wq4HyBz?~y4kZq8bw8p7 zCc^!()+>K|w${4zRDnW>576o?sb?e?_|GiKk<>j!4m!D#i|0qc+x_2l;>s*eI>(;n z5jAkCF*oi44>)I9OnRQVWtSSK$z;R(EM&juwq9}{OEnGkmCjEt=)j6Q+wQYVY#)|k zR{8HZHh5alIseSQnG)#-O7g9k!-ihET0f((jN$!Z7_&Jl@ zQBQNgo)9u2t0H_t&$PA{yOq3;fj@DSB}MOX7-Im$haI%7KuY;)gZ@TvjYdc+uwFZ* zYQUEMCXw8lg@N4HVztU#t~x%_g}d=T?dni%Jb#q08MuSogKsFV(Bs2=FIT`wje^*`a znUuZ?h2eXG(x6;Qlg6IcAKV-TkVVX32PD13M^0TwC_)&E_DCCqoHb#*%%H8n%`jAU z^8&}!$aJvty^|~_vb|=?1e97)lwHlH0ci!%%L&?{^TI@^(l_T45H+6S(OG>_h5$8Q zSc00)M=k2vwxfX><$;g~pBybCVUP-L#N*Hc(4(~5$Cw*towzRpD6D&p18>zQSuEatz$vh6jzw-ofx9YYZm z6IsShtRxn)XB5s~t7+F{EW4gQlfiN_-pS5AXZ+A$L}l<+pc`a>7=h*gT(SIY8{oqy z3x&D-M2h6x3&tCFI6{BueaKX&b;2$lG8bgnhnCEbUndkXr=CGBoR(rd3%^WdSjB03 zu<@}3rNQRC_Op+z!n5GCeeFXey3Jn~;>~9Zk$~l)6ac*4nhr;9G(=B(k1Im_eyDed~qZV^id6b2ek(eI} z;5&-1w+*DCfW)0_Bt8w5oeCXRVWHz%e#Uqk6*&+O|A{Pos6in2Qj0oT-%^a|^*0K$ z4pgN5ar7(}JOT#@kS&^?Rb3*|Xahv>w5sl-IV$%YpF-8*prMt(lOE_@&Ja)_NKoAJV)+a|e8NI(Xr5NscFwJ{I*Dc`T1#*bm1Cmei`iGL0Kn}`B5I83?>OmKuKXB zCU8CcrW$H41?K$f&>IW2=05ls1a!XnWOy&1>8F@Vjma{Fsrt+68flJhz1w9Tt-C^K zJ9BE>rHKu~>%_yY`d<<(g_AP)_dIn_xT}T4Z?S`nn-?W-CkZL01s>#?= z0NL`er#pRust%C@Fx`- z215N46NW1b3JvyC78xD!J+0Q$QAiu;NIZ~}t56%=W&U(MnjDU-->5gGYbvJuMt<5b zA7@B@lW(s(Az;9XC(4^m2@H9j}%^%;Th2vl8@3m+W`oh*`8)DP*^lj^^- n`+EcM><}*1uu`>uivT2j&}l~++3fmw=Lc9~A)>zv*Z=?kY;-=> diff --git a/courses/scr401/en.md b/courses/scr401/en.md deleted file mode 100644 index dc45d6a5e98..00000000000 --- a/courses/scr401/en.md +++ /dev/null @@ -1,753 +0,0 @@ ---- -name: Delving Into Simplicity -goal: Understand Simplicity's design philosophy, type system, and combinator-based approach to blockchain computation. -objectives: - - Understand why blockchain computation requires a fundamentally different language design - - Master the three composition methods; sequential, parallel, and conditional - - Learn Simplicity's type system including unit, sum, product, and boolean types - - Understand the nine core combinators and the completeness theorem - - Build practical data structures and computations from Simplicity primitives ---- - -A deep dive into Simplicity, the next-generation Bitcoin scripting language activated on the Liquid Network. This course explores its type system, its nine core combinators, and how complex computations — from boolean logic to SHA-256 — are built from minimal primitives. Based on the ["Delving Simplicity"](https://delvingbitcoin.org/t/delving-simplicity-part-three-fundamental-ways-of-combining-computations/1902) article series by [Dr. Russell O'Connor](https://r6.ca/) (Blockstream Research). - -+++ - -# Introduction - -c362889b-c630-435f-911b-724c4eca505b - -## Course overview - -cdcc40b6-c985-45b4-9bee-6f931e984476 - -Welcome to SCR401 — Delving Into Simplicity! - -This course is based on the **"Delving Simplicity"** article series written by [Dr. Russell O'Connor](https://r6.ca/), an Infrastructure Tech Developer at [Blockstream](https://blockstream.com/) and the creator of Simplicity. The original articles were published on the [Delving Bitcoin](https://delvingbitcoin.org/u/roconnor-blockstream/summary) forum and form the primary source material for this course. We are grateful for his pioneering work, which made this educational content possible. - -### What you will learn - -This course explores the design philosophy and mathematical foundations behind Simplicity, the next-generation scripting language activated on the [Liquid Network](https://blockstream.com/press-releases/2025-07-31-blockstream-launches-simplicity/) in July 2025. It is structured in four main parts: - -1. **A Blockchain Perspective on Computation** — Why blockchain computation demands a fundamentally different language, and the three ways to combine operations -2. **Core Simplicity and Its Type System** — The minimal type system, the nine core combinators, and the completeness theorem -3. **Building Data Types and Computations** — From boolean logic to SHA-256, constructing real programs from first principles -4. **The Road Ahead** — Future developments, side effects, and the broader vision - -### Prerequisites - -This is an **expert-level** course (approximately 8 hours). You should be comfortable with: -- Basic Bitcoin scripting concepts (what transaction validation does) -- Fundamental programming concepts (types, functions, composition) -- Some familiarity with mathematical notation is helpful but not required — we introduce everything as we go - -### Key resources - -- **Original articles**: ["Delving Simplicity"](https://delvingbitcoin.org/u/roconnor-blockstream/summary) by Dr. Russell O'Connor on Delving Bitcoin -- **Simplicity repository**: [BlockstreamResearch/simplicity](https://github.com/BlockstreamResearch/simplicity) — source code and Rocq formal proofs -- **Official website**: [simplicity-lang.org](https://simplicity-lang.org/) — documentation and SimplicityHL reference -- **Blockstream blog**: [Simplicity on GitHub](https://blog.blockstream.com/en-simplicity-github/) — technical overview - -Ready to dive into one of the most elegant pieces of Bitcoin engineering? Let's go! - -## What is Simplicity? - -d04f3960-d7fb-44e1-b5a3-25b33d03fd38 - -If you're coming to this course without a background in Simplicity, this chapter will orient you before we dive into the deep end. - -### Simplicity in a nutshell - -Simplicity is a **smart contract language for Bitcoin** (and the Liquid sidechain). It was designed from scratch by Dr. Russell O'Connor starting in 2017 and activated on the Liquid Network in July 2025, after years of formal verification and development. - -Unlike Ethereum's Solidity — which is a general-purpose, high-level language — Simplicity is intentionally minimal. It has: -- **Three type formers** (unit, sum, product) -- **Nine combinators** (basic operations and composition rules) -- **No loops, no recursion, no dynamic memory** - -From just these primitives, you can build any computation you need for transaction validation — from boolean logic to full SHA-256 hashing. - -### What can you do with Simplicity today? - -Simplicity is already powering real applications on the Liquid Network. The most notable example is the [Simplicity DEX](https://docs.simplicity-lang.org/use-cases/simplicity-dex/) — a structured options marketplace where users can create and trade call and put options on L-BTC using USDt as collateral, with no price oracle required. The open-source [Deadcat](https://github.com/Resolvr-io/deadcat) protocol implements this, and the [Swaption](https://swaption.io/) app provides a user-facing interface. You can watch a [demo of the DEX in action](https://www.youtube.com/watch?v=4c8bvD6oomw). Beyond DeFi, Simplicity enables any advanced spending condition — vaults, covenants, complex multisig schemes — that would be impossible or unsafe in Bitcoin Script. - -### What this course is — and isn't - -This is **not** a hands-on coding tutorial. You won't write Simplicity programs here. If you're looking for that, check out: -- [simplicity-lang.org](https://simplicity-lang.org/) — official documentation and the SimplicityHL high-level language -- The [Simplicity GitHub repository](https://github.com/BlockstreamResearch/simplicity) — reference implementation, examples, and Rocq proofs -- The [Blockstream blog post](https://blog.blockstream.com/en-simplicity-github/) on getting started - -What this course **is** about: the **philosophical and technical choices** behind Simplicity's design. Why was this language created this way? Why only nine combinators? Why no recursion? Why does it matter that the type system connects to Gentzen's sequent calculus? - -Think of it as understanding **why the engine was built this way** rather than learning to drive the car. - -### Who is this for? - -This course is ideal for: -- **Protocol developers** who want to understand Simplicity's foundations before writing code -- **Bitcoin researchers** interested in the formal verification and type-theoretic approach -- **Computer scientists** curious about the connection between sequent calculus and blockchain computation -- **Advanced bitcoiners** who want to go beyond surface-level understanding of Liquid's scripting capabilities - -If terms like "sum types", "combinators", or "sequent calculus" are entirely new to you, don't worry — we explain everything from scratch. But be prepared for a dense, mathematical journey. - -### From articles to course - -The original "Delving Simplicity" series by Dr. O'Connor is structured as technical blog posts. This course reorganizes and annotates that material into a progressive learning path with quizzes to test your understanding along the way. The ideas, definitions, and proofs are his — we've adapted the format for structured education. - -# A Blockchain Perspective on Computation - -7a7690a5-ea70-4d3d-a9c5-299115661db5 - -## Why Simplicity Exists - -ab030a7a-053d-407f-932b-d71f699f2d0d - -Bitcoin's transaction validation is a significantly different application from regular programming language design. It operates under a unique set of constraints that no general-purpose language was built to handle. Understanding these constraints is essential to understanding why Simplicity was created. - -### The Unique Constraints of Blockchain Computation - -When a Bitcoin transaction is validated, the computation happens under strict resource limitations. Block space is expensive, execution must be deterministic, and every node on the network must arrive at exactly the same result. This creates several design principles that shape everything about how Simplicity works: - -**Pruning unexecuted branches.** In a blockchain context, you don't want to store code that never runs. If a transaction script has multiple execution paths, only the taken path should consume block space. Simplicity's design ensures that unexecuted branches can be pruned from the blockchain entirely. - -**Quasi-linear preprocessing.** Before a Simplicity program executes, the network needs to validate it. This preprocessing step — which includes type checking and resource estimation — must run in quasi-linear time. There's no room for exponential blowups during validation. - -**Static analysis over dynamic metering.** Unlike Ethereum's gas model, which meters execution dynamically, Simplicity allows static analysis to determine resource bounds before execution begins. You know ahead of time exactly how much computation a program requires. - -**No dynamic memory allocation.** During execution, Simplicity programs don't allocate memory dynamically. Everything is determined by the types at compile time. This eliminates entire classes of bugs and attack vectors. - -### What Simplicity Is Not - -Simplicity is not a general-purpose programming language. You wouldn't write a web server or a game in it. It's designed for one purpose: expressing the conditions under which Bitcoin (or Liquid) transactions are valid. This narrow focus allows for a radically minimal design. - -The fundamental question that Simplicity answers is this: given a set of basic blockchain operations — checking signatures, hashing data, inspecting transaction fields — what are the methods for combining these operations into more complex ones? - -The answer, as we'll see in this course, is that there are exactly three fundamental ways to combine computations. - -## Sequential Composition - -c45df1f0-9cef-4d66-bdc3-f75eb158f7a3 - -The most fundamental way to combine two operations is to link them sequentially: the output of one operation becomes the input of the next. - -### The Pipeline Model - -Imagine you have two operations: -- Operation **f** takes an input of type A and produces an output of type B -- Operation **g** takes an input of type B and produces an output of type C - -Sequential composition chains them together: the output of **f** flows directly into **g**, creating a new composite operation that takes an A and produces a C. - -``` - [f] → B → [g] → C -``` - -This is the most intuitive form of composition. It's what happens when you pipe commands in a Unix shell, or when you chain function calls in any programming language. - -### Key Properties - -Sequential composition has several important properties: - -1. **Associativity**: Chaining (f then g) then h is the same as chaining f then (g then h) -2. **Recursiveness**: The composite operation (f then g) is itself an operation, so it can be composed further -3. **Type safety**: The output type of the first operation must match the input type of the second - -### In Bitcoin Script - -In Bitcoin Script, sequential composition is achieved simply by concatenating scripts. When you write `OP_DUP OP_HASH160`, the DUP operation produces a value that HASH160 immediately consumes. The stack serves as the implicit connector between operations. - -### In Simplicity - -In Simplicity, sequential composition is made explicit through the `comp` combinator (also written as `⨾` or `>>>`). If `f : A ⊢ B` and `g : B ⊢ C`, then: - -``` -comp f g : A ⊢ C -``` - -The semantics are straightforward: `⟦comp f g⟧(a) = ⟦g⟧(⟦f⟧(a))` — apply f first, then apply g to the result. - -## Parallel Composition - -8ede59a8-10b0-43ad-a3c0-87695e5e5ef4 - -The second fundamental way to combine operations is to run them in parallel on the same input. - -### Running Operations Side by Side - -Given two operations that both accept the same input type: -- Operation **f** takes input A and produces output B -- Operation **g** takes input A and produces output C - -Parallel composition gives both operations the same input and collects both results into a pair: - -``` - [f] → B ─┐ - (B, C) - [g] → C ─┘ -``` - -The result is a **product type** — a pair containing both outputs. Whether the two operations physically execute simultaneously or one after the other doesn't matter; what matters is that they both receive the same unmodified input. - -### Product Types - -The product type `B × C` contains pairs of values `⟨b, c⟩`. These are like tuples or structs in other languages. In Simplicity, product types are the fundamental way to bundle multiple pieces of data together. - -### In Bitcoin Script - -Bitcoin Script achieves parallel composition through stack manipulation. You can duplicate the top of the stack with `OP_DUP`, then apply different operations to the copies. It's less elegant but functionally equivalent. - -### In Simplicity - -Parallel composition uses the `pair` combinator (also written as `▵` or `&&&`): - -``` -pair f g : A ⊢ B × C -``` - -Semantics: `⟦pair f g⟧(a) = ⟨⟦f⟧(a), ⟦g⟧(a)⟩` — apply both f and g to the same input, pair the results. - -## Conditional Composition - -7f38ccc5-bd5b-4404-aef0-1928ecb97c90 - -The third and final fundamental composition method introduces choice: given two alternative operations, which one executes depends on the input. - -### Sum Types and Tagged Unions - -Before we can define conditional composition, we need the concept of a **sum type**. A sum type `A + B` is a tagged union — a value that is either a left-tagged value of type A, or a right-tagged value of type B. The tag (a single bit) tells you which alternative the value represents. - -We write left-tagged values as `σᴸ(a)` and right-tagged values as `σᴿ(b)`. - -### Branching on the Tag - -Given two operations: -- Operation **f** handles the "left" case (input of type A) -- Operation **g** handles the "right" case (input of type B) - -Conditional composition inspects the tag and routes execution accordingly: - -``` - [f] → D - [g] → D -``` - -Both branches must produce the same output type. This ensures that no matter which path is taken, the rest of the program can proceed without knowing which branch executed. - -### In Bitcoin Script - -Bitcoin Script uses `OP_IF ... OP_ELSE ... OP_ENDIF` for conditional execution. A value on the stack determines which branch runs. This is Bitcoin's original mechanism for expressing choice. - -### In Simplicity - -Simplicity uses the `case` combinator, which provides conditional composition along with a shared environment: - -``` -case f g : (A + B) × C ⊢ D -``` - -The extra type C acts as a shared environment that both branches can access. This is more powerful than a simple `if-then-else` because both branches receive context alongside their specific data. - -### Why Only Three Methods? - -These three composition methods — sequential, parallel, and conditional — are not arbitrary choices. They arise from fundamental mathematical structures. Sequential composition corresponds to function composition. Parallel composition corresponds to the product construction. Conditional composition corresponds to the coproduct (sum) construction. Together, they form a complete basis for expressing any computation over finite types, as we'll prove in Part 2 of this course. - -### No Recursion - -Notably absent from this list is recursion. Simplicity deliberately excludes unbounded recursion. In a blockchain context, you need guaranteed termination and predictable resource usage. Recursive covenants that compute across multiple transactions better serve iterative needs without blowing up block space within a single transaction. - -# Core Simplicity and Its Type System - -dabbd97b-4fad-4c16-a189-6d768c97c82d - -## Simplicity Types - -4067acaa-8b28-4741-9a0a-66013897e28b - -Simplicity's type system is remarkably minimal. There are exactly three ways to form types, and from these three, all the data structures you need can be built. - -### The Unit Type (𝟙) - -The unit type, written `𝟙` or `ONE`, contains exactly one value: the empty tuple `⟨⟩`. Think of it as a zero-bit data type — it carries no information. While this seems useless, it plays a crucial role as a building block. It's the starting point from which all other types are constructed. - -### Sum Types (A + B) - -A sum type `A + B` represents a tagged union of two types. A value of type `A + B` is either: -- `σᴸ(a)` — a left-tagged value where `a` has type A, or -- `σᴿ(b)` — a right-tagged value where `b` has type B - -The tag is a single bit that distinguishes which variant you have. Even when A and B are the same type, left-tagged and right-tagged values are distinct: `σᴸ(a)` ≠ `σᴿ(a)`. - -### The Boolean Type (𝟚) - -The simplest useful sum type is `𝟙 + 𝟙`, written `𝟚` or `TWO`. This is a one-bit data type with exactly two values: -- `σᴸ⟨⟩` — conventionally represents **false** or **0** -- `σᴿ⟨⟩` — conventionally represents **true** or **1** - -This is how Simplicity represents single bits. Everything from cryptographic hashes to transaction signatures is ultimately built from this type. - -### Product Types (A × B) - -A product type `A × B` contains pairs of values `⟨a, b⟩`. This is how you bundle two pieces of data together — like a struct with exactly two fields. - -### Counting Values - -You can think of types arithmetically: -- `𝟙` has 1 value -- `𝟚` = `𝟙 + 𝟙` has 1 + 1 = 2 values -- `𝟚 × 𝟚` has 2 × 2 = 4 values -- `𝟚 + 𝟚` has 2 + 2 = 4 values (but structured differently!) - -This arithmetic interpretation is not just a mnemonic — it precisely captures the number of distinct values each type can hold. - -### No Function Types - -Critically, Simplicity's types do not include function types. Simplicity is a **first-order** language. Functions exist as combinators that transform data, but data itself never contains functions. This restriction is essential for the static analysis properties that blockchains require. - -## Basic Operations and Composition Combinators - -dc247e58-a753-4a46-9e4b-62fbb7e8f1b7 - -Simplicity expressions denote operations with typed inputs and outputs. We write `f : A ⊢ B` to mean "f is an operation that takes input of type A and produces output of type B." - -### The Two Basic Operations - -Simplicity starts with just two primitive operations: - -**Identity (`iden`).** The identity operation passes its input through unchanged: -``` -iden : A ⊢ A -⟦iden⟧(a) = a -``` - -**Unit (`unit`).** The unit operation discards its input and returns the empty tuple: -``` -unit : A ⊢ 𝟙 -⟦unit⟧(a) = ⟨⟩ -``` - -Both are families of operations — there's one `iden` and one `unit` for every Simplicity type. - -### The Three Composition Combinators - -We already met these in Part 1, but now we can state them precisely with types: - -**Sequential Composition (`comp`):** -``` -If f : A ⊢ B and g : B ⊢ C, then -comp f g : A ⊢ C -⟦comp f g⟧(a) = ⟦g⟧(⟦f⟧(a)) -``` - -**Parallel Composition (`pair`):** -``` -If f : A ⊢ B and g : A ⊢ C, then -pair f g : A ⊢ B × C -⟦pair f g⟧(a) = ⟨⟦f⟧(a), ⟦g⟧(a)⟩ -``` - -**Conditional Composition (`case`):** -``` -If f : A × C ⊢ D and g : B × C ⊢ D, then -case f g : (A + B) × C ⊢ D -⟦case f g⟧⟨σᴸ(a), c⟩ = ⟦f⟧⟨a, c⟩ -⟦case f g⟧⟨σᴿ(b), c⟩ = ⟦g⟧⟨b, c⟩ -``` - -The `case` combinator is slightly more powerful than a simple conditional because it distributes a shared environment (type C) to both branches. - -### Values vs. Expressions - -An important distinction: Simplicity expressions are operations (functions), not values. The notation `scribe b : A ⊢ B` represents the unique expression that always returns the value `b`, regardless of input. For example: - -``` -scribe ⟨σᴸ⟨⟩, σᴿ⟨⟩⟩ = pair (injl unit) (injr unit) : A ⊢ 𝟚 × 𝟚 -``` - -This is analogous to Bitcoin Script's `OP_1`, which is not the value 1 — it's the operation that pushes 1 onto the stack. - -## Extractors, Injectors, and the Sequent Calculus - -19e0aa6a-f1e1-4307-8646-2c676d3ea937 - -Beyond the two basic operations and three composition combinators, Simplicity has four more combinators that complete its core. These handle the mechanics of accessing data within product and sum types. - -### Extractors: take and drop - -These combinators reach into product types to access their components: - -**take** extracts the left element: -``` -If f : A ⊢ C, then -take f : A × B ⊢ C -⟦take f⟧⟨a, b⟩ = ⟦f⟧(a) -``` - -**drop** extracts the right element: -``` -If f : B ⊢ C, then -drop f : A × B ⊢ C -⟦drop f⟧⟨a, b⟩ = ⟦f⟧(b) -``` - -Think of `take` and `drop` as projection operators. `take iden` gives you the left element of a pair. `drop iden` gives you the right element. - -### Injectors: injl and injr - -These combinators wrap values with tags to create sum type values: - -**injl** wraps with a left tag: -``` -If f : A ⊢ B, then -injl f : A ⊢ B + C -⟦injl f⟧(a) = σᴸ(⟦f⟧(a)) -``` - -**injr** wraps with a right tag: -``` -If f : A ⊢ C, then -injr f : A ⊢ B + C -⟦injr f⟧(a) = σᴿ(⟦f⟧(a)) -``` - -### The Nine Core Rules - -In total, Simplicity has exactly nine core combinators: - -| Combinator | Purpose | -|---|---| -| `iden` | Pass input through | -| `unit` | Discard input | -| `comp` | Sequential composition | -| `pair` | Parallel composition | -| `case` | Conditional composition | -| `take` | Extract left from product | -| `drop` | Extract right from product | -| `injl` | Inject into left of sum | -| `injr` | Inject into right of sum | - -### Connection to the Sequent Calculus - -These nine rules closely resemble the conjunctive-disjunctive fragment of Gentzen's sequent calculus — a foundational system in mathematical logic. Just as the Curry-Howard correspondence links lambda calculus to natural deduction, Simplicity represents a tweaked variant of the functional interpretation of Gentzen's sequent calculus. - -This connection isn't just theoretical elegance. The sequent calculus formulation ensures that types in the premises are always smaller than in the conclusions. The **Bit Machine** — Simplicity's abstract stack machine interpreter — exploits this property to minimize data copying during execution. - -## Completeness of Simplicity - -7770b8e6-4a4f-40d0-87cc-11d378a6f5ad - -The most remarkable property of Simplicity is its completeness theorem: **for any function between two Simplicity types, there exists some Simplicity expression that denotes it.** - -### What Completeness Means - -Despite having only nine combinators, Simplicity can express every possible function from any type A to any type B. If you can describe the function's behavior on all possible inputs, you can build a Simplicity expression that implements it. - -### How the Proof Works - -The proof is constructive — it actually shows you how to build the expression. The method is conceptually simple: - -1. **Decompose the input**: Using nested `case` expressions, fully decompose any input of any type into its constituent bits -2. **Build a lookup table**: For each possible input, use `scribe` to produce the corresponding output -3. **Assemble**: The nested cases and scribes together form a giant lookup table that implements the function - -For example, to implement a function on `𝟚 × 𝟚` (which has 4 possible inputs), you'd build a tree of case expressions that tests each bit and maps to the correct output. - -### Practical Implications - -The completeness theorem guarantees that Simplicity's nine combinators are a sufficient foundation for any blockchain computation. You never need to add new primitives to express a function — the language is already capable of expressing it. - -However, the lookup-table construction produces expressions of astronomical size for large types. A function on 256-bit inputs would require a lookup table with 2²⁵⁶ entries — clearly impractical. This is why Part 3 of this course focuses on building efficient expressions that exploit the structure of computations, rather than brute-forcing everything through lookup tables. - -### Formal Verification - -The completeness theorem has been formally verified in the Rocq proof assistant (formerly Coq). The proof is part of the official Simplicity repository and has been machine-checked for correctness. - -# Building Data Types and Computations - -7cbc15b8-739e-4452-99de-3fa9b3feb119 - -## Boolean Logic in Simplicity - -e6a198ac-1ac7-4ce7-9292-9d56b49613b7 - -With only three type formers and nine combinators, Simplicity may seem too minimal for practical use. This part demonstrates how abstractions are built up from these basics — the same way computers are built from logic gates. - -### The Boolean Type Revisited - -Recall that the boolean type `𝟚 = 𝟙 + 𝟙` has two values: -- `σᴸ⟨⟩` = false (0) -- `σᴿ⟨⟩` = true (1) - -Boolean operations take one or two bits as input and produce a bit as output. Let's build them from scratch. - -### Logical AND - -The AND function is defined as: - -``` -and ≔ case (injl unit) (drop iden) : 𝟚 × 𝟚 ⊢ 𝟚 -``` - -How does this work? The input is `⟨bit₁, bit₂⟩`. The `case` combinator branches on the first bit: - `injl unit` produces `σᴸ⟨⟩` - `drop iden` extracts bit₂ - -This matches the truth table for AND: false AND anything = false; true AND x = x. - -### Logical OR - -``` -or ≔ case (drop iden) (injr unit) : 𝟚 × 𝟚 ⊢ 𝟚 -``` - - `drop iden` - `injr unit` - -### Logical NOT - -``` -not ≔ copair (injr unit) (injl unit) : 𝟚 ⊢ 𝟚 -``` - -This uses a helper combinator `copair`, defined as: -``` -copair f g ≔ iden ▵ unit ⨾ case (take f) (take g) : A + B ⊢ C -``` - -The `copair` adds a trivial environment to enable the case combinator to work on pure sum types. - -For NOT: if input is false, return true; if true, return false. - -### Logical XOR - -``` -xor ≔ case (drop iden) (drop not) : 𝟚 × 𝟚 ⊢ 𝟚 -``` - -- If bit₁ is false: return bit₂ unchanged -- If bit₁ is true: return NOT bit₂ - -These four operations form a complete basis for boolean logic. Every other boolean function can be built from them. - -## Bit Adders and Arithmetic - -f5bd93d1-3e64-49ce-8876-41a8bfcc22eb - -With boolean logic in hand, we can build arithmetic circuits. The approach mirrors how hardware engineers construct adders from logic gates. - -### The Half-Adder - -A half-adder takes two single bits and produces: -- A **carry** bit (the AND of the inputs) -- A **sum** bit (the XOR of the inputs) - -``` -half-adder ≔ and ▵ xor : 𝟚 × 𝟚 ⊢ 𝟚 × 𝟚 -``` - -This uses parallel composition to compute both outputs simultaneously. For inputs `⟨a, b⟩`, the output is `⟨a AND b, a XOR b⟩`. - -### Access Notation - -To manage deeply nested pairs, Simplicity uses a shorthand notation: -- `O f` abbreviates `take f` (take the left/first element) -- `I f` abbreviates `drop f` (take the right/second element) -- `H` abbreviates `iden` (the whole thing) - -With this notation, navigating nested tuples becomes like navigating a binary tree: -- `O H` = first element of a pair -- `I H` = second element -- `O O H` = first element of the first element -- `I O H` = first element of the second element - -This resembles De Bruijn indices, with O and I acting as binary digits representing positions in a tree structure. - -### The Full-Adder - -A full-adder takes three inputs — two bits and a carry-in — and produces a carry-out and a sum. The input type is `(𝟚 × 𝟚) × 𝟚`: - -``` -full-adder ≔ take half-adder ▵ I H ⨾ - O O H ▵ (O I H ▵ I H ⨾ half-adder) ⨾ - (O H ▵ I O H ⨾ or) ▵ I I H - : (𝟚 × 𝟚) × 𝟚 ⊢ 𝟚 × 𝟚 -``` - -The logic works in three stages: -1. Apply half-adder to the first two bits, preserving the carry-in -2. Apply half-adder to the first sum and the carry-in -3. OR the two carry outputs together, return the final sum - -### Multi-bit Words - -Bit vectors represent integers. Simplicity uses nested product types for power-of-two lengths: -- `𝟚²` = `𝟚 × 𝟚` (2-bit) -- `𝟚⁴` = `𝟚² × 𝟚²` (4-bit) -- `𝟚³²` (32-bit words) -- `𝟚²⁵⁶` (256-bit — used for hashes and keys) - -A ripple carry adder chains full-adders across all bits: - -``` -full-adder-n ≔ zip-accum-right-n full-adder : (𝟚ⁿ × 𝟚ⁿ) × 𝟚 ⊢ 𝟚 × 𝟚ⁿ -``` - -From addition, subtraction, multiplication, division, and all bitwise operations follow by recursive composition. - -## Vectors, Buffers, and Data Structures - -8dc8748f-6e52-42a3-9404-77da22d2d2cb - -Simplicity's type system, despite its minimalism, supports surprisingly rich data structures. - -### Fixed-Length Vectors - -Vectors are built from iterated products with power-of-two lengths: -- `A² = A × A` -- `A⁴ = A² × A²` -- `A⁸ = A⁴ × A⁴` - -### Mapping Over Vectors - -For any operation `f : A ⊢ B`, we can map it over a vector using parallel composition: -- `f² ≔ f ▵ f : A² ⊢ B²` (apply f to both elements) -- `f⁴ ≔ f² ▵ f² : A⁴ ⊢ B⁴` -- `f⁸ ≔ f⁴ ▵ f⁴ : A⁸ ⊢ B⁸` - -### Folding Over Vectors - -For a function `f : A × B ⊢ B` that combines an element with an accumulator: - -``` -fold-right-2 f ≔ O O H ▵ (O I H ▵ I H ⨾ f) ⨾ f : A² × B ⊢ B -fold-right-4 f ≔ fold-right-2 (fold-right-2 f) : A⁴ × B ⊢ B -``` - -This recursively folds over vector elements from right to left. - -### Option Types - -The option type wraps a value with a presence/absence tag: - -``` -Option A ≔ 𝟙 + A -``` - -A value of type `Option A` is either `σᴸ⟨⟩` (nothing/none) or `σᴿ(a)` (some value a). - -For mapping: `f? ≔ copair (injl unit) (injr f) : Option A ⊢ Option B` - -For monadic bind: `bind f ≔ copair (injl unit) f : Option A ⊢ Option B` - -### Variable-Length Buffers - -Buffers represent partially filled vectors using option types: -- `Aᑉ² ≔ Option A` (0 or 1 elements) -- `Aᑉ⁴ ≔ Option A² × Aᑉ²` (0 to 3 elements) -- `Aᑉ⁸ ≔ Option A⁴ × Aᑉ⁴` (0 to 7 elements) - -The type `Xᑉ⁸` expands to `(1 + X⁴) × ((1 + X²) × (1 + X))`, which as a polynomial yields `1 + X + X² + ... + X⁷` — representing collections of 0 to 7 elements. - -Stack operations like push and pop are definable: -- `push-e3541a33-f57c-4efb-b59b-c6c887061475 - -The constructions from the previous chapters aren't just theoretical exercises — they lead to real cryptographic implementations. - -### SHA-256 in Simplicity - -The SHA-256 block compression function can be fully expressed in Simplicity: - -``` -sha256-hash-block : 𝟚²⁵⁶ × 𝟚⁵¹² ⊢ 𝟚²⁵⁶ -``` - -This takes a 256-bit hash state and a 512-bit message block, and produces a new 256-bit hash state. The implementation uses all the building blocks we've covered: boolean logic, multi-bit arithmetic, and vector operations. - -The SHA-256 implementation is formally verified in the Rocq proof assistant (formerly Coq), with a machine-checked proof that it correctly implements the standard. - -### The Role of Jets - -Raw Simplicity execution of SHA-256 would be impractically slow — the expression tree is enormous. This is where **jets** come in. - -A jet is a native implementation of a Simplicity expression. The network agrees that when a particular Simplicity expression appears (identified by its Merkle root), it can be replaced with an optimized native implementation. The Simplicity expression serves as a formal specification — it defines exactly what the jet must compute — while the jet provides practical performance. - -Common jets include: -- Arithmetic operations (add, subtract, multiply) -- Cryptographic primitives (SHA-256, SHA-512, secp256k1) -- Signature verification -- Bitwise operations - -### DAG Serialization - -You might worry that Simplicity expressions grow exponentially as they get more complex. In practice, they don't. Simplicity expressions are serialized as **directed acyclic graphs (DAGs)**, not trees. When a sub-expression appears multiple times, it's stored once and referenced multiple times. This keeps expression sizes growing linearly, not exponentially. - -### Higher-Level Languages - -Nobody writes raw Simplicity by hand for production use. The language **SimplicityHL** provides a higher-level syntax that compiles down to Simplicity expressions. SimplicityHL handles: -- Variable naming and scope -- Automatic environment management -- Library imports -- Familiar control flow syntax - -The low-level Simplicity expressions we've studied in this course are the compilation target — the "assembly language" that SimplicityHL generates. - -## The Road Ahead - -c29188f6-dd5b-40b3-afbc-4cbd9a6a30d9 - -This course has covered the pure computational core of Simplicity. But a blockchain scripting language needs more than pure computation — it needs to interact with transactions. - -### Side Effects - -Future installments of the "Delving Simplicity" series will introduce: - -**Assertions (fail).** A mechanism for computations to fail, which is essential for transaction validation. If a condition isn't met (e.g., an invalid signature), the computation must be able to reject the transaction. - -**Witness data.** A way to provide input data (like signatures) that isn't part of the program itself but is provided at spending time. - -**Transaction introspection.** Combinators that read fields from the transaction being validated — amounts, script hashes, lock times, and more. - -### Programs and Addresses - -Part V of the series will cover how Simplicity programs are structured for deployment: -- How programs are committed to the blockchain -- The Merkle tree structure of Simplicity programs -- Address generation and spending conditions - -### The Broader Vision - -Simplicity represents a fundamentally different approach to blockchain scripting. Instead of adding features incrementally (as Bitcoin Script does with new opcodes), Simplicity provides a minimal, mathematically complete foundation. New functionality comes from composition, not from expanding the language. - -With its activation on the Liquid Network, Simplicity has moved from theory to practice. The concepts you've learned in this course — composition, types, combinators, and data construction — are now powering real transactions on a production blockchain. - -### Further Resources - -- **Delving Simplicity series**: The [original article series](https://delvingbitcoin.org/u/roconnor-blockstream/summary) by Dr. Russell O'Connor on the Delving Bitcoin forum — the primary source for this course -- **Simplicity GitHub repository**: [BlockstreamResearch/simplicity](https://github.com/BlockstreamResearch/simplicity) — source code and Rocq formal proofs -- **Simplicity language website**: [simplicity-lang.org](https://simplicity-lang.org/) — official documentation and SimplicityHL reference -- **Blockstream announcement**: [Simplicity activation on Liquid](https://blockstream.com/press-releases/2025-07-31-blockstream-launches-simplicity/) (July 2025) - -# Final Section - -96952535-4aa6-4e78-91e2-d12e9df895d4 - -## Reviews & Ratings - -fb0b0133-39ea-497b-bd36-198be42c4fab -true - -## Final Exam - -2cc5e818-abcb-4a0a-9991-7a492c572e2d -true - -## Conclusion - -8ade24bd-a84f-4d25-8f64-bdfa8b58926c -true diff --git a/courses/scr403/assets/en/001.webp b/courses/scr403/assets/en/001.webp new file mode 100644 index 0000000000000000000000000000000000000000..766bcb283b387161a8683d4f59035ab9c4529020 GIT binary patch literal 6407 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 e*E}TjfO6q$6 literal 0 HcmV?d00001 diff --git a/courses/scr403/assets/thumbnail.webp b/courses/scr403/assets/thumbnail.webp new file mode 100644 index 0000000000000000000000000000000000000000..0b1db3cf1c34d4424fdfae75de4d9e52a9c23ed8 GIT binary patch literal 143264 zcmeEuLz5;<+ictRv^j0t#@)8v)3$Bfwr$(CZQIuOoS$(b-dxqDHdzswS5#(|B0x+m zjUEI@O;ku;Ri1+|>c4ee1#&hpRXy|u1Ro<-xCk+6f`SJ+lmsYPQ>(8h*}HJ{O`su@I&#h zTp6N0@8+*w3Z{bZ>95ke_ru{2ksNH z&YA6x?bdGK@7nLJN6AnAFYK$_5BuQl@$DeN<4?8kTJPoW@9*I4;idJj=Q85t=qvMq z<16Z`>CbF`=x6P3@BI^W@4fHmZ{elUN$;-j%lFu0?xS3v*Q0OOJK3+Agir6@=o5cV z?k#VeZ~cE83fJ`}dxw7Sf0;LM9(^BrAHO``-<@|qy_tIoe;|K-e+>MOf&VWUFft$M&k%fMF|^KG zx5BZ$QKKS|DR)dpxZ2!&D^k3Qc$v5n$dXlXJ_8j=E)P+sBRix!8MMX2q2iR~Jzf&pKa(Suvp z#N$k%W8z=;e>W25gF7!%t#Y3Pi$_y7+}O)8EW`Glcj%VSQN(@FCxe(kS0BZPwGE_+ zK*SS#iK(n(6!rw}`l1Thyh9Y%_8vsKwo3{Erq_}RUuuQy}P!YFnZ!4(mA2M{x2GFpkd8yu;V%TN3NhOx;iG8J;ifOWTr z$#kFTw1AXDl(*Zr1+j!?)UYYOu|?ICF{fn_EF;9&({54<3y!VO;MAnxLrsW!0r6`Y zj{vhf^!i=m@zRtn@HF4L)E9I7LMPyb03JX%jbZ}LqZ zWk*G-OoVGyC;z2c$RC+`qkt8N&2V{IB| z|1G9W@3ZxA_+_8KSrrBD@|3tElV}0LaBDCD$o2>69@XqLB{i{GLj-!GzW?V9(*nwK zl`>18-X@zL-ONejL>=z(E4@64zqj-XLA-lxz!W?Yz5;ga~qQ zP;qcF;mA8NGZSNX(l|VulZ0MKu9N&&qv)+MC9>uhP)FkE^598e548f+deEb=q?3~7 zJ2q-dV-iHTXC-1$+m&zON)nS62ffCkRkL1zU8S2ygmjnF8ndGIzJp{wV060pT&|DB z#pSs#C2BCvE>lVvm>Qk(`yOekNNY(o=x`)SHOay%QY-3VlI#rETxUa4Dxah>+sNkuV$UJooH#Hkkz7gydZWE-nC=`6hW^~ulKq?bHnvzs3=}%nrPfSH_hemcbwZLK; zQb)J5?8m{oyg_McGAWK3|A13xIj;qeIwAaaF~d*iJvsPVQXo%8P{|hkM*b#;))aQx zgpl`I{0Mm>1JC2Y&=Z}54l!aCNw4<%pOOqvPN43|18?XPSG>-D*fxE(0zLcP2rOD zo;&4a#C?U#ddyMIsvs~%7GO)5ER?$!bgGU#VT94?1|T#Md3hya5GfGSnXZ>dhoWx< z#126Q6uNxwZkDDjeP;m>nbB2vY@h`67|tMXY)N~<0CW*sLYO;OX0H&{;uKE)HgI&! z<}hn7xnT7zrw=#o0kpkP^njUaXW4*wgiuP_vEqrtXeZTEtbY---m`Ea&OLGa_0y+P z;{e9o`!BDYp4!2OkN5PG+?v1xRSi??G1nVcB-ttfa9GkYEQ_OpOb>2udIqBWpO$7J zg6({k*m}RiMQa))PhN>0iJqQMeZ>Jo6X=SlK_iw*VVXav*4pdVZQ=zlrr!4nh@^iE zDA{)9YM~R<%JLO<;*+8rD-#N@bRWacU#e_9J&Yvd^`c21QJj0r|3Q(?_bVr>m5|Da zAtS-M`G45L4^IRxX?W7Cc`XjF#fUu`Eu1RB{}!e`C!l=)#TJhJ*BC_&U=n+qCWxzL zJ~jO-Y*w4nBIvs%+nXsEY-Lr&_cjEEt1YK=VI2pCe>g{Cy(`tn9V`t6S+MFv)D@D5 zCor8;%$FT~ZTALxhgxyYiI5e~F zO?hk7b#ZkT#->GX;=@&uURsWBPrYo4yS|hEiuV!)l~oYT@SdJe|`gKWw=k7sv{Uu*$cov<=IFvi#!@q4j^ zU*YWz#MVT$mw7ouG)gq{h1q_w#dI^@qX|lwYn&vWy%VP(CU*3T2&(+0I+|B4+@|Rh zR*+1^C=xw+ZY|m;$e#fM^(jADuwb$6y0zeH7I?9HkV7dTn~#&l>9D!}uCD*BJNm2N zf1()LivB)#y~;=a&+$O4xI9{8miq+qBvoO7oquyjA9eCe`1xo4^Yk;x$1&QaIU}ap z9rfALdb(wzaR82JQ2^B!LFp}JAHxjKGYV^?mw5{>o+*xjDmnjsDwwiT`os{&ED%vg z1M2tw??MiTt>kqjZ8k;&59Etys6L`=BT|^QCclxk{aqDXlAZ7`MgV#LSRfagX(&$P zvJy&t*?Zwf!X0?YQWc3<9rk9lrdSPYQ0Fd;QpI=R+K~?pJQXFD=-WN3k@+9e8E(|R zNvV8mO3nA*!l1Cot$%g;+t}itrGGwt+l+F981#fgZ_`E>?-DF4-EK4D1%=0Po|XE= zwsm7g9w}#5=CVI6yD2_4Uqb*4X>Ej+cFG#WC+p9JaErM6b>zFCD!Lw>dN}l5g)&wp zF9Idovhc7~LSTa%pJ3Hg>`9;peE=>TN+_$2Cv~!m5BCZTfA^BjMvW<0>eu|5grK3f zn!30eufRVKUO5R`PDYKyNn3x){rR5RPGK_2Hl{ut1}tAoj2(1)^Yltz6(HEvnF?z< z*2L1D)82hcy0X^4OAmoal)U7dBq@Zd%Db3;wnV;;vFaBC%#}u=Ck<7SHFz3hhoXnf ziOrZ6^Jw2er(RsR^-i0&h(e|_NGq+7|IYr!lc1)Z2@1~jT=dXRudbn0on_9T$kvq~&NOG2LssK}Xc34enl<32(2p{`T_Q_Cc%UlpT61 z1X}wC^rmM`LkQLbQ>GcaxE+?wb{|X(-O0YpvpT@o2~ixBs9mg6h(!zS_`)oS8-xC` z+yh*u#G!5XpW!&g2Bx_p2i~8r6T4N_EJjCvh}B}VbrIpd-+eSq=LgU&@;c&i_2xki z-c!0gOvk#(NY#_*JHdR<6WX&T$Z+q zh$l&UrRsNh@F^z0Ga>?*0W?n+H@8+B2~CHr5x7X)p^Z{4oO>T&KnSacdYOtr7H_7NQ+ z=^Yvaocty^O?9n;Kxp5y*G*-yOwD#KK0RV;%8y`S&CQKQN2V#Q$g?A|Wgj08Rm2cx z7|PNQRfaR`4!OF!&E(y;8kn`Jhvki(U6oaJywNHHonTs(GdWF-XdFk;0=&N)udHC4 zxsVcF@9w;P-}9kL@DkZ8Cv*)yr}N*T&qsvJHHOGiv52e%+e@i@z+xGMxEPl-e<)Rw zW-0k&mMq3|T)$#D2a3Y-5?@Fy@X?WX>POns%*lptMILvx!U#{JqV|Xd=t#^Z#6O~~ zly3`{A-cQ>j^D%nHf)v3NOPz_+z1$Kk(!Gaa~(1e3!NwMkQw`wzGEu{H(KTCCd0&@ zxNtdO8KZ5W`t6{-vd#4**usGz?U2$fp>N>VUv*OZh~vhbVs;U_QUlFl1n*R2i6T+L z9W;-}^}j8-=N;i&RdkV+DE}2PwKj!NT&%%nJtFV^`hV-rd2sSw%?`+nxno_)oxF7Ou}~d* zH8eNAiK&%dI!79OtkVHwuYjh`=g&iW;z-}L-y~9vaj#frhMYcqUby1feiHRg5~tAQ z5Ap@mH8zmjxb#%@Jm6#>0iMma8AmtKsklW2FWVT5_Cq6s>XXJ3aP*cdRXK(nR%W>y z@zV)bL&;w;@!Ff`R-`2&(|Co6s!9jkU&-mfXH5jZ$WQ&p3?L|2NPc^_PQ4CitlX`C zFVo#+3AyY0;FE*`&k~l|6b4GM(fUx5!xl5oea1$m=Y*Yw*aEN?$!bSTG*#m{H^_{K z)|CS$N}HS~TxWlr8#3`l(LVy)*VdM11(kV&pxTYX_Rb*{W;Tm~!Py(l6??k48FA%H z=DVGqcnJ9azIx5NK#~vWHQG60;e^ZZhI%W^Vj^30S6U!@ZIB|HwG=5iYUL>&xiIVA z%Utb}G^unE@T=%h9!7O=PULzY+m+t<^jxK!E2~NoR)RgR=epRINc2RdX|NWNE$bJ~ zjv2X6yvW&tfv?@d-?1h7ek#ia1gv^#EIjq^EbqWxq2r?abRbO+HE{5#0)`O|IhM+m zkU_I{?l0<03}~KN0Mtg;>!kE0>87=X*X~HG=8D#WI^!CWs9qL+In)RqX3gRV`WM>y z^mZ_gD>Kk6K}C8P7DC95we!sj6%_>>BK*;qBEmiibKZxH*1B3dA)0wq?>emcZS)8d zte5qm^&@o_G4pCYj4L!QkKLt%W7#zQk3TXO+HxW}gq8X8gZG9)nqIamb>P0<|9U%E z^E*l}^)W3GW~+ZC#hK=&%TL_~A%(ywU?jVwxLGh?{v_fYtCKcIp^+q-yepK>rH~uV z8lq_^oio>E>{xBpt9F%>AHh7b@J7cHmRs#dpj6#(kAF?kz0)P&@Jqu1d-xOiidABdoTuxItK zfWX-hN_1Cvcn9S*pLW4n?D9<;8iW1=KTagqi&3}Hru7=5^LQtiuCQKV1~^n7R+vts zUC;B#DRph{61iqBCyvSAvs9r}w)IFS!Yr?)o6=2VT;v&q#PXZf{XJd}42h7QL5QJ0&v-3S z{zq6yWKp?Wfe;;Old>PCQ&l0`h#fl|LzCQ#5HW(dP-#g~*Z$0827*7JsZhM93cSV* zGJNI|eLU*-xrYOTgiQ@FJ&~pf2RSKa1K|h{D4UD%;oTm`R6<&bd&uSn*R+0+HCXac zP-Pbu5tx77@kTc@!4sdH5>bcD0mPsI~PvVOD9x)p~`sPLp z5cBM-@k$HNmSU^PM{tJ7wzKi33Wnh3sd88HmoH+s4(IU3k5IIqpdQrq9|SH}CT0YW zJW>{=GXa-JW6bB)B+l>wcGR(2#zqU^isK;&vPPi%X0cOdNAYpAh4daI3a zT>nGXKTbXT77V1nqzF`z^)5EJj=5n697d|4mnjx8MzQ2ulFCBy?Ma6KE3g)}Idcgi zYFwH>;9)MaJA9V%RO(}MZmjzCIKs0MIV_kaLXso4L6J?dCff_&GJ5X2xGwix-4jNh{20baCl4OZ{Yb zzKdbH<^eF=K~BX`UCCP=npmwT=I=Zs3qa|0ePq;R$Yr8nNm!O9P=m7Ope~rHYb-9T z)v$9EyYZ}JqX~LnN*lIele|;)N^_@8rp)BIt#&f|0tm{Gc&XM zQWh1cmN#f)tY1v#Ts~OHELnwypq!k(Sz?rX=Cue+@_ zPraXgTM<)z2Kd$J^kb<LfUg>JlbVP{d7oL+ zn`@Hfk{)dRVA#~wsV6ZA=HTW;Aze)WF)$T>${c6N5=^Ot1y@p$xu_7=Vo&zowKYb*r|4nw{y=Nt7xV1nbxnEz7 zX1o2&0gv+g>PhR=s3kRes)QJxRr`N&7)>1y4igl4a#0|Hveq%JhSSW4Zz|KpJ z(=%PM8~Vv0+}osh>WE-UY|Rnd7!d4-tmxwZ&E85&?UVZQmBcf`K2+8K#Y;pNn{kM9 z53?Xhqm^RI9LHx4lfD^MHnR@5TKj@WNxMboZwUQD zkA(@C>VeXTVHKrI)p^it=J*Vhb^IV==tdaDu;xNBb+2j!u{R$vrg42(-i2?>^nD8; zNxWqZY~iwEh`(5+evQ0(bIlhP6o7>%OYW71ReTYewo0Va`%JpU+$^_{iiikT4a1KJ zhs!<5OyM(*lk8m?O9Cw-p;5&0nkaG~#|ldCQ6UIZB?$z;CfBJ5Ej~n)`Thha?o!DH zr+URjN@guC5M$O6v@Vm6ocPq#*zZ_3Bm@73(Tb}a=%=7xFCCE}nW~E&E<@p6IN^5@ zA1+ZTljQ$4YbjjaY`m$-bwLq%40K3{k3~|8VcrypJKCBwElRx@`0*;fJUpwWS^h zb2qninSVGZCBxH3p9q(!EFp0hvJw$J z{o#b_(PDMCcvtbE0_EUm-7NCbPq@CE@)?Ju@vCd?T1|Sy<{S<8`iJ-}=$puR24b3j zFu{@mq-=aa$Op7$IjmOBNw1W*0pDbWPwJYTmt ztd#*8xDc~RPich`N&G&&jb;8@+UI|0CQv9AFt*9WtG{a zQIFu8ABs{cFCuwd4Hqj(>BCcX-n_JNCz2B3!z*Hn7FiC~Wdi_PiENR0Uf`?8d-(R* z$hYpR@GlJ7%Ty=G80QN*O7~~ZSwyglHE%GRXK2>u(niA0fBZX2W?B%WK8`nmXScnVNeB<03%O`cm&tp%e^V zXQ|uHj;VTyL4UdX4Z9;7erNAHar7|QU~!F;c=_U!nAVAXCR?J92C4q^0Aw7_(gr*f z31YYc8ek-Owg|a^A9l(ZoNcyFVDO+-4nE;bWSz8pE=}oZ@+s#RzNNA3QJ%4r6E!}! z*3BYu;=}fkol2mjVQ;3xpHQkUOm<*@-P5+KIwpg{|3$7Lxpf0-eDdJ1_&Iyz@pOeu zH5^j5zZgwB%$fk2(DC84`}0vW!PYmDsjb=y^Ec0)?))?qc%!ifan-JZUoxr_y-VX` zI6llS^3^m# zx)CaIsLb#N!2x5Fdn}!cF(w3DOM)a8&-V^#Lh-ro>vStt4=!qrzXup0WTyD8@kR&r z2(x;*Uhk)C1*Mf4GM83hkD6b&=eNiC@6IKnM;gVPO>P+EMKmMsGR5>TUy>_%h{8Eh zSJK$!SqlFB1l<(EzU=ZF+$5B9J7$GNi~-v5{Da~uktxV%>Waw&vkWyZEN$F0UD^m7 zbZO7hyJ55sOf&`Jxp8pYwzQD0p3Og-mnygDHqS=GBQlQ}+M~Z8->z+j6V+FwSyOoX zUCp9Q9^JGfU?)qUkX!G=t5hmFAP~c z;q1-Cp4d2B!d~r(Qu{+tP+xzyIHX-2dUlNDnFqg!Ds6$yd7)sTdJyah=hNk8!)NzT zuzFJja49S_Pi|}?8mfO?-J_+=9G2bYU;9k1JFhVD9$YPUnqdodL_JT7zoU}$ZaXT@ zvC7z*XeWPNO{>Khj#=Mo8KR$Zk?vY%eTQ%KF$C<5*zmjI^`hr@u(lhDPR%wa&d9Sn zX|=T0OS#B~;VP+B^q*uWdq{*o9x%G#zQE?t<=9y(50kGTNl_3`jd|+2z)z-K#rv5P z9=z?u3%2l{B#2VkH)E>F$hTlRCpS&JYoA}wb87G4^f(OuFGAZCUIvQ=)nls zO&?$Z0RiEhC8G}KWh9i;}Bg z4JLKerb~hlarf|dt0g(xB&+!{81Px~s zAy4ENmc8D#m_FHbX&X}#2?Pckh^M=w(M3fYBKJiU0H1No0(c{jMJPGS1myBzVIQXM#iY%SPAr%2DF{2mP%&tFC{V+U2p6PV$bw z=MJgB6Ed_B;xX^}qG#2_}pT{iQWHn)%omQt$ZsOhOEY@PV1g)29Y;J`4y| zqZv@DS0;bkK%FGrM@)Vvbx7Z{DOcpj%V%)h?N1|H)q`OJtLKD_%JQ#PAyIyc55#wZ z4EhWnpzXB3Q)}5fxivJ^%d>8DH`Eh72&Zv4zM^gU2Fol)sM?^V$P8+p)QNd!g}K`qxI0L zyqAuMX(-mgJ$_NhSP8Glw`%BKngW~$UL`b43Jd~!y>ZOFAo3~Yqr|NFNkC+nHl>$_L}lUo zuw%l-XE|G~uK9&)*uK35vDmz=Wf|qg!t=lHUAX$Mk7O)cQh#jA1NXUZ=(YwV@!pfl z{U~wP)HQw{c7r*I%G-E?lnKL@??E}ZGX7xG^PpHao2R~S>y3P-2tP)n4Fc5gW}CJ3 zqe)mtkRTDW6BCIJ#M8tVv=Kg1>OxFxoZsvt#2j+}t2r><#t^H&SIJMG=}5?8v%@GG zOTT?ePhYnFy&WC|jIFOCo(!?RY+G(brW}=OdE`3dK?hb^CtF-xaw!k#U=OmZxl$E# zQs_(b~j8W&+1W8}qV|3qO zRL0ly*AFu@eITplqs4j*#6GzUIbEhcO7d5rowZ$PatCSLOyNZy^IrZ3ezWgxy!Z?a zUM&FuBTJ=CtnTM16o=3p%_Wvd@|iCge$@WL!VC#v?*3S%x3pe4{id;+fleWOk#NF+ zat^<)ZBBRW^g?PqheaLyXnR(QHy|wyjrMq2NeqzS+w-Z@ijN^PNB8svJeDOzPQCvW zK6X-z=0gY;)au15q^hS_5J))ro;+%(Qy+KUi0k8qeg01)w3XW4dric+l%=*boTEnm zhwG!VJeSu$S-(7`z~!7}dh_4C&Z1`-UOGgQ1LREBW5ai^m_gvOU+c~Cji5F#G|h16 zRCP~42LEt}jb!23&@82;o&#hCFvBg}v&7!R%a@Hd!<~8o_V=AJPbrn&ShZ7DXtEWM z?d9YRPB(S;Fy677{W@lx?Z<%3WPMb()N2Qld@Yk+o;r)+417X2Ur@fy{T$n=-W@8nk8qG*O)Jj2_^%cg$wwpP%srjhm7aWTvMOYUoTMlHB$#wNF^l1G+20I za{1MA*cU+SEPgcK#&J_EW#*bVSJ;GOvX&VwmZ2-*06#h0PEH^VS#D2zV9~X;2`gFHFs$N~w)= zllsS2jf}2@;bM1RS%{5tF;r1k4&>OhpJu{DxsHvg z3baz_a5VU0-v=&iw-GCteYw;OVbspWY}Dy{=My61Cgq#_w;32Hd%tc9|ImM}hO@g= zgHe$K$m;^*wG)cG1~O4RQq{V*P!bAQo*BowtV}$wt9~OFc!&di#=ER?z7Blv=uPnp zxs$%G!Pin8Ykk_s`J5TF1$%p|8lwF2%(*~Lzk;=F#&rT4!*A{j*!ce|=W&q> zOd6=xiZ>4BQQLM*$FRrI{!82+K~L$=;(#+*^ACPe4T2=KRD+pkn`8zmk6by`0>*T8 zb*{Zu?{V$uhqiC4j>z0PUBk+O@r84e?f0p=cO-NzN$gY+mW{zgJlrCf@s94LII8Ra zo6q+6Wb`R$R}$R(bVbcwHo{1oAR0(|--{3^(%*V#EuEgQBMR!~GaDfWrog|jcn_A- z1Iy#AP?L8;0*43Y;D*j5!*i5LhjEm_PU1T(r@@R=Mion~~c zyC~tweV?Vks~3TojWRCgEBhD!_-@_1y3l{--|g-O`X3}4id{J&xfOV!r}s>b#{Dma zQhO!g$Y7H~USO-Nev+5%qQ)A7jCwk`UiVfEO&~D8E;P4JJg=XPtoF>uK0%=auSPKP z5*d$6&0A38e>*fXk{bYC(vEvSSk6h%=duYbDBvT!I-H6(F0LQe_SWrUw)%)?oSnnX z2%jxX@x)z-pgCBr5n>eh>))-!T42Nb)8nlyV|PQZsjR85W3H0F0?-+(U1U(Y(N+k0 zpt>zPm0N}GjNerMbXp@j*;L05+X7K_(Se;S=8?!LZqB;66kTc&N^42MWy5JOyqq% zfD-5Iv1np!5`eTp1Egj=l5);mmUUTuGoBD%y}n8_oY?pe>jO?;#^|F5a$~tIbzHz8y6XAX}y#+)IYN< zmL1q`Zm#7^Z25$J%oHWb)|*YJ>e-ctF^V7HQbbN@NY8R(u54Rik|XG^IkjxOVi8BJ zaAM<~0OiwHO0vp()U!@Dr2gw58!c?qg^93tq87nsfF04T-eWCL&b#3SIE$SEW?KF% zpI-Eut$T>I#a7@-%L#TiwFm^I+creD%=z)yz4uSXoF@-tOUa;%G=;=!HJ@2Df046= z`-9>jaeJ04g!Whn({@??#Hbz6aw?=+1zBX+C+4d?`Sq@GcN}-ITpe5gI3U-m?jrfH z#DQbQTysNBm;-2rm(pfs6EU$lUQaX=zu0@jp3mWhkN|f3h)&Kw{%ih);E!qppZ&Z8 zQ+cealXm@2=SDOwrCWbP21az>x(p_fcD`k^@|kiKS)>^%Q~atNitC%*AlkmesgUlOdVm`Ytk)Wc-;pC zx;f}Up5N`tvFEF=Twy=*R7#OB#fB_SA1(HBDIP*0Jlk5_yA`S~oWwd~Shq{IS%r8J z#2vKAXoUH)J>IR$P_WzU;c$EGWN!BJ*QF;WmkNP_oQfAPpGX z-WRQBQ9f@=3Z8h=hj0T|t$3G7?oH2AzR9-FmpVYk`LPQy$UniaSZ*stdv@~cgjHs{ zRYvtW1m1>^2;^y_LNp_X<%Df(71ZU#HQEM``MbT7?Cc7fGntr_y>NK^*nj_Rf0wmm zb_`RHL-IbC)mqdI zS252=l@D(YXR`5K+C2T|Sh@mKB+IGc*(t2o$Q>qDUV%PjL56L@Zqvb>6E#mAuy&#g z!@x(Ll?dUEzYKSZn@H<&`mlj#7C-k;e)H3gAQl1gbRFlIyo7wB$8NCfpO6dZhM|X# zLD%U!Mo>DO#JYViG5;9bNAeKj+;fvQe)Rho3%YK4EqT3%o*O$O{wm;`6x)yV;g~`x zVKn8-bSE09-gj~?9BA}o)A`+ouxT{XjW!z4I+SH-6G*ovKD2%(qz^lSG0W*o_$sp2 zTJ-%@cxCs9=gWv#8D&GiI6{FAB?rzP8(dcBpCXbmmQ<{qD8Iq#yaS;lZ}bcBtxI^J z@*6*?iOm5;hL&YKlutCRaHj`t3yPylSnunRQ)A?5tBGarJlcUYV;eg z3%4)YF*g`j2G3z@ndX-=II}c6g8bD+mq%w%aSSY3lUw#@tsG|eJyvX9!650L=lBoY zO9&TB7gT}{B#%3iS4*#^SJyh)ye>wUf|^9fp**vR^_F$Q?idhz`dmCv06jrzzI;{V z!_(WIQ!b)RXn>Oaxhx)xbk>pSq){BzrWEyj9zG%dGVaUt&XaMLS(ye3$9V1Vmb?sc6@!SfVasg8@m{~L@>6b)x>ZutEw2Q6cA%#wiBXO6&*_glt!gy9@-1~ zpMxdK;*4xQzbZXVpWyC>+h9h+{JVM#m;olK2j36#&fME;Mu4R`!k}gF_1y6o%XwKu zxauN79fJ2ccy}WTS)Jn2k*kM0NFj}Au1jtjOSa*lQeFEonLJl%Zh|xlZxg=tCc?wu z*%m4e<8D<~3)~D$i96vj{{Y!b&Y#z)vwC7X&m$HgFTXbQ+JwzhdAh6iKmc1A*3q*i zy$qeE60j1-#q~Mp*?~kisjuFL)NcH-uoP54;K&;-T%SA~1_%v&DohMuHd zcNnUYb?XkMK1&r5yojzrmQ*3FnaaN zV@Q30Ge9N|H*+mW1pxy9+7V&i?i7fOjU1uuVf0`LcV~p|DV206nsOz`o^K#ozFdlS z%aD(W zXvzz#qDBRR$PxWp7{HHMdtVgSg?6d$(x?9*9Ei5)D(^msG%=4+qSTPf$XIkWy-cz9 zkEMlC8OZfPFUvXyc$=icfEABTOX#hKj&S&Rjl%52?&t^Ka@q83IG-;d5)-HWr*-IT z{G39OM?6(F%aje4N$STfH%d)Ui0U+!oA(Qn<0O8Z`u(zx5{Vv? zwA}P7cbYzPj+^(n^R@46=i4&LsvUUHW2d7BS;-`5S7zzwjp#KB@h>vm6P#{YQFqV> zWZl|OC?A;PG|)1S50S8i5(eT}gAlgVV`H=>C>!8>!P#JTD>LaqUEHD9 zyZp(b*)XAe*q2tzuMFQtriQHA?;*U0q-SUzV*#JqFRA?TU+}k)kI$jPD19;uH{Xcy zAdr`V`e1x*L#}(ri^}Ywofp|l69+fUBgJJZXRjy=h7h-5L)-4|9Bb4U^Orkq*fk`N z^eeH1s`d}f)1-HydVBLSveGD94-E>|BBUy{Cmk&PqC!^xiOLKnYorf?OC^ZBz!ll< zZRKV$HY*JRwARx(u0I1t`rO{ynczaL*RD680%2wL?zVRu`f2B^4TJokAP8&GZ+13w z%cMFMv^~wITC3{0^R`;9rS02V=zHZf{|@XIZ+6+L`dk--U{r)`*f{;V zWm&AnT`m(;Jrh&)i-V zI9oV51cp4K2qXJ>+99m;S($QPoPaVyv582wetToF{Flmgc0sj|3OR;!SBx8>1HAai zA1>6GfyS%sUE}V-5Jz%Fhj&4oldkIA7@8PhBY<{`7$%97hMVg+``Nkpm)6ZIc*?Lg zt*r9iPb!FYMvDX5rtIABCL{QLYOuO6GUpZ4Md@#H>3W*zKSPaOEL+`66NPS$q~-pN z6fyqX?VCcQUN1_nlSyhhoMjAg{uKmlxoSYw)vf_gWF{OwCyTt@*)gXaLTEGbNaiSp z;ZvwgS?Q{BP4U>F@^&?bvrCq> zKxL9k>~@f6pNIGjdqCpO!_HLR)&OTbkMLRvY_4)QebH(Da@C|UR3+IDqXU>ou(KU}Z&m|(`q%+;Q|2yIg z88Nn5m|bllnVhd+<^cLUJzLEe=QI-(gKTcD)PiI1q(yFha4YGk^AeqZ=REz6{RZtw z0JFI)rSUm@&T8T&0c*NPl+$YxmN7E~*`rWCmU{0_6~YT9;T3rM-bKNB<;oLl?_9~^obIKQ>b_+Xz%LYrbdFHETitapv31ioyQf!J1>sg*|_PNj2n4iy;Ot?t`VfeLLR* zAc=%76(QEgv_?bEkWW!EXe&B7N^`ll8$a>gzGNwJNglF3m_(wV00=(=kiP z1*F(WlEZx0bk?1%J`{0kEVyE$*T@R#l7Y1|y27&covI6-g)q?EdLu|{x9BclFM2Wt z>_w=$3QB`(oK|j^{R*^71Il{Qg0lCR5N#iM4`?uUWj+YVw6>`b$}L#MFOurbJ|kXN zY;9#1cD6t>|Gq!-2Z2`?|NC^IoAyALCPyH#%TQncOCT{}bjOnh4oG|cPPSeVJOAyc z7N~e`hiF;Hkdq5wEswn6@v#f5{Rh6U!puO>EW_c?p4t4`j4-3{1AjhrOnXs9;1zEfGd zI>}Q6z#-;7t4E2)%WrFspUtB1YX$%uw+aZkr>E!C{}J$7gP&%Kp@K<<%Qs;>l5P;| z!P;z&Sl9VhCZJy-hqKa5Dcel&*vn%4V zs;UvPbkZlYWJg{#Vi|Vu=gFC+s^UDeuGHh&{(&I${NU<^B3~zdJR#SzD*@;^eGC7w zd4nSni9?5BiXe(Zhs<(#3%E?r>S3>k2P`^=#joTm?9wfqw9TLIH}W!!z4ln<~A$~><$ zW+ALL>PQnV%((mIHaapwb~;Ikb&zH&2LlV2-lJLmSu6v|T~)$oM2W@cAa9gD>!3h% zUXz~$#5BqC88Dg(qaj2PemP~!znrr(gulwAMRHY=R-2x55skb8#fscyYGTdBfzy_#*6xkJz#!*>v z(2#s-2-&BxEgBYKzmdEzk*1y5DxlrVTGJ0OrsT-I2J2lxoxk%KjEF3 zT5k^{34HCaCuD)-r^x=cdhS^c5m!xeQ%f#`3*6X?{=2+SQE(Uf1Oq{9S>;$ z=Fn?}A-_Z&CjCm}YY~dvwdT~M-tM3Mj15f&@Rg?^l#p)J_#tJY8b5A5VA!5(xzM0O z{}3c#R=86F>GA&Afu`@I!PW4}_Vxlc0`>~3yHh!M{kNn7s$7^YC6QZkRIj=yXAg!Iak_FH8MCCWVPv=WHMvYsV=4U;R&_6okcI3C} z_;UZp&O0`T)-_>+v2EM7ZQHhO+qRt(+fGhwJ14enzPYDrW`4ueJpEzU{@kl;t?s@+ z93=a@SaYv6#)l1OV~3PaAB~c`k~501{00U(M~bL3oq!&HVk6~FIih)x<#2;_#zMi} zs9BOYShLTE03{V`Jk1i3${_ENOtuP6g}B*k0Q35%w-r4x!yV@CQmO*HB|-vA0Qf+i zDS6dpgMpM3QzAcHhA?gW(-GXG=EANU(c z>&(^uapo!W!zX^4hJtDTFLu7Hnb-^8tK@Eh1nD__z)5)u0QRJL)B#tpO`R~!d>sik zODCGQc$E7ml&g!8{e#rgf$w@KI8A3~q*-j}zvYDA zezm{QaDq~TK`U9su$k?Svjrh7LSB#)J2e2PTcj8DT<%MMc&UAGN16F^!+CV@MJk_a4=61!>j3dyDrz4<2|fM+>ZAYPlG4q`0prD^>E z`D3>#k#~uMF+D6Rrw0lAM^(n|$`f{sCwhnwa<9l2A!YiZ_tT}(@DAOo6mN_7U# z$XQe%6!Z`D*>oMQb^pKtb5VJ8B8}dtKoO$Ta%C-#FRVxmqw^dyc!C(^5$PU4r{%Rz z;^kzyU{`1>Fe{C~$XzekG4b|Z6fU8K12B1Kt|%B@qSEOy0_61b+z0e>49ArG`I=lk zW)S%JGn0phkLt$-Ub3^iSDf<|GpiH>6jyc@wzD zS-sIJ0l1&RcCIp*U_#-^MXyjO-n}aU&J4357pp=#S!dt` znkn<3SdK%wK8QSksjZP|D^^oAi3I03lzQ8WRzS+O^<+5jkzJO9PbjdiEX&3nwIniB zA7}8D`2*&_e>?d7zLRqZxkN69D{-DFp$6CBS#z_B+Qh58#x)*!Oyx1HZ8uDqifUjo zSlQH^0xK>lX*LY{9M_CpMfa;109eE(HOuttjnZ$7hx)gi1y2=}%V7QJDf-*s?XaI; zjn0}cHzyiVNAM|C7n|lfDDe6~K3SG|cDZOkIllAE{F80Iyrsv)g^3FLSqtD<$HVEt zqK^ly)K>Ib@(-r<4!5zY%FGdyzNuE95MGvj+=3u8c|?CYjn^_ci}rd7gnt%WJ`W=A zkaYeeIeTa*7k?Wwn*WP zpRv5c35(PS1f^uivsw%;e^PsZ!odlB&mCv+7zA%qqtuDhoB|(snBpY+suNY~e7#WA z`mJj8StFWDD0>1fkS?gHQ=z#w`pKH_b?9OryJZ{2PR1k39VhSq^QmyMKX`SfQwIFV zT8d)oT6n0v9j%?Rcv|%fT4`Y;_`v?NJr4CcH8s`EQU0&Y%*>;Es)Ityu!%y|5w^I$ zaO_h-f2k9-fJSv2Qa8q*)Lnsv2@FtMh)$&z%{NS1~ z{0f0GYJ>Pq+V}oboz95K(x*yDi7YFCP$j#t27I>Bk5M5(3Gu9_{wTmq{`j1o^SpH_-NRhrFm5#>qYXA+#iitxO?+KA6+snFd4Eda=CV+9HGF5qq z>oN&WQ0|i+J#m%hQNfziGi^nv9s8>UYeHsz=S#>B>Du02sBS2Z8gwB%V4m(NAU$jH zK^eT_T)OAs?3|-B9Z*nEiBaMH;sKcbpkwM{a^0%kf$&E%`G zL(XaFmF!FMA|fIpJnGR%3XND4(2=|@TF}EK>j)~%b-Rb6txR^g2*D$I%o#-#_O(UC zvg{3?V2BQqmr)utmm&C;@;H?9^uZj(aGU~l_PA1$Th2$RQ}7xMf6|Z>kre0wUblL; zf3zR6fT+PdDH5LPIqkE6*)BUzx?H3R`aG@{Gd$vCG@JM@E+$%ow|L4>)AkP-bF%Ua zmm>g{C`KfO*B`}P(U3#K8%j%*VSvl6`uM#<4HhhilXBVE zc#2jkvU&?Q<1B-yneL|&O^e_M(wwL7k_Zqc@H*43SLG2I$;sY90sj~|rS4ni*0p59 z0U;Z4O>x+bd2=5UKBvZ{Xvi(*SQ@x15)G0lc&vGK7Or%J4Czz^>w8Q%v|SBcnU<~d zt94kq_;H9klUCx6%-DHlk)MDbWgI<4WMXCt;P-{C>b%ORfwcZ`X;7f)dMpysZ!^nUcOrCX=2}P4n{-l%bpgTvLcRR*y6a#k$%z(tk)vAr3Z8RMB zmVN7Fp7l$2$=Xt1B#JqY-jELdux15%T*H4D4OeiIkyTZJW3YRhe@clb+sKzWG#$3q zKrZKozwoE>MP%;Y>E7Jm{WUD05`D3U@sz3Qr)xMb^4hl4Xhw8rZdFEr?ziUD(+wo4do?m>M+Dfwq2Yo zGIod~bmzH%bQ7QR*2z8XI?02~8tybYGsxtQ18hejn$XoPlApIz>t@`}0D)vV;UGVd z>-CFzB*BH@8E+1+#dlPq;#CIyw9l+%Wc5FgCsmn=8Y{>{3&+l1mkG&~Of3RE1fKSe zbW=(Cz{+%-4oZhN*Z^V*6Gzj52!0LPXRqhDY;F<=KDNDd0dst4rXTz|*CE<}L#?U# z_wR`pr(m-s)_kn)a@_g`fSt80#)r_DVN=IND~d7GrPCq#kQ{3DE*Z#Tng}@9MP~-O zWF$>lVzB?j%vTkigJ|KXn-8+;V~9z(9YC)J%`7DALt^|M{NIG;Z~&VB(jPhkkMsA@ zG+<9^ni=Z`{`H#jsY}-uAHTxm;WLC$T8Pd4WE2Y7$umCAr8 zuCft9vafU#F4*F%%*RmYf4_3eU0Z&EXVKwwf-7IDsMXRA`=w?n8H*Pyr4#Q{Cr;kM z)c=`d?Z`dyhS`dz6kRGa0_>Nx7`Wn_wxiT0S;()q%Ptb~9qJeY`=<#mZE9LgaQIa> zpl(kE{0Ba#Qfhi6c$9H` zPRHbL6Y1t#+d6$|8u8CHY9z6MpP{Ix|7r#mc=r4u+`o)M~cjw2yN5WCs2R+c^%CV?55AdL1K9E}S;<*A9P`*pEr%*LL%aR< zokV>>W8^Em`#@fsBVrdChr-R)X zZE$WMxASh-oyE~acH-2p0GCgAmlQGN7{DlpTBA%=L~j;E*$(T)?;G&iYmt z9g2{AmKE|)gKzkA9UX>@~Jt9leX%2R!F&x#na>CL9a6^pMxHZ_mh7tj) zvZcCTZD<-1;d%GU;S>Zd@o#_i%_-vps85K3zsujYPD)X#E705oKaf^fHV8!c5;3=X za+p!hdNH(39_pBWMo-oP?UHYqY|E`A9EawU<`J_Lfvz7YctTqW>*P08RaJRJ)z@NC z3c15<${2&c0rYf94baHSrU?@HiadI-q)LfBhm4*?6O(5YQ2c)!OM|Sv&@)040kW7G zBRyQTrY)=}&EU|@?pXJwm%`P%!NGQ@GbnN-Xwd*!??oWJGHNB!=TNG*z$8euoeqIi zaP5=ZEOcksfcXZO;Li=2H8%)pVjDonrOo@tmCsxnP`ZeNg62jfY$wB}Ju0e+Xca+l zF(OCD=S=EF4s+HYUYQ!QTQESr7PoCKN;^v+dC99y;u;G&r9;x{NPLwlWio-1#TJ>( zM_lHvyZje6FWpuODAqz3b+@yD?CV+(kBfu5CZc>Ch4-4hz7WUpNcdtowk#_~vaMpjV;NRj(P<$xGrRVp)x7EVx1Kt_jZ7ql%%M3ff(1 zJ3dsr;ufP3J1c}&if3isra3h}CdCSt?Q&OSjj>tUhH$0Clk zlM{sG7p4mDT2AL9_|-TOco&aaV>rVT$tGWuT1ibzTD6pNS`q|b0<6rZFmC?kVTJ_# z*=>}+#kJRFEw5cv`1_Pi-j{6<%lUx}^^{TbO2S?SG~`sPtzlk&CV56m`SIEY*rsf? z$T%Vk+STycVxQ*^c_I{@uyGGuyA>cXA@C^-gO*m0NX5IKc%ASm_^$7~ji0S8Dj;G) zDkA#}-~Hv<6b?%2V5Wg7Bz~`+a{W~hQh4+%0S75M8Ge-#`=eBk6CM&5f#(g-@mTTL zR-pR(26 zdI;Ky%l0Tw2)7T-V=iH7rXoIa3CHe_O%p%bGNc-F8|AHGXrrm^r^%DQcsDz57=;bE zIq1Rh9NQp!Tq4d@_UOB0oZ;p!@=mpI547~U8hvRrQHhr0+etG2g@rz$nC`Uv zOl>8C(5-zlCXE)Q1to%V-vr&MB`yzI7|{jt*aH5TWBfonj%~1Y-jw%uu`NXxweDPqdk?nz?Tl`6R7k)N#xurBFhobADAl$T2@nTy@ z36HV%w401GOzkTSnv7;%cqpAF0Znxo<;wlDj8!2`^MSw_B?4#^CJZ-zjinbG~N$JD>rYu2&GG@dPCBmfvI zcWw_Sr*Y}w$Es_etwCf49Iz|g3Km>kQr)gHj6!|3ynW)#8R9@R3kEFw!&u#o++j&y zxw*!<=u?oq~wUNzS1LECd^Uy2MBxmdPiozdekFD}`DK>t^1G?f|H>F66-h5~GZxc| z?@B;fw?~0gRo651pNc&Htp4gPJ-%b+TwUa|2K5l$#Lgf=(`_3rWGB2x(6Bw#Vy-y8 zGsfGiOx0JCo;5OawyH|UBn>Y`&BP3QAGgEQq{-2ASL)43u^GUeeQ(UCZP`tldLy8aNdAVb>5gGA*>FQpEB_wIIVT|YFOIK?30enkM-Di;WU%kF@vfcaj(jb6z5np z8q^@^l`vydDBC6E1nU&_^n919t;|h0H=#%QSCd~6NLQ*P9qo!yT;M?xEDKyqtABPE zwX&{F^!4)Lg1Xh{xNO0xI=+pSL`NXQzZT-|nPcR*VTpZMBNf0;fAfgmJ7zb$4)8fB zCdDZMtH1K4Sjk+txVvpd(8=N*I37eo%ac8tHmY6+MUjc#_c%x)HQ=&hyzL(I1lJ+p zYx$;p)nE9njB3aYb`7^;tv0&whfT_^te*al+dr8rEg0okL~AIF%y$KFgd5eB@)t$SZ8>TD3IqH2Y)UNVAd294f)}#E-e4WBF}b6^AKz<@P#5lEtfV_qyot$4~%+z{Tnz3?$mZ%GKM#%Ja>l{{t zQzEepuzoesPSVo0n1MD6Z&?5eLPWkCj&hWwY#I~%y$G3jW6tr&Xbzz3hK9@-+EFJe z%ESL+T6(vE|D18cLepb>wIJBEL`5_N_=njs@OR%Mf4yo7ev0rV&YGE8yn7FltgZlC zeYzGDOoqX9F;@)Bm=wJ}q*=@#iin61dty)5yN}|gv3o)qzrL4=S@c~UppA`2d3EEY z)3BlDd>6Vx8b_<(fX;Z5-^tpV0aZbsP@NjGGAoK&`A^bF@VWi$(#l+2?*Nrk?%k&$ zJZ5+N>>JA}IF=mU{{7R6D)2Dx0Q;jUTMT-HlIiMGojGBj9zAV%&eK-X&>d=lFk+o`3Zt!&exHm!w|mq z4!MpW6oj0`qZI{q&>Xb8Ekd}T##%N8sdyfHTwDVBR^RR{{VI;a$aqAm6IeNT02wdl*l_b(#&Lp`WpHyd{JB2 zM6{E#^jAXUtB6XVN2g^(#5+fmf%K2WBmEtaj2rktf|i-Wzj!YR7qARVnj&9~Cleie zP_yc5L7!3MATz_@S0UTbi(cb$*dw}c+v3enYH;7F88}nIZm;E)rf(o)P^A= zi^Iens+;4CE$lhNE&m}BgzX@SghHDXp#Z>A&ph*IEr4WD?ApN_>t)r|crXZ@9YYtm zm)_v(00EF>Y+DZS>eIBsCSHWZ0eE| zXtHX8I%-eBF9fvY{R5N3KQR*0On(b1K?X?dp&a)%_+~*ea_w8TmrbU@_4?1rCy(?8 zk)WNDV<&ljlOL{?t?k)(E|ekri5f3(&QoGZw}}eAgeQ)|zF#LU)YSTDDbJoGdQNj7 zu83&mBNSeQ$}$E#NsNsN3Bo)W(&lU^OrA9a5^}b|K#)LUxdF?*NKMoA!~%s!6*Ry* zTP6?oq(>_PF4vAujL3TBo|^1^0&(0{p5%}vqsIKvN5ex9Y4q;VBtZ230GTHgmD5={ zcyiDfEd#L|A%bZram;;n3LWXKcIi1X{dpKhI6%kk7`e%*T3kLj=HUR!#^7=a+V-A` zY97H2v*oPZqqn?dvDg8iB3KiF%CO-s&|&_AXkzYF~dr*bT= zjz`&sD{ckjik_G|0Y?tA&-Ff0War2Jakm~HtJ9C9e(}oVw5009afJp>O`)@+5lqky zH3ZGzj)Urf1bKr6u;P$Hi}9d>h_CC}t~`}rKVs(}j3vs^iJy+#Vj8Vbto#zMeJ1x( zo9e>l9o*yZOi09Ycypoh#Vi4-Q9m4195~PH^W{tN8%B2k-?#L8P*aZ6x5h8M6JYDd zpBGX3E3k9khUeGd)>`1MtE$*SoJ?^0t7 z8sjN@1cLYPP?hG~TSS*~?Oc+Yx?>nT?&8r~{C-WEJedAO zh^mb7sSXNA;$_%pJpH$Oee#D+^GaaCb~#kV(JD)n0XfCW9sPKx;(I)RHh0B~BbZq5 z)VHpUH;p(p_y}X}&tsFX61fY2+ME)++mv$6L1<3gEu@od47{3sg{U7O1wY!3TwQ?F zHY=6WUqpY#dYX_9T$B~@b2*6J2Hs}5oVMXLL}SvVYU0I|HX2eLEao^vL!skhk`{y` zd;qA&c-8@{Fu#Pt|0*>%Qa*tZfc$Z*WMuqA@XGS-ofoN|P6wUHci-jkI_zTlcRaL+ zyC}U~d=N(YprWzw7HJTCgq%;j`qrLE$NWbzm46U)*jrY&Zdy4gG7R$WlCbU+gGRgM z)eE@axOxb#ROiln!Jn25;p6J!WLs0Knx3$s=utL8`rwv!2dP zVHo5rEBZZA)zpk_vAw0Bs zcUQh^O1Ebc6pV@zG;vJB05^F}&0*B%`KKXlUL5me5egMGY~z$zNw)o~pPWW*W0EJt zYRu>PMn!83kvIR!nf;Q8?WIWnX~j;TB~*j@kKmOR9P&KsNyh%xVykRf#R`>c*>T_4OgKTl2W60)%WgraQ7h;^=b~s=Y$eM@tj%;-{x*zo)9cE=Z=Z3lB6H z9NGyK3V#$!@8vcJyL#u69f6DAd8c%3*Z;9&?0 z3k%#=s72f^5rqu6!$nEEw)t@uzf&5cH#|O%9z1o<#9b2G zRM2{loc|RYVnAXBtKeCX!ku|kXE}4&wM%aDA3)!>T{{MfX>e!)C+-$9yb~^YOKT#$ z7rihyiS;lSDS{Q0X*F1~F_ZFrJP!FnK;9hNVrp~yM zX>V7Lp+w70dmO##7BYYQQiu0RzM^vGkk(iFip z3+Hp1-irJg`^l}Mqi6r))Bv^I0J0X`vGGtg$B(E%VlniBuMomZ6ODQ?syoCI@+G+fZq+ZSHc zJouu&Oro^_rq#n*)VRT~|7XJ*xY49DF+k9t$$?t2hsY+kBjAsoibj%W@`RffupVGu z+^#XNPwHz11RPJ4k{+OpZ4@^*Oe?%o^!=FO9_2IVw#%pD()N&)!`{AUso4D<`!bUo zE%X@ZYZI$4l?mRt;UJXd%cSfhpVUr~ipVFz%%~>-mPDuDVN(Aqx zmq2c4ZZt|4jXB1cN)#d6RC;gXMW%0Ti`vhCRkv}gT!LRTVa-?WL>t4b*gE+VyiWlk?)McQD1gLXw4s~1S;%$h8U~L(uC{+q`Y#Ww@J>N-33?;OGg|Pc_*l{ zJ$9(Nqj3c&dO`CUMjGTwrp$~|r;bdU*IPgU%~@o;U0(74!?nDb+dO5Jgl^U6y$+l$ zM83+iA>~DTYHK=4o(ex9q+$B0fS)3N)svXnSLk~flLhidy7L; z_Crt!#J($173SQpm#md+6+Kmo+RdoYmL*OQa{+X`8x*@nTXj>xc+TH|Mcw9rI}Wbv`NV*s$P07B-D+nOY1;If zkQ*28{`jM)AoT!3Ujt3Z?F}-;9FwUV(&Te@-s8yBP(YzlB~ZG&@#qzNEkBvxZn@-J z>*zsAQ}W$z?JvrFiLYx&=jjWd_^H6F7Y>{8GBb4Rr4k^PA*6F_yWw6Y?K`#b-hN2m z*{U|(UE$kOs!0sH=57zWl+oX^SOeuxSZl44A(w+8)}(TSP<^xtq!OULqG;Znj{ul8- zOrPhr?=;FKi;J(kl?TsApM~~%7#u_vxmbuD0>PI*<5|6`YV&9d97iBI4Xvf7L2Lg= zU9C#M#8Ete4Pe8ZPSUls98pq_L@(z!F13T0CIZB&SM9 zKM=CY9y2Mh##h%f+GkoJIL64Qn%Zdm5Im<$wptp5@NOxwqI8WhBUN)YR$$urvg!-_P!l6VN(356;&h(JMG^jEW5OA@RAcsJ*8~UAGll0`;nY9($WE zxA^|77_GZF3pOwb7{^`n``+9Yj8 zJ#g(RQ@b7JUXM`0lUN*?2K{$zdHLLaMb0)7qj#pUe&AuTO8$R8@)*Ljvq-kv3OBkp zWn86w2OUVA?tVH@Lb{Na>z)cOgbLn7ca3qhALy^c6k^ba zDC3+@86ij_k($HW+d`uF?%9*+6t^1!cl!wS@dNsSksb1{oYpll+%p1@*wJfIEt%*l zNbZ~vORy5_Ie;rc3Z@F>7|&ih4vP}=ZjWucmjgtMjUwOXJ}wVQyWFGVaAsvyN-Tvc zoc*1MMHi%GYTd4D<%rB|+*cN*r?rtUtTOvyy3l`17lpCf_NWLn27O_ap5^6=AkoMR z+49p3dLjfuy*-e}Q+!9Om>!a?m`s1&clN<*NG$bf3R!geP?F-?T%bV6*o|Ldv-`akaev|`l-3CQR@yG?f9G(XqQ zX*m11N0PXY!R8O-&ANfGUL*L#(My4lYu|T!q(oCzmZdjiartZip(qqH9|0bmqRa-_EguX zIdgkEy9EQ>ehnntE}Aa4VQJ zBkaU1AK>Z<=Ui=7t2JJu0kifjkBv}jEkT-8jujH!k;Ulm2ZqM99Uuhjo@MR|PjkJ0 z)VCZ~n=;tdF#wP{0&8zwo#Aj+zj53WacqIEmpSYD%}l&7;dN$lb6#96hy{O=`eqM0 zC3I}U{wS1EMTV$bkrrF1In`&>O`?yEEpSfX*Jt@TG9D$UieQt_5-SL$Md=zRp9>(=r}}<@dyelzpc0O__8YcT9Z#Kt z(p$!*VH}Mhpy_IzvM3`Z<`$rG;={!6vejQ$)!l}vaDF-M8!LFv2In0{_yDVJRUqy) zdj4G79=>GvY-ug+*e)EanbUn8WYG#Un!ecd6Th!L^o-21yoz4Sc{yTV=8tO-8s8%6 z^M4oTiVBB!_jJp9c}OY&NFSk=F^84v>|I?u1({87lE5>^jN8Rgq8gRYy(k#QwLEQQ z6=a{k<~~!z+)q)44aLbS!R8sg<@cF?PF@G!p0Y7uK6>jV_JwLQ2W65{sbXt)-IzEE zqmS^bkm0cc+h~-#8be{GPB;$ z4&`;Y5YH_aWG~ph5XM<~pBGT*`f1on*yEj^Eh|Y3-o$a6Z@;>+d9CNyl2JW#=a*XM zU~#bwn@GhLUX+OHMTY7Msm*D9d4e3w7H|&`LFMf>ce6`mIRj@efV9EYgegAU zgwpf*M^|ZUfA-4NX@1ykrL*;8MOg7(kbGR+t73f?wn?e%$~T00CQN;~%$eG?FF_S9 z*ev|rq1k~a2Zy}g$cTN4B6O8sUt19=aKqwIL>+hOlGA)uT6WQ{8&D|fA#N41k$<;l zrh$8I`(7dr@3eHgc^71rXJdq z5ID#YIFs=K#@)Ex-WA`d#_kd!uKQRVx2c>D$lEADj#H0XUQ+O-Akh=efysPxs+nS4 zLz5Vq#ov}sZGeRd!fj03xBKF~+x6>%3@D9Wr4aYbq+Epj8Cv+C0;o=hLGmo4|A8u_ z+%$is&W@7VLY13YD?`3945y9;EZUD6;AyXZTpE-0fSaD#1gjV=rF2(Ix~!aoG8dZd zDO8XF39f@I3vDSc)m&yw0qI}-KpTC<41AhLX5iMYFdxUqNSsz)#fq-7kW1 ziY@;6>p6J&OWz{hrAH9Gc7a{x2vy8{`^KGi&`p>WmxT!4hedGIwYhn2F)co~Nr z2l$G8<|^g);QpN^2OEk_5?f>TTxFN+lMNk9Ppvqk1mfMj)L{p%%~E`|O zZ4=DudIulx#nOwR(T6Y_f?MoOR9-G5)N5`@Aa>Y{-Dtu6IrlI~j}0)7j$j}0d9 zNYkUYmZCx48N-&nSR;Ac`J`|Tth18*3HtA#w=NJY)BF{ooZ3%5M<4Sf*{4WK+wWO; zjjGy*@&}pZ-jtYSNE*hjrhM%0!qtUagemGEpe0uww-foX-8-XY0yqa|HEs1Yjl?f) z^>!J0*uc1%!PqUWXGefR(dP69k(X-u1;kL4SmXKXs43AGP8OS;k3CjCDt3>$W;bc_ zV+|s!gXZdA9+aw05M5$R9MB5AtVmH$aiep^7X5Ir6@{O}4fa7-K4(cGKO(~v9m_AN zGKOB<7$%b*7kF>AQGwVMvRGMRoq)lDIsV__e&K2A8R|ING$71l*o71s0dk?ampGDS$R216J!y{I%fB%a(f2uD_o zWYM(7{&MTYT8!6U{Bu1TPC_NP+A6mt{*7^%~#FdKvln~-HQ zGP5ShfG(SO2w~Ey^(8sNEi>sS(!Jdfp@zb3jZLgKOHj;3KPp(#-QT72En5A3HufC8 zNVIv?M3Gt6E<{J7S|R{GIH;B1ro7{{v;UN56B@L$1kfzMch?q#R&q%f-y|vT`sw4} zfm&^nDXB_(wsXpHsD{4ywFz_n2qr4x!2JVY$7+VX%fkA z(xJBHK|sSzIvK4~W6ns8GF0Zuj+g4>Lb;ddEKZ8ZFL_h?rMcve{3!RHL)S4nk>@UB z%SXfmDBvht9}Xd)ELzelhi;R4M0xaPm5PbY@04djR@HH9mH!^Nx#{s*)FL{1KTO^u z(9)3TKqq76qQyvs$|By3%BjUS7Xp}1+@!*d%IX%#%*@;#!SMUi4vxQL{GFs}U2uY! zO4-&QTP1nHwH^Z!7u`P(WLBI&v+=wQyUAVD3B%buOG`$%{_fNc9U`n^zMK8*`)}+O zbt4z3NG@k=BjDw6PVf=giryv&{?%JjNDUS<=yW*Gr67SC-;vX;6|f;rf=W1SrJ$`( z(q-XKswyR@PY8LZ&W(*&McC>;Q{`(g5nO+6*c)i%B0Jp%atMdLWDN2`X0oq>P6u9? zUrwIM?x}%%^L|qC|50?J#Ipu82F_j-@4GV`ps$s68^2`DcZeP39#M*l{ie@0OF6bqFREG)P)s8iEkw>VDFr+y=cN^=n2=)4ZR z;}RI!UORy^-G)yV4JaVw;IXLmc9W#h&J0tADzE1ro?RHWBFti6L+&z1u(HiNLa&8I zv<`W#BNzr^U7Y>%{fLfP5!5PgjB{$B6qa#O_OS%cY8rv)Dk#>pC9A=xctBAOkLS5H z3d#UK_7Zp<<2+>9UM^&^)AkSnv%o-Sf)&G-EOK6%RA`k$;EL3SUfjyR{1{^Td#ObY z&dgw%3(Rp@vUjYHr^Gpt|9mrQ+rx+`u8{IFGkwfRZDke5oOXh|h>-Mh0m{d73Zi=p z+=`!@7!>(adlPl>9)2G%*W}`IH%2loF`sP!pd-_$V)g?Dh{UTZRaL(Qo{fRg5+g4J zOpY92eYexK^HHD*Vy@Y&D8z$ah}VPuQ`uCMQ%kD0q6=tuTE+NO<zVLot!&5NVwPqlgVSG^dn-(fg=NA1S`G8^s~ZlxOTTyc%H@%-sUQOJ=C*{X?lX;{(_$-$w; zN^-v6XF8YSNZ==X)Ys|i<|PlwnlSinI>;f#wX}teiyO9-fgA2z#;sHFoy^RPLCCb{ zI9I*!_J?i6&UI7`fip z)=nrD-ZZV8SQ!DCx9!+vr`J#|{=O1C2g%ea)<#+t;3Sy!{iMFj^7k?0B@*8JV%nQ% z{j?V3pD@fL^WSw8%<v@H#=crk{h?)@S`tTgzFm z4>u&W3%STTfv5Rk)nNo*W7b(n<*_PhGY)J-^<;YqR!|Z3{-VgA8^~9 z>LlG7!3y(Ai2N0^^M?Fd1%o z8P6rniKGCTUC>&OBO-iZVdC&1!yqSiI3XXkxvKeqEd7UvcPD>vX*G}Z`g)vn;G^36 znkh3hv1)e84Q0DM_Qc{y|GaQ(^KEzD6!tF)g_G{0+>qj)hZ@GxJgu#rvk6;xwNXL+ zaV@2P9)%5Xkg?hr*OTLzhRY>Bri)@Onbi$Np%2c#15i~+9Oz8qLxzQo#%r-gkKf@y z#J$2w3=2N%2Ui*CQq97jz5XIONnqDavANT&=ZoySH3^(>32-m&AaU0Ox-i-ny zkWXH?jaBC~B@BH8{qJd5Y(p2(*u;~RWw8Co!seMr-#2M0iKjn%pLm|vPzu>7crcN2 zcNo?Epe;;fVhJ4mde?NrN@V7uWD)4I$ya93BZO2{eh?A54YsS^$DB94wdJ$8OeEJLNk(R`tOt6JD4 z2F<*1wQ9%Aim{>Ee|?-<7vk;sPHfYNYhg%sT~Yl(sGfd%_Ni(H<-C zFTZ&|hV^i;Vum{avGnW%`ynOeBQmm^>GZ!_8G7XG=N z@x3x_egbJy_%swYBJEk^Vtla0oWYlUlW2^Snv6tBF{nfUpJ`0hS_AR!WMvCrIMzL~ zIA~={;PtTRyNhYhN4INJnGuRk?5lFX_{>6W?OSU+ooHaMPkt;N_La9LDl?M?PH0j` z0h40_o^4a|h3j5=+}fB7VyZHy5nV2d_M=drT`s9Ogm(8q1R_Z^r_Bmn6N7k_c4WwW z$a}R|;N3WV_fsEriQ1b`)^&RrEm<}9SWJBxZ!Q0Gj2J8BIMqax5RqNB9m%PAO>^jo z|2xKX|F3!Z|NU%Ziij8+P^}Sd=0IMBBTcRU8rfxLo-3vJE2R`4|8^MvPq;LdWM(e> zE=v9v|I5JtGVs3){4WFl%fSDaG9Uo({Ug`-+oS*gJAU_Vv~;@mdk?W}Gs9;}rjta` zKni_zQQF9iWFFB9=0x-HT;cP-zbe`pkxeQ>9r=Rf3(PW6d}ifEhTO_{ic@PJ?1j;jpM@!-lZn$9`hS?sKh^ zQDNRNUOpnO*FYhdsSn|{1y}ICJU)-7OWV&~GtT6NI!n20oN2NMg*m;t+LIs+bWD{y7CS5N8~k; z7Ib3Z0?y9Dg?5H7!w(-8=OdNbNp=W&zH&ptR%2n6Y?vB@m=0ul=|NB4|n!)=(BMt-G3Nzb#U`7=Q^~_4YCX=fb%Ckf7_L*)6#q@&N z22-WI$tGOeEJQ6qBq=5mIUa2-ycuLbs#cgZ8WG&R5xZi=Ieb0hOz{X7iLH~xe8kNT zDK5R*G?CB?;0I+$wkc@(oEWXmH}APM_N!O=q5em*^Uucq6QOJUhG+`42G%?psW$dMOm55AeveJX!i9QT)`Jd9V)!FsopL>JhNj_$2?Nk) zH~v|K7pzUn*;QVUJ0o-;C+aZYLQm*GA`dL~z(=EzZ*l@H?UdaE=wmI>nqv3LgU|Blq>eKJs194_+gL zMUt!^utvq#t#OXRazLBp;4QbAW?wr+(+DdkG9BsL)jX%`CYja4$pEy7Do#v%lh~7Z^dR=?FBS6W-tn1;V*pUCbVcqZU z0^S>~j%2yf?oAPW8bqB!Ys{+>Chh+EVmQ88xrFNTIaw(g|9j11;wl&ols7xq$y%7o z!+li;1=hG?8&VxM7etcrG^vg8*M{$p=Vdi_Vqwr~TYmGnZHMrPLQM4piNV2I-nv6Do&j}D@_p(_N-%*kp=X z=muxx+Qw_gZ`I+YQ&qFtMWBPUA*K z)ua|~a#y=f?0uUjAx($%vYVue5|Zk(Y!}h#!Uvlud!eZa@Srux!5#Up5UE$``#adb&chjb2lYYMX;Your5O@K+*DUz(A>!e4-OokiRlm}?zvhgkOC%L!R z`;Ygm_CH|hgyyXi_*E*0bKt4QZ+!?J5mRpQS#(x@1!FrgkO=Qi#*D|ALWDfdz=9cA zaC?&a822J4J0j!~l4SroOt0Fj3jGzaPzb1Lrt2eDVkI3F7BTv|?o6eMtiTBx;x#7O zRC%o8!|&_Lr3rv41j3gP)ur$CS*;)1|0>FdJILi~Ie-@|r}oItQ95TNbF%f7{K?}# zT3$WIPsR4x=Fm~3cCBGWdPQ{?|zRjd!H$1IQK?Zwb34ggQMaDEdf-}JJ}X|%*swGv8% z^hM5jSx2Em^N&AJ& z4&(d5E4ZOmZ6j-UGwR87%NuNFWdU;b`NY=mmEd{56v?}&&nbcGCwTlu#sY3|o#)^> zM|TAmnb|o@2-!CU19Os2YGGcW2`2iFGpMH>JaZ&0W-lZOMoug4OvGv$#9R} zJCo(u5TQ3Yv0FkrDYMQOiM6#mNIpVhn61JEe4NV+4Qy z=af81O+?zoKyooQh#Wsxp#98cqttD+vL3?`ki5>aX$gjOGX}U?;q7d#RgrdzfGdN6 zll~ZRokd$#KCRK)vIdtIw5^lhIFhQi&iRml;9&dqNqrim`HutSi8xmIcvs^-en$}C zy#l5I_5xAq-anI$O(1C}h<{_o1s$1*)jVVTgtA4hfRqal!<9Tz^qaL4 z5yW8WOI%Q&-XhWT?#El?j%dPctGbM1*aHsdfXlf~N#n|*ao#laD@$2(@tLTMQ!F#f zo(Wp*NLe)MNMTv=U12CBG?yNWbpFGQ=EZ@|c-#NQBJH?-zvX4iD@ZKo(P3=i5u8-VgTC5FB*>jxt&;u8fWlWKN`Kb zy29||e3FWH<9dw+V5$v=Au)RpNCgKVu3zG}c;vtm_q z3(|&7C{;Z#7(TsC)ZXCan|2&9{JO8zLZkbczb08?E8pV4BnZCk{3wADU~H$>Uh!#OBdLliC8V6+E>gTRtG>nz4i9Dmv4N zSaFKMF6M<6b^5?`pG#{4#rNI9gcYF3Jdt6&mH*EZ%1_qn)*@L{iQ6ZjbqYZX9~pYC z8eBy-Y}pSq?i$lbAxwEeR6k}4Bn#2Ln5FwM=~6roTgCu&u_E5H_Jc~q!s#20mcg+~ zzkW%R02o(}s)9RoEgiGXlvNBw1TM)(7E_)1`A#i=yB9qe(zGP!*(lgyi@{Cru#VA7 z07Qce(#jhD6y(++cp8L{Bc=%;l)G4JWf+80r(!HE<&t!y7FEKIdhbt z^fXa2s9fmxd3@0<=5Bvv(9|F&Do#O5xHz7F{@u`Cw`Na&th1 z(Om0qb;?8*_Kf--&W|6UM@=f$oG$nEq*nl}b#~s|q~|6XvnE!ahDFDj9YLt-o8hd( zh)Ry9#E01d_B>T4cf$Z5$ZsCGfE+6e-=@`lf!OCkz6|-5B(9go(K<}e4nl{cMQnsG z0`Ja&6|h>%&dcxsT8 z#BCB~=&e;m2#-d=>FM#uY+LINcJ>0k>9FRVZ<;`zSZC|7QhTt~4V?;Pg(Wz<>ZRu> zGhPO{d&6(FzUbk+bq=Kz(0#4km{?c$UMY&vFVi(~cU(JOs;D!7JoOEC#ut(WhzKkKbvaa&NS|BI zpJFo{)>+vozPuuVVQ8ZzgnVrNp<8!;<~twUh6CQU5#v!%Q$-K%#_G2NSmMT6p!9K) zB~(p=Xd0Q{nd9Wm2qgyLUn1hlq~$g;U(nKbmP-^6ULrW&XE(O0tLAFfh1n1{bO|KN z^!IhVo|y7BME*JglCjPWDw_|Vc|#OAT|;xTBg*^YZ(2xzzfkbCEW3hx+VI@rN=Pas z>=!Lh2*?3a$m4`4*p9h5F`$?FQ75_b?a5gwOX=M1N~hMmT6{<-CaU`JJBQ`IqH$7a zP9Xubfw}hv|9iCspL^;G|6y7_@%XqZP;B6EfMiQn{h|idWx$D5StRBhK-Tuo^tRZb5QDG)T6D+ z{twc%y$@Y^0x)j?d4=8T!b%uJmsanse$iH50c9EaS+MSo_NhERT3rh{&JMB@(9mRt z=YEyZJlj{?0YK<7JJ)&*A>H{uku8F4E64=W3~ZOiFbZ>P^$B+Ky(XXB86(?tTC@($ zN#(OKAU*SPen2NZq#Cng2Hs`Mvg?tt&g=JQ&vtXT(?0m&b?bif7z}Y1oPkT&4U?@RC$Kq`g_lWGAhbQMo5YT&Y$q?z|{yQzNzBv zaN7kxXqqti5gUbT*ZF9{g6K=kx5hQ4z}0#9LqMjmcj7V>eix>4vgj0pTKQB33xJY zf$;rG;Tu0c`ViQQGMaFlyB6xPabh5hc(}oa6`hzfPT@n;!DHug9r%c#YVtgzo7g1F zhW1C9fs5%Eb@;hvq@S*WLH@b<9ad6aI-lDLdTj@z0Agcz_$BXGPn9pzO;4n7ko$KAT}pGFG=3d% zvDWb+t#Z0&F(L$FhWSej)RY@gz;AG935i5XhE1{1hEAVY;*r@@6{xBBK71uB*M~{d zCi2m+)BxyKyVi3B)w)B3s3|`Xs;+Il=qJ!3UeMJPI z&Sf-`^^gn`TFdKqRscf*6~jtGY@uzX=$QmmOsH=x_oyAh76J`6d$;gG)Dq|Y6#(x7 zJSpq)Ny!rpH7Vt9JNdUnC7Uq=ZMR*z$NYUI<7Y&*VvST%KA9HYx2IeVw_fVG-u;go zFR%z%o)0*h#EoF~OpEILMC~v@^36ZKUq#-53ezf5T(dab=v@W|{I`o4$SB`7P*{9j zoF)^d^lc9V@`SQySdsA$)1io+e&9;I-OSiMfxD~lxjn(TU}VbWh(C-Q7Z_|ktf$$U zc(A3Mp3BT5pDJs6YAgzw=&!0fj94AjXfA2jWyR_SBH@QJy!2(45S{Ef>QPcZ9Ww4# z!))l{bcXGkXyR~MUq4fl@Q{&M>tn~`P2o@y%N&bl&QZ)}i9OOR#4qYB+v4P4d{E^$ zjU^C&$8((owJ3Z12AH9bp`a0I zWp4aMW#fvg+8D3DtP+HmF>g1Pbz>^e9ETgVF zc~n*!-db|KwMLN1bo$6Lwio}JBK#ps7pvs>c7^b)PCH|&)zktC*j3thBO!u>byFa~ zWos;NL;p_?q*<*F@xPg`5Ga6WnEVDmo6LP8yc=vd@7IqP#@K3d!&;0FZC9NTAuQ}B z7yx%_kwHXj1nN?W zbA%Z$39#>0(%%Q^+#qjR!4fI0ThuvwOi%mv?XXg5qk{34C__+?^r=_CQJ16L=IP%A z|6$K;)*eywXeo?c2)6CA1`X*$mWY4sZSiAKO&^+BE7HO4+s==3f^w^2dYuST4K`bl zAozL#q(w31y>6e&e#8kpD(>IawWDvuPZ~YY`U**-6g?vGn#(Fy;y33LuMm zF%jDb`8SyQ`_4@yS+(8IY-z(Apn8g@gy&pAa4FhvVIVXdp|ntMNm@Oem<0|mGBByc zg3jf^w0Apee=FkZgJ|o3*C%j!uQQ3h5CX_kBw@fY4H4Zak~N|$Cdl$&hnmXW8q+qb zS{!JQyL2so{#l{>>Vxf~5)@akvvDb?IB;!(3j9f8d_uio+v zCX3P`SqUxR2gjo#+XiSnXz5H78&GLi55n=5i?80Rj9>*rhQ~(w*P-duDI7C3*YziW z_{H8zCm+>x90Aj$83rh|A<76n;(o9)9HXU@is%f&Kf9r{o z@nr%Rm{(%=q9#Y%_OibZa_ft-JuM4yf#m?xR{{F(1eTIQ*j_rg)UVI`#7rj`m*qL^ zJPOFqzy;>qzq=T2`VP!BEF=9;KZ53nG)TZC>fZ*$NOgFe)O$}BHF-!Ilj&Q;Xnuva z@meOp--`BwisyT}7HaJ$w`7Gx=Y$4efKN77m9+?Y9pt3s%#c5Z=jKLK(0FSCTRD3k zS2AN~b&1h#29W*>DQ78+e^uq9;pGBeBm3RVm)hYug5YkYjbc`KGHon^7vnJzK-1qA zCtp0#E}qYP1~5K)7`|++5|abu>ibRX)GDS}`hAwGh3u$u3tsM)X*_0W`}2#_Gl_NdP(aOf zmvMWebNlZ#Mvt6rR&2wdYE$56N#o&G;SNkHS&MC<5&sl!()kwZthPs3<wZ-9;z*Zi|7JPT0*%1{IqimGs7ljmL<-q}hE-f5+Q zKK19ajJU%3_ckj!6hJO!J~T1s!vuormK{Nsa3MJdP54Hsw;1HtrBggx@UmnhoRqt| z(qFe>tK#?OmmRSeZ82nTK@q@yiTSQ;W%_fSIJL6Fg_|Kx+Oc+QKIgFA-6rB?4|27F z(scAyYPZ)M!QJ}Owo|lt{I6Lpl~@ z7TT>&?$IS&n2euwC)`UPgCuBy3M5d@|r>i&2dg#S*nM1)-kR{h69aAI&SG5lx$uahX_yG3 zlGG#9%3FeBZ=fa@49~heU)wnZJe-?^u3cd=<^sfQWE_U7=xe92O1Zz4(FtNkQ88?? zUpi_YB{a14u?ekY^%|z27PaQuHl<5Rwcu|IaTUP@buL-zyzo$aE=3HN#0(o%s)C8{ zh_d{gi^+HV@{#9UWuarJ7>_RPV(lGNopYILR!WKHiTk(o|G#8i-)3lJt#cWO9!5*W z%o5u})pTMcqyHMLc8wICRKu*C4ZhMwDYh>hK~S(Ba_j1R8b$z|V(w$G%<@8%&JG*} zBuEo*=T-Ck+Q{?C7zqj?Pp0Dvz{j&hBviQ`@1^@mLF{vIu;oToV^@K|N{*xn-a14z z;z5}zY2MUgb@O~nB96Z*l;C#lMph>S53V+Uwn>qq3xnG=uns@dtWaOh4{+}lfRY>f zOHl6oAo$cM4Q_49`-3cF82IwM=GF3g8+-}j2zxqz!tVULa%Cv8Eccr;Z4Q}e9rbMJ zyEmRthnRDWJSfs4z`8%kp@a_t0t#-bBY5k75lZ5=anSF^gX;&Hj)8|pL_K28w zmWTb%=(c>bBtAtA*+^&U)NqVHn0HM`sArHN-mFbvs(hGqaO^HE7of`O^%u#v%ap=C zEPb6ErQ>|MHI{Hv{c!b&rR<~Ls3sUiP<_C2yN`m3kQ0@l90`K{Ht+_*UFd6Ni8gh^ zNU}sB+7>?c#TcmDz$LDvY_Y0($yinO%W`XE|C0%U^0u+Y&Ypu*V7i)!U1s{?gZSC8 z9c?|uf+2EqFkZU1+zWb0fUq(qJm%i@F`v3*T%hYxuikoAO1zZ-EWiTQNdcbtp6P^m*0wVENLv=UIOI{C| z;*DBqP$bcTLXB&Kxu3QZ4@jB3Zn#&t=@i0d1>0_5s_NYN%n@lN&9H%jOetFxlL<2@ z2(B85LO#+BK`To9RwK(6xCKO>66DB-zKZ3Z`kjF1El*onF(`l>UZWZPT3FQG3#ePs zt*7fSfXJZMv|vK$BoSRFJDe&pxqB{1^jBIBLOjGEc~=@%=aXUgj^~NNC%N~U_m$Yq`fnO`bA-ppk53@p$w@_x zKh@FzLpK1reW5Mll|#~U`&7D_t4zNU)Y`Kcs`nFSfjayjRvLiB7H)_B{FMpM6a7JP zrQ%iCR)JK@Xlmy=bG%J=jiByA?c=*%ndA}D;W`)m?d6$} za0Q6d{XBV&n4bd;a?l{#)k)gwSt40GH-8pTwhrE!(P^Z>WQ_{xEchIyZ8r3qgV}Y8 zVH2pLro)}*+3L+9|I}*S(WQ#zwv%;x!cF4t&?MnPSWFAY_o0i9cBUh zR!Y);HqT*4m~vK&3-d02m9Ec%=)3`fD;Byffa;EmZMnOvb(UeG(C!dbCf~vM-0Byd zqvm1jEU&~W%MviJ)+k~zq(HR?0fXkLs-s0 zxDRln5m17Y(J|0+!LM;l=8OLpMMHD-&FV3yRAzg<%K|Gp88J|g1gyN`y1$K!v?h&u zS(4f%%AKcAkD)NO5q0(XrOj`m^h@a3X5n4Y=GEH(wGPN(;?eY5(!q z`N{~|q}(M#k4-#7h9Dh5jVh7x*o!{w`Es4}6~f%${iG-}Nn8z|iqVCA;Kd1M*_j1W z;1Iu3-EYWBCXTypNClItpd)`)`Rf<5vEUluPwy8nnhv_imIIH<-VD4Nk~g1@thQwN z?xKL};wTv(DbWa~$tdE3*;aT^-^*h5K#S$*kSox%2G9CM_QCo)W*109pO<-M&o=>S(TiEL0@;!^N+FtKt0l6#_Fp?p0G|KRb8b| zJm9Au;9lS}&&}(w5$Cjb5ln^k8WjldFGl$)R7(r&X>xDu{_n{L@eVSs$V-imZo#;L zSTsv$90;`iLXM%v#=`Hfez@$M=2`QufAX5d+qY2oG3Yfj^1N2fr`>rza8A#@sL)4^ zumeoGR`{RKN$<9{O(@+jOjhNWv*2u!gPul-Y|i0hk%Gy7pa}ZR>nimp=H5{4C;sB| z6+xX4VH&3-xLU6fZ`lC$d(9`4lxXNrg9&&o0nM#CZlvW%jUUER{nTXE($xQsq$nc^ z0)DNFfQ^uOzCrEfR1)KRNAF>H9ZwzL&+}xRq6A;4`jtU_lr}A znMISH$RxhmsQ9}m;<>PhwJuI^?H4(_{QK4q==vv_k)*{GgEQGry^~`~$fnINqH|-7 zyem`pj-$uGVxSNqdY)n)(`N0K?3YRfb4EiH)g=Y18+iqJ=^wj{=QPAwz>|duW>BN+Q6BpSn# z2DPLe;O6D+yu3Oo*6vgJ_)>=V{TTGScs|t4p-^J#4xO%wE6nVCqgJpc$eIbV%Pe(R288&#s84w0rNM2DXQlnFWE_r{Ewft2#d)xR>w3@k*m&4 zgtFWHPrR#`=iya3Y_RfY3xuKIjUEpN1JHa&``fA9kAMl^@zl7PH7(9&$2trfwA9z1 zydcNl-IJ<+sL|=L(GvS?{cNeL;gfnZlq}Zh)8EaxPO<`g4nkSXAotjVKO;{&(z%YFpKDI+JK%1@cPgIT=lM4025)Y7vBp!m_c2mcv+BD4F1kyxU8H@2|yu zCewl0x<*V=S7Y!l3-=?J(c=Ax6<=>|<&LsGfu!UdH#BmUVQANX2#eMvC4gn0d>&L> z@VU(GuR5^~Bnaj>7XP9P9;6b09$6r|i0&`YJ zH|&K+Sw3HTStuMM&10QyuvaDmR}aI5Q8dg+q1T87>Sxw##EtGFA|#D4e}W+-Gb(&o z{!>MEBh8m{>>}NbtuT#8M1urY!saR{2mVh>@+dBW$oQ&{uhv> zge61v`LSS_q%zILRSY-)j?W8$>D}~VGMPa9!I%A!f~-C^iO!}}tdUrMR+?16mvzSk zqJ>mSvC79Q7=$H~I3u=lx6eh3B zb3P_~l4o6N%6J&PGaTSv=kiBlD0xK^Q$!65czCR5ViJ!YI@H;%^TI()aK=q|ZNlAJ z&JZ_9u^yW^Fyo`AfG&G2z$Sodk~#oe=a@1bRE7erhHE-OzXbgK4=|^DZAinN)BoIj z7%15K)m*DC)7&E8Di;_J{eW)C2k8d3=1lt-Vw*M}DJ7;F=+aP;{8=U-%mlqH$_uTB z>q441MtYr3{25zMo!E+Lj0@PnJ|RdT|DF*jewWxhK<#i}Z^`x#&1sVSmskuIq%*G= z3%6#Zg%E(Go}#W?rB9`KiH2fPob(7!16EV^GPCH46diGUkATGJoyG{Y!?G5DV2K@{ zY<=1Vpcfo{|8q2vT51w0rtE0@(J07#ci$Fk>egfu6i>@vgycRM=m#L zbvvyTUCVs<30_)~Ztv|5S{E~pJEBAEVD6VTgTUJ^loR}40_5RaF*XB;*W&UUZ`O;i+tH9jta5QfsV^-oB%)P+{!~)X}CkP46>5cctWmn`9paP zhXSzZ+g~sZt%sk4wa%Y#XCjnA8j?MxiI*3>1l==dWL$6$7{}9md(v|QaqrHS(9O!! z%UZliR+m(0naexe)UC$PRn(kayQkfzbTl1x)18z!19N^y}gd_vwlmAyI6iFp7smo6k@L>)qA%JDl^gChaF_+*|XeC+eUKDbpAO=Uy|)()HZP2WEY`aeYeXW z#swq+8RaN?_ktcx5^a76*j0AZ{gg&`nMzurU`(+e!&<@5egOS&f{ev}?~sFJ`i)7V zhzT}u$=|WP+vOhKvl=bkb-0A)T&o?EJi~b!mUh+h_Hu@|Dz%yf_$B7NwUqkEGM%ne zBfI{}FZsYX&ztA~KOv6qT^%1@zivIb�*T;cy|$Wne4+vje!-qD@{5OX#jgsjUb~ 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 + +## Course overview + +cdcc40b6-c985-45b4-9bee-6f931e984476 + +Welcome to SCR403 — Delving Into Simplicity! + +This course is based on the **"Delving Simplicity"** article series written by [Dr. Russell O'Connor](https://r6.ca/), an Infrastructure Tech Developer at [Blockstream](https://blockstream.com/) and the creator of Simplicity. The original articles were published on the [Delving Bitcoin](https://delvingbitcoin.org/u/roconnor-blockstream/summary) forum and form the primary source material for this course. We are grateful for his pioneering work, which made this educational content possible. + +### What you will learn + +This course explores the design philosophy and mathematical foundations behind Simplicity, the next-generation scripting language activated on the [Liquid Network](https://blockstream.com/press-releases/2025-07-31-blockstream-launches-simplicity/) in July 2025. It follows the complete five-part article series and is structured in two main content sections: + +1. **Foundations of Simplicity** — Why blockchain computation demands a fundamentally different language, the three ways to combine operations (sequential, parallel, conditional), and the nine core combinators that form a mathematically complete language +2. **From Data Types to Programs** — Building boolean logic, arithmetic, and SHA-256 from first principles; understanding the Failure and Reader side effects that enable blockchain interaction; and learning how programs are committed to Taproot addresses via Commitment Merkle Roots and redeemed with witness data + +### Prerequisites + +This is an **expert-level** course (approximately 10 hours). You should be comfortable with: +- Basic Bitcoin scripting concepts (what transaction validation does) +- Fundamental programming concepts (types, functions, composition) +- Some familiarity with mathematical notation is helpful but not required — we introduce everything as we go + +### Key resources + +- **Original articles**: ["Delving Simplicity"](https://delvingbitcoin.org/u/roconnor-blockstream/summary) by Dr. Russell O'Connor on Delving Bitcoin +- **Simplicity repository**: [BlockstreamResearch/simplicity](https://github.com/BlockstreamResearch/simplicity) — source code and Rocq formal proofs +- **Official website**: [simplicity-lang.org](https://simplicity-lang.org/) — documentation and SimplicityHL reference +- **Blockstream blog**: [Simplicity on GitHub](https://blog.blockstream.com/en-simplicity-github/) — technical overview + +Ready to dive into one of the most elegant pieces of Bitcoin engineering? Let's go! + +## What is Simplicity? + +d04f3960-d7fb-44e1-b5a3-25b33d03fd38 + +If you're coming to this course without a background in Simplicity, this chapter will orient you before we dive into the deep end. + +### Simplicity in a nutshell + +Simplicity is a **smart contract language for Bitcoin** (and the Liquid sidechain). It was designed from scratch by Dr. Russell O'Connor starting in 2017 and activated on the Liquid Network in July 2025, after years of formal verification and development. + +Unlike Ethereum's Solidity — which is a general-purpose, high-level language — Simplicity is intentionally minimal. It has: +- **Three type formers** (unit, sum, product) +- **Nine combinators** (basic operations and composition rules) +- **No loops, no recursion, no dynamic memory** + +From just these primitives, you can build any computation you need for transaction validation — from boolean logic to full SHA-256 hashing. + +### What can you do with Simplicity today? + +Simplicity is already powering real applications on the Liquid Network. The most notable example is the [Simplicity DEX](https://docs.simplicity-lang.org/use-cases/simplicity-dex/) — a structured options marketplace where users can create and trade call and put options on L-BTC using USDt as collateral, with no price oracle required. The open-source [Deadcat](https://github.com/Resolvr-io/deadcat) protocol implements this, and the [Swaption](https://swaption.io/) app provides a user-facing interface. You can watch a [demo of the DEX in action](https://www.youtube.com/watch?v=4c8bvD6oomw). Beyond DeFi, Simplicity enables any advanced spending condition — vaults, covenants, complex multisig schemes — that would be impossible or unsafe in Bitcoin Script. + +### What this course is — and isn't + +This is **not** a hands-on coding tutorial. You won't write Simplicity programs here. If you're looking for that, check out: +- [simplicity-lang.org](https://simplicity-lang.org/) — official documentation and the SimplicityHL high-level language +- The [Simplicity GitHub repository](https://github.com/BlockstreamResearch/simplicity) — reference implementation, examples, and Rocq proofs +- The [Blockstream blog post](https://blog.blockstream.com/en-simplicity-github/) on getting started + +What this course **is** about: the **philosophical and technical choices** behind Simplicity's design. Why was this language created this way? Why only nine combinators? Why no recursion? Why does it matter that the type system connects to Gentzen's sequent calculus? + +Think of it as understanding **why the engine was built this way** rather than learning to drive the car. + +### Who is this for? + +This course is ideal for: +- **Protocol developers** who want to understand Simplicity's foundations before writing code +- **Bitcoin researchers** interested in the formal verification and type-theoretic approach +- **Computer scientists** curious about the connection between sequent calculus and blockchain computation +- **Advanced bitcoiners** who want to go beyond surface-level understanding of Liquid's scripting capabilities + +If terms like "sum types", "combinators", or "sequent calculus" are entirely new to you, don't worry — we explain everything from scratch. But be prepared for a dense, mathematical journey. + +### From articles to course + +The original "Delving Simplicity" series by Dr. O'Connor is structured as five technical articles. This course reorganizes and annotates that material into a progressive learning path with quizzes to test your understanding along the way. The ideas, definitions, and proofs are his — we've adapted the format for structured education. + +# Foundations of Simplicity + +a5976618-94ab-4b29-b9aa-040d35c68e5d + +## Fundamental Ways of Combining Computations + +6d46e77a-7e60-473b-b230-418da5ae44eb + +Now that Simplicity has been activated on the Liquid Network, I'd like to do an in-depth dive into the philosophy and design of the Simplicity language. + +Bitcoin's transaction validation is a significantly different application from regular programming language design. Block space cost is at a premium so programs need to be compact. The programs in Bitcoin transactions are only ever executed on a single input and everyone executes the program on the same input. Also, the agent authorizing the transaction already knows the outcome of the computation in advance: that the transaction is valid. + +Typically the authorizing agent will run much more expensive computations to derive witness data attesting to the transaction's validity, whereas programs run on the blockchain need to check the witness data for validity. Checking validity is often much cheaper than proving validity. + +We've designed Simplicity with these sorts of unique language design challenges in mind. For example, Simplicity requires unexecuted branches be pruned so they do not appear on the blockchain. Preprocessing steps are carefully designed to exhibit (quasi-)linear time complexity in the size of the Simplicity program. Static analysis is used instead of "gas", which cannot be computed without executing code in a prescribed manner, so that the details of the execution model do not become consensus critical. No dynamic memory allocation during execution. And so on. + +Before delving into the design details of Simplicity, I want to begin this series with some programming philosophy about the general ways of combining basic building blocks to create new functionality. + +### Composition + +Suppose one is designing a language for programmable transactions for a blockchain like Bitcoin. In particular, programs only have access to the transaction data and the UTXO data of the inputs, and execution only determines transaction validity (which lets the result of execution be cached). Let's say one starts with some set of basic operations that can perform various tasks such as basic computations, reading and/or processing data from the transaction, and signature verification. Each operation consumes some type of input (possibly empty) and returns some type of output. What are the ways we can combine these basic operations into more complex operations? + +### Sequential Composition + +![Sequential Composition](assets/en/001.webp) + +The most fundamental composition method is sequential composition. If we have two basic operations, one whose output data type matches the input data type of the other, then we can combine these two operations into a new composite operation. This new operation runs these two basic operations in sequence, taking as input the input of the first operation, passing the output of that first operation into the input of the second operation, and ultimately returning the output of that second operation. + +Of course, we don't need to restrict ourselves to just combining basic operations. Now that we have some composite operations, we can combine those using functional composition as well. + +In mathematics, this sequential composition is often just called "composition", and one might think that this is the only way of composing things. However, we have other ways of composing operations. + +### Parallel Composition + +![Parallel Composition](assets/en/002.webp) + +Suppose that we have two operations, they could be basic or complex operations, and they both take the same type of input. A second fundamental way of composing these two operations is to execute them both on the same input. This is called parallel composition, and the type of output is the "product" of the types of the outputs of the original operations and contains the pair of the two outputs. + +While this is called "parallel" composition, and the two operations could in principle be executed in parallel, parallel execution isn't an operational requirement. We can implement parallel composition "sequentially" by executing one operation first and then the second operation. We don't care about the details of how parallel composition is implemented as long as the output is the same. + +### Conditional Composition + +![Conditional Composition](assets/en/003.webp) + +Conditional composition is the dual of parallel composition. In this case we have two operations that produce the same output, and we compose them by choosing one of them to execute. The input to this composite operation is the "sum" or "tagged union" of the types of the inputs of the original operation. In this instance the tag, "Left" or "Right", is a single bit in the input's data which determines which type of data is being carried, and hence which of the two operations can be executed. + +Conditional composition operates in the same way even when the input is the sum of two identical types. The sum type still contains a tag, and the value of that tag determines which of the two operations is to be executed. + +### Composition in Bitcoin Script + +There are many ways of realizing these three kinds of composition in various programming languages. In Bitcoin Script, sequential composition is realized (approximately) by the concatenation of two routines (this is why Bitcoin Script is called a concatenative programming language) since the output of one routine is left on the stack to be consumed by the subsequent routine. Parallel composition is achieved by use of duplicate and swap operations to manipulate the stack so that two routines can be run on the same input. Things are not entirely straightforward since what we are calling the "product" of types is typically realized by utilizing multiple stack items. Hopefully you can see the general idea. + +Conditional composition is, of course, realized by `OP_IF` which branches based on the value on the stack. In this case the top stack item plays the role of a tag, and usually the next item or items on the stack are of different "types" that depend on the value of the tag. For each case the stack item types may only be suitable for processing by one of the branches in the `OP_IF`. However after we reach `OP_ENDIF` the stack items must be of consistent "type" such that the remaining script is capable of proceeding independent of which branch was previously taken. + +### Composition in Simplicity + +We designed Simplicity with combinators that directly implement these three forms of composition. Along with a few more combinators to support other basic operations related to the product and sum types, the core Simplicity language ends up consisting of nine combinators that are adequate to express any finite computation. We will discuss this in more detail in the next chapter. + +### A Fourth Kind of Composition + +Before ending we should mention that there is at least one more kind of composition found in Computer Science, which is "recursive composition". In recursive composition one operation is iterated multiple times. + +Note that Bitcoin Script does not support recursive composition, and similarly, we have explicitly excluded unbounded recursion from Simplicity's design. Our thesis is that unbounded iterative computation is better implemented using recursive covenants which compute over multiple transactions. This allows users to avoid block space and standardness constraints and better predict transaction costs. + +That being said, there are ways of abusing Simplicity's delegation feature to provide something resembling unbounded recursive composition, which we may discuss later in this series. + +### Conclusion + +We reviewed the three major forms of composition for transforming basic operations into complex operations: + +- sequential composition +- parallel composition +- conditional composition + +We discussed how these forms of composition are realized in Bitcoin Script, and hinted at how they have influenced the design of the Simplicity language. We noted that the fourth kind of composition, recursive composition, is specifically excluded from both Simplicity and Bitcoin Script. + +In the next chapter we will describe the nine combinators that make up the core of the Simplicity language, how they serve to directly realize these three forms of composition, and how this forms a complete language for describing any finite computation. + +## Combinator Completeness of Simplicity + +2a10a6ba-fada-4556-a673-3ae8c0794bf0 + +In this chapter we introduce the core Simplicity language and show that the language is complete, meaning that any finite computation can be expressed within it. + +### Simplicity Types + +Simplicity supports three fundamental type constructors. The product type `A × B` represents parallel composition outputs, while the sum type `A + B` (tagged union) handles conditional composition inputs. The third type is the unit type. + +### Unit Type + +The unit type, denoted `𝟙` or `ONE`, contains exactly one value: the empty tuple `⟨⟩` or `()`. This zero-bit data type carries no information. + +### Sum Type + +A sum type `A + B` combines two types with tags indicating "left" or "right." Values are written as `σᴸ(a)` or `inl(a)` for left-tagged values and `σᴿ(b)` or `inr(b)` for right-tagged values. The tags remain distinct even when combining identical types. + +#### Boolean Type + +The type `𝟙 + 𝟙`, denoted `𝟚` or `TWO`, represents a one-bit type with two values. By convention, `σᴸ⟨⟩` represents false/zero, while `σᴿ⟨⟩` represents true/one. + +### Product Type + +Product types `A × B` contain value pairs written as `⟨a, b⟩` or `(a, b)`. The type `𝟚 × 𝟚` has four values, distinct from the four values in `𝟚 + 𝟚`. + +### Core Simplicity Expressions + +Operations are denoted as `f : A ⊢ B`, meaning input type `A` and output type `B`. Simplicity is "first-order" — it lacks function types. + +### Two Basic Operations + +The core language provides two basic operations: + +**Identity (`iden`).** The identity operation passes its input through unchanged: + +``` +iden : A ⊢ A +⟦iden⟧(a) = a +``` + +**Unit (`unit`).** The unit operation discards its input and returns the empty tuple: + +``` +unit : A ⊢ 𝟙 +⟦unit⟧(a) = ⟨⟩ +``` + +These form families with one operation per type. + +### Three Composition Combinators + +Sequential composition uses `comp f g` (written `f ⨾ g` or `f >>> g`): + +``` +If f : A ⊢ B and g : B ⊢ C, then +comp f g : A ⊢ C +⟦f ⨾ g⟧(a) = ⟦g⟧(⟦f⟧(a)) +``` + +Parallel composition uses `pair f g` (written `f ▵ g` or `f &&& g`): + +``` +If f : A ⊢ B and g : A ⊢ C, then +pair f g : A ⊢ B × C +⟦f ▵ g⟧(a) = ⟨⟦f⟧(a), ⟦g⟧(a)⟩ +``` + +Conditional composition uses `case f g : (A + B) × C ⊢ D`, providing branches access to shared environment `C`: + +``` +If f : A × C ⊢ D and g : B × C ⊢ D, then +case f g : (A + B) × C ⊢ D +⟦case f g⟧⟨σᴸ(a), c⟩ = ⟦f⟧⟨a, c⟩ +⟦case f g⟧⟨σᴿ(b), c⟩ = ⟦g⟧⟨b, c⟩ +``` + +### Four More Combinators + +Product consumption uses `take` and `drop`: + +**take** extracts the left element: + +``` +If f : A ⊢ C, then +take f : A × B ⊢ C +⟦take f⟧⟨a, b⟩ = ⟦f⟧(a) +``` + +**drop** extracts the right element: + +``` +If f : B ⊢ C, then +drop f : A × B ⊢ C +⟦drop f⟧⟨a, b⟩ = ⟦f⟧(b) +``` + +Sum production uses `injl` and `injr`: + +**injl** wraps with a left tag: + +``` +If f : A ⊢ B, then +injl f : A ⊢ B + C +⟦injl f⟧(a) = σᴸ(⟦f⟧(a)) +``` + +**injr** wraps with a right tag: + +``` +If f : A ⊢ C, then +injr f : A ⊢ B + C +⟦injr f⟧(a) = σᴿ(⟦f⟧(a)) +``` + +### The Nine Core Combinators + +In total, Simplicity has exactly nine core combinators: + +| Combinator | Purpose | +|---|---| +| `iden` | Pass input through | +| `unit` | Discard input | +| `comp` | Sequential composition | +| `pair` | Parallel composition | +| `case` | Conditional composition | +| `take` | Extract left from product | +| `drop` | Extract right from product | +| `injl` | Inject into left of sum | +| `injr` | Inject into right of sum | + +### Simplicity and the Sequent Calculus + +Simplicity's design derives from the conjunctive-disjunctive fragment of Gentzen's sequent calculus, analogous to the Curry-Howard correspondence. The combinator rules exhibit "smaller types in premises than conclusions," enabling the Bit Machine — Simplicity's abstract stack machine interpreter — to minimize data copying during execution. + +### Values are not Expressions + +Simplicity expressions denote operations, not values. The notation `scribe b : A ⊢ B` represents a unique expression always returning value `b`, serving as notational convenience rather than a combinator. This mirrors Bitcoin Script, where operations like `OP_1` push values rather than express them directly. + +### Simplicity's Completeness Theorem + +The Simplicity Completeness theorem proves that for any function between Simplicity types, some Simplicity expression denotes it. The proof is constructive — it shows how to build the expression: + +1. **Decompose the input**: Using nested `case` expressions, fully decompose any input of any type into its constituent bits +2. **Build a lookup table**: For each possible input, use `scribe` to produce the corresponding output +3. **Assemble**: The nested cases and scribes together form a giant lookup table that implements the function + +This theorem is formally verified in the Rocq proof assistant (formerly Coq). The proof is part of the official Simplicity repository and has been machine-checked for correctness. + +While the completeness theorem guarantees that Simplicity's nine combinators are a sufficient foundation for any blockchain computation, resulting expressions from the lookup-table construction are impractically large. A function on 256-bit inputs would require a lookup table with 2²⁵⁶ entries. This is why the next chapters focus on building efficient expressions that exploit the structure of computations, rather than brute-forcing everything through lookup tables. + +### Conclusion + +Simplicity's core language includes a type system and combinators enabling any finite computation. While the Completeness theorem guarantees expressiveness, resulting expressions from the generic construction are impractically large. Practical Simplicity development involves exploiting computational structure for succinct expressions. The next chapters explore data structures, transaction interactions, and additional combinators. + +# From Data Types to Programs + +08528a6f-d310-4675-b8cd-4e9b93b3c009 + +## Building Data Types + +9981ae62-ae50-4770-adf2-b253d1e08de3 + +In the previous chapters, we showed how Simplicity's core set of combinators are enough to implement any finite pure computation. This chapter shows how to build practical data structures and computations from these primitives — the same way computers are built from logic gates. + +### Boolean Logic + +The Boolean type, denoted `𝟚`, equals `𝟙 + 𝟙` and has two values: `σᴸ⟨⟩` (false) and `σᴿ⟨⟩` (true). Using the core combinators, Boolean logic operators can be constructed. + +#### And Operation + +The logical `and : 𝟚 × 𝟚 ⊢ 𝟚` operation takes two bits and returns one bit. The implementation branches on the first bit: if false, return false; otherwise, return the second bit. + +``` +and ≔ case (injl unit) (drop iden) : 𝟚 × 𝟚 ⊢ 𝟚 +``` + +Testing with `⟨false, false⟩`: + +``` +⟦and⟧⟨false, false⟩ + = {expand the notation for false} +⟦and⟧⟨σᴸ⟨⟩, σᴸ⟨⟩⟩ + = {expand the definition of and} +⟦case (injl unit) (drop iden)⟧⟨σᴸ⟨⟩, σᴸ⟨⟩⟩ + = {evaluate case for σᴸ} +⟦injl unit⟧⟨⟨⟩, σᴸ⟨⟩⟩ + = {evaluate injl} +σᴸ(⟦unit⟧⟨⟨⟩, σᴸ⟨⟩⟩) + = {evaluate unit} +σᴸ⟨⟩ + = {by the notation for false} +false +``` + +Testing with `⟨true, true⟩`: + +``` +⟦and⟧⟨true, true⟩ + = {expand the notation for true and the definition of and} +⟦case (injl unit) (drop iden)⟧⟨σᴿ⟨⟩, σᴿ⟨⟩⟩ + = {evaluate case for σᴿ} +⟦drop iden⟧⟨⟨⟩, σᴿ⟨⟩⟩ + = {evaluate drop} +⟦iden⟧(σᴿ⟨⟩) + = {evaluate iden} +σᴿ⟨⟩ + = {by the notation for true} +true +``` + +#### Other Logic Operations + +The `not` operation requires a helper combinator: + +``` + f : A ⊢ C g : B ⊢ C +-------------------------------------------------------------- +copair f g ≔ iden ▵ unit ⨾ case (take f) (take g) : A + B ⊢ C +``` + +The initial `iden ▵ unit : A ⊢ A × 𝟙` adds an empty "environment" to the input, enabling the `case` combinator to apply. The use of `take` in the two branches drops this empty environment to execute `f` or `g`. + +Other Boolean logical operations: + +- `or ≔ case (drop iden) (injr unit) : 𝟚 × 𝟚 ⊢ 𝟚` +- `not ≔ copair (injr unit) (injl unit) : 𝟚 ⊢ 𝟚` +- `xor ≔ case (drop iden) (drop not) : 𝟚 × 𝟚 ⊢ 𝟚` + +### Bit Adders + +A "half-adder" takes two bits and adds them, producing a two-bit output: a carry bit and sum bit. + +``` +half-adder ≔ and ▵ xor : 𝟚 × 𝟚 ⊢ 𝟚 × 𝟚 +``` + +A "full-adder" adds three bits, producing two-bit output. The input uses nested tuple `(𝟚 × 𝟚) × 𝟚`. + +For nested tuples, compact notation is used: + +- `O f` denotes `take f` +- `I f` denotes `drop f` +- `H` denotes `iden` + +For example, `I O H` means `drop (take iden) : A × (B × C) ⊢ B`, extracting the middle value. The notation evokes binary digits: when thinking of nested tuples as binary trees, the notation represents reversed binary digits of tree positions. These expressions form De Bruijn indices for Simplicity. + +**Note:** The `I`, `O`, and `H` notation only applies to subexpressions consisting solely of `take`, `drop`, and `iden`. + +The full-adder composes two half-adders, taking logical `or` of the carry bits: + +``` +full-adder ≔ take half-adder ▵ I H + ⨾ O O H ▵ (O I H ▵ I H ⨾ half-adder) + ⨾ (O H ▵ I O H ⨾ or) ▵ I I H + : (𝟚 × 𝟚) × 𝟚 ⊢ 𝟚 × 𝟚 +``` + +In the first line, `take half-adder ▵ I H : (𝟚 × 𝟚) × 𝟚 ⊢ (𝟚 × 𝟚) × 𝟚` runs the half-adder on the first two bits, saving the last bit. + +In the second line, `O O H ▵ (O I H ▵ I H ⨾ half-adder) : (𝟚 × 𝟚) × 𝟚 ⊢ 𝟚 × (𝟚 × 𝟚)` saves the first bit (the carry-out of the first half-adder) and runs the half-adder on the last two bits. + +In the last line, `(O H ▵ I O H ⨾ or) ▵ I I H: 𝟚 × (𝟚 × 𝟚) ⊢ 𝟚 × 𝟚` takes the logical OR of the first two bits (carry-outs of both half-adders) and returns the sum-out bit of the second half-adder. + +This demonstrates Simplicity programming: using `I`, `O`, and `H` notation to reference data bits, forming suitable "environments" for calling other functions via sequential composition. + +Users don't define low-level operations directly. Later this series discusses standard library jets implementing common functions. End users aren't expected to program directly in Simplicity, similar to Bitcoin Script. Instead, higher-level languages like SimplicityHL generate Simplicity code, managing subexpression "environments" and translating named variables into appropriate `take` and `drop` sequences. + +### Vectors + +Fixed-length vectors are defined by forming iterated products of type `A`: + +- `A² ≔ A × A` +- `A⁴ ≔ A² × A²` +- `A⁸ ≔ A⁴ × A⁴` +- `…` + +These may be written as `A^2`, `A^4`, `A^8`, etc. + +Vectors are defined only for lengths that are powers of two. Other powers require choosing bracketing conventions. + +Given expression `f : A ⊢ B`, repeated pairing "maps" it over fixed-length vectors: + +- `f² ≔ f ▵ f : A² ⊢ B²` +- `f⁴ ≔ f² ▵ f² : A⁴ ⊢ B⁴` +- `f⁸ ≔ f⁴ ▵ f⁴ : A⁸ ⊢ B⁸` + +Given function `f : A × B ⊢ B`, iteration or "folding" over fixed-length vectors: + +- `fold-right-2 f ≔ O O H ▵ (O I H ▵ I H ⨾ f) ⨾ f : A² × B ⊢ B` +- `fold-right-4 f ≔ fold-right-2 (fold-right-2 f) : A⁴ × B ⊢ B` +- `fold-right-8 f ≔ fold-right-2 (fold-right-4 f) : A⁸ × B ⊢ B` + +Many variations exist. Given `f : A × B ⊢ C`, "zip" over paired vectors with `zip-n f : (Aⁿ × Bⁿ) ⊢ Cⁿ`. Given `f : (A × B) × C ⊢ C`, fold over paired vectors with `bifold-right-n f : (Aⁿ × Bⁿ) ⊢ C`. Combining `map` and `fold-right` creates accumulating combinators: `f : A × C ⊢ C × B` yields `map-accum-right-n f : Aⁿ × C ⊢ C × Bⁿ`. Many more variants are possible. + +#### Multi-bit Words + +A bit vector yields multi-bit integers. For example, `𝟚³²` is a 32-bit word type. `𝟚²⁵⁶` is a 256-bit word type, suitable for hashes and cryptographic operations. + +Using the full-adder, a variant of vector operations defines a "ripple carry adder" over multi-bit words: + +``` +full-adder-n ≔ zip-accum-right-n full-adder : (𝟚ⁿ × 𝟚ⁿ) × 𝟚 ⊢ 𝟚 × 𝟚ⁿ +``` + +`full-adder-n` takes two n-bit binary numbers and a one-bit carry-input, returning a one-bit carry-out flag and an n-bit sum. + +#### SHA-256 + +By recursively defining arithmetic operations on multi-bit words — subtraction, multiplication, division — and bit-wise logical operations such as logical AND, OR, XOR, and repeatedly combining these, even SHA-256's block compression function can be built: + +``` +sha256-hash-block ≔ … : 𝟚²⁵⁶ × 𝟚⁵¹² ⊢ 𝟚²⁵⁶ +``` + +The SHA-256 compression is formally defined using Simplicity within the Rocq proof assistant (formerly Coq), with a formal proof that the `sha256-hash-block` implementation is correct. + +The compression runs too slowly as raw Simplicity. Jets execute common functions like SHA-256 compression natively. Pure Simplicity implementations serve as formal specifications for jets. + +### Option Types + +Option types result from taking a sum with the unit type: + +``` +Option A ≔ 𝟙 + A +``` + +The type `Option A` may be written as `A?` or `𝕊 A` (where `𝕊` means "successor"). Functions map over option types: + +``` + f : A ⊢ B +------------------------------------------ +f? ≔ copair (injl unit) (injr f) : A? ⊢ B? +``` + +Monadic combinators such as bind can be defined: + +``` + f : A ⊢ B? +--------------------------------------- +bind f ≔ copair (injl unit) f : A? ⊢ B? +``` + +### Variable Length Buffers + +"Buffers" are types for partially filled vectors: + +- `Aᑉ² ≔ A?` +- `Aᑉ⁴ ≔ A²? × Aᑉ²` +- `Aᑉ⁸ ≔ A⁴? × Aᑉ⁴` +- `…` + +The type `Xᑉ⁸` expands to `(1 + X⁴) × ((1 + X²) × (1 + X))`. Treating this as a polynomial and expanding yields `1 + X + X² + X³ + X⁴ + X⁵ + X⁶ + X⁷`. Interpreting as a type, it represents the sum of all possible tuples of X up to 7, including the empty tuple. This is exactly the type of lists with length strictly less than 8. + +Like vectors, mapping and folding operations can be defined over buffers. Stack operations include `push-9eafe498-0765-419a-a69d-a74a9cdf3713 + +In the previous chapters, we showed how to build some data structures and computations using Simplicity's core set of combinators. As we noted, the core combinators are enough to implement any finite pure computation. This raises the question: what more can be achieved? We can add additional side effects to our expressions. + +There are various kinds of possible side effects for expressions: state update, writing to a log, throwing an exception, reading from an environment, calling a continuation, etc. The side effects available in Simplicity will depend on the application. + +For Bitcoin and Liquid applications, we currently have two side effects: the Failure effect, which is an exception effect where the exception has type `𝟙`, and the Reader effect which allows data from the transaction environment to be accessed. Our core combinators are "pure"; they have no side effects. However, jets can introduce new primitives that do have side effects. + +### Jets with Effects + +We will talk more about jets later in this series, but here we introduce a few example jets to illustrate their side effects. + +#### Bip0340-verify + +`bip0340-verify : (𝟚²⁵⁶ × 𝟚²⁵⁶) × 𝟚⁵¹² ⊢ 𝟙` is a jet for an expression that takes an x-only pubkey, a 256-bit message, and a Schnorr signature, and returns nothing! According to its type, it ought to behave the same as a `unit`. The difference lies in the jet's side effect: if the signature validation fails, then the entire computation is aborted by throwing an exception (of unit type). This is the Failure effect. + +#### Verify + +`verify : 𝟚 ⊢ 𝟙` is a barebones jet for expressing the Failure effect. If `verify`'s input is `false`, the entire computation is aborted, by throwing an exception. If the input is `true`, nothing is returned, but the computation can continue. + +#### Transaction Hashes + +`sig-all-hash : 𝟙 ⊢ 𝟚²⁵⁶` appears to be a constant function, since there is only one possible input value: the empty tuple. However, this jet reads from the transaction environment and produces a hash of transaction data that is analogous to the `SIGHASH_ALL` message digest used in Bitcoin Script's signature verification. This is an example of the Reader effect: the value returned depends on the transaction environment that the jet is executed within. There are several other hashing jets that hash various subsets of the transaction environment data to help build custom message digests for signatures. + +#### Introspection Jets + +`input-sequence : 𝟚³² ⊢ 𝟚³²?` is a function that takes an input index and returns the transaction's sequence number for that input, optionally returning nothing if the index is out of bounds. Again, the output value is not a pure function of the input index, but rather, the operation uses the Reader effect to access the transaction environment in order to determine the output value. There are several other introspection jets that return various fragments of the transaction environment data. + +### Classifying Effects + +Not all side effects are created equal. Some side effects behave nicer than others. We can classify effects by how amenable they are to program transformations. + +#### Commutative Effects + +A commutative effect is one where, if you swap the outputs of two expressions, you can safely swap the expressions themselves without changing the expression's effect. Consider `swap = I H ▵ O H : A × B ⊢ B × A`. If `f ▵ g ⨾ swap = g ▵ f` for every expression `f` and `g` with side effects, then the effects are commutative. + +Reading transaction data from the environment is a commutative effect because the result of reading from the environment is the same, no matter what order we execute the reading in. + +In general, throwing an exception is not a commutative effect. If `f` throws some exception `e₁` and `g` throws some other exception `e₂`, then which exception is thrown from the pair of `f` and `g` depends on the order they are executed in. + +However, in the special case of the Failure effect, in which only a unit typed exception can be thrown, the effect is commutative. No matter which of `f` or `g` throws an exception, the resulting exception will be the same, because there is only one possible exception value. + +#### Idempotent Effects + +An idempotent effect is one where, if you duplicate the output of an expression, you can safely duplicate the expression itself without changing the expression's effect. Consider `dup = iden ▵ iden : A ⊢ A × A`. If `f ⨾ dup = dup ⨾ f ▵ f` for every `f` with side effects, then the effects are idempotent. + +Reading transaction data from the environment is an idempotent effect. Throwing an exception is also an idempotent effect. Even though only one of the two duplicated expressions will be executed, any exception thrown by `dup ⨾ f ▵ f` will be the same as the exception thrown by `f ⨾ dup`. + +However, writing to a log may not be idempotent, as duplicating the effect would cause the log message to appear twice. However, if the log consists of a _set_ of messages instead of a _list_ of messages, then the effect would be idempotent (and commutative) because set insertion is itself an idempotent operation. + +#### Unitary Effects + +A unitary effect is one where, if you discard the output of an expression, you can safely discard the expression itself without changing the expression's effects. If it is always the case that `f ⨾ unit = unit` for every `f` with side effects, then your effects are unitary. + +Reading data from the environment is one of the few types of unitary effects. If the result of reading transaction data from the environment is discarded, the whole expression performing the read may be discarded. + +The failure effect isn't unitary. If `f` throws an exception then so will `f ⨾ unit`; execution will not even make it to the `unit` combinator before the computation is aborted. On the other hand, `unit` obviously would not throw any exception, so the effects of `f ⨾ unit` and `unit` would be different. + +### Effects Allowed in Simplicity + +The more well-behaved properties that a type of effect has, the more room a Simplicity optimizer has for transforming programs that use those effects. Ideally we would only allow effects that have all three properties: commutative, idempotent, and unitary. This would allow an optimizer to perform any sort of program transformation it would like. However, reading from an environment is the only effect that satisfies all three properties. + +Instead we demand that Simplicity effects are commutative and idempotent. Both the effects we use in Simplicity, the Failure effect and the Reader effect, are commutative and idempotent. This allows a large class of optimizations to be performed on Simplicity code. + +However, the "discard" transformation described above, attempting to replace `f ⨾ unit` with `unit`, or any similar transformation is not allowed if `f` may produce a Failure effect. Indeed, imagine if `f` contained a `bip0340-verify` assertion. It would be disastrous to attempt to optimize that check away. + +### Why Allow Side Effects At All? + +Why does Simplicity even allow side effects at all? Wouldn't it be better if every program took the entire transaction as input and returned a Boolean output that decides if a transaction is valid or not? + +#### Batch Verification + +One reason we have the Failure effect is to support batch verification of Schnorr signatures. In batch verification, many individual Schnorr signature checks are pooled together in such a way that if any single signature check fails, then the entire batch fails. + +This batching procedure improves efficiency over individually verifying each signature. The downside is that if the batch verification fails, then we do not learn which specific signature check or checks failed. + +By using the failure side effect, `bip0340-verify` ensures that if a signature check fails, the whole transaction fails. If `bip0340-verify` were instead to return `𝟚`, a Boolean type, for success or failure, then a failing signature check could still lead to a branch where the script succeeds. In such a case we would need to know if the particular signature is valid or not, and thus we wouldn't be able to take advantage of batch verification. + +#### Precomputed Transaction Data + +A problem in early Bitcoin Script was that the hashing function used to create message digests for signatures was linear in the size of the transaction. Typically every input creates at least one message digest for signature verification, so overall the amount of hashing was quadratic in the transaction size. + +This problem was fixed in Segwit and later iterations of Bitcoin Script by redefining the message digests so that they could be computed in constant time per signature check. This relies on having `PrecomputedTransactionData`, which precomputes hashes of transaction data once and is then shared by each input's sighash computations. Simplicity's transaction hashing jets rely on the same kind of precomputed transaction data in order to ensure the jets run in constant time. + +Suppose `sig-all-hash` didn't use the Reader effect. Suppose we somehow managed to build a Simplicity type for the transaction environment. Let's call it `TxEnv`, so that `sig-all-hash : TxEnv ⊢ 𝟚²⁵⁶` was the jet's type. Such a definition would require the `sig-all-hash` jet to be able to compute the hash of any transaction, not just the transaction it is involved with. Simplicity programs could copy the given `TxEnv` and pass a modified copy of it to `sig-all-hash`. In such a case `sig-all-hash` couldn't rely on `PrecomputedTransactionData`, and we would be back to requiring linear time in whatever transaction data was passed into this version of `sig-all-hash`. + +Because `sig-all-hash : 𝟙 ⊢ 𝟚²⁵⁶` uses the Reader effect to access the transaction data, it _only_ gets access to a fixed transaction environment. For that reason, the jet's implementation can safely use `PrecomputedTransactionData` and operate in constant time. + +### Cross-Input Signature Aggregation + +While neither Liquid nor Bitcoin support cross-input signature aggregation at this point in time, we would like to check that Simplicity can be compatible with it when the time comes. + +While details haven't been worked out, we imagine half-aggregation being implemented using a Writer effect. That is, a new jet with a type such as `half-agg-verify : (𝟚²⁵⁶ × 𝟚²⁵⁶) × 𝟚²⁵⁶ ⊢ 𝟙` would take a public key, message digest, and the `r`-component of a Schnorr signature (a Schnorr signature consists of an `r`-component and an `s`-component) and write it to a transaction log before continuing on with execution. Then, elsewhere in the transaction or with the transaction, an aggregate `s`-component for all half-aggregated Schnorr signatures would be provided. The transaction would only be valid when such an aggregate `s`-component is provided for all the logged keys, messages, and `r`-components. + +To meet Simplicity's requirements, this Writer effect needs to be idempotent and commutative. This can be ensured by treating the writer log as a set of key, message, `r`-component tuples. This works because set operations are idempotent and commutative. Treating the log as a set of values would be compatible with the half-aggregation verification algorithm. + +### Conclusion + +In this chapter we looked at adding side effects to the computations that Simplicity can do. We classified various kinds of effects according to how well-behaved they are with respect to various kinds of program transformation. We decided to restrict Simplicity's effects to those that are commutative and idempotent. + +The two effects we use for Bitcoin and Liquid applications are the Reader effect, for accessing the transaction environment, and the Failure effect, for aborting and failing the program. Some jets make use of primitive operations where these sorts of side effects can occur. + +The Failure effect determines the output of a Simplicity program: the program either fails, making the transaction invalid, or the program succeeds. The Reader effect provides one sort of input to a Simplicity program: the environment containing transaction data. But we also need to provide other inputs, such as digital signatures, to Simplicity programs. + +In the next chapter we will look at what Simplicity programs are, how they are turned into addresses, and how we add other inputs, such as signatures, to Simplicity programs. + +## Programs and Addresses + +961652e3-8f7d-4c2a-8b55-9a990b91a0dd + +In the previous chapter we described two side effects used in Simplicity: the Failure effect, which determines a program's success or failure, and the Reader effect, which provides access to the transaction environment. Now we turn to the practical question: what exactly is a Simplicity program, and how does it become an address on the blockchain? + +### Simplicity Programs + +A Simplicity program is defined as a Simplicity expression of type `𝟙 ⊢ 𝟙`. This type signature means the program takes no meaningful input (just the unit value) and produces no meaningful output (just the unit value). The Reader effect captures the transaction environment input, while the Failure effect indicates success or failure. These effects handle I/O rather than Simplicity types themselves. + +### Commitment Merkle Root + +Rather than storing complete programs on-chain, Bitcoin employs commitments — a practice extending from Pay-to-Script-Hash (P2SH). Simplicity uses a Commitment Merkle Root (CMR). + +Each combinator receives a SHA-256 tag derived from the pattern: `Simplicity␟Commitment␟[identifier]`, where `␟` represents ASCII code 31 (the unit separator). + +The specific tags for each combinator are: + +| Combinator | Tag | +|---|---| +| `iden` | `Simplicity␟Commitment␟iden` | +| `unit` | `Simplicity␟Commitment␟unit` | +| `comp` | `Simplicity␟Commitment␟comp` | +| `pair` | `Simplicity␟Commitment␟pair` | +| `case` | `Simplicity␟Commitment␟case` | +| `take` | `Simplicity␟Commitment␟take` | +| `drop` | `Simplicity␟Commitment␟drop` | +| `injl` | `Simplicity␟Commitment␟injl` | +| `injr` | `Simplicity␟Commitment␟injr` | + +The CMR calculation uses recursive hashing with tagged SHA-256 midstates. For the `unit` combinator, the CMR is computed by applying SHA-256 with the tag `Simplicity␟Commitment␟unit` and no additional input data. The resulting CMR for the trivial `unit` program is: + +``` +0xc40a10263f7436b4160acbef1c36fba4be4d95df181a968afeab5eac247adff7 +``` + +Critically, the CMR does not commit to the types of Simplicity expressions, relying instead on type inference during redemption. + +### Addresses + +Addresses employ BIP-0341's Taproot mechanism with CMRs committed under TapLeaf version `0xbe`. The process involves: + +1. Computing a TapLeaf tagged hash combining the version byte, CMR length, and CMR itself +2. Tweaking an internal public key (using a NUMS point when no key-spend path is desired) +3. Converting to bech32m format +4. Adding appropriate checksums + +The NUMS point (Non-Mundane Secret) is used for key-spend-less addresses, meaning addresses where there is no key-spend path and spending can only happen through the Simplicity script. + +### Witness Expressions + +A new combinator type addresses the absence of input to Simplicity programs: the witness expression. The `witness` combinator permits signature data and other witness material to be integrated into programs. + +``` +witness w : A ⊢ B +``` + +The witness expression's semantics is straightforward: it ignores its input and just returns the value `w`. Crucially, witness values are **excluded** from the expression's CMR, enabling address calculation before knowing witness values. + +This design choice supports pruning — unexecuted conditional branches needn't be revealed on-chain, including their associated witness expressions. When a branch is pruned, the verifier only needs the CMR of the pruned subtree, not its actual content. + +### Witness Values + +Witness values are provided at spending time (redemption), not at address creation time. This separation is fundamental to how Simplicity programs work: + +1. At **address creation time**: The program structure is committed via CMR, but witness values are left unspecified +2. At **spending time**: Witness values (signatures, preimages, etc.) are provided to complete the program + +This is analogous to how Bitcoin Script separates the scriptPubKey (committed at funding time) from the scriptSig/witness (provided at spending time). + +### Type Inference + +Since CMRs don't commit to types, the type system is reconstructed during redemption. Simplicity's type inference algorithm determines the minimal types for each subexpression based on the combinator structure. This means the same CMR can potentially be used at different types, though in practice the program structure constrains the types uniquely. + +### Conclusion + +In this chapter we established that Simplicity programs are expressions of type `𝟙 ⊢ 𝟙`, explained how Commitment Merkle Roots are constructed from tagged SHA-256 hashes of each combinator, and showed how CMRs are turned into on-chain addresses via BIP-0341 Taproot. We introduced witness expressions as the mechanism for providing signature data and other inputs at spending time without committing to their values at address creation time. + +# Final Section + +96952535-4aa6-4e78-91e2-d12e9df895d4 + +## Reviews & Ratings + +fb0b0133-39ea-497b-bd36-198be42c4fab +true + +## Final Exam + +2cc5e818-abcb-4a0a-9991-7a492c572e2d +true + +## Conclusion + +8ade24bd-a84f-4d25-8f64-bdfa8b58926c +true diff --git a/courses/scr401/quizz/000/en.yml b/courses/scr403/quizz/000/en.yml similarity index 100% rename from courses/scr401/quizz/000/en.yml rename to courses/scr403/quizz/000/en.yml diff --git a/courses/scr403/quizz/000/question.yml b/courses/scr403/quizz/000/question.yml new file mode 100644 index 00000000000..30e662413bd --- /dev/null +++ b/courses/scr403/quizz/000/question.yml @@ -0,0 +1,14 @@ +id: 35ccd3ce-33df-4542-91d9-a558d92548df +chapterId: 6d46e77a-7e60-473b-b230-418da5ae44eb +difficulty: medium +duration: 15 +author: PlanB Network +original_language: en + +proofreading: + - language: en + last_contribution_date: 2026-03-02 + urgency: 1 + contributor_names: + - rogzy + reward: 0 diff --git a/courses/scr401/quizz/001/en.yml b/courses/scr403/quizz/001/en.yml similarity index 100% rename from courses/scr401/quizz/001/en.yml rename to courses/scr403/quizz/001/en.yml diff --git a/courses/scr403/quizz/001/question.yml b/courses/scr403/quizz/001/question.yml new file mode 100644 index 00000000000..615cbdd3137 --- /dev/null +++ b/courses/scr403/quizz/001/question.yml @@ -0,0 +1,14 @@ +id: 5c6d0109-ffe1-4da5-813d-204c9f467111 +chapterId: 6d46e77a-7e60-473b-b230-418da5ae44eb +difficulty: medium +duration: 15 +author: PlanB Network +original_language: en + +proofreading: + - language: en + last_contribution_date: 2026-03-02 + urgency: 1 + contributor_names: + - rogzy + reward: 0 diff --git a/courses/scr401/quizz/002/en.yml b/courses/scr403/quizz/002/en.yml similarity index 100% rename from courses/scr401/quizz/002/en.yml rename to courses/scr403/quizz/002/en.yml diff --git a/courses/scr403/quizz/002/question.yml b/courses/scr403/quizz/002/question.yml new file mode 100644 index 00000000000..721f79ad241 --- /dev/null +++ b/courses/scr403/quizz/002/question.yml @@ -0,0 +1,14 @@ +id: 9428566d-1ead-4d47-ba46-6b636029c0ef +chapterId: 6d46e77a-7e60-473b-b230-418da5ae44eb +difficulty: medium +duration: 15 +author: PlanB Network +original_language: en + +proofreading: + - language: en + last_contribution_date: 2026-03-02 + urgency: 1 + contributor_names: + - rogzy + reward: 0 diff --git a/courses/scr401/quizz/003/en.yml b/courses/scr403/quizz/003/en.yml similarity index 100% rename from courses/scr401/quizz/003/en.yml rename to courses/scr403/quizz/003/en.yml diff --git a/courses/scr403/quizz/003/question.yml b/courses/scr403/quizz/003/question.yml new file mode 100644 index 00000000000..8633754a1af --- /dev/null +++ b/courses/scr403/quizz/003/question.yml @@ -0,0 +1,14 @@ +id: aa208130-3c60-4310-9867-dc6f80e8aba1 +chapterId: 2a10a6ba-fada-4556-a673-3ae8c0794bf0 +difficulty: medium +duration: 15 +author: PlanB Network +original_language: en + +proofreading: + - language: en + last_contribution_date: 2026-03-02 + urgency: 1 + contributor_names: + - rogzy + reward: 0 diff --git a/courses/scr401/quizz/004/en.yml b/courses/scr403/quizz/004/en.yml similarity index 100% rename from courses/scr401/quizz/004/en.yml rename to courses/scr403/quizz/004/en.yml diff --git a/courses/scr403/quizz/004/question.yml b/courses/scr403/quizz/004/question.yml new file mode 100644 index 00000000000..2e62f48e002 --- /dev/null +++ b/courses/scr403/quizz/004/question.yml @@ -0,0 +1,14 @@ +id: 54a868ea-e48c-4afc-a68a-f57b3d06c041 +chapterId: 2a10a6ba-fada-4556-a673-3ae8c0794bf0 +difficulty: medium +duration: 15 +author: PlanB Network +original_language: en + +proofreading: + - language: en + last_contribution_date: 2026-03-02 + urgency: 1 + contributor_names: + - rogzy + reward: 0 diff --git a/courses/scr401/quizz/005/en.yml b/courses/scr403/quizz/005/en.yml similarity index 100% rename from courses/scr401/quizz/005/en.yml rename to courses/scr403/quizz/005/en.yml diff --git a/courses/scr403/quizz/005/question.yml b/courses/scr403/quizz/005/question.yml new file mode 100644 index 00000000000..b9b4a834dba --- /dev/null +++ b/courses/scr403/quizz/005/question.yml @@ -0,0 +1,14 @@ +id: 3f77abbb-10d4-41c6-a269-ccf8e0c44ff5 +chapterId: 2a10a6ba-fada-4556-a673-3ae8c0794bf0 +difficulty: medium +duration: 15 +author: PlanB Network +original_language: en + +proofreading: + - language: en + last_contribution_date: 2026-03-02 + urgency: 1 + contributor_names: + - rogzy + reward: 0 diff --git a/courses/scr401/quizz/006/en.yml b/courses/scr403/quizz/006/en.yml similarity index 100% rename from courses/scr401/quizz/006/en.yml rename to courses/scr403/quizz/006/en.yml diff --git a/courses/scr403/quizz/006/question.yml b/courses/scr403/quizz/006/question.yml new file mode 100644 index 00000000000..0becbe92ba5 --- /dev/null +++ b/courses/scr403/quizz/006/question.yml @@ -0,0 +1,14 @@ +id: 963fde32-783e-4e20-8c3f-cae31bdcc2bf +chapterId: 2a10a6ba-fada-4556-a673-3ae8c0794bf0 +difficulty: medium +duration: 15 +author: PlanB Network +original_language: en + +proofreading: + - language: en + last_contribution_date: 2026-03-02 + urgency: 1 + contributor_names: + - rogzy + reward: 0 diff --git a/courses/scr401/quizz/007/en.yml b/courses/scr403/quizz/007/en.yml similarity index 100% rename from courses/scr401/quizz/007/en.yml rename to courses/scr403/quizz/007/en.yml diff --git a/courses/scr403/quizz/007/question.yml b/courses/scr403/quizz/007/question.yml new file mode 100644 index 00000000000..16b13c3f9a2 --- /dev/null +++ b/courses/scr403/quizz/007/question.yml @@ -0,0 +1,14 @@ +id: c0dc9faf-1c10-4082-82c3-e4b07e7217f9 +chapterId: 2a10a6ba-fada-4556-a673-3ae8c0794bf0 +difficulty: medium +duration: 15 +author: PlanB Network +original_language: en + +proofreading: + - language: en + last_contribution_date: 2026-03-02 + urgency: 1 + contributor_names: + - rogzy + reward: 0 diff --git a/courses/scr401/quizz/008/en.yml b/courses/scr403/quizz/008/en.yml similarity index 100% rename from courses/scr401/quizz/008/en.yml rename to courses/scr403/quizz/008/en.yml diff --git a/courses/scr403/quizz/008/question.yml b/courses/scr403/quizz/008/question.yml new file mode 100644 index 00000000000..1d3bdcd881b --- /dev/null +++ b/courses/scr403/quizz/008/question.yml @@ -0,0 +1,14 @@ +id: e5e0c93e-c244-4d00-ac35-7bc6e4533813 +chapterId: 9981ae62-ae50-4770-adf2-b253d1e08de3 +difficulty: medium +duration: 15 +author: PlanB Network +original_language: en + +proofreading: + - language: en + last_contribution_date: 2026-03-02 + urgency: 1 + contributor_names: + - rogzy + reward: 0 diff --git a/courses/scr401/quizz/009/en.yml b/courses/scr403/quizz/009/en.yml similarity index 100% rename from courses/scr401/quizz/009/en.yml rename to courses/scr403/quizz/009/en.yml diff --git a/courses/scr403/quizz/009/question.yml b/courses/scr403/quizz/009/question.yml new file mode 100644 index 00000000000..2f368648fea --- /dev/null +++ b/courses/scr403/quizz/009/question.yml @@ -0,0 +1,14 @@ +id: 6d167e33-3e10-4e7a-8919-6565f929eb8d +chapterId: 9981ae62-ae50-4770-adf2-b253d1e08de3 +difficulty: medium +duration: 15 +author: PlanB Network +original_language: en + +proofreading: + - language: en + last_contribution_date: 2026-03-02 + urgency: 1 + contributor_names: + - rogzy + reward: 0 diff --git a/courses/scr401/quizz/010/en.yml b/courses/scr403/quizz/010/en.yml similarity index 100% rename from courses/scr401/quizz/010/en.yml rename to courses/scr403/quizz/010/en.yml diff --git a/courses/scr403/quizz/010/question.yml b/courses/scr403/quizz/010/question.yml new file mode 100644 index 00000000000..0725e81f830 --- /dev/null +++ b/courses/scr403/quizz/010/question.yml @@ -0,0 +1,14 @@ +id: 582e5a78-71f9-4dca-87f0-bdcc65c5179b +chapterId: 9981ae62-ae50-4770-adf2-b253d1e08de3 +difficulty: medium +duration: 15 +author: PlanB Network +original_language: en + +proofreading: + - language: en + last_contribution_date: 2026-03-02 + urgency: 1 + contributor_names: + - rogzy + reward: 0 diff --git a/courses/scr401/quizz/011/en.yml b/courses/scr403/quizz/011/en.yml similarity index 100% rename from courses/scr401/quizz/011/en.yml rename to courses/scr403/quizz/011/en.yml diff --git a/courses/scr403/quizz/011/question.yml b/courses/scr403/quizz/011/question.yml new file mode 100644 index 00000000000..acb3f14c44d --- /dev/null +++ b/courses/scr403/quizz/011/question.yml @@ -0,0 +1,14 @@ +id: 1a8a9923-3600-446e-afd9-299c3bff7f9d +chapterId: 9981ae62-ae50-4770-adf2-b253d1e08de3 +difficulty: medium +duration: 15 +author: PlanB Network +original_language: en + +proofreading: + - language: en + last_contribution_date: 2026-03-02 + urgency: 1 + contributor_names: + - rogzy + reward: 0 diff --git a/courses/scr401/quizz/012/en.yml b/courses/scr403/quizz/012/en.yml similarity index 100% rename from courses/scr401/quizz/012/en.yml rename to courses/scr403/quizz/012/en.yml diff --git a/courses/scr403/quizz/012/question.yml b/courses/scr403/quizz/012/question.yml new file mode 100644 index 00000000000..1346296fa88 --- /dev/null +++ b/courses/scr403/quizz/012/question.yml @@ -0,0 +1,14 @@ +id: b5e01b45-f621-429b-abee-c748b73739fd +chapterId: 9981ae62-ae50-4770-adf2-b253d1e08de3 +difficulty: medium +duration: 15 +author: PlanB Network +original_language: en + +proofreading: + - language: en + last_contribution_date: 2026-03-02 + urgency: 1 + contributor_names: + - rogzy + reward: 0 diff --git a/courses/scr401/quizz/013/en.yml b/courses/scr403/quizz/013/en.yml similarity index 100% rename from courses/scr401/quizz/013/en.yml rename to courses/scr403/quizz/013/en.yml diff --git a/courses/scr403/quizz/013/question.yml b/courses/scr403/quizz/013/question.yml new file mode 100644 index 00000000000..3d81573b3d1 --- /dev/null +++ b/courses/scr403/quizz/013/question.yml @@ -0,0 +1,14 @@ +id: 0c2c49a2-3766-467a-8ab4-c16c15a5dd60 +chapterId: 6d46e77a-7e60-473b-b230-418da5ae44eb +difficulty: medium +duration: 15 +author: PlanB Network +original_language: en + +proofreading: + - language: en + last_contribution_date: 2026-03-02 + urgency: 1 + contributor_names: + - rogzy + reward: 0 diff --git a/courses/scr401/quizz/014/en.yml b/courses/scr403/quizz/014/en.yml similarity index 100% rename from courses/scr401/quizz/014/en.yml rename to courses/scr403/quizz/014/en.yml diff --git a/courses/scr403/quizz/014/question.yml b/courses/scr403/quizz/014/question.yml new file mode 100644 index 00000000000..8b37e41a90c --- /dev/null +++ b/courses/scr403/quizz/014/question.yml @@ -0,0 +1,14 @@ +id: d92a0b52-981d-4a4b-b245-4a6b0c0ac328 +chapterId: 2a10a6ba-fada-4556-a673-3ae8c0794bf0 +difficulty: medium +duration: 15 +author: PlanB Network +original_language: en + +proofreading: + - language: en + last_contribution_date: 2026-03-02 + urgency: 1 + contributor_names: + - rogzy + reward: 0 diff --git a/courses/scr401/quizz/015/en.yml b/courses/scr403/quizz/015/en.yml similarity index 100% rename from courses/scr401/quizz/015/en.yml rename to courses/scr403/quizz/015/en.yml diff --git a/courses/scr403/quizz/015/question.yml b/courses/scr403/quizz/015/question.yml new file mode 100644 index 00000000000..90aadbb5248 --- /dev/null +++ b/courses/scr403/quizz/015/question.yml @@ -0,0 +1,14 @@ +id: 8b4ee208-b723-41c4-af9c-0d30b10132fb +chapterId: 2a10a6ba-fada-4556-a673-3ae8c0794bf0 +difficulty: medium +duration: 15 +author: PlanB Network +original_language: en + +proofreading: + - language: en + last_contribution_date: 2026-03-02 + urgency: 1 + contributor_names: + - rogzy + reward: 0 diff --git a/courses/scr401/quizz/016/en.yml b/courses/scr403/quizz/016/en.yml similarity index 100% rename from courses/scr401/quizz/016/en.yml rename to courses/scr403/quizz/016/en.yml diff --git a/courses/scr403/quizz/016/question.yml b/courses/scr403/quizz/016/question.yml new file mode 100644 index 00000000000..cc5257cf071 --- /dev/null +++ b/courses/scr403/quizz/016/question.yml @@ -0,0 +1,14 @@ +id: c4df1bd0-8d1c-4f71-ac5a-ebf3be1f4a51 +chapterId: 2a10a6ba-fada-4556-a673-3ae8c0794bf0 +difficulty: medium +duration: 15 +author: PlanB Network +original_language: en + +proofreading: + - language: en + last_contribution_date: 2026-03-02 + urgency: 1 + contributor_names: + - rogzy + reward: 0 diff --git a/courses/scr401/quizz/017/en.yml b/courses/scr403/quizz/017/en.yml similarity index 100% rename from courses/scr401/quizz/017/en.yml rename to courses/scr403/quizz/017/en.yml diff --git a/courses/scr403/quizz/017/question.yml b/courses/scr403/quizz/017/question.yml new file mode 100644 index 00000000000..f99b53725ec --- /dev/null +++ b/courses/scr403/quizz/017/question.yml @@ -0,0 +1,14 @@ +id: f88741e5-8019-427f-80d4-de0616a2bd9a +chapterId: 9981ae62-ae50-4770-adf2-b253d1e08de3 +difficulty: medium +duration: 15 +author: PlanB Network +original_language: en + +proofreading: + - language: en + last_contribution_date: 2026-03-02 + urgency: 1 + contributor_names: + - rogzy + reward: 0 diff --git a/courses/scr401/quizz/018/en.yml b/courses/scr403/quizz/018/en.yml similarity index 100% rename from courses/scr401/quizz/018/en.yml rename to courses/scr403/quizz/018/en.yml diff --git a/courses/scr403/quizz/018/question.yml b/courses/scr403/quizz/018/question.yml new file mode 100644 index 00000000000..01f8023a480 --- /dev/null +++ b/courses/scr403/quizz/018/question.yml @@ -0,0 +1,14 @@ +id: 8ecab257-d521-437a-ad11-bb6d2020b0f1 +chapterId: 9981ae62-ae50-4770-adf2-b253d1e08de3 +difficulty: medium +duration: 15 +author: PlanB Network +original_language: en + +proofreading: + - language: en + last_contribution_date: 2026-03-02 + urgency: 1 + contributor_names: + - rogzy + reward: 0 diff --git a/courses/scr401/quizz/019/en.yml b/courses/scr403/quizz/019/en.yml similarity index 100% rename from courses/scr401/quizz/019/en.yml rename to courses/scr403/quizz/019/en.yml diff --git a/courses/scr403/quizz/019/question.yml b/courses/scr403/quizz/019/question.yml new file mode 100644 index 00000000000..0cbf0c7253e --- /dev/null +++ b/courses/scr403/quizz/019/question.yml @@ -0,0 +1,14 @@ +id: b4130b1d-4f08-4543-948c-3c2095cd110f +chapterId: 9981ae62-ae50-4770-adf2-b253d1e08de3 +difficulty: medium +duration: 15 +author: PlanB Network +original_language: en + +proofreading: + - language: en + last_contribution_date: 2026-03-02 + urgency: 1 + contributor_names: + - rogzy + reward: 0 diff --git a/courses/scr403/quizz/020/en.yml b/courses/scr403/quizz/020/en.yml new file mode 100644 index 00000000000..39053db5baf --- /dev/null +++ b/courses/scr403/quizz/020/en.yml @@ -0,0 +1,12 @@ +question: "What are the two side effects used in Simplicity for Bitcoin and Liquid applications?" +answer: "The Failure effect (an exception of type 1) and the Reader effect (access to transaction environment data)." +wrong_answers: + - "The State effect (mutable variables) and the Writer effect (logging to a transaction log)." + - "The IO effect (network communication) and the Memory effect (dynamic memory allocation)." + - "The Continuation effect (callbacks) and the Nondeterminism effect (multiple execution paths)." +explanation: >- + Simplicity uses exactly two side effects for blockchain applications. The Failure effect allows + computations to abort (e.g., when a signature check fails), and the Reader effect allows + expressions to read data from the transaction environment. The core combinators remain pure — + side effects are introduced through jets. +reviewed: true diff --git a/courses/scr403/quizz/020/question.yml b/courses/scr403/quizz/020/question.yml new file mode 100644 index 00000000000..e8e2b850afa --- /dev/null +++ b/courses/scr403/quizz/020/question.yml @@ -0,0 +1,14 @@ +id: db95b84e-6529-4422-aae2-3d6f8a789013 +chapterId: 9eafe498-0765-419a-a69d-a74a9cdf3713 +difficulty: medium +duration: 15 +author: PlanB Network +original_language: en + +proofreading: + - language: en + last_contribution_date: 2026-03-02 + urgency: 1 + contributor_names: + - rogzy + reward: 0 diff --git a/courses/scr403/quizz/021/en.yml b/courses/scr403/quizz/021/en.yml new file mode 100644 index 00000000000..ae858cf62ad --- /dev/null +++ b/courses/scr403/quizz/021/en.yml @@ -0,0 +1,12 @@ +question: "Why is the Failure effect commutative in Simplicity, even though exceptions are generally not commutative?" +answer: "Because the exception type is unit (1), so there is only one possible exception value — no matter which expression throws, the result is the same." +wrong_answers: + - "Because Simplicity executes all expressions in a deterministic order defined by the combinator tree." + - "Because the Failure effect is always caught and re-thrown by the case combinator." + - "Because Simplicity uses batch verification which makes all exceptions equivalent." +explanation: >- + In general, exceptions are not commutative because different expressions may throw different + exception values. However, Simplicity restricts exceptions to unit type (only one possible value), + so swapping the order of two potentially-failing expressions produces the same exception regardless + of which one actually fails. This commutativity property enables important program optimizations. +reviewed: true diff --git a/courses/scr403/quizz/021/question.yml b/courses/scr403/quizz/021/question.yml new file mode 100644 index 00000000000..2477a2dc105 --- /dev/null +++ b/courses/scr403/quizz/021/question.yml @@ -0,0 +1,14 @@ +id: b5e36dfe-d941-4041-ba23-dc1643d7abc9 +chapterId: 9eafe498-0765-419a-a69d-a74a9cdf3713 +difficulty: medium +duration: 15 +author: PlanB Network +original_language: en + +proofreading: + - language: en + last_contribution_date: 2026-03-02 + urgency: 1 + contributor_names: + - rogzy + reward: 0 diff --git a/courses/scr403/quizz/022/en.yml b/courses/scr403/quizz/022/en.yml new file mode 100644 index 00000000000..a32b6bb3e99 --- /dev/null +++ b/courses/scr403/quizz/022/en.yml @@ -0,0 +1,12 @@ +question: "Why does bip0340-verify use the Failure effect instead of returning a boolean (true/false)?" +answer: "To enable batch verification of Schnorr signatures, which requires that any single failed check causes the entire batch to fail." +wrong_answers: + - "Because boolean types are too expensive in terms of block space compared to the unit type." + - "Because Simplicity's type system cannot represent boolean return values from jets." + - "Because returning a boolean would violate the completeness theorem." +explanation: >- + If bip0340-verify returned a boolean, a failing signature check could still lead to a branch where + the script succeeds. In that case, the verifier would need to know which specific signature + failed, preventing batch verification. By using the Failure effect, a failed check always aborts + the entire computation, enabling efficient batch verification where many signatures are pooled together. +reviewed: true diff --git a/courses/scr403/quizz/022/question.yml b/courses/scr403/quizz/022/question.yml new file mode 100644 index 00000000000..fac5dd66c2d --- /dev/null +++ b/courses/scr403/quizz/022/question.yml @@ -0,0 +1,14 @@ +id: 04d17f4c-1e95-4c2e-8e40-c9b84cf75b2f +chapterId: 9eafe498-0765-419a-a69d-a74a9cdf3713 +difficulty: medium +duration: 15 +author: PlanB Network +original_language: en + +proofreading: + - language: en + last_contribution_date: 2026-03-02 + urgency: 1 + contributor_names: + - rogzy + reward: 0 diff --git a/courses/scr403/quizz/023/en.yml b/courses/scr403/quizz/023/en.yml new file mode 100644 index 00000000000..62cc510178a --- /dev/null +++ b/courses/scr403/quizz/023/en.yml @@ -0,0 +1,13 @@ +question: "Why does sig-all-hash use the Reader effect instead of taking the transaction data as a typed input?" +answer: "So the jet can rely on PrecomputedTransactionData and operate in constant time, since it only accesses a fixed transaction environment." +wrong_answers: + - "Because Simplicity's type system cannot represent transaction data as a type." + - "Because the Reader effect is faster than passing data through the combinator tree." + - "Because transaction data is too large to fit in Simplicity's fixed-size type system." +explanation: >- + If sig-all-hash took a TxEnv input type, programs could pass modified copies of transaction data + to the jet, preventing it from using precomputed hashes. With the Reader effect, the jet only + accesses a fixed, immutable transaction environment, so its implementation can safely use + PrecomputedTransactionData and run in constant time per signature check, avoiding the quadratic + hashing problem that plagued early Bitcoin Script. +reviewed: true diff --git a/courses/scr403/quizz/023/question.yml b/courses/scr403/quizz/023/question.yml new file mode 100644 index 00000000000..13de351a22a --- /dev/null +++ b/courses/scr403/quizz/023/question.yml @@ -0,0 +1,14 @@ +id: 0b2a2848-cb65-46e2-be56-e98513794786 +chapterId: 9eafe498-0765-419a-a69d-a74a9cdf3713 +difficulty: medium +duration: 15 +author: PlanB Network +original_language: en + +proofreading: + - language: en + last_contribution_date: 2026-03-02 + urgency: 1 + contributor_names: + - rogzy + reward: 0 diff --git a/courses/scr403/quizz/024/en.yml b/courses/scr403/quizz/024/en.yml new file mode 100644 index 00000000000..3374ea14502 --- /dev/null +++ b/courses/scr403/quizz/024/en.yml @@ -0,0 +1,11 @@ +question: "What is the type of a Simplicity program?" +answer: "1 ⊢ 1 (unit to unit) — it takes no meaningful input and produces no meaningful output, using side effects for I/O." +wrong_answers: + - "TxEnv ⊢ Bool — it takes transaction data and returns a validity boolean." + - "2^256 ⊢ 2^256 — it takes a hash input and returns a hash output." + - "Any type A ⊢ B — programs can have arbitrary input and output types." +explanation: >- + A Simplicity program is defined as an expression of type 1 ⊢ 1. The Reader effect captures + the transaction environment input, while the Failure effect determines success or failure. + These side effects handle all the I/O rather than the Simplicity types themselves. +reviewed: true diff --git a/courses/scr403/quizz/024/question.yml b/courses/scr403/quizz/024/question.yml new file mode 100644 index 00000000000..4fef870eb3e --- /dev/null +++ b/courses/scr403/quizz/024/question.yml @@ -0,0 +1,14 @@ +id: bbc1725b-94ae-42ea-85cc-4e40087a985a +chapterId: 961652e3-8f7d-4c2a-8b55-9a990b91a0dd +difficulty: medium +duration: 15 +author: PlanB Network +original_language: en + +proofreading: + - language: en + last_contribution_date: 2026-03-02 + urgency: 1 + contributor_names: + - rogzy + reward: 0 diff --git a/courses/scr403/quizz/025/en.yml b/courses/scr403/quizz/025/en.yml new file mode 100644 index 00000000000..bc9564cf27b --- /dev/null +++ b/courses/scr403/quizz/025/en.yml @@ -0,0 +1,12 @@ +question: "What is a Commitment Merkle Root (CMR) in Simplicity?" +answer: "A 256-bit hash that commits to the structure of a Simplicity program using tagged SHA-256 for each combinator." +wrong_answers: + - "A binary tree containing all possible execution paths of a Simplicity program." + - "A hash of the program's types and witness values used for address verification." + - "A Merkle root of the transaction data that the program is authorized to access." +explanation: >- + Each Simplicity combinator has a unique SHA-256 tag (e.g., Simplicity␟Commitment␟iden), and the + CMR is computed by recursively hashing the program's combinator tree using these tagged midstates. + Importantly, the CMR does not commit to the types of expressions, relying on type inference + during redemption. CMRs are used to commit programs into Taproot addresses. +reviewed: true diff --git a/courses/scr403/quizz/025/question.yml b/courses/scr403/quizz/025/question.yml new file mode 100644 index 00000000000..f763f6970dd --- /dev/null +++ b/courses/scr403/quizz/025/question.yml @@ -0,0 +1,14 @@ +id: e9f7f36d-e07d-4ad2-9d12-845c0b5f63bb +chapterId: 961652e3-8f7d-4c2a-8b55-9a990b91a0dd +difficulty: medium +duration: 15 +author: PlanB Network +original_language: en + +proofreading: + - language: en + last_contribution_date: 2026-03-02 + urgency: 1 + contributor_names: + - rogzy + reward: 0 diff --git a/courses/scr403/quizz/026/en.yml b/courses/scr403/quizz/026/en.yml new file mode 100644 index 00000000000..5887ce6d238 --- /dev/null +++ b/courses/scr403/quizz/026/en.yml @@ -0,0 +1,11 @@ +question: "What TapLeaf version does Simplicity use when committed under BIP-0341 Taproot?" +answer: "Version 0xbe." +wrong_answers: + - "Version 0xc0, the same as Bitcoin Script Tapscript." + - "Version 0x00, the default Taproot version." + - "Version 0xff, a reserved version for experimental scripts." +explanation: >- + Simplicity programs are committed into Taproot addresses using TapLeaf version 0xbe. This + distinguishes Simplicity scripts from Bitcoin Tapscript (which uses version 0xc0) and allows + the network to identify and validate Simplicity programs correctly when they appear on-chain. +reviewed: true diff --git a/courses/scr403/quizz/026/question.yml b/courses/scr403/quizz/026/question.yml new file mode 100644 index 00000000000..1191b9e498c --- /dev/null +++ b/courses/scr403/quizz/026/question.yml @@ -0,0 +1,14 @@ +id: 55d95b1b-18e0-4ac0-b5d2-e5f18ea365a0 +chapterId: 961652e3-8f7d-4c2a-8b55-9a990b91a0dd +difficulty: medium +duration: 15 +author: PlanB Network +original_language: en + +proofreading: + - language: en + last_contribution_date: 2026-03-02 + urgency: 1 + contributor_names: + - rogzy + reward: 0 diff --git a/courses/scr403/quizz/027/en.yml b/courses/scr403/quizz/027/en.yml new file mode 100644 index 00000000000..5f0baaad28b --- /dev/null +++ b/courses/scr403/quizz/027/en.yml @@ -0,0 +1,12 @@ +question: "Why are witness values excluded from the Commitment Merkle Root (CMR)?" +answer: "So that addresses can be calculated before knowing witness values, and unexecuted branches can be pruned without revealing their witness data." +wrong_answers: + - "Because witness values are too large to include in a 256-bit hash." + - "Because witness values are validated separately by the Failure effect." + - "Because including witness values would make the CMR non-deterministic." +explanation: >- + Witness expressions (like signatures) are provided at spending time, not at address creation time. + Excluding them from the CMR enables two important properties: addresses can be generated before + the spending transaction exists, and unexecuted conditional branches can be pruned from the + on-chain data without revealing their associated witness values. +reviewed: true diff --git a/courses/scr403/quizz/027/question.yml b/courses/scr403/quizz/027/question.yml new file mode 100644 index 00000000000..c2e9157ba2f --- /dev/null +++ b/courses/scr403/quizz/027/question.yml @@ -0,0 +1,14 @@ +id: a81a36bd-d3da-4205-886b-3b66bc82fa1f +chapterId: 961652e3-8f7d-4c2a-8b55-9a990b91a0dd +difficulty: medium +duration: 15 +author: PlanB Network +original_language: en + +proofreading: + - language: en + last_contribution_date: 2026-03-02 + urgency: 1 + contributor_names: + - rogzy + reward: 0 From 031577167695816c9ebdf13852bb297078ddb929 Mon Sep 17 00:00:00 2001 From: Rogzy Date: Mon, 2 Mar 2026 22:33:46 +0100 Subject: [PATCH 06/14] local content update From 2de6afa19d892a476da4073416edfb4338b8d014 Mon Sep 17 00:00:00 2001 From: Rogzy Date: Tue, 3 Mar 2026 20:17:57 +0100 Subject: [PATCH 07/14] refactor(scr403): move all 28 quiz questions to final exam pool MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Remove per-chapter quizzes — expert-level theoretical course doesn't need checkpoint quizzes. Final exam draws 20 from the 28-question pool. Co-Authored-By: Claude Opus 4.6 --- courses/scr403/quizz/000/question.yml | 2 +- courses/scr403/quizz/001/question.yml | 2 +- courses/scr403/quizz/002/question.yml | 2 +- courses/scr403/quizz/003/question.yml | 2 +- courses/scr403/quizz/004/question.yml | 2 +- courses/scr403/quizz/005/question.yml | 2 +- courses/scr403/quizz/006/question.yml | 2 +- courses/scr403/quizz/007/question.yml | 2 +- courses/scr403/quizz/008/question.yml | 2 +- courses/scr403/quizz/009/question.yml | 2 +- courses/scr403/quizz/010/question.yml | 2 +- courses/scr403/quizz/011/question.yml | 2 +- courses/scr403/quizz/012/question.yml | 2 +- courses/scr403/quizz/013/question.yml | 2 +- courses/scr403/quizz/014/question.yml | 2 +- courses/scr403/quizz/015/question.yml | 2 +- courses/scr403/quizz/016/question.yml | 2 +- courses/scr403/quizz/017/question.yml | 2 +- courses/scr403/quizz/018/question.yml | 2 +- courses/scr403/quizz/019/question.yml | 2 +- courses/scr403/quizz/020/question.yml | 2 +- courses/scr403/quizz/021/question.yml | 2 +- courses/scr403/quizz/022/question.yml | 2 +- courses/scr403/quizz/023/question.yml | 2 +- courses/scr403/quizz/024/question.yml | 2 +- courses/scr403/quizz/025/question.yml | 2 +- courses/scr403/quizz/026/question.yml | 2 +- courses/scr403/quizz/027/question.yml | 2 +- 28 files changed, 28 insertions(+), 28 deletions(-) diff --git a/courses/scr403/quizz/000/question.yml b/courses/scr403/quizz/000/question.yml index 30e662413bd..b67c650fe75 100644 --- a/courses/scr403/quizz/000/question.yml +++ b/courses/scr403/quizz/000/question.yml @@ -1,5 +1,5 @@ id: 35ccd3ce-33df-4542-91d9-a558d92548df -chapterId: 6d46e77a-7e60-473b-b230-418da5ae44eb +chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d difficulty: medium duration: 15 author: PlanB Network diff --git a/courses/scr403/quizz/001/question.yml b/courses/scr403/quizz/001/question.yml index 615cbdd3137..b38596c3fff 100644 --- a/courses/scr403/quizz/001/question.yml +++ b/courses/scr403/quizz/001/question.yml @@ -1,5 +1,5 @@ id: 5c6d0109-ffe1-4da5-813d-204c9f467111 -chapterId: 6d46e77a-7e60-473b-b230-418da5ae44eb +chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d difficulty: medium duration: 15 author: PlanB Network diff --git a/courses/scr403/quizz/002/question.yml b/courses/scr403/quizz/002/question.yml index 721f79ad241..2eaf850bf29 100644 --- a/courses/scr403/quizz/002/question.yml +++ b/courses/scr403/quizz/002/question.yml @@ -1,5 +1,5 @@ id: 9428566d-1ead-4d47-ba46-6b636029c0ef -chapterId: 6d46e77a-7e60-473b-b230-418da5ae44eb +chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d difficulty: medium duration: 15 author: PlanB Network diff --git a/courses/scr403/quizz/003/question.yml b/courses/scr403/quizz/003/question.yml index 8633754a1af..579aa4d68b2 100644 --- a/courses/scr403/quizz/003/question.yml +++ b/courses/scr403/quizz/003/question.yml @@ -1,5 +1,5 @@ id: aa208130-3c60-4310-9867-dc6f80e8aba1 -chapterId: 2a10a6ba-fada-4556-a673-3ae8c0794bf0 +chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d difficulty: medium duration: 15 author: PlanB Network diff --git a/courses/scr403/quizz/004/question.yml b/courses/scr403/quizz/004/question.yml index 2e62f48e002..ecb9e260657 100644 --- a/courses/scr403/quizz/004/question.yml +++ b/courses/scr403/quizz/004/question.yml @@ -1,5 +1,5 @@ id: 54a868ea-e48c-4afc-a68a-f57b3d06c041 -chapterId: 2a10a6ba-fada-4556-a673-3ae8c0794bf0 +chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d difficulty: medium duration: 15 author: PlanB Network diff --git a/courses/scr403/quizz/005/question.yml b/courses/scr403/quizz/005/question.yml index b9b4a834dba..874f7ae9a78 100644 --- a/courses/scr403/quizz/005/question.yml +++ b/courses/scr403/quizz/005/question.yml @@ -1,5 +1,5 @@ id: 3f77abbb-10d4-41c6-a269-ccf8e0c44ff5 -chapterId: 2a10a6ba-fada-4556-a673-3ae8c0794bf0 +chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d difficulty: medium duration: 15 author: PlanB Network diff --git a/courses/scr403/quizz/006/question.yml b/courses/scr403/quizz/006/question.yml index 0becbe92ba5..7663dbb3974 100644 --- a/courses/scr403/quizz/006/question.yml +++ b/courses/scr403/quizz/006/question.yml @@ -1,5 +1,5 @@ id: 963fde32-783e-4e20-8c3f-cae31bdcc2bf -chapterId: 2a10a6ba-fada-4556-a673-3ae8c0794bf0 +chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d difficulty: medium duration: 15 author: PlanB Network diff --git a/courses/scr403/quizz/007/question.yml b/courses/scr403/quizz/007/question.yml index 16b13c3f9a2..7417fa9ae90 100644 --- a/courses/scr403/quizz/007/question.yml +++ b/courses/scr403/quizz/007/question.yml @@ -1,5 +1,5 @@ id: c0dc9faf-1c10-4082-82c3-e4b07e7217f9 -chapterId: 2a10a6ba-fada-4556-a673-3ae8c0794bf0 +chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d difficulty: medium duration: 15 author: PlanB Network diff --git a/courses/scr403/quizz/008/question.yml b/courses/scr403/quizz/008/question.yml index 1d3bdcd881b..c4dee51d83c 100644 --- a/courses/scr403/quizz/008/question.yml +++ b/courses/scr403/quizz/008/question.yml @@ -1,5 +1,5 @@ id: e5e0c93e-c244-4d00-ac35-7bc6e4533813 -chapterId: 9981ae62-ae50-4770-adf2-b253d1e08de3 +chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d difficulty: medium duration: 15 author: PlanB Network diff --git a/courses/scr403/quizz/009/question.yml b/courses/scr403/quizz/009/question.yml index 2f368648fea..8eea0fb1b19 100644 --- a/courses/scr403/quizz/009/question.yml +++ b/courses/scr403/quizz/009/question.yml @@ -1,5 +1,5 @@ id: 6d167e33-3e10-4e7a-8919-6565f929eb8d -chapterId: 9981ae62-ae50-4770-adf2-b253d1e08de3 +chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d difficulty: medium duration: 15 author: PlanB Network diff --git a/courses/scr403/quizz/010/question.yml b/courses/scr403/quizz/010/question.yml index 0725e81f830..19d14a612e1 100644 --- a/courses/scr403/quizz/010/question.yml +++ b/courses/scr403/quizz/010/question.yml @@ -1,5 +1,5 @@ id: 582e5a78-71f9-4dca-87f0-bdcc65c5179b -chapterId: 9981ae62-ae50-4770-adf2-b253d1e08de3 +chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d difficulty: medium duration: 15 author: PlanB Network diff --git a/courses/scr403/quizz/011/question.yml b/courses/scr403/quizz/011/question.yml index acb3f14c44d..ea5ad7b057a 100644 --- a/courses/scr403/quizz/011/question.yml +++ b/courses/scr403/quizz/011/question.yml @@ -1,5 +1,5 @@ id: 1a8a9923-3600-446e-afd9-299c3bff7f9d -chapterId: 9981ae62-ae50-4770-adf2-b253d1e08de3 +chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d difficulty: medium duration: 15 author: PlanB Network diff --git a/courses/scr403/quizz/012/question.yml b/courses/scr403/quizz/012/question.yml index 1346296fa88..b1e99ebd638 100644 --- a/courses/scr403/quizz/012/question.yml +++ b/courses/scr403/quizz/012/question.yml @@ -1,5 +1,5 @@ id: b5e01b45-f621-429b-abee-c748b73739fd -chapterId: 9981ae62-ae50-4770-adf2-b253d1e08de3 +chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d difficulty: medium duration: 15 author: PlanB Network diff --git a/courses/scr403/quizz/013/question.yml b/courses/scr403/quizz/013/question.yml index 3d81573b3d1..00a88614982 100644 --- a/courses/scr403/quizz/013/question.yml +++ b/courses/scr403/quizz/013/question.yml @@ -1,5 +1,5 @@ id: 0c2c49a2-3766-467a-8ab4-c16c15a5dd60 -chapterId: 6d46e77a-7e60-473b-b230-418da5ae44eb +chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d difficulty: medium duration: 15 author: PlanB Network diff --git a/courses/scr403/quizz/014/question.yml b/courses/scr403/quizz/014/question.yml index 8b37e41a90c..263d641d170 100644 --- a/courses/scr403/quizz/014/question.yml +++ b/courses/scr403/quizz/014/question.yml @@ -1,5 +1,5 @@ id: d92a0b52-981d-4a4b-b245-4a6b0c0ac328 -chapterId: 2a10a6ba-fada-4556-a673-3ae8c0794bf0 +chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d difficulty: medium duration: 15 author: PlanB Network diff --git a/courses/scr403/quizz/015/question.yml b/courses/scr403/quizz/015/question.yml index 90aadbb5248..9aa423da49c 100644 --- a/courses/scr403/quizz/015/question.yml +++ b/courses/scr403/quizz/015/question.yml @@ -1,5 +1,5 @@ id: 8b4ee208-b723-41c4-af9c-0d30b10132fb -chapterId: 2a10a6ba-fada-4556-a673-3ae8c0794bf0 +chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d difficulty: medium duration: 15 author: PlanB Network diff --git a/courses/scr403/quizz/016/question.yml b/courses/scr403/quizz/016/question.yml index cc5257cf071..dce35bab84c 100644 --- a/courses/scr403/quizz/016/question.yml +++ b/courses/scr403/quizz/016/question.yml @@ -1,5 +1,5 @@ id: c4df1bd0-8d1c-4f71-ac5a-ebf3be1f4a51 -chapterId: 2a10a6ba-fada-4556-a673-3ae8c0794bf0 +chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d difficulty: medium duration: 15 author: PlanB Network diff --git a/courses/scr403/quizz/017/question.yml b/courses/scr403/quizz/017/question.yml index f99b53725ec..132f7efc724 100644 --- a/courses/scr403/quizz/017/question.yml +++ b/courses/scr403/quizz/017/question.yml @@ -1,5 +1,5 @@ id: f88741e5-8019-427f-80d4-de0616a2bd9a -chapterId: 9981ae62-ae50-4770-adf2-b253d1e08de3 +chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d difficulty: medium duration: 15 author: PlanB Network diff --git a/courses/scr403/quizz/018/question.yml b/courses/scr403/quizz/018/question.yml index 01f8023a480..d5e05dac4ac 100644 --- a/courses/scr403/quizz/018/question.yml +++ b/courses/scr403/quizz/018/question.yml @@ -1,5 +1,5 @@ id: 8ecab257-d521-437a-ad11-bb6d2020b0f1 -chapterId: 9981ae62-ae50-4770-adf2-b253d1e08de3 +chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d difficulty: medium duration: 15 author: PlanB Network diff --git a/courses/scr403/quizz/019/question.yml b/courses/scr403/quizz/019/question.yml index 0cbf0c7253e..7f7e6fce746 100644 --- a/courses/scr403/quizz/019/question.yml +++ b/courses/scr403/quizz/019/question.yml @@ -1,5 +1,5 @@ id: b4130b1d-4f08-4543-948c-3c2095cd110f -chapterId: 9981ae62-ae50-4770-adf2-b253d1e08de3 +chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d difficulty: medium duration: 15 author: PlanB Network diff --git a/courses/scr403/quizz/020/question.yml b/courses/scr403/quizz/020/question.yml index e8e2b850afa..2050d7b835b 100644 --- a/courses/scr403/quizz/020/question.yml +++ b/courses/scr403/quizz/020/question.yml @@ -1,5 +1,5 @@ id: db95b84e-6529-4422-aae2-3d6f8a789013 -chapterId: 9eafe498-0765-419a-a69d-a74a9cdf3713 +chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d difficulty: medium duration: 15 author: PlanB Network diff --git a/courses/scr403/quizz/021/question.yml b/courses/scr403/quizz/021/question.yml index 2477a2dc105..9f0681b8e12 100644 --- a/courses/scr403/quizz/021/question.yml +++ b/courses/scr403/quizz/021/question.yml @@ -1,5 +1,5 @@ id: b5e36dfe-d941-4041-ba23-dc1643d7abc9 -chapterId: 9eafe498-0765-419a-a69d-a74a9cdf3713 +chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d difficulty: medium duration: 15 author: PlanB Network diff --git a/courses/scr403/quizz/022/question.yml b/courses/scr403/quizz/022/question.yml index fac5dd66c2d..957b8687675 100644 --- a/courses/scr403/quizz/022/question.yml +++ b/courses/scr403/quizz/022/question.yml @@ -1,5 +1,5 @@ id: 04d17f4c-1e95-4c2e-8e40-c9b84cf75b2f -chapterId: 9eafe498-0765-419a-a69d-a74a9cdf3713 +chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d difficulty: medium duration: 15 author: PlanB Network diff --git a/courses/scr403/quizz/023/question.yml b/courses/scr403/quizz/023/question.yml index 13de351a22a..f2f296294b1 100644 --- a/courses/scr403/quizz/023/question.yml +++ b/courses/scr403/quizz/023/question.yml @@ -1,5 +1,5 @@ id: 0b2a2848-cb65-46e2-be56-e98513794786 -chapterId: 9eafe498-0765-419a-a69d-a74a9cdf3713 +chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d difficulty: medium duration: 15 author: PlanB Network diff --git a/courses/scr403/quizz/024/question.yml b/courses/scr403/quizz/024/question.yml index 4fef870eb3e..7442b588b08 100644 --- a/courses/scr403/quizz/024/question.yml +++ b/courses/scr403/quizz/024/question.yml @@ -1,5 +1,5 @@ id: bbc1725b-94ae-42ea-85cc-4e40087a985a -chapterId: 961652e3-8f7d-4c2a-8b55-9a990b91a0dd +chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d difficulty: medium duration: 15 author: PlanB Network diff --git a/courses/scr403/quizz/025/question.yml b/courses/scr403/quizz/025/question.yml index f763f6970dd..0170d1e8445 100644 --- a/courses/scr403/quizz/025/question.yml +++ b/courses/scr403/quizz/025/question.yml @@ -1,5 +1,5 @@ id: e9f7f36d-e07d-4ad2-9d12-845c0b5f63bb -chapterId: 961652e3-8f7d-4c2a-8b55-9a990b91a0dd +chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d difficulty: medium duration: 15 author: PlanB Network diff --git a/courses/scr403/quizz/026/question.yml b/courses/scr403/quizz/026/question.yml index 1191b9e498c..8d57ffb8678 100644 --- a/courses/scr403/quizz/026/question.yml +++ b/courses/scr403/quizz/026/question.yml @@ -1,5 +1,5 @@ id: 55d95b1b-18e0-4ac0-b5d2-e5f18ea365a0 -chapterId: 961652e3-8f7d-4c2a-8b55-9a990b91a0dd +chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d difficulty: medium duration: 15 author: PlanB Network diff --git a/courses/scr403/quizz/027/question.yml b/courses/scr403/quizz/027/question.yml index c2e9157ba2f..2197f3b75cd 100644 --- a/courses/scr403/quizz/027/question.yml +++ b/courses/scr403/quizz/027/question.yml @@ -1,5 +1,5 @@ id: a81a36bd-d3da-4205-886b-3b66bc82fa1f -chapterId: 961652e3-8f7d-4c2a-8b55-9a990b91a0dd +chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d difficulty: medium duration: 15 author: PlanB Network From 221509fe05d60d755962642ab9e256692d8522d0 Mon Sep 17 00:00:00 2001 From: Asi0Flammeus Date: Mon, 9 Mar 2026 15:25:28 +0100 Subject: [PATCH 08/14] fix(scr403): correct course metadata and quiz formatting to pass validation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Update subtopic from 'simplicity' to 'script' in course.yml to match schema enum - Fix quiz difficulty from 'medium' to 'intermediate' across all 28 quizzes All validation checks now pass (0 errors, 0 warnings) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- courses/scr403/course.yml | 2 +- courses/scr403/quizz/000/question.yml | 2 +- courses/scr403/quizz/001/question.yml | 2 +- courses/scr403/quizz/002/question.yml | 2 +- courses/scr403/quizz/003/question.yml | 2 +- courses/scr403/quizz/004/question.yml | 2 +- courses/scr403/quizz/005/question.yml | 2 +- courses/scr403/quizz/006/question.yml | 2 +- courses/scr403/quizz/007/question.yml | 2 +- courses/scr403/quizz/008/question.yml | 2 +- courses/scr403/quizz/009/question.yml | 2 +- courses/scr403/quizz/010/question.yml | 2 +- courses/scr403/quizz/011/question.yml | 2 +- courses/scr403/quizz/012/question.yml | 2 +- courses/scr403/quizz/013/question.yml | 2 +- courses/scr403/quizz/014/question.yml | 2 +- courses/scr403/quizz/015/question.yml | 2 +- courses/scr403/quizz/016/question.yml | 2 +- courses/scr403/quizz/017/question.yml | 2 +- courses/scr403/quizz/018/question.yml | 2 +- courses/scr403/quizz/019/question.yml | 2 +- courses/scr403/quizz/020/question.yml | 2 +- courses/scr403/quizz/021/question.yml | 2 +- courses/scr403/quizz/022/question.yml | 2 +- courses/scr403/quizz/023/question.yml | 2 +- courses/scr403/quizz/024/question.yml | 2 +- courses/scr403/quizz/025/question.yml | 2 +- courses/scr403/quizz/026/question.yml | 2 +- courses/scr403/quizz/027/question.yml | 2 +- 29 files changed, 29 insertions(+), 29 deletions(-) diff --git a/courses/scr403/course.yml b/courses/scr403/course.yml index 1c70419d78e..66f2d79655e 100644 --- a/courses/scr403/course.yml +++ b/courses/scr403/course.yml @@ -2,7 +2,7 @@ id: 1f6d0544-c6f0-42c6-a8ef-acf485807b9d topic: protocol -subtopic: simplicity +subtopic: script type: theory level: expert diff --git a/courses/scr403/quizz/000/question.yml b/courses/scr403/quizz/000/question.yml index b67c650fe75..4f28002574a 100644 --- a/courses/scr403/quizz/000/question.yml +++ b/courses/scr403/quizz/000/question.yml @@ -1,6 +1,6 @@ id: 35ccd3ce-33df-4542-91d9-a558d92548df chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d -difficulty: medium +difficulty: intermediate duration: 15 author: PlanB Network original_language: en diff --git a/courses/scr403/quizz/001/question.yml b/courses/scr403/quizz/001/question.yml index b38596c3fff..3c24068137a 100644 --- a/courses/scr403/quizz/001/question.yml +++ b/courses/scr403/quizz/001/question.yml @@ -1,6 +1,6 @@ id: 5c6d0109-ffe1-4da5-813d-204c9f467111 chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d -difficulty: medium +difficulty: intermediate duration: 15 author: PlanB Network original_language: en diff --git a/courses/scr403/quizz/002/question.yml b/courses/scr403/quizz/002/question.yml index 2eaf850bf29..1a51e44d689 100644 --- a/courses/scr403/quizz/002/question.yml +++ b/courses/scr403/quizz/002/question.yml @@ -1,6 +1,6 @@ id: 9428566d-1ead-4d47-ba46-6b636029c0ef chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d -difficulty: medium +difficulty: intermediate duration: 15 author: PlanB Network original_language: en diff --git a/courses/scr403/quizz/003/question.yml b/courses/scr403/quizz/003/question.yml index 579aa4d68b2..240813569f6 100644 --- a/courses/scr403/quizz/003/question.yml +++ b/courses/scr403/quizz/003/question.yml @@ -1,6 +1,6 @@ id: aa208130-3c60-4310-9867-dc6f80e8aba1 chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d -difficulty: medium +difficulty: intermediate duration: 15 author: PlanB Network original_language: en diff --git a/courses/scr403/quizz/004/question.yml b/courses/scr403/quizz/004/question.yml index ecb9e260657..e517abfaeb5 100644 --- a/courses/scr403/quizz/004/question.yml +++ b/courses/scr403/quizz/004/question.yml @@ -1,6 +1,6 @@ id: 54a868ea-e48c-4afc-a68a-f57b3d06c041 chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d -difficulty: medium +difficulty: intermediate duration: 15 author: PlanB Network original_language: en diff --git a/courses/scr403/quizz/005/question.yml b/courses/scr403/quizz/005/question.yml index 874f7ae9a78..4e70f03f44b 100644 --- a/courses/scr403/quizz/005/question.yml +++ b/courses/scr403/quizz/005/question.yml @@ -1,6 +1,6 @@ id: 3f77abbb-10d4-41c6-a269-ccf8e0c44ff5 chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d -difficulty: medium +difficulty: intermediate duration: 15 author: PlanB Network original_language: en diff --git a/courses/scr403/quizz/006/question.yml b/courses/scr403/quizz/006/question.yml index 7663dbb3974..616601f3a40 100644 --- a/courses/scr403/quizz/006/question.yml +++ b/courses/scr403/quizz/006/question.yml @@ -1,6 +1,6 @@ id: 963fde32-783e-4e20-8c3f-cae31bdcc2bf chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d -difficulty: medium +difficulty: intermediate duration: 15 author: PlanB Network original_language: en diff --git a/courses/scr403/quizz/007/question.yml b/courses/scr403/quizz/007/question.yml index 7417fa9ae90..4f68a1821b9 100644 --- a/courses/scr403/quizz/007/question.yml +++ b/courses/scr403/quizz/007/question.yml @@ -1,6 +1,6 @@ id: c0dc9faf-1c10-4082-82c3-e4b07e7217f9 chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d -difficulty: medium +difficulty: intermediate duration: 15 author: PlanB Network original_language: en diff --git a/courses/scr403/quizz/008/question.yml b/courses/scr403/quizz/008/question.yml index c4dee51d83c..1206907021d 100644 --- a/courses/scr403/quizz/008/question.yml +++ b/courses/scr403/quizz/008/question.yml @@ -1,6 +1,6 @@ id: e5e0c93e-c244-4d00-ac35-7bc6e4533813 chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d -difficulty: medium +difficulty: intermediate duration: 15 author: PlanB Network original_language: en diff --git a/courses/scr403/quizz/009/question.yml b/courses/scr403/quizz/009/question.yml index 8eea0fb1b19..220c4e05051 100644 --- a/courses/scr403/quizz/009/question.yml +++ b/courses/scr403/quizz/009/question.yml @@ -1,6 +1,6 @@ id: 6d167e33-3e10-4e7a-8919-6565f929eb8d chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d -difficulty: medium +difficulty: intermediate duration: 15 author: PlanB Network original_language: en diff --git a/courses/scr403/quizz/010/question.yml b/courses/scr403/quizz/010/question.yml index 19d14a612e1..99326e3e49f 100644 --- a/courses/scr403/quizz/010/question.yml +++ b/courses/scr403/quizz/010/question.yml @@ -1,6 +1,6 @@ id: 582e5a78-71f9-4dca-87f0-bdcc65c5179b chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d -difficulty: medium +difficulty: intermediate duration: 15 author: PlanB Network original_language: en diff --git a/courses/scr403/quizz/011/question.yml b/courses/scr403/quizz/011/question.yml index ea5ad7b057a..100196bd6e7 100644 --- a/courses/scr403/quizz/011/question.yml +++ b/courses/scr403/quizz/011/question.yml @@ -1,6 +1,6 @@ id: 1a8a9923-3600-446e-afd9-299c3bff7f9d chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d -difficulty: medium +difficulty: intermediate duration: 15 author: PlanB Network original_language: en diff --git a/courses/scr403/quizz/012/question.yml b/courses/scr403/quizz/012/question.yml index b1e99ebd638..bc270799ff6 100644 --- a/courses/scr403/quizz/012/question.yml +++ b/courses/scr403/quizz/012/question.yml @@ -1,6 +1,6 @@ id: b5e01b45-f621-429b-abee-c748b73739fd chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d -difficulty: medium +difficulty: intermediate duration: 15 author: PlanB Network original_language: en diff --git a/courses/scr403/quizz/013/question.yml b/courses/scr403/quizz/013/question.yml index 00a88614982..8ab933be474 100644 --- a/courses/scr403/quizz/013/question.yml +++ b/courses/scr403/quizz/013/question.yml @@ -1,6 +1,6 @@ id: 0c2c49a2-3766-467a-8ab4-c16c15a5dd60 chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d -difficulty: medium +difficulty: intermediate duration: 15 author: PlanB Network original_language: en diff --git a/courses/scr403/quizz/014/question.yml b/courses/scr403/quizz/014/question.yml index 263d641d170..1adb0e6c706 100644 --- a/courses/scr403/quizz/014/question.yml +++ b/courses/scr403/quizz/014/question.yml @@ -1,6 +1,6 @@ id: d92a0b52-981d-4a4b-b245-4a6b0c0ac328 chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d -difficulty: medium +difficulty: intermediate duration: 15 author: PlanB Network original_language: en diff --git a/courses/scr403/quizz/015/question.yml b/courses/scr403/quizz/015/question.yml index 9aa423da49c..9a6da05dad0 100644 --- a/courses/scr403/quizz/015/question.yml +++ b/courses/scr403/quizz/015/question.yml @@ -1,6 +1,6 @@ id: 8b4ee208-b723-41c4-af9c-0d30b10132fb chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d -difficulty: medium +difficulty: intermediate duration: 15 author: PlanB Network original_language: en diff --git a/courses/scr403/quizz/016/question.yml b/courses/scr403/quizz/016/question.yml index dce35bab84c..18cc1e4c50c 100644 --- a/courses/scr403/quizz/016/question.yml +++ b/courses/scr403/quizz/016/question.yml @@ -1,6 +1,6 @@ id: c4df1bd0-8d1c-4f71-ac5a-ebf3be1f4a51 chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d -difficulty: medium +difficulty: intermediate duration: 15 author: PlanB Network original_language: en diff --git a/courses/scr403/quizz/017/question.yml b/courses/scr403/quizz/017/question.yml index 132f7efc724..1b890711970 100644 --- a/courses/scr403/quizz/017/question.yml +++ b/courses/scr403/quizz/017/question.yml @@ -1,6 +1,6 @@ id: f88741e5-8019-427f-80d4-de0616a2bd9a chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d -difficulty: medium +difficulty: intermediate duration: 15 author: PlanB Network original_language: en diff --git a/courses/scr403/quizz/018/question.yml b/courses/scr403/quizz/018/question.yml index d5e05dac4ac..74d5b110c37 100644 --- a/courses/scr403/quizz/018/question.yml +++ b/courses/scr403/quizz/018/question.yml @@ -1,6 +1,6 @@ id: 8ecab257-d521-437a-ad11-bb6d2020b0f1 chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d -difficulty: medium +difficulty: intermediate duration: 15 author: PlanB Network original_language: en diff --git a/courses/scr403/quizz/019/question.yml b/courses/scr403/quizz/019/question.yml index 7f7e6fce746..5386fc1be32 100644 --- a/courses/scr403/quizz/019/question.yml +++ b/courses/scr403/quizz/019/question.yml @@ -1,6 +1,6 @@ id: b4130b1d-4f08-4543-948c-3c2095cd110f chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d -difficulty: medium +difficulty: intermediate duration: 15 author: PlanB Network original_language: en diff --git a/courses/scr403/quizz/020/question.yml b/courses/scr403/quizz/020/question.yml index 2050d7b835b..b7ccc000458 100644 --- a/courses/scr403/quizz/020/question.yml +++ b/courses/scr403/quizz/020/question.yml @@ -1,6 +1,6 @@ id: db95b84e-6529-4422-aae2-3d6f8a789013 chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d -difficulty: medium +difficulty: intermediate duration: 15 author: PlanB Network original_language: en diff --git a/courses/scr403/quizz/021/question.yml b/courses/scr403/quizz/021/question.yml index 9f0681b8e12..e2a3e2417e7 100644 --- a/courses/scr403/quizz/021/question.yml +++ b/courses/scr403/quizz/021/question.yml @@ -1,6 +1,6 @@ id: b5e36dfe-d941-4041-ba23-dc1643d7abc9 chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d -difficulty: medium +difficulty: intermediate duration: 15 author: PlanB Network original_language: en diff --git a/courses/scr403/quizz/022/question.yml b/courses/scr403/quizz/022/question.yml index 957b8687675..26c72498a44 100644 --- a/courses/scr403/quizz/022/question.yml +++ b/courses/scr403/quizz/022/question.yml @@ -1,6 +1,6 @@ id: 04d17f4c-1e95-4c2e-8e40-c9b84cf75b2f chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d -difficulty: medium +difficulty: intermediate duration: 15 author: PlanB Network original_language: en diff --git a/courses/scr403/quizz/023/question.yml b/courses/scr403/quizz/023/question.yml index f2f296294b1..573603838c7 100644 --- a/courses/scr403/quizz/023/question.yml +++ b/courses/scr403/quizz/023/question.yml @@ -1,6 +1,6 @@ id: 0b2a2848-cb65-46e2-be56-e98513794786 chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d -difficulty: medium +difficulty: intermediate duration: 15 author: PlanB Network original_language: en diff --git a/courses/scr403/quizz/024/question.yml b/courses/scr403/quizz/024/question.yml index 7442b588b08..31a29145ec3 100644 --- a/courses/scr403/quizz/024/question.yml +++ b/courses/scr403/quizz/024/question.yml @@ -1,6 +1,6 @@ id: bbc1725b-94ae-42ea-85cc-4e40087a985a chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d -difficulty: medium +difficulty: intermediate duration: 15 author: PlanB Network original_language: en diff --git a/courses/scr403/quizz/025/question.yml b/courses/scr403/quizz/025/question.yml index 0170d1e8445..1f1f942c7ce 100644 --- a/courses/scr403/quizz/025/question.yml +++ b/courses/scr403/quizz/025/question.yml @@ -1,6 +1,6 @@ id: e9f7f36d-e07d-4ad2-9d12-845c0b5f63bb chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d -difficulty: medium +difficulty: intermediate duration: 15 author: PlanB Network original_language: en diff --git a/courses/scr403/quizz/026/question.yml b/courses/scr403/quizz/026/question.yml index 8d57ffb8678..a24a5621fa5 100644 --- a/courses/scr403/quizz/026/question.yml +++ b/courses/scr403/quizz/026/question.yml @@ -1,6 +1,6 @@ id: 55d95b1b-18e0-4ac0-b5d2-e5f18ea365a0 chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d -difficulty: medium +difficulty: intermediate duration: 15 author: PlanB Network original_language: en diff --git a/courses/scr403/quizz/027/question.yml b/courses/scr403/quizz/027/question.yml index 2197f3b75cd..a5ad7bc5722 100644 --- a/courses/scr403/quizz/027/question.yml +++ b/courses/scr403/quizz/027/question.yml @@ -1,6 +1,6 @@ id: a81a36bd-d3da-4205-886b-3b66bc82fa1f chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d -difficulty: medium +difficulty: intermediate duration: 15 author: PlanB Network original_language: en From 4820d0337147396b11b5c6c0a58fa5eff3483808 Mon Sep 17 00:00:00 2001 From: Asi0Flammeus Date: Mon, 9 Mar 2026 15:31:56 +0100 Subject: [PATCH 09/14] refactor(scr403): simplify course goal statement MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Shorten goal from detailed description to concise statement: "Master the design philosophy, type system, and full lifecycle of Simplicity" 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- courses/scr403/en.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/courses/scr403/en.md b/courses/scr403/en.md index fc7aaef3bc3..4c1a20d7647 100644 --- a/courses/scr403/en.md +++ b/courses/scr403/en.md @@ -1,6 +1,6 @@ --- name: Delving Into Simplicity -goal: Master the design philosophy, type system, and full lifecycle of Simplicity — from its nine core combinators to on-chain program deployment via Taproot. +goal: Master the design philosophy, type system, and full lifecycle of Simplicity objectives: - Understand the three fundamental composition methods and the nine combinators that form a complete language - Build boolean logic, arithmetic, and SHA-256 from Simplicity's minimal type system From 3e55b400b8950925e7c638fa37691c4117310630 Mon Sep 17 00:00:00 2001 From: Asi0Flammeus Date: Mon, 9 Mar 2026 15:42:15 +0100 Subject: [PATCH 10/14] feat(schema): update professor validation schema and add contributor_id MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Schema changes (professor-scheme.json): - Add mandatory 'id' field with UUID validation - Make 'tips' field optional (remove from required) - Make 'affiliations' field optional (remove from required) - Add 'github' to allowed links properties - Allow null for 'twitter' field in links Profile updates (russell-oconnor): - Add contributor_id: rocket-turtle All professor validation now passes (0 errors, 0 warnings) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .../professors/professor-scheme.json | 18 ++++++++++++++---- professors/russell-oconnor/professor.yml | 3 ++- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/docs/PBN-template-repo/professors/professor-scheme.json b/docs/PBN-template-repo/professors/professor-scheme.json index 08f4dc5526d..32c9ec60b28 100644 --- a/docs/PBN-template-repo/professors/professor-scheme.json +++ b/docs/PBN-template-repo/professors/professor-scheme.json @@ -3,6 +3,11 @@ "title": "Professor", "type": "object", "properties": { + "id": { + "type": "string", + "description": "Unique identifier for the professor (UUID format)", + "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$" + }, "name": { "type": "string", "description": "Full name of the professor" @@ -16,13 +21,18 @@ "description": "Online presence of the professor", "properties": { "twitter": { - "type": "string", - "format": "url", + "type": ["string", "null"], + "format": "uri", "description": "Twitter URL of the professor" }, + "github": { + "type": "string", + "format": "uri", + "description": "GitHub URL of the professor" + }, "website": { "type": "string", - "format": "url", + "format": "uri", "description": "Personal or professional website of the professor" } }, @@ -103,7 +113,7 @@ } } }, - "required": ["name", "contributor_id", "links", "tags", "tips", "company", "affiliations"], + "required": ["id", "name", "contributor_id", "links", "tags", "company"], "additionalProperties": false } diff --git a/professors/russell-oconnor/professor.yml b/professors/russell-oconnor/professor.yml index 26d614e5806..221b91f9385 100644 --- a/professors/russell-oconnor/professor.yml +++ b/professors/russell-oconnor/professor.yml @@ -1,5 +1,6 @@ id: a3b29adb-43ee-49f4-9582-b37e9cf72858 -name: Russell O'Connor +name: "Russell O'Connor" +contributor_id: rocket-turtle links: twitter: From 8b41620d007e2f25251be40da1a5a76f84f3329f Mon Sep 17 00:00:00 2001 From: Asi0Flammeus Date: Tue, 10 Mar 2026 11:27:30 +0100 Subject: [PATCH 11/14] fix: update SCR403 simplicity course thumbnail Co-Authored-By: Claude Opus 4.6 --- courses/scr403/assets/thumbnail.webp | Bin 143264 -> 41470 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/courses/scr403/assets/thumbnail.webp b/courses/scr403/assets/thumbnail.webp index 0b1db3cf1c34d4424fdfae75de4d9e52a9c23ed8..18a7badb15558080e51003c1848e0a04928123cc 100644 GIT binary patch literal 41470 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�*T;cy|$Wne4+vje!-qD@{5OX#jgsjUb~ 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 Date: Thu, 2 Jul 2026 09:22:06 +0200 Subject: [PATCH 12/14] review(scr403): apply maintainer feedback - fix NUMS ('Nothing-Up-My-Sleeve', not 'Non-Mundane Secret') + restore recursive CMR rule, worked tex1p address derivation, and Witness Values rationale (Programs and Addresses) - re-attribute Simplicity ecosystem projects (Simplicity DEX / Swaption by SideSwap / Deadcat by Resolvr); correct 2012 origin; Solidity as contract language; calls-only - add copair/dist design rationale + sequent-calculus 'functional interpretation' wording (Combinator Completeness) - restore BIP340 batch-verification + CISA links, add C/I/U effect summary table (Two Side Effects) - repoint all 28 quizzes from Final Exam to their content chapters; author -> Rogzy professor id - balance quiz answer lengths (remove length tell); fix explanation nits (004, 007) - add course description H1; shorten intro; punctuation cleanups; drop empty professor twitter --- courses/scr403/en.md | 123 ++++++++++++++++++----- courses/scr403/quizz/000/en.yml | 8 +- courses/scr403/quizz/000/question.yml | 4 +- courses/scr403/quizz/001/en.yml | 6 +- courses/scr403/quizz/001/question.yml | 4 +- courses/scr403/quizz/002/en.yml | 6 +- courses/scr403/quizz/002/question.yml | 4 +- courses/scr403/quizz/003/en.yml | 6 +- courses/scr403/quizz/003/question.yml | 4 +- courses/scr403/quizz/004/en.yml | 12 +-- courses/scr403/quizz/004/question.yml | 4 +- courses/scr403/quizz/005/en.yml | 8 +- courses/scr403/quizz/005/question.yml | 4 +- courses/scr403/quizz/006/en.yml | 8 +- courses/scr403/quizz/006/question.yml | 4 +- courses/scr403/quizz/007/en.yml | 17 ++-- courses/scr403/quizz/007/question.yml | 4 +- courses/scr403/quizz/008/en.yml | 6 +- courses/scr403/quizz/008/question.yml | 4 +- courses/scr403/quizz/009/question.yml | 4 +- courses/scr403/quizz/010/en.yml | 6 +- courses/scr403/quizz/010/question.yml | 4 +- courses/scr403/quizz/011/en.yml | 8 +- courses/scr403/quizz/011/question.yml | 4 +- courses/scr403/quizz/012/en.yml | 8 +- courses/scr403/quizz/012/question.yml | 4 +- courses/scr403/quizz/013/en.yml | 8 +- courses/scr403/quizz/013/question.yml | 4 +- courses/scr403/quizz/014/en.yml | 8 +- courses/scr403/quizz/014/question.yml | 4 +- courses/scr403/quizz/015/en.yml | 8 +- courses/scr403/quizz/015/question.yml | 4 +- courses/scr403/quizz/016/en.yml | 6 +- courses/scr403/quizz/016/question.yml | 4 +- courses/scr403/quizz/017/en.yml | 6 +- courses/scr403/quizz/017/question.yml | 4 +- courses/scr403/quizz/018/en.yml | 8 +- courses/scr403/quizz/018/question.yml | 4 +- courses/scr403/quizz/019/en.yml | 8 +- courses/scr403/quizz/019/question.yml | 4 +- courses/scr403/quizz/020/question.yml | 4 +- courses/scr403/quizz/021/en.yml | 8 +- courses/scr403/quizz/021/question.yml | 4 +- courses/scr403/quizz/022/en.yml | 8 +- courses/scr403/quizz/022/question.yml | 4 +- courses/scr403/quizz/023/en.yml | 8 +- courses/scr403/quizz/023/question.yml | 4 +- courses/scr403/quizz/024/en.yml | 8 +- courses/scr403/quizz/024/question.yml | 4 +- courses/scr403/quizz/025/en.yml | 8 +- courses/scr403/quizz/025/question.yml | 4 +- courses/scr403/quizz/026/en.yml | 8 +- courses/scr403/quizz/026/question.yml | 4 +- courses/scr403/quizz/027/en.yml | 8 +- courses/scr403/quizz/027/question.yml | 4 +- professors/russell-oconnor/professor.yml | 1 - 56 files changed, 259 insertions(+), 184 deletions(-) diff --git a/courses/scr403/en.md b/courses/scr403/en.md index 4c1a20d7647..2c236323cb8 100644 --- a/courses/scr403/en.md +++ b/courses/scr403/en.md @@ -8,7 +8,9 @@ objectives: - Learn how Simplicity programs become Taproot addresses and are redeemed with witness data --- -A deep dive into the theory and design decisions behind the Simplicity language, based on the complete five-part ["Delving Simplicity"](https://delvingbitcoin.org/t/delving-simplicity-part-three-fundamental-ways-of-combining-computations/1902) article series by [Dr. Russell O'Connor](https://r6.ca/), the creator of Simplicity at Blockstream Research. This is not a hands-on coding course — it is an exploration of *why* the language was designed the way it was, from the philosophical foundations of composition to the mathematical proof that nine combinators are enough. +# Delving Into Simplicity + +A deep dive into the theory and design decisions behind the Simplicity language, based on the complete five-part ["Delving Simplicity"](https://delvingbitcoin.org/t/delving-simplicity-part-three-fundamental-ways-of-combining-computations/1902) article series by [Dr. Russell O'Connor](https://r6.ca/), the creator of Simplicity at Blockstream Research. This course explains *why* Simplicity was designed the way it was, not how to write it. The course follows Dr. O'Connor's articles through the three fundamental ways of combining computations, the minimal type system and its completeness theorem, the construction of practical data types and arithmetic from first principles, the careful introduction of side effects for blockchain interaction, and finally how programs are committed to addresses and redeemed on-chain. @@ -38,7 +40,7 @@ This course explores the design philosophy and mathematical foundations behind S This is an **expert-level** course (approximately 10 hours). You should be comfortable with: - Basic Bitcoin scripting concepts (what transaction validation does) - Fundamental programming concepts (types, functions, composition) -- Some familiarity with mathematical notation is helpful but not required — we introduce everything as we go +- Some familiarity with mathematical notation is helpful but not required. We introduce everything as we go ### Key resources @@ -57,18 +59,18 @@ If you're coming to this course without a background in Simplicity, this chapter ### Simplicity in a nutshell -Simplicity is a **smart contract language for Bitcoin** (and the Liquid sidechain). It was designed from scratch by Dr. Russell O'Connor starting in 2017 and activated on the Liquid Network in July 2025, after years of formal verification and development. +Simplicity is a **Bitcoin-native smart contract language**, live on the Liquid Network today. First envisioned by Dr. Russell O'Connor around 2012 and detailed in his 2017 paper *Simplicity: A New Language for Blockchains*, it was activated on the Liquid Network in July 2025 after years of formal verification and development. -Unlike Ethereum's Solidity — which is a general-purpose, high-level language — Simplicity is intentionally minimal. It has: +Unlike Ethereum's Solidity, which is a Turing-complete, high-level contract language, Simplicity is intentionally minimal. It has: - **Three type formers** (unit, sum, product) - **Nine combinators** (basic operations and composition rules) - **No loops, no recursion, no dynamic memory** -From just these primitives, you can build any computation you need for transaction validation — from boolean logic to full SHA-256 hashing. +From just these primitives, you can build any computation you need for transaction validation, from boolean logic to full SHA-256 hashing. ### What can you do with Simplicity today? -Simplicity is already powering real applications on the Liquid Network. The most notable example is the [Simplicity DEX](https://docs.simplicity-lang.org/use-cases/simplicity-dex/) — a structured options marketplace where users can create and trade call and put options on L-BTC using USDt as collateral, with no price oracle required. The open-source [Deadcat](https://github.com/Resolvr-io/deadcat) protocol implements this, and the [Swaption](https://swaption.io/) app provides a user-facing interface. You can watch a [demo of the DEX in action](https://www.youtube.com/watch?v=4c8bvD6oomw). Beyond DeFi, Simplicity enables any advanced spending condition — vaults, covenants, complex multisig schemes — that would be impossible or unsafe in Bitcoin Script. +Simplicity is already powering real applications on the Liquid Network. The most notable is the [Simplicity DEX](https://docs.simplicity-lang.org/use-cases/simplicity-dex/), an oracle-free options marketplace where users trade call options on L-BTC using USDt as collateral (the underlying contract also supports puts). Other live Simplicity projects include [Swaption](https://swaption.io/) by SideSwap (options) and the open-source [Deadcat](https://github.com/Resolvr-io/deadcat) by Resolvr (prediction markets). Beyond DeFi, Simplicity enables advanced spending conditions such as vaults, covenants, and complex multisig schemes that would be impossible or unsafe in Bitcoin Script. ### What this course is — and isn't @@ -89,11 +91,11 @@ This course is ideal for: - **Computer scientists** curious about the connection between sequent calculus and blockchain computation - **Advanced bitcoiners** who want to go beyond surface-level understanding of Liquid's scripting capabilities -If terms like "sum types", "combinators", or "sequent calculus" are entirely new to you, don't worry — we explain everything from scratch. But be prepared for a dense, mathematical journey. +If terms like "sum types", "combinators", or "sequent calculus" are entirely new to you, don't worry, we explain everything from scratch. But be prepared for a dense, mathematical journey. ### From articles to course -The original "Delving Simplicity" series by Dr. O'Connor is structured as five technical articles. This course reorganizes and annotates that material into a progressive learning path with quizzes to test your understanding along the way. The ideas, definitions, and proofs are his — we've adapted the format for structured education. +The original "Delving Simplicity" series by Dr. O'Connor is structured as five technical articles. This course reorganizes and annotates that material into a progressive learning path with quizzes to test your understanding along the way. The ideas, definitions, and proofs are his, and we've adapted the format for structured education. # Foundations of Simplicity @@ -250,6 +252,8 @@ case f g : (A + B) × C ⊢ D ⟦case f g⟧⟨σᴿ(b), c⟩ = ⟦g⟧⟨b, c⟩ ``` +Why does conditional composition take this shape — a sum paired with a shared environment `C` — rather than a simpler `copair f g : A + B ⊢ C` that merely picks a branch? Because a bare `copair` cannot express **distribution**: the function `dist : (A + B) × C ⊢ A × C + B × C` that pushes a shared input into whichever branch is taken. By building the environment `C` directly into `case`, Simplicity obtains conditional composition *and* distribution from a single combinator — one of the key design decisions that keeps the core language down to nine combinators. + ### Four More Combinators Product consumption uses `take` and `drop`: @@ -306,7 +310,7 @@ In total, Simplicity has exactly nine core combinators: ### Simplicity and the Sequent Calculus -Simplicity's design derives from the conjunctive-disjunctive fragment of Gentzen's sequent calculus, analogous to the Curry-Howard correspondence. The combinator rules exhibit "smaller types in premises than conclusions," enabling the Bit Machine — Simplicity's abstract stack machine interpreter — to minimize data copying during execution. +Simplicity's design derives from the conjunctive-disjunctive fragment of Gentzen's sequent calculus. More precisely, it is a variant of the *functional interpretation* of the sequent calculus, which is itself analogous to the Curry-Howard correspondence between natural deduction and the lambda calculus. The combinator rules exhibit "smaller types in premises than conclusions," enabling the Bit Machine — Simplicity's abstract stack machine interpreter — to minimize data copying during execution. ### Values are not Expressions @@ -314,7 +318,7 @@ Simplicity expressions denote operations, not values. The notation `scribe b : A ### Simplicity's Completeness Theorem -The Simplicity Completeness theorem proves that for any function between Simplicity types, some Simplicity expression denotes it. The proof is constructive — it shows how to build the expression: +With all nine combinators in hand, how do we know we aren't missing something — that these nine really are enough? The Simplicity Completeness theorem answers this: for any function between (finite) Simplicity types, some Simplicity expression denotes it. The proof is constructive — it shows how to build the expression: 1. **Decompose the input**: Using nested `case` expressions, fully decompose any input of any type into its constituent bits 2. **Build a lookup table**: For each possible input, use `scribe` to produce the corresponding output @@ -322,7 +326,7 @@ The Simplicity Completeness theorem proves that for any function between Simplic This theorem is formally verified in the Rocq proof assistant (formerly Coq). The proof is part of the official Simplicity repository and has been machine-checked for correctness. -While the completeness theorem guarantees that Simplicity's nine combinators are a sufficient foundation for any blockchain computation, resulting expressions from the lookup-table construction are impractically large. A function on 256-bit inputs would require a lookup table with 2²⁵⁶ entries. This is why the next chapters focus on building efficient expressions that exploit the structure of computations, rather than brute-forcing everything through lookup tables. +While the completeness theorem guarantees that Simplicity's nine combinators can express any function between (finite) Simplicity types, resulting expressions from the lookup-table construction are impractically large. A function on 256-bit inputs would require a lookup table with 2²⁵⁶ entries. This is why the next chapters focus on building efficient expressions that exploit the structure of computations, rather than brute-forcing everything through lookup tables. ### Conclusion @@ -573,7 +577,7 @@ For Bitcoin and Liquid applications, we currently have two side effects: the Fai ### Jets with Effects -We will talk more about jets later in this series, but here we introduce a few example jets to illustrate their side effects. +We will talk more about jets later in this course, but here we introduce a few example jets to illustrate their side effects. #### Bip0340-verify @@ -621,6 +625,15 @@ Reading data from the environment is one of the few types of unitary effects. If The failure effect isn't unitary. If `f` throws an exception then so will `f ⨾ unit`; execution will not even make it to the `unit` combinator before the computation is aborted. On the other hand, `unit` obviously would not throw any exception, so the effects of `f ⨾ unit` and `unit` would be different. +To summarize, here is how the effects discussed above fare against these three properties: + +| Effect | Commutative | Idempotent | Unitary | +| --- | :---: | :---: | :---: | +| Reader (transaction environment) | ✓ | ✓ | ✓ | +| Failure (unit-typed exception) | ✓ | ✓ | ✗ | +| Writer (log as a set) | ✓ | ✓ | ✗ | +| General exceptions (arbitrary type) | ✗ | ✓ | ✗ | + ### Effects Allowed in Simplicity The more well-behaved properties that a type of effect has, the more room a Simplicity optimizer has for transforming programs that use those effects. Ideally we would only allow effects that have all three properties: commutative, idempotent, and unitary. This would allow an optimizer to perform any sort of program transformation it would like. However, reading from an environment is the only effect that satisfies all three properties. @@ -635,7 +648,7 @@ Why does Simplicity even allow side effects at all? Wouldn't it be better if eve #### Batch Verification -One reason we have the Failure effect is to support batch verification of Schnorr signatures. In batch verification, many individual Schnorr signature checks are pooled together in such a way that if any single signature check fails, then the entire batch fails. +One reason we have the Failure effect is to support [batch verification](https://github.com/bitcoin/bips/blob/c9a6ca6297eb8de850f6b64dafb8e60ee9b64d66/bip-0340.mediawiki#batch-verification) of Schnorr signatures. In batch verification, many individual Schnorr signature checks are pooled together in such a way that if any single signature check fails, then the entire batch fails. This batching procedure improves efficiency over individually verifying each signature. The downside is that if the batch verification fails, then we do not learn which specific signature check or checks failed. @@ -653,7 +666,7 @@ Because `sig-all-hash : 𝟙 ⊢ 𝟚²⁵⁶` uses the Reader effect to access ### Cross-Input Signature Aggregation -While neither Liquid nor Bitcoin support cross-input signature aggregation at this point in time, we would like to check that Simplicity can be compatible with it when the time comes. +While neither Liquid nor Bitcoin support [cross-input signature aggregation](https://hrf.org/latest/cisa-research-paper/) at this point in time, we would like to check that Simplicity can be compatible with it when the time comes. While details haven't been worked out, we imagine half-aggregation being implemented using a Writer effect. That is, a new jet with a type such as `half-agg-verify : (𝟚²⁵⁶ × 𝟚²⁵⁶) × 𝟚²⁵⁶ ⊢ 𝟙` would take a public key, message digest, and the `r`-component of a Schnorr signature (a Schnorr signature consists of an `r`-component and an `s`-component) and write it to a transaction log before continuing on with execution. Then, elsewhere in the transaction or with the transaction, an aggregate `s`-component for all half-aggregated Schnorr signatures would be provided. The transaction would only be valid when such an aggregate `s`-component is provided for all the logged keys, messages, and `r`-components. @@ -685,9 +698,9 @@ Rather than storing complete programs on-chain, Bitcoin employs commitments — Each combinator receives a SHA-256 tag derived from the pattern: `Simplicity␟Commitment␟[identifier]`, where `␟` represents ASCII code 31 (the unit separator). -The specific tags for each combinator are: +Each tag is the SHA-256 hash of the corresponding pre-image string listed below: -| Combinator | Tag | +| Combinator | Tag pre-image (ASCII string) | |---|---| | `iden` | `Simplicity␟Commitment␟iden` | | `unit` | `Simplicity␟Commitment␟unit` | @@ -699,7 +712,23 @@ The specific tags for each combinator are: | `injl` | `Simplicity␟Commitment␟injl` | | `injr` | `Simplicity␟Commitment␟injr` | -The CMR calculation uses recursive hashing with tagged SHA-256 midstates. For the `unit` combinator, the CMR is computed by applying SHA-256 with the tag `Simplicity␟Commitment␟unit` and no additional input data. The resulting CMR for the trivial `unit` program is: +A Simplicity expression is then recursively hashed into a 256-bit CMR by computing a tagged SHA-256 midstate for each combinator together with the CMRs of its arguments (write `#ᶜ(e)` for the CMR of expression `e`, and `∥` for byte concatenation): + +| Combinator | CMR rule | +|---|---| +| `iden` | `#ᶜ(iden) = SHA-256-midstate(tag_iden ∥ tag_iden)` | +| `unit` | `#ᶜ(unit) = SHA-256-midstate(tag_unit ∥ tag_unit)` | +| `comp f g` | `#ᶜ(comp f g) = SHA-256-midstate(tag_comp ∥ tag_comp ∥ #ᶜ(f) ∥ #ᶜ(g))` | +| `pair f g` | `#ᶜ(pair f g) = SHA-256-midstate(tag_pair ∥ tag_pair ∥ #ᶜ(f) ∥ #ᶜ(g))` | +| `case f g` | `#ᶜ(case f g) = SHA-256-midstate(tag_case ∥ tag_case ∥ #ᶜ(f) ∥ #ᶜ(g))` | +| `take f` | `#ᶜ(take f) = SHA-256-midstate(tag_take ∥ tag_take ∥ 32·0x00 ∥ #ᶜ(f))` | +| `drop f` | `#ᶜ(drop f) = SHA-256-midstate(tag_drop ∥ tag_drop ∥ 32·0x00 ∥ #ᶜ(f))` | +| `injl f` | `#ᶜ(injl f) = SHA-256-midstate(tag_injl ∥ tag_injl ∥ 32·0x00 ∥ #ᶜ(f))` | +| `injr f` | `#ᶜ(injr f) = SHA-256-midstate(tag_injr ∥ tag_injr ∥ 32·0x00 ∥ #ᶜ(f))` | + +Binary combinators (`comp`, `pair`, `case`) concatenate the CMRs of both children; unary combinators (`take`, `drop`, `injl`, `injr`) concatenate their single child's CMR after 32 bytes of `0x00` padding; and the nullary leaves (`iden`, `unit`) hash their tag alone. Two conventions keep this cheap to compute: SHA-256 midstates are used so that **each expression requires at most one call to the SHA-256 compression function** (assuming the midstate up to the constant tags is precomputed), and the one-argument constructors prefix their argument with 32 bytes of `0x00` padding, which allows for a little extra precomputation for implementations that want it. + +For the `unit` combinator — a nullary constructor with no argument sub-expressions — this rule specialises to `#ᶜ(unit) = SHA-256-midstate(tag_unit ∥ tag_unit)`, where `tag_unit = SHA-256(Simplicity␟Commitment␟unit)` (the tag is fed in twice). The resulting CMR for the trivial `unit` program is: ``` 0xc40a10263f7436b4160acbef1c36fba4be4d95df181a968afeab5eac247adff7 @@ -716,32 +745,78 @@ Addresses employ BIP-0341's Taproot mechanism with CMRs committed under TapLeaf 3. Converting to bech32m format 4. Adding appropriate checksums -The NUMS point (Non-Mundane Secret) is used for key-spend-less addresses, meaning addresses where there is no key-spend path and spending can only happen through the Simplicity script. +When no key-spend path is desired, the internal public key is set to a **NUMS** ("Nothing-Up-My-Sleeve") point: a curve point deliberately chosen so that nobody knows its discrete logarithm — in other words, a point with no corresponding private key. Because no one can ever produce a signature for it, the key-spend path is provably unusable, and the output can be spent *only* through the committed Simplicity script path. In a real application, this NUMS point should be randomized as recommended by BIP-0341, so that outputs with no key-spend path are indistinguishable from ordinary Taproot outputs (a privacy benefit). + +#### From Simplicity to Address + +Let's walk through the whole derivation for the simplest program possible: `unit : 𝟙 ⊢ 𝟙`, a no-op that always succeeds. + +**1. Combinator tag.** First compute the `unit` tag: + +``` +tag_unit = SHA-256(Simplicity␟Commitment␟unit) + = 0xd723083cff3c75e29f296707ecf2750338f100591c86e0c71717f807ff3cf69d +``` + +**2. CMR.** Feed the tag in twice to obtain the program's CMR: + +``` +CMR = #ᶜ(unit) = SHA-256-midstate(tag_unit ∥ tag_unit) + = 0xc40a10263f7436b4160acbef1c36fba4be4d95df181a968afeab5eac247adff7 +``` + +**3. TapLeaf hash.** Prefix the CMR with Simplicity's TapLeaf version `0xbe` and the CMR length `0x20` (32 bytes), then take the Elements TapLeaf tagged hash (a tagged hash is `hash_str(x) = SHA-256(SHA-256(str) ∥ SHA-256(str) ∥ x)`): + +``` +hash_TapLeaf/elements(0xbe ∥ 0x20 ∥ CMR) + = 0x44cc38311ec7e5dfb7b573baf38449496ecd334eb5509cfed1b4fd30da8dd41c +``` + +With only this one leaf there are no TapBranches, so this hash is already the TapTree root. + +**4. TapTweak.** Since we want no key-spend path, we use the BIP-0341 NUMS point as the internal key and tweak it with the TapTree root: + +``` +internal_pk = 0x50929b74c1a04954b78b4b6035e97a5e078a5a0f28ec96d547bfee9ace803ac0 +t = hash_TapTweak/elements(internal_pk ∥ 0x44cc38311ec7e5dfb7b573baf38449496ecd334eb5509cfed1b4fd30da8dd41c) + = 0xb3bef172389b0937d7e5a8b15cfa41e776777f13f2f659cb06220a6ff0658285 +``` + +**5. Output key.** Tweak the internal key on the curve, `output_pk = lift_x(internal_pk) ⊕ t·G` (the elliptic-curve arithmetic is summarized here), giving the x-only output key `0x2cb0c20acd7340b4d4b65f6a60e2888d0d64e3267261f3b3cf7290e5af3f9e09`. + +**6. Bech32m address.** Encode the x-only output key, prefix a `p` (the SegWit v1 witness-version character), add the Liquid-testnet human-readable prefix `tex1`, and append the Bech32m checksum. The final address is: + +``` +tex1p9jcvyzkdwdqtf49kta4xpc5g35xkfcexwfsl8v70w2gwttelncyshxjk56 +``` + +That was a lot of work — but much of it is mandated by Taproot itself, not by Simplicity. ### Witness Expressions A new combinator type addresses the absence of input to Simplicity programs: the witness expression. The `witness` combinator permits signature data and other witness material to be integrated into programs. ``` + w : B +----------------- witness w : A ⊢ B ``` -The witness expression's semantics is straightforward: it ignores its input and just returns the value `w`. Crucially, witness values are **excluded** from the expression's CMR, enabling address calculation before knowing witness values. +The witness expression's semantics is straightforward: it ignores its input and simply returns the value `w` (which may be of any Simplicity type), i.e. `⟦witness w⟧(a) = w`. This adds **no new expressiveness** — by the completeness theorem, Simplicity can already build any such constant function (recall the `scribe` macro from the previous chapters). The point of the `witness` combinator lies entirely in its **CMR**: the value `w` is **excluded** from the expression's CMR, so the address can be computed before `w` is known, and `w` is supplied at redemption time. This design choice supports pruning — unexecuted conditional branches needn't be revealed on-chain, including their associated witness expressions. When a branch is pruned, the verifier only needs the CMR of the pruned subtree, not its actual content. ### Witness Values -Witness values are provided at spending time (redemption), not at address creation time. This separation is fundamental to how Simplicity programs work: +It may seem like a limitation that a witness expression can hold only a *value*, and not a more general Simplicity expression. But programs for UTXO-based blockchains are executed only once. There is no need to pass a whole sub-expression into a witness node: the user can simply run that sub-expression themselves, off-chain, and transcribe its output into the witness value to obtain the very same result. -1. At **address creation time**: The program structure is committed via CMR, but witness values are left unspecified -2. At **spending time**: Witness values (signatures, preimages, etc.) are provided to complete the program +(Later in this course we will meet the `disconnect` combinator, which behaves much like a witness expression that *does* take an entire Simplicity expression as its argument.) -This is analogous to how Bitcoin Script separates the scriptPubKey (committed at funding time) from the scriptSig/witness (provided at spending time). +An alternative design would feed all witness data in as an argument to the top-level Simplicity program. Witness expressions are preferred for two reasons. First, **pruning**: unexecuted branches of `case` expressions are never revealed on-chain, and any witness expressions inside those branches are pruned away along with them. Second, **locality**: witness expressions let us place each witness value exactly where it is used, instead of threading it down from the program's top-level input. ### Type Inference -Since CMRs don't commit to types, the type system is reconstructed during redemption. Simplicity's type inference algorithm determines the minimal types for each subexpression based on the combinator structure. This means the same CMR can potentially be used at different types, though in practice the program structure constrains the types uniquely. +Since CMRs don't commit to types, the type system is reconstructed during redemption. Simplicity's type inference algorithm determines the minimal types for each subexpression based on the combinator structure. More precisely, inference computes the *principal* (most general) type of every subexpression; any type variables that remain free are then instantiated to the unit type `𝟙`, which yields a unique, minimal type for the program. ### Conclusion diff --git a/courses/scr403/quizz/000/en.yml b/courses/scr403/quizz/000/en.yml index 513adbf362f..0a9a0e0ac48 100644 --- a/courses/scr403/quizz/000/en.yml +++ b/courses/scr403/quizz/000/en.yml @@ -1,9 +1,9 @@ question: Why does Simplicity exclude dynamic memory allocation during execution? -answer: To enable static analysis and eliminate entire classes of bugs and attack vectors. +answer: To enable static analysis and rule out entire classes of bugs and attacks. wrong_answers: - - Because the Liquid Network doesn't support memory operations. - - To reduce the programming learning curve for developers. - - Because Bitcoin Script also lacks dynamic memory allocation. + - Because the Liquid Network does not support low-level memory operations. + - To reduce the programming learning curve for new smart-contract developers. + - Because Bitcoin Script itself also lacks any dynamic memory allocation. explanation: >- Simplicity avoids dynamic memory allocation so that all resource usage can be determined statically before execution. This enables predictable diff --git a/courses/scr403/quizz/000/question.yml b/courses/scr403/quizz/000/question.yml index 4f28002574a..9e96ff3cb5e 100644 --- a/courses/scr403/quizz/000/question.yml +++ b/courses/scr403/quizz/000/question.yml @@ -1,8 +1,8 @@ id: 35ccd3ce-33df-4542-91d9-a558d92548df -chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d +chapterId: 6d46e77a-7e60-473b-b230-418da5ae44eb difficulty: intermediate duration: 15 -author: PlanB Network +author: 2e1b5182-567e-453a-af29-36009340ff02 original_language: en proofreading: diff --git a/courses/scr403/quizz/001/en.yml b/courses/scr403/quizz/001/en.yml index cd6167e3afc..e5d0c7dc390 100644 --- a/courses/scr403/quizz/001/en.yml +++ b/courses/scr403/quizz/001/en.yml @@ -1,9 +1,9 @@ question: What does sequential composition produce when chaining operation f (A → B) with operation g (B → C)? -answer: A single composite operation from A to C, where f's output feeds directly into g. +answer: A single composite operation from A to C, with f's output feeding into g. wrong_answers: - - A pair containing both outputs of type B and C. + - A pair value containing both intermediate outputs of type B and C. - A conditional that chooses between f and g based on the input. - - Two separate operations that run independently. + - Two separate operations that run independently, sharing no data. explanation: >- Sequential composition chains two operations end-to-end. The output of the first operation becomes the input of the second. In Simplicity, this is diff --git a/courses/scr403/quizz/001/question.yml b/courses/scr403/quizz/001/question.yml index 3c24068137a..372c8a855ca 100644 --- a/courses/scr403/quizz/001/question.yml +++ b/courses/scr403/quizz/001/question.yml @@ -1,8 +1,8 @@ id: 5c6d0109-ffe1-4da5-813d-204c9f467111 -chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d +chapterId: 6d46e77a-7e60-473b-b230-418da5ae44eb difficulty: intermediate duration: 15 -author: PlanB Network +author: 2e1b5182-567e-453a-af29-36009340ff02 original_language: en proofreading: diff --git a/courses/scr403/quizz/002/en.yml b/courses/scr403/quizz/002/en.yml index 1612c939b51..fcd47a0dcb8 100644 --- a/courses/scr403/quizz/002/en.yml +++ b/courses/scr403/quizz/002/en.yml @@ -1,9 +1,9 @@ question: In parallel composition, what happens to the input? -answer: Both operations receive the same identical input, and their outputs are combined into a product type (pair). +answer: Both operations receive the same input, and their outputs form a product (pair). wrong_answers: - - The input is split in half, with each operation receiving one part. + - The input is split in half, with each operation receiving one separate part. - One operation processes the input first, and the other receives the modified result. - - The input is tagged and routed to one of the two operations. + - The input is tagged and routed to just one of the two operations to process. explanation: >- Parallel composition gives the same unmodified input to both operations simultaneously. The results are bundled into a product type (pair). In diff --git a/courses/scr403/quizz/002/question.yml b/courses/scr403/quizz/002/question.yml index 1a51e44d689..87aa6b0ab2b 100644 --- a/courses/scr403/quizz/002/question.yml +++ b/courses/scr403/quizz/002/question.yml @@ -1,8 +1,8 @@ id: 9428566d-1ead-4d47-ba46-6b636029c0ef -chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d +chapterId: 6d46e77a-7e60-473b-b230-418da5ae44eb difficulty: intermediate duration: 15 -author: PlanB Network +author: 2e1b5182-567e-453a-af29-36009340ff02 original_language: en proofreading: diff --git a/courses/scr403/quizz/003/en.yml b/courses/scr403/quizz/003/en.yml index fbe287d127c..238e7f91241 100644 --- a/courses/scr403/quizz/003/en.yml +++ b/courses/scr403/quizz/003/en.yml @@ -1,9 +1,9 @@ question: What is a sum type (A + B) in Simplicity? -answer: A tagged union where a value is either a left-tagged value of type A or a right-tagged value of type B. +answer: "A tagged union: a value is either a left-tagged A or a right-tagged B." wrong_answers: - A type that contains all values from both A and B simultaneously. - - An arithmetic addition of the two types' sizes. - - A function type that maps from A to B. + - An arithmetic addition of the two component types' bit sizes. + - A function type that maps every input from A to an output in B. explanation: >- A sum type A + B is a tagged union. Each value carries a one-bit tag indicating whether it's a left variant (of type A) or a right variant diff --git a/courses/scr403/quizz/003/question.yml b/courses/scr403/quizz/003/question.yml index 240813569f6..3a8096c4910 100644 --- a/courses/scr403/quizz/003/question.yml +++ b/courses/scr403/quizz/003/question.yml @@ -1,8 +1,8 @@ id: aa208130-3c60-4310-9867-dc6f80e8aba1 -chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d +chapterId: 2a10a6ba-fada-4556-a673-3ae8c0794bf0 difficulty: intermediate duration: 15 -author: PlanB Network +author: 2e1b5182-567e-453a-af29-36009340ff02 original_language: en proofreading: diff --git a/courses/scr403/quizz/004/en.yml b/courses/scr403/quizz/004/en.yml index faee85bac59..6dd836d334d 100644 --- a/courses/scr403/quizz/004/en.yml +++ b/courses/scr403/quizz/004/en.yml @@ -1,12 +1,12 @@ question: How many core combinators does Simplicity have? answer: Nine (iden, unit, comp, pair, case, take, drop, injl, injr). wrong_answers: - - Three (sequential, parallel, conditional). - - Five (comp, pair, case, take, drop). - - Twelve (nine core plus three extension combinators). + - Three (sequential composition, parallel composition, conditional). + - Five (comp, pair, case, take, and drop combinators only). + - Twelve (the nine core plus three extra extension combinators). explanation: >- - Simplicity has exactly nine core combinators. Two basic operations - (iden and unit), three composition methods (comp, pair, case), and four + Simplicity has exactly nine core combinators. Two basic operations (iden + and unit), three composition methods (comp, pair, case), and four accessors (take, drop for products, injl and injr for sums). These nine - are sufficient to express any computable function between Simplicity types. + are sufficient to express any function between Simplicity types. reviewed: false diff --git a/courses/scr403/quizz/004/question.yml b/courses/scr403/quizz/004/question.yml index e517abfaeb5..b6da98fb589 100644 --- a/courses/scr403/quizz/004/question.yml +++ b/courses/scr403/quizz/004/question.yml @@ -1,8 +1,8 @@ id: 54a868ea-e48c-4afc-a68a-f57b3d06c041 -chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d +chapterId: 2a10a6ba-fada-4556-a673-3ae8c0794bf0 difficulty: intermediate duration: 15 -author: PlanB Network +author: 2e1b5182-567e-453a-af29-36009340ff02 original_language: en proofreading: diff --git a/courses/scr403/quizz/005/en.yml b/courses/scr403/quizz/005/en.yml index 393dcdebcde..36eee3d759d 100644 --- a/courses/scr403/quizz/005/en.yml +++ b/courses/scr403/quizz/005/en.yml @@ -1,9 +1,9 @@ question: What does the 'take' combinator do? -answer: It extracts the left component from a product type, discarding the right. +answer: It extracts the left component of a product, discarding the right. wrong_answers: - - It removes an element from a sum type. - - It sequentially composes two operations. - - It wraps a value with a left tag to create a sum type. + - It removes an element from a sum type, discarding the tag bit. + - It sequentially composes two separate operations end to end. + - It wraps a value with a left tag to build up a new sum type. explanation: >- The take combinator is an extractor for product types. Given take f applied to a pair ⟨a, b⟩, it discards b and applies f to a. Combined diff --git a/courses/scr403/quizz/005/question.yml b/courses/scr403/quizz/005/question.yml index 4e70f03f44b..11ad053b626 100644 --- a/courses/scr403/quizz/005/question.yml +++ b/courses/scr403/quizz/005/question.yml @@ -1,8 +1,8 @@ id: 3f77abbb-10d4-41c6-a269-ccf8e0c44ff5 -chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d +chapterId: 2a10a6ba-fada-4556-a673-3ae8c0794bf0 difficulty: intermediate duration: 15 -author: PlanB Network +author: 2e1b5182-567e-453a-af29-36009340ff02 original_language: en proofreading: diff --git a/courses/scr403/quizz/006/en.yml b/courses/scr403/quizz/006/en.yml index bad9609983e..4458f55b340 100644 --- a/courses/scr403/quizz/006/en.yml +++ b/courses/scr403/quizz/006/en.yml @@ -1,9 +1,9 @@ question: What does the completeness theorem guarantee about Simplicity? -answer: That any function between two Simplicity types can be expressed using the nine core combinators. +answer: That any function between two Simplicity types can be built from the nine combinators. wrong_answers: - - That Simplicity programs always terminate in constant time. - - That Simplicity can simulate any Turing machine. - - That every Simplicity program has a unique representation. + - That Simplicity programs are guaranteed to always terminate in constant time. + - That Simplicity is Turing-complete and can simulate any Turing machine at all. + - That every valid Simplicity program has one single unique representation. explanation: >- The completeness theorem proves that for any function between finite Simplicity types, there exists a Simplicity expression that computes it. diff --git a/courses/scr403/quizz/006/question.yml b/courses/scr403/quizz/006/question.yml index 616601f3a40..ff6fd3c8140 100644 --- a/courses/scr403/quizz/006/question.yml +++ b/courses/scr403/quizz/006/question.yml @@ -1,8 +1,8 @@ id: 963fde32-783e-4e20-8c3f-cae31bdcc2bf -chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d +chapterId: 2a10a6ba-fada-4556-a673-3ae8c0794bf0 difficulty: intermediate duration: 15 -author: PlanB Network +author: 2e1b5182-567e-453a-af29-36009340ff02 original_language: en proofreading: diff --git a/courses/scr403/quizz/007/en.yml b/courses/scr403/quizz/007/en.yml index a9c1c264611..df6d01d6667 100644 --- a/courses/scr403/quizz/007/en.yml +++ b/courses/scr403/quizz/007/en.yml @@ -1,12 +1,13 @@ question: How is the boolean type (𝟚) defined in Simplicity? -answer: As the sum type 𝟙 + 𝟙, containing exactly two values (false and true). +answer: As the sum type 𝟙 + 𝟙, holding exactly two values (false and true). wrong_answers: - - As a product type 𝟙 × 𝟙 with one value. - - As a special primitive type built into the language. - - As a 32-bit integer type restricted to 0 and 1. + - As a product type 𝟙 × 𝟙 that would then hold only one value. + - As a special primitive type built directly into the language. + - As a 32-bit integer type restricted to just the values 0 and 1. explanation: >- - The boolean type 𝟚 is defined as 𝟙 + 𝟙, a sum of two unit types. - The left-tagged value σᴸ⟨⟩ represents false (0) and the right-tagged - value σᴿ⟨⟩ represents true (1). This is a one-bit data type built - entirely from Simplicity's three type formers. + The boolean type 𝟚 is defined as 𝟙 + 𝟙, a sum of two unit types. The + left-tagged value σᴸ⟨⟩ represents false (0) and the right-tagged value + σᴿ⟨⟩ represents true (1). This is a one-bit data type built from just + the unit type and the sum type former — the product former is not + needed. reviewed: false diff --git a/courses/scr403/quizz/007/question.yml b/courses/scr403/quizz/007/question.yml index 4f68a1821b9..346c3f3bdc8 100644 --- a/courses/scr403/quizz/007/question.yml +++ b/courses/scr403/quizz/007/question.yml @@ -1,8 +1,8 @@ id: c0dc9faf-1c10-4082-82c3-e4b07e7217f9 -chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d +chapterId: 2a10a6ba-fada-4556-a673-3ae8c0794bf0 difficulty: intermediate duration: 15 -author: PlanB Network +author: 2e1b5182-567e-453a-af29-36009340ff02 original_language: en proofreading: diff --git a/courses/scr403/quizz/008/en.yml b/courses/scr403/quizz/008/en.yml index 99c6af83044..a6040732401 100644 --- a/courses/scr403/quizz/008/en.yml +++ b/courses/scr403/quizz/008/en.yml @@ -1,9 +1,9 @@ question: How does the logical AND operation work in Simplicity? -answer: It branches on the first bit — if false, returns false; if true, returns the second bit. +answer: It branches on the first bit — if false it returns false, else the second bit. wrong_answers: - - It multiplies two boolean values using the product type. + - It multiplies the two boolean values together using the product type. - It uses a lookup table with all four possible input combinations. - - It applies the XOR combinator followed by the NOT combinator. + - It applies the XOR combinator and then the NOT combinator to the result. explanation: >- AND is defined as case (injl unit) (drop iden). The case combinator branches on the first bit. If it's false (left-tagged), injl unit diff --git a/courses/scr403/quizz/008/question.yml b/courses/scr403/quizz/008/question.yml index 1206907021d..fd8d149a529 100644 --- a/courses/scr403/quizz/008/question.yml +++ b/courses/scr403/quizz/008/question.yml @@ -1,8 +1,8 @@ id: e5e0c93e-c244-4d00-ac35-7bc6e4533813 -chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d +chapterId: 9981ae62-ae50-4770-adf2-b253d1e08de3 difficulty: intermediate duration: 15 -author: PlanB Network +author: 2e1b5182-567e-453a-af29-36009340ff02 original_language: en proofreading: diff --git a/courses/scr403/quizz/009/question.yml b/courses/scr403/quizz/009/question.yml index 220c4e05051..3d8afa7bdb3 100644 --- a/courses/scr403/quizz/009/question.yml +++ b/courses/scr403/quizz/009/question.yml @@ -1,8 +1,8 @@ id: 6d167e33-3e10-4e7a-8919-6565f929eb8d -chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d +chapterId: 9981ae62-ae50-4770-adf2-b253d1e08de3 difficulty: intermediate duration: 15 -author: PlanB Network +author: 2e1b5182-567e-453a-af29-36009340ff02 original_language: en proofreading: diff --git a/courses/scr403/quizz/010/en.yml b/courses/scr403/quizz/010/en.yml index e967ec0dd7e..afda0a95c6c 100644 --- a/courses/scr403/quizz/010/en.yml +++ b/courses/scr403/quizz/010/en.yml @@ -1,9 +1,9 @@ question: How are fixed-length vectors built in Simplicity's type system? -answer: Through iterated product types with power-of-two lengths (e.g., A⁴ = A² × A²). +answer: Through nested product types of power-of-two length (e.g. A⁴ = A² × A²). wrong_answers: - Using a special array type constructor built into the language. - - Through recursive sum types that chain elements together. - - Using variable-length buffers with a fixed maximum. + - Through recursive sum types that chain the elements together in a list. + - Using variable-length buffers that have a fixed maximum size. explanation: >- Simplicity builds vectors from nested product types. A² is A × A, A⁴ is A² × A², A⁸ is A⁴ × A⁴, and so on. This gives power-of-two diff --git a/courses/scr403/quizz/010/question.yml b/courses/scr403/quizz/010/question.yml index 99326e3e49f..e647241dd8b 100644 --- a/courses/scr403/quizz/010/question.yml +++ b/courses/scr403/quizz/010/question.yml @@ -1,8 +1,8 @@ id: 582e5a78-71f9-4dca-87f0-bdcc65c5179b -chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d +chapterId: 9981ae62-ae50-4770-adf2-b253d1e08de3 difficulty: intermediate duration: 15 -author: PlanB Network +author: 2e1b5182-567e-453a-af29-36009340ff02 original_language: en proofreading: diff --git a/courses/scr403/quizz/011/en.yml b/courses/scr403/quizz/011/en.yml index 54f4397852f..0584fbd1890 100644 --- a/courses/scr403/quizz/011/en.yml +++ b/courses/scr403/quizz/011/en.yml @@ -1,9 +1,9 @@ question: What is the role of jets in Simplicity? -answer: Jets are optimized native implementations that replace specific Simplicity expressions for practical performance. +answer: Jets are native implementations replacing given Simplicity expressions for speed. wrong_answers: - - Jets are a compilation step that converts Simplicity to Bitcoin Script. - - Jets are network messages that broadcast Simplicity programs to nodes. - - Jets are debugging tools for testing Simplicity expressions. + - Jets are a compilation step that converts Simplicity into Bitcoin Script. + - Jets are network messages that broadcast Simplicity programs to all nodes. + - Jets are debugging tools for testing and tracing Simplicity expressions. explanation: >- A jet is a native implementation that the network agrees to substitute for a particular Simplicity expression (identified by its Merkle root). diff --git a/courses/scr403/quizz/011/question.yml b/courses/scr403/quizz/011/question.yml index 100196bd6e7..05a5bd5a44f 100644 --- a/courses/scr403/quizz/011/question.yml +++ b/courses/scr403/quizz/011/question.yml @@ -1,8 +1,8 @@ id: 1a8a9923-3600-446e-afd9-299c3bff7f9d -chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d +chapterId: 9981ae62-ae50-4770-adf2-b253d1e08de3 difficulty: intermediate duration: 15 -author: PlanB Network +author: 2e1b5182-567e-453a-af29-36009340ff02 original_language: en proofreading: diff --git a/courses/scr403/quizz/012/en.yml b/courses/scr403/quizz/012/en.yml index 935f6748eb5..0e27d03edd8 100644 --- a/courses/scr403/quizz/012/en.yml +++ b/courses/scr403/quizz/012/en.yml @@ -1,9 +1,9 @@ question: Why are Simplicity expressions serialized as DAGs rather than trees? -answer: To prevent exponential growth — shared sub-expressions are stored once and referenced multiple times. +answer: To prevent exponential growth, since shared sub-expressions are stored just once. wrong_answers: - - Because trees cannot represent conditional branching. - - To enable parallel execution on multi-core processors. - - Because the Liquid Network protocol requires DAG format. + - Because plain tree structures cannot represent conditional branching at all. + - To enable parallel execution across many separate multi-core processors. + - Because the Liquid Network protocol strictly mandates the DAG format here. explanation: >- Simplicity expressions naturally form trees that could grow exponentially as complexity increases. By serializing as directed acyclic graphs (DAGs), diff --git a/courses/scr403/quizz/012/question.yml b/courses/scr403/quizz/012/question.yml index bc270799ff6..22a7d911aaf 100644 --- a/courses/scr403/quizz/012/question.yml +++ b/courses/scr403/quizz/012/question.yml @@ -1,8 +1,8 @@ id: b5e01b45-f621-429b-abee-c748b73739fd -chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d +chapterId: 9981ae62-ae50-4770-adf2-b253d1e08de3 difficulty: intermediate duration: 15 -author: PlanB Network +author: 2e1b5182-567e-453a-af29-36009340ff02 original_language: en proofreading: diff --git a/courses/scr403/quizz/013/en.yml b/courses/scr403/quizz/013/en.yml index d00bb86d35f..bd2d9979ee2 100644 --- a/courses/scr403/quizz/013/en.yml +++ b/courses/scr403/quizz/013/en.yml @@ -1,9 +1,9 @@ question: Why does Simplicity use static analysis instead of a dynamic gas model like Ethereum? -answer: To determine resource bounds before execution begins, guaranteeing predictable validation costs. +answer: To determine resource bounds before execution begins, giving predictable costs. wrong_answers: - - Because static analysis is faster to implement for developers. - - Because Ethereum's gas model was patented and unavailable. - - Because Simplicity programs are too short to need metering. + - Because static analysis is simply much faster to implement for developers. + - Because Ethereum's own gas model was patented and therefore unavailable. + - Because Simplicity programs are far too short to ever really need metering. explanation: >- Simplicity's static analysis allows the network to know exactly how much computation a program requires before it runs. This eliminates diff --git a/courses/scr403/quizz/013/question.yml b/courses/scr403/quizz/013/question.yml index 8ab933be474..cbb42db2b01 100644 --- a/courses/scr403/quizz/013/question.yml +++ b/courses/scr403/quizz/013/question.yml @@ -1,8 +1,8 @@ id: 0c2c49a2-3766-467a-8ab4-c16c15a5dd60 -chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d +chapterId: 6d46e77a-7e60-473b-b230-418da5ae44eb difficulty: intermediate duration: 15 -author: PlanB Network +author: 2e1b5182-567e-453a-af29-36009340ff02 original_language: en proofreading: diff --git a/courses/scr403/quizz/014/en.yml b/courses/scr403/quizz/014/en.yml index a76cc993482..a2dca5764b3 100644 --- a/courses/scr403/quizz/014/en.yml +++ b/courses/scr403/quizz/014/en.yml @@ -1,9 +1,9 @@ question: What is the unit type (𝟙) and why is it useful despite carrying no information? -answer: It contains a single value (the empty tuple) and serves as the base building block from which all other types are constructed. +answer: It holds one value (the empty tuple) and is the base for all other types. wrong_answers: - - It represents the number 1 and is used for arithmetic. - - It is a debugging type that logs execution traces. - - It stores a single bit of data for boolean operations. + - It represents the number 1 and is used directly for arithmetic operations. + - It is a special debugging type that logs execution traces out to a file. + - It stores exactly a single bit of data used for boolean operations. explanation: >- The unit type 𝟙 has exactly one value — the empty tuple ⟨⟩. While it carries zero bits of information, it is essential as the seed diff --git a/courses/scr403/quizz/014/question.yml b/courses/scr403/quizz/014/question.yml index 1adb0e6c706..6ea5d0e808b 100644 --- a/courses/scr403/quizz/014/question.yml +++ b/courses/scr403/quizz/014/question.yml @@ -1,8 +1,8 @@ id: d92a0b52-981d-4a4b-b245-4a6b0c0ac328 -chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d +chapterId: 2a10a6ba-fada-4556-a673-3ae8c0794bf0 difficulty: intermediate duration: 15 -author: PlanB Network +author: 2e1b5182-567e-453a-af29-36009340ff02 original_language: en proofreading: diff --git a/courses/scr403/quizz/015/en.yml b/courses/scr403/quizz/015/en.yml index 1045f8d18ae..1ab13354476 100644 --- a/courses/scr403/quizz/015/en.yml +++ b/courses/scr403/quizz/015/en.yml @@ -1,9 +1,9 @@ question: Why does the 'case' combinator include a shared environment type C in its signature? -answer: So that both branches can access shared context data alongside the tagged input value. +answer: So both branches can read shared context data alongside the tagged input. wrong_answers: - - To limit the size of the input to prevent stack overflows. - - To enable recursive calls between the two branches. - - To store the output of the previous combinator in the chain. + - To limit the size of the input in order to prevent stack overflows. + - To enable recursive calls back and forth between the two branches. + - To store the output of the previous combinator earlier in the chain. explanation: >- The case combinator has signature (A + B) × C ⊢ D. The extra type C acts as a shared environment that both the left branch (f : A × C ⊢ D) diff --git a/courses/scr403/quizz/015/question.yml b/courses/scr403/quizz/015/question.yml index 9a6da05dad0..4db7ce7010c 100644 --- a/courses/scr403/quizz/015/question.yml +++ b/courses/scr403/quizz/015/question.yml @@ -1,8 +1,8 @@ id: 8b4ee208-b723-41c4-af9c-0d30b10132fb -chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d +chapterId: 2a10a6ba-fada-4556-a673-3ae8c0794bf0 difficulty: intermediate duration: 15 -author: PlanB Network +author: 2e1b5182-567e-453a-af29-36009340ff02 original_language: en proofreading: diff --git a/courses/scr403/quizz/016/en.yml b/courses/scr403/quizz/016/en.yml index e1ae1d0eac6..5b4a55e3bdf 100644 --- a/courses/scr403/quizz/016/en.yml +++ b/courses/scr403/quizz/016/en.yml @@ -1,9 +1,9 @@ question: What is the relationship between Simplicity and Gentzen's sequent calculus? -answer: Simplicity's nine core combinators correspond to a tweaked functional interpretation of the conjunctive-disjunctive fragment of the sequent calculus. +answer: Its nine combinators mirror the conjunctive-disjunctive fragment of the sequent calculus. wrong_answers: - - Simplicity was directly translated from sequent calculus proofs into code. + - Simplicity was directly translated from sequent calculus proofs into working code. - Gentzen's sequent calculus is used at runtime to type-check Simplicity programs. - - They are unrelated; the similarity is coincidental. + - They are entirely unrelated, and the surface similarity is purely coincidental. explanation: >- The nine core rules of Simplicity closely resemble rules in Gentzen's sequent calculus, analogous to the Curry-Howard correspondence between diff --git a/courses/scr403/quizz/016/question.yml b/courses/scr403/quizz/016/question.yml index 18cc1e4c50c..f30c3bf990b 100644 --- a/courses/scr403/quizz/016/question.yml +++ b/courses/scr403/quizz/016/question.yml @@ -1,8 +1,8 @@ id: c4df1bd0-8d1c-4f71-ac5a-ebf3be1f4a51 -chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d +chapterId: 2a10a6ba-fada-4556-a673-3ae8c0794bf0 difficulty: intermediate duration: 15 -author: PlanB Network +author: 2e1b5182-567e-453a-af29-36009340ff02 original_language: en proofreading: diff --git a/courses/scr403/quizz/017/en.yml b/courses/scr403/quizz/017/en.yml index 88012c01ad7..c245af6ec3d 100644 --- a/courses/scr403/quizz/017/en.yml +++ b/courses/scr403/quizz/017/en.yml @@ -1,8 +1,8 @@ question: How does the access notation (O, I, H) work in Simplicity? -answer: O abbreviates 'take' (left element), I abbreviates 'drop' (right element), and H abbreviates 'iden' (whole value), allowing binary-tree navigation of nested tuples. +answer: O means 'take' (left), I means 'drop' (right), and H means 'iden' (whole value). wrong_answers: - - O means output, I means input, and H means halt. - - They are variable names assigned automatically by the compiler. + - O means output, I means input, and H means halt the program's execution. + - They are variable names that the compiler assigns to values automatically. - O selects odd-indexed elements, I selects even-indexed elements, H selects the head. explanation: >- The O/I/H shorthand provides a compact way to navigate nested pairs. diff --git a/courses/scr403/quizz/017/question.yml b/courses/scr403/quizz/017/question.yml index 1b890711970..e5874f98ec9 100644 --- a/courses/scr403/quizz/017/question.yml +++ b/courses/scr403/quizz/017/question.yml @@ -1,8 +1,8 @@ id: f88741e5-8019-427f-80d4-de0616a2bd9a -chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d +chapterId: 9981ae62-ae50-4770-adf2-b253d1e08de3 difficulty: intermediate duration: 15 -author: PlanB Network +author: 2e1b5182-567e-453a-af29-36009340ff02 original_language: en proofreading: diff --git a/courses/scr403/quizz/018/en.yml b/courses/scr403/quizz/018/en.yml index 71bfc27749f..b331f7056a2 100644 --- a/courses/scr403/quizz/018/en.yml +++ b/courses/scr403/quizz/018/en.yml @@ -1,9 +1,9 @@ question: How are variable-length buffers represented in Simplicity's type system? -answer: As nested products of option types, where each option layer represents the presence or absence of a power-of-two sized block. +answer: As nested option-type products, each layer flagging a power-of-two block. wrong_answers: - - Using a special dynamic array type built into the language. - - Through recursive sum types that grow on each function call. - - As fixed-size vectors padded with zero values. + - Using a special dynamic array type built directly into the language. + - Through recursive sum types that grow larger on each function call. + - As fixed-size vectors that are padded out with trailing zero values. explanation: >- Buffers use nested option types. For example, Xᑉ⁸ expands to (1 + X⁴) × ((1 + X²) × (1 + X)), which as a polynomial yields diff --git a/courses/scr403/quizz/018/question.yml b/courses/scr403/quizz/018/question.yml index 74d5b110c37..14f56c1f1e7 100644 --- a/courses/scr403/quizz/018/question.yml +++ b/courses/scr403/quizz/018/question.yml @@ -1,8 +1,8 @@ id: 8ecab257-d521-437a-ad11-bb6d2020b0f1 -chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d +chapterId: 9981ae62-ae50-4770-adf2-b253d1e08de3 difficulty: intermediate duration: 15 -author: PlanB Network +author: 2e1b5182-567e-453a-af29-36009340ff02 original_language: en proofreading: diff --git a/courses/scr403/quizz/019/en.yml b/courses/scr403/quizz/019/en.yml index ea6a6d1aa66..70eea425845 100644 --- a/courses/scr403/quizz/019/en.yml +++ b/courses/scr403/quizz/019/en.yml @@ -1,9 +1,9 @@ question: What is SimplicityHL and why is it needed? -answer: A higher-level language that compiles down to Simplicity expressions, handling variable naming, scope, and environment management automatically. +answer: A higher-level language compiling to Simplicity that manages naming and scope. wrong_answers: - - A hardware description language for mining ASICs that run Simplicity. - - A graphical IDE for visually connecting Simplicity combinators. - - A testing framework for running Simplicity programs in a sandbox. + - A hardware description language for mining the ASICs that run Simplicity. + - A graphical drag-and-drop IDE for wiring together Simplicity combinators. + - A testing framework for running Simplicity programs inside a safe sandbox. explanation: >- Raw Simplicity becomes inscrutable at production complexity levels because all data access must be done through nested take/drop combinators. SimplicityHL diff --git a/courses/scr403/quizz/019/question.yml b/courses/scr403/quizz/019/question.yml index 5386fc1be32..b36520ef012 100644 --- a/courses/scr403/quizz/019/question.yml +++ b/courses/scr403/quizz/019/question.yml @@ -1,8 +1,8 @@ id: b4130b1d-4f08-4543-948c-3c2095cd110f -chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d +chapterId: 9981ae62-ae50-4770-adf2-b253d1e08de3 difficulty: intermediate duration: 15 -author: PlanB Network +author: 2e1b5182-567e-453a-af29-36009340ff02 original_language: en proofreading: diff --git a/courses/scr403/quizz/020/question.yml b/courses/scr403/quizz/020/question.yml index b7ccc000458..f7b8ab10cb5 100644 --- a/courses/scr403/quizz/020/question.yml +++ b/courses/scr403/quizz/020/question.yml @@ -1,8 +1,8 @@ id: db95b84e-6529-4422-aae2-3d6f8a789013 -chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d +chapterId: 9eafe498-0765-419a-a69d-a74a9cdf3713 difficulty: intermediate duration: 15 -author: PlanB Network +author: 2e1b5182-567e-453a-af29-36009340ff02 original_language: en proofreading: diff --git a/courses/scr403/quizz/021/en.yml b/courses/scr403/quizz/021/en.yml index ae858cf62ad..3cde1cab1a3 100644 --- a/courses/scr403/quizz/021/en.yml +++ b/courses/scr403/quizz/021/en.yml @@ -1,9 +1,9 @@ question: "Why is the Failure effect commutative in Simplicity, even though exceptions are generally not commutative?" -answer: "Because the exception type is unit (1), so there is only one possible exception value — no matter which expression throws, the result is the same." +answer: Because the exception type is unit (1) with only one value, so the throwing order does not matter. wrong_answers: - - "Because Simplicity executes all expressions in a deterministic order defined by the combinator tree." - - "Because the Failure effect is always caught and re-thrown by the case combinator." - - "Because Simplicity uses batch verification which makes all exceptions equivalent." + - Because Simplicity executes all expressions in a deterministic order defined by the combinator tree. + - Because the Failure effect is always caught and then re-thrown by the case combinator. + - Because Simplicity uses batch verification, which makes all thrown exceptions equivalent. explanation: >- In general, exceptions are not commutative because different expressions may throw different exception values. However, Simplicity restricts exceptions to unit type (only one possible value), diff --git a/courses/scr403/quizz/021/question.yml b/courses/scr403/quizz/021/question.yml index e2a3e2417e7..3427ac7d792 100644 --- a/courses/scr403/quizz/021/question.yml +++ b/courses/scr403/quizz/021/question.yml @@ -1,8 +1,8 @@ id: b5e36dfe-d941-4041-ba23-dc1643d7abc9 -chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d +chapterId: 9eafe498-0765-419a-a69d-a74a9cdf3713 difficulty: intermediate duration: 15 -author: PlanB Network +author: 2e1b5182-567e-453a-af29-36009340ff02 original_language: en proofreading: diff --git a/courses/scr403/quizz/022/en.yml b/courses/scr403/quizz/022/en.yml index a32b6bb3e99..19f735016cd 100644 --- a/courses/scr403/quizz/022/en.yml +++ b/courses/scr403/quizz/022/en.yml @@ -1,9 +1,9 @@ question: "Why does bip0340-verify use the Failure effect instead of returning a boolean (true/false)?" -answer: "To enable batch verification of Schnorr signatures, which requires that any single failed check causes the entire batch to fail." +answer: To enable batch verification of Schnorr signatures, where one failed check fails the batch. wrong_answers: - - "Because boolean types are too expensive in terms of block space compared to the unit type." - - "Because Simplicity's type system cannot represent boolean return values from jets." - - "Because returning a boolean would violate the completeness theorem." + - Because boolean types are too expensive in terms of block space compared to the unit type. + - Because Simplicity's type system cannot represent boolean return values coming from jets. + - Because returning a plain boolean value would directly violate the completeness theorem. explanation: >- If bip0340-verify returned a boolean, a failing signature check could still lead to a branch where the script succeeds. In that case, the verifier would need to know which specific signature diff --git a/courses/scr403/quizz/022/question.yml b/courses/scr403/quizz/022/question.yml index 26c72498a44..ceec26810de 100644 --- a/courses/scr403/quizz/022/question.yml +++ b/courses/scr403/quizz/022/question.yml @@ -1,8 +1,8 @@ id: 04d17f4c-1e95-4c2e-8e40-c9b84cf75b2f -chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d +chapterId: 9eafe498-0765-419a-a69d-a74a9cdf3713 difficulty: intermediate duration: 15 -author: PlanB Network +author: 2e1b5182-567e-453a-af29-36009340ff02 original_language: en proofreading: diff --git a/courses/scr403/quizz/023/en.yml b/courses/scr403/quizz/023/en.yml index 62cc510178a..86152612da3 100644 --- a/courses/scr403/quizz/023/en.yml +++ b/courses/scr403/quizz/023/en.yml @@ -1,9 +1,9 @@ question: "Why does sig-all-hash use the Reader effect instead of taking the transaction data as a typed input?" -answer: "So the jet can rely on PrecomputedTransactionData and operate in constant time, since it only accesses a fixed transaction environment." +answer: So the jet can use PrecomputedTransactionData and run in constant time on a fixed environment. wrong_answers: - - "Because Simplicity's type system cannot represent transaction data as a type." - - "Because the Reader effect is faster than passing data through the combinator tree." - - "Because transaction data is too large to fit in Simplicity's fixed-size type system." + - Because Simplicity's type system fundamentally cannot represent transaction data as a type. + - Because the Reader effect is faster than passing that data through the combinator tree. + - Because transaction data is far too large to fit in Simplicity's fixed-size type system. explanation: >- If sig-all-hash took a TxEnv input type, programs could pass modified copies of transaction data to the jet, preventing it from using precomputed hashes. With the Reader effect, the jet only diff --git a/courses/scr403/quizz/023/question.yml b/courses/scr403/quizz/023/question.yml index 573603838c7..ed037176c0d 100644 --- a/courses/scr403/quizz/023/question.yml +++ b/courses/scr403/quizz/023/question.yml @@ -1,8 +1,8 @@ id: 0b2a2848-cb65-46e2-be56-e98513794786 -chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d +chapterId: 9eafe498-0765-419a-a69d-a74a9cdf3713 difficulty: intermediate duration: 15 -author: PlanB Network +author: 2e1b5182-567e-453a-af29-36009340ff02 original_language: en proofreading: diff --git a/courses/scr403/quizz/024/en.yml b/courses/scr403/quizz/024/en.yml index 3374ea14502..eb0b4ace5a2 100644 --- a/courses/scr403/quizz/024/en.yml +++ b/courses/scr403/quizz/024/en.yml @@ -1,9 +1,9 @@ question: "What is the type of a Simplicity program?" -answer: "1 ⊢ 1 (unit to unit) — it takes no meaningful input and produces no meaningful output, using side effects for I/O." +answer: 1 ⊢ 1 (unit to unit) — no meaningful input or output; side effects do the I/O. wrong_answers: - - "TxEnv ⊢ Bool — it takes transaction data and returns a validity boolean." - - "2^256 ⊢ 2^256 — it takes a hash input and returns a hash output." - - "Any type A ⊢ B — programs can have arbitrary input and output types." + - TxEnv ⊢ Bool — it takes transaction data and returns a validity boolean. + - 2^256 ⊢ 2^256 — it takes a hash input and returns a new hash output value. + - Any type A ⊢ B — programs may have completely arbitrary input and output types. explanation: >- A Simplicity program is defined as an expression of type 1 ⊢ 1. The Reader effect captures the transaction environment input, while the Failure effect determines success or failure. diff --git a/courses/scr403/quizz/024/question.yml b/courses/scr403/quizz/024/question.yml index 31a29145ec3..1418dfb1c68 100644 --- a/courses/scr403/quizz/024/question.yml +++ b/courses/scr403/quizz/024/question.yml @@ -1,8 +1,8 @@ id: bbc1725b-94ae-42ea-85cc-4e40087a985a -chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d +chapterId: 961652e3-8f7d-4c2a-8b55-9a990b91a0dd difficulty: intermediate duration: 15 -author: PlanB Network +author: 2e1b5182-567e-453a-af29-36009340ff02 original_language: en proofreading: diff --git a/courses/scr403/quizz/025/en.yml b/courses/scr403/quizz/025/en.yml index bc9564cf27b..48e227d1005 100644 --- a/courses/scr403/quizz/025/en.yml +++ b/courses/scr403/quizz/025/en.yml @@ -1,9 +1,9 @@ question: "What is a Commitment Merkle Root (CMR) in Simplicity?" -answer: "A 256-bit hash that commits to the structure of a Simplicity program using tagged SHA-256 for each combinator." +answer: A 256-bit hash committing to a Simplicity program's structure with tagged SHA-256. wrong_answers: - - "A binary tree containing all possible execution paths of a Simplicity program." - - "A hash of the program's types and witness values used for address verification." - - "A Merkle root of the transaction data that the program is authorized to access." + - A binary tree containing all possible execution paths of a Simplicity program. + - A hash of the program's types and witness values used for address verification. + - A Merkle root of the transaction data that the program is authorized to access. explanation: >- Each Simplicity combinator has a unique SHA-256 tag (e.g., Simplicity␟Commitment␟iden), and the CMR is computed by recursively hashing the program's combinator tree using these tagged midstates. diff --git a/courses/scr403/quizz/025/question.yml b/courses/scr403/quizz/025/question.yml index 1f1f942c7ce..e7ecd3666cb 100644 --- a/courses/scr403/quizz/025/question.yml +++ b/courses/scr403/quizz/025/question.yml @@ -1,8 +1,8 @@ id: e9f7f36d-e07d-4ad2-9d12-845c0b5f63bb -chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d +chapterId: 961652e3-8f7d-4c2a-8b55-9a990b91a0dd difficulty: intermediate duration: 15 -author: PlanB Network +author: 2e1b5182-567e-453a-af29-36009340ff02 original_language: en proofreading: diff --git a/courses/scr403/quizz/026/en.yml b/courses/scr403/quizz/026/en.yml index 5887ce6d238..2e12a506cb6 100644 --- a/courses/scr403/quizz/026/en.yml +++ b/courses/scr403/quizz/026/en.yml @@ -1,9 +1,9 @@ question: "What TapLeaf version does Simplicity use when committed under BIP-0341 Taproot?" -answer: "Version 0xbe." +answer: Version 0xbe, which is the byte value 190 in decimal. wrong_answers: - - "Version 0xc0, the same as Bitcoin Script Tapscript." - - "Version 0x00, the default Taproot version." - - "Version 0xff, a reserved version for experimental scripts." + - Version 0xc0, the same as Bitcoin Script Tapscript. + - Version 0x00, the default Taproot leaf version. + - Version 0xff, a reserved version for experimental scripts. explanation: >- Simplicity programs are committed into Taproot addresses using TapLeaf version 0xbe. This distinguishes Simplicity scripts from Bitcoin Tapscript (which uses version 0xc0) and allows diff --git a/courses/scr403/quizz/026/question.yml b/courses/scr403/quizz/026/question.yml index a24a5621fa5..2b41f2e8f64 100644 --- a/courses/scr403/quizz/026/question.yml +++ b/courses/scr403/quizz/026/question.yml @@ -1,8 +1,8 @@ id: 55d95b1b-18e0-4ac0-b5d2-e5f18ea365a0 -chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d +chapterId: 961652e3-8f7d-4c2a-8b55-9a990b91a0dd difficulty: intermediate duration: 15 -author: PlanB Network +author: 2e1b5182-567e-453a-af29-36009340ff02 original_language: en proofreading: diff --git a/courses/scr403/quizz/027/en.yml b/courses/scr403/quizz/027/en.yml index 5f0baaad28b..d05627cdf06 100644 --- a/courses/scr403/quizz/027/en.yml +++ b/courses/scr403/quizz/027/en.yml @@ -1,9 +1,9 @@ question: "Why are witness values excluded from the Commitment Merkle Root (CMR)?" -answer: "So that addresses can be calculated before knowing witness values, and unexecuted branches can be pruned without revealing their witness data." +answer: So addresses form before witnesses are known, and unused branches prune privately. wrong_answers: - - "Because witness values are too large to include in a 256-bit hash." - - "Because witness values are validated separately by the Failure effect." - - "Because including witness values would make the CMR non-deterministic." + - Because witness values are simply far too large to include in a 256-bit hash. + - Because witness values are validated entirely separately by the Failure effect. + - Because including the witness values would make the CMR non-deterministic. explanation: >- Witness expressions (like signatures) are provided at spending time, not at address creation time. Excluding them from the CMR enables two important properties: addresses can be generated before diff --git a/courses/scr403/quizz/027/question.yml b/courses/scr403/quizz/027/question.yml index a5ad7bc5722..aac7b77525b 100644 --- a/courses/scr403/quizz/027/question.yml +++ b/courses/scr403/quizz/027/question.yml @@ -1,8 +1,8 @@ id: a81a36bd-d3da-4205-886b-3b66bc82fa1f -chapterId: 2cc5e818-abcb-4a0a-9991-7a492c572e2d +chapterId: 961652e3-8f7d-4c2a-8b55-9a990b91a0dd difficulty: intermediate duration: 15 -author: PlanB Network +author: 2e1b5182-567e-453a-af29-36009340ff02 original_language: en proofreading: diff --git a/professors/russell-oconnor/professor.yml b/professors/russell-oconnor/professor.yml index 221b91f9385..495ad38131e 100644 --- a/professors/russell-oconnor/professor.yml +++ b/professors/russell-oconnor/professor.yml @@ -3,7 +3,6 @@ name: "Russell O'Connor" contributor_id: rocket-turtle links: - twitter: website: http://r6.ca/ github: https://github.com/oconnorr From b7a62fc3f11a1a95759c2f4a2d4f350c2d8b81ee Mon Sep 17 00:00:00 2001 From: Asi0Flammeus Date: Thu, 2 Jul 2026 09:36:06 +0200 Subject: [PATCH 13/14] quiz(scr403): expand + re-grade exam pool to 43 (21 hard / 15 intermediate / 7 easy) - re-grade the 28 existing quizzes to true difficulty (was uniformly 'intermediate'): 7 easy, 15 intermediate, 6 hard; align durations to 15/30/45 - author 15 new hard synthesis questions across the 5 content chapters (dirs 028-042), source-verified against O'Connor's Delving Simplicity series, answer-length balanced - meets exam requirement: >=40 total, >=20 hard, >=15 intermediate, >=5 easy --- courses/scr403/quizz/000/question.yml | 2 +- courses/scr403/quizz/001/question.yml | 2 +- courses/scr403/quizz/002/question.yml | 2 +- courses/scr403/quizz/003/question.yml | 2 +- courses/scr403/quizz/004/question.yml | 2 +- courses/scr403/quizz/005/question.yml | 2 +- courses/scr403/quizz/006/question.yml | 2 +- courses/scr403/quizz/007/question.yml | 2 +- courses/scr403/quizz/008/question.yml | 2 +- courses/scr403/quizz/009/question.yml | 2 +- courses/scr403/quizz/010/question.yml | 2 +- courses/scr403/quizz/011/question.yml | 2 +- courses/scr403/quizz/012/question.yml | 2 +- courses/scr403/quizz/013/question.yml | 2 +- courses/scr403/quizz/014/question.yml | 2 +- courses/scr403/quizz/015/question.yml | 4 ++-- courses/scr403/quizz/016/question.yml | 4 ++-- courses/scr403/quizz/017/question.yml | 2 +- courses/scr403/quizz/018/question.yml | 2 +- courses/scr403/quizz/019/question.yml | 2 +- courses/scr403/quizz/020/question.yml | 2 +- courses/scr403/quizz/021/question.yml | 4 ++-- courses/scr403/quizz/022/question.yml | 4 ++-- courses/scr403/quizz/023/question.yml | 4 ++-- courses/scr403/quizz/024/question.yml | 2 +- courses/scr403/quizz/025/question.yml | 2 +- courses/scr403/quizz/026/question.yml | 2 +- courses/scr403/quizz/027/question.yml | 4 ++-- courses/scr403/quizz/028/en.yml | 16 ++++++++++++++++ courses/scr403/quizz/028/question.yml | 14 ++++++++++++++ courses/scr403/quizz/029/en.yml | 15 +++++++++++++++ courses/scr403/quizz/029/question.yml | 14 ++++++++++++++ courses/scr403/quizz/030/en.yml | 15 +++++++++++++++ courses/scr403/quizz/030/question.yml | 14 ++++++++++++++ courses/scr403/quizz/031/en.yml | 13 +++++++++++++ courses/scr403/quizz/031/question.yml | 14 ++++++++++++++ courses/scr403/quizz/032/en.yml | 16 ++++++++++++++++ courses/scr403/quizz/032/question.yml | 14 ++++++++++++++ courses/scr403/quizz/033/en.yml | 14 ++++++++++++++ courses/scr403/quizz/033/question.yml | 14 ++++++++++++++ courses/scr403/quizz/034/en.yml | 14 ++++++++++++++ courses/scr403/quizz/034/question.yml | 14 ++++++++++++++ courses/scr403/quizz/035/en.yml | 14 ++++++++++++++ courses/scr403/quizz/035/question.yml | 14 ++++++++++++++ courses/scr403/quizz/036/en.yml | 14 ++++++++++++++ courses/scr403/quizz/036/question.yml | 14 ++++++++++++++ courses/scr403/quizz/037/en.yml | 16 ++++++++++++++++ courses/scr403/quizz/037/question.yml | 14 ++++++++++++++ courses/scr403/quizz/038/en.yml | 16 ++++++++++++++++ courses/scr403/quizz/038/question.yml | 14 ++++++++++++++ courses/scr403/quizz/039/en.yml | 17 +++++++++++++++++ courses/scr403/quizz/039/question.yml | 14 ++++++++++++++ courses/scr403/quizz/040/en.yml | 16 ++++++++++++++++ courses/scr403/quizz/040/question.yml | 14 ++++++++++++++ courses/scr403/quizz/041/en.yml | 17 +++++++++++++++++ courses/scr403/quizz/041/question.yml | 14 ++++++++++++++ courses/scr403/quizz/042/en.yml | 16 ++++++++++++++++ courses/scr403/quizz/042/question.yml | 14 ++++++++++++++ 58 files changed, 473 insertions(+), 34 deletions(-) create mode 100644 courses/scr403/quizz/028/en.yml create mode 100644 courses/scr403/quizz/028/question.yml create mode 100644 courses/scr403/quizz/029/en.yml create mode 100644 courses/scr403/quizz/029/question.yml create mode 100644 courses/scr403/quizz/030/en.yml create mode 100644 courses/scr403/quizz/030/question.yml create mode 100644 courses/scr403/quizz/031/en.yml create mode 100644 courses/scr403/quizz/031/question.yml create mode 100644 courses/scr403/quizz/032/en.yml create mode 100644 courses/scr403/quizz/032/question.yml create mode 100644 courses/scr403/quizz/033/en.yml create mode 100644 courses/scr403/quizz/033/question.yml create mode 100644 courses/scr403/quizz/034/en.yml create mode 100644 courses/scr403/quizz/034/question.yml create mode 100644 courses/scr403/quizz/035/en.yml create mode 100644 courses/scr403/quizz/035/question.yml create mode 100644 courses/scr403/quizz/036/en.yml create mode 100644 courses/scr403/quizz/036/question.yml create mode 100644 courses/scr403/quizz/037/en.yml create mode 100644 courses/scr403/quizz/037/question.yml create mode 100644 courses/scr403/quizz/038/en.yml create mode 100644 courses/scr403/quizz/038/question.yml create mode 100644 courses/scr403/quizz/039/en.yml create mode 100644 courses/scr403/quizz/039/question.yml create mode 100644 courses/scr403/quizz/040/en.yml create mode 100644 courses/scr403/quizz/040/question.yml create mode 100644 courses/scr403/quizz/041/en.yml create mode 100644 courses/scr403/quizz/041/question.yml create mode 100644 courses/scr403/quizz/042/en.yml create mode 100644 courses/scr403/quizz/042/question.yml diff --git a/courses/scr403/quizz/000/question.yml b/courses/scr403/quizz/000/question.yml index 9e96ff3cb5e..a1c8e05da4d 100644 --- a/courses/scr403/quizz/000/question.yml +++ b/courses/scr403/quizz/000/question.yml @@ -1,7 +1,7 @@ id: 35ccd3ce-33df-4542-91d9-a558d92548df chapterId: 6d46e77a-7e60-473b-b230-418da5ae44eb difficulty: intermediate -duration: 15 +duration: 30 author: 2e1b5182-567e-453a-af29-36009340ff02 original_language: en diff --git a/courses/scr403/quizz/001/question.yml b/courses/scr403/quizz/001/question.yml index 372c8a855ca..8a02612cb9b 100644 --- a/courses/scr403/quizz/001/question.yml +++ b/courses/scr403/quizz/001/question.yml @@ -1,7 +1,7 @@ id: 5c6d0109-ffe1-4da5-813d-204c9f467111 chapterId: 6d46e77a-7e60-473b-b230-418da5ae44eb difficulty: intermediate -duration: 15 +duration: 30 author: 2e1b5182-567e-453a-af29-36009340ff02 original_language: en diff --git a/courses/scr403/quizz/002/question.yml b/courses/scr403/quizz/002/question.yml index 87aa6b0ab2b..01c7574ffe8 100644 --- a/courses/scr403/quizz/002/question.yml +++ b/courses/scr403/quizz/002/question.yml @@ -1,7 +1,7 @@ id: 9428566d-1ead-4d47-ba46-6b636029c0ef chapterId: 6d46e77a-7e60-473b-b230-418da5ae44eb difficulty: intermediate -duration: 15 +duration: 30 author: 2e1b5182-567e-453a-af29-36009340ff02 original_language: en diff --git a/courses/scr403/quizz/003/question.yml b/courses/scr403/quizz/003/question.yml index 3a8096c4910..ca103ebb2e8 100644 --- a/courses/scr403/quizz/003/question.yml +++ b/courses/scr403/quizz/003/question.yml @@ -1,6 +1,6 @@ id: aa208130-3c60-4310-9867-dc6f80e8aba1 chapterId: 2a10a6ba-fada-4556-a673-3ae8c0794bf0 -difficulty: intermediate +difficulty: easy duration: 15 author: 2e1b5182-567e-453a-af29-36009340ff02 original_language: en diff --git a/courses/scr403/quizz/004/question.yml b/courses/scr403/quizz/004/question.yml index b6da98fb589..afad9fdf060 100644 --- a/courses/scr403/quizz/004/question.yml +++ b/courses/scr403/quizz/004/question.yml @@ -1,6 +1,6 @@ id: 54a868ea-e48c-4afc-a68a-f57b3d06c041 chapterId: 2a10a6ba-fada-4556-a673-3ae8c0794bf0 -difficulty: intermediate +difficulty: easy duration: 15 author: 2e1b5182-567e-453a-af29-36009340ff02 original_language: en diff --git a/courses/scr403/quizz/005/question.yml b/courses/scr403/quizz/005/question.yml index 11ad053b626..ca6cabb8811 100644 --- a/courses/scr403/quizz/005/question.yml +++ b/courses/scr403/quizz/005/question.yml @@ -1,7 +1,7 @@ id: 3f77abbb-10d4-41c6-a269-ccf8e0c44ff5 chapterId: 2a10a6ba-fada-4556-a673-3ae8c0794bf0 difficulty: intermediate -duration: 15 +duration: 30 author: 2e1b5182-567e-453a-af29-36009340ff02 original_language: en diff --git a/courses/scr403/quizz/006/question.yml b/courses/scr403/quizz/006/question.yml index ff6fd3c8140..b0a082c0085 100644 --- a/courses/scr403/quizz/006/question.yml +++ b/courses/scr403/quizz/006/question.yml @@ -1,7 +1,7 @@ id: 963fde32-783e-4e20-8c3f-cae31bdcc2bf chapterId: 2a10a6ba-fada-4556-a673-3ae8c0794bf0 difficulty: intermediate -duration: 15 +duration: 30 author: 2e1b5182-567e-453a-af29-36009340ff02 original_language: en diff --git a/courses/scr403/quizz/007/question.yml b/courses/scr403/quizz/007/question.yml index 346c3f3bdc8..947449e88ac 100644 --- a/courses/scr403/quizz/007/question.yml +++ b/courses/scr403/quizz/007/question.yml @@ -1,6 +1,6 @@ id: c0dc9faf-1c10-4082-82c3-e4b07e7217f9 chapterId: 2a10a6ba-fada-4556-a673-3ae8c0794bf0 -difficulty: intermediate +difficulty: easy duration: 15 author: 2e1b5182-567e-453a-af29-36009340ff02 original_language: en diff --git a/courses/scr403/quizz/008/question.yml b/courses/scr403/quizz/008/question.yml index fd8d149a529..e265ff4540e 100644 --- a/courses/scr403/quizz/008/question.yml +++ b/courses/scr403/quizz/008/question.yml @@ -1,7 +1,7 @@ id: e5e0c93e-c244-4d00-ac35-7bc6e4533813 chapterId: 9981ae62-ae50-4770-adf2-b253d1e08de3 difficulty: intermediate -duration: 15 +duration: 30 author: 2e1b5182-567e-453a-af29-36009340ff02 original_language: en diff --git a/courses/scr403/quizz/009/question.yml b/courses/scr403/quizz/009/question.yml index 3d8afa7bdb3..23aa5f63627 100644 --- a/courses/scr403/quizz/009/question.yml +++ b/courses/scr403/quizz/009/question.yml @@ -1,7 +1,7 @@ id: 6d167e33-3e10-4e7a-8919-6565f929eb8d chapterId: 9981ae62-ae50-4770-adf2-b253d1e08de3 difficulty: intermediate -duration: 15 +duration: 30 author: 2e1b5182-567e-453a-af29-36009340ff02 original_language: en diff --git a/courses/scr403/quizz/010/question.yml b/courses/scr403/quizz/010/question.yml index e647241dd8b..dd5b6c7e9dd 100644 --- a/courses/scr403/quizz/010/question.yml +++ b/courses/scr403/quizz/010/question.yml @@ -1,7 +1,7 @@ id: 582e5a78-71f9-4dca-87f0-bdcc65c5179b chapterId: 9981ae62-ae50-4770-adf2-b253d1e08de3 difficulty: intermediate -duration: 15 +duration: 30 author: 2e1b5182-567e-453a-af29-36009340ff02 original_language: en diff --git a/courses/scr403/quizz/011/question.yml b/courses/scr403/quizz/011/question.yml index 05a5bd5a44f..ef03108dc77 100644 --- a/courses/scr403/quizz/011/question.yml +++ b/courses/scr403/quizz/011/question.yml @@ -1,6 +1,6 @@ id: 1a8a9923-3600-446e-afd9-299c3bff7f9d chapterId: 9981ae62-ae50-4770-adf2-b253d1e08de3 -difficulty: intermediate +difficulty: easy duration: 15 author: 2e1b5182-567e-453a-af29-36009340ff02 original_language: en diff --git a/courses/scr403/quizz/012/question.yml b/courses/scr403/quizz/012/question.yml index 22a7d911aaf..26fdae5a581 100644 --- a/courses/scr403/quizz/012/question.yml +++ b/courses/scr403/quizz/012/question.yml @@ -1,7 +1,7 @@ id: b5e01b45-f621-429b-abee-c748b73739fd chapterId: 9981ae62-ae50-4770-adf2-b253d1e08de3 difficulty: intermediate -duration: 15 +duration: 30 author: 2e1b5182-567e-453a-af29-36009340ff02 original_language: en diff --git a/courses/scr403/quizz/013/question.yml b/courses/scr403/quizz/013/question.yml index cbb42db2b01..755f3f12f24 100644 --- a/courses/scr403/quizz/013/question.yml +++ b/courses/scr403/quizz/013/question.yml @@ -1,7 +1,7 @@ id: 0c2c49a2-3766-467a-8ab4-c16c15a5dd60 chapterId: 6d46e77a-7e60-473b-b230-418da5ae44eb difficulty: intermediate -duration: 15 +duration: 30 author: 2e1b5182-567e-453a-af29-36009340ff02 original_language: en diff --git a/courses/scr403/quizz/014/question.yml b/courses/scr403/quizz/014/question.yml index 6ea5d0e808b..c59d500f6b2 100644 --- a/courses/scr403/quizz/014/question.yml +++ b/courses/scr403/quizz/014/question.yml @@ -1,7 +1,7 @@ id: d92a0b52-981d-4a4b-b245-4a6b0c0ac328 chapterId: 2a10a6ba-fada-4556-a673-3ae8c0794bf0 difficulty: intermediate -duration: 15 +duration: 30 author: 2e1b5182-567e-453a-af29-36009340ff02 original_language: en diff --git a/courses/scr403/quizz/015/question.yml b/courses/scr403/quizz/015/question.yml index 4db7ce7010c..41c8258408e 100644 --- a/courses/scr403/quizz/015/question.yml +++ b/courses/scr403/quizz/015/question.yml @@ -1,7 +1,7 @@ id: 8b4ee208-b723-41c4-af9c-0d30b10132fb chapterId: 2a10a6ba-fada-4556-a673-3ae8c0794bf0 -difficulty: intermediate -duration: 15 +difficulty: hard +duration: 45 author: 2e1b5182-567e-453a-af29-36009340ff02 original_language: en diff --git a/courses/scr403/quizz/016/question.yml b/courses/scr403/quizz/016/question.yml index f30c3bf990b..63aa620e904 100644 --- a/courses/scr403/quizz/016/question.yml +++ b/courses/scr403/quizz/016/question.yml @@ -1,7 +1,7 @@ id: c4df1bd0-8d1c-4f71-ac5a-ebf3be1f4a51 chapterId: 2a10a6ba-fada-4556-a673-3ae8c0794bf0 -difficulty: intermediate -duration: 15 +difficulty: hard +duration: 45 author: 2e1b5182-567e-453a-af29-36009340ff02 original_language: en diff --git a/courses/scr403/quizz/017/question.yml b/courses/scr403/quizz/017/question.yml index e5874f98ec9..d168c75ebfa 100644 --- a/courses/scr403/quizz/017/question.yml +++ b/courses/scr403/quizz/017/question.yml @@ -1,7 +1,7 @@ id: f88741e5-8019-427f-80d4-de0616a2bd9a chapterId: 9981ae62-ae50-4770-adf2-b253d1e08de3 difficulty: intermediate -duration: 15 +duration: 30 author: 2e1b5182-567e-453a-af29-36009340ff02 original_language: en diff --git a/courses/scr403/quizz/018/question.yml b/courses/scr403/quizz/018/question.yml index 14f56c1f1e7..7f41cef5a3b 100644 --- a/courses/scr403/quizz/018/question.yml +++ b/courses/scr403/quizz/018/question.yml @@ -1,7 +1,7 @@ id: 8ecab257-d521-437a-ad11-bb6d2020b0f1 chapterId: 9981ae62-ae50-4770-adf2-b253d1e08de3 difficulty: intermediate -duration: 15 +duration: 30 author: 2e1b5182-567e-453a-af29-36009340ff02 original_language: en diff --git a/courses/scr403/quizz/019/question.yml b/courses/scr403/quizz/019/question.yml index b36520ef012..56a1e9eb35b 100644 --- a/courses/scr403/quizz/019/question.yml +++ b/courses/scr403/quizz/019/question.yml @@ -1,6 +1,6 @@ id: b4130b1d-4f08-4543-948c-3c2095cd110f chapterId: 9981ae62-ae50-4770-adf2-b253d1e08de3 -difficulty: intermediate +difficulty: easy duration: 15 author: 2e1b5182-567e-453a-af29-36009340ff02 original_language: en diff --git a/courses/scr403/quizz/020/question.yml b/courses/scr403/quizz/020/question.yml index f7b8ab10cb5..1eb6ebdf80c 100644 --- a/courses/scr403/quizz/020/question.yml +++ b/courses/scr403/quizz/020/question.yml @@ -1,6 +1,6 @@ id: db95b84e-6529-4422-aae2-3d6f8a789013 chapterId: 9eafe498-0765-419a-a69d-a74a9cdf3713 -difficulty: intermediate +difficulty: easy duration: 15 author: 2e1b5182-567e-453a-af29-36009340ff02 original_language: en diff --git a/courses/scr403/quizz/021/question.yml b/courses/scr403/quizz/021/question.yml index 3427ac7d792..acd3a9b3066 100644 --- a/courses/scr403/quizz/021/question.yml +++ b/courses/scr403/quizz/021/question.yml @@ -1,7 +1,7 @@ id: b5e36dfe-d941-4041-ba23-dc1643d7abc9 chapterId: 9eafe498-0765-419a-a69d-a74a9cdf3713 -difficulty: intermediate -duration: 15 +difficulty: hard +duration: 45 author: 2e1b5182-567e-453a-af29-36009340ff02 original_language: en diff --git a/courses/scr403/quizz/022/question.yml b/courses/scr403/quizz/022/question.yml index ceec26810de..38869bdb217 100644 --- a/courses/scr403/quizz/022/question.yml +++ b/courses/scr403/quizz/022/question.yml @@ -1,7 +1,7 @@ id: 04d17f4c-1e95-4c2e-8e40-c9b84cf75b2f chapterId: 9eafe498-0765-419a-a69d-a74a9cdf3713 -difficulty: intermediate -duration: 15 +difficulty: hard +duration: 45 author: 2e1b5182-567e-453a-af29-36009340ff02 original_language: en diff --git a/courses/scr403/quizz/023/question.yml b/courses/scr403/quizz/023/question.yml index ed037176c0d..c537ab45dc8 100644 --- a/courses/scr403/quizz/023/question.yml +++ b/courses/scr403/quizz/023/question.yml @@ -1,7 +1,7 @@ id: 0b2a2848-cb65-46e2-be56-e98513794786 chapterId: 9eafe498-0765-419a-a69d-a74a9cdf3713 -difficulty: intermediate -duration: 15 +difficulty: hard +duration: 45 author: 2e1b5182-567e-453a-af29-36009340ff02 original_language: en diff --git a/courses/scr403/quizz/024/question.yml b/courses/scr403/quizz/024/question.yml index 1418dfb1c68..0231c7f2bab 100644 --- a/courses/scr403/quizz/024/question.yml +++ b/courses/scr403/quizz/024/question.yml @@ -1,7 +1,7 @@ id: bbc1725b-94ae-42ea-85cc-4e40087a985a chapterId: 961652e3-8f7d-4c2a-8b55-9a990b91a0dd difficulty: intermediate -duration: 15 +duration: 30 author: 2e1b5182-567e-453a-af29-36009340ff02 original_language: en diff --git a/courses/scr403/quizz/025/question.yml b/courses/scr403/quizz/025/question.yml index e7ecd3666cb..f07f311b18e 100644 --- a/courses/scr403/quizz/025/question.yml +++ b/courses/scr403/quizz/025/question.yml @@ -1,7 +1,7 @@ id: e9f7f36d-e07d-4ad2-9d12-845c0b5f63bb chapterId: 961652e3-8f7d-4c2a-8b55-9a990b91a0dd difficulty: intermediate -duration: 15 +duration: 30 author: 2e1b5182-567e-453a-af29-36009340ff02 original_language: en diff --git a/courses/scr403/quizz/026/question.yml b/courses/scr403/quizz/026/question.yml index 2b41f2e8f64..e8d76205fee 100644 --- a/courses/scr403/quizz/026/question.yml +++ b/courses/scr403/quizz/026/question.yml @@ -1,6 +1,6 @@ id: 55d95b1b-18e0-4ac0-b5d2-e5f18ea365a0 chapterId: 961652e3-8f7d-4c2a-8b55-9a990b91a0dd -difficulty: intermediate +difficulty: easy duration: 15 author: 2e1b5182-567e-453a-af29-36009340ff02 original_language: en diff --git a/courses/scr403/quizz/027/question.yml b/courses/scr403/quizz/027/question.yml index aac7b77525b..1e45a1ded95 100644 --- a/courses/scr403/quizz/027/question.yml +++ b/courses/scr403/quizz/027/question.yml @@ -1,7 +1,7 @@ id: a81a36bd-d3da-4205-886b-3b66bc82fa1f chapterId: 961652e3-8f7d-4c2a-8b55-9a990b91a0dd -difficulty: intermediate -duration: 15 +difficulty: hard +duration: 45 author: 2e1b5182-567e-453a-af29-36009340ff02 original_language: en diff --git a/courses/scr403/quizz/028/en.yml b/courses/scr403/quizz/028/en.yml new file mode 100644 index 00000000000..ec8b6f8d7fa --- /dev/null +++ b/courses/scr403/quizz/028/en.yml @@ -0,0 +1,16 @@ +question: Conditional composition is described as the dual of parallel composition. Which statement precisely captures this duality? +answer: "The shared type changes sides: parallel feeds one common input type to both operations and pairs their outputs into a product, while conditional merges alternative tagged inputs into a sum and requires both operations to produce one common output type." +wrong_answers: + - "Execution order is inverted: parallel must run its two operations simultaneously, whereas conditional runs the same two operations one after the other and returns only the result of the branch that the tag selects." + - Both compositions execute the two operations on one shared input; parallel keeps the pair of outputs, while conditional executes both branches and then discards the output that the tag bit does not select. + - Parallel composition duplicates its input before execution while conditional composition duplicates its output afterward, so the two are duals by exchanging where the copying of data takes place in the pipeline. +explanation: >- + The duality is a product/sum exchange with the shared type switching + sides: parallel composition gives both operations the same input type + and pairs their outputs into a product, whereas conditional composition + takes a sum (tagged union) of the two input types and both branches must + yield the same output type. Simultaneity is irrelevant — the article + stresses parallel composition may be implemented sequentially — and + conditional composition executes exactly one branch, chosen by the tag, + rather than running both and discarding one. +reviewed: false diff --git a/courses/scr403/quizz/028/question.yml b/courses/scr403/quizz/028/question.yml new file mode 100644 index 00000000000..12ff7fa4e9e --- /dev/null +++ b/courses/scr403/quizz/028/question.yml @@ -0,0 +1,14 @@ +id: 000a686f-b43a-4685-b014-e4b82fa6a9e7 +chapterId: 6d46e77a-7e60-473b-b230-418da5ae44eb +difficulty: hard +duration: 45 +author: 2e1b5182-567e-453a-af29-36009340ff02 +original_language: en + +proofreading: + - language: en + last_contribution_date: 2026-03-02 + urgency: 1 + contributor_names: + - rogzy + reward: 0 diff --git a/courses/scr403/quizz/029/en.yml b/courses/scr403/quizz/029/en.yml new file mode 100644 index 00000000000..a777d438599 --- /dev/null +++ b/courses/scr403/quizz/029/en.yml @@ -0,0 +1,15 @@ +question: Simplicity's designers explicitly excluded unbounded recursion. According to their stated thesis, what is the intended substitute for unbounded iterative computation? +answer: Recursive covenants that spread an iterative computation across multiple transactions, sidestepping block-space and standardness constraints while keeping the cost of each transaction predictable. +wrong_answers: + - The delegation feature, which was purpose-built to give Simplicity programs a disciplined, metered form of unbounded recursion executed entirely inside a single transaction. + - The nine core combinators, whose combinator completeness allows a fixed-point construction to encode any recursive function directly within one Simplicity program. + - Compile-time loop unrolling, in which static analysis infers the maximum iteration count and duplicates the loop body that many times before deployment. +explanation: >- + The article's thesis is that unbounded iteration is better implemented + as recursive covenants computing over multiple transactions, which + avoids block-space and standardness constraints and makes transaction + costs predictable. Delegation can only be abused to produce something + resembling unbounded recursion — it is not the intended mechanism — and + the nine core combinators are complete only for finite computations, so + no fixed-point construction exists within a single program. +reviewed: false diff --git a/courses/scr403/quizz/029/question.yml b/courses/scr403/quizz/029/question.yml new file mode 100644 index 00000000000..83241e11150 --- /dev/null +++ b/courses/scr403/quizz/029/question.yml @@ -0,0 +1,14 @@ +id: ff0808d2-6b22-49a1-ab04-7b861df475a5 +chapterId: 6d46e77a-7e60-473b-b230-418da5ae44eb +difficulty: hard +duration: 45 +author: 2e1b5182-567e-453a-af29-36009340ff02 +original_language: en + +proofreading: + - language: en + last_contribution_date: 2026-03-02 + urgency: 1 + contributor_names: + - rogzy + reward: 0 diff --git a/courses/scr403/quizz/030/en.yml b/courses/scr403/quizz/030/en.yml new file mode 100644 index 00000000000..a66f31e39d8 --- /dev/null +++ b/courses/scr403/quizz/030/en.yml @@ -0,0 +1,15 @@ +question: "The distribution function dist : (A + B) × C ⊢ A × C + B × C is the operation that a naive copair combinator could never express. Which core-combinator expression correctly implements dist?" +answer: case (injl iden) (injr iden) +wrong_answers: + - case (injl (take iden)) (injr (drop iden)) + - pair (injl iden) (injr iden) + - copair (injl iden) (injr iden) +explanation: >- + Inside each branch of case, the environment is already paired with the + untagged value, so f = injl iden and g = injr iden give ⟨σᴸ(a), c⟩ ↦ + σᴸ⟨a, c⟩ and ⟨σᴿ(b), c⟩ ↦ σᴿ⟨b, c⟩ — exactly dist. The take/drop variant + type-checks but discards the pairing, denoting a function of type (A + + B) × C ⊢ A + C instead. pair produces a product rather than a sum, and + copair is not a Simplicity combinator at all — dist is precisely what + copair alone cannot express. +reviewed: false diff --git a/courses/scr403/quizz/030/question.yml b/courses/scr403/quizz/030/question.yml new file mode 100644 index 00000000000..e521b410853 --- /dev/null +++ b/courses/scr403/quizz/030/question.yml @@ -0,0 +1,14 @@ +id: 7c9dd892-1724-4c25-89cb-d24c0bc88097 +chapterId: 2a10a6ba-fada-4556-a673-3ae8c0794bf0 +difficulty: hard +duration: 45 +author: 2e1b5182-567e-453a-af29-36009340ff02 +original_language: en + +proofreading: + - language: en + last_contribution_date: 2026-03-02 + urgency: 1 + contributor_names: + - rogzy + reward: 0 diff --git a/courses/scr403/quizz/031/en.yml b/courses/scr403/quizz/031/en.yml new file mode 100644 index 00000000000..2049df40a22 --- /dev/null +++ b/courses/scr403/quizz/031/en.yml @@ -0,0 +1,13 @@ +question: Applying the typing rules for iden, take, drop and pair, what is the most general type of the expression pair (drop iden) (take iden), and what function does it denote? +answer: A × B ⊢ B × A — the second component comes out first, so it denotes the swap function on pairs +wrong_answers: + - A × B ⊢ A × B — both components pass through in their place, so it denotes the identity on pairs + - It is ill-typed, because take iden and drop iden produce different output types that pair cannot merge + - (A × B) × (A × B) ⊢ B × A — pair combines the input types of its two subexpressions into one product +explanation: >- + drop iden : A × B ⊢ B extracts the second component and take iden : A × + B ⊢ A extracts the first. The pair combinator requires only that its two + subexpressions share the same input type (here A × B); their outputs may + differ, and are returned as a pair. On input ⟨a, b⟩ the expression + therefore yields ⟨b, a⟩: the swap function, of type A × B ⊢ B × A. +reviewed: false diff --git a/courses/scr403/quizz/031/question.yml b/courses/scr403/quizz/031/question.yml new file mode 100644 index 00000000000..c614c527ae9 --- /dev/null +++ b/courses/scr403/quizz/031/question.yml @@ -0,0 +1,14 @@ +id: 9a086b63-059e-4573-bd34-266ad74d5016 +chapterId: 2a10a6ba-fada-4556-a673-3ae8c0794bf0 +difficulty: hard +duration: 45 +author: 2e1b5182-567e-453a-af29-36009340ff02 +original_language: en + +proofreading: + - language: en + last_contribution_date: 2026-03-02 + urgency: 1 + contributor_names: + - rogzy + reward: 0 diff --git a/courses/scr403/quizz/032/en.yml b/courses/scr403/quizz/032/en.yml new file mode 100644 index 00000000000..a0520c751a3 --- /dev/null +++ b/courses/scr403/quizz/032/en.yml @@ -0,0 +1,16 @@ +question: The proof of the Simplicity Completeness theorem constructs an expression for any function by nesting case expressions to fully decompose the input and composing with scribe expressions for each output. Why is this construction useful only as a theoretical tool? +answer: The constructed expression is effectively a giant lookup table whose size grows exponentially with input width — a function on 256-bit inputs would need about 2²⁵⁶ entries +wrong_answers: + - Because scribe is a macro rather than a true combinator, the constructed expression falls outside the formally verified core Simplicity language and cannot be machine-checked + - Because the Bit Machine takes exponential time to evaluate the constructed expression, even though the expression itself stays compact thanks to sharing between branches + - Because nested case expressions can only decompose sum types, so the lookup-table construction fails whenever the function's input type is built from products +explanation: >- + The construction enumerates every possible input via nested case + decomposition and hard-codes each output with scribe, so expression size + explodes exponentially — astronomical for realistic types like 256-bit + words. The blowup is in the expression's size, not in an otherwise- + compact expression's runtime. scribe expands into genuine core + combinators (unit, injl, injr, pair), so the result stays inside the + core language, whose completeness theorem is formally verified in Rocq; + and the decomposition handles inputs of any type, products included. +reviewed: false diff --git a/courses/scr403/quizz/032/question.yml b/courses/scr403/quizz/032/question.yml new file mode 100644 index 00000000000..36d3148bc80 --- /dev/null +++ b/courses/scr403/quizz/032/question.yml @@ -0,0 +1,14 @@ +id: 8d7f9c10-c453-463b-830b-98d6cf6638b5 +chapterId: 2a10a6ba-fada-4556-a673-3ae8c0794bf0 +difficulty: hard +duration: 45 +author: 2e1b5182-567e-453a-af29-36009340ff02 +original_language: en + +proofreading: + - language: en + last_contribution_date: 2026-03-02 + urgency: 1 + contributor_names: + - rogzy + reward: 0 diff --git a/courses/scr403/quizz/033/en.yml b/courses/scr403/quizz/033/en.yml new file mode 100644 index 00000000000..149b3a3e956 --- /dev/null +++ b/courses/scr403/quizz/033/en.yml @@ -0,0 +1,14 @@ +question: The Bit Machine exploits the 'smaller types in the premises' structure of Simplicity's typing rules to minimize copying during execution. Which core combinators actually involve moving data around when expressions are interpreted? +answer: Only iden and comp — the remaining seven core combinators are implemented with nothing more than some bookkeeping +wrong_answers: + - Only take and drop — extracting a single component of a pair forces the machine to copy that component out of the product + - Only pair and case — duplicating the input for two parallel branches and dispatching on a tag both require shuffling data + - Only injl and injr — attaching a tag means rewriting the value into a freshly allocated, larger sum-type representation +explanation: >- + Counterintuitively, the combinators that look like data access (take, + drop, pair, case, injl, injr) need no copying: because premises in the + typing rules involve smaller types than their conclusions, the Bit + Machine can implement them with bookkeeping alone. Only iden, which + copies its entire input to its output, and comp, which materializes an + intermediate value passed from f to g, genuinely move data around. +reviewed: false diff --git a/courses/scr403/quizz/033/question.yml b/courses/scr403/quizz/033/question.yml new file mode 100644 index 00000000000..8b7161c5494 --- /dev/null +++ b/courses/scr403/quizz/033/question.yml @@ -0,0 +1,14 @@ +id: 31df83c3-972d-46ec-aefb-249154f541fc +chapterId: 2a10a6ba-fada-4556-a673-3ae8c0794bf0 +difficulty: hard +duration: 45 +author: 2e1b5182-567e-453a-af29-36009340ff02 +original_language: en + +proofreading: + - language: en + last_contribution_date: 2026-03-02 + urgency: 1 + contributor_names: + - rogzy + reward: 0 diff --git a/courses/scr403/quizz/034/en.yml b/courses/scr403/quizz/034/en.yml new file mode 100644 index 00000000000..2e6da646643 --- /dev/null +++ b/courses/scr403/quizz/034/en.yml @@ -0,0 +1,14 @@ +question: The chapter's full-adder combines the carry bits of its two half-adders with logical OR rather than with XOR or a third adder stage. Why is a plain OR sufficient to produce the correct carry-out? +answer: Because for any input, at most one of the two half-adders can produce a carry, so OR merges two mutually exclusive carry cases exactly. +wrong_answers: + - Because the two carry bits must themselves be added together, and OR is how single-bit binary addition is implemented in Simplicity. + - Because after the case-based branching, OR is the only binary Boolean operator whose type still matches the remaining environment. + - Because OR over-approximates the carry, and any spurious extra carry values are discarded by the final I I H projection afterwards. +explanation: >- + If the first half-adder carries, both of its input bits were 1, so its + sum bit is 0 — and a half-adder fed a 0 can never carry. The two carry + bits are therefore never simultaneously 1, and OR merges them exactly + (on the reachable inputs it even coincides with XOR). This mutual + exclusivity is precisely what makes the two-half-adder decomposition of + a full-adder correct. +reviewed: false diff --git a/courses/scr403/quizz/034/question.yml b/courses/scr403/quizz/034/question.yml new file mode 100644 index 00000000000..39abc707af7 --- /dev/null +++ b/courses/scr403/quizz/034/question.yml @@ -0,0 +1,14 @@ +id: 0e911244-f764-4df7-a12a-0d09195e97d5 +chapterId: 9981ae62-ae50-4770-adf2-b253d1e08de3 +difficulty: hard +duration: 45 +author: 2e1b5182-567e-453a-af29-36009340ff02 +original_language: en + +proofreading: + - language: en + last_contribution_date: 2026-03-02 + urgency: 1 + contributor_names: + - rogzy + reward: 0 diff --git a/courses/scr403/quizz/035/en.yml b/courses/scr403/quizz/035/en.yml new file mode 100644 index 00000000000..b2193523465 --- /dev/null +++ b/courses/scr403/quizz/035/en.yml @@ -0,0 +1,14 @@ +question: Trace the chapter's full-adder on input ⟨⟨1, 1⟩, 1⟩ (adding 1+1+1). What value of type 𝟚 × (𝟚 × 𝟚) does the second stage, O O H ▵ (O I H ▵ I H ⨾ half-adder), hand to the final stage? +answer: ⟨1, ⟨0, 1⟩⟩ — the first half-adder's carry, then the second half-adder's carry and sum. +wrong_answers: + - ⟨1, ⟨1, 0⟩⟩ — the first half-adder's carry, then the second half-adder's sum and carry. + - ⟨0, ⟨0, 1⟩⟩ — the first half-adder's sum bit, then the second half-adder's carry and sum. + - ⟨1, ⟨1, 1⟩⟩ — the first half-adder's carry, then the second half-adder's OR and XOR bits. +explanation: >- + Stage one computes half-adder⟨1,1⟩ = ⟨1, 0⟩ (carry 1, sum 0) and saves + the carry-in, giving ⟨⟨1,0⟩, 1⟩. In stage two, O O H extracts the first + carry (1), while O I H ▵ I H feeds ⟨0, 1⟩ — the first sum and the carry- + in — into the second half-adder, yielding ⟨0, 1⟩ since and(0,1)=0 and + xor(0,1)=1. The final stage then ORs the two carries and keeps the sum, + producing ⟨1, 1⟩: binary 3, as expected. +reviewed: false diff --git a/courses/scr403/quizz/035/question.yml b/courses/scr403/quizz/035/question.yml new file mode 100644 index 00000000000..e68a3f2de07 --- /dev/null +++ b/courses/scr403/quizz/035/question.yml @@ -0,0 +1,14 @@ +id: c6f4fb69-40d0-45d7-9d45-4f6f0f9e65d6 +chapterId: 9981ae62-ae50-4770-adf2-b253d1e08de3 +difficulty: hard +duration: 45 +author: 2e1b5182-567e-453a-af29-36009340ff02 +original_language: en + +proofreading: + - language: en + last_contribution_date: 2026-03-02 + urgency: 1 + contributor_names: + - rogzy + reward: 0 diff --git a/courses/scr403/quizz/036/en.yml b/courses/scr403/quizz/036/en.yml new file mode 100644 index 00000000000..651203dd0db --- /dev/null +++ b/courses/scr403/quizz/036/en.yml @@ -0,0 +1,14 @@ +question: The stack operation push-- + Aᑉⁿ is exactly the type of lists whose length is strictly less than n, + so a buffer at maximum capacity holds n−1 elements. Pushing one more + produces exactly n elements, which Aᑉⁿ cannot represent; the Aⁿ summand + returns that overflowed result as a full vector. Encoding overflow in + the output type keeps push-- + A jet is a native replacement for one specific, fully-formed Simplicity + expression, which nodes can substitute while preserving its exact + semantics. fold-right-n, map, zip and their variants are not single + expressions but construction schemes: each choice of the inner function + f yields a structurally different expression, so no single jet can stand + in for the whole family. That is why these iteration patterns appear as + genuine combinator code in real programs, typically generated by higher- + level languages like SimplicityHL. +reviewed: false diff --git a/courses/scr403/quizz/037/question.yml b/courses/scr403/quizz/037/question.yml new file mode 100644 index 00000000000..0ddc79996b4 --- /dev/null +++ b/courses/scr403/quizz/037/question.yml @@ -0,0 +1,14 @@ +id: 485d8e95-c687-4825-8fcd-dadcd4a54edf +chapterId: 9981ae62-ae50-4770-adf2-b253d1e08de3 +difficulty: hard +duration: 45 +author: 2e1b5182-567e-453a-af29-36009340ff02 +original_language: en + +proofreading: + - language: en + last_contribution_date: 2026-03-02 + urgency: 1 + contributor_names: + - rogzy + reward: 0 diff --git a/courses/scr403/quizz/038/en.yml b/courses/scr403/quizz/038/en.yml new file mode 100644 index 00000000000..6253107287e --- /dev/null +++ b/courses/scr403/quizz/038/en.yml @@ -0,0 +1,16 @@ +question: To make Simplicity forward-compatible with cross-input signature aggregation, a half-agg-verify jet is imagined as a Writer effect whose transaction log is treated as a set of (key, message, r-component) tuples rather than a list. Under the commutative/idempotent/unitary classification, what does this set-based design achieve, and what limit remains? +answer: "It becomes commutative and idempotent, meeting Simplicity's requirement, but not unitary: discarding a call with unused output would drop its tuple from the log and skip a signature in the aggregate check." +wrong_answers: + - It becomes idempotent and unitary, but stays non-commutative because the aggregate s-component must combine the logged r-components in the exact order the individual signatures were produced. + - It gains all three properties, so an optimizer may freely duplicate, reorder, or discard half-agg-verify calls without any risk of changing whether the transaction is valid. + - It becomes commutative but stays non-idempotent, since inserting an identical tuple twice would make the verifier demand two aggregate s-components for a single logged signature. +explanation: >- + Treating the writer log as a set makes the effect idempotent and + commutative, because set insertion itself has both properties — exactly + the two Simplicity demands of every effect. Unitarity is still out of + reach: like Failure, the write influences transaction validity, since + the transaction is only valid when an aggregate s-component covers every + logged tuple. An expression performing the write therefore cannot be + discarded merely because its unit output is unused, as its tuple would + silently vanish from the half-aggregation verification. +reviewed: false diff --git a/courses/scr403/quizz/038/question.yml b/courses/scr403/quizz/038/question.yml new file mode 100644 index 00000000000..89bbac284da --- /dev/null +++ b/courses/scr403/quizz/038/question.yml @@ -0,0 +1,14 @@ +id: c3aefa22-3865-4a6c-8afd-ab30df8b5cbf +chapterId: 9eafe498-0765-419a-a69d-a74a9cdf3713 +difficulty: hard +duration: 45 +author: 2e1b5182-567e-453a-af29-36009340ff02 +original_language: en + +proofreading: + - language: en + last_contribution_date: 2026-03-02 + urgency: 1 + contributor_names: + - rogzy + reward: 0 diff --git a/courses/scr403/quizz/039/en.yml b/courses/scr403/quizz/039/en.yml new file mode 100644 index 00000000000..ef49ea295e9 --- /dev/null +++ b/courses/scr403/quizz/039/en.yml @@ -0,0 +1,17 @@ +question: A Simplicity optimizer is transforming an expression built from jets such as verify, bip0340-verify, and sig-all-hash. Given that Simplicity demands its effects be commutative and idempotent but not unitary, which program transformation must the optimizer refuse in general? +answer: "Replacing an expression whose discarded output makes it look dead with `unit`, since Failure is not unitary: the expression could hide a failing `bip0340-verify` that must abort the transaction." +wrong_answers: + - Swapping the order of two independent subexpressions, because each `sig-all-hash` call could observe the transaction environment in a different state depending on when it executes. + - Deduplicating two identical `verify` calls into one, because a duplicated Failure effect would throw the unit exception twice and abort a computation that should have continued. + - Reordering expressions that may throw, because the exception that propagates from a pair depends on which side runs first, changing the program's observable failure value. +explanation: >- + Because Simplicity's effects are guaranteed commutative and idempotent, + swapping independent subexpressions and duplicating or merging identical + ones are always safe; the Reader environment is fixed, and Failure's + unit-typed exception is identical no matter which side throws first or + how many times. The discard transformation `f ⨾ unit = unit`, however, + requires unitarity, which Failure lacks: if `f` contains a + `bip0340-verify` on an invalid signature, eliminating the 'dead' code + would optimize away the abort and validate a transaction that should + fail. +reviewed: false diff --git a/courses/scr403/quizz/039/question.yml b/courses/scr403/quizz/039/question.yml new file mode 100644 index 00000000000..2405c9b5f45 --- /dev/null +++ b/courses/scr403/quizz/039/question.yml @@ -0,0 +1,14 @@ +id: beb048dc-bcc3-43ed-804d-1cbda2a7d9b7 +chapterId: 9eafe498-0765-419a-a69d-a74a9cdf3713 +difficulty: hard +duration: 45 +author: 2e1b5182-567e-453a-af29-36009340ff02 +original_language: en + +proofreading: + - language: en + last_contribution_date: 2026-03-02 + urgency: 1 + contributor_names: + - rogzy + reward: 0 diff --git a/courses/scr403/quizz/040/en.yml b/courses/scr403/quizz/040/en.yml new file mode 100644 index 00000000000..ae6636d98d7 --- /dev/null +++ b/courses/scr403/quizz/040/en.yml @@ -0,0 +1,16 @@ +question: "In the recursive CMR rule, computing #ᶜ(comp f g) hashes a 128-byte input: the 32-byte comp tag repeated twice, followed by the two 32-byte child CMRs. Why does this still cost at most one call to the SHA-256 compression function?" +answer: The first 64-byte block holds only the constant repeated tag, so its midstate can be precomputed once per combinator; only the block carrying the two child CMRs is compressed. +wrong_answers: + - Dropping SHA-256's final length-padding block is alone what saves the work; without that padding, the whole 128-byte input fits within one invocation of the compression function. + - The two child CMRs are XORed into a single 32-byte digest before hashing, shrinking the entire input to one 64-byte block containing the tags plus the combined child hash. + - SHA-256-midstate is a wide-block variant of the compression function that accepts 128-byte message blocks directly, so the tags and child CMRs are absorbed in a single pass. +explanation: >- + SHA-256's compression function processes fixed 64-byte blocks, so a + 128-byte input normally needs two calls (plus one more for the length + padding in full SHA-256). Because every combinator's first block is the + constant tag∥tag, its midstate can be precomputed once and cached; each + expression then only needs one fresh compression of the block holding + its children's CMRs. Midstates also drop the final padding block, but + that alone would still leave two compressions — the precomputed tag + midstate is what brings it down to at most one. +reviewed: false diff --git a/courses/scr403/quizz/040/question.yml b/courses/scr403/quizz/040/question.yml new file mode 100644 index 00000000000..a073aa822a5 --- /dev/null +++ b/courses/scr403/quizz/040/question.yml @@ -0,0 +1,14 @@ +id: 1371db28-5256-4d6f-adb0-2e275ea7feba +chapterId: 961652e3-8f7d-4c2a-8b55-9a990b91a0dd +difficulty: hard +duration: 45 +author: 2e1b5182-567e-453a-af29-36009340ff02 +original_language: en + +proofreading: + - language: en + last_contribution_date: 2026-03-02 + urgency: 1 + contributor_names: + - rogzy + reward: 0 diff --git a/courses/scr403/quizz/041/en.yml b/courses/scr403/quizz/041/en.yml new file mode 100644 index 00000000000..403811e1430 --- /dev/null +++ b/courses/scr403/quizz/041/en.yml @@ -0,0 +1,17 @@ +question: A Simplicity output is built with the fixed BIP-0341 NUMS point as its internal key. Why is the key-spend path provably unusable, and what does randomizing that NUMS point (as BIP-0341 recommends) actually add? +answer: Nobody knows the NUMS point's discrete logarithm, so no key-path signature can ever be produced; randomization adds only privacy, making the output indistinguishable from ordinary Taproot outputs. +wrong_answers: + - The NUMS point is deliberately chosen to lie off the secp256k1 curve, so key-path signatures fail validation; randomization brings it back on-curve while keeping its private key unrecoverable. + - The NUMS point corresponds to a private key of zero, which consensus rules reject in any signature; randomization protects the tweak computation against side-channel leakage of that key. + - Tweaking a NUMS point yields an output key outside the valid range, making key-spend transactions non-standard; randomization guarantees distinct addresses when the same CMR is reused. +explanation: >- + A NUMS ('Nothing-Up-My-Sleeve') point is a perfectly valid curve point + constructed so that no one knows a corresponding private key — its + discrete logarithm is unknown. Since a key-path spend requires a Schnorr + signature under the internal key, and no such signature can be produced + without the private key, the key-spend path is provably unusable and + funds can only move through the committed script path. Randomizing the + NUMS point changes none of this; it merely hides the fact that key-spend + is disabled, so the output looks like any other Taproot output — a + privacy benefit. +reviewed: false diff --git a/courses/scr403/quizz/041/question.yml b/courses/scr403/quizz/041/question.yml new file mode 100644 index 00000000000..d4d6df48080 --- /dev/null +++ b/courses/scr403/quizz/041/question.yml @@ -0,0 +1,14 @@ +id: d2d4b610-c2b4-4e1c-9409-d8adba929785 +chapterId: 961652e3-8f7d-4c2a-8b55-9a990b91a0dd +difficulty: hard +duration: 45 +author: 2e1b5182-567e-453a-af29-36009340ff02 +original_language: en + +proofreading: + - language: en + last_contribution_date: 2026-03-02 + urgency: 1 + contributor_names: + - rogzy + reward: 0 diff --git a/courses/scr403/quizz/042/en.yml b/courses/scr403/quizz/042/en.yml new file mode 100644 index 00000000000..3f9ee5771ac --- /dev/null +++ b/courses/scr403/quizz/042/en.yml @@ -0,0 +1,16 @@ +question: At spending time, a Simplicity program is revealed with an unexecuted case branch pruned away. How can the verifier still confirm that the revealed program matches the CMR committed in the UTXO? +answer: "The CMR is a Merkle root: a case node hashes both children's CMRs, so the spender supplies only the pruned branch's 32-byte CMR and the verifier recomputes the root without its contents." +wrong_answers: + - The verifier recomputes the commitment from the executed branch alone, because branches of a case expression that never execute were not included in the CMR in the first place. + - Pruned branches are replaced by a canonical placeholder node whose fixed, well-known CMR stands in for the missing subtree when the Merkle root is recomputed by the verifier. + - The pruned branch's full code is still committed in the transaction witness, where the verifier hashes it but skips executing it in order to save on validation costs. +explanation: >- + The CMR of case f g is a tagged hash over both children's CMRs, so every + branch — executed or not — is committed at address time. Because the + construction is a Merkle tree, a pruned branch can be summarized by its + 32-byte CMR alone: the verifier plugs that hash into the recursive + computation and checks that the root matches the UTXO's commitment, + without ever seeing the pruned code. This is exactly why a Merkle root + is used for the commitment, and why any witness expressions inside the + pruned branch never appear on-chain. +reviewed: false diff --git a/courses/scr403/quizz/042/question.yml b/courses/scr403/quizz/042/question.yml new file mode 100644 index 00000000000..b72d0b72d18 --- /dev/null +++ b/courses/scr403/quizz/042/question.yml @@ -0,0 +1,14 @@ +id: ebd70d78-8294-4e17-b9bd-c08ed7c62b30 +chapterId: 961652e3-8f7d-4c2a-8b55-9a990b91a0dd +difficulty: hard +duration: 45 +author: 2e1b5182-567e-453a-af29-36009340ff02 +original_language: en + +proofreading: + - language: en + last_contribution_date: 2026-03-02 + urgency: 1 + contributor_names: + - rogzy + reward: 0 From 459597bc2d247b2a2d4580ee75e8e814828c1f7e Mon Sep 17 00:00:00 2001 From: Asi0Flammeus Date: Thu, 2 Jul 2026 12:15:33 +0200 Subject: [PATCH 14/14] quiz(scr403): tighten the 15 hard questions per test feedback Condense question stems and answer options for quizzes 028-042 (e.g. #028 230->74 chars, #038 330->170) while preserving the correct answer, distractor plausibility, hard difficulty, and answer-length balance. Explanations unchanged. Addresses reviewer feedback that the new hard questions were too verbose. --- courses/scr403/quizz/028/en.yml | 10 +++++----- courses/scr403/quizz/029/en.yml | 10 +++++----- courses/scr403/quizz/030/en.yml | 2 +- courses/scr403/quizz/031/en.yml | 10 +++++----- courses/scr403/quizz/032/en.yml | 10 +++++----- courses/scr403/quizz/033/en.yml | 10 +++++----- courses/scr403/quizz/034/en.yml | 10 +++++----- courses/scr403/quizz/035/en.yml | 10 +++++----- courses/scr403/quizz/036/en.yml | 10 +++++----- courses/scr403/quizz/037/en.yml | 10 +++++----- courses/scr403/quizz/038/en.yml | 10 +++++----- courses/scr403/quizz/039/en.yml | 10 +++++----- courses/scr403/quizz/040/en.yml | 10 +++++----- courses/scr403/quizz/041/en.yml | 10 +++++----- courses/scr403/quizz/042/en.yml | 10 +++++----- 15 files changed, 71 insertions(+), 71 deletions(-) diff --git a/courses/scr403/quizz/028/en.yml b/courses/scr403/quizz/028/en.yml index ec8b6f8d7fa..f2eb2660506 100644 --- a/courses/scr403/quizz/028/en.yml +++ b/courses/scr403/quizz/028/en.yml @@ -1,9 +1,9 @@ -question: Conditional composition is described as the dual of parallel composition. Which statement precisely captures this duality? -answer: "The shared type changes sides: parallel feeds one common input type to both operations and pairs their outputs into a product, while conditional merges alternative tagged inputs into a sum and requires both operations to produce one common output type." +question: In what sense is conditional composition the dual of parallel composition? +answer: Parallel feeds both operations one input and pairs their outputs (a product); conditional takes a sum of inputs and both branches share one output type. wrong_answers: - - "Execution order is inverted: parallel must run its two operations simultaneously, whereas conditional runs the same two operations one after the other and returns only the result of the branch that the tag selects." - - Both compositions execute the two operations on one shared input; parallel keeps the pair of outputs, while conditional executes both branches and then discards the output that the tag bit does not select. - - Parallel composition duplicates its input before execution while conditional composition duplicates its output afterward, so the two are duals by exchanging where the copying of data takes place in the pipeline. + - Parallel must run its two operations simultaneously; conditional runs them in sequence and returns only the branch the tag selects. + - Both run on one shared input; parallel keeps the output pair, while conditional runs both branches and discards the unselected one. + - Parallel duplicates its input beforehand while conditional duplicates its output afterward, swapping where the copying happens. explanation: >- The duality is a product/sum exchange with the shared type switching sides: parallel composition gives both operations the same input type diff --git a/courses/scr403/quizz/029/en.yml b/courses/scr403/quizz/029/en.yml index a777d438599..d699b825622 100644 --- a/courses/scr403/quizz/029/en.yml +++ b/courses/scr403/quizz/029/en.yml @@ -1,9 +1,9 @@ -question: Simplicity's designers explicitly excluded unbounded recursion. According to their stated thesis, what is the intended substitute for unbounded iterative computation? -answer: Recursive covenants that spread an iterative computation across multiple transactions, sidestepping block-space and standardness constraints while keeping the cost of each transaction predictable. +question: Simplicity excludes unbounded recursion. What is its intended substitute for unbounded iteration? +answer: Recursive covenants that spread the computation across multiple transactions, keeping each transaction's cost predictable. wrong_answers: - - The delegation feature, which was purpose-built to give Simplicity programs a disciplined, metered form of unbounded recursion executed entirely inside a single transaction. - - The nine core combinators, whose combinator completeness allows a fixed-point construction to encode any recursive function directly within one Simplicity program. - - Compile-time loop unrolling, in which static analysis infers the maximum iteration count and duplicates the loop body that many times before deployment. + - The delegation feature, purpose-built to give a metered form of unbounded recursion inside a single transaction. + - The nine core combinators, whose completeness lets a fixed-point construction encode any recursive function. + - Compile-time loop unrolling, where static analysis infers the maximum iteration count and duplicates the body. explanation: >- The article's thesis is that unbounded iteration is better implemented as recursive covenants computing over multiple transactions, which diff --git a/courses/scr403/quizz/030/en.yml b/courses/scr403/quizz/030/en.yml index a66f31e39d8..bac3278714b 100644 --- a/courses/scr403/quizz/030/en.yml +++ b/courses/scr403/quizz/030/en.yml @@ -1,4 +1,4 @@ -question: "The distribution function dist : (A + B) × C ⊢ A × C + B × C is the operation that a naive copair combinator could never express. Which core-combinator expression correctly implements dist?" +question: "Which core-combinator expression implements the distribution function dist : (A + B) × C ⊢ A × C + B × C?" answer: case (injl iden) (injr iden) wrong_answers: - case (injl (take iden)) (injr (drop iden)) diff --git a/courses/scr403/quizz/031/en.yml b/courses/scr403/quizz/031/en.yml index 2049df40a22..513419d8b03 100644 --- a/courses/scr403/quizz/031/en.yml +++ b/courses/scr403/quizz/031/en.yml @@ -1,9 +1,9 @@ -question: Applying the typing rules for iden, take, drop and pair, what is the most general type of the expression pair (drop iden) (take iden), and what function does it denote? -answer: A × B ⊢ B × A — the second component comes out first, so it denotes the swap function on pairs +question: What is the type of pair (drop iden) (take iden), and what function does it denote? +answer: A × B ⊢ B × A — it swaps the two components of a pair. wrong_answers: - - A × B ⊢ A × B — both components pass through in their place, so it denotes the identity on pairs - - It is ill-typed, because take iden and drop iden produce different output types that pair cannot merge - - (A × B) × (A × B) ⊢ B × A — pair combines the input types of its two subexpressions into one product + - A × B ⊢ A × B — it passes both components through unchanged (the identity). + - "Ill-typed: take iden and drop iden have different output types, which pair cannot merge." + - (A × B) × (A × B) ⊢ B × A — pair merges its two subexpressions' input types. explanation: >- drop iden : A × B ⊢ B extracts the second component and take iden : A × B ⊢ A extracts the first. The pair combinator requires only that its two diff --git a/courses/scr403/quizz/032/en.yml b/courses/scr403/quizz/032/en.yml index a0520c751a3..05cab8e1797 100644 --- a/courses/scr403/quizz/032/en.yml +++ b/courses/scr403/quizz/032/en.yml @@ -1,9 +1,9 @@ -question: The proof of the Simplicity Completeness theorem constructs an expression for any function by nesting case expressions to fully decompose the input and composing with scribe expressions for each output. Why is this construction useful only as a theoretical tool? -answer: The constructed expression is effectively a giant lookup table whose size grows exponentially with input width — a function on 256-bit inputs would need about 2²⁵⁶ entries +question: The completeness proof builds any function by nesting case to decompose the input and scribe for each output. Why is it only a theoretical tool? +answer: The resulting expression is a giant lookup table whose size grows exponentially — a 256-bit input would need about 2²⁵⁶ entries. wrong_answers: - - Because scribe is a macro rather than a true combinator, the constructed expression falls outside the formally verified core Simplicity language and cannot be machine-checked - - Because the Bit Machine takes exponential time to evaluate the constructed expression, even though the expression itself stays compact thanks to sharing between branches - - Because nested case expressions can only decompose sum types, so the lookup-table construction fails whenever the function's input type is built from products + - scribe is a macro, not a core combinator, so the expression falls outside the formally verified language. + - The Bit Machine evaluates it in exponential time, even though the expression itself stays compact via sharing. + - Nested case can only decompose sum types, so the construction fails on any product-typed input. explanation: >- The construction enumerates every possible input via nested case decomposition and hard-codes each output with scribe, so expression size diff --git a/courses/scr403/quizz/033/en.yml b/courses/scr403/quizz/033/en.yml index 149b3a3e956..dfc89bb95cb 100644 --- a/courses/scr403/quizz/033/en.yml +++ b/courses/scr403/quizz/033/en.yml @@ -1,9 +1,9 @@ -question: The Bit Machine exploits the 'smaller types in the premises' structure of Simplicity's typing rules to minimize copying during execution. Which core combinators actually involve moving data around when expressions are interpreted? -answer: Only iden and comp — the remaining seven core combinators are implemented with nothing more than some bookkeeping +question: Given the 'smaller types in the premises' typing rules, which core combinators actually move data during execution? +answer: Only iden and comp; the other seven are implemented with nothing more than bookkeeping. wrong_answers: - - Only take and drop — extracting a single component of a pair forces the machine to copy that component out of the product - - Only pair and case — duplicating the input for two parallel branches and dispatching on a tag both require shuffling data - - Only injl and injr — attaching a tag means rewriting the value into a freshly allocated, larger sum-type representation + - Only take and drop; extracting one component forces the machine to copy it out of the product. + - Only pair and case; duplicating the input for two branches and dispatching on a tag shuffle data. + - Only injl and injr; adding a tag rewrites the value into a larger sum-type representation. explanation: >- Counterintuitively, the combinators that look like data access (take, drop, pair, case, injl, injr) need no copying: because premises in the diff --git a/courses/scr403/quizz/034/en.yml b/courses/scr403/quizz/034/en.yml index 2e6da646643..470f91995eb 100644 --- a/courses/scr403/quizz/034/en.yml +++ b/courses/scr403/quizz/034/en.yml @@ -1,9 +1,9 @@ -question: The chapter's full-adder combines the carry bits of its two half-adders with logical OR rather than with XOR or a third adder stage. Why is a plain OR sufficient to produce the correct carry-out? -answer: Because for any input, at most one of the two half-adders can produce a carry, so OR merges two mutually exclusive carry cases exactly. +question: The full-adder ORs the carry bits of its two half-adders instead of XORing them. Why is OR correct? +answer: At most one half-adder can carry for any input, so OR merges two mutually exclusive cases exactly. wrong_answers: - - Because the two carry bits must themselves be added together, and OR is how single-bit binary addition is implemented in Simplicity. - - Because after the case-based branching, OR is the only binary Boolean operator whose type still matches the remaining environment. - - Because OR over-approximates the carry, and any spurious extra carry values are discarded by the final I I H projection afterwards. + - The two carry bits must be added, and OR is how single-bit binary addition is done in Simplicity. + - After the branching, OR is the only Boolean operator whose type still matches the environment. + - OR over-approximates the carry; any spurious carries are dropped by the final projection afterwards. explanation: >- If the first half-adder carries, both of its input bits were 1, so its sum bit is 0 — and a half-adder fed a 0 can never carry. The two carry diff --git a/courses/scr403/quizz/035/en.yml b/courses/scr403/quizz/035/en.yml index b2193523465..40de6c4cdc9 100644 --- a/courses/scr403/quizz/035/en.yml +++ b/courses/scr403/quizz/035/en.yml @@ -1,9 +1,9 @@ -question: Trace the chapter's full-adder on input ⟨⟨1, 1⟩, 1⟩ (adding 1+1+1). What value of type 𝟚 × (𝟚 × 𝟚) does the second stage, O O H ▵ (O I H ▵ I H ⨾ half-adder), hand to the final stage? -answer: ⟨1, ⟨0, 1⟩⟩ — the first half-adder's carry, then the second half-adder's carry and sum. +question: Trace the full-adder on ⟨⟨1,1⟩,1⟩ (1+1+1). What value does stage two, O O H ▵ (O I H ▵ I H ⨾ half-adder), hand to the final stage? +answer: ⟨1, ⟨0, 1⟩⟩ — the first half-adder's carry, then the second's carry and sum. wrong_answers: - - ⟨1, ⟨1, 0⟩⟩ — the first half-adder's carry, then the second half-adder's sum and carry. - - ⟨0, ⟨0, 1⟩⟩ — the first half-adder's sum bit, then the second half-adder's carry and sum. - - ⟨1, ⟨1, 1⟩⟩ — the first half-adder's carry, then the second half-adder's OR and XOR bits. + - ⟨1, ⟨1, 0⟩⟩ — the first half-adder's carry, then the second's sum and carry. + - ⟨0, ⟨0, 1⟩⟩ — the first half-adder's sum bit, then the second's carry and sum. + - ⟨1, ⟨1, 1⟩⟩ — the first half-adder's carry, then the second's OR and XOR bits. explanation: >- Stage one computes half-adder⟨1,1⟩ = ⟨1, 0⟩ (carry 1, sum 0) and saves the carry-in, giving ⟨⟨1,0⟩, 1⟩. In stage two, O O H extracts the first diff --git a/courses/scr403/quizz/036/en.yml b/courses/scr403/quizz/036/en.yml index 651203dd0db..a0fe03d068d 100644 --- a/courses/scr403/quizz/036/en.yml +++ b/courses/scr403/quizz/036/en.yml @@ -1,9 +1,9 @@ -question: The stack operation push-- Aᑉⁿ is exactly the type of lists whose length is strictly less than n, so a buffer at maximum capacity holds n−1 elements. Pushing one more diff --git a/courses/scr403/quizz/037/en.yml b/courses/scr403/quizz/037/en.yml index c46f7f06331..7aeb3aea45e 100644 --- a/courses/scr403/quizz/037/en.yml +++ b/courses/scr403/quizz/037/en.yml @@ -1,9 +1,9 @@ -question: SHA-256 compression will run as a jet, yet the chapter insists the fold and map combinators for vectors and buffers 'cannot be replaced with jets' and will appear literally in deployed programs. What explains this asymmetry? -answer: A jet replaces one fixed expression with a concrete type, and sha256-hash-block is exactly that, whereas fold and map are schemas producing a different expression for every inner function f. +question: SHA-256 compression becomes a jet, but the fold and map combinators cannot. What explains the asymmetry? +answer: A jet replaces one fixed expression; fold and map aren't single expressions but schemas, yielding a different one per inner function f. wrong_answers: - - Jets can only accelerate straight-line code without repetition, so iterating combinators must first be fully unrolled, after which the unrolled form no longer matches any jet. - - Only expressions carrying a machine-checked Rocq correctness proof are eligible for jet replacement, and such proofs exist for SHA-256 but not for the generic folding combinators. - - Folds over short vectors are too cheap to benefit from native code, so the standard library deliberately reserves its jets for the expensive cryptographic operations alone. + - Jets only accelerate straight-line code, so iterating combinators must be unrolled first and then match no jet. + - Only expressions with a machine-checked Rocq proof qualify, which exists for SHA-256 but not the folds. + - Folds over short vectors are too cheap to benefit, so jets are reserved for costly crypto operations. explanation: >- A jet is a native replacement for one specific, fully-formed Simplicity expression, which nodes can substitute while preserving its exact diff --git a/courses/scr403/quizz/038/en.yml b/courses/scr403/quizz/038/en.yml index 6253107287e..67284e9d0bb 100644 --- a/courses/scr403/quizz/038/en.yml +++ b/courses/scr403/quizz/038/en.yml @@ -1,9 +1,9 @@ -question: To make Simplicity forward-compatible with cross-input signature aggregation, a half-agg-verify jet is imagined as a Writer effect whose transaction log is treated as a set of (key, message, r-component) tuples rather than a list. Under the commutative/idempotent/unitary classification, what does this set-based design achieve, and what limit remains? -answer: "It becomes commutative and idempotent, meeting Simplicity's requirement, but not unitary: discarding a call with unused output would drop its tuple from the log and skip a signature in the aggregate check." +question: A half-agg-verify jet logs a set of tuples as a Writer effect. Under the commutative/idempotent/unitary test, what does the set design achieve, and what is still missing? +answer: "Commutative and idempotent (as Simplicity requires), but not unitary: discarding a call would drop its tuple and skip a signature." wrong_answers: - - It becomes idempotent and unitary, but stays non-commutative because the aggregate s-component must combine the logged r-components in the exact order the individual signatures were produced. - - It gains all three properties, so an optimizer may freely duplicate, reorder, or discard half-agg-verify calls without any risk of changing whether the transaction is valid. - - It becomes commutative but stays non-idempotent, since inserting an identical tuple twice would make the verifier demand two aggregate s-components for a single logged signature. + - Idempotent and unitary, but not commutative, since the aggregate must combine r-components in signing order. + - All three, so an optimizer may freely duplicate, reorder, or discard the calls with no risk. + - Commutative but not idempotent, since logging the same tuple twice would demand two aggregate s-components. explanation: >- Treating the writer log as a set makes the effect idempotent and commutative, because set insertion itself has both properties — exactly diff --git a/courses/scr403/quizz/039/en.yml b/courses/scr403/quizz/039/en.yml index ef49ea295e9..f27a8ca3755 100644 --- a/courses/scr403/quizz/039/en.yml +++ b/courses/scr403/quizz/039/en.yml @@ -1,9 +1,9 @@ -question: A Simplicity optimizer is transforming an expression built from jets such as verify, bip0340-verify, and sig-all-hash. Given that Simplicity demands its effects be commutative and idempotent but not unitary, which program transformation must the optimizer refuse in general? -answer: "Replacing an expression whose discarded output makes it look dead with `unit`, since Failure is not unitary: the expression could hide a failing `bip0340-verify` that must abort the transaction." +question: Simplicity's effects are commutative and idempotent but not unitary. Which optimizer transformation must therefore be refused in general? +answer: Replacing a seemingly-dead expression with unit — Failure isn't unitary, so it could hide a failing check that must abort. wrong_answers: - - Swapping the order of two independent subexpressions, because each `sig-all-hash` call could observe the transaction environment in a different state depending on when it executes. - - Deduplicating two identical `verify` calls into one, because a duplicated Failure effect would throw the unit exception twice and abort a computation that should have continued. - - Reordering expressions that may throw, because the exception that propagates from a pair depends on which side runs first, changing the program's observable failure value. + - Swapping two independent subexpressions, since a sig-all-hash could observe a different environment state. + - Merging two identical verify calls, since a duplicated Failure would throw twice and abort wrongly. + - Reordering expressions that may throw, since the propagated exception depends on which side runs first. explanation: >- Because Simplicity's effects are guaranteed commutative and idempotent, swapping independent subexpressions and duplicating or merging identical diff --git a/courses/scr403/quizz/040/en.yml b/courses/scr403/quizz/040/en.yml index ae6636d98d7..e760956bce5 100644 --- a/courses/scr403/quizz/040/en.yml +++ b/courses/scr403/quizz/040/en.yml @@ -1,9 +1,9 @@ -question: "In the recursive CMR rule, computing #ᶜ(comp f g) hashes a 128-byte input: the 32-byte comp tag repeated twice, followed by the two 32-byte child CMRs. Why does this still cost at most one call to the SHA-256 compression function?" -answer: The first 64-byte block holds only the constant repeated tag, so its midstate can be precomputed once per combinator; only the block carrying the two child CMRs is compressed. +question: "Computing #ᶜ(comp f g) hashes 128 bytes: the comp tag twice, then both child CMRs. Why is that still at most one SHA-256 compression call?" +answer: The first 64-byte block is the constant tag∥tag, whose midstate is precomputed once; only the block holding the child CMRs is compressed. wrong_answers: - - Dropping SHA-256's final length-padding block is alone what saves the work; without that padding, the whole 128-byte input fits within one invocation of the compression function. - - The two child CMRs are XORed into a single 32-byte digest before hashing, shrinking the entire input to one 64-byte block containing the tags plus the combined child hash. - - SHA-256-midstate is a wide-block variant of the compression function that accepts 128-byte message blocks directly, so the tags and child CMRs are absorbed in a single pass. + - Dropping SHA-256's final length-padding block alone lets the whole 128 bytes fit in one call. + - The two child CMRs are XORed into one 32-byte digest, shrinking the input to a single block. + - SHA-256-midstate is a wide-block variant that absorbs 128-byte message blocks in one pass. explanation: >- SHA-256's compression function processes fixed 64-byte blocks, so a 128-byte input normally needs two calls (plus one more for the length diff --git a/courses/scr403/quizz/041/en.yml b/courses/scr403/quizz/041/en.yml index 403811e1430..d2b972a8804 100644 --- a/courses/scr403/quizz/041/en.yml +++ b/courses/scr403/quizz/041/en.yml @@ -1,9 +1,9 @@ -question: A Simplicity output is built with the fixed BIP-0341 NUMS point as its internal key. Why is the key-spend path provably unusable, and what does randomizing that NUMS point (as BIP-0341 recommends) actually add? -answer: Nobody knows the NUMS point's discrete logarithm, so no key-path signature can ever be produced; randomization adds only privacy, making the output indistinguishable from ordinary Taproot outputs. +question: A Simplicity output uses the fixed BIP-0341 NUMS point as its internal key. Why is key-spend provably impossible, and what does randomizing the NUMS point add? +answer: Nobody knows the NUMS point's discrete log, so no key-path signature can exist; randomizing only adds privacy. wrong_answers: - - The NUMS point is deliberately chosen to lie off the secp256k1 curve, so key-path signatures fail validation; randomization brings it back on-curve while keeping its private key unrecoverable. - - The NUMS point corresponds to a private key of zero, which consensus rules reject in any signature; randomization protects the tweak computation against side-channel leakage of that key. - - Tweaking a NUMS point yields an output key outside the valid range, making key-spend transactions non-standard; randomization guarantees distinct addresses when the same CMR is reused. + - The NUMS point lies off the curve so key-path signatures fail; randomizing brings it back on-curve. + - The NUMS point's private key is zero, which consensus rejects; randomizing guards the tweak against side channels. + - Tweaking a NUMS point yields an out-of-range key, making key-spend non-standard; randomizing avoids address reuse. explanation: >- A NUMS ('Nothing-Up-My-Sleeve') point is a perfectly valid curve point constructed so that no one knows a corresponding private key — its diff --git a/courses/scr403/quizz/042/en.yml b/courses/scr403/quizz/042/en.yml index 3f9ee5771ac..b7ecf1b2b2f 100644 --- a/courses/scr403/quizz/042/en.yml +++ b/courses/scr403/quizz/042/en.yml @@ -1,9 +1,9 @@ -question: At spending time, a Simplicity program is revealed with an unexecuted case branch pruned away. How can the verifier still confirm that the revealed program matches the CMR committed in the UTXO? -answer: "The CMR is a Merkle root: a case node hashes both children's CMRs, so the spender supplies only the pruned branch's 32-byte CMR and the verifier recomputes the root without its contents." +question: At spending time a case branch is pruned away. How can the verifier still match the revealed program to the committed CMR? +answer: The CMR is a Merkle root, so the spender supplies just the pruned branch's CMR and the verifier folds it in to recompute the root. wrong_answers: - - The verifier recomputes the commitment from the executed branch alone, because branches of a case expression that never execute were not included in the CMR in the first place. - - Pruned branches are replaced by a canonical placeholder node whose fixed, well-known CMR stands in for the missing subtree when the Merkle root is recomputed by the verifier. - - The pruned branch's full code is still committed in the transaction witness, where the verifier hashes it but skips executing it in order to save on validation costs. + - The verifier uses only the executed branch, since unexecuted case branches were never in the CMR. + - Pruned branches become a canonical placeholder whose fixed CMR stands in when recomputing the root. + - The pruned branch's full code stays in the witness, where the verifier hashes but does not execute it. explanation: >- The CMR of case f g is a tagged hash over both children's CMRs, so every branch — executed or not — is committed at address time. Because the