Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Valset tie-breaking #3 #118

Merged
merged 26 commits into from
Apr 1, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
99f1fe4
Add `MemberInfo` to tg4
Feb 23, 2022
f4e6ead
Store members points / start heights using `MemberInfo`
Feb 23, 2022
4e78730
Adapt raw tg4 member query to new format
Feb 23, 2022
96d0d43
tg4-engagement: Adapt to new members value format
Feb 23, 2022
22854c3
tg4-stake: Adapt to new members value format
Feb 24, 2022
cca7d41
Redefine members() IndexedMap
Feb 24, 2022
5f61f0f
Add MemberInfo::new_with_points constructor
Feb 24, 2022
78376a9
tg4-mixer: Adapt to custom members()
Feb 24, 2022
608b829
Add optional start_height to Member and MemberResponse
Feb 25, 2022
2bb03dc
tg4-engagement: Adapt to new `Member` / `MemberResponse` value format
Feb 25, 2022
313f0ee
voting-contract: Adapt to new `Member` value format
Feb 25, 2022
3bbcb5b
tg4-group: Adapt to new `Member` value format
Feb 25, 2022
3c3c9f8
tg4-stake: Adapt to new `Member` value format
Feb 25, 2022
d756457
tg4-mixer: Use tie-breaking index
Feb 25, 2022
26cab6b
tg4-mixer: Remove unused points index
Feb 25, 2022
63e8672
tg4-valset: Adapt to new `Member` format
Feb 25, 2022
5bd7f48
Adapt voting-contract tests to new `Member` format
Feb 25, 2022
229f742
Adapt contracts tests to new `Member` format
Feb 25, 2022
f3f8acb
Add members by points tie-breaking tests
Feb 25, 2022
b74060e
Fix: default start_height
Feb 25, 2022
097a8e5
Add members by points tie breaking pagination tests
Feb 25, 2022
ecb44ef
Error if no start_height for pagination
Feb 25, 2022
b225c36
Replace unneeded wrapping_neg() by negation
Feb 25, 2022
906c580
Add From helper for MemberResponse
Feb 25, 2022
3648c36
Fix MemberResponse / use From MemberInfo helper
Feb 25, 2022
dc2a9e1
Adapt to new Bond message format
Mar 30, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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