Skip to content

Commit b4d90ac

Browse files
authored
feat: support Argent account v0.4.0 (#680)
1 parent a09d4d4 commit b4d90ac

File tree

2 files changed

+39
-11
lines changed

2 files changed

+39
-11
lines changed

examples/deploy_argent_account.rs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ use starknet::{
1111

1212
#[tokio::main]
1313
async fn main() {
14-
// Latest hash as of 2023-09-15. For demo only.
15-
let class_hash = felt!("0x01a736d6ed154502257f02b1ccdf4d9d1089f80811cd6acad48e6b6a9d1f2003");
14+
// Latest hash as of 2024-12-01. For demo only.
15+
let class_hash = felt!("0x036078334509b514626504edc9fb252328d1a240e4e948bef8d0c08dff45927f");
1616

1717
// Anything you like here as salt
1818
let salt = felt!("12345678");
@@ -25,10 +25,9 @@ async fn main() {
2525
Felt::from_hex("YOUR_PRIVATE_KEY_IN_HEX_HERE").unwrap(),
2626
));
2727

28-
let factory =
29-
ArgentAccountFactory::new(class_hash, chain_id::SEPOLIA, Felt::ZERO, signer, provider)
30-
.await
31-
.unwrap();
28+
let factory = ArgentAccountFactory::new(class_hash, chain_id::SEPOLIA, None, signer, provider)
29+
.await
30+
.unwrap();
3231

3332
let deployment = factory.deploy_v1(salt);
3433

starknet-accounts/src/factory/argent.rs

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,41 @@ use crate::{
44
};
55

66
use async_trait::async_trait;
7-
use starknet_core::types::{BlockId, BlockTag, Felt};
7+
use starknet_core::{
8+
codec::Encode,
9+
types::{BlockId, BlockTag, Felt},
10+
};
811
use starknet_providers::Provider;
912
use starknet_signers::{Signer, SignerInteractivityContext};
1013

11-
/// [`AccountFactory`] implementation for deploying `Argent X` account contracts.
14+
/// [`AccountFactory`] implementation for deploying `Argent X` account contracts (v0.4.0).
1215
#[derive(Debug)]
1316
pub struct ArgentAccountFactory<S, P> {
1417
class_hash: Felt,
1518
chain_id: Felt,
1619
owner_public_key: Felt,
17-
guardian_public_key: Felt,
20+
guardian_public_key: Option<Felt>,
1821
signer: S,
1922
provider: P,
2023
block_id: BlockId,
2124
}
2225

26+
/// Constructor parameters for Argent account v0.4.0.
27+
#[derive(Encode)]
28+
#[starknet(core = "starknet_core")]
29+
struct ArgentAccountConstructorParams {
30+
owner: ArgentSigner,
31+
guardian: Option<ArgentSigner>,
32+
}
33+
34+
/// A simplified version of `argent::signer::signer_signature::Signer` that only supports the simple
35+
/// Starknet signer.
36+
#[derive(Encode)]
37+
#[starknet(core = "starknet_core")]
38+
enum ArgentSigner {
39+
Starknet(Felt),
40+
}
41+
2342
impl<S, P> ArgentAccountFactory<S, P>
2443
where
2544
S: Signer,
@@ -28,7 +47,7 @@ where
2847
pub async fn new(
2948
class_hash: Felt,
3049
chain_id: Felt,
31-
guardian_public_key: Felt,
50+
guardian_public_key: Option<Felt>,
3251
signer: S,
3352
provider: P,
3453
) -> Result<Self, S::GetPublicKeyError> {
@@ -66,7 +85,17 @@ where
6685
}
6786

6887
fn calldata(&self) -> Vec<Felt> {
69-
vec![self.owner_public_key, self.guardian_public_key]
88+
let mut calldata = vec![];
89+
90+
// Encoding this sturct never fails
91+
ArgentAccountConstructorParams {
92+
owner: ArgentSigner::Starknet(self.owner_public_key),
93+
guardian: self.guardian_public_key.map(ArgentSigner::Starknet),
94+
}
95+
.encode(&mut calldata)
96+
.unwrap();
97+
98+
calldata
7099
}
71100

72101
fn chain_id(&self) -> Felt {

0 commit comments

Comments
 (0)