diff --git a/solana/programs/matching-engine/src/events/enacted.rs b/solana/programs/matching-engine/src/events/enacted.rs new file mode 100644 index 000000000..bf60f1ce4 --- /dev/null +++ b/solana/programs/matching-engine/src/events/enacted.rs @@ -0,0 +1,7 @@ +use crate::state::ProposalAction; +use anchor_lang::prelude::*; + +#[event] +pub struct Enacted { + pub action: ProposalAction, +} diff --git a/solana/programs/matching-engine/src/events/mod.rs b/solana/programs/matching-engine/src/events/mod.rs index c1a7f2337..6e969aecf 100644 --- a/solana/programs/matching-engine/src/events/mod.rs +++ b/solana/programs/matching-engine/src/events/mod.rs @@ -4,5 +4,11 @@ pub use auction_settled::*; mod auction_updated; pub use auction_updated::*; +mod enacted; +pub use enacted::*; + mod order_executed; pub use order_executed::*; + +mod proposed; +pub use proposed::*; diff --git a/solana/programs/matching-engine/src/events/proposed.rs b/solana/programs/matching-engine/src/events/proposed.rs new file mode 100644 index 000000000..d8a3909f6 --- /dev/null +++ b/solana/programs/matching-engine/src/events/proposed.rs @@ -0,0 +1,7 @@ +use crate::state::ProposalAction; +use anchor_lang::prelude::*; + +#[event] +pub struct Proposed { + pub action: ProposalAction, +} diff --git a/solana/programs/matching-engine/src/processor/admin/propose/auction_parameters.rs b/solana/programs/matching-engine/src/processor/admin/propose/auction_parameters.rs index bfe39ff5a..a1878afaf 100644 --- a/solana/programs/matching-engine/src/processor/admin/propose/auction_parameters.rs +++ b/solana/programs/matching-engine/src/processor/admin/propose/auction_parameters.rs @@ -35,6 +35,8 @@ pub fn propose_auction_parameters( crate::utils::auction::require_valid_parameters(¶meters)?; let id = ctx.accounts.admin.custodian.auction_config_id + 1; + let action = ProposalAction::UpdateAuctionParameters { id, parameters }; + super::propose( super::Propose { custodian: &ctx.accounts.admin.custodian, @@ -42,7 +44,13 @@ pub fn propose_auction_parameters( by: &ctx.accounts.admin.owner_or_assistant, epoch_schedule: &ctx.accounts.epoch_schedule, }, - ProposalAction::UpdateAuctionParameters { id, parameters }, + action, ctx.bumps.proposal, - ) + )?; + + // Emit event reflecting the proposal. + emit!(crate::events::Proposed { action }); + + // Done. + Ok(()) } diff --git a/solana/programs/matching-engine/src/processor/admin/update/auction_parameters.rs b/solana/programs/matching-engine/src/processor/admin/update/auction_parameters.rs index 259792f00..4f8415fad 100644 --- a/solana/programs/matching-engine/src/processor/admin/update/auction_parameters.rs +++ b/solana/programs/matching-engine/src/processor/admin/update/auction_parameters.rs @@ -65,8 +65,12 @@ pub struct UpdateAuctionParameters<'info> { } pub fn update_auction_parameters(ctx: Context) -> Result<()> { - if let ProposalAction::UpdateAuctionParameters { id, parameters } = ctx.accounts.proposal.action - { + let action = ctx.accounts.proposal.action; + + // Emit event to reflect enacting the proposal. + emit!(crate::events::Enacted { action }); + + if let ProposalAction::UpdateAuctionParameters { id, parameters } = action { ctx.accounts .auction_config .set_inner(AuctionConfig { id, parameters }); diff --git a/solana/programs/matching-engine/src/state/proposal.rs b/solana/programs/matching-engine/src/state/proposal.rs index aba756d79..e1c849c87 100644 --- a/solana/programs/matching-engine/src/state/proposal.rs +++ b/solana/programs/matching-engine/src/state/proposal.rs @@ -2,7 +2,7 @@ use anchor_lang::prelude::*; use crate::AuctionParameters; -#[derive(Debug, AnchorSerialize, AnchorDeserialize, Clone, InitSpace, PartialEq, Eq)] +#[derive(Debug, AnchorSerialize, AnchorDeserialize, Clone, InitSpace, PartialEq, Eq, Copy)] pub enum ProposalAction { None, UpdateAuctionParameters { diff --git a/solana/target/idl/matching_engine.json b/solana/target/idl/matching_engine.json index 23874fe29..6af3c6c29 100644 --- a/solana/target/idl/matching_engine.json +++ b/solana/target/idl/matching_engine.json @@ -3125,6 +3125,18 @@ } ] }, + { + "name": "Enacted", + "fields": [ + { + "name": "action", + "type": { + "defined": "ProposalAction" + }, + "index": false + } + ] + }, { "name": "OrderExecuted", "fields": [ @@ -3146,6 +3158,18 @@ "index": false } ] + }, + { + "name": "Proposed", + "fields": [ + { + "name": "action", + "type": { + "defined": "ProposalAction" + }, + "index": false + } + ] } ], "errors": [ diff --git a/solana/target/types/matching_engine.ts b/solana/target/types/matching_engine.ts index c0f9c665c..a8660e492 100644 --- a/solana/target/types/matching_engine.ts +++ b/solana/target/types/matching_engine.ts @@ -3125,6 +3125,18 @@ export type MatchingEngine = { } ] }, + { + "name": "Enacted", + "fields": [ + { + "name": "action", + "type": { + "defined": "ProposalAction" + }, + "index": false + } + ] + }, { "name": "OrderExecuted", "fields": [ @@ -3146,6 +3158,18 @@ export type MatchingEngine = { "index": false } ] + }, + { + "name": "Proposed", + "fields": [ + { + "name": "action", + "type": { + "defined": "ProposalAction" + }, + "index": false + } + ] } ], "errors": [ @@ -6487,6 +6511,18 @@ export const IDL: MatchingEngine = { } ] }, + { + "name": "Enacted", + "fields": [ + { + "name": "action", + "type": { + "defined": "ProposalAction" + }, + "index": false + } + ] + }, { "name": "OrderExecuted", "fields": [ @@ -6508,6 +6544,18 @@ export const IDL: MatchingEngine = { "index": false } ] + }, + { + "name": "Proposed", + "fields": [ + { + "name": "action", + "type": { + "defined": "ProposalAction" + }, + "index": false + } + ] } ], "errors": [ diff --git a/solana/ts/src/matchingEngine/index.ts b/solana/ts/src/matchingEngine/index.ts index f05183b99..00a1c7941 100644 --- a/solana/ts/src/matchingEngine/index.ts +++ b/solana/ts/src/matchingEngine/index.ts @@ -43,6 +43,7 @@ import { MessageProtocol, PreparedOrderResponse, Proposal, + ProposalAction, RedeemedFastFill, RouterEndpoint, } from "./state"; @@ -155,6 +156,14 @@ export type OrderExecuted = { targetProtocol: MessageProtocol; }; +export type Proposed = { + action: ProposalAction; +}; + +export type Enacted = { + action: ProposalAction; +}; + export class MatchingEngineProgram { private _programId: ProgramId; private _mint: PublicKey; @@ -189,6 +198,14 @@ export class MatchingEngineProgram { return this.program.addEventListener("OrderExecuted", callback); } + onProposed(callback: (event: Proposed, slot: number, signature: string) => void) { + return this.program.addEventListener("Proposed", callback); + } + + onEnacted(callback: (event: Enacted, slot: number, signature: string) => void) { + return this.program.addEventListener("Enacted", callback); + } + custodianAddress(): PublicKey { return Custodian.address(this.ID); }