Skip to content

Commit

Permalink
feat(starknet): add support for ArgentX account without guardian
Browse files Browse the repository at this point in the history
  • Loading branch information
ptisserand committed Feb 14, 2025
1 parent e573401 commit 492c858
Showing 1 changed file with 52 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,47 @@ import '../../signer/stark_signer.dart';
import '../../types/felt.dart';
import 'base_account_signer.dart';

extension<T> on T {
R let<R>(R Function(T) operation) => operation(this);
}

enum _ArgentAccountSignerType {
starknet,
secp256k1,
secp256r1,
eip191,
webauthn,
}

extension on _ArgentAccountSignerType {
Felt toFelt() {
switch (this) {
case _ArgentAccountSignerType.starknet:
return Felt.zero;
case _ArgentAccountSignerType.secp256k1:
return Felt.one;
case _ArgentAccountSignerType.secp256r1:
return Felt.two;
case _ArgentAccountSignerType.eip191:
return Felt.fromInt(3);
case _ArgentAccountSignerType.webauthn:
return Felt.fromInt(4);
}
}
}

extension on StarkSigner {
_ArgentAccountSignerType get signerType => _ArgentAccountSignerType.starknet;
}

/// An account signer for ArgentX account with a stark guardian
class ArgentXGuardianAccountSigner extends BaseAccountSigner {
final StarkSigner _ownerSigner;
final StarkSigner _guardianSigner;
final StarkSigner? _guardianSigner;

ArgentXGuardianAccountSigner({
required StarkSigner ownerSigner,
required StarkSigner guardianSigner,
required StarkSigner? guardianSigner,
}) : _guardianSigner = guardianSigner,
_ownerSigner = ownerSigner;

Expand All @@ -21,16 +54,26 @@ class ArgentXGuardianAccountSigner extends BaseAccountSigner {
Future<List<Felt>> sign(BigInt messageHash, BigInt? seed) async {
final signatures = await Future.wait([
_ownerSigner.sign(messageHash, seed),
_guardianSigner.sign(messageHash, seed),
if (_guardianSigner != null) _guardianSigner!.sign(messageHash, seed),
]);
return [
Felt.fromInt(2),
Felt.zero,
final ownerPart = [
_ownerSigner.signerType.toFelt(),
_ownerSigner.publicKey,
...signatures[0],
Felt.zero,
_guardianSigner.publicKey,
...signatures[1],
];
final guardianPart = _guardianSigner?.let(
(guardian) => [
guardian.signerType.toFelt(),
guardian.publicKey,
...signatures[1],
],
) ??
[];

return [
Felt.fromInt(signatures.length),
...ownerPart,
...guardianPart,
];
}
}

0 comments on commit 492c858

Please sign in to comment.