merge: feat-lints into main
Some checks failed
ci/woodpecker/pr/server-audit Pipeline was successful
ci/woodpecker/pr/server-lint Pipeline failed
ci/woodpecker/pr/server-vet Pipeline failed
ci/woodpecker/pr/server-test Pipeline was successful
ci/woodpecker/push/server-audit Pipeline was successful
ci/woodpecker/push/server-lint Pipeline failed
ci/woodpecker/push/server-vet Pipeline failed
ci/woodpecker/push/server-test Pipeline was successful
ci/woodpecker/push/useragent-analyze Pipeline failed
Some checks failed
ci/woodpecker/pr/server-audit Pipeline was successful
ci/woodpecker/pr/server-lint Pipeline failed
ci/woodpecker/pr/server-vet Pipeline failed
ci/woodpecker/pr/server-test Pipeline was successful
ci/woodpecker/push/server-audit Pipeline was successful
ci/woodpecker/push/server-lint Pipeline failed
ci/woodpecker/push/server-vet Pipeline failed
ci/woodpecker/push/server-test Pipeline was successful
ci/woodpecker/push/useragent-analyze Pipeline failed
This commit was merged in pull request #87.
This commit is contained in:
@@ -1,17 +1,5 @@
|
||||
pub mod abi;
|
||||
pub mod safe_signer;
|
||||
|
||||
use alloy::{
|
||||
consensus::TxEip1559,
|
||||
primitives::{TxKind, U256},
|
||||
};
|
||||
use chrono::Utc;
|
||||
use diesel::{ExpressionMethods as _, QueryDsl as _, QueryResult, insert_into, sqlite::Sqlite};
|
||||
use diesel_async::{AsyncConnection, RunQueryDsl};
|
||||
use kameo::actor::ActorRef;
|
||||
|
||||
use crate::{
|
||||
actors::keyholder::KeyHolder,
|
||||
actors::vault::Vault,
|
||||
crypto::integrity,
|
||||
db::{
|
||||
self, DatabaseError,
|
||||
@@ -27,6 +15,18 @@ use crate::{
|
||||
},
|
||||
};
|
||||
|
||||
use alloy::{
|
||||
consensus::TxEip1559,
|
||||
primitives::{TxKind, U256},
|
||||
};
|
||||
use chrono::Utc;
|
||||
use diesel::{ExpressionMethods as _, QueryDsl as _, QueryResult, insert_into, sqlite::Sqlite};
|
||||
use diesel_async::{AsyncConnection, RunQueryDsl};
|
||||
use kameo::actor::ActorRef;
|
||||
|
||||
pub mod abi;
|
||||
pub mod safe_signer;
|
||||
|
||||
pub mod policies;
|
||||
mod utils;
|
||||
|
||||
@@ -41,7 +41,7 @@ pub enum PolicyError {
|
||||
NoMatchingGrant,
|
||||
|
||||
#[error("Integrity error: {0}")]
|
||||
Integrity(#[from] integrity::IntegrityError),
|
||||
Integrity(#[from] integrity::Error),
|
||||
}
|
||||
|
||||
#[derive(Debug, thiserror::Error)]
|
||||
@@ -69,7 +69,7 @@ pub enum ListError {
|
||||
Database(#[from] DatabaseError),
|
||||
|
||||
#[error("Integrity verification failed for grant")]
|
||||
Integrity(#[from] integrity::IntegrityError),
|
||||
Integrity(#[from] integrity::Error),
|
||||
}
|
||||
|
||||
/// Controls whether a transaction should be executed or only validated
|
||||
@@ -138,7 +138,7 @@ async fn check_shared_constraints(
|
||||
// Supporting only EIP-1559 transactions for now, but we can easily extend this to support legacy transactions if needed
|
||||
pub struct Engine {
|
||||
db: db::DatabasePool,
|
||||
keyholder: ActorRef<KeyHolder>,
|
||||
vault: ActorRef<Vault>,
|
||||
}
|
||||
|
||||
impl Engine {
|
||||
@@ -158,7 +158,7 @@ impl Engine {
|
||||
.map_err(DatabaseError::from)?
|
||||
.ok_or(PolicyError::NoMatchingGrant)?;
|
||||
|
||||
integrity::verify_entity(&mut conn, &self.keyholder, &grant.settings, grant.id).await?;
|
||||
integrity::verify_entity(&mut conn, &self.vault, &grant.settings, grant.id).await?;
|
||||
|
||||
let mut violations = check_shared_constraints(
|
||||
&context,
|
||||
@@ -207,8 +207,8 @@ impl Engine {
|
||||
}
|
||||
|
||||
impl Engine {
|
||||
pub const fn new(db: db::DatabasePool, keyholder: ActorRef<KeyHolder>) -> Self {
|
||||
Self { db, keyholder }
|
||||
pub const fn new(db: db::DatabasePool, vault: ActorRef<Vault>) -> Self {
|
||||
Self { db, vault }
|
||||
}
|
||||
|
||||
pub async fn create_grant<P: Policy>(
|
||||
@@ -219,7 +219,7 @@ impl Engine {
|
||||
P::Settings: Clone,
|
||||
{
|
||||
let mut conn = self.db.get().await?;
|
||||
let keyholder = self.keyholder.clone();
|
||||
let vault = self.vault.clone();
|
||||
|
||||
let id = conn
|
||||
.transaction(|conn| {
|
||||
@@ -264,7 +264,7 @@ impl Engine {
|
||||
|
||||
P::create_grant(&basic_grant, &full_grant.specific, conn).await?;
|
||||
|
||||
integrity::sign_entity(conn, &keyholder, &full_grant, basic_grant.id)
|
||||
integrity::sign_entity(conn, &vault, &full_grant, basic_grant.id)
|
||||
.await
|
||||
.map_err(|_| diesel::result::Error::RollbackTransaction)?;
|
||||
|
||||
@@ -289,7 +289,7 @@ impl Engine {
|
||||
|
||||
// Verify integrity of all grants before returning any results
|
||||
for grant in &all_grants {
|
||||
integrity::verify_entity(conn, &self.keyholder, &grant.settings, grant.id).await?;
|
||||
integrity::verify_entity(conn, &self.vault, &grant.settings, grant.id).await?;
|
||||
}
|
||||
|
||||
Ok(all_grants.into_iter().map(|g| Grant {
|
||||
|
||||
@@ -1,4 +1,8 @@
|
||||
use std::fmt::Display;
|
||||
use crate::{
|
||||
crypto::integrity::v1::Integrable,
|
||||
db::models::{EvmBasicGrant, EvmWalletAccess},
|
||||
evm::utils,
|
||||
};
|
||||
|
||||
use alloy::primitives::{Address, Bytes, ChainId, U256};
|
||||
use chrono::{DateTime, Duration, Utc};
|
||||
@@ -6,15 +10,9 @@ use diesel::{
|
||||
ExpressionMethods as _, QueryDsl, SelectableHelper, result::QueryResult, sqlite::Sqlite,
|
||||
};
|
||||
use diesel_async::{AsyncConnection, RunQueryDsl};
|
||||
|
||||
use std::fmt::Display;
|
||||
use thiserror::Error;
|
||||
|
||||
use crate::{
|
||||
crypto::integrity::v1::Integrable,
|
||||
db::models::{EvmBasicGrant, EvmWalletAccess},
|
||||
evm::utils,
|
||||
};
|
||||
|
||||
pub mod ether_transfer;
|
||||
pub mod token_transfers;
|
||||
|
||||
|
||||
@@ -1,30 +1,32 @@
|
||||
use std::collections::HashMap;
|
||||
use std::fmt::Display;
|
||||
|
||||
use alloy::primitives::{Address, U256};
|
||||
use chrono::{DateTime, Duration, Utc};
|
||||
use diesel::dsl::{auto_type, insert_into};
|
||||
use diesel::prelude::*;
|
||||
use diesel::sqlite::Sqlite;
|
||||
use diesel_async::{AsyncConnection, RunQueryDsl};
|
||||
|
||||
use crate::crypto::integrity::v1::Integrable;
|
||||
use crate::db::models::{
|
||||
EvmBasicGrant, EvmEtherTransferGrant, EvmEtherTransferGrantTarget, EvmEtherTransferLimit,
|
||||
NewEvmEtherTransferLimit, SqliteTimestamp,
|
||||
};
|
||||
use crate::db::schema::{evm_basic_grant, evm_ether_transfer_limit, evm_transaction_log};
|
||||
use crate::evm::policies::{
|
||||
CombinedSettings, Grant, SharedGrantSettings, SpecificGrant, SpecificMeaning, VolumeRateLimit,
|
||||
};
|
||||
use super::{DatabaseID, EvalContext, EvalViolation};
|
||||
use crate::{
|
||||
crypto::integrity::v1::Integrable,
|
||||
db::models::{
|
||||
EvmBasicGrant, EvmEtherTransferGrant, EvmEtherTransferGrantTarget, EvmEtherTransferLimit,
|
||||
NewEvmEtherTransferLimit, SqliteTimestamp,
|
||||
},
|
||||
db::schema::{evm_basic_grant, evm_ether_transfer_limit, evm_transaction_log},
|
||||
db::{
|
||||
models::{NewEvmEtherTransferGrant, NewEvmEtherTransferGrantTarget},
|
||||
schema::{evm_ether_transfer_grant, evm_ether_transfer_grant_target},
|
||||
},
|
||||
evm::policies::{
|
||||
CombinedSettings, Grant, SharedGrantSettings, SpecificGrant, SpecificMeaning,
|
||||
VolumeRateLimit,
|
||||
},
|
||||
evm::{policies::Policy, utils},
|
||||
};
|
||||
|
||||
use alloy::primitives::{Address, U256};
|
||||
use chrono::{DateTime, Duration, Utc};
|
||||
use diesel::{
|
||||
dsl::{auto_type, insert_into},
|
||||
prelude::*,
|
||||
sqlite::Sqlite,
|
||||
};
|
||||
use diesel_async::{AsyncConnection, RunQueryDsl};
|
||||
use std::{collections::HashMap, fmt::Display};
|
||||
|
||||
#[auto_type]
|
||||
fn grant_join() -> _ {
|
||||
evm_ether_transfer_grant::table.inner_join(
|
||||
@@ -32,8 +34,6 @@ fn grant_join() -> _ {
|
||||
)
|
||||
}
|
||||
|
||||
use super::{DatabaseID, EvalContext, EvalViolation};
|
||||
|
||||
// Plain ether transfer
|
||||
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
|
||||
pub struct Meaning {
|
||||
|
||||
@@ -1,25 +1,26 @@
|
||||
use super::{EtherTransfer, Settings};
|
||||
use crate::{
|
||||
db::{
|
||||
self, DatabaseConnection,
|
||||
models::{
|
||||
EvmBasicGrant, EvmWalletAccess, NewEvmBasicGrant, NewEvmTransactionLog, SqliteTimestamp,
|
||||
},
|
||||
schema::{evm_basic_grant, evm_transaction_log},
|
||||
},
|
||||
evm::{
|
||||
policies::{
|
||||
CombinedSettings, EvalContext, EvalViolation, Grant, Policy, SharedGrantSettings,
|
||||
VolumeRateLimit,
|
||||
},
|
||||
utils,
|
||||
},
|
||||
};
|
||||
|
||||
use alloy::primitives::{Address, Bytes, U256, address};
|
||||
use chrono::{Duration, Utc};
|
||||
use diesel::{SelectableHelper, insert_into};
|
||||
use diesel_async::RunQueryDsl;
|
||||
|
||||
use crate::db::{
|
||||
self, DatabaseConnection,
|
||||
models::{
|
||||
EvmBasicGrant, EvmWalletAccess, NewEvmBasicGrant, NewEvmTransactionLog, SqliteTimestamp,
|
||||
},
|
||||
schema::{evm_basic_grant, evm_transaction_log},
|
||||
};
|
||||
use crate::evm::{
|
||||
policies::{
|
||||
CombinedSettings, EvalContext, EvalViolation, Grant, Policy, SharedGrantSettings,
|
||||
VolumeRateLimit,
|
||||
},
|
||||
utils,
|
||||
};
|
||||
|
||||
use super::{EtherTransfer, Settings};
|
||||
|
||||
const WALLET_ACCESS_ID: i32 = 1;
|
||||
const CHAIN_ID: alloy::primitives::ChainId = 1;
|
||||
|
||||
|
||||
@@ -1,16 +1,4 @@
|
||||
use std::collections::HashMap;
|
||||
|
||||
use crate::db::schema::{
|
||||
evm_basic_grant, evm_token_transfer_grant, evm_token_transfer_log,
|
||||
evm_token_transfer_volume_limit,
|
||||
};
|
||||
use crate::evm::{
|
||||
abi::IERC20::transferCall,
|
||||
policies::{
|
||||
Grant, Policy, SharedGrantSettings, SpecificGrant, SpecificMeaning, VolumeRateLimit,
|
||||
},
|
||||
utils,
|
||||
};
|
||||
use super::{DatabaseID, EvalContext, EvalViolation};
|
||||
use crate::{
|
||||
crypto::integrity::Integrable,
|
||||
db::models::{
|
||||
@@ -18,20 +6,33 @@ use crate::{
|
||||
NewEvmTokenTransferGrant, NewEvmTokenTransferLog, NewEvmTokenTransferVolumeLimit,
|
||||
SqliteTimestamp,
|
||||
},
|
||||
db::schema::{
|
||||
evm_basic_grant, evm_token_transfer_grant, evm_token_transfer_log,
|
||||
evm_token_transfer_volume_limit,
|
||||
},
|
||||
evm::policies::CombinedSettings,
|
||||
evm::{
|
||||
abi::IERC20::transferCall,
|
||||
policies::{
|
||||
Grant, Policy, SharedGrantSettings, SpecificGrant, SpecificMeaning, VolumeRateLimit,
|
||||
},
|
||||
utils,
|
||||
},
|
||||
};
|
||||
use arbiter_tokens_registry::evm::nonfungible::{self, TokenInfo};
|
||||
|
||||
use alloy::{
|
||||
primitives::{Address, U256},
|
||||
sol_types::SolCall,
|
||||
};
|
||||
use arbiter_tokens_registry::evm::nonfungible::{self, TokenInfo};
|
||||
use chrono::{DateTime, Duration, Utc};
|
||||
use diesel::dsl::{auto_type, insert_into};
|
||||
use diesel::prelude::*;
|
||||
use diesel::sqlite::Sqlite;
|
||||
use diesel::{
|
||||
dsl::{auto_type, insert_into},
|
||||
prelude::*,
|
||||
sqlite::Sqlite,
|
||||
};
|
||||
use diesel_async::{AsyncConnection, RunQueryDsl};
|
||||
|
||||
use super::{DatabaseID, EvalContext, EvalViolation};
|
||||
use std::collections::HashMap;
|
||||
|
||||
#[auto_type]
|
||||
fn grant_join() -> _ {
|
||||
|
||||
@@ -1,25 +1,28 @@
|
||||
use alloy::primitives::{Address, Bytes, U256, address};
|
||||
use alloy::sol_types::SolCall;
|
||||
use super::{Settings, TokenTransfer};
|
||||
use crate::{
|
||||
db::{
|
||||
self, DatabaseConnection,
|
||||
models::{EvmBasicGrant, EvmWalletAccess, NewEvmBasicGrant, SqliteTimestamp},
|
||||
schema::evm_basic_grant,
|
||||
},
|
||||
evm::{
|
||||
abi::IERC20::transferCall,
|
||||
policies::{
|
||||
CombinedSettings, EvalContext, EvalViolation, Grant, Policy, SharedGrantSettings,
|
||||
VolumeRateLimit,
|
||||
},
|
||||
utils,
|
||||
},
|
||||
};
|
||||
|
||||
use alloy::{
|
||||
primitives::{Address, Bytes, U256, address},
|
||||
sol_types::SolCall,
|
||||
};
|
||||
use chrono::{Duration, Utc};
|
||||
use diesel::{SelectableHelper, insert_into};
|
||||
use diesel_async::RunQueryDsl;
|
||||
|
||||
use crate::db::{
|
||||
self, DatabaseConnection,
|
||||
models::{EvmBasicGrant, EvmWalletAccess, NewEvmBasicGrant, SqliteTimestamp},
|
||||
schema::evm_basic_grant,
|
||||
};
|
||||
use crate::evm::{
|
||||
abi::IERC20::transferCall,
|
||||
policies::{
|
||||
CombinedSettings, EvalContext, EvalViolation, Grant, Policy, SharedGrantSettings,
|
||||
VolumeRateLimit,
|
||||
},
|
||||
utils,
|
||||
};
|
||||
|
||||
use super::{Settings, TokenTransfer};
|
||||
|
||||
// DAI on Ethereum mainnet — present in the static token registry
|
||||
const CHAIN_ID: u64 = 1;
|
||||
const DAI: Address = address!("6B175474E89094C44Da98b954EedeAC495271d0F");
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
use std::sync::Mutex;
|
||||
use arbiter_crypto::safecell::{SafeCell, SafeCellHandle as _};
|
||||
|
||||
use alloy::{
|
||||
consensus::SignableTransaction,
|
||||
@@ -6,9 +6,9 @@ use alloy::{
|
||||
primitives::{Address, B256, ChainId, Signature},
|
||||
signers::{Error, Result, Signer, SignerSync, utils::secret_key_to_address},
|
||||
};
|
||||
use arbiter_crypto::safecell::{SafeCell, SafeCellHandle as _};
|
||||
use async_trait::async_trait;
|
||||
use k256::ecdsa::{self, RecoveryId, SigningKey, signature::hazmat::PrehashSigner};
|
||||
use std::sync::Mutex;
|
||||
|
||||
/// An Ethereum signer that stores its secp256k1 secret key inside a
|
||||
/// hardware-protected [`MemSafe`] cell.
|
||||
|
||||
@@ -2,20 +2,20 @@ use alloy::primitives::U256;
|
||||
|
||||
#[derive(thiserror::Error, Debug)]
|
||||
#[error("Expected {expected} bytes but got {actual} bytes")]
|
||||
pub struct LengthError {
|
||||
pub expected: usize,
|
||||
pub actual: usize,
|
||||
pub(super) struct LengthError {
|
||||
pub(super) expected: usize,
|
||||
pub(super) actual: usize,
|
||||
}
|
||||
|
||||
pub const fn u256_to_bytes(value: U256) -> [u8; 32] {
|
||||
value.to_le_bytes()
|
||||
}
|
||||
pub fn bytes_to_u256(bytes: &[u8]) -> Option<U256> {
|
||||
pub(super) fn bytes_to_u256(bytes: &[u8]) -> Option<U256> {
|
||||
let bytes: [u8; 32] = bytes.try_into().ok()?;
|
||||
Some(U256::from_le_bytes(bytes))
|
||||
}
|
||||
|
||||
pub fn try_bytes_to_u256(bytes: &[u8]) -> diesel::result::QueryResult<U256> {
|
||||
pub(super) fn try_bytes_to_u256(bytes: &[u8]) -> diesel::result::QueryResult<U256> {
|
||||
let bytes: [u8; 32] = bytes.try_into().map_err(|_| {
|
||||
diesel::result::Error::DeserializationError(Box::new(LengthError {
|
||||
expected: 32,
|
||||
|
||||
Reference in New Issue
Block a user