Get all processors to compile again

Requires splitting `serai-cosign` into `serai-cosign` and `serai-cosign-types`
so the processor don't require `serai-client/serai` (not correct yet).
This commit is contained in:
Luke Parker
2025-09-02 02:16:21 -04:00
parent 75240ed327
commit ada94e8c5d
87 changed files with 413 additions and 301 deletions

View File

@@ -20,14 +20,13 @@ workspace = true
zeroize = { version = "1", default-features = false, features = ["std"] }
hex = { version = "0.4", default-features = false, features = ["std"] }
scale = { package = "parity-scale-codec", version = "3", default-features = false, features = ["std"] }
borsh = { version = "1", default-features = false, features = ["std", "derive", "de_strict_order"] }
ciphersuite = { path = "../../crypto/ciphersuite", default-features = false, features = ["std"] }
dkg = { package = "dkg-evrf", path = "../../crypto/dkg/evrf", default-features = false, features = ["std", "ristretto"] }
serai-client = { path = "../../substrate/client", default-features = false }
serai-cosign = { path = "../../coordinator/cosign" }
serai-primitives = { path = "../../substrate/primitives", default-features = false, features = ["std"] }
serai-cosign = { package = "serai-cosign-types", path = "../../coordinator/cosign/types" }
log = { version = "0.4", default-features = false, features = ["std"] }
env_logger = { version = "0.10", default-features = false, features = ["humantime"] }

View File

@@ -3,10 +3,10 @@ use std::sync::{LazyLock, Arc, Mutex};
use tokio::sync::mpsc;
use serai_client::{
primitives::Signature,
validator_sets::primitives::{Session, SlashReport},
in_instructions::primitives::SignedBatch,
use serai_primitives::{
crypto::Signature,
validator_sets::{Session, SlashReport},
instructions::SignedBatch,
};
use serai_cosign::SignedCosign;

View File

@@ -8,7 +8,7 @@ use ciphersuite::{
};
use dkg::{Curves, Ristretto};
use serai_client::validator_sets::primitives::Session;
use serai_primitives::validator_sets::Session;
use serai_env as env;
use serai_db::{Get, DbTxn, Db as DbTrait, create_db, db_channel};

View File

@@ -20,7 +20,6 @@ workspace = true
rand_core = { version = "0.6", default-features = false }
hex = { version = "0.4", default-features = false, features = ["std"] }
scale = { package = "parity-scale-codec", version = "3", default-features = false, features = ["std"] }
borsh = { version = "1", default-features = false, features = ["std", "derive", "de_strict_order"] }
ciphersuite = { path = "../../crypto/ciphersuite", default-features = false, features = ["std"] }

View File

@@ -10,12 +10,15 @@ use bitcoin_serai::{
wallet::ReceivedOutput as WalletOutput,
};
use scale::{Encode, Decode, IoReader};
use borsh::{BorshSerialize, BorshDeserialize};
use serai_db::Get;
use serai_client::{
primitives::{ExternalCoin, Amount, ExternalBalance, ExternalAddress},
primitives::{
coin::ExternalCoin,
balance::{Amount, ExternalBalance},
address::ExternalAddress,
},
networks::bitcoin::Address,
};
@@ -26,7 +29,7 @@ use crate::{
scan::{offsets_for_key, presumed_origin, extract_serai_data},
};
#[derive(Clone, PartialEq, Eq, Hash, Debug, Encode, Decode, BorshSerialize, BorshDeserialize)]
#[derive(Clone, PartialEq, Eq, Hash, Debug, BorshSerialize, BorshDeserialize)]
pub(crate) struct OutputId([u8; 36]);
impl Default for OutputId {
fn default() -> Self {
@@ -139,7 +142,7 @@ impl ReceivedOutput<<Secp256k1 as Ciphersuite>::G, Address> for Output {
fn write<W: io::Write>(&self, writer: &mut W) -> io::Result<()> {
self.kind.write(writer)?;
let presumed_origin: Option<ExternalAddress> = self.presumed_origin.clone().map(Into::into);
writer.write_all(&presumed_origin.encode())?;
presumed_origin.serialize(writer)?;
self.output.write(writer)?;
writer.write_all(&u16::try_from(self.data.len()).unwrap().to_le_bytes())?;
writer.write_all(&self.data)
@@ -149,7 +152,7 @@ impl ReceivedOutput<<Secp256k1 as Ciphersuite>::G, Address> for Output {
Ok(Output {
kind: OutputType::read(reader)?,
presumed_origin: {
Option::<ExternalAddress>::decode(&mut IoReader(&mut reader))
Option::<ExternalAddress>::deserialize_reader(&mut reader)
.map_err(|e| io::Error::other(format!("couldn't decode ExternalAddress: {e:?}")))?
.map(|address| {
Address::try_from(address)

View File

@@ -2,7 +2,7 @@ use core::future::Future;
use bitcoin_serai::rpc::{RpcError, Rpc as BRpc};
use serai_client::primitives::{ExternalNetworkId, ExternalCoin, Amount};
use serai_client::primitives::{network_id::ExternalNetworkId, coin::ExternalCoin, balance::Amount};
use serai_db::Db;
use scanner::ScannerFeed;

View File

@@ -9,7 +9,7 @@ use bitcoin_serai::{
};
use serai_client::{
primitives::{ExternalCoin, Amount},
primitives::{coin::ExternalCoin, balance::Amount},
networks::bitcoin::Address,
};

View File

@@ -21,7 +21,6 @@ rand_core = { version = "0.6", default-features = false }
const-hex = { version = "1", default-features = false, features = ["std"] }
hex = { version = "0.4", default-features = false, features = ["std"] }
scale = { package = "parity-scale-codec", version = "3", default-features = false, features = ["std"] }
borsh = { version = "1", default-features = false, features = ["std", "derive", "de_strict_order"] }
ciphersuite = { path = "../../crypto/ciphersuite", default-features = false, features = ["std"] }

View File

@@ -41,7 +41,6 @@ ethereum-primitives = { package = "serai-processor-ethereum-primitives", path =
ethereum-deployer = { package = "serai-processor-ethereum-deployer", path = "../deployer", default-features = false }
erc20 = { package = "serai-processor-ethereum-erc20", path = "../erc20", default-features = false }
scale = { package = "parity-scale-codec", version = "3", default-features = false, features = ["std"] }
serai-client = { path = "../../../substrate/client", default-features = false, features = ["ethereum"] }
futures-util = { version = "0.3", default-features = false, features = ["std"] }

View File

@@ -19,7 +19,7 @@ interface IRouterWithoutCollisions {
/// @param from The address which called `inInstruction` and caused this event to be emitted
/// @param coin The coin transferred in
/// @param amount The amount of the coin transferred in
/// @param instruction The Shorthand-encoded InInstruction for Serai to decode and handle
/// @param instruction The encoded `RefundableInInstruction` for Serai to decode and handle
event InInstruction(
address indexed from, address indexed coin, uint256 amount, bytes instruction
);
@@ -81,8 +81,8 @@ interface IRouterWithoutCollisions {
/// @param coin The coin to transfer in (address(0) if Ether)
/// @param amount The amount to transfer in (msg.value if Ether)
/**
* @param instruction The Shorthand-encoded InInstruction for Serai to associate with this
* transfer in
* @param instruction The encoded `RefundableInInstruction` for Serai to associate with this
* transfer in
*/
// Re-entrancy doesn't bork this function
// slither-disable-next-line reentrancy-events

View File

@@ -293,7 +293,7 @@ contract Router is IRouterWithoutCollisions {
/// @param coin The coin to transfer in (address(0) if Ether)
/// @param amount The amount to transfer in (msg.value if Ether)
/**
* @param instruction The Shorthand-encoded InInstruction for Serai to associate with this
* @param instruction The encoded `RefundableInInstruction` for Serai to associate with this
* transfer in
*/
// This function doesn't require nonReentrant as re-entrancy isn't an issue with this function

View File

@@ -21,9 +21,8 @@ use alloy_rpc_types_eth::{BlockId, Log, Filter, TransactionInput, TransactionReq
use alloy_transport::{TransportErrorKind, RpcError};
use alloy_provider::{Provider, RootProvider};
use scale::Encode;
use serai_client::{
in_instructions::primitives::Shorthand, networks::ethereum::Address as SeraiAddress,
primitives::instructions::RefundableInInstruction, networks::ethereum::Address as SeraiAddress,
};
use ethereum_primitives::LogIndex;
@@ -351,20 +350,29 @@ impl Router {
}
}
/// Construct a transaction to send coins with an InInstruction to Serai.
/// Construct a transaction to send coins with an `InInstruction` to Serai.
///
/// If coin is an ERC20, this will not create a transaction calling the Router but will create a
/// top-level transfer of the ERC20 to the Router. This avoids needing to call `approve` before
/// publishing the transaction calling the Router.
///
/// The gas limit and gas price are not set and are left to the caller.
pub fn in_instruction(&self, coin: Coin, amount: U256, in_instruction: &Shorthand) -> TxLegacy {
pub fn in_instruction(
&self,
coin: Coin,
amount: U256,
in_instruction: &RefundableInInstruction,
) -> TxLegacy {
match coin {
Coin::Ether => TxLegacy {
to: self.address.into(),
input: abi::inInstructionCall::new((coin.into(), amount, in_instruction.encode().into()))
.abi_encode()
.into(),
input: abi::inInstructionCall::new((
coin.into(),
amount,
borsh::to_vec(&in_instruction).unwrap().into(),
))
.abi_encode()
.into(),
value: amount,
..Default::default()
},
@@ -373,7 +381,7 @@ impl Router {
input: erc20::transferWithInInstructionCall::new((
self.address,
amount,
in_instruction.encode().into(),
borsh::to_vec(&in_instruction).unwrap().into(),
))
.abi_encode()
.into(),

View File

@@ -5,12 +5,9 @@ use alloy_sol_types::SolCall;
use alloy_consensus::{TxLegacy, Signed};
use scale::Encode;
use serai_client::{
primitives::SeraiAddress,
in_instructions::primitives::{
InInstruction as SeraiInInstruction, RefundableInInstruction, Shorthand,
},
primitives::instructions::{InInstruction as SeraiInInstruction, RefundableInInstruction},
};
use ethereum_primitives::LogIndex;
@@ -18,14 +15,14 @@ use ethereum_primitives::LogIndex;
use crate::{InInstruction, tests::*};
impl Test {
pub(crate) fn in_instruction() -> Shorthand {
Shorthand::Raw(RefundableInInstruction {
pub(crate) fn in_instruction() -> RefundableInInstruction {
RefundableInInstruction {
origin: None,
instruction: SeraiInInstruction::Transfer(SeraiAddress([0xff; 32])),
})
}
}
pub(crate) fn eth_in_instruction_tx(&self) -> (Coin, U256, Shorthand, TxLegacy) {
pub(crate) fn eth_in_instruction_tx(&self) -> (Coin, U256, RefundableInInstruction, TxLegacy) {
let coin = Coin::Ether;
let amount = U256::from(1);
let shorthand = Self::in_instruction();
@@ -42,7 +39,7 @@ impl Test {
tx: Signed<TxLegacy>,
coin: Coin,
amount: U256,
shorthand: &Shorthand,
shorthand: &RefundableInInstruction,
) {
let receipt = ethereum_test_primitives::publish_tx(&self.provider, tx.clone()).await;
assert!(receipt.status());
@@ -81,7 +78,7 @@ impl Test {
from: tx.recover_signer().unwrap(),
coin,
amount,
data: shorthand.encode(),
data: borsh::to_vec(&shorthand).unwrap(),
}
);
}
@@ -140,9 +137,13 @@ async fn test_erc20_router_in_instruction() {
gas_limit: 1_000_000,
to: test.router.address().into(),
value: U256::ZERO,
input: crate::abi::inInstructionCall::new((coin.into(), amount, shorthand.encode().into()))
.abi_encode()
.into(),
input: crate::abi::inInstructionCall::new((
coin.into(),
amount,
borsh::to_vec(shorthand).unwrap().into(),
))
.abi_encode()
.into(),
};
// If no `approve` was granted, this should fail

View File

@@ -14,7 +14,7 @@ use alloy_simple_request_transport::SimpleRequest;
use alloy_rpc_client::ClientBuilder;
use alloy_provider::{Provider, RootProvider};
use serai_client::validator_sets::primitives::Session;
use serai_client::primitives::validator_sets::Session;
use serai_env as env;
use serai_db::{Get, DbTxn, create_db};

View File

@@ -1,6 +1,6 @@
use alloy_core::primitives::{FixedBytes, Address};
use serai_client::primitives::Amount;
use serai_client::primitives::balance::Amount;
pub(crate) mod output;
pub(crate) mod transaction;

View File

@@ -5,11 +5,14 @@ use ciphersuite_kp256::Secp256k1;
use alloy_core::primitives::U256;
use scale::{Encode, Decode};
use borsh::{BorshSerialize, BorshDeserialize};
use serai_client::{
primitives::{ExternalNetworkId, ExternalCoin, Amount, ExternalBalance},
primitives::{
network_id::ExternalNetworkId,
coin::ExternalCoin,
balance::{Amount, ExternalBalance},
},
networks::ethereum::Address,
};
@@ -39,9 +42,7 @@ fn amount_to_serai_amount(coin: ExternalCoin, amount: U256) -> Amount {
Amount(u64::try_from(amount / divisor).unwrap())
}
#[derive(
Clone, Copy, PartialEq, Eq, Hash, Debug, Encode, Decode, BorshSerialize, BorshDeserialize,
)]
#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, BorshSerialize, BorshDeserialize)]
pub(crate) struct OutputId(pub(crate) [u8; 40]);
impl Default for OutputId {
fn default() -> Self {

View File

@@ -6,7 +6,7 @@ use alloy_rpc_types_eth::{Header, BlockNumberOrTag};
use alloy_transport::{RpcError, TransportErrorKind};
use alloy_provider::{Provider, RootProvider};
use serai_client::primitives::{ExternalNetworkId, ExternalCoin, Amount};
use serai_client::primitives::{network_id::ExternalNetworkId, coin::ExternalCoin, balance::Amount};
use tokio::task::JoinSet;

View File

@@ -3,7 +3,7 @@ use std::collections::HashMap;
use alloy_core::primitives::U256;
use serai_client::{
primitives::{ExternalNetworkId, ExternalCoin, ExternalBalance},
primitives::{network_id::ExternalNetworkId, coin::ExternalCoin, balance::ExternalBalance},
networks::ethereum::Address,
};

View File

@@ -15,7 +15,7 @@ all-features = true
rustdoc-args = ["--cfg", "docsrs"]
[package.metadata.cargo-machete]
ignored = ["borsh", "scale"]
ignored = ["borsh"]
[lints]
workspace = true
@@ -29,7 +29,6 @@ serai-primitives = { path = "../../substrate/primitives", default-features = fal
log = { version = "0.4", default-features = false, features = ["std"] }
scale = { package = "parity-scale-codec", version = "3", default-features = false, features = ["std"] }
borsh = { version = "1", default-features = false, features = ["std", "derive", "de_strict_order"] }
serai-db = { path = "../../common/db" }

View File

@@ -7,7 +7,7 @@ use frost::{
sign::{Writable, PreprocessMachine, SignMachine, SignatureMachine},
};
use serai_validator_sets_primitives::Session;
use serai_primitives::validator_sets::Session;
use serai_db::{Get, DbTxn, Db, create_db};
use messages::sign::{VariantSignId, SignId, ProcessorMessage};

View File

@@ -6,7 +6,7 @@ use std::collections::HashMap;
use frost::{Participant, sign::PreprocessMachine};
use serai_validator_sets_primitives::Session;
use serai_primitives::validator_sets::Session;
use serai_db::{DbTxn, Db};
use messages::sign::{VariantSignId, ProcessorMessage, CoordinatorMessage};

View File

@@ -14,9 +14,6 @@ rust-version = "1.89"
all-features = true
rustdoc-args = ["--cfg", "docsrs"]
[package.metadata.cargo-machete]
ignored = ["scale"]
[lints]
workspace = true
@@ -38,7 +35,6 @@ dkg = { package = "dkg-evrf", path = "../../crypto/dkg/evrf", default-features =
serai-primitives = { path = "../../substrate/primitives", default-features = false, features = ["std"] }
# Encoders
scale = { package = "parity-scale-codec", version = "3", default-features = false, features = ["std"] }
borsh = { version = "1", default-features = false, features = ["std", "derive", "de_strict_order"] }
# Application

View File

@@ -6,7 +6,7 @@ use zeroize::Zeroizing;
use ciphersuite::{group::GroupEncoding, Ciphersuite};
use dkg::*;
use serai_validator_sets_primitives::Session;
use serai_primitives::validator_sets::Session;
use borsh::{BorshSerialize, BorshDeserialize};
use serai_db::{Get, DbTxn};
@@ -36,7 +36,7 @@ pub(crate) struct Participations {
}
mod _db {
use serai_validator_sets_primitives::Session;
use serai_primitives::validator_sets::Session;
use serai_db::{Get, DbTxn, create_db};

View File

@@ -6,7 +6,7 @@ use std::{
use dkg::*;
use serai_validator_sets_primitives::MAX_KEY_SHARES_PER_SET;
use serai_primitives::constants::MAX_KEY_SHARES_PER_SET;
/// A cache of the generators used by the eVRF DKG.
///

View File

@@ -17,7 +17,7 @@ use ciphersuite::{
};
use dkg::*;
use serai_validator_sets_primitives::Session;
use serai_primitives::validator_sets::Session;
use messages::key_gen::*;
use serai_db::{Get, DbTxn};

View File

@@ -20,11 +20,10 @@ workspace = true
[dependencies]
hex = { version = "0.4", default-features = false, features = ["std"] }
scale = { package = "parity-scale-codec", version = "3", default-features = false, features = ["std"] }
borsh = { version = "1", default-features = false, features = ["std", "derive", "de_strict_order"] }
dkg = { path = "../../crypto/dkg", default-features = false, features = ["std", "borsh"] }
serai-primitives = { path = "../../substrate/primitives", default-features = false, features = ["std"] }
serai-cosign = { path = "../../coordinator/cosign", default-features = false }
serai-cosign = { package = "serai-cosign-types", path = "../../coordinator/cosign/types" }

View File

@@ -1,15 +1,16 @@
use core::fmt;
use std::collections::HashMap;
use scale::{Encode, Decode};
use borsh::{BorshSerialize, BorshDeserialize};
use dkg::Participant;
use serai_primitives::BlockHash;
use validator_sets_primitives::{Session, KeyPair, SlashReport};
use coins_primitives::OutInstructionWithBalance;
use in_instructions_primitives::SignedBatch;
use serai_primitives::{
BlockHash,
crypto::KeyPair,
validator_sets::{Session, SlashReport},
instructions::{SignedBatch, OutInstructionWithBalance},
};
use serai_cosign::{Cosign, SignedCosign};
@@ -87,7 +88,7 @@ pub mod key_gen {
pub mod sign {
use super::*;
#[derive(Clone, Copy, PartialEq, Eq, Hash, Encode, Decode, BorshSerialize, BorshDeserialize)]
#[derive(Clone, Copy, PartialEq, Eq, Hash, BorshSerialize, BorshDeserialize)]
pub enum VariantSignId {
Cosign(u64),
Batch([u8; 32]),
@@ -111,9 +112,7 @@ pub mod sign {
}
}
#[derive(
Clone, Copy, PartialEq, Eq, Hash, Debug, Encode, Decode, BorshSerialize, BorshDeserialize,
)]
#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, BorshSerialize, BorshDeserialize)]
pub struct SignId {
pub session: Session,
pub id: VariantSignId,
@@ -295,7 +294,7 @@ impl CoordinatorMessage {
let (sub, id) = match msg {
// Unique since we only have one attempt per session
key_gen::CoordinatorMessage::GenerateKey { session, .. } => {
(0, borsh::to_vec(session).unwrap())
(0, borsh::to_vec(&session).unwrap())
}
// Unique since one participation per participant per session
key_gen::CoordinatorMessage::Participation { session, participant, .. } => {
@@ -316,17 +315,19 @@ impl CoordinatorMessage {
};
let mut res = vec![COORDINATOR_UID, TYPE_SIGN_UID, sub];
res.extend(id.encode());
res.extend(borsh::to_vec(&id).unwrap());
res
}
CoordinatorMessage::Coordinator(msg) => {
let (sub, id) = match msg {
// We only cosign a block once, and Reattempt is a separate message
coordinator::CoordinatorMessage::CosignSubstrateBlock { cosign, .. } => {
(0, cosign.block_number.encode())
(0, borsh::to_vec(&cosign.block_number).unwrap())
}
// We only sign one slash report, and Reattempt is a separate message
coordinator::CoordinatorMessage::SignSlashReport { session, .. } => (1, session.encode()),
coordinator::CoordinatorMessage::SignSlashReport { session, .. } => {
(1, borsh::to_vec(&session).unwrap())
}
};
let mut res = vec![COORDINATOR_UID, TYPE_COORDINATOR_UID, sub];
@@ -335,10 +336,14 @@ impl CoordinatorMessage {
}
CoordinatorMessage::Substrate(msg) => {
let (sub, id) = match msg {
substrate::CoordinatorMessage::SetKeys { session, .. } => (0, session.encode()),
substrate::CoordinatorMessage::SlashesReported { session } => (1, session.encode()),
substrate::CoordinatorMessage::SetKeys { session, .. } => {
(0, borsh::to_vec(&session).unwrap())
}
substrate::CoordinatorMessage::SlashesReported { session } => {
(1, borsh::to_vec(&session).unwrap())
}
substrate::CoordinatorMessage::Block { serai_block_number, .. } => {
(2, serai_block_number.encode())
(2, borsh::to_vec(&serai_block_number).unwrap())
}
};
@@ -363,10 +368,10 @@ impl ProcessorMessage {
let (sub, id) = match msg {
// Unique since we only have one participation per session (due to no re-attempts)
key_gen::ProcessorMessage::Participation { session, .. } => {
(0, borsh::to_vec(session).unwrap())
(0, borsh::to_vec(&session).unwrap())
}
key_gen::ProcessorMessage::GeneratedKeyPair { session, .. } => {
(1, borsh::to_vec(session).unwrap())
(1, borsh::to_vec(&session).unwrap())
}
// Unique since we only blame a participant once (as this is fatal)
key_gen::ProcessorMessage::Blame { session, participant } => {
@@ -382,11 +387,11 @@ impl ProcessorMessage {
let (sub, id) = match msg {
// Unique since we'll only fatally slash a a participant once
sign::ProcessorMessage::InvalidParticipant { session, participant } => {
(0, (session, u16::from(*participant)).encode())
(0, borsh::to_vec(&(session, u16::from(*participant))).unwrap())
}
// Unique since SignId
sign::ProcessorMessage::Preprocesses { id, .. } => (1, id.encode()),
sign::ProcessorMessage::Shares { id, .. } => (2, id.encode()),
sign::ProcessorMessage::Preprocesses { id, .. } => (1, borsh::to_vec(&id).unwrap()),
sign::ProcessorMessage::Shares { id, .. } => (2, borsh::to_vec(&id).unwrap()),
};
let mut res = vec![PROCESSOR_UID, TYPE_SIGN_UID, sub];
@@ -396,10 +401,14 @@ impl ProcessorMessage {
ProcessorMessage::Coordinator(msg) => {
let (sub, id) = match msg {
coordinator::ProcessorMessage::CosignedBlock { cosign } => {
(0, cosign.cosign.block_hash.encode())
(0, borsh::to_vec(&cosign.cosign.block_hash).unwrap())
}
coordinator::ProcessorMessage::SignedBatch { batch, .. } => {
(1, borsh::to_vec(&batch.batch.id()).unwrap())
}
coordinator::ProcessorMessage::SignedSlashReport { session, .. } => {
(2, borsh::to_vec(&session).unwrap())
}
coordinator::ProcessorMessage::SignedBatch { batch, .. } => (1, batch.batch.id.encode()),
coordinator::ProcessorMessage::SignedSlashReport { session, .. } => (2, session.encode()),
};
let mut res = vec![PROCESSOR_UID, TYPE_COORDINATOR_UID, sub];
@@ -408,7 +417,9 @@ impl ProcessorMessage {
}
ProcessorMessage::Substrate(msg) => {
let (sub, id) = match msg {
substrate::ProcessorMessage::SubstrateBlockAck { block, .. } => (0, block.encode()),
substrate::ProcessorMessage::SubstrateBlockAck { block, .. } => {
(0, borsh::to_vec(&block).unwrap())
}
};
let mut res = vec![PROCESSOR_UID, TYPE_SUBSTRATE_UID, sub];

View File

@@ -21,7 +21,6 @@ rand_core = { version = "0.6", default-features = false }
rand_chacha = { version = "0.3", default-features = false, features = ["std"] }
zeroize = { version = "1", default-features = false, features = ["std"] }
scale = { package = "parity-scale-codec", version = "3", default-features = false, features = ["std"] }
borsh = { version = "1", default-features = false, features = ["std", "derive", "de_strict_order"] }
ciphersuite = { path = "../../crypto/ciphersuite", default-features = false, features = ["std"] }

View File

@@ -5,11 +5,13 @@ use dalek_ff_group::Ed25519;
use monero_wallet::WalletOutput;
use scale::{Encode, Decode};
use borsh::{BorshSerialize, BorshDeserialize};
use serai_client::{
primitives::{ExternalCoin, Amount, ExternalBalance},
primitives::{
coin::ExternalCoin,
balance::{Amount, ExternalBalance},
},
networks::monero::Address,
};
@@ -17,10 +19,7 @@ use primitives::{OutputType, ReceivedOutput};
use crate::{EXTERNAL_SUBADDRESS, BRANCH_SUBADDRESS, CHANGE_SUBADDRESS, FORWARDED_SUBADDRESS};
#[rustfmt::skip]
#[derive(
Clone, Copy, PartialEq, Eq, Default, Hash, Debug, Encode, Decode, BorshSerialize, BorshDeserialize,
)]
#[derive(Clone, Copy, PartialEq, Eq, Default, Hash, Debug, BorshSerialize, BorshDeserialize)]
pub(crate) struct OutputId(pub(crate) [u8; 32]);
impl AsRef<[u8]> for OutputId {
fn as_ref(&self) -> &[u8] {

View File

@@ -3,7 +3,7 @@ use core::future::Future;
use monero_wallet::rpc::{RpcError, Rpc as RpcTrait};
use monero_simple_request_rpc::SimpleRequestRpc;
use serai_client::primitives::{ExternalNetworkId, ExternalCoin, Amount};
use serai_client::primitives::{network_id::ExternalNetworkId, coin::ExternalCoin, balance::Amount};
use scanner::ScannerFeed;
use signers::TransactionPublisher;

View File

@@ -10,7 +10,7 @@ use dalek_ff_group::Ed25519;
use monero_wallet::rpc::{FeeRate, RpcError};
use serai_client::{
primitives::{ExternalCoin, Amount},
primitives::{coin::ExternalCoin, balance::Amount},
networks::monero::Address,
};

View File

@@ -22,7 +22,6 @@ group = { version = "0.13", default-features = false }
serai-primitives = { path = "../../substrate/primitives", default-features = false, features = ["std"] }
scale = { package = "parity-scale-codec", version = "3", default-features = false, features = ["std"] }
borsh = { version = "1", default-features = false, features = ["std", "derive", "de_strict_order"] }
log = { version = "0.4", default-features = false, features = ["std"] }

View File

@@ -6,7 +6,6 @@ use core::{hash::Hash, fmt::Debug};
use group::GroupEncoding;
use scale::{Encode, Decode};
use borsh::{BorshSerialize, BorshDeserialize};
/// A module for task-related structs and functionality.
@@ -40,8 +39,6 @@ pub trait Id:
+ AsRef<[u8]>
+ AsMut<[u8]>
+ Debug
+ Encode
+ Decode
+ BorshSerialize
+ BorshDeserialize
{
@@ -57,22 +54,15 @@ impl<
+ AsRef<[u8]>
+ AsMut<[u8]>
+ Debug
+ Encode
+ Decode
+ BorshSerialize
+ BorshDeserialize,
> Id for I
{
}
/// A wrapper for a group element which implements the scale/borsh traits.
/// A wrapper for a group element which implements the `borsh` traits.
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
pub struct EncodableG<G: GroupEncoding>(pub G);
impl<G: GroupEncoding> Encode for EncodableG<G> {
fn using_encoded<R, F: FnOnce(&[u8]) -> R>(&self, f: F) -> R {
f(self.0.to_bytes().as_ref())
}
}
impl<G: GroupEncoding> BorshSerialize for EncodableG<G> {
fn serialize<W: borsh::io::Write>(&self, writer: &mut W) -> borsh::io::Result<()> {
writer.write_all(self.0.to_bytes().as_ref())

View File

@@ -5,7 +5,7 @@ use group::GroupEncoding;
use borsh::{BorshSerialize, BorshDeserialize};
use serai_primitives::{ExternalAddress, ExternalBalance};
use serai_primitives::{address::ExternalAddress, balance::ExternalBalance};
use crate::Id;

View File

@@ -1,10 +1,11 @@
use std::io;
use scale::{Encode, Decode, IoReader};
use borsh::{BorshSerialize, BorshDeserialize};
use serai_primitives::ExternalBalance;
use serai_coins_primitives::OutInstructionWithBalance;
use serai_primitives::{
balance::ExternalBalance,
instructions::{OutInstruction, OutInstructionWithBalance},
};
use crate::Address;
@@ -18,9 +19,11 @@ pub struct Payment<A: Address> {
impl<A: Address> TryFrom<OutInstructionWithBalance> for Payment<A> {
type Error = ();
fn try_from(out_instruction_with_balance: OutInstructionWithBalance) -> Result<Self, ()> {
Ok(Payment {
address: out_instruction_with_balance.instruction.address.try_into().map_err(|_| ())?,
balance: out_instruction_with_balance.balance,
Ok(match out_instruction_with_balance.instruction {
OutInstruction::Transfer(address) => Payment {
address: address.try_into().map_err(|_| ())?,
balance: out_instruction_with_balance.balance,
},
})
}
}
@@ -43,14 +46,12 @@ impl<A: Address> Payment<A> {
/// Read a Payment.
pub fn read(reader: &mut impl io::Read) -> io::Result<Self> {
let address = A::deserialize_reader(reader)?;
let reader = &mut IoReader(reader);
let balance = ExternalBalance::decode(reader).map_err(io::Error::other)?;
let balance = ExternalBalance::deserialize_reader(reader).map_err(io::Error::other)?;
Ok(Self { address, balance })
}
/// Write the Payment.
pub fn write(&self, writer: &mut impl io::Write) -> io::Result<()> {
self.address.serialize(writer)?;
self.balance.encode_to(writer);
Ok(())
self.balance.serialize(writer)
}
}

View File

@@ -20,7 +20,6 @@ workspace = true
[dependencies]
# Encoders
hex = { version = "0.4", default-features = false, features = ["std"] }
scale = { package = "parity-scale-codec", version = "3", default-features = false, features = ["std"] }
borsh = { version = "1", default-features = false, features = ["std", "derive", "de_strict_order"] }
# Cryptography

View File

@@ -3,12 +3,10 @@ use std::io::{Read, Write};
use group::GroupEncoding;
use scale::{Encode, Decode, IoReader};
use borsh::{BorshSerialize, BorshDeserialize};
use serai_db::{Get, DbTxn, create_db};
use serai_primitives::ExternalBalance;
use serai_validator_sets_primitives::Session;
use serai_primitives::{balance::ExternalBalance, validator_sets::Session};
use primitives::EncodableG;
use crate::{ScannerFeed, KeyFor, AddressFor};
@@ -94,7 +92,7 @@ impl<S: ScannerFeed> BatchDb<S> {
if let Some(ReturnInformation { address, balance }) = return_information {
buf.write_all(&[1]).unwrap();
address.serialize(&mut buf).unwrap();
balance.encode_to(&mut buf);
balance.serialize(&mut buf).unwrap();
} else {
buf.write_all(&[0]).unwrap();
}
@@ -116,7 +114,7 @@ impl<S: ScannerFeed> BatchDb<S> {
res.push((opt[0] == 1).then(|| {
let address = AddressFor::<S>::deserialize_reader(&mut buf).unwrap();
let balance = ExternalBalance::decode(&mut IoReader(&mut buf)).unwrap();
let balance = ExternalBalance::deserialize_reader(&mut buf).unwrap();
ReturnInformation { address, balance }
}));
}

View File

@@ -2,11 +2,9 @@ use core::{marker::PhantomData, future::Future};
use blake2::{digest::typenum::U32, Digest, Blake2b};
use scale::Encode;
use serai_db::{DbTxn, Db};
use serai_primitives::BlockHash;
use serai_in_instructions_primitives::{MAX_BATCH_SIZE, Batch};
use serai_primitives::{BlockHash, instructions::Batch};
use primitives::{
EncodableG,
@@ -111,12 +109,7 @@ impl<D: Db, S: ScannerFeed> ContinuallyRan for BatchTask<D, S> {
let mut batch_id = BatchDb::<S>::acquire_batch_id(&mut txn);
// start with empty batch
let mut batches = vec![Batch {
network,
id: batch_id,
external_network_block_hash,
instructions: vec![],
}];
let mut batches = vec![Batch::new(network, batch_id, external_network_block_hash)];
// We also track the return information for the InInstructions within a Batch in case
// they error
let mut return_information = vec![vec![]];
@@ -125,23 +118,19 @@ impl<D: Db, S: ScannerFeed> ContinuallyRan for BatchTask<D, S> {
let balance = in_instruction.balance;
let batch = batches.last_mut().unwrap();
batch.instructions.push(in_instruction);
// check if batch is over-size
if batch.encode().len() > MAX_BATCH_SIZE {
// pop the last instruction so it's back in size
let in_instruction = batch.instructions.pop().unwrap();
if batch.push_instruction(in_instruction.clone()).is_err() {
// bump the id for the new batch
batch_id = BatchDb::<S>::acquire_batch_id(&mut txn);
// make a new batch with this instruction included
batches.push(Batch {
network,
id: batch_id,
external_network_block_hash,
instructions: vec![in_instruction],
});
let mut batch = Batch::new(network, batch_id, external_network_block_hash);
batch
.push_instruction(in_instruction)
.expect("single InInstruction exceeded Batch size limit");
batches.push(batch);
// Since we're allocating a new batch, allocate a new set of return addresses for it
return_information.push(vec![]);
}
@@ -157,16 +146,16 @@ impl<D: Db, S: ScannerFeed> ContinuallyRan for BatchTask<D, S> {
// Now that we've finalized the Batches, save the information for each to the database
assert_eq!(batches.len(), return_information.len());
for (batch, return_information) in batches.iter().zip(&return_information) {
assert_eq!(batch.instructions.len(), return_information.len());
assert_eq!(batch.instructions().len(), return_information.len());
BatchDb::<S>::save_batch_info(
&mut txn,
batch.id,
batch.id(),
block_number,
session_to_sign_batch,
external_key_for_session_to_sign_batch,
Blake2b::<U32>::digest(batch.instructions.encode()).into(),
Blake2b::<U32>::digest(borsh::to_vec(&batch.instructions()).unwrap()).into(),
);
BatchDb::<S>::save_return_information(&mut txn, batch.id, return_information);
BatchDb::<S>::save_return_information(&mut txn, batch.id(), return_information);
}
for batch in batches {

View File

@@ -3,13 +3,13 @@ use std::io::{self, Read, Write};
use group::GroupEncoding;
use scale::{Encode, Decode, IoReader};
use borsh::{BorshSerialize, BorshDeserialize};
use serai_db::{Get, DbTxn, create_db, db_channel};
use serai_coins_primitives::OutInstructionWithBalance;
use serai_validator_sets_primitives::Session;
use serai_in_instructions_primitives::{InInstructionWithBalance, Batch};
use serai_primitives::{
validator_sets::Session,
instructions::{InInstructionWithBalance, Batch, OutInstructionWithBalance},
};
use primitives::{EncodableG, ReceivedOutput};
@@ -56,7 +56,7 @@ impl<S: ScannerFeed> OutputWithInInstruction<S> {
(opt[0] == 1).then(|| AddressFor::<S>::deserialize_reader(reader)).transpose()?
};
let in_instruction =
InInstructionWithBalance::decode(&mut IoReader(reader)).map_err(io::Error::other)?;
InInstructionWithBalance::deserialize_reader(reader).map_err(io::Error::other)?;
Ok(Self { output, return_address, in_instruction })
}
pub(crate) fn write(&self, writer: &mut impl io::Write) -> io::Result<()> {
@@ -67,7 +67,7 @@ impl<S: ScannerFeed> OutputWithInInstruction<S> {
} else {
writer.write_all(&[0])?;
}
self.in_instruction.encode_to(writer);
self.in_instruction.serialize(writer)?;
Ok(())
}
}
@@ -76,10 +76,10 @@ create_db!(
ScannerGlobal {
StartBlock: () -> u64,
QueuedKey: <K: Encode>(key: K) -> (),
QueuedKey: <K: BorshSerialize>(key: K) -> (),
ActiveKeys: <K: Borshy>() -> Vec<SeraiKeyDbEntry<K>>,
RetireAt: <K: Encode>(key: K) -> u64,
RetireAt: <K: BorshSerialize>(key: K) -> u64,
// Highest acknowledged block
HighestAcknowledgedBlock: () -> u64,
@@ -294,7 +294,7 @@ impl<S: ScannerFeed> ScannerGlobalDb<S> {
assert!((opt[0] == 0) || (opt[0] == 1));
let address = (opt[0] == 1).then(|| AddressFor::<S>::deserialize_reader(&mut buf).unwrap());
Some((address, InInstructionWithBalance::decode(&mut IoReader(buf)).unwrap()))
Some((address, InInstructionWithBalance::deserialize_reader(&mut buf).unwrap()))
}
}
@@ -357,7 +357,7 @@ impl<S: ScannerFeed> ScanToEventualityDb<S> {
} else {
buf.write_all(&[0]).unwrap();
}
forward.in_instruction.encode_to(&mut buf);
forward.in_instruction.serialize(&mut buf).unwrap();
SerializedForwardedOutput::set(txn, forward.output.id().as_ref(), &buf);
}
@@ -454,7 +454,7 @@ impl<S: ScannerFeed> Returnable<S> {
(opt[0] == 1).then(|| AddressFor::<S>::deserialize_reader(reader)).transpose()?;
let in_instruction =
InInstructionWithBalance::decode(&mut IoReader(reader)).map_err(io::Error::other)?;
InInstructionWithBalance::deserialize_reader(reader).map_err(io::Error::other)?;
Ok(Returnable { return_address, in_instruction })
}
fn write(&self, writer: &mut impl io::Write) -> io::Result<()> {
@@ -464,7 +464,7 @@ impl<S: ScannerFeed> Returnable<S> {
} else {
writer.write_all(&[0])?;
}
self.in_instruction.encode_to(writer);
self.in_instruction.serialize(writer)?;
Ok(())
}
}
@@ -494,7 +494,7 @@ impl<S: ScannerFeed> ScanToBatchDb<S> {
block_number: u64,
data: &InInstructionData<S>,
) {
let mut buf = data.session_to_sign_batch.encode();
let mut buf = borsh::to_vec(&data.session_to_sign_batch).unwrap();
buf.extend(data.external_key_for_session_to_sign_batch.to_bytes().as_ref());
for returnable_in_instruction in &data.returnable_in_instructions {
returnable_in_instruction.write(&mut buf).unwrap();
@@ -517,7 +517,7 @@ impl<S: ScannerFeed> ScanToBatchDb<S> {
);
let mut buf = data.returnable_in_instructions.as_slice();
let session_to_sign_batch = Session::decode(&mut buf).unwrap();
let session_to_sign_batch = Session::deserialize_reader(&mut buf).unwrap();
let external_key_for_session_to_sign_batch = {
let mut external_key_for_session_to_sign_batch =
<KeyFor<S> as GroupEncoding>::Repr::default();
@@ -595,7 +595,7 @@ impl SubstrateToEventualityDb {
}
mod _public_db {
use serai_in_instructions_primitives::Batch;
use serai_primitives::instructions::Batch;
use serai_db::{Get, DbTxn, create_db, db_channel};

View File

@@ -1,6 +1,7 @@
use core::marker::PhantomData;
use scale::Encode;
use borsh::BorshSerialize;
use serai_db::{Get, DbTxn, create_db};
use primitives::{EncodableG, ReceivedOutput, Eventuality, EventualityTracker};
@@ -14,7 +15,7 @@ create_db!(
// The latest block this task has handled which was notable
LatestHandledNotableBlock: () -> u64,
SerializedEventualities: <K: Encode>(key: K) -> Vec<u8>,
SerializedEventualities: <K: BorshSerialize>(key: K) -> Vec<u8>,
AccumulatedOutput: (id: &[u8]) -> (),
}

View File

@@ -10,8 +10,10 @@ use group::GroupEncoding;
use borsh::{BorshSerialize, BorshDeserialize};
use serai_db::{Get, DbTxn, Db};
use serai_primitives::{ExternalNetworkId, ExternalCoin, Amount};
use serai_coins_primitives::OutInstructionWithBalance;
use serai_primitives::{
network_id::ExternalNetworkId, coin::ExternalCoin, balance::Amount,
instructions::OutInstructionWithBalance,
};
use messages::substrate::ExecutedBatch;
use primitives::{task::*, Address, ReceivedOutput, Block, Payment};

View File

@@ -1,6 +1,6 @@
use serai_db::{Get, DbTxn, create_db};
use serai_validator_sets_primitives::Session;
use serai_primitives::validator_sets::Session;
create_db!(
ScannerBatch {

View File

@@ -2,7 +2,7 @@ use core::{marker::PhantomData, future::Future};
use serai_db::{DbTxn, Db};
use serai_validator_sets_primitives::Session;
use serai_primitives::validator_sets::Session;
use primitives::task::{DoesNotError, ContinuallyRan};
use crate::{
@@ -70,12 +70,12 @@ impl<D: Db, S: ScannerFeed> ContinuallyRan for ReportTask<D, S> {
// Because this boolean was expanded, we lose short-circuiting. That's fine
let handover_batch = last_session != session_to_sign_batch;
let batch_after_handover_batch =
(last_session == session_to_sign_batch) && ((first_batch + 1) == batch.id);
(last_session == session_to_sign_batch) && ((first_batch + 1) == batch.id());
if handover_batch || batch_after_handover_batch {
let verified_prior_batch = substrate::last_acknowledged_batch::<S>(&txn)
// Since `batch.id = 0` in the Session(0)-never-published-a-Batch case, we don't
// check `last_acknowledged_batch >= (batch.id - 1)` but instead this
.map(|last_acknowledged_batch| (last_acknowledged_batch + 1) >= batch.id)
// Since `batch.id() = 0` in the Session(0)-never-published-a-Batch case, we don't
// check `last_acknowledged_batch >= (batch.id() - 1)` but instead this
.map(|last_acknowledged_batch| (last_acknowledged_batch + 1) >= batch.id())
// We've never verified any Batches
.unwrap_or(false);
if !verified_prior_batch {
@@ -90,7 +90,7 @@ impl<D: Db, S: ScannerFeed> ContinuallyRan for ReportTask<D, S> {
BatchDb::set_last_session_to_sign_batch_and_first_batch(
&mut txn,
session_to_sign_batch,
batch.id,
batch.id(),
);
}
}

View File

@@ -1,12 +1,12 @@
use core::future::Future;
use std::collections::HashMap;
use scale::Decode;
use borsh::BorshDeserialize;
use serai_db::{Get, DbTxn, Db};
use serai_in_instructions_primitives::{
Shorthand, RefundableInInstruction, InInstruction, InInstructionWithBalance,
};
#[rustfmt::skip]
use serai_primitives::instructions::{RefundableInInstruction, InInstruction, InInstructionWithBalance};
use primitives::{task::ContinuallyRan, OutputType, ReceivedOutput, Block};
@@ -55,26 +55,22 @@ fn in_instruction_from_output<S: ScannerFeed>(
let presumed_origin = output.presumed_origin();
let mut data = output.data();
let shorthand = match Shorthand::decode(&mut data) {
Ok(shorthand) => shorthand,
Err(e) => {
log::info!("data in output {} wasn't valid shorthand: {e:?}", hex::encode(output.id()));
return (presumed_origin, None);
}
};
let instruction = match RefundableInInstruction::try_from(shorthand) {
let instruction = match RefundableInInstruction::deserialize_reader(&mut data) {
Ok(instruction) => instruction,
Err(e) => {
log::info!(
"shorthand in output {} wasn't convertible to a RefundableInInstruction: {e:?}",
hex::encode(output.id())
"data in output {} wasn't a valid `RefundableInInstruction`: {e:?}",
hex::encode(output.id()),
);
return (presumed_origin, None);
}
};
(
instruction.origin.and_then(|addr| AddressFor::<S>::try_from(addr).ok()).or(presumed_origin),
instruction
.return_address
.and_then(|addr| AddressFor::<S>::try_from(addr).ok())
.or(presumed_origin),
Some(instruction.instruction),
)
}

View File

@@ -5,7 +5,7 @@ use group::GroupEncoding;
use borsh::{BorshSerialize, BorshDeserialize};
use serai_db::{Get, DbTxn, create_db, db_channel};
use serai_coins_primitives::OutInstructionWithBalance;
use serai_primitives::instructions::OutInstructionWithBalance;
use messages::substrate::ExecutedBatch;

View File

@@ -2,7 +2,7 @@ use core::{marker::PhantomData, future::Future};
use serai_db::{Get, DbTxn, Db};
use serai_coins_primitives::{OutInstruction, OutInstructionWithBalance};
use serai_primitives::instructions::{OutInstruction, OutInstructionWithBalance};
use messages::substrate::ExecutedBatch;
use primitives::task::{DoesNotError, ContinuallyRan};
@@ -150,7 +150,7 @@ impl<D: Db, S: ScannerFeed> ContinuallyRan for SubstrateTask<D, S> {
if let Some(batch::ReturnInformation { address, balance }) = return_information {
burns.push(OutInstructionWithBalance {
instruction: OutInstruction { address: address.into() },
instruction: OutInstruction::Transfer(address.into()),
balance,
});
}

View File

@@ -15,7 +15,7 @@ all-features = true
rustdoc-args = ["--cfg", "docsrs"]
[package.metadata.cargo-machete]
ignored = ["scale", "borsh"]
ignored = ["borsh"]
[lints]
workspace = true
@@ -24,7 +24,6 @@ workspace = true
ciphersuite = { path = "../../../crypto/ciphersuite", default-features = false, features = ["std"] }
frost = { package = "modular-frost", path = "../../../crypto/frost", default-features = false }
scale = { package = "parity-scale-codec", version = "3", default-features = false, features = ["std"] }
borsh = { version = "1", default-features = false, features = ["std", "derive", "de_strict_order"] }
serai-db = { path = "../../../common/db" }

View File

@@ -15,7 +15,7 @@ all-features = true
rustdoc-args = ["--cfg", "docsrs"]
[package.metadata.cargo-machete]
ignored = ["scale", "borsh"]
ignored = ["borsh"]
[lints]
workspace = true
@@ -23,7 +23,6 @@ workspace = true
[dependencies]
group = { version = "0.13", default-features = false }
scale = { package = "parity-scale-codec", version = "3", default-features = false, features = ["std"] }
borsh = { version = "1", default-features = false, features = ["std", "derive", "de_strict_order"] }
serai-db = { path = "../../../common/db" }

View File

@@ -4,7 +4,7 @@
use core::{fmt::Debug, future::Future};
use serai_primitives::Amount;
use serai_primitives::balance::Amount;
use primitives::{ReceivedOutput, Payment};
use scanner::{ScannerFeed, KeyFor, AddressFor, OutputFor, EventualityFor, BlockFor};

View File

@@ -1,6 +1,9 @@
use borsh::{BorshSerialize, BorshDeserialize};
use serai_primitives::{ExternalCoin, Amount, ExternalBalance};
use serai_primitives::{
coin::ExternalCoin,
balance::{Amount, ExternalBalance},
};
use primitives::{Address, Payment};
use scanner::ScannerFeed;

View File

@@ -15,7 +15,7 @@ all-features = true
rustdoc-args = ["--cfg", "docsrs"]
[package.metadata.cargo-machete]
ignored = ["scale", "borsh"]
ignored = ["borsh"]
[lints]
workspace = true
@@ -23,7 +23,6 @@ workspace = true
[dependencies]
group = { version = "0.13", default-features = false }
scale = { package = "parity-scale-codec", version = "3", default-features = false, features = ["std"] }
borsh = { version = "1", default-features = false, features = ["std", "derive", "de_strict_order"] }
serai-primitives = { path = "../../../../substrate/primitives", default-features = false, features = ["std"] }

View File

@@ -2,7 +2,10 @@ use core::marker::PhantomData;
use group::GroupEncoding;
use serai_primitives::{ExternalCoin, Amount, ExternalBalance};
use serai_primitives::{
coin::ExternalCoin,
balance::{Amount, ExternalBalance},
};
use borsh::BorshDeserialize;
use serai_db::{Get, DbTxn, create_db, db_channel};

View File

@@ -7,7 +7,10 @@ use std::collections::HashMap;
use group::GroupEncoding;
use serai_primitives::{ExternalCoin, Amount, ExternalBalance};
use serai_primitives::{
coin::ExternalCoin,
balance::{Amount, ExternalBalance},
};
use serai_db::DbTxn;

View File

@@ -15,7 +15,7 @@ all-features = true
rustdoc-args = ["--cfg", "docsrs"]
[package.metadata.cargo-machete]
ignored = ["scale", "borsh"]
ignored = ["borsh"]
[lints]
workspace = true
@@ -23,7 +23,6 @@ workspace = true
[dependencies]
group = { version = "0.13", default-features = false }
scale = { package = "parity-scale-codec", version = "3", default-features = false, features = ["std"] }
borsh = { version = "1", default-features = false, features = ["std", "derive", "de_strict_order"] }
serai-primitives = { path = "../../../../substrate/primitives", default-features = false, features = ["std"] }

View File

@@ -2,7 +2,7 @@ use core::marker::PhantomData;
use group::GroupEncoding;
use serai_primitives::{ExternalCoin, Amount};
use serai_primitives::{coin::ExternalCoin, balance::Amount};
use serai_db::{Get, DbTxn, create_db};

View File

@@ -7,7 +7,7 @@ use std::collections::HashMap;
use group::GroupEncoding;
use serai_primitives::{ExternalCoin, Amount};
use serai_primitives::{coin::ExternalCoin, balance::Amount};
use serai_db::DbTxn;

View File

@@ -30,7 +30,6 @@ dalek-ff-group = { path = "../../crypto/dalek-ff-group", default-features = fals
frost = { package = "modular-frost", path = "../../crypto/frost", default-features = false }
frost-schnorrkel = { path = "../../crypto/schnorrkel", default-features = false }
scale = { package = "parity-scale-codec", version = "3", default-features = false, features = ["std"] }
borsh = { version = "1", default-features = false, features = ["std", "derive", "de_strict_order"] }
serai-primitives = { path = "../../substrate/primitives", default-features = false, features = ["std"] }
@@ -39,7 +38,7 @@ serai-db = { path = "../../common/db" }
log = { version = "0.4", default-features = false, features = ["std"] }
tokio = { version = "1", default-features = false, features = ["rt-multi-thread", "sync", "time", "macros"] }
serai-cosign = { path = "../../coordinator/cosign" }
serai-cosign = { package = "serai-cosign-types", path = "../../coordinator/cosign/types" }
messages = { package = "serai-processor-messages", path = "../messages" }
primitives = { package = "serai-processor-primitives", path = "../primitives" }
scanner = { package = "serai-processor-scanner", path = "../scanner" }

View File

@@ -1,5 +1,7 @@
use serai_validator_sets_primitives::Session;
use serai_in_instructions_primitives::{Batch, SignedBatch};
use serai_primitives::{
validator_sets::Session,
instructions::{Batch, SignedBatch},
};
use serai_db::{Get, DbTxn, create_db};

View File

@@ -6,10 +6,7 @@ use ciphersuite::group::GroupEncoding;
use dalek_ff_group::Ristretto;
use frost::dkg::ThresholdKeys;
use scale::Encode;
use serai_validator_sets_primitives::Session;
use serai_in_instructions_primitives::{SignedBatch, batch_message};
use serai_primitives::{validator_sets::Session, instructions::SignedBatch};
use serai_db::{Get, DbTxn, Db};
@@ -74,7 +71,7 @@ impl<D: Db, E: GroupEncoding> BatchSignerTask<D, E> {
machines.push(WrappedSchnorrkelMachine::new(
keys.clone(),
b"substrate",
batch_message(&batch),
batch.publish_batch_message(),
));
}
attempt_manager.register(VariantSignId::Batch(id), machines);
@@ -100,14 +97,14 @@ impl<D: Db, E: Send + GroupEncoding> ContinuallyRan for BatchSignerTask<D, E> {
iterated = true;
// Save this to the database as a transaction to sign
let batch_hash = <[u8; 32]>::from(Blake2b::<U32>::digest(batch.encode()));
let batch_hash = <[u8; 32]>::from(Blake2b::<U32>::digest(borsh::to_vec(&batch).unwrap()));
self.active_signing_protocols.insert(batch_hash);
ActiveSigningProtocols::set(
&mut txn,
self.session,
&self.active_signing_protocols.iter().copied().collect(),
);
BatchHash::set(&mut txn, batch.id, &batch_hash);
BatchHash::set(&mut txn, batch.id(), &batch_hash);
Batches::set(&mut txn, batch_hash, &batch);
let mut machines = Vec::with_capacity(self.keys.len());
@@ -116,7 +113,7 @@ impl<D: Db, E: Send + GroupEncoding> ContinuallyRan for BatchSignerTask<D, E> {
machines.push(WrappedSchnorrkelMachine::new(
keys.clone(),
b"substrate",
batch_message(&batch),
batch.publish_batch_message(),
));
}
for msg in self.attempt_manager.register(VariantSignId::Batch(batch_hash), machines) {
@@ -160,8 +157,8 @@ impl<D: Db, E: Send + GroupEncoding> ContinuallyRan for BatchSignerTask<D, E> {
// Update the last acknowledged Batch
{
let last_acknowledged = LastAcknowledgedBatch::get(&txn);
if Some(batch.id) > last_acknowledged {
LastAcknowledgedBatch::set(&mut txn, &batch.id);
if Some(batch.id()) > last_acknowledged {
LastAcknowledgedBatch::set(&mut txn, &batch.id());
}
}
@@ -174,7 +171,7 @@ impl<D: Db, E: Send + GroupEncoding> ContinuallyRan for BatchSignerTask<D, E> {
);
// Clean up SignedBatches
SignedBatches::del(&mut txn, batch.id);
SignedBatches::del(&mut txn, batch.id());
// We retire with a txn so we either successfully flag this Batch as acknowledged, and
// won't re-register it (making this retire safe), or we don't flag it, meaning we will
@@ -203,7 +200,7 @@ impl<D: Db, E: Send + GroupEncoding> ContinuallyRan for BatchSignerTask<D, E> {
let batch =
Batches::get(&txn, id).expect("signed a Batch we didn't save to the database");
let signed_batch = SignedBatch { batch, signature: signature.into() };
SignedBatches::set(&mut txn, signed_batch.batch.id, &signed_batch);
SignedBatches::set(&mut txn, signed_batch.batch.id(), &signed_batch);
}
}

View File

@@ -1,6 +1,6 @@
use core::future::Future;
use serai_primitives::Signature;
use serai_primitives::crypto::Signature;
use serai_db::{DbTxn, Db};
@@ -140,7 +140,7 @@ impl<D: Db, C: Coordinator> ContinuallyRan for CoordinatorTask<D, C> {
let mut next_batch = last_batch.map(|id| id + 1).unwrap_or(0);
while let Some(batch) = crate::batch::signed_batch(&txn, next_batch) {
iterated = true;
db::LastPublishedBatch::set(&mut txn, &batch.batch.id);
db::LastPublishedBatch::set(&mut txn, &batch.batch.id());
self
.coordinator
.publish_signed_batch(batch)

View File

@@ -1,4 +1,4 @@
use serai_validator_sets_primitives::Session;
use serai_primitives::validator_sets::Session;
use serai_db::{Get, DbTxn, create_db};

View File

@@ -3,9 +3,7 @@ use core::future::Future;
use dalek_ff_group::Ristretto;
use frost::dkg::ThresholdKeys;
use scale::Encode;
use serai_primitives::Signature;
use serai_validator_sets_primitives::Session;
use serai_primitives::{crypto::Signature, validator_sets::Session};
use serai_db::{DbTxn, Db};
@@ -127,7 +125,7 @@ impl<D: Db> ContinuallyRan for CosignerTask<D> {
LatestCosigned::set(&mut txn, self.session, &cosign.block_number);
let cosign = SignedCosign {
cosign,
signature: Signature::from(signature).encode().try_into().unwrap(),
signature: borsh::to_vec(&Signature::from(signature)).unwrap().try_into().unwrap(),
};
// Send the cosign
Cosign::send(&mut txn, self.session, &cosign);

View File

@@ -1,4 +1,4 @@
use serai_validator_sets_primitives::{Session, SlashReport as SlashReportStruct};
use serai_primitives::validator_sets::{Session, SlashReport as SlashReportStruct};
use serai_db::{Get, DbTxn, create_db, db_channel};

View File

@@ -11,9 +11,11 @@ use ciphersuite::{group::GroupEncoding, Ciphersuite};
use dalek_ff_group::Ristretto;
use frost::dkg::ThresholdKeys;
use serai_primitives::Signature;
use serai_validator_sets_primitives::{Session, SlashReport};
use serai_in_instructions_primitives::SignedBatch;
use serai_primitives::{
crypto::Signature,
validator_sets::{Session, SlashReport},
instructions::SignedBatch,
};
use serai_db::{DbTxn, Db};

View File

@@ -3,8 +3,7 @@ use core::{marker::PhantomData, future::Future};
use dalek_ff_group::Ristretto;
use frost::dkg::ThresholdKeys;
use serai_primitives::Signature;
use serai_validator_sets_primitives::Session;
use serai_primitives::{crypto::Signature, validator_sets::Session};
use serai_db::{DbTxn, Db};

View File

@@ -1,4 +1,4 @@
use serai_validator_sets_primitives::Session;
use serai_primitives::validator_sets::Session;
use serai_db::{Get, DbTxn, create_db};

View File

@@ -6,7 +6,7 @@ use std::{
use frost::dkg::ThresholdKeys;
use serai_validator_sets_primitives::Session;
use serai_primitives::validator_sets::Session;
use serai_db::{DbTxn, Db};