1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
// RGB wallet library for smart contracts on Bitcoin & Lightning network
//
// SPDX-License-Identifier: Apache-2.0
//
// Written in 2019-2023 by
//     Dr Maxim Orlovsky <orlovsky@lnp-bp.org>
//
// Copyright (C) 2019-2023 LNP/BP Standards Association. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

//! Library provides three main procedures:
//!
//! ## 1. PSBT-based state transition construction.
//!
//! Given PSBT-originating set of outpoints the procedure creates all required
//! state transitions for all contracts, adding necessary information to PSBT
//! for constructing bundles and tapret proofs. The actual state transitions are
//! saved into the stash even before witness transactions are mined. They may be
//! also put into PSBT, if needed for the hardware signers.
//!
//! ## 2. PSBT-based finalization.
//!
//! Procedure takes PSBT with all information for constructing transition
//! bundles and taprets and
//! a) generates final tapret commitment;
//! b) creates consignment for the main transfer.
//!
//! ## 3. Descriptor-based contract state.
//!
//! Checks descriptor UTXO set and updates contract, removing outdated outputs.
//! For instance, after consignment creation, a new state transition is already
//! present in the contract state, even before the witness transaction is mined.
//! Descriptor filtering of the contract state will show a valid result, since
//! a new state without mined witness will not be displayed. Once the witness
//! gets mined, a new state appears, and previous state gets invalidated since
//! it no longer assigned to an unspent transaction output.

#![deny(
    non_upper_case_globals,
    non_camel_case_types,
    non_snake_case,
    unused_mut,
    unused_imports,
    dead_code,
    //missing_docs
)]
#![cfg_attr(docsrs, feature(doc_auto_cfg))]

#[macro_use]
extern crate amplify;
#[macro_use]
extern crate strict_encoding;
pub extern crate bitcoin;

mod invoice;
mod pay;
pub mod psbt;

pub use invoice::{
    Beneficiary, InvoiceParseError, InvoiceState, RgbInvoice, RgbInvoiceBuilder, RgbTransport,
    TransportParseError,
};
pub use pay::{InventoryWallet, PayError};

/// BIP32 derivation index for outputs which may contain assigned RGB state.
pub const RGB_NATIVE_DERIVATION_INDEX: u32 = 9;
/// BIP32 derivation index for outputs which are tweaked with Tapret commitment
/// and may also optionally contain assigned RGB state.
pub const RGB_TAPRET_DERIVATION_INDEX: u32 = 10;

// 1. Construct main state transition with transition builder
// -- shortcut using invoice to do that construction (like .with_invoice())
// -- have a construction for the "remaining state" assigned to a seal
//    prototype.
// 2. Add that state transition to PSBT
// -- add change by checking change PSBT flag and assigning remaining state to
//    that output
// 3. Extract from PSBT all spent prevouts and construct blank state transitions
//    for each one of them; embed them into PSBT