Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions .github/workflows/specs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,8 @@ jobs:
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
repository: foundry-rs/foundry
ref: master
# Temporary: foundry-rs/foundry#16213 pins tempoxyz/mpp-rs#391 at 5d2fdf7.
ref: 607d560005bec7972df15e4f231b5fe33b11e7b6
path: foundry
persist-credentials: false

Expand Down Expand Up @@ -260,7 +261,8 @@ jobs:
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
repository: foundry-rs/foundry
ref: master
# Temporary: foundry-rs/foundry#16213 pins tempoxyz/mpp-rs#391 at 5d2fdf7.
ref: 607d560005bec7972df15e4f231b5fe33b11e7b6
path: foundry
persist-credentials: false

Expand Down
3 changes: 3 additions & 0 deletions crates/contracts/src/precompiles/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ pub mod account_keychain;
pub mod address_registry;
pub mod common_errors;
pub mod current_committee;
pub mod native_multisig;
pub mod nonce;
pub mod receive_policy_guard;
pub mod signature_verifier;
Expand All @@ -20,6 +21,7 @@ pub use account_keychain::*;
pub use address_registry::*;
pub use common_errors::*;
pub use current_committee::*;
pub use native_multisig::*;
pub use nonce::*;
pub use receive_policy_guard::*;
pub use signature_verifier::*;
Expand Down Expand Up @@ -57,6 +59,7 @@ pub const SIGNATURE_VERIFIER_ADDRESS: Address =
address!("0x5165300000000000000000000000000000000000");
pub const RECEIVE_POLICY_GUARD_ADDRESS: Address =
address!("0xB10C000000000000000000000000000000000000");
pub const NATIVE_MULTISIG_ADDRESS: Address = address!("0xAACC000000000000000000000000000000000000");
pub const STORAGE_CREDITS_ADDRESS: Address = address!("0x1060000000000000000000000000000000000000");
pub const CURRENT_COMMITTEE_ADDRESS: Address =
address!("0xC077E00000000000000000000000000000000000");
Expand Down
49 changes: 49 additions & 0 deletions crates/contracts/src/precompiles/native_multisig.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
pub use INativeMultisig::{
INativeMultisigErrors as NativeMultisigError, INativeMultisigEvents as NativeMultisigEvent,
};

crate::sol! {
/// Native multisig account precompile.
#[derive(Debug, PartialEq, Eq)]
#[sol(abi)]
interface INativeMultisig {
struct MultisigOwner {
address owner;
uint8 weight;
}

struct MultisigConfig {
uint64 version;
uint8 threshold;
MultisigOwner[] owners;
}

event MultisigInitialized(address indexed account);
event MultisigConfigUpdated(
address indexed account,
uint8 threshold,
MultisigOwner[] owners
);

function deriveAccount(bytes32 salt, uint8 threshold, MultisigOwner[] calldata owners)
external
pure
returns (address account);
function isMultisigAccount(address account) external view returns (bool);
function getConfig(address account) external view returns (MultisigConfig memory);
function updateConfig(uint8 threshold, MultisigOwner[] calldata owners) external;

error NotMultisigAccount();
error InvalidAccount();
error InvalidConfig();
error InvalidThreshold();
error InvalidOwner();
error InvalidWeight();
error TooManyOwners();
error DuplicateOwner();
error InvalidOwnerOrder();
error AccountAlreadyInitialized();
error UnauthorizedCaller();
error SameTransactionUpdateNotAllowed();
}
}
4 changes: 3 additions & 1 deletion crates/node/tests/it/tempo_transaction/helpers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -496,7 +496,9 @@ fn create_key_authorization_inner(
witness: Option<B256>,
) -> eyre::Result<SignedKeyAuthorization> {
// Infer key_type from the access key signature
let key_type = access_key_signature.signature_type();
let key_type = access_key_signature
.signature_type()
.ok_or_else(|| eyre::eyre!("native multisig signatures cannot be used as account keys"))?;

let mut key_auth = KeyAuthorization::unrestricted(chain_id, key_type, access_key_addr);
key_auth.expiry = expiry;
Expand Down
8 changes: 8 additions & 0 deletions crates/primitives/src/transaction/mod.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
pub mod envelope;
pub mod key_authorization;
pub mod multisig;
pub mod tempo_transaction;
pub mod tt_authorization;
pub mod tt_signature;
Expand All @@ -19,6 +20,13 @@ pub use key_authorization::{
CallScope, KeyAuthorization, KeyAuthorizationChainIdError, SelectorRule,
SignedKeyAuthorization, TokenLimit,
};
pub use multisig::{
InitMultisig, MAX_MULTISIG_NESTING_DEPTH, MAX_MULTISIG_OWNER_SIGNATURE_BYTES,
MAX_MULTISIG_OWNERS, MAX_MULTISIG_SIGNATURES, MAX_MULTISIG_THRESHOLD,
MULTISIG_SIGNATURE_DOMAIN, MultisigAddress, MultisigConfigError, MultisigOwner,
MultisigQuorumError, MultisigSignature, MultisigSignatureError, MultisigWeightAccumulator,
SIGNATURE_TYPE_MULTISIG, multisig_digest, multisig_signature_count_for_threshold,
};
pub use tempo_transaction::{
Call, FEE_PAYER_SIGNATURE_MARKER, InvalidValidAfter, InvalidValidBefore,
MAX_WEBAUTHN_SIGNATURE_LENGTH, P256_SIGNATURE_LENGTH, SECP256K1_SIGNATURE_LENGTH,
Expand Down
Loading
Loading