mirror of
https://github.com/ton-blockchain/ton
synced 2025-02-15 04:32:21 +00:00
* Add legacy_tester for existing funC contracts * Add storage-contracts and pragma options
175 lines
No EOL
4.8 KiB
Text
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
|
|
);
|
|
} |