1
0
Fork 0
mirror of https://github.com/ton-blockchain/ton synced 2025-02-15 04:32:21 +00:00
ton/crypto/func/auto-tests/legacy_tests/whales-nominators/modules/op-common.fc
EmelyanenkoK 6b49d6a382
Add legacy_tester for existing funC contracts (#588)
* Add legacy_tester for existing funC contracts

* Add storage-contracts and pragma options
2023-01-12 12:33:15 +03:00

175 lines
No EOL
4.8 KiB
Text

() op_deposit(int member, int value) impure {
;; Read extras
var (enabled, udpates_enabled, min_stake, deposit_fee, withdraw_fee, pool_fee, receipt_price) = ctx_extras;
throw_unless(error::invalid_message(), enabled);
;; Read stake value
int fee = receipt_price + deposit_fee;
int stake = value - fee;
throw_unless(error::invalid_stake_value(), stake >= min_stake);
;; Load nominators
load_member(member);
;; Add deposit
member_stake_deposit(stake);
;; Resolve address
var address = ctx_owner;
if (member != owner_id()) {
address = serialize_work_addr(member);
}
;; Send receipt
if (ctx_query_id == 0) {
send_text_message(
address,
receipt_price,
send_mode::default(),
begin_cell()
.store_accepted_stake(stake)
);
} else {
send_empty_std_message(
address,
receipt_price,
send_mode::default(),
op::stake_deposit::response(),
ctx_query_id
);
}
;; Persist
store_member();
store_base_data();
}
() op_withdraw(int member, int value, int stake) impure {
;; Read extras
var (enabled, udpates_enabled, min_stake, deposit_fee, withdraw_fee, pool_fee, receipt_price) = ctx_extras;
;; Check fee
int fee = receipt_price + withdraw_fee;
;; Check value
throw_unless(error::too_low_value(), value == fee);
;; Load member
load_member(member);
;; Try to withdraw immediatelly
var (withdrawed, all) = member_stake_withdraw(stake);
;; Resolve address
var address = ctx_owner;
if (member != owner_id()) {
address = serialize_work_addr(member);
}
;; Send receipt
if (ctx_query_id == 0) {
send_text_message(
address,
withdrawed + receipt_price,
send_mode::default(),
all ? begin_cell().store_withdraw_completed() : begin_cell().store_withdraw_delayed()
);
} else {
send_empty_std_message(
address,
withdrawed + receipt_price,
send_mode::default(),
all ? op::stake_withdraw::response() : op::stake_withdraw::delayed(),
ctx_query_id
);
}
;; Persist
store_member();
store_base_data();
}
() op_donate(int value) impure {
;; Check value
throw_unless(error::invalid_message(), value >= 2 * coins::1());
;; Distribute profit to everyone
distribute_profit(value - coins::1());
;; Persist
store_base_data();
}
() op_upgrade(int value, slice in_msg) impure {
;; Read extras
var (enabled, udpates_enabled, min_stake, deposit_fee, withdraw_fee, pool_fee, receipt_price) = ctx_extras;
throw_unless(error::invalid_message(), udpates_enabled);
;; Check value
throw_unless(error::too_low_value(), value >= fees::deploy());
;; Upgrade code
var code = in_msg~load_ref();
in_msg.end_parse();
set_code(code);
;; Send receipt
send_empty_std_message(
ctx_owner,
0,
send_mode::carry_remaining_value(),
op::upgrade::response(),
ctx_query_id
);
}
() op_update(int value, slice in_msg) impure {
;; Read extras
var (enabled, udpates_enabled, min_stake, deposit_fee, withdraw_fee, pool_fee, receipt_price) = ctx_extras;
;; Check value
throw_unless(error::too_low_value(), value >= fees::deploy());
;; Check extras
var newExtras = in_msg~load_ref();
var es = newExtras.begin_parse();
var new_enabled = es~load_int(1);
var new_udpates_enabled = es~load_int(1);
var new_min_stake = es~load_coins();
var new_deposit_fee = es~load_coins();
var new_withdraw_fee = es~load_coins();
var new_pool_fee = es~load_coins();
var new_receipt_price = es~load_coins();
es.end_parse();
;; Once upgrades are disabled: prohibit re-enabling
throw_if(error::invalid_message(), (~ udpates_enabled) & new_udpates_enabled);
;; At least min_stake
throw_unless(error::invalid_message(), new_min_stake >= params::min_stake());
;; At least op fee
throw_unless(error::invalid_message(), new_deposit_fee >= fees::op());
throw_unless(error::invalid_message(), new_withdraw_fee >= fees::op());
;; Must be in 0...10000
throw_unless(error::invalid_message(), new_pool_fee <= 100 * 100);
;; At least receipt price
throw_unless(error::invalid_message(), new_receipt_price >= fees::receipt());
;; Persist extras
ctx_extras = (new_enabled, new_udpates_enabled, new_min_stake, new_deposit_fee, new_withdraw_fee, new_pool_fee, new_receipt_price);
store_base_data();
;; Send receipt
send_empty_std_message(
ctx_owner,
0,
send_mode::carry_remaining_value(),
op::update::response(),
ctx_query_id
);
}