Skip to content

Commit 9342c64

Browse files
authored
Merge pull request #198 from confio/fix/auto-release-undelegate
Fix claims auto-release of vesting amounts
2 parents c8134a7 + 624bbd2 commit 9342c64

File tree

2 files changed

+476
-34
lines changed

2 files changed

+476
-34
lines changed

contracts/tg4-stake/src/claim.rs

+41-6
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,18 @@ use tg_utils::Expiration;
1515
const MAX_LIMIT: u32 = 100;
1616
const DEFAULT_LIMIT: u32 = 30;
1717

18+
#[derive(Clone, Debug, PartialEq, Eq)]
19+
pub(crate) struct TokenReleaseInfo {
20+
pub addr: Addr,
21+
pub amount: Uint128,
22+
}
23+
24+
#[derive(Clone, Debug, PartialEq, Eq)]
25+
pub(crate) struct ReleaseData {
26+
pub liquid_releases: Vec<TokenReleaseInfo>,
27+
pub vesting_releases: Vec<TokenReleaseInfo>,
28+
}
29+
1830
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)]
1931
pub struct Claim {
2032
/// Address owning the claim
@@ -154,13 +166,14 @@ impl<'a> Claims<'a> {
154166

155167
/// This iterates over all mature claims of any addresses, and removes them. Up to `limit`
156168
/// claims would be processed, starting from the oldest. It removes the finished claims and
157-
/// returns vector of pairs: `(addr, amount)`, representing amount of tokens to be released to particular addresses
158-
pub fn claim_expired(
169+
/// returns a pair of vectors representing the amounts of liquid and vesting tokens
170+
/// to be released to particular addresses.
171+
pub(crate) fn claim_expired(
159172
&self,
160173
storage: &mut dyn Storage,
161174
block: &BlockInfo,
162175
limit: impl Into<Option<u64>>,
163-
) -> StdResult<Vec<(Addr, Uint128)>> {
176+
) -> StdResult<ReleaseData> {
164177
let claims = self
165178
.claims
166179
.idx
@@ -176,18 +189,40 @@ impl<'a> Claims<'a> {
176189
let mut claims = self.collect_claims(claims, limit.into())?;
177190
claims.sort_by_key(|claim| claim.addr.clone());
178191

179-
let releases = claims
192+
let liquid_releases = claims
180193
.iter()
181194
// TODO: use `slice::group_by` in place of `Itertools::group_by` when `slice_group_by`
182195
// is stabilized [https://github.com/rust-lang/rust/issues/80552]
183196
.group_by(|claim| &claim.addr)
184197
.into_iter()
185-
.map(|(addr, group)| (addr.clone(), group.map(|claim| claim.amount).sum()))
198+
.map(|(addr, group)| TokenReleaseInfo {
199+
addr: addr.clone(),
200+
amount: group.map(|claim| claim.amount).sum(),
201+
})
202+
.collect();
203+
204+
let vesting_releases = claims
205+
.iter()
206+
// TODO: use `slice::group_by` in place of `Itertools::group_by` when `slice_group_by`
207+
// is stabilized [https://github.com/rust-lang/rust/issues/80552]
208+
.group_by(|claim| &claim.addr)
209+
.into_iter()
210+
.map(|(addr, group)| TokenReleaseInfo {
211+
addr: addr.clone(),
212+
amount: group
213+
.map(|claim| claim.vesting_amount.unwrap_or_default())
214+
.sum(),
215+
})
186216
.collect();
187217

188218
self.release_claims(storage, claims)?;
189219

190-
Ok(releases)
220+
let release_data = ReleaseData {
221+
liquid_releases,
222+
vesting_releases,
223+
};
224+
225+
Ok(release_data)
191226
}
192227

193228
/// Processes claims filtering those which are to be released. Returns vector of claims to be

0 commit comments

Comments
 (0)