> ## Documentation Index
> Fetch the complete documentation index at: https://docs.exponent.finance/llms.txt
> Use this file to discover all available pages before exploring further.

# ActionProposal

> Onchain account structure for vault governance proposals

The `ActionProposal` account represents a governance proposal for a vault settings change or position update. It tracks the proposal status, voting results, and execution timeline.

**Program ID:** `HycecAnELpjL1pMp435nEKWkcr7aNZ2QGQGXpzK1VEdV`

## ActionProposal

```rust theme={null}
#[account]
pub struct ActionProposal {
    /// The vault this proposal belongs to
    pub vault: Pubkey,

    /// Sequential proposal identifier
    pub proposal_id: u64,

    /// The manager who created this proposal
    pub proposer: Pubkey,

    /// Serialized ProposalAction data (VaultSettingsAction or PositionUpdate)
    pub action_data: Vec<u8>,

    /// Unix timestamp when the proposal was created
    pub created_at: i64,

    /// Unix timestamp when voting ends
    pub voting_ends_at: i64,

    /// Seconds to wait after approval before execution is allowed
    pub timelock_seconds: u32,

    /// Unix timestamp when the proposal becomes executable (after timelock)
    pub executable_at: i64,

    /// Current status of the proposal
    pub status: ProposalStatus,

    /// Total LP tokens staked to reject
    pub reject_votes: u64,

    /// Total LP tokens staked to opt-out
    pub opt_out_votes: u64,

    /// PDA bump seed
    pub bump: u8,

    /// Reserved bytes for future use
    pub reserved: [u8; 32],
}
```

## ProposalStatus

```rust theme={null}
pub enum ProposalStatus {
    /// Voting is active
    Active,
    /// Proposal was approved (rejection votes below threshold)
    Approved,
    /// Proposal was rejected (rejection votes exceeded threshold)
    Rejected,
    /// Proposal has been executed
    Executed,
    /// Proposal was cancelled by manager or sentinel
    Cancelled,
}
```

## ProposalAction

The `action_data` field contains a serialized `ProposalAction`:

```rust theme={null}
pub enum ProposalAction {
    /// A vault settings change (add/remove token entries, set withdrawal period, etc.)
    VaultSettingsAction(VaultSettingsAction),
    /// A strategy position update (add/remove positions)
    PositionUpdate(PositionUpdate),
}
```

## Voting Model

Strategy Vaults use **rejection-based voting**:

* Proposals pass by default unless sufficient LP is staked to reject
* The rejection threshold is configured per-vault in `ProposalVoteConfig.rejectionThresholdBps`
* LP holders can also vote `OptOut` — this doesn't block the proposal but queues their LP for withdrawal if it passes

## TypeScript

```typescript theme={null}
import { fetchActionProposalAccount } from "@exponent-labs/exponent-sdk/client/vaults";

const { data } = await fetchActionProposalAccount(connection, proposalAddress);
console.log(data.status);           // ProposalStatus
console.log(data.rejectVotes);      // bigint
console.log(data.optOutVotes);      // bigint
console.log(data.votingEndsAt);     // bigint (unix timestamp)
console.log(data.executableAt);     // bigint (unix timestamp)
```
