chik_sdk_driver/layers/
settlement_layer.rs

1use chik_puzzle_types::offer::SettlementPaymentsSolution;
2use chik_puzzles::SETTLEMENT_PAYMENT_HASH;
3use chik_sdk_types::puzzles::SettlementPayment;
4use klvm_traits::FromKlvm;
5use klvmr::{Allocator, NodePtr};
6
7use crate::{DriverError, Layer, Puzzle, SpendContext};
8
9/// The settlement [`Layer`] is used to spend coins that are part of an offer.
10#[derive(Debug, Clone, Copy, PartialEq, Eq)]
11pub struct SettlementLayer;
12
13impl Layer for SettlementLayer {
14    type Solution = SettlementPaymentsSolution;
15
16    fn construct_puzzle(&self, ctx: &mut SpendContext) -> Result<NodePtr, DriverError> {
17        ctx.alloc_mod::<SettlementPayment>()
18    }
19
20    fn construct_solution(
21        &self,
22        ctx: &mut SpendContext,
23        solution: Self::Solution,
24    ) -> Result<NodePtr, DriverError> {
25        ctx.alloc(&solution)
26    }
27
28    fn parse_puzzle(_allocator: &Allocator, puzzle: Puzzle) -> Result<Option<Self>, DriverError> {
29        if puzzle.curried_puzzle_hash() != SETTLEMENT_PAYMENT_HASH.into() {
30            return Ok(None);
31        }
32        Ok(Some(Self))
33    }
34
35    fn parse_solution(
36        allocator: &Allocator,
37        solution: NodePtr,
38    ) -> Result<Self::Solution, DriverError> {
39        Ok(FromKlvm::from_klvm(allocator, solution)?)
40    }
41}