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::storage_proof::FraudProofStorageKeyRequest;
25#[cfg(not(feature = "std"))]
26use alloc::vec::Vec;
27use domain_runtime_primitives::EthereumAccountId;
28use fraud_proof::FraudProof;
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 subspace_core_primitives::U256;
44use subspace_runtime_primitives::{Balance, Moment};
45
46#[repr(u8)]
51pub enum InvalidTransactionCode {
52 TransactionProof = 101,
53 ExecutionReceipt = 102,
54 Bundle = 103,
55 FraudProof = 104,
56 BundleStorageFeePayment = 105,
57}
58
59impl From<InvalidTransactionCode> for InvalidTransaction {
60 #[inline]
61 fn from(invalid_code: InvalidTransactionCode) -> Self {
62 InvalidTransaction::Custom(invalid_code as u8)
63 }
64}
65
66impl From<InvalidTransactionCode> for TransactionValidity {
67 #[inline]
68 fn from(invalid_code: InvalidTransactionCode) -> Self {
69 InvalidTransaction::Custom(invalid_code as u8).into()
70 }
71}
72
73#[derive(Debug, Decode, Encode, TypeInfo, PartialEq, Eq, Clone)]
75pub enum StorageKeyRequest {
76 Transfers,
78}
79
80#[derive(Debug, Decode, Encode, TypeInfo, PartialEq, Eq, Clone)]
82pub enum SetCodeExtrinsic {
83 None,
85 EncodedExtrinsic(Vec<u8>),
87}
88
89#[derive(Debug, Decode, Encode, TypeInfo, PartialEq, Eq, Clone)]
91pub enum DomainChainAllowlistUpdateExtrinsic {
92 None,
94 EncodedExtrinsic(Vec<u8>),
96}
97
98#[derive(Debug, Decode, Encode, TypeInfo, PartialEq, Eq, Clone)]
99pub struct DomainInherentExtrinsicData {
100 pub timestamp: Moment,
101 pub maybe_domain_runtime_upgrade: Option<Vec<u8>>,
102 pub consensus_transaction_byte_fee: Balance,
103 pub domain_chain_allowlist: DomainAllowlistUpdates,
104 pub maybe_sudo_runtime_call: Option<Vec<u8>>,
105 pub maybe_evm_domain_contract_creation_allowed_by_call:
106 Option<PermissionedActionAllowedBy<EthereumAccountId>>,
107}
108
109#[derive(Debug, Decode, Encode, TypeInfo, PartialEq, Eq, Clone)]
110pub struct DomainInherentExtrinsic {
111 domain_timestamp_extrinsic: Vec<u8>,
112 maybe_domain_chain_allowlist_extrinsic: Option<Vec<u8>>,
113 consensus_chain_byte_fee_extrinsic: Vec<u8>,
114 maybe_domain_set_code_extrinsic: Option<Vec<u8>>,
115 maybe_domain_sudo_call_extrinsic: Option<Vec<u8>>,
116 maybe_evm_domain_contract_creation_allowed_by_call_extrinsic: Option<Vec<u8>>,
117}
118
119#[derive(Debug, Decode, Encode, TypeInfo, PartialEq, Eq, Clone)]
120pub enum DomainStorageKeyRequest {
121 BlockFees,
122 Transfers,
123}
124
125#[derive(Debug, Decode, Encode, TypeInfo, PartialEq, Eq, Clone)]
126pub enum StatelessDomainRuntimeCall {
127 IsTxInRange {
128 opaque_extrinsic: OpaqueExtrinsic,
129 domain_tx_range: U256,
130 bundle_vrf_hash: U256,
131 },
132 IsInherentExtrinsic(OpaqueExtrinsic),
133 IsDecodableExtrinsic(OpaqueExtrinsic),
134 IsValidDomainSudoCall(Vec<u8>),
135}
136
137sp_api::decl_runtime_apis! {
138 #[api_version(2)]
140 pub trait FraudProofApi<DomainHeader: HeaderT> {
141 fn submit_fraud_proof_unsigned(fraud_proof: FraudProof<NumberFor<Block>, Block::Hash, DomainHeader, H256>);
143
144 fn fraud_proof_storage_key(req: FraudProofStorageKeyRequest<NumberFor<Block>>) -> Vec<u8>;
146 }
147}