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 pub const KECCAK256: &'static str = "keccak256";
49}
50
51#[cfg(feature = "abi")]
52pub(crate) mod host_queries {
53 #[cfg(feature = "abi-debug")]
54 pub use piecrust_uplink::debug as piecrust_debug;
55 pub use piecrust_uplink::{
56 call, call_raw, call_raw_with_limit, call_with_limit, caller,
57 callstack, emit, emit_raw, feed, limit, self_id, spent, wrap_call,
58 wrap_call_unchecked, };
61
62 use alloc::vec::Vec;
63
64 use dusk_bytes::Serializable;
65 use piecrust_uplink::{host_query, meta_data};
66
67 use crate::abi::{ContractId, Metadata, Query};
68 use crate::signatures::bls::{
69 MultisigSignature, PublicKey as BlsPublicKey, Signature as BlsSignature,
70 };
71 use crate::signatures::schnorr::{
72 PublicKey as SchnorrPublicKey, Signature as SchnorrSignature,
73 };
74 use crate::BlsScalar;
75
76 #[must_use]
80 pub fn hash(bytes: Vec<u8>) -> BlsScalar {
81 host_query(Query::HASH, bytes)
82 }
83
84 #[must_use]
86 pub fn poseidon_hash(scalars: Vec<BlsScalar>) -> BlsScalar {
87 host_query(Query::POSEIDON_HASH, scalars)
88 }
89
90 #[must_use]
96 pub fn verify_groth16_bn254(
97 pvk: Vec<u8>,
98 proof: Vec<u8>,
99 inputs: Vec<u8>,
100 ) -> bool {
101 host_query(Query::VERIFY_GROTH16_BN254, (pvk, proof, inputs))
102 }
103
104 #[must_use]
106 pub fn verify_plonk(
107 verifier_data: Vec<u8>,
108 proof: Vec<u8>,
109 public_inputs: Vec<BlsScalar>,
110 ) -> bool {
111 host_query(Query::VERIFY_PLONK, (verifier_data, proof, public_inputs))
112 }
113
114 #[must_use]
116 pub fn verify_schnorr(
117 msg: BlsScalar,
118 pk: SchnorrPublicKey,
119 sig: SchnorrSignature,
120 ) -> bool {
121 host_query(Query::VERIFY_SCHNORR, (msg, pk, sig))
122 }
123
124 #[must_use]
126 pub fn verify_bls(
127 msg: Vec<u8>,
128 pk: BlsPublicKey,
129 sig: BlsSignature,
130 ) -> bool {
131 host_query(Query::VERIFY_BLS, (msg, pk, sig))
132 }
133
134 #[must_use]
136 pub fn verify_bls_multisig(
137 msg: Vec<u8>,
138 keys: Vec<BlsPublicKey>,
139 sig: MultisigSignature,
140 ) -> bool {
141 host_query(Query::VERIFY_BLS_MULTISIG, (msg, keys, sig))
142 }
143
144 #[must_use]
147 pub fn keccak256(bytes: Vec<u8>) -> [u8; 32] {
148 host_query(Query::KECCAK256, bytes)
149 }
150
151 #[must_use]
156 pub fn chain_id() -> u8 {
157 meta_data(Metadata::CHAIN_ID).unwrap()
158 }
159
160 #[must_use]
166 pub fn block_height() -> u64 {
167 meta_data(Metadata::BLOCK_HEIGHT).unwrap()
168 }
169
170 #[must_use]
177 pub fn public_sender() -> Option<BlsPublicKey> {
178 meta_data(Metadata::PUBLIC_SENDER)
179 .expect("moonlight sender metadata to be set")
180 }
181
182 #[must_use]
188 pub fn owner(contract: ContractId) -> Option<BlsPublicKey> {
189 owner_raw(contract).map(|buf| {
190 BlsPublicKey::from_bytes(&buf)
191 .expect("Owner should deserialize correctly")
192 })
193 }
194
195 #[must_use]
200 pub fn self_owner() -> BlsPublicKey {
201 let buf = self_owner_raw();
202 BlsPublicKey::from_bytes(&buf)
203 .expect("Owner should deserialize correctly")
204 }
205
206 #[must_use]
208 pub fn owner_raw(contract: ContractId) -> Option<[u8; BlsPublicKey::SIZE]> {
209 piecrust_uplink::owner(contract)
210 }
211
212 #[must_use]
214 pub fn self_owner_raw() -> [u8; BlsPublicKey::SIZE] {
215 piecrust_uplink::self_owner()
216 }
217}