# Stealth Address Kit

The Stealth Address Kit leverages the [arkworks-rs](https://github.com/arkworks-rs/curves) suite of libraries to provide a robust implementation of stealth addresses.

## Supported Curves

The following curves are currently supported:

1. `ark_bn254`
2. `ark_bls_12_381`
3. `ark_bls_12_377`
4. `secp256k1`
5. `secp256r1`
6. `pallas`
7. `vesta`
8. `bw6_761`
9. `baby_jub_jub`

## Benchmarks

See the [benchmarks](./benchmarks/report/index.html) for performance comparisons across supported curves.

## Usage Example

Below is an example demonstrating how to use the Stealth Address Kit with the `ark_bn254` curve:

```rust
use stealth_address_kit::StealthAddressOnCurve;
use ark_bn254::Bn254;

fn main() {
    let (spending_key, spending_public_key) = Bn254::random_keypair();
    let (viewing_key, viewing_public_key) = Bn254::random_keypair();

    // Generate ephemeral keypair
    let (ephemeral_private_key, ephemeral_public_key) = Bn254::random_keypair();

    let (stealth_address, view_tag) = Bn254::generate_stealth_address(viewing_public_key, spending_public_key, ephemeral_private_key);

    let stealth_private_key_opt = Bn254::generate_stealth_private_key(ephemeral_public_key, viewing_key, spending_key, view_tag);

    if stealth_private_key_opt.is_none() {
        panic!("View tags did not match");
    }

    let derived_stealth_address = Bn254::derive_public_key(&stealth_private_key_opt.unwrap());
    assert_eq!(derived_stealth_address, stealth_address);
}
```

## Adding a New Curve

To add support for a new curve, follow these steps:

1. Add the curve to the `Cargo.toml` file as a feature.
2. Create a new module in the `src` directory with the curve name, suffixed by `_impl.rs`.
3. Implement the `StealthAddressOnCurve` trait for the curve.
4. Define the macro `define_curve_ffi`.
5. Add the curve to the `lib.rs` file in the `mod` declaration, and re-export if required.
6. Update the README to include the new curve.
7. Add the curve to the nightly release workflow.
8. Add the curve to the benchmarks.

## Building and Testing

### Building

To build the project, use the following command:

```sh
cargo build --release --features <bn254/bls12_381/bls12_377/secp256k1/secp256r1/etc>
```

### Testing

To run tests, use the following command:

```sh
cargo test --release --features <bn254/bls12_381/bls12_377/secp256k1/secp256r1/etc>
```

### Benchmarks

To run benchmarks, use the following command:

```sh
make bench
```

This will run benchmarks for all supported curves, and output the results to the `benchmarks` directory.

## FFI API

The exposed FFI API supports all curves, prefixed by the curve name. Ensure that the correct feature is enabled when building the library.

## Precompiled Libraries

Precompiled libraries are available in the nightly releases.

## Acknowledgements

This project is inspired by the [ERC-5564](https://eips.ethereum.org/EIPS/eip-5564) EIP and the [proof of concept](https://github.com/nerolation/EIP-Stealth-Address-ERC/blob/main/minimal_poc.ipynb) by Nerolation.
