pub use piecrust_uplink::{
ContractError, ContractId, Event, StandardBufSerializer, ARGBUF_LEN,
CONTRACT_ID_BYTES,
};
#[cfg(feature = "abi")]
pub use self::host_queries::*;
pub enum Metadata {}
impl Metadata {
pub const CHAIN_ID: &'static str = "chain_id";
pub const BLOCK_HEIGHT: &'static str = "block_height";
pub const PUBLIC_SENDER: &'static str = "public_sender";
}
pub enum Query {}
impl Query {
pub const HASH: &'static str = "hash";
pub const POSEIDON_HASH: &'static str = "poseidon_hash";
pub const VERIFY_PLONK: &'static str = "verify_plonk";
pub const VERIFY_GROTH16_BN254: &'static str = "verify_groth16_bn254";
pub const VERIFY_SCHNORR: &'static str = "verify_schnorr";
pub const VERIFY_BLS: &'static str = "verify_bls";
pub const VERIFY_BLS_MULTISIG: &'static str = "verify_bls_multisig";
pub const KECCAK256: &'static str = "keccak256";
}
#[cfg(feature = "abi")]
pub(crate) mod host_queries {
#[cfg(feature = "abi-debug")]
pub use piecrust_uplink::debug as piecrust_debug;
pub use piecrust_uplink::{
call, call_raw, call_raw_with_limit, call_with_limit, caller,
callstack, emit, emit_raw, feed, limit, self_id, spent, wrap_call,
wrap_call_unchecked,
};
use alloc::vec::Vec;
use dusk_bytes::Serializable;
use piecrust_uplink::{host_query, meta_data};
use crate::abi::{ContractId, Metadata, Query};
use crate::signatures::bls::{
MultisigSignature, PublicKey as BlsPublicKey, Signature as BlsSignature,
};
use crate::signatures::schnorr::{
PublicKey as SchnorrPublicKey, Signature as SchnorrSignature,
};
use crate::BlsScalar;
#[must_use]
pub fn hash(bytes: Vec<u8>) -> BlsScalar {
host_query(Query::HASH, bytes)
}
#[must_use]
pub fn poseidon_hash(scalars: Vec<BlsScalar>) -> BlsScalar {
host_query(Query::POSEIDON_HASH, scalars)
}
#[must_use]
pub fn verify_groth16_bn254(
pvk: Vec<u8>,
proof: Vec<u8>,
inputs: Vec<u8>,
) -> bool {
host_query(Query::VERIFY_GROTH16_BN254, (pvk, proof, inputs))
}
#[must_use]
pub fn verify_plonk(
verifier_data: Vec<u8>,
proof: Vec<u8>,
public_inputs: Vec<BlsScalar>,
) -> bool {
host_query(Query::VERIFY_PLONK, (verifier_data, proof, public_inputs))
}
#[must_use]
pub fn verify_schnorr(
msg: BlsScalar,
pk: SchnorrPublicKey,
sig: SchnorrSignature,
) -> bool {
host_query(Query::VERIFY_SCHNORR, (msg, pk, sig))
}
#[must_use]
pub fn verify_bls(
msg: Vec<u8>,
pk: BlsPublicKey,
sig: BlsSignature,
) -> bool {
host_query(Query::VERIFY_BLS, (msg, pk, sig))
}
#[must_use]
pub fn verify_bls_multisig(
msg: Vec<u8>,
keys: Vec<BlsPublicKey>,
sig: MultisigSignature,
) -> bool {
host_query(Query::VERIFY_BLS_MULTISIG, (msg, keys, sig))
}
#[must_use]
pub fn keccak256(bytes: Vec<u8>) -> [u8; 32] {
host_query(Query::KECCAK256, bytes)
}
#[must_use]
pub fn chain_id() -> u8 {
meta_data(Metadata::CHAIN_ID).unwrap()
}
#[must_use]
pub fn block_height() -> u64 {
meta_data(Metadata::BLOCK_HEIGHT).unwrap()
}
#[must_use]
pub fn public_sender() -> Option<BlsPublicKey> {
meta_data(Metadata::PUBLIC_SENDER)
.expect("moonlight sender metadata to be set")
}
#[must_use]
pub fn owner(contract: ContractId) -> Option<BlsPublicKey> {
owner_raw(contract).map(|buf| {
BlsPublicKey::from_bytes(&buf)
.expect("Owner should deserialize correctly")
})
}
#[must_use]
pub fn self_owner() -> BlsPublicKey {
let buf = self_owner_raw();
BlsPublicKey::from_bytes(&buf)
.expect("Owner should deserialize correctly")
}
#[must_use]
pub fn owner_raw(contract: ContractId) -> Option<[u8; BlsPublicKey::SIZE]> {
piecrust_uplink::owner(contract)
}
#[must_use]
pub fn self_owner_raw() -> [u8; BlsPublicKey::SIZE] {
piecrust_uplink::self_owner()
}
}