Skip to content

Commit a5e3021

Browse files
authored
release: 3.0.0 (#98)
1 parent 27e284b commit a5e3021

File tree

12 files changed

+97
-209
lines changed

12 files changed

+97
-209
lines changed

Cargo.lock

+2-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

contract/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "sweat_jar"
3-
version = "2.2.0"
3+
version = "3.0.0"
44
authors = ["Sweat Economy"]
55
edition = "2021"
66

contract/src/claim/api.rs

+11-32
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
use std::cmp;
2-
31
use near_sdk::{env, ext_contract, is_promise_success, json_types::U128, near_bindgen, AccountId, PromiseOrValue};
42
use sweat_jar_model::{
53
api::ClaimApi,
@@ -9,12 +7,8 @@ use sweat_jar_model::{
97
};
108

119
use crate::{
12-
common::{
13-
gas_data::{GAS_FOR_AFTER_CLAIM, GAS_FOR_FT_TRANSFER},
14-
Timestamp,
15-
},
10+
common::Timestamp,
1611
event::{emit, ClaimEventItem, EventKind},
17-
internal::assert_gas,
1812
jar::model::Jar,
1913
Contract, ContractExt, JarsStorage,
2014
};
@@ -36,18 +30,7 @@ impl ClaimApi for Contract {
3630
let account_id = env::predecessor_account_id();
3731
self.migrate_account_jars_if_needed(account_id.clone());
3832
let jar_ids = self.account_jars(&account_id).iter().map(|a| U32(a.id)).collect();
39-
self.claim_jars_internal(account_id, jar_ids, None, detailed)
40-
}
41-
42-
fn claim_jars(
43-
&mut self,
44-
jar_ids: Vec<JarIdView>,
45-
amount: Option<U128>,
46-
detailed: Option<bool>,
47-
) -> PromiseOrValue<ClaimedAmountView> {
48-
let account_id = env::predecessor_account_id();
49-
self.migrate_account_jars_if_needed(account_id.clone());
50-
self.claim_jars_internal(account_id, jar_ids, amount, detailed)
33+
self.claim_jars_internal(account_id, jar_ids, detailed)
5134
}
5235
}
5336

@@ -56,7 +39,6 @@ impl Contract {
5639
&mut self,
5740
account_id: AccountId,
5841
jar_ids: Vec<JarIdView>,
59-
amount: Option<U128>,
6042
detailed: Option<bool>,
6143
) -> PromiseOrValue<ClaimedAmountView> {
6244
let now = env::block_timestamp_ms();
@@ -75,23 +57,16 @@ impl Contract {
7557
let product = self.get_product(&jar.product_id);
7658
let (available_interest, remainder) = jar.get_interest(&product, now);
7759

78-
let interest_to_claim = amount.map_or(available_interest, |amount| {
79-
cmp::min(available_interest, amount.0 - accumulator.get_total().0)
80-
});
81-
82-
if interest_to_claim > 0 {
60+
if available_interest > 0 {
8361
let jar = self.get_jar_mut_internal(&jar.account_id, jar.id);
8462

8563
jar.claim_remainder = remainder;
8664

87-
jar.claim(available_interest, interest_to_claim, now).lock();
65+
jar.claim(available_interest, available_interest, now).lock();
8866

89-
accumulator.add(jar.id, interest_to_claim);
67+
accumulator.add(jar.id, available_interest);
9068

91-
event_data.push(ClaimEventItem {
92-
id: jar.id,
93-
interest_to_claim: U128(interest_to_claim),
94-
});
69+
event_data.push((jar.id, U128(available_interest)));
9570
}
9671
}
9772

@@ -138,7 +113,11 @@ impl Contract {
138113
event: EventKind,
139114
now: Timestamp,
140115
) -> PromiseOrValue<ClaimedAmountView> {
141-
use crate::ft_interface::FungibleTokenInterface;
116+
use crate::{
117+
common::gas_data::{GAS_FOR_AFTER_CLAIM, GAS_FOR_FT_TRANSFER},
118+
ft_interface::FungibleTokenInterface,
119+
internal::assert_gas,
120+
};
142121

143122
assert_gas(GAS_FOR_FT_TRANSFER.as_gas() * 2 + GAS_FOR_AFTER_CLAIM.as_gas(), || {
144123
format!("claim_interest: number of jars: {}", jars_before_transfer.len())

contract/src/claim/tests.rs

+6-118
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
use near_sdk::{json_types::U128, test_utils::test_env::alice, PromiseOrValue};
44
use sweat_jar_model::{
5-
api::{ClaimApi, JarApi, WithdrawApi},
5+
api::{ClaimApi, WithdrawApi},
66
claimed_amount_view::ClaimedAmountView,
77
MS_IN_YEAR, U32,
88
};
@@ -62,43 +62,6 @@ fn claim_total_detailed_when_having_tokens() {
6262
assert_eq!(jar_1_expected_interest, value.detailed.get(&U32(jar_1.id)).unwrap().0);
6363
}
6464

65-
#[test]
66-
fn claim_partially_detailed_when_having_tokens() {
67-
let alice = alice();
68-
let admin = admin();
69-
70-
let product = generate_product();
71-
let jar_0 = Jar::generate(0, &alice, &product.id).principal(100_000_000);
72-
let jar_1 = Jar::generate(1, &alice, &product.id).principal(200_000_000);
73-
let mut context = Context::new(admin)
74-
.with_products(&[product.clone()])
75-
.with_jars(&[jar_0.clone(), jar_1.clone()]);
76-
77-
let product_term = product.get_lockup_term().unwrap();
78-
let test_duration = product_term + 100;
79-
80-
let jar_0_expected_interest = jar_0.get_interest(&product, test_duration).0;
81-
let jar_1_expected_interest = jar_1.get_interest(&product, test_duration).0 - 1;
82-
83-
context.set_block_timestamp_in_ms(test_duration);
84-
85-
context.switch_account(&alice);
86-
let result = context.contract().claim_jars(
87-
vec![U32(jar_0.id), U32(jar_1.id)],
88-
Some(U128(jar_0_expected_interest + jar_1_expected_interest)),
89-
Some(true),
90-
);
91-
92-
let PromiseOrValue::Value(ClaimedAmountView::Detailed(value)) = result else {
93-
panic!();
94-
};
95-
96-
assert_eq!(jar_0_expected_interest + jar_1_expected_interest, value.total.0);
97-
98-
assert_eq!(jar_0_expected_interest, value.detailed.get(&U32(jar_0.id)).unwrap().0);
99-
assert_eq!(jar_1_expected_interest, value.detailed.get(&U32(jar_1.id)).unwrap().0);
100-
}
101-
10265
#[test]
10366
fn claim_pending_withdraw_jar() {
10467
let alice = alice();
@@ -118,16 +81,11 @@ fn claim_pending_withdraw_jar() {
11881
let test_duration = product_term + 100;
11982

12083
let jar_0_expected_interest = jar_0.get_interest(&product, test_duration);
121-
let jar_1_expected_interest = jar_1.get_interest(&product, test_duration).0 - 1;
12284

12385
context.set_block_timestamp_in_ms(test_duration);
12486

12587
context.switch_account(&alice);
126-
let result = context.contract().claim_jars(
127-
vec![U32(jar_0.id), U32(jar_1.id)],
128-
Some(U128(jar_0_expected_interest.0 + jar_1_expected_interest)),
129-
Some(true),
130-
);
88+
let result = context.contract().claim_total(Some(true));
13189

13290
let PromiseOrValue::Value(ClaimedAmountView::Detailed(value)) = result else {
13391
panic!();
@@ -139,65 +97,6 @@ fn claim_pending_withdraw_jar() {
13997
assert_eq!(None, value.detailed.get(&U32(jar_1.id)));
14098
}
14199

142-
#[test]
143-
fn claim_partially_detailed_when_having_tokens_and_request_sum_of_single_deposit() {
144-
let alice = alice();
145-
let admin = admin();
146-
147-
let product = generate_product();
148-
let jar_0 = Jar::generate(0, &alice, &product.id).principal(100_000_000);
149-
let jar_1 = Jar::generate(1, &alice, &product.id).principal(200_000_000);
150-
let mut context = Context::new(admin)
151-
.with_products(&[product.clone()])
152-
.with_jars(&[jar_0.clone(), jar_1.clone()]);
153-
154-
let product_term = product.get_lockup_term().unwrap();
155-
let test_duration = product_term + 100;
156-
157-
let jar_0_expected_interest = jar_0.get_interest(&product, test_duration).0;
158-
159-
context.set_block_timestamp_in_ms(test_duration);
160-
161-
context.switch_account(&alice);
162-
let result = context.contract().claim_jars(
163-
vec![U32(jar_0.id), U32(jar_1.id)],
164-
Some(U128(jar_0_expected_interest)),
165-
Some(true),
166-
);
167-
168-
let PromiseOrValue::Value(ClaimedAmountView::Detailed(value)) = result else {
169-
panic!();
170-
};
171-
172-
assert_eq!(jar_0_expected_interest, value.total.0);
173-
174-
assert_eq!(jar_0_expected_interest, value.detailed.get(&U32(jar_0.id)).unwrap().0);
175-
assert!(!value.detailed.contains_key(&U32(jar_1.id)));
176-
}
177-
178-
#[test]
179-
fn claim_partially_when_having_tokens_to_claim() {
180-
let alice = alice();
181-
let admin = admin();
182-
183-
let product = generate_product();
184-
let jar = Jar::generate(0, &alice, &product.id).principal(100_000_000_000);
185-
let mut context = Context::new(admin).with_products(&[product]).with_jars(&[jar.clone()]);
186-
187-
context.set_block_timestamp_in_days(365);
188-
189-
context.switch_account(&alice);
190-
let claimed = context
191-
.contract()
192-
.claim_jars(vec![U32(jar.id)], Some(U128(100)), None)
193-
.unwrap();
194-
195-
assert_eq!(claimed.get_total().0, 100);
196-
197-
let jar = context.contract().get_jar(alice, U32(jar.id));
198-
assert_eq!(100, jar.claimed_balance.0);
199-
}
200-
201100
#[test]
202101
fn dont_delete_jar_on_all_interest_claim() {
203102
let alice = alice();
@@ -210,9 +109,7 @@ fn dont_delete_jar_on_all_interest_claim() {
210109
context.set_block_timestamp_in_days(365);
211110

212111
context.switch_account(&alice);
213-
context
214-
.contract()
215-
.claim_jars(vec![U32(jar.id)], Some(U128(200_000)), None);
112+
context.contract().claim_total(None);
216113

217114
let jar = context.contract().get_jar_internal(&alice, jar.id);
218115
assert_eq!(200_000, jar.claimed_balance);
@@ -241,10 +138,7 @@ fn claim_all_withdraw_all_and_delete_jar() {
241138
context.set_block_timestamp_in_ms(product.get_lockup_term().unwrap() + 1);
242139

243140
context.switch_account(&alice);
244-
let claimed = context
245-
.contract()
246-
.claim_jars(vec![U32(jar_id)], Some(U128(200_000)), None)
247-
.unwrap();
141+
let claimed = context.contract().claim_total(None).unwrap();
248142

249143
assert_eq!(200_000, claimed.get_total().0);
250144

@@ -292,10 +186,7 @@ fn withdraw_all_claim_all_and_delete_jar() {
292186

293187
assert_eq!(jar.principal, 0);
294188

295-
let claimed = context
296-
.contract()
297-
.claim_jars(vec![U32(jar_id)], Some(U128(200_000)), None)
298-
.unwrap();
189+
let claimed = context.contract().claim_total(None).unwrap();
299190

300191
assert_eq!(claimed.get_total(), U128(200_000));
301192

@@ -319,10 +210,7 @@ fn failed_future_claim() {
319210

320211
let jar_before_claim = context.contract().get_jar_internal(&alice, jar.id).clone();
321212

322-
let claimed = context
323-
.contract()
324-
.claim_jars(vec![U32(jar.id)], Some(U128(200_000)), None)
325-
.unwrap();
213+
let claimed = context.contract().claim_total(None).unwrap();
326214

327215
assert_eq!(claimed.get_total().0, 0);
328216

contract/src/event.rs

+24-9
Original file line numberDiff line numberDiff line change
@@ -76,12 +76,8 @@ struct SweatJarEvent {
7676
event_kind: EventKind,
7777
}
7878

79-
#[derive(Serialize, Deserialize, Debug)]
80-
#[serde(crate = "near_sdk::serde")]
81-
pub struct ClaimEventItem {
82-
pub id: JarId,
83-
pub interest_to_claim: U128,
84-
}
79+
/// `JarId` and interest to claim
80+
pub type ClaimEventItem = (JarId, U128);
8581

8682
#[derive(Serialize, Deserialize, Debug)]
8783
#[serde(crate = "near_sdk::serde")]
@@ -193,7 +189,7 @@ mod test {
193189
fn test_contract_version() {
194190
let admin = admin();
195191
let context = Context::new(admin);
196-
assert_eq!(context.contract().contract_version(), "sweat_jar-2.2.0");
192+
assert_eq!(context.contract().contract_version(), "sweat_jar-3.0.0");
197193
}
198194

199195
#[test]
@@ -206,7 +202,7 @@ mod test {
206202
.to_json_event_string(),
207203
r#"EVENT_JSON:{
208204
"standard": "sweat_jar",
209-
"version": "2.2.0",
205+
"version": "3.0.0",
210206
"event": "top_up",
211207
"data": {
212208
"id": 10,
@@ -234,7 +230,7 @@ mod test {
234230
.to_json_event_string(),
235231
r#"EVENT_JSON:{
236232
"standard": "sweat_jar",
237-
"version": "2.2.0",
233+
"version": "3.0.0",
238234
"event": "create_jar",
239235
"data": {
240236
"id": 555,
@@ -247,6 +243,25 @@ mod test {
247243
"is_pending_withdraw": false,
248244
"is_penalty_applied": false
249245
}
246+
}"#
247+
);
248+
249+
assert_eq!(
250+
SweatJarEvent::from(EventKind::Claim(vec![(1, 1.into()), (2, 2.into())])).to_json_event_string(),
251+
r#"EVENT_JSON:{
252+
"standard": "sweat_jar",
253+
"version": "3.0.0",
254+
"event": "claim",
255+
"data": [
256+
[
257+
1,
258+
"1"
259+
],
260+
[
261+
2,
262+
"2"
263+
]
264+
]
250265
}"#
251266
);
252267
}

0 commit comments

Comments
 (0)