1#![cfg_attr(not(feature = "std"), no_std)]
3#![allow(incomplete_features)]
5#![feature(generic_const_exprs, associated_type_defaults)]
8
9#[cfg(feature = "std")]
10pub mod execution_prover;
11pub mod fraud_proof;
12#[cfg(feature = "std")]
13mod host_functions;
14mod runtime_interface;
15pub mod storage_proof;
16#[cfg(test)]
17mod tests;
18pub mod verification;
19pub mod weights;
20
21#[cfg(not(feature = "std"))]
22extern crate alloc;
23
24use crate::fraud_proof::FraudProof;
25use crate::storage_proof::FraudProofStorageKeyRequest;
26#[cfg(not(feature = "std"))]
27use alloc::vec::Vec;
28use domain_runtime_primitives::EthereumAccountId;
29#[cfg(feature = "std")]
30pub use host_functions::{
31 FraudProofExtension, FraudProofHostFunctions, FraudProofHostFunctionsImpl,
32};
33use parity_scale_codec::{Decode, Encode};
34pub use runtime_interface::fraud_proof_runtime_interface;
35#[cfg(feature = "std")]
36pub use runtime_interface::fraud_proof_runtime_interface::HostFunctions;
37use scale_info::TypeInfo;
38use sp_core::H256;
39use sp_domains::{DomainAllowlistUpdates, PermissionedActionAllowedBy};
40use sp_runtime::OpaqueExtrinsic;
41use sp_runtime::traits::{Header as HeaderT, NumberFor};
42use sp_runtime::transaction_validity::{InvalidTransaction, TransactionValidity};
43use sp_runtime_interface::pass_by;
44use sp_runtime_interface::pass_by::PassBy;
45use subspace_core_primitives::U256;
46use subspace_runtime_primitives::{Balance, Moment};
47
48#[repr(u8)]
53pub enum InvalidTransactionCode {
54 TransactionProof = 101,
55 ExecutionReceipt = 102,
56 Bundle = 103,
57 FraudProof = 104,
58 BundleStorageFeePayment = 105,
59}
60
61impl From<InvalidTransactionCode> for InvalidTransaction {
62 #[inline]
63 fn from(invalid_code: InvalidTransactionCode) -> Self {
64 InvalidTransaction::Custom(invalid_code as u8)
65 }
66}
67
68impl From<InvalidTransactionCode> for TransactionValidity {
69 #[inline]
70 fn from(invalid_code: InvalidTransactionCode) -> Self {
71 InvalidTransaction::Custom(invalid_code as u8).into()
72 }
73}
74
75#[derive(Debug, Decode, Encode, TypeInfo, PartialEq, Eq, Clone)]
77pub enum StorageKeyRequest {
78 Transfers,
80}
81
82#[derive(Debug, Decode, Encode, TypeInfo, PartialEq, Eq, Clone)]
84pub enum SetCodeExtrinsic {
85 None,
87 EncodedExtrinsic(Vec<u8>),
89}
90
91#[derive(Debug, Decode, Encode, TypeInfo, PartialEq, Eq, Clone)]
93pub enum DomainChainAllowlistUpdateExtrinsic {
94 None,
96 EncodedExtrinsic(Vec<u8>),
98}
99
100#[derive(Debug, Decode, Encode, TypeInfo, PartialEq, Eq, Clone)]
101pub struct DomainInherentExtrinsicData {
102 pub timestamp: Moment,
103 pub maybe_domain_runtime_upgrade: Option<Vec<u8>>,
104 pub consensus_transaction_byte_fee: Balance,
105 pub domain_chain_allowlist: DomainAllowlistUpdates,
106 pub maybe_sudo_runtime_call: Option<Vec<u8>>,
107 pub maybe_evm_domain_contract_creation_allowed_by_call:
108 Option<PermissionedActionAllowedBy<EthereumAccountId>>,
109}
110
111impl PassBy for DomainInherentExtrinsicData {
112 type PassBy = pass_by::Codec<Self>;
113}
114
115#[derive(Debug, Decode, Encode, TypeInfo, PartialEq, Eq, Clone)]
116pub struct DomainInherentExtrinsic {
117 domain_timestamp_extrinsic: Vec<u8>,
118 maybe_domain_chain_allowlist_extrinsic: Option<Vec<u8>>,
119 consensus_chain_byte_fee_extrinsic: Vec<u8>,
120 maybe_domain_set_code_extrinsic: Option<Vec<u8>>,
121 maybe_domain_sudo_call_extrinsic: Option<Vec<u8>>,
122 maybe_evm_domain_contract_creation_allowed_by_call_extrinsic: Option<Vec<u8>>,
123}
124
125#[derive(Debug, Decode, Encode, TypeInfo, PartialEq, Eq, Clone)]
126pub enum DomainStorageKeyRequest {
127 BlockFees,
128 Transfers,
129}
130
131impl PassBy for DomainStorageKeyRequest {
132 type PassBy = pass_by::Codec<Self>;
133}
134
135#[derive(Debug, Decode, Encode, TypeInfo, PartialEq, Eq, Clone)]
136pub enum StatelessDomainRuntimeCall {
137 IsTxInRange {
138 opaque_extrinsic: OpaqueExtrinsic,
139 domain_tx_range: U256,
140 bundle_vrf_hash: U256,
141 },
142 IsInherentExtrinsic(OpaqueExtrinsic),
143 IsDecodableExtrinsic(OpaqueExtrinsic),
144 IsValidDomainSudoCall(Vec<u8>),
145}
146
147impl PassBy for StatelessDomainRuntimeCall {
148 type PassBy = pass_by::Codec<Self>;
149}
150
151sp_api::decl_runtime_apis! {
152 pub trait FraudProofApi<DomainHeader: HeaderT> {
154 fn submit_fraud_proof_unsigned(fraud_proof: FraudProof<NumberFor<Block>, Block::Hash, DomainHeader, H256>);
156
157 fn fraud_proof_storage_key(req: FraudProofStorageKeyRequest<NumberFor<Block>>) -> Vec<u8>;
159 }
160}