1pub use piecrust_uplink::{
10 ContractError, ContractId, Event, StandardBufSerializer, ARGBUF_LEN,
11 CONTRACT_ID_BYTES,
12};
13
14#[cfg(feature = "abi")]
15pub use self::host_queries::*;
16
17pub enum Metadata {}
19
20impl Metadata {
21 pub const CHAIN_ID: &'static str = "chain_id";
23 pub const BLOCK_HEIGHT: &'static str = "block_height";
25 pub const PUBLIC_SENDER: &'static str = "public_sender";
27}
28
29pub enum Query {}
31
32impl Query {
33 pub const HASH: &'static str = "hash";
35 pub const POSEIDON_HASH: &'static str = "poseidon_hash";
37 pub const VERIFY_PLONK: &'static str = "verify_plonk";
39 pub const VERIFY_GROTH16_BN254: &'static str = "verify_groth16_bn254";
41 pub const VERIFY_SCHNORR: &'static str = "verify_schnorr";
43 pub const VERIFY_BLS: &'static str = "verify_bls";
45 pub const VERIFY_BLS_MULTISIG: &'static str = "verify_bls_multisig";
47}
48
49#[cfg(feature = "abi")]
50pub(crate) mod host_queries {
51 #[cfg(feature = "abi-debug")]
52 pub use piecrust_uplink::debug as piecrust_debug;
53 pub use piecrust_uplink::{
54 call, call_raw, call_raw_with_limit, call_with_limit, caller,
55 callstack, emit, emit_raw, feed, limit, self_id, spent, wrap_call,
56 wrap_call_unchecked, };
59
60 use alloc::vec::Vec;
61
62 use dusk_bytes::Serializable;
63 use piecrust_uplink::{host_query, meta_data};
64
65 use crate::abi::{ContractId, Metadata, Query};
66 use crate::signatures::bls::{
67 MultisigSignature, PublicKey as BlsPublicKey, Signature as BlsSignature,
68 };
69 use crate::signatures::schnorr::{
70 PublicKey as SchnorrPublicKey, Signature as SchnorrSignature,
71 };
72 use crate::BlsScalar;
73
74 #[must_use]
78 pub fn hash(bytes: Vec<u8>) -> BlsScalar {
79 host_query(Query::HASH, bytes)
80 }
81
82 #[must_use]
84 pub fn poseidon_hash(scalars: Vec<BlsScalar>) -> BlsScalar {
85 host_query(Query::POSEIDON_HASH, scalars)
86 }
87
88 #[must_use]
94 pub fn verify_groth16_bn254(
95 pvk: Vec<u8>,
96 proof: Vec<u8>,
97 inputs: Vec<u8>,
98 ) -> bool {
99 host_query(Query::VERIFY_GROTH16_BN254, (pvk, proof, inputs))
100 }
101
102 #[must_use]
104 pub fn verify_plonk(
105 verifier_data: Vec<u8>,
106 proof: Vec<u8>,
107 public_inputs: Vec<BlsScalar>,
108 ) -> bool {
109 host_query(Query::VERIFY_PLONK, (verifier_data, proof, public_inputs))
110 }
111
112 #[must_use]
114 pub fn verify_schnorr(
115 msg: BlsScalar,
116 pk: SchnorrPublicKey,
117 sig: SchnorrSignature,
118 ) -> bool {
119 host_query(Query::VERIFY_SCHNORR, (msg, pk, sig))
120 }
121
122 #[must_use]
124 pub fn verify_bls(
125 msg: Vec<u8>,
126 pk: BlsPublicKey,
127 sig: BlsSignature,
128 ) -> bool {
129 host_query(Query::VERIFY_BLS, (msg, pk, sig))
130 }
131
132 #[must_use]
134 pub fn verify_bls_multisig(
135 msg: Vec<u8>,
136 keys: Vec<BlsPublicKey>,
137 sig: MultisigSignature,
138 ) -> bool {
139 host_query(Query::VERIFY_BLS_MULTISIG, (msg, keys, sig))
140 }
141
142 #[must_use]
147 pub fn chain_id() -> u8 {
148 meta_data(Metadata::CHAIN_ID).unwrap()
149 }
150
151 #[must_use]
157 pub fn block_height() -> u64 {
158 meta_data(Metadata::BLOCK_HEIGHT).unwrap()
159 }
160
161 #[must_use]
168 pub fn public_sender() -> Option<BlsPublicKey> {
169 meta_data(Metadata::PUBLIC_SENDER)
170 .expect("moonlight sender metadata to be set")
171 }
172
173 #[must_use]
179 pub fn owner(contract: ContractId) -> Option<BlsPublicKey> {
180 owner_raw(contract).map(|buf| {
181 BlsPublicKey::from_bytes(&buf)
182 .expect("Owner should deserialize correctly")
183 })
184 }
185
186 #[must_use]
191 pub fn self_owner() -> BlsPublicKey {
192 let buf = self_owner_raw();
193 BlsPublicKey::from_bytes(&buf)
194 .expect("Owner should deserialize correctly")
195 }
196
197 #[must_use]
199 pub fn owner_raw(contract: ContractId) -> Option<[u8; BlsPublicKey::SIZE]> {
200 piecrust_uplink::owner(contract)
201 }
202
203 #[must_use]
205 pub fn self_owner_raw() -> [u8; BlsPublicKey::SIZE] {
206 piecrust_uplink::self_owner()
207 }
208}