From 9c1ff98ff811705fe01714cfef09d1aee80d8f45 Mon Sep 17 00:00:00 2001 From: Noah Prince Date: Mon, 5 May 2025 13:16:56 -0700 Subject: [PATCH] Add ability to update proposal when no votes --- Cargo.lock | 52 +++++++++---------- Cargo.toml | 4 +- programs/proposal/src/instructions/mod.rs | 2 + .../src/instructions/update_proposal_v0.rs | 40 ++++++++++++++ programs/proposal/src/lib.rs | 7 +++ 5 files changed, 77 insertions(+), 28 deletions(-) create mode 100644 programs/proposal/src/instructions/update_proposal_v0.rs diff --git a/Cargo.lock b/Cargo.lock index 858c726..778311c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -61,9 +61,9 @@ dependencies = [ [[package]] name = "anchor-attribute-access-control" -version = "0.31.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37013051defd745a5437d6842bd404e5480e14ad4e4f0441dd9a81a4b9aea1d6" +checksum = "3f70fd141a4d18adf11253026b32504f885447048c7494faf5fa83b01af9c0cf" dependencies = [ "anchor-syn", "proc-macro2", @@ -73,9 +73,9 @@ dependencies = [ [[package]] name = "anchor-attribute-account" -version = "0.31.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92db0f793e924e18462b3fac53c5759a8248649a8072788b5e88a4af714998c8" +checksum = "715a261c57c7679581e06f07a74fa2af874ac30f86bd8ea07cca4a7e5388a064" dependencies = [ "anchor-syn", "bs58", @@ -86,9 +86,9 @@ dependencies = [ [[package]] name = "anchor-attribute-constant" -version = "0.31.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a98126ebfc96d6248899caadc9ea7c2403420c4f5c994e541802bce9f423674" +checksum = "730d6df8ae120321c5c25e0779e61789e4b70dc8297102248902022f286102e4" dependencies = [ "anchor-syn", "quote", @@ -97,9 +97,9 @@ dependencies = [ [[package]] name = "anchor-attribute-error" -version = "0.31.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8a4dcb403f872fbcd0910fc39a3e05bb6c43a8399f915a1878e62eb680fbb23" +checksum = "27e6e449cc3a37b2880b74dcafb8e5a17b954c0e58e376432d7adc646fb333ef" dependencies = [ "anchor-syn", "quote", @@ -108,9 +108,9 @@ dependencies = [ [[package]] name = "anchor-attribute-event" -version = "0.31.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "420d651b2703ccff86f6c4b7c394140cb85049787c078a5f8280506121d48065" +checksum = "d7710e4c54adf485affcd9be9adec5ef8846d9c71d7f31e16ba86ff9fc1dd49f" dependencies = [ "anchor-syn", "proc-macro2", @@ -120,9 +120,9 @@ dependencies = [ [[package]] name = "anchor-attribute-program" -version = "0.31.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d258f3a9f47db7f4199888df0ee67e42b960a7acb8f5c336b585d4eb243b9665" +checksum = "05ecfd49b2aeadeb32f35262230db402abed76ce87e27562b34f61318b2ec83c" dependencies = [ "anchor-lang-idl", "anchor-syn", @@ -137,9 +137,9 @@ dependencies = [ [[package]] name = "anchor-derive-accounts" -version = "0.31.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "097147501de51105d8dbdad9bd5a96a1b17ecbb2cee9f200d6167031372eab3b" +checksum = "be89d160793a88495af462a7010b3978e48e30a630c91de47ce2c1d3cb7a6149" dependencies = [ "anchor-syn", "quote", @@ -148,9 +148,9 @@ dependencies = [ [[package]] name = "anchor-derive-serde" -version = "0.31.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5a24721da4ed67f0a1391cac27ea7e51c255cbd94cdcc6728a0aa56227628d0" +checksum = "abc6ee78acb7bfe0c2dd2abc677aaa4789c0281a0c0ef01dbf6fe85e0fd9e6e4" dependencies = [ "anchor-syn", "borsh-derive-internal", @@ -161,9 +161,9 @@ dependencies = [ [[package]] name = "anchor-derive-space" -version = "0.31.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f41986f84d238a2f7a807f3a98da5df0e97ebe23f29f7d67b8cdd4fd80bc1ba1" +checksum = "134a01c0703f6fd355a0e472c033f6f3e41fac1ef6e370b20c50f4c8d022cea7" dependencies = [ "proc-macro2", "quote", @@ -172,9 +172,9 @@ dependencies = [ [[package]] name = "anchor-lang" -version = "0.31.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eba81a0543fee1b7b610fe9ebedbae6a14e8d3e85a6a6dd48871d48a08880195" +checksum = "e6bab117055905e930f762c196e08f861f8dfe7241b92cee46677a3b15561a0a" dependencies = [ "anchor-attribute-access-control", "anchor-attribute-account", @@ -221,9 +221,9 @@ dependencies = [ [[package]] name = "anchor-spl" -version = "0.31.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9d989ebc64e6c1a9828d3a6f7b8e7a4d63cc8a4f667dcb191bd9067a3375c20" +checksum = "3c08cb5d762c0694f74bd02c9a5b04ea53cefc496e2c27b3234acffca5cd076b" dependencies = [ "anchor-lang", "mpl-token-metadata", @@ -237,9 +237,9 @@ dependencies = [ [[package]] name = "anchor-syn" -version = "0.31.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "564685b759db12a2424d1b2688cfdf0fec26a023813bc461274754fb0e5d97b0" +checksum = "5dc7a6d90cc643df0ed2744862cdf180587d1e5d28936538c18fc8908489ed67" dependencies = [ "anyhow", "bs58", @@ -1099,9 +1099,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.93" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" dependencies = [ "unicode-ident", ] diff --git a/Cargo.toml b/Cargo.toml index 812c935..b3abf52 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,6 +14,6 @@ incremental = false codegen-units = 1 [workspace.dependencies] -anchor-lang = { version = "0.31.0", features = ["init-if-needed"] } -anchor-spl = { version = "0.31.0", features = ["token", "metadata"] } +anchor-lang = { version = "0.31.1", features = ["init-if-needed"] } +anchor-spl = { version = "0.31.1", features = ["token", "metadata"] } diff --git a/programs/proposal/src/instructions/mod.rs b/programs/proposal/src/instructions/mod.rs index 8867184..e8489b0 100644 --- a/programs/proposal/src/instructions/mod.rs +++ b/programs/proposal/src/instructions/mod.rs @@ -1,11 +1,13 @@ pub mod initialize_proposal_config_v0; pub mod initialize_proposal_v0; pub mod update_proposal_config_v0; +pub mod update_proposal_v0; pub mod update_state_v0; pub mod vote_v0; pub use initialize_proposal_config_v0::*; pub use initialize_proposal_v0::*; pub use update_proposal_config_v0::*; +pub use update_proposal_v0::*; pub use update_state_v0::*; pub use vote_v0::*; diff --git a/programs/proposal/src/instructions/update_proposal_v0.rs b/programs/proposal/src/instructions/update_proposal_v0.rs new file mode 100644 index 0000000..654e03b --- /dev/null +++ b/programs/proposal/src/instructions/update_proposal_v0.rs @@ -0,0 +1,40 @@ +use anchor_lang::prelude::*; + +use crate::state::*; + +#[derive(AnchorSerialize, AnchorDeserialize, Clone, Default)] +pub struct UpdateProposalArgsV0 { + pub name: Option, + pub uri: Option, + pub tags: Option>, +} + +#[derive(Accounts)] +pub struct UpdateProposalV0<'info> { + #[account( + mut, + has_one = owner, + constraint = match proposal.state { + // Only allow updating name, uri, and tags if proposal has no votes + ProposalState::Voting { .. } => proposal.choices.iter().all(|choice| choice.weight == 0), + ProposalState::Resolved { .. } => false, + _ => true + } + )] + pub proposal: Box>, + pub owner: Signer<'info>, +} + +pub fn handler(ctx: Context, args: UpdateProposalArgsV0) -> Result<()> { + if let Some(name) = args.name { + ctx.accounts.proposal.name = name; + } + if let Some(uri) = args.uri { + ctx.accounts.proposal.uri = uri; + } + if let Some(tags) = args.tags { + ctx.accounts.proposal.tags = tags; + } + + Ok(()) +} diff --git a/programs/proposal/src/lib.rs b/programs/proposal/src/lib.rs index 48fbb98..6491600 100644 --- a/programs/proposal/src/lib.rs +++ b/programs/proposal/src/lib.rs @@ -41,6 +41,13 @@ pub mod proposal { ) -> Result<()> { update_proposal_config_v0::handler(ctx, args) } + + pub fn update_proposal_v0( + ctx: Context, + args: UpdateProposalArgsV0, + ) -> Result<()> { + update_proposal_v0::handler(ctx, args) + } } #[derive(Accounts)]