Skip to content

Commit

Permalink
Merge pull request #118 from confio/22-valset-tie-breaking-3
Browse files Browse the repository at this point in the history
Valset tie-breaking
  • Loading branch information
maurolacy committed Apr 1, 2022
2 parents e45409d + dc2a9e1 commit 1d3d49f
Show file tree
Hide file tree
Showing 19 changed files with 499 additions and 83 deletions.
112 changes: 81 additions & 31 deletions contracts/tg4-engagement/src/contract.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ use cw2::set_contract_version;
use cw_storage_plus::Bound;
use cw_utils::maybe_addr;
use tg4::{
HooksResponse, Member, MemberChangedHookMsg, MemberDiff, MemberListResponse, MemberResponse,
TotalPointsResponse,
HooksResponse, Member, MemberChangedHookMsg, MemberDiff, MemberInfo, MemberListResponse,
MemberResponse, TotalPointsResponse,
};

use crate::error::ContractError;
Expand Down Expand Up @@ -101,7 +101,12 @@ pub fn create<Q: CustomQuery>(
for member in members_list.into_iter() {
total += member.points;
let member_addr = deps.api.addr_validate(&member.addr)?;
members().save(deps.storage, &member_addr, &member.points, height)?;
members().save(
deps.storage,
&member_addr,
&MemberInfo::new(member.points),
height,
)?;

let adjustment = WithdrawAdjustment {
shares_correction: 0i128.into(),
Expand Down Expand Up @@ -163,17 +168,16 @@ pub fn execute_add_points<Q: CustomQuery>(

ADMIN.assert_admin(deps.as_ref(), &info.sender)?;

let old_points = query_member(deps.as_ref(), addr.clone(), None)?
.points
.unwrap_or_default();
let old_points = query_member(deps.as_ref(), addr.clone(), None)?;

// make the local update
let diff = update_members(
deps.branch(),
env.block.height,
vec![Member {
addr,
points: old_points + points,
points: old_points.points.unwrap_or_default() + points,
start_height: old_points.start_height,
}],
vec![],
)?;
Expand Down Expand Up @@ -466,7 +470,7 @@ pub fn execute_slash<Q: CustomQuery>(
env.block.height,
|old| -> StdResult<_> {
let old = match old {
Some(old) => Uint128::new(old as _),
Some(old) => Uint128::new(old.points as _),
None => Uint128::zero(),
};

Expand All @@ -475,7 +479,7 @@ pub fn execute_slash<Q: CustomQuery>(

diff = -(slash.u128() as i128);

Ok(new.u128() as _)
Ok(MemberInfo::new(new.u128() as _))
},
)?;
apply_points_correction(deps.branch(), &addr, ppw, diff)?;
Expand Down Expand Up @@ -503,6 +507,7 @@ pub fn withdrawable_rewards<Q: CustomQuery>(
let points: u128 = members()
.may_load(deps.storage, owner)?
.unwrap_or_default()
.points
.into();
let correction: i128 = adjustment.shares_correction.into();
let withdrawn: u128 = adjustment.withdrawn_rewards.into();
Expand Down Expand Up @@ -552,13 +557,17 @@ pub fn update_members<Q: CustomQuery>(
let mut diff = 0;
let mut insert_funds = false;
members().update(deps.storage, &add_addr, height, |old| -> StdResult<_> {
diffs.push(MemberDiff::new(add.addr, old, Some(add.points)));
diffs.push(MemberDiff::new(
add.addr,
old.as_ref().map(|mi| mi.points),
Some(add.points),
));
insert_funds = old.is_none();
let old = old.unwrap_or_default();
total -= old;
total -= old.points;
total += add.points;
diff = add.points as i128 - old as i128;
Ok(add.points)
diff = add.points as i128 - old.points as i128;
Ok(MemberInfo::new(add.points))
})?;
apply_points_correction(deps.branch(), &add_addr, ppw, diff)?;
}
Expand All @@ -567,7 +576,7 @@ pub fn update_members<Q: CustomQuery>(
let remove_addr = deps.api.addr_validate(&remove)?;
let old = members().may_load(deps.storage, &remove_addr)?;
// Only process this if they were actually in the list before
if let Some(points) = old {
if let Some(MemberInfo { points, .. }) = old {
diffs.push(MemberDiff::new(remove, Some(points), None));
total -= points;
members().remove(deps.storage, &remove_addr, height)?;
Expand Down Expand Up @@ -645,13 +654,20 @@ fn end_block<Q: CustomQuery>(mut deps: DepsMut<Q>, env: Env) -> Result<Response,
.range(deps.storage, None, None, Order::Ascending)
.filter_map(|item| {
(move || -> StdResult<Option<_>> {
let (addr, points) = item?;
let (
addr,
MemberInfo {
points,
start_height,
},
) = item?;
if points <= 1 {
return Ok(None);
}
Ok(Some(Member {
addr: addr.into(),
points,
start_height,
}))
})()
.transpose()
Expand All @@ -665,8 +681,8 @@ fn end_block<Q: CustomQuery>(mut deps: DepsMut<Q>, env: Env) -> Result<Response,
members().replace(
deps.storage,
&addr,
Some(&(member.points - diff)),
Some(&member.points),
Some(&MemberInfo::new(member.points - diff)),
Some(&MemberInfo::new(member.points)),
env.block.height,
)?;
apply_points_correction(deps.branch(), &addr, ppw, -(diff as i128))?;
Expand Down Expand Up @@ -743,11 +759,11 @@ fn query_member<Q: CustomQuery>(
height: Option<u64>,
) -> StdResult<MemberResponse> {
let addr = deps.api.addr_validate(&addr)?;
let points = match height {
let mi = match height {
Some(h) => members().may_load_at_height(deps.storage, &addr, h),
None => members().may_load(deps.storage, &addr),
}?;
Ok(MemberResponse { points })
Ok(mi.into())
}

pub fn query_withdrawable_rewards<Q: CustomQuery>(
Expand Down Expand Up @@ -844,10 +860,17 @@ fn list_members<Q: CustomQuery>(
.range(deps.storage, start, None, Order::Ascending)
.take(limit)
.map(|item| {
let (addr, points) = item?;
let (
addr,
MemberInfo {
points,
start_height,
},
) = item?;
Ok(Member {
addr: addr.into(),
points,
start_height,
})
})
.collect();
Expand All @@ -874,10 +897,17 @@ fn list_members_by_points<Q: CustomQuery>(
.range(deps.storage, None, start, Order::Descending)
.take(limit)
.map(|item| {
let (addr, points) = item?;
let (
addr,
MemberInfo {
points,
start_height,
},
) = item?;
Ok(Member {
addr: addr.into(),
points,
start_height,
})
})
.collect();
Expand Down Expand Up @@ -926,10 +956,12 @@ mod tests {
Member {
addr: USER1.into(),
points: USER1_POINTS,
start_height: None,
},
Member {
addr: USER2.into(),
points: USER2_POINTS,
start_height: None,
},
],
preauths_hooks: 1,
Expand Down Expand Up @@ -1013,11 +1045,13 @@ mod tests {
vec![
Member {
addr: USER1.into(),
points: 11
points: 11,
start_height: None
},
Member {
addr: USER2.into(),
points: 6
points: 6,
start_height: None
},
]
);
Expand All @@ -1030,7 +1064,8 @@ mod tests {
members,
vec![Member {
addr: USER1.into(),
points: 11
points: 11,
start_height: None
},]
);

Expand All @@ -1045,7 +1080,8 @@ mod tests {
members,
vec![Member {
addr: USER2.into(),
points: 6
points: 6,
start_height: None
},]
);

Expand All @@ -1072,11 +1108,13 @@ mod tests {
vec![
Member {
addr: USER1.into(),
points: 11
points: 11,
start_height: None
},
Member {
addr: USER2.into(),
points: 6
points: 6,
start_height: None
}
]
);
Expand All @@ -1091,7 +1129,8 @@ mod tests {
members,
vec![Member {
addr: USER1.into(),
points: 11
points: 11,
start_height: None
},]
);

Expand All @@ -1106,7 +1145,8 @@ mod tests {
members,
vec![Member {
addr: USER2.into(),
points: 6
points: 6,
start_height: None
},]
);

Expand Down Expand Up @@ -1153,10 +1193,12 @@ mod tests {
Member {
addr: USER1.into(),
points: USER1_POINTS,
start_height: None,
},
Member {
addr: USER2.into(),
points: USER2_POINTS,
start_height: None,
},
],
preauths_hooks: 1,
Expand Down Expand Up @@ -1233,6 +1275,7 @@ mod tests {
let add = vec![Member {
addr: USER3.into(),
points: 15,
start_height: None,
}];
let remove = vec![USER1.into()];

Expand Down Expand Up @@ -1274,6 +1317,7 @@ mod tests {
let add = vec![Member {
addr: USER1.into(),
points: 4,
start_height: None,
}];
let remove = vec![USER3.into()];

Expand All @@ -1296,10 +1340,12 @@ mod tests {
Member {
addr: USER1.into(),
points: 20,
start_height: None,
},
Member {
addr: USER3.into(),
points: 5,
start_height: None,
},
];
let remove = vec![USER1.into()];
Expand All @@ -1321,6 +1367,7 @@ mod tests {
let add = Member {
addr: USER3.into(),
points: 15,
start_height: None,
};

let env = mock_env();
Expand Down Expand Up @@ -1356,6 +1403,7 @@ mod tests {
let add = Member {
addr: USER2.into(),
points: 1,
start_height: None,
};

let env = mock_env();
Expand Down Expand Up @@ -1489,10 +1537,12 @@ mod tests {
Member {
addr: USER1.into(),
points: 20,
start_height: None,
},
Member {
addr: USER3.into(),
points: 5,
start_height: None,
},
];
let remove = vec![USER2.into()];
Expand Down Expand Up @@ -1537,8 +1587,8 @@ mod tests {

// get member votes from raw key
let member2_raw = deps.storage.get(&member_key(USER2)).unwrap();
let member2: u64 = from_slice(&member2_raw).unwrap();
assert_eq!(6, member2);
let member2: MemberInfo = from_slice(&member2_raw).unwrap();
assert_eq!(6, member2.points);

// and execute misses
let member3_raw = deps.storage.get(&member_key(USER3));
Expand Down
3 changes: 2 additions & 1 deletion contracts/tg4-engagement/src/msg.rs
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,8 @@ mod tests {
assert_eq!(
SudoMsg::UpdateMember(Member {
addr: "xxx".to_string(),
points: 123
points: 123,
start_height: None
}),
cosmwasm_std::from_slice::<SudoMsg>(message.as_bytes()).unwrap()
);
Expand Down
1 change: 1 addition & 0 deletions contracts/tg4-engagement/src/multitest.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ fn member(addr: &str, points: u64) -> Member {
Member {
addr: addr.to_owned(),
points,
start_height: None,
}
}

Expand Down
3 changes: 3 additions & 0 deletions contracts/tg4-engagement/src/multitest/suite.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ pub fn expected_members(members: Vec<(&str, u64)>) -> Vec<Member> {
.map(|(addr, points)| Member {
addr: addr.to_owned(),
points,
start_height: None,
})
.collect()
}
Expand All @@ -46,6 +47,7 @@ impl SuiteBuilder {
self.members.push(Member {
addr: addr.to_owned(),
points,
start_height: None,
});
self
}
Expand Down Expand Up @@ -212,6 +214,7 @@ impl Suite {
.map(|(addr, points)| Member {
addr: (*addr).to_owned(),
points: *points,
start_height: None,
})
.collect();

Expand Down
Loading

0 comments on commit 1d3d49f

Please sign in to comment.