From 8e0c0f0001441a999dd66626602912376571e580 Mon Sep 17 00:00:00 2001 From: brentstone Date: Mon, 1 Jul 2024 21:43:59 -0700 Subject: [PATCH 1/8] see what fails --- crates/tests/src/e2e/ibc_tests.rs | 1 - crates/tests/src/e2e/ledger_tests.rs | 1 - 2 files changed, 2 deletions(-) diff --git a/crates/tests/src/e2e/ibc_tests.rs b/crates/tests/src/e2e/ibc_tests.rs index 808288b812..97c25b7039 100644 --- a/crates/tests/src/e2e/ibc_tests.rs +++ b/crates/tests/src/e2e/ibc_tests.rs @@ -2134,7 +2134,6 @@ fn propose_inflation(test: &Test) -> Result { let start_epoch = (epoch.0 + 3) / 3 * 3; let proposal_json = serde_json::json!({ "proposal": { - "id": 0, "content": { "title": "TheTitle", "authors": "test@test.com", diff --git a/crates/tests/src/e2e/ledger_tests.rs b/crates/tests/src/e2e/ledger_tests.rs index 0521f5e82a..6b451e9a53 100644 --- a/crates/tests/src/e2e/ledger_tests.rs +++ b/crates/tests/src/e2e/ledger_tests.rs @@ -1411,7 +1411,6 @@ pub fn prepare_proposal_data( ) -> PathBuf { let valid_proposal_json = json!({ "proposal": { - "id": id, "content": { "title": "TheTitle", "authors": "test@test.com", From a94844ebac806831a59bb99c421effe5d28fffb2 Mon Sep 17 00:00:00 2001 From: brentstone Date: Mon, 1 Jul 2024 22:40:00 -0700 Subject: [PATCH 2/8] fix clippy --- crates/tests/src/e2e/ibc_tests.rs | 1 - crates/tests/src/e2e/ledger_tests.rs | 2 -- crates/tests/src/integration/ledger_tests.rs | 14 +++----------- 3 files changed, 3 insertions(+), 14 deletions(-) diff --git a/crates/tests/src/e2e/ibc_tests.rs b/crates/tests/src/e2e/ibc_tests.rs index 97c25b7039..2a5b4908ca 100644 --- a/crates/tests/src/e2e/ibc_tests.rs +++ b/crates/tests/src/e2e/ibc_tests.rs @@ -2106,7 +2106,6 @@ fn propose_funding( let start_epoch = (epoch.0 + 6) / 3 * 3; let proposal_json_path = prepare_proposal_data( test_a.test_dir.path(), - 0, albert, pgf_funding, start_epoch, diff --git a/crates/tests/src/e2e/ledger_tests.rs b/crates/tests/src/e2e/ledger_tests.rs index 6b451e9a53..fc012b8b18 100644 --- a/crates/tests/src/e2e/ledger_tests.rs +++ b/crates/tests/src/e2e/ledger_tests.rs @@ -1404,7 +1404,6 @@ fn test_epoch_sleep() -> Result<()> { /// This can be submitted with "init-proposal" command. pub fn prepare_proposal_data( test_dir: impl AsRef, - id: u64, source: Address, data: impl serde::Serialize, start_epoch: u64, @@ -1945,7 +1944,6 @@ fn proposal_change_shielded_reward() -> Result<()> { let albert = find_address(&test, ALBERT)?; let valid_proposal_json_path = prepare_proposal_data( test.test_dir.path(), - 0, albert, TestWasms::TxProposalMaspRewards.read_bytes(), 12, diff --git a/crates/tests/src/integration/ledger_tests.rs b/crates/tests/src/integration/ledger_tests.rs index 293c81d973..fef77e521b 100644 --- a/crates/tests/src/integration/ledger_tests.rs +++ b/crates/tests/src/integration/ledger_tests.rs @@ -704,7 +704,6 @@ fn proposal_submission() -> Result<()> { let albert = defaults::albert_address(); let valid_proposal_json_path = prepare_proposal_data( node.test_dir.path(), - 0, albert.clone(), TestWasms::TxProposalCode.read_bytes(), 12, @@ -772,7 +771,6 @@ fn proposal_submission() -> Result<()> { // proposal is invalid due to voting_end_epoch - voting_start_epoch < 3 let invalid_proposal_json = prepare_proposal_data( node.test_dir.path(), - 1, albert, TestWasms::TxProposalCode.read_bytes(), 1, @@ -1041,13 +1039,8 @@ fn pgf_governance_proposal() -> Result<()> { remove: vec![], }; - let valid_proposal_json_path = prepare_proposal_data( - node.test_dir.path(), - 0, - albert, - pgf_stewards, - 12, - ); + let valid_proposal_json_path = + prepare_proposal_data(node.test_dir.path(), albert, pgf_stewards, 12); let submit_proposal_args = vec![ "init-proposal", "--pgf-stewards", @@ -1222,7 +1215,7 @@ fn pgf_governance_proposal() -> Result<()> { })], }; let valid_proposal_json_path = - prepare_proposal_data(node.test_dir.path(), 1, albert, pgf_funding, 36); + prepare_proposal_data(node.test_dir.path(), albert, pgf_funding, 36); let submit_proposal_args = vec![ "init-proposal", @@ -1365,7 +1358,6 @@ fn implicit_account_reveal_pk() -> Result<()> { let author = find_address(&node, source).unwrap(); let valid_proposal_json_path = prepare_proposal_data( node.test_dir.path(), - 0, author, TestWasms::TxProposalCode.read_bytes(), 12, From 69391c194c6ab014b0432afb9623c7122a20cd9b Mon Sep 17 00:00:00 2001 From: brentstone Date: Mon, 1 Jul 2024 22:03:24 -0700 Subject: [PATCH 3/8] script to attach wasm code to proposal data --- scripts/add_proposal_wasm_code.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100755 scripts/add_proposal_wasm_code.py diff --git a/scripts/add_proposal_wasm_code.py b/scripts/add_proposal_wasm_code.py new file mode 100755 index 0000000000..1ee2a45b03 --- /dev/null +++ b/scripts/add_proposal_wasm_code.py @@ -0,0 +1,25 @@ +import json +import argparse + +parser = argparse.ArgumentParser(description='Bingbong') +parser.add_argument('--proposal-path', type=str, help='Path to the proposal json file') +parser.add_argument('--wasm-path', type=str, help='Path to the wasm code to attach as proposal data') + +args = parser.parse_args() + +wasm_path = args.wasm_path +with open(wasm_path, 'rb') as f: + wasm_bytes = list(f.read()) + +proposal_path = args.proposal_path.strip().replace(" ", "") + +print("Proposal path: ", proposal_path) +with open(proposal_path, 'r') as f: + proposal = json.load(f) + +proposal['data'] = wasm_bytes +new_proposal_path = proposal_path.replace(".json", "_edited.json") +with open(new_proposal_path, 'w') as f: + json.dump(proposal, f) + +print(f"Add wasm to {proposal_path}") \ No newline at end of file From 334f6881c26ccb3a5754d516452a69e96b28ddab Mon Sep 17 00:00:00 2001 From: brentstone Date: Mon, 1 Jul 2024 23:01:37 -0700 Subject: [PATCH 4/8] template proposal --- scripts/template_proposal.json | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 scripts/template_proposal.json diff --git a/scripts/template_proposal.json b/scripts/template_proposal.json new file mode 100644 index 0000000000..b4be1967d8 --- /dev/null +++ b/scripts/template_proposal.json @@ -0,0 +1,21 @@ +{ + "proposal": { + "content": { + "title": "XXX", + "authors": "XXX, XXX", + "discussions-to": "XXX@YYY.ZZZ", + "created": "YYYY-MM-DDTHH:MM:SSZ", + "abstract": "XXX", + "motivation": "XXX", + "details": "XXX", + "requires": "0" + }, + "author": "tnamXXX", + "voting_start_epoch": 0, + "voting_end_epoch": 0, + "activation_epoch": 0 + }, + "data": [ + 0 + ] +} From 2fb1eb4afce9e8d1582f304d977d7308570f5431 Mon Sep 17 00:00:00 2001 From: brentstone Date: Wed, 17 Jul 2024 20:49:50 -0700 Subject: [PATCH 5/8] improve logging --- crates/node/src/shell/governance.rs | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/crates/node/src/shell/governance.rs b/crates/node/src/shell/governance.rs index fefa43fa55..39a01c049e 100644 --- a/crates/node/src/shell/governance.rs +++ b/crates/node/src/shell/governance.rs @@ -132,8 +132,7 @@ where proposal_code.clone(), )?; tracing::info!( - "Default Governance proposal {} has been executed \ - and passed.", + "Governance proposal #{} (default) has passed.", id, ); @@ -149,8 +148,8 @@ where proposal_code.clone(), )?; tracing::info!( - "DefaultWithWasm Governance proposal {} has been \ - executed and passed, wasm executiong was {}.", + "Governance proposal #{} (default with wasm) has \ + passed and been executed, wasm execution: {}.", id, if result { "successful" } else { "unsuccessful" } ); @@ -186,8 +185,8 @@ where id, )?; tracing::info!( - "Governance proposal (pgf funding) {} has been \ - executed and passed.", + "Governance proposal #{} for PGF funding has \ + passed and been executed.", id ); @@ -529,8 +528,8 @@ where StoragePgfFunding::new(target.clone(), proposal_id), )?; tracing::info!( - "Added/Updated ContinuousPgf from proposal id {}: set \ - {} to {}.", + "Added/Updated Continuous PGF from proposal id {}: \ + set {} to {}.", proposal_id, target.amount().to_string_native(), target.target() @@ -540,8 +539,8 @@ where pgf_storage::fundings_handle() .remove(state, &target.target())?; tracing::info!( - "Removed ContinuousPgf from proposal id {}: set {} to \ - {}.", + "Removed Continuous PGF from proposal id {}: set {} \ + to {}.", proposal_id, target.amount().to_string_native(), target.target() @@ -593,8 +592,8 @@ where match result { Ok(()) => { tracing::info!( - "Execute RetroPgf from proposal id {}: sent {} to \ - {}.", + "Execute Retroactive PGF from proposal id {}: \ + sent {} to {}.", proposal_id, target.amount().to_string_native(), target.target() @@ -602,8 +601,8 @@ where events.emit(event); } Err(e) => tracing::warn!( - "Error in RetroPgf transfer from proposal id {}, \ - amount {} to {}: {}", + "Error in Retroactive PGF transfer from proposal id \ + {}, amount {} to {}: {}", proposal_id, target.amount().to_string_native(), target.target(), From 782cef14acf4bbc11e00c8b611fd7a2aa744192a Mon Sep 17 00:00:00 2001 From: brentstone Date: Wed, 17 Jul 2024 23:14:47 -0700 Subject: [PATCH 6/8] aesthetic improvement --- crates/apps_lib/src/cli.rs | 4 +- .../apps_lib/src/config/genesis/templates.rs | 4 +- crates/governance/src/cli/onchain.rs | 40 +++++++++---------- crates/governance/src/cli/validation.rs | 4 +- crates/governance/src/pgf/inflation.rs | 10 +++-- crates/governance/src/pgf/mod.rs | 12 +++--- crates/governance/src/pgf/storage/mod.rs | 4 +- crates/governance/src/pgf/storage/steward.rs | 2 +- crates/sdk/src/queries/vp/pgf.rs | 2 +- 9 files changed, 43 insertions(+), 39 deletions(-) diff --git a/crates/apps_lib/src/cli.rs b/crates/apps_lib/src/cli.rs index 2ddab6dfb4..02e6a09aa2 100644 --- a/crates/apps_lib/src/cli.rs +++ b/crates/apps_lib/src/cli.rs @@ -1290,7 +1290,7 @@ pub mod cmds { fn def() -> App { App::new(Self::CMD) - .about(wrap!("Query pgf stewards and continuous funding.")) + .about(wrap!("Query PGF stewards and continuous funding.")) .add_args::>() } } @@ -5618,7 +5618,7 @@ pub mod args { .def() .help(wrap!( "Flag if the proposal is of type pgf-funding. \ - Used to control continuous/retro pgf fundings." + Used to control continuous/retro PGF fundings." )) .conflicts_with_all([ PROPOSAL_ETH.name, diff --git a/crates/apps_lib/src/config/genesis/templates.rs b/crates/apps_lib/src/config/genesis/templates.rs index 75aea23917..253fda8268 100644 --- a/crates/apps_lib/src/config/genesis/templates.rs +++ b/crates/apps_lib/src/config/genesis/templates.rs @@ -465,9 +465,9 @@ pub struct GovernanceParams { pub struct PgfParams { /// The set of stewards pub stewards: BTreeSet
, - /// The pgf funding inflation rate + /// The PGF funding inflation rate pub pgf_inflation_rate: Dec, - /// The pgf stewards inflation rate + /// The PGF stewards inflation rate pub stewards_inflation_rate: Dec, /// The maximum allowed number of PGF stewards at any time pub maximum_number_of_stewards: u64, diff --git a/crates/governance/src/cli/onchain.rs b/crates/governance/src/cli/onchain.rs index 9c4a1d8452..f904ef0094 100644 --- a/crates/governance/src/cli/onchain.rs +++ b/crates/governance/src/cli/onchain.rs @@ -42,7 +42,7 @@ pub struct OnChainProposal { pub activation_epoch: Epoch, } -/// Pgf default proposal +/// PGF default proposal #[derive( Debug, Clone, @@ -119,16 +119,16 @@ impl TryFrom<&[u8]> for DefaultProposal { } } -/// Pgf stewards proposal +/// PGF stewards proposal #[derive(Debug, Clone, Serialize, Deserialize)] pub struct PgfStewardProposal { /// The proposal data pub proposal: OnChainProposal, - /// The Pgf steward proposal extra data + /// The PGF steward proposal extra data pub data: StewardsUpdate, } -/// Pgf steward proposal extra data +/// PGF steward proposal extra data #[derive(Debug, Clone, Serialize, Deserialize)] pub struct StewardsUpdate { /// The optional steward to add @@ -138,7 +138,7 @@ pub struct StewardsUpdate { } impl PgfStewardProposal { - /// Validate a Pgf stewards proposal + /// Validate a PGF stewards proposal pub fn validate( self, governance_parameters: &GovernanceParameters, @@ -194,7 +194,7 @@ impl TryFrom<&[u8]> for PgfStewardProposal { } } -/// Pgf funding proposal +/// PGF funding proposal #[derive( Debug, Clone, @@ -207,12 +207,12 @@ impl TryFrom<&[u8]> for PgfStewardProposal { pub struct PgfFundingProposal { /// The proposal data pub proposal: OnChainProposal, - /// The Pgf funding proposal extra data + /// The PGF funding proposal extra data pub data: PgfFunding, } impl PgfFundingProposal { - /// Validate a Pgf funding proposal + /// Validate a PGF funding proposal pub fn validate( self, governance_parameters: &GovernanceParameters, @@ -263,7 +263,7 @@ impl TryFrom<&[u8]> for PgfFundingProposal { } } -/// Pgf stewards +/// PGF stewards #[derive( Debug, Clone, @@ -274,13 +274,13 @@ impl TryFrom<&[u8]> for PgfFundingProposal { Deserialize, )] pub struct PgfSteward { - /// Pgf action + /// PGF action pub action: PgfAction, /// steward address pub address: Address, } -/// Pgf action +/// PGF action #[derive( Debug, Clone, @@ -298,13 +298,13 @@ pub enum PgfAction { } impl PgfAction { - /// Check if a pgf action is adding a steward + /// Check if a PGF action is adding a steward pub fn is_add(&self) -> bool { matches!(self, PgfAction::Add) } } -/// Pgf funding +/// PGF funding #[derive( Debug, Clone, @@ -315,9 +315,9 @@ impl PgfAction { Deserialize, )] pub struct PgfFunding { - /// Pgf continuous funding + /// PGF continuous funding pub continuous: Vec, - /// pgf retro fundings + /// PGF retro fundings pub retro: Vec, } @@ -339,7 +339,7 @@ impl Display for PgfFunding { } } -/// Pgf continuous funding +/// PGF continuous funding #[derive( Debug, Clone, @@ -350,13 +350,13 @@ impl Display for PgfFunding { Deserialize, )] pub struct PgfContinuous { - /// Pgf target + /// PGF target pub target: PGFTarget, - /// Pgf action + /// PGF action pub action: PgfAction, } -/// Pgf retro funding +/// PGF retro funding #[derive( Debug, Clone, @@ -367,6 +367,6 @@ pub struct PgfContinuous { Deserialize, )] pub struct PgfRetro { - /// Pgf retro target + /// PGF retro target pub target: PGFTarget, } diff --git a/crates/governance/src/cli/validation.rs b/crates/governance/src/cli/validation.rs index e2dea7f907..90982a6077 100644 --- a/crates/governance/src/cli/validation.rs +++ b/crates/governance/src/cli/validation.rs @@ -58,10 +58,10 @@ pub enum ProposalValidation { ({0}) is to big (max {1})" )] InvalidDefaultProposalExtraData(u64, u64), - /// The pgf stewards data is not valid + /// The PGF stewards data is not valid #[error("Invalid proposal extra data: cannot be empty.")] InvalidPgfStewardsExtraData, - /// The pgf funding data is not valid + /// The PGF funding data is not valid #[error("invalid proposal extra data: cannot be empty.")] InvalidPgfFundingExtraData, #[error("Arithmetic {0}.")] diff --git a/crates/governance/src/pgf/inflation.rs b/crates/governance/src/pgf/inflation.rs index da0154d382..e3c2e64a66 100644 --- a/crates/governance/src/pgf/inflation.rs +++ b/crates/governance/src/pgf/inflation.rs @@ -5,7 +5,9 @@ use namada_parameters::storage as params_storage; use namada_storage::{Result, StorageRead, StorageWrite}; use namada_trans_token::{credit_tokens, get_effective_total_native_supply}; -use crate::pgf::storage::{get_parameters, get_payments, get_stewards}; +use crate::pgf::storage::{ + get_continuous_pgf_payments, get_parameters, get_stewards, +}; use crate::storage::proposal::{PGFIbcTarget, PGFTarget}; /// Apply the PGF inflation. @@ -44,8 +46,8 @@ where total_supply.to_string_native() ); - let mut pgf_fundings = get_payments(storage)?; - // we want to pay first the oldest fundings + let mut pgf_fundings = get_continuous_pgf_payments(storage)?; + // prioritize the payments by oldest gov proposal ID pgf_fundings.sort_by(|a, b| a.id.cmp(&b.id)); for funding in pgf_fundings { @@ -82,7 +84,7 @@ where } } - // Pgf steward inflation + // PGF steward inflation let stewards = get_stewards(storage)?; let pgf_steward_inflation = total_supply .mul_floor(pgf_parameters.stewards_inflation_rate)? diff --git a/crates/governance/src/pgf/mod.rs b/crates/governance/src/pgf/mod.rs index 22592625cf..f0de680e7c 100644 --- a/crates/governance/src/pgf/mod.rs +++ b/crates/governance/src/pgf/mod.rs @@ -1,17 +1,17 @@ -//! Pgf library code +//! PGF library code use namada_core::address::{Address, InternalAddress}; -/// Pgf CLI +/// PGF CLI pub mod cli; -/// Pgf inflation code +/// PGF inflation code pub mod inflation; -/// Pgf parameters +/// PGF parameters pub mod parameters; -/// Pgf storage +/// PGF storage pub mod storage; -/// The Pgf internal address +/// The PGF internal address pub const ADDRESS: Address = Address::Internal(InternalAddress::Pgf); /// Upper limit on the number of reward distribution per steawrd diff --git a/crates/governance/src/pgf/storage/mod.rs b/crates/governance/src/pgf/storage/mod.rs index 7dbd54f2c1..df81e6974e 100644 --- a/crates/governance/src/pgf/storage/mod.rs +++ b/crates/governance/src/pgf/storage/mod.rs @@ -61,7 +61,9 @@ where } /// Query the current pgf continuous payments -pub fn get_payments(storage: &S) -> Result> +pub fn get_continuous_pgf_payments( + storage: &S, +) -> Result> where S: StorageRead, { diff --git a/crates/governance/src/pgf/storage/steward.rs b/crates/governance/src/pgf/storage/steward.rs index 3d14aa7426..d0363cbcc7 100644 --- a/crates/governance/src/pgf/storage/steward.rs +++ b/crates/governance/src/pgf/storage/steward.rs @@ -11,7 +11,7 @@ use crate::pgf::REWARD_DISTRIBUTION_LIMIT; #[derive( Clone, Debug, BorshSerialize, BorshDeserialize, BorshDeserializer, PartialEq, )] -/// Struct holding data about a pgf steward +/// Struct holding data about a PGF steward pub struct StewardDetail { /// The steward address pub address: Address, diff --git a/crates/sdk/src/queries/vp/pgf.rs b/crates/sdk/src/queries/vp/pgf.rs index 7a4dbf0673..6276043a50 100644 --- a/crates/sdk/src/queries/vp/pgf.rs +++ b/crates/sdk/src/queries/vp/pgf.rs @@ -45,7 +45,7 @@ where D: 'static + DB + for<'iter> DBIter<'iter> + Sync, H: 'static + StorageHasher + Sync, { - namada_governance::pgf::storage::get_payments(ctx.state) + namada_governance::pgf::storage::get_continuous_pgf_payments(ctx.state) } /// Query the PGF parameters From 4fe716d6b0f44f0946b930cd400888f38955644b Mon Sep 17 00:00:00 2001 From: brentstone Date: Thu, 18 Jul 2024 19:40:23 -0700 Subject: [PATCH 7/8] update template proposals --- ...al.json => default_proposal_template.json} | 6 ++-- scripts/funding_proposal_template.json | 36 +++++++++++++++++++ scripts/steward_proposal_template.json | 22 ++++++++++++ 3 files changed, 60 insertions(+), 4 deletions(-) rename scripts/{template_proposal.json => default_proposal_template.json} (94%) create mode 100644 scripts/funding_proposal_template.json create mode 100644 scripts/steward_proposal_template.json diff --git a/scripts/template_proposal.json b/scripts/default_proposal_template.json similarity index 94% rename from scripts/template_proposal.json rename to scripts/default_proposal_template.json index b4be1967d8..af529aa5eb 100644 --- a/scripts/template_proposal.json +++ b/scripts/default_proposal_template.json @@ -15,7 +15,5 @@ "voting_end_epoch": 0, "activation_epoch": 0 }, - "data": [ - 0 - ] -} + "data": [] +} \ No newline at end of file diff --git a/scripts/funding_proposal_template.json b/scripts/funding_proposal_template.json new file mode 100644 index 0000000000..9e8b288e18 --- /dev/null +++ b/scripts/funding_proposal_template.json @@ -0,0 +1,36 @@ +{ + "proposal": { + "content": { + "title": "XXX", + "authors": "XXX, XXX", + "discussions-to": "XXX@YYY.ZZZ", + "created": "YYYY-MM-DDTHH:MM:SSZ", + "abstract": "XXX", + "motivation": "XXX", + "details": "XXX", + "requires": "0" + }, + "author": "tnamXXX", + "voting_start_epoch": 0, + "voting_end_epoch": 0, + "activation_epoch": 0 + }, + "data": { + "continuous/retro": [ + { + "Internal": { + "amount": "0", + "target": "tnamXXX" + } + }, + { + "IBC": { + "amount": "0", + "target": "", + "port_id": "", + "channel_id": "" + } + } + ] + } +} \ No newline at end of file diff --git a/scripts/steward_proposal_template.json b/scripts/steward_proposal_template.json new file mode 100644 index 0000000000..e50a57c188 --- /dev/null +++ b/scripts/steward_proposal_template.json @@ -0,0 +1,22 @@ +{ + "proposal": { + "content": { + "title": "XXX", + "authors": "XXX, XXX", + "discussions-to": "XXX@YYY.ZZZ", + "created": "YYYY-MM-DDTHH:MM:SSZ", + "abstract": "XXX", + "motivation": "XXX", + "details": "XXX", + "requires": "0" + }, + "author": "tnamXXX", + "voting_start_epoch": 0, + "voting_end_epoch": 0, + "activation_epoch": 0 + }, + "data": { + "add": "", + "remove": [] + } +} \ No newline at end of file From 7794f6e5146820e795bc06cbf238574850a5afb2 Mon Sep 17 00:00:00 2001 From: brentstone Date: Thu, 18 Jul 2024 19:44:44 -0700 Subject: [PATCH 8/8] changelog: add #3471 --- .../unreleased/improvements/3471-remove-gov-prop-id-input.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .changelog/unreleased/improvements/3471-remove-gov-prop-id-input.md diff --git a/.changelog/unreleased/improvements/3471-remove-gov-prop-id-input.md b/.changelog/unreleased/improvements/3471-remove-gov-prop-id-input.md new file mode 100644 index 0000000000..cb70c2a249 --- /dev/null +++ b/.changelog/unreleased/improvements/3471-remove-gov-prop-id-input.md @@ -0,0 +1,3 @@ +- Minor improvements to governance and PGF code quality, including + template gov proposal jsons and a python script to attach wasm code. + ([\#3471](https://github.com/anoma/namada/pull/3471)) \ No newline at end of file