1pub use piecrust_uplink::{
10 ARGBUF_LEN, CONTRACT_ID_BYTES, ContractError, ContractId, Event,
11 StandardBufSerializer,
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 pub const SHA256: &'static str = "sha256";
51 pub const VERIFY_KZG_PROOF: &'static str = "verify_kzg_proof";
53 pub const SECP256K1_RECOVER: &'static str = "secp256k1_recover";
55}
56
57#[cfg(feature = "abi")]
58pub(crate) mod host_queries {
59 use alloc::vec::Vec;
60
61 use dusk_bytes::Serializable;
62 #[cfg(feature = "abi-debug")]
63 pub use piecrust_uplink::debug as piecrust_debug;
64 pub use piecrust_uplink::{
65 call, call_raw, call_raw_with_limit, call_with_limit, caller,
66 callstack, emit, emit_raw, feed, limit, self_id, spent, wrap_call,
67 wrap_call_unchecked, };
70 use piecrust_uplink::{host_query, meta_data};
71
72 use crate::BlsScalar;
73 use crate::abi::{ContractId, Metadata, Query};
74 use crate::signatures::bls::{
75 MultisigSignature, PublicKey as BlsPublicKey, Signature as BlsSignature,
76 };
77 use crate::signatures::schnorr::{
78 PublicKey as SchnorrPublicKey, Signature as SchnorrSignature,
79 };
80
81 #[must_use]
85 pub fn hash(bytes: Vec<u8>) -> BlsScalar {
86 host_query(Query::HASH, bytes)
87 }
88
89 #[must_use]
91 pub fn poseidon_hash(scalars: Vec<BlsScalar>) -> BlsScalar {
92 host_query(Query::POSEIDON_HASH, scalars)
93 }
94
95 #[must_use]
101 pub fn verify_groth16_bn254(
102 pvk: Vec<u8>,
103 proof: Vec<u8>,
104 inputs: Vec<u8>,
105 ) -> bool {
106 host_query(Query::VERIFY_GROTH16_BN254, (pvk, proof, inputs))
107 }
108
109 #[must_use]
111 pub fn verify_plonk(
112 verifier_data: Vec<u8>,
113 proof: Vec<u8>,
114 public_inputs: Vec<BlsScalar>,
115 ) -> bool {
116 host_query(Query::VERIFY_PLONK, (verifier_data, proof, public_inputs))
117 }
118
119 #[must_use]
121 pub fn verify_schnorr(
122 msg: BlsScalar,
123 pk: SchnorrPublicKey,
124 sig: SchnorrSignature,
125 ) -> bool {
126 host_query(Query::VERIFY_SCHNORR, (msg, pk, sig))
127 }
128
129 #[must_use]
131 pub fn verify_bls(
132 msg: Vec<u8>,
133 pk: BlsPublicKey,
134 sig: BlsSignature,
135 ) -> bool {
136 host_query(Query::VERIFY_BLS, (msg, pk, sig))
137 }
138
139 #[must_use]
141 pub fn verify_bls_multisig(
142 msg: Vec<u8>,
143 keys: Vec<BlsPublicKey>,
144 sig: MultisigSignature,
145 ) -> bool {
146 host_query(Query::VERIFY_BLS_MULTISIG, (msg, keys, sig))
147 }
148
149 #[must_use]
152 pub fn keccak256(bytes: Vec<u8>) -> [u8; 32] {
153 host_query(Query::KECCAK256, bytes)
154 }
155
156 #[must_use]
159 pub fn sha256(bytes: Vec<u8>) -> [u8; 32] {
160 host_query(Query::SHA256, bytes)
161 }
162
163 #[must_use]
165 pub fn verify_kzg_proof(
166 commitment: [u8; 48],
167 z: [u8; 32],
168 y: [u8; 32],
169 proof: [u8; 48],
170 ) -> bool {
171 host_query(Query::VERIFY_KZG_PROOF, (commitment, z, y, proof))
172 }
173
174 #[must_use]
179 pub fn secp256k1_recover(
180 msg_hash: [u8; 32],
181 sig: [u8; 65],
182 ) -> Option<[u8; 65]> {
183 host_query(Query::SECP256K1_RECOVER, (msg_hash, sig))
184 }
185
186 #[must_use]
191 pub fn chain_id() -> u8 {
192 meta_data(Metadata::CHAIN_ID).unwrap()
193 }
194
195 #[must_use]
201 pub fn block_height() -> u64 {
202 meta_data(Metadata::BLOCK_HEIGHT).unwrap()
203 }
204
205 #[must_use]
212 pub fn public_sender() -> Option<BlsPublicKey> {
213 meta_data(Metadata::PUBLIC_SENDER)
214 .expect("moonlight sender metadata to be set")
215 }
216
217 #[must_use]
223 pub fn owner(contract: ContractId) -> Option<BlsPublicKey> {
224 owner_raw(contract).map(|buf| {
225 BlsPublicKey::from_bytes(&buf)
226 .expect("Owner should deserialize correctly")
227 })
228 }
229
230 #[must_use]
235 pub fn self_owner() -> BlsPublicKey {
236 let buf = self_owner_raw();
237 BlsPublicKey::from_bytes(&buf)
238 .expect("Owner should deserialize correctly")
239 }
240
241 #[must_use]
243 pub fn owner_raw(contract: ContractId) -> Option<[u8; BlsPublicKey::SIZE]> {
244 piecrust_uplink::owner(contract)
245 }
246
247 #[must_use]
249 pub fn self_owner_raw() -> [u8; BlsPublicKey::SIZE] {
250 piecrust_uplink::self_owner()
251 }
252}