From a2a5dc231bcc63901bff9057b6c8787f949b0d12 Mon Sep 17 00:00:00 2001 From: Kirill Fomichev Date: Sun, 2 Jan 2022 18:19:31 +0300 Subject: [PATCH 1/5] allow to drop tx after execution --- programs/multisig/src/lib.rs | 31 +++++++++++++++++++++++++++++++ tests/multisig.js | 3 ++- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/programs/multisig/src/lib.rs b/programs/multisig/src/lib.rs index 192c3bb..0bcbb8a 100644 --- a/programs/multisig/src/lib.rs +++ b/programs/multisig/src/lib.rs @@ -54,6 +54,7 @@ pub mod serum_multisig { pid: Pubkey, accs: Vec, data: Vec, + successor: Option, ) -> Result<()> { let owner_index = ctx .accounts @@ -75,6 +76,7 @@ pub mod serum_multisig { tx.multisig = *ctx.accounts.multisig.to_account_info().key; tx.did_execute = false; tx.owner_set_seqno = ctx.accounts.multisig.owner_set_seqno; + tx.successor = successor; Ok(()) } @@ -183,6 +185,17 @@ pub mod serum_multisig { Ok(()) } + + // Move transaction rent exemption SOL + pub fn drop_transaction(ctx: Context) -> Result<()> { + let tx = ctx.accounts.transaction.to_account_info(); + let mut tx_balance = tx.try_borrow_mut_lamports()?; + let successor = ctx.accounts.successor.to_account_info(); + let mut successor_balance = successor.try_borrow_mut_lamports()?; + **successor_balance = (**successor_balance).checked_add(**tx_balance).unwrap(); + **tx_balance = 0; + Ok(()) + } } #[derive(Accounts)] @@ -239,6 +252,20 @@ pub struct ExecuteTransaction<'info> { transaction: ProgramAccount<'info, Transaction>, } +#[derive(Accounts)] +pub struct DropTransaction<'info> { + multisig: ProgramAccount<'info, Multisig>, + #[account( + mut, + has_one = multisig, + constraint = transaction.did_execute == true, + constraint = transaction.successor == Some(*successor.key), + )] + transaction: ProgramAccount<'info, Transaction>, + #[account(mut)] + successor: AccountInfo<'info>, +} + #[account] pub struct Multisig { pub owners: Vec, @@ -263,6 +290,8 @@ pub struct Transaction { pub did_execute: bool, // Owner set sequence number. pub owner_set_seqno: u32, + // Account which receive rent exemption SOL after transaction executing. + pub successor: Option, } impl From<&Transaction> for Instruction { @@ -329,4 +358,6 @@ pub enum ErrorCode { InvalidThreshold, #[msg("Owners must be unique")] UniqueOwners, + #[msg("Invalid successor account.")] + InvalidSuccessor, } diff --git a/tests/multisig.js b/tests/multisig.js index 24959a7..a02238d 100644 --- a/tests/multisig.js +++ b/tests/multisig.js @@ -65,7 +65,7 @@ describe("multisig", () => { const transaction = anchor.web3.Keypair.generate(); const txSize = 1000; // Big enough, cuz I'm lazy. - await program.rpc.createTransaction(pid, accounts, data, { + await program.rpc.createTransaction(pid, accounts, data, null, { accounts: { multisig: multisig.publicKey, transaction: transaction.publicKey, @@ -89,6 +89,7 @@ describe("multisig", () => { assert.ok(txAccount.multisig.equals(multisig.publicKey)); assert.deepStrictEqual(txAccount.didExecute, false); assert.ok(txAccount.ownerSetSeqno === 0); + assert.deepStrictEqual(txAccount.successor, null); // Other owner approves transactoin. await program.rpc.approve({ From 57295f1ce179ac190c7713fccd3674fe9dfc58fe Mon Sep 17 00:00:00 2001 From: Kirill Fomichev Date: Thu, 3 Feb 2022 21:40:01 +0300 Subject: [PATCH 2/5] update bool constraint --- programs/multisig/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/programs/multisig/src/lib.rs b/programs/multisig/src/lib.rs index 9e3236c..9cf3f26 100644 --- a/programs/multisig/src/lib.rs +++ b/programs/multisig/src/lib.rs @@ -259,7 +259,7 @@ pub struct DropTransaction<'info> { #[account( mut, has_one = multisig, - constraint = transaction.did_execute == true, + constraint = transaction.did_execute, constraint = transaction.successor == Some(*successor.key), )] transaction: ProgramAccount<'info, Transaction>, From fde806dd1d308538fb5d9a66d33f727118261064 Mon Sep 17 00:00:00 2001 From: Kirill Fomichev Date: Thu, 3 Feb 2022 21:43:25 +0300 Subject: [PATCH 3/5] Account instead of ProgramAccount --- programs/multisig/src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/programs/multisig/src/lib.rs b/programs/multisig/src/lib.rs index 9cf3f26..a39ba82 100644 --- a/programs/multisig/src/lib.rs +++ b/programs/multisig/src/lib.rs @@ -255,14 +255,14 @@ pub struct ExecuteTransaction<'info> { #[derive(Accounts)] pub struct DropTransaction<'info> { - multisig: ProgramAccount<'info, Multisig>, + multisig: Account<'info, Multisig>, #[account( mut, has_one = multisig, constraint = transaction.did_execute, constraint = transaction.successor == Some(*successor.key), )] - transaction: ProgramAccount<'info, Transaction>, + transaction: Account<'info, Transaction>, #[account(mut)] successor: AccountInfo<'info>, } From 72c53311c39e4e983b9accaf89aeeeac6b2c938c Mon Sep 17 00:00:00 2001 From: Kirill Fomichev Date: Thu, 10 Feb 2022 18:45:26 +0300 Subject: [PATCH 4/5] add box aroud account --- programs/multisig/src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/programs/multisig/src/lib.rs b/programs/multisig/src/lib.rs index 2eef06f..33f633f 100644 --- a/programs/multisig/src/lib.rs +++ b/programs/multisig/src/lib.rs @@ -256,14 +256,14 @@ pub struct ExecuteTransaction<'info> { #[derive(Accounts)] pub struct DropTransaction<'info> { - multisig: Account<'info, Multisig>, + multisig: Box>, #[account( mut, has_one = multisig, constraint = transaction.did_execute, constraint = transaction.successor == Some(*successor.key), )] - transaction: Account<'info, Transaction>, + transaction: Box>, #[account(mut)] successor: AccountInfo<'info>, } From fb99cb872cc59cae071695f1accf524f997595cd Mon Sep 17 00:00:00 2001 From: Kirill Fomichev Date: Thu, 10 Feb 2022 21:16:54 +0300 Subject: [PATCH 5/5] remove multisig account --- programs/multisig/src/lib.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/programs/multisig/src/lib.rs b/programs/multisig/src/lib.rs index 33f633f..cabf304 100644 --- a/programs/multisig/src/lib.rs +++ b/programs/multisig/src/lib.rs @@ -256,10 +256,8 @@ pub struct ExecuteTransaction<'info> { #[derive(Accounts)] pub struct DropTransaction<'info> { - multisig: Box>, #[account( mut, - has_one = multisig, constraint = transaction.did_execute, constraint = transaction.successor == Some(*successor.key), )]