dbc/tapret/
spk.rs

1// Deterministic bitcoin commitments library.
2//
3// SPDX-License-Identifier: Apache-2.0
4//
5// Written in 2019-2024 by
6//     Dr Maxim Orlovsky <orlovsky@lnp-bp.org>
7//
8// Copyright (C) 2019-2024 LNP/BP Standards Association. All rights reserved.
9//
10// Licensed under the Apache License, Version 2.0 (the "License");
11// you may not use this file except in compliance with the License.
12// You may obtain a copy of the License at
13//
14//     http://www.apache.org/licenses/LICENSE-2.0
15//
16// Unless required by applicable law or agreed to in writing, software
17// distributed under the License is distributed on an "AS IS" BASIS,
18// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19// See the License for the specific language governing permissions and
20// limitations under the License.
21
22use bc::ScriptPubkey;
23use commit_verify::{mpc, ConvolveCommit, ConvolveCommitProof};
24
25use super::{TapretFirst, TapretKeyError, TapretProof};
26
27impl ConvolveCommitProof<mpc::Commitment, ScriptPubkey, TapretFirst> for TapretProof {
28    type Suppl = Self;
29
30    fn restore_original(&self, _: &ScriptPubkey) -> ScriptPubkey { self.original_pubkey_script() }
31
32    fn extract_supplement(&self) -> &Self::Suppl { self }
33}
34
35impl ConvolveCommit<mpc::Commitment, TapretProof, TapretFirst> for ScriptPubkey {
36    type Commitment = ScriptPubkey;
37    type CommitError = TapretKeyError;
38
39    fn convolve_commit(
40        &self,
41        supplement: &TapretProof,
42        msg: &mpc::Commitment,
43    ) -> Result<(ScriptPubkey, TapretProof), Self::CommitError> {
44        let (output_key, _) =
45            supplement.internal_pk.convolve_commit(&supplement.path_proof, msg)?;
46
47        let script_pubkey = ScriptPubkey::p2tr_tweaked(output_key);
48
49        Ok((script_pubkey, supplement.clone()))
50    }
51}