# cotyledon
The framework for writing **sprouts** — sandboxed, event-driven trading
automations for Solana protocols.
A sprout is ordinary Rust that compiles to WebAssembly. It declares its triggers
and wallet in a `sprout.toml`, and implements one handler per trigger inside a
`#[sprout::program]` module. Every privileged operation — prices, balances,
signing, submitting, persistent state — goes through the [`Ctx`] handle, which
the Sprouts engine executes on the sprout's behalf. The sprout itself has no
keys, no network, and no ambient access; the sandbox is the security boundary.
## Install
```toml
[dependencies]
cotyledon = "0.1"
```
Or scaffold a new project with the CLI:
```bash
cargo install sprouts
sprouts init my-bot
```
## Example
```rust
use cotyledon::prelude::*;
#[sprout::program]
pub mod my_bot {
use super::*;
pub async fn tick(ctx: Ctx) -> Result<()> {
let price = ctx.price("SOL").await?;
ctx.log(format!("SOL is {price}"));
Ok(())
}
}
```
Each `pub async fn(ctx: Ctx) -> Result<()>` in the module is a handler that a
trigger in `sprout.toml` can target (a schedule, a webhook, or a manual run).
## What `Ctx` gives you
- **Market data** — `ctx.price(...)`.
- **Wallet** — address and balances via `ctx.wallet()`.
- **Signing & submission** — sign and send transactions; the engine holds the
keys and enforces the sprout's guardrails.
- **State** — durable key/value storage scoped to the sprout.
- **Observability** — `ctx.log(...)`, `ctx.metric(...)`, and trade events.
## Building
Sprouts target `wasm32-wasip1`:
```bash
rustup target add wasm32-wasip1
cargo build --target wasm32-wasip1 --release
```
`sprouts deploy` does this for you and uploads the artifact.
> A sprout may only `.await` on `Ctx` calls — it must not start its own async
> runtime. The sandbox enforces this.
## Feature flags
Optional, opt-in protocol plugins:
- `jupiter`
- `meteora`
## License
MIT OR Apache-2.0