Skip to content

Commit

Permalink
Merge pull request #52 from cartridge-gg/ci
Browse files Browse the repository at this point in the history
Add CI
  • Loading branch information
tarrencev committed Mar 18, 2024
2 parents 961655d + 9a4382e commit 48381d7
Show file tree
Hide file tree
Showing 20 changed files with 147 additions and 80 deletions.
69 changes: 69 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
name: ci

on:
push:
branches:
- main
pull_request:

env:
CARGO_TERM_COLOR: always
RUST_VERSION: nightly-2023-09-26

jobs:
test:
runs-on: ubuntu-latest
container:
image: ghcr.io/dojoengine/dojo-dev:5d61184
steps:
- uses: actions/checkout@v3
- uses: asdf-vm/actions/install@v3
- uses: actions-rust-lang/setup-rust-toolchain@v1
with:
toolchain: ${{ env.RUST_VERSION }}
components: llvm-tools-preview
- uses: taiki-e/install-action@cargo-llvm-cov
- run: cargo llvm-cov --all-features --lcov --output-path lcov.info
- uses: codecov/codecov-action@v3
with:
token: ${{ secrets.CODECOV_TOKEN }}
files: lcov.info

ensure-wasm:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions-rust-lang/setup-rust-toolchain@v1
with:
toolchain: ${{ env.RUST_VERSION }}
target: wasm32-unknown-unknown
- run: cargo build -r --target wasm32-unknown-unknown -p account-sdk

cairo-check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: asdf-vm/actions/install@v3
- run: scarb fmt --check
- run: snforge test

clippy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: asdf-vm/actions/install@v3
- uses: actions-rust-lang/setup-rust-toolchain@v1
with:
toolchain: ${{ env.RUST_VERSION }}
components: clippy
- run: cargo clippy --all-targets --all-features

fmt:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions-rust-lang/setup-rust-toolchain@v1
with:
toolchain: ${{ env.RUST_VERSION }}
components: rustfmt
- uses: actions-rust-lang/rustfmt@v1
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -32,3 +32,5 @@ Cargo.lock

# Logs
**/log/

lcov.info
2 changes: 0 additions & 2 deletions .tool-versions
Original file line number Diff line number Diff line change
@@ -1,4 +1,2 @@
scarb 2.5.4
starknet-foundry 0.18.0
python 3.9.18
dojo 0.4.4
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ cargo build -p account-sdk --target wasm32-unknown-unknown --release

Note, that to run the tests you first have to [compile](#compiling-the-cairo-code) (to sierra and casm) the contract in the `cartidge_account` folder.

StarkNet Foundry tests:
Starknet Foundry tests:

```bash
snforge test -p cartridge_account
Expand Down
6 changes: 3 additions & 3 deletions Scarb.toml
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@ edition = "2023_10"
version = "0.1.0"

[workspace.dependencies]
alexandria_data_structures = { git = "https://github.com/keep-starknet-strange/alexandria", tag="cairo-v2.5.4" }
alexandria_encoding = { git = "https://github.com/keep-starknet-strange/alexandria", tag="cairo-v2.5.4" }
alexandria_merkle_tree = { git = "https://github.com/keep-starknet-strange/alexandria", tag="cairo-v2.5.4" }
alexandria_data_structures = { git = "https://github.com/keep-starknet-strange/alexandria", tag = "cairo-v2.5.4" }
alexandria_encoding = { git = "https://github.com/keep-starknet-strange/alexandria", tag = "cairo-v2.5.4" }
alexandria_merkle_tree = { git = "https://github.com/keep-starknet-strange/alexandria", tag = "cairo-v2.5.4" }
openzeppelin = { git = "https://github.com/OpenZeppelin/cairo-contracts", tag = "v0.9.0" }
snforge_std = { git = "https://github.com/foundry-rs/starknet-foundry", tag = "v0.18.0" }
starknet = "2.5.3"
Expand Down
3 changes: 1 addition & 2 deletions crates/account_sdk/src/felt_ser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -395,8 +395,7 @@ mod tests {
let serialized = vec![val.a, val.i.into(), val.x.into()];
let seq = (0..100).map(|_| val.clone()).collect::<Vec<_>>();
let mut result = (0..100)
.map(|_| serialized.clone())
.flatten()
.flat_map(|_| serialized.clone())
.collect::<Vec<_>>();
result.insert(0, seq.len().into());
assert_eq!(to_felts(&seq), result);
Expand Down
21 changes: 10 additions & 11 deletions crates/account_sdk/src/tests/deployment_test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,11 @@ pub async fn create_account<'a>(
SigningKey,
) {
let provider = *from.provider();
let class_hash = declare(provider, &from).await;
let class_hash = declare(provider, from).await;
let private_key = SigningKey::from_random();
let deployed_address = deploy(
provider,
&from,
from,
private_key.verifying_key().scalar(),
class_hash,
)
Expand Down Expand Up @@ -53,13 +53,12 @@ pub async fn declare(
client: &JsonRpcClient<HttpTransport>,
account: &SingleOwnerAccount<&JsonRpcClient<HttpTransport>, LocalWallet>,
) -> FieldElement {
let DeclareTransactionResult { class_hash, .. } =
AccountDeclaration::cartridge_account(&client)
.declare(&account)
.await
.unwrap()
.wait_for_completion()
.await;
let DeclareTransactionResult { class_hash, .. } = AccountDeclaration::cartridge_account(client)
.declare(account)
.await
.unwrap()
.wait_for_completion()
.await;

class_hash
}
Expand All @@ -72,8 +71,8 @@ pub async fn deploy(
) -> FieldElement {
let DeployResult {
deployed_address, ..
} = AccountDeployment::new(&client)
.deploy(vec![public_key], FieldElement::ZERO, &account, class_hash)
} = AccountDeployment::new(client)
.deploy(vec![public_key], FieldElement::ZERO, account, class_hash)
.await
.unwrap()
.wait_for_completion()
Expand Down
8 changes: 4 additions & 4 deletions crates/account_sdk/src/tests/session/uitls.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,12 @@ use crate::{abigen::account::Call, tests::runners::TestnetRunner};

use crate::session_token::Session;

pub async fn create_session_account<'a, T>(
runner: &'a T,
pub async fn create_session_account<T>(
runner: &T,
) -> (
SessionAccount<&'a JsonRpcClient<HttpTransport>, LocalWallet>,
SessionAccount<&JsonRpcClient<HttpTransport>, LocalWallet>,
SigningKey,
SingleOwnerAccount<&'a JsonRpcClient<HttpTransport>, LocalWallet>,
SingleOwnerAccount<&JsonRpcClient<HttpTransport>, LocalWallet>,
)
where
T: TestnetRunner,
Expand Down
2 changes: 1 addition & 1 deletion crates/cartridge_account/src/lib.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -240,7 +240,7 @@ mod Account {
}

fn _execute_single_call(call: Call) -> Span<felt252> {
let Call{to, selector, calldata } = call;
let Call { to, selector, calldata } = call;
starknet::call_contract_syscall(to, selector, calldata).unwrap()
}
}
6 changes: 2 additions & 4 deletions crates/webauthn/auth/src/deserializable_endpoints.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,11 @@ fn verify_hashed_ecdsa_endpoint(
verify_hashed_ecdsa(pub_key_point, msg_hash, r, s)
}

fn expand_auth_data_endpoint(
auth_data: Array<u8>
) -> AuthenticatorData {
fn expand_auth_data_endpoint(auth_data: Array<u8>) -> AuthenticatorData {
let data: Option<AuthenticatorData> = ImplArrayu8TryIntoAuthData::try_into(auth_data);
return data.unwrap();
}

fn extract_u256_from_u8_array_endpoint(bytes: Array<u8>, offset: u32) -> Option<u256> {
extract_u256_from_u8_array(@bytes, offset)
}
}
3 changes: 0 additions & 3 deletions crates/webauthn/session/src/lib.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,6 @@ mod signature;
mod interface;
mod deserializable_endpoints;

#[cfg(test)]
mod tests;

const SESSION_TOKEN_V1: felt252 = 'Session Token v1';

// Based on https://github.com/argentlabs/starknet-plugin-account/blob/3c14770c3f7734ef208536d91bbd76af56dc2043/contracts/plugins/SessionKey.cairo
Expand Down
30 changes: 30 additions & 0 deletions crates/webauthn/session/src/signature.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -42,3 +42,33 @@ impl ImplSignatureProofs of SignatureProofsTrait {
self.proofs_flat.slice(index * self.single_proof_len, self.single_proof_len)
}
}

#[cfg(test)]
mod tests {
use alexandria_data_structures::array_ext::ArrayTraitExt;
use alexandria_merkle_tree::merkle_tree::{
Hasher, MerkleTree, pedersen::PedersenHasherImpl, MerkleTreeTrait
};
use core::box::BoxTrait;
use core::array::SpanTrait;
use core::{TryInto, Into};
use core::ecdsa::check_ecdsa_signature;
use starknet::info::{TxInfo, get_tx_info, get_block_timestamp};
use starknet::{contract_address::ContractAddress};
use webauthn_session::hash::{compute_session_hash, compute_call_hash};

use super::{SessionSignature, SignatureProofs, SignatureProofsTrait};

#[test]
#[available_gas(200000000000)]
fn test_session_deserialize() {
let mut sig = array![
0x1, 0x42, 0x43, 0x69, 18446744073709551615, 0x0, 0x1, 0x1, 0x44, 0x1, 0x2137,
]
.span();

let deser: SessionSignature = Serde::<SessionSignature>::deserialize(ref sig).unwrap();
assert(deser.r == 0x42, 'invalid r');
assert(deser.proofs.len() == 1, 'invalid proofs len');
}
}
3 changes: 0 additions & 3 deletions crates/webauthn/session/src/tests.cairo

This file was deleted.

27 changes: 0 additions & 27 deletions crates/webauthn/session/src/tests/signature_deserialization.cairo

This file was deleted.

6 changes: 6 additions & 0 deletions crates/webauthn/tests/src/arg_builder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,12 @@ impl ArgsBuilder {
}
}

impl Default for ArgsBuilder {
fn default() -> Self {
Self::new()
}
}

pub trait FeltSerialize {
fn to_felts(self) -> Vec<Felt252>;
}
2 changes: 1 addition & 1 deletion crates/webauthn/tests/src/auth/expand_auth_data.rs
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ impl FeltSerialize for AuthenticatorData {

#[test]
fn test_expand_auth_data_1() {
let d: Vec<u8> = (0_u8..32_u8).into_iter().collect();
let d: Vec<u8> = (0_u8..32_u8).collect();
let auth_data = AuthenticatorData {
rp_id_hash: d.try_into().unwrap(),
flags: 0,
Expand Down
27 changes: 13 additions & 14 deletions crates/webauthn/tests/src/auth/verify_signature.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ fn verify_signature(
.add_array(hash.iter().cloned())
.add_array(auth_data.iter().cloned())
.add_struct(pub_key.to_felts())
.add_array(r.into_iter().copied().chain(s.iter().copied()));
.add_array(r.iter().copied().chain(s.iter().copied()));
let result: [Felt252; 2] = VERIFY_SIGNATURE.run(args.build());
result == [0.into(), 0.into()]
}
Expand All @@ -39,7 +39,7 @@ fn test_verify_signature_1() {
let hash: &[u8] = b"hello world";
let auth_data = b"dummy auth data";
let signing_key = SigningKey::random(&mut OsRng);
let (signature, _) = signing_key.sign(&vec![auth_data, hash].concat());
let (signature, _) = signing_key.sign(&[auth_data, hash].concat());
assert!(verify_signature(hash, auth_data, signing_key, signature))
}

Expand All @@ -48,7 +48,7 @@ fn test_verify_signature_2() {
let hash: &[u8] = b"1234567890987654321";
let auth_data = b"auuuuuuuuuuth daaaaataaaaaaaaaa";
let signing_key = SigningKey::random(&mut OsRng);
let (signature, _) = signing_key.sign(&vec![auth_data, hash].concat());
let (signature, _) = signing_key.sign(&[auth_data, hash].concat());
assert!(verify_signature(hash, auth_data, signing_key, signature))
}

Expand All @@ -58,11 +58,8 @@ fn test_verify_signature_should_fail_1() {
let auth_data = b"dummy auth data";
let wrong_hash: &[u8] = b"definetly not hello world";
let signing_key = SigningKey::random(&mut OsRng);
let (signature, _) = signing_key.sign(&vec![auth_data, wrong_hash].concat());
assert_eq!(
verify_signature(hash, auth_data, signing_key, signature),
false
)
let (signature, _) = signing_key.sign(&[auth_data, wrong_hash].concat());
assert!(!verify_signature(hash, auth_data, signing_key, signature),)
}

#[test]
Expand All @@ -71,11 +68,13 @@ fn test_verify_signature_should_fail_2() {
let auth_data = b"dummy auth data";
let signing_key = SigningKey::random(&mut OsRng);
let other_signing_key = SigningKey::random(&mut OsRng);
let (signature, _) = signing_key.sign(&vec![auth_data, hash].concat());
assert_eq!(
verify_signature(hash, auth_data, other_signing_key, signature),
false
)
let (signature, _) = signing_key.sign(&[auth_data, hash].concat());
assert!(!verify_signature(
hash,
auth_data,
other_signing_key,
signature
))
}

proptest! {
Expand All @@ -90,7 +89,7 @@ proptest! {
.prop_map(|b| SigningKey::from(SecretKey::from_bytes(&b.into()).unwrap()))
),
) {
let (signature, _) = signing_key.sign(&vec![auth_data.clone(), hash.clone()].concat());
let (signature, _) = signing_key.sign(&[auth_data.clone(), hash.clone()].concat());
assert!(verify_signature(&hash, &auth_data, signing_key, signature))
}
}
2 changes: 1 addition & 1 deletion crates/webauthn/tests/src/prop_utils.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ use proptest::prelude::*;
pub struct Felt252Strategy;

impl Felt252Strategy {
pub fn new() -> impl Strategy<Value = Felt252> {
pub fn new_strategy() -> impl Strategy<Value = Felt252> {
prop::collection::vec(any::<u8>(), 32..=32).prop_map(|b| Felt252::from_bytes_be(&b))
}
}
2 changes: 1 addition & 1 deletion crates/webauthn/tests/src/session/prop_signature_proofs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ fn vec_vec_felt252_strategy(
) -> impl Strategy<Value = (Vec<Vec<Felt252>>, usize)> {
(
prop::collection::vec(
prop::collection::vec(Felt252Strategy::new(), inner_len..=inner_len),
prop::collection::vec(Felt252Strategy::new_strategy(), inner_len..=inner_len),
outer_len..=outer_len,
),
Just(inner_len),
Expand Down
4 changes: 2 additions & 2 deletions crates/webauthn/tests/src/utils.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ use cairo_args_runner::errors::SierraRunnerError;
use cairo_args_runner::SuccessfulRun;
use cairo_args_runner::{Arg, Felt252};

pub const WEBAUTHN_SIERRA_TARGET: &'static str = "../../../target/dev/webauthn_auth.sierra.json";
pub const SESSION_SIERRA_TARGET: &'static str = "../../../target/dev/webauthn_session.sierra.json";
pub const WEBAUTHN_SIERRA_TARGET: &str = "../../../target/dev/webauthn_auth.sierra.json";
pub const SESSION_SIERRA_TARGET: &str = "../../../target/dev/webauthn_session.sierra.json";

#[derive(Debug, Clone, Copy)]
pub struct Function<'a, AP, RE>
Expand Down

0 comments on commit 48381d7

Please sign in to comment.