Explorar o código

lang: Mutate instead returning new one in `CpiAccount::reload` (#527)

Kirill Fomichev %!s(int64=4) %!d(string=hai) anos
pai
achega
5d0ae3a9f8

+ 4 - 0
CHANGELOG.md

@@ -11,6 +11,10 @@ incremented for features.
 
 ## [Unreleased]
 
+### Breaking Changes
+
+* lang: `CpiAccount::reload` mutates the existing struct instead of returning a new one ([#526](https://github.com/project-serum/anchor/pull/526)).
+
 ## [0.11.1] - 2021-07-09
 
 ### Features

+ 1 - 1
examples/cfo/deps/stake

@@ -1 +1 @@
-Subproject commit a72e59a9b263b7e083af737669f12f5e3ee1997c
+Subproject commit 3dc83f47b66a8a4189a637368c49dca1341c6b23

+ 4 - 2
examples/lockup/programs/lockup/src/lib.rs

@@ -142,7 +142,8 @@ pub mod lockup {
             ctx.remaining_accounts,
             instruction_data,
         )?;
-        let after_amount = ctx.accounts.transfer.vault.reload()?.amount;
+        ctx.accounts.transfer.vault.reload()?;
+        let after_amount = ctx.accounts.transfer.vault.amount;
 
         // CPI safety checks.
         let withdraw_amount = before_amount - after_amount;
@@ -167,7 +168,8 @@ pub mod lockup {
             ctx.remaining_accounts,
             instruction_data,
         )?;
-        let after_amount = ctx.accounts.transfer.vault.reload()?.amount;
+        ctx.accounts.transfer.vault.reload()?;
+        let after_amount = ctx.accounts.transfer.vault.amount;
 
         // CPI safety checks.
         let deposit_amount = after_amount - before_amount;

+ 4 - 7
lang/src/cpi_account.rs

@@ -36,13 +36,10 @@ impl<'a, T: AccountDeserialize + Clone> CpiAccount<'a, T> {
 
     /// Reloads the account from storage. This is useful, for example, when
     /// observing side effects after CPI.
-    pub fn reload(&self) -> Result<CpiAccount<'a, T>, ProgramError> {
-        let info = self.to_account_info();
-        let mut data: &[u8] = &info.try_borrow_data()?;
-        Ok(CpiAccount::new(
-            info.clone(),
-            Box::new(T::try_deserialize(&mut data)?),
-        ))
+    pub fn reload(&mut self) -> ProgramResult {
+        let mut data: &[u8] = &self.info.try_borrow_data()?;
+        self.account = Box::new(T::try_deserialize(&mut data)?);
+        Ok(())
     }
 }