diff --git a/crates/algokit_utils/src/lib.rs b/crates/algokit_utils/src/lib.rs
index 7b6f6894..d5b68d7b 100644
--- a/crates/algokit_utils/src/lib.rs
+++ b/crates/algokit_utils/src/lib.rs
@@ -1,4 +1,5 @@
pub mod clients;
+mod multisig;
pub mod testing;
pub mod transactions;
@@ -13,7 +14,7 @@ pub use testing::{
pub use transactions::{
AccountCloseParams, ApplicationCallParams, ApplicationCreateParams, ApplicationDeleteParams,
ApplicationUpdateParams, AssetCreateParams, AssetDestroyParams, AssetReconfigureParams,
- CommonParams, Composer, ComposerError, ComposerTransaction, EmptySigner,
+ CommonParams, Composer, ComposerError, ComposerTransaction, EmptyKeyPairSigner,
NonParticipationKeyRegistrationParams, OfflineKeyRegistrationParams,
OnlineKeyRegistrationParams, PaymentParams, TransactionSigner, TransactionSignerGetter,
};
diff --git a/crates/algokit_utils/src/multisig.rs b/crates/algokit_utils/src/multisig.rs
new file mode 100644
index 00000000..bdf75329
--- /dev/null
+++ b/crates/algokit_utils/src/multisig.rs
@@ -0,0 +1,47 @@
+use algokit_transact::{Address, MultisigSubsignature};
+
+#[derive(Debug, thiserror::Error)]
+pub enum MultisigError {
+ #[error("Invalid multisig account: {0}")]
+ InvalidMultisigSignature(#[from] algokit_transact::AlgoKitTransactError),
+}
+
+#[derive(Clone)]
+pub struct MultisigAccount {
+ pub version: u8,
+ pub threshold: u8,
+ pub participants: Vec
,
+}
+
+impl From for MultisigAccount {
+ fn from(multisig: algokit_transact::MultisigSignature) -> Self {
+ Self {
+ version: multisig.version,
+ threshold: multisig.threshold,
+ participants: multisig.participants(),
+ }
+ }
+}
+
+impl TryFrom for algokit_transact::MultisigSignature {
+ type Error = MultisigError;
+ fn try_from(account: MultisigAccount) -> Result {
+ Ok(algokit_transact::MultisigSignature::from_participants(
+ account.version,
+ account.threshold,
+ account.participants,
+ )?)
+ }
+}
+
+impl TryFrom for Address {
+ type Error = MultisigError;
+ fn try_from(account: MultisigAccount) -> Result {
+ let msig_signature: algokit_transact::MultisigSignature = account.try_into()?;
+ Ok(msig_signature.into())
+ }
+}
+
+pub struct MultisigSignature {
+ pub subsignatures: Vec