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