Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
7e83d6a
feat: `MultisigAggregatedSignature` changes
thibault-martinez Apr 6, 2026
760838a
as_ref
thibault-martinez Apr 6, 2026
782b8fb
hash
thibault-martinez Apr 6, 2026
e483485
impl From<&MultisigCommittee> for Address
thibault-martinez Apr 6, 2026
8679d4f
MultisigCommittee methods
thibault-martinez Apr 6, 2026
32e357f
tmp infallible
thibault-martinez Apr 6, 2026
2fe761b
combine
thibault-martinez Apr 6, 2026
dd39bf8
expose typedef
thibault-martinez Apr 6, 2026
4d9745b
has_scheme_signatures
thibault-martinez Apr 6, 2026
d596653
get_scheme_signatures
thibault-martinez Apr 6, 2026
9a8d3c9
meh
thibault-martinez Apr 7, 2026
3b384fc
expose method
thibault-martinez Apr 7, 2026
fb6c8aa
from_bytes harmonization
thibault-martinez Apr 8, 2026
25f9d2b
add is_valid
thibault-martinez Apr 8, 2026
8ac55d1
derive_address
thibault-martinez Apr 8, 2026
d7765f1
derive_more::From
thibault-martinez Apr 8, 2026
758ddb7
MultisigError as Debug
thibault-martinez Apr 8, 2026
02bc340
impl From<&MultisigCommittee> for Address
thibault-martinez Apr 8, 2026
95ba473
MultisigMemberSignature impl Into
thibault-martinez Apr 8, 2026
532c4b2
IntentMessage signing_message
thibault-martinez Apr 8, 2026
4857b1f
digest deref
thibault-martinez Apr 8, 2026
8f4d6ef
remove into
thibault-martinez Apr 8, 2026
691e3a7
get_indices
thibault-martinez Apr 8, 2026
21cda77
impl AsRef<[u8]> for MultisigMemberSignature
thibault-martinez Apr 8, 2026
62fa74f
impl FromStr for MultisigAggregatedSignature
thibault-martinez Apr 8, 2026
3a569dd
impl From<&MultisigMemberPublicKey> for Address
thibault-martinez Apr 8, 2026
8483c39
MultisigMemberPublicKey from_base64
thibault-martinez Apr 9, 2026
7351380
impl FromStr for MultisigMemberSignature
thibault-martinez Apr 9, 2026
cc7c5ba
fix compilation
thibault-martinez May 1, 2026
9ac60e4
bindings
thibault-martinez May 1, 2026
6600ec8
propagate error
thibault-martinez May 4, 2026
5ce9cb9
NOT having a good time
thibault-martinez May 4, 2026
f8baae2
UserSignature derive From
thibault-martinez May 4, 2026
6edfa45
impl From<SimpleSignature> for MultisigMemberSignature
thibault-martinez May 5, 2026
4c36d6c
impl FromStr for UserSignature
thibault-martinez May 5, 2026
ba7acea
todo
thibault-martinez May 6, 2026
d2f20c2
remove some panics
thibault-martinez May 6, 2026
04f2cf6
finish combine
thibault-martinez May 6, 2026
459adfe
cleaner impl AsRef<[u8]> for MultisigAggregatedSignature
thibault-martinez May 6, 2026
73ccbe1
fix to_base64/from_base64
thibault-martinez May 6, 2026
75e6130
public to_bytes
thibault-martinez May 6, 2026
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
5,672 changes: 5,111 additions & 561 deletions bindings/csharp/src/IotaSdk/IotaSdk.cs

Large diffs are not rendered by default.

445 changes: 388 additions & 57 deletions bindings/go/iota_sdk/iota_sdk.go

Large diffs are not rendered by default.

9,065 changes: 5,454 additions & 3,611 deletions bindings/go/iota_sdk/iota_sdk.h

Large diffs are not rendered by default.

795 changes: 595 additions & 200 deletions bindings/kotlin/lib/iota_sdk/iota_sdk.kt

Large diffs are not rendered by default.

183 changes: 119 additions & 64 deletions bindings/python/lib/iota_sdk.py

Large diffs are not rendered by default.

8,883 changes: 5,329 additions & 3,554 deletions bindings/swift/Sources/CIotaSDK/CIotaSDK.h

Large diffs are not rendered by default.

155 changes: 99 additions & 56 deletions bindings/swift/Sources/IotaSDK/IotaSDK.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12401,13 +12401,13 @@ public static func newImmutable(callArgs: [Input], typeArgs: [TypeTag], objectTo
/**
* Create a new move authenticator from a shared object.
*/
public static func newShared(callArgs: [Input], typeArgs: [TypeTag], objectToAuthenticate: ObjectId, initialSharedVersion: UInt64) -> MoveAuthenticatorV1 {
public static func newShared(callArgs: [Input], typeArgs: [TypeTag], objectToAuthenticate: ObjectId, initialSharedVersion: Version) -> MoveAuthenticatorV1 {
return try! FfiConverterTypeMoveAuthenticatorV1_lift(try! rustCall() {
uniffi_iota_sdk_ffi_fn_constructor_moveauthenticatorv1_new_shared(
FfiConverterSequenceTypeInput.lower(callArgs),
FfiConverterSequenceTypeTypeTag.lower(typeArgs),
FfiConverterTypeObjectId_lower(objectToAuthenticate),
FfiConverterUInt64.lower(initialSharedVersion),$0
FfiConverterTypeVersion_lower(initialSharedVersion),$0
)
})
}
Expand Down Expand Up @@ -13743,13 +13743,13 @@ open class MultisigAggregatedSignature: MultisigAggregatedSignatureProtocol, @un
* order as it's corresponding member in the provided committee
* and that it's position in the provided bitmap is set.
*/
public convenience init(committee: MultisigCommittee, signatures: [MultisigMemberSignature], bitmap: UInt16) {
public convenience init(signatures: [MultisigMemberSignature], bitmap: UInt16, committee: MultisigCommittee) {
let pointer =
try! rustCall() {
uniffi_iota_sdk_ffi_fn_constructor_multisigaggregatedsignature_new(
FfiConverterTypeMultisigCommittee_lower(committee),
FfiConverterSequenceTypeMultisigMemberSignature.lower(signatures),
FfiConverterUInt16.lower(bitmap),$0
FfiConverterUInt16.lower(bitmap),
FfiConverterTypeMultisigCommittee_lower(committee),$0
)
}
self.init(unsafeFromRawPointer: pointer)
Expand Down Expand Up @@ -25135,6 +25135,9 @@ open class TransactionKind: TransactionKindProtocol, @unchecked Sendable {
}


/**
* Create a [`TransactionKind`] for a consensus commit prologue v1.
*/
public static func newConsensusCommitPrologueV1(tx: ConsensusCommitPrologueV1) -> TransactionKind {
return try! FfiConverterTypeTransactionKind_lift(try! rustCall() {
uniffi_iota_sdk_ffi_fn_constructor_transactionkind_new_consensus_commit_prologue_v1(
Expand All @@ -25144,7 +25147,7 @@ public static func newConsensusCommitPrologueV1(tx: ConsensusCommitPrologueV1) -
}

/**
* Create a [`TransactionKind`] for an end of epoch transaction.
* Create a [`TransactionKind`] for an authenticator state update v1.
*/
public static func newEndOfEpoch(tx: [EndOfEpochTransactionKind]) -> TransactionKind {
return try! FfiConverterTypeTransactionKind_lift(try! rustCall() {
Expand Down Expand Up @@ -26164,29 +26167,17 @@ public func FfiConverterTypeTransferObjects_lower(_ value: TransferObjects) -> U
* The BCS serialized form for this type is defined by the following ABNF:
*
* ```text
* type-tag = type-tag-u8 \
* type-tag-u16 \
* type-tag-u32 \
* type-tag-u64 \
* type-tag-u128 \
* type-tag-u256 \
* type-tag-bool \
* type-tag-address \
* type-tag-signer \
* type-tag-vector \
* type-tag-struct
*
* type-tag-u8 = %d01
* type-tag-u16 = %d08
* type-tag-u32 = %d09
* type-tag-u64 = %d02
* type-tag-u128 = %d03
* type-tag-u256 = %d10
* type-tag-bool = %d00
* type-tag-address = %d04
* type-tag-signer = %d05
* type-tag-vector = %d06 type-tag
* type-tag-struct = %d07 struct-tag
* type-tag = %d00 ; Bool
* / %d01 ; U8
* / %d02 ; U64
* / %d03 ; U128
* / %d04 ; Address
* / %d05 ; Signer
* / %d06 type-tag ; Vector
* / %d07 struct-tag ; Struct
* / %d08 ; U16
* / %d09 ; U32
* / %d10 ; U256
* ```
*/
public protocol TypeTagProtocol: AnyObject, Sendable {
Expand Down Expand Up @@ -26236,29 +26227,17 @@ public protocol TypeTagProtocol: AnyObject, Sendable {
* The BCS serialized form for this type is defined by the following ABNF:
*
* ```text
* type-tag = type-tag-u8 \
* type-tag-u16 \
* type-tag-u32 \
* type-tag-u64 \
* type-tag-u128 \
* type-tag-u256 \
* type-tag-bool \
* type-tag-address \
* type-tag-signer \
* type-tag-vector \
* type-tag-struct
*
* type-tag-u8 = %d01
* type-tag-u16 = %d08
* type-tag-u32 = %d09
* type-tag-u64 = %d02
* type-tag-u128 = %d03
* type-tag-u256 = %d10
* type-tag-bool = %d00
* type-tag-address = %d04
* type-tag-signer = %d05
* type-tag-vector = %d06 type-tag
* type-tag-struct = %d07 struct-tag
* type-tag = %d00 ; Bool
* / %d01 ; U8
* / %d02 ; U64
* / %d03 ; U128
* / %d04 ; Address
* / %d05 ; Signer
* / %d06 type-tag ; Vector
* / %d07 struct-tag ; Struct
* / %d08 ; U16
* / %d09 ; U32
* / %d10 ; U256
* ```
*/
open class TypeTag: TypeTagProtocol, @unchecked Sendable {
Expand Down Expand Up @@ -39256,6 +39235,30 @@ fileprivate struct FfiConverterOptionTypeTypeTag: FfiConverterRustBuffer {
}
}

#if swift(>=5.8)
@_documentation(visibility: private)
#endif
fileprivate struct FfiConverterOptionTypeVersion: FfiConverterRustBuffer {
typealias SwiftType = Version?

public static func write(_ value: SwiftType, into buf: inout [UInt8]) {
guard let value = value else {
writeInt(&buf, Int8(0))
return
}
writeInt(&buf, Int8(1))
FfiConverterTypeVersion.write(value, into: &buf)
}

public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> SwiftType {
switch try readInt(&buf) as Int8 {
case 0: return nil
case 1: return try FfiConverterTypeVersion.read(from: &buf)
default: throw UniffiInternalError.unexpectedOptionalTag
}
}
}

#if swift(>=5.8)
@_documentation(visibility: private)
#endif
Expand Down Expand Up @@ -41161,6 +41164,31 @@ fileprivate struct FfiConverterSequenceTypeUserSignature: FfiConverterRustBuffer
}
}

#if swift(>=5.8)
@_documentation(visibility: private)
#endif
fileprivate struct FfiConverterSequenceTypeVersion: FfiConverterRustBuffer {
typealias SwiftType = [Version]

public static func write(_ value: [Version], into buf: inout [UInt8]) {
let len = Int32(value.count)
writeInt(&buf, len)
for item in value {
FfiConverterTypeVersion.write(item, into: &buf)
}
}

public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> [Version] {
let len: Int32 = try readInt(&buf)
var seq = [Version]()
seq.reserveCapacity(Int(len))
for _ in 0 ..< len {
seq.append(try FfiConverterTypeVersion.read(from: &buf))
}
return seq
}
}

#if swift(>=5.8)
@_documentation(visibility: private)
#endif
Expand Down Expand Up @@ -47155,6 +47183,12 @@ private let initializationResult: InitializationResult = {
if (uniffi_iota_sdk_ffi_checksum_func_version_assignment_to_json() != 21440) {
return InitializationResult.apiChecksumMismatch
}
if (uniffi_iota_sdk_ffi_checksum_method_address_next_lexicographical() != 10365) {
return InitializationResult.apiChecksumMismatch
}
if (uniffi_iota_sdk_ffi_checksum_method_address_next_lexicographical_opt() != 51160) {
return InitializationResult.apiChecksumMismatch
}
if (uniffi_iota_sdk_ffi_checksum_method_address_to_bytes() != 57710) {
return InitializationResult.apiChecksumMismatch
}
Expand Down Expand Up @@ -48934,6 +48968,15 @@ private let initializationResult: InitializationResult = {
if (uniffi_iota_sdk_ffi_checksum_method_versionassignment_version() != 9820) {
return InitializationResult.apiChecksumMismatch
}
if (uniffi_iota_sdk_ffi_checksum_constructor_address_authenticator_state() != 23906) {
return InitializationResult.apiChecksumMismatch
}
if (uniffi_iota_sdk_ffi_checksum_constructor_address_clock() != 41996) {
return InitializationResult.apiChecksumMismatch
}
if (uniffi_iota_sdk_ffi_checksum_constructor_address_deny_list() != 26355) {
return InitializationResult.apiChecksumMismatch
}
if (uniffi_iota_sdk_ffi_checksum_constructor_address_framework() != 52951) {
return InitializationResult.apiChecksumMismatch
}
Expand Down Expand Up @@ -49513,7 +49556,7 @@ private let initializationResult: InitializationResult = {
if (uniffi_iota_sdk_ffi_checksum_constructor_moveauthenticatorv1_new_immutable() != 32081) {
return InitializationResult.apiChecksumMismatch
}
if (uniffi_iota_sdk_ffi_checksum_constructor_moveauthenticatorv1_new_shared() != 22895) {
if (uniffi_iota_sdk_ffi_checksum_constructor_moveauthenticatorv1_new_shared() != 45977) {
return InitializationResult.apiChecksumMismatch
}
if (uniffi_iota_sdk_ffi_checksum_constructor_movecall_new() != 30411) {
Expand Down Expand Up @@ -49573,7 +49616,7 @@ private let initializationResult: InitializationResult = {
if (uniffi_iota_sdk_ffi_checksum_constructor_moveviewarg_u8_vec() != 19629) {
return InitializationResult.apiChecksumMismatch
}
if (uniffi_iota_sdk_ffi_checksum_constructor_multisigaggregatedsignature_new() != 3396) {
if (uniffi_iota_sdk_ffi_checksum_constructor_multisigaggregatedsignature_new() != 62487) {
return InitializationResult.apiChecksumMismatch
}
if (uniffi_iota_sdk_ffi_checksum_constructor_multisigaggregator_new_with_message() != 41388) {
Expand Down Expand Up @@ -50089,10 +50132,10 @@ private let initializationResult: InitializationResult = {
if (uniffi_iota_sdk_ffi_checksum_constructor_transactionevents_new() != 1310) {
return InitializationResult.apiChecksumMismatch
}
if (uniffi_iota_sdk_ffi_checksum_constructor_transactionkind_new_consensus_commit_prologue_v1() != 27756) {
if (uniffi_iota_sdk_ffi_checksum_constructor_transactionkind_new_consensus_commit_prologue_v1() != 53312) {
return InitializationResult.apiChecksumMismatch
}
if (uniffi_iota_sdk_ffi_checksum_constructor_transactionkind_new_end_of_epoch() != 52798) {
if (uniffi_iota_sdk_ffi_checksum_constructor_transactionkind_new_end_of_epoch() != 48667) {
return InitializationResult.apiChecksumMismatch
}
if (uniffi_iota_sdk_ffi_checksum_constructor_transactionkind_new_genesis() != 50492) {
Expand Down
43 changes: 21 additions & 22 deletions crates/iota-sdk-crypto/src/multisig.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
// SPDX-License-Identifier: Apache-2.0

use iota_types::{
MultisigAggregatedSignature, MultisigCommittee, MultisigMemberPublicKey,
MultisigMemberSignature, UserSignature,
MultisigAggregatedSignature, MultisigCommittee, MultisigMemberSignature, PublicKey,
UserSignature,
};

use crate::{SignatureError, Verifier};
Expand All @@ -20,54 +20,53 @@ impl MultisigVerifier {
Default::default()
}

fn verify_member_signature(
pub fn verify_member_signature(
&self,
message: &[u8],
member_public_key: &MultisigMemberPublicKey,
member_public_key: &PublicKey,
signature: &MultisigMemberSignature,
) -> Result<(), SignatureError> {
match (member_public_key, signature) {
#[cfg(not(feature = "ed25519"))]
(MultisigMemberPublicKey::Ed25519(_), MultisigMemberSignature::Ed25519(_)) => Err(
(PublicKey::Ed25519(_), MultisigMemberSignature::Ed25519(_)) => Err(
SignatureError::from_source("support for ed25519 is not enabled"),
),
#[cfg(feature = "ed25519")]
(
MultisigMemberPublicKey::Ed25519(ed25519_public_key),
PublicKey::Ed25519(ed25519_public_key),
MultisigMemberSignature::Ed25519(ed25519_signature),
) => crate::ed25519::Ed25519VerifyingKey::new(ed25519_public_key)?
.verify(message, ed25519_signature),
#[cfg(not(feature = "secp256k1"))]
(MultisigMemberPublicKey::Secp256k1(_), MultisigMemberSignature::Secp256k1(_)) => Err(
(PublicKey::Secp256k1(_), MultisigMemberSignature::Secp256k1(_)) => Err(
SignatureError::from_source("support for secp256k1 is not enabled"),
),
#[cfg(feature = "secp256k1")]
(
MultisigMemberPublicKey::Secp256k1(k1_public_key),
PublicKey::Secp256k1(k1_public_key),
MultisigMemberSignature::Secp256k1(k1_signature),
) => crate::secp256k1::Secp256k1VerifyingKey::new(k1_public_key)?
.verify(message, k1_signature),
#[cfg(not(feature = "secp256r1"))]
(MultisigMemberPublicKey::Secp256r1(_), MultisigMemberSignature::Secp256r1(_)) => Err(
(PublicKey::Secp256r1(_), MultisigMemberSignature::Secp256r1(_)) => Err(
SignatureError::from_source("support for secp256r1 is not enabled"),
),
#[cfg(feature = "secp256r1")]
(
MultisigMemberPublicKey::Secp256r1(r1_public_key),
PublicKey::Secp256r1(r1_public_key),
MultisigMemberSignature::Secp256r1(r1_signature),
) => crate::secp256r1::Secp256r1VerifyingKey::new(r1_public_key)?
.verify(message, r1_signature),
(
MultisigMemberPublicKey::ZkLoginDeprecated,
MultisigMemberSignature::ZkLoginDeprecated,
) => Err(SignatureError::from_source("zklogin is not supported")),
(PublicKey::ZkLoginDeprecated, MultisigMemberSignature::ZkLoginDeprecated) => {
Err(SignatureError::from_source("zklogin is not supported"))
}
#[cfg(not(feature = "passkey"))]
(MultisigMemberPublicKey::Passkey(_), MultisigMemberSignature::Passkey(_)) => Err(
(PublicKey::Passkey(_), MultisigMemberSignature::Passkey(_)) => Err(
SignatureError::from_source("support for passkey is not enabled"),
),
#[cfg(feature = "passkey")]
(
MultisigMemberPublicKey::Passkey(passkey_public_key),
PublicKey::Passkey(passkey_public_key),
MultisigMemberSignature::Passkey(passkey_authenticator),
) => {
let passkey_verifier = self.passkey_verifier().cloned().unwrap_or_default();
Expand Down Expand Up @@ -342,44 +341,44 @@ impl MultisigAggregator {
);

Ok(MultisigAggregatedSignature::new(
self.committee.clone(),
signatures,
bitmap,
self.committee.clone(),
))
}
}

fn multisig_pubkey_and_signature_from_user_signature(
signature: UserSignature,
) -> Result<(MultisigMemberPublicKey, MultisigMemberSignature), SignatureError> {
) -> Result<(PublicKey, MultisigMemberSignature), SignatureError> {
use iota_types::SimpleSignature;
match signature {
UserSignature::Simple(SimpleSignature::Ed25519 {
signature,
public_key,
}) => Ok((
MultisigMemberPublicKey::Ed25519(public_key),
PublicKey::Ed25519(public_key),
MultisigMemberSignature::Ed25519(signature),
)),
UserSignature::Simple(SimpleSignature::Secp256k1 {
signature,
public_key,
}) => Ok((
MultisigMemberPublicKey::Secp256k1(public_key),
PublicKey::Secp256k1(public_key),
MultisigMemberSignature::Secp256k1(signature),
)),
UserSignature::Simple(SimpleSignature::Secp256r1 {
signature,
public_key,
}) => Ok((
MultisigMemberPublicKey::Secp256r1(public_key),
PublicKey::Secp256r1(public_key),
MultisigMemberSignature::Secp256r1(signature),
)),
UserSignature::ZkLoginAuthenticatorDeprecated => {
Err(SignatureError::from_source("zklogin is not supported"))
}
UserSignature::PasskeyAuthenticator(passkey_authenticator) => Ok((
MultisigMemberPublicKey::Passkey(passkey_authenticator.public_key()),
PublicKey::Passkey(passkey_authenticator.public_key()),
MultisigMemberSignature::Passkey(passkey_authenticator),
)),
UserSignature::Multisig(_) | UserSignature::MoveAuthenticator(_) => {
Expand Down
Loading
Loading