@version 1
condition triggered_by: transaction, on: deposit(), as: [
timestamp: transaction.timestamp < 1710763200,
token_transfers: get_user_transfer_amount(transaction) > 0
]
actions triggered_by: transaction, on: deposit() do
transfer_amount = get_user_transfer_amount(transaction)
previous_address = Chain.get_previous_address(transaction)
user_genesis_address = Chain.get_genesis_address(previous_address)
State.set("reward_token_balance", get_reward_token_balance())
deposits = nil
if Time.now() > 1706720400 do
res = calculate_new_rewards()
deposits = res.deposits
State.set("rewards_reserved", res.rewards_reserved)
State.set("last_calculation_timestamp", res.last_calculation_timestamp)
else
deposits = State.get("deposits", Map.new())
end
user_deposit = Map.get(deposits, user_genesis_address, [amount: 0, reward_amount: 0])
user_deposit = Map.set(user_deposit, "amount", user_deposit.amount + transfer_amount)
deposits = Map.set(deposits, user_genesis_address, user_deposit)
State.set("deposits", deposits)
lp_token_deposited = State.get("lp_token_deposited", 0)
State.set("lp_token_deposited", lp_token_deposited + transfer_amount)
end
condition triggered_by: transaction, on: claim(), as: [
timestamp: transaction.timestamp > 1706720400,
previous_public_key: (
previous_address = Chain.get_previous_address()
genesis_address = Chain.get_genesis_address(previous_address)
deposits = State.get("deposits", Map.new())
Map.get(deposits, genesis_address) != nil
)
]
actions triggered_by: transaction, on: claim() do
previous_address = Chain.get_previous_address(transaction)
user_genesis_address = Chain.get_genesis_address(previous_address)
State.set("reward_token_balance", get_reward_token_balance())
res = calculate_new_rewards()
deposits = res.deposits
State.set("last_calculation_timestamp", res.last_calculation_timestamp)
user_deposit = Map.get(deposits, user_genesis_address)
if "UCO" == "UCO" do
Contract.add_uco_transfer(to: transaction.address, amount: user_deposit.reward_amount)
else
Contract.add_token_transfer(
to: transaction.address,
amount: user_deposit.reward_amount,
token_address: "UCO"
)
end
reward_distributed = State.get("reward_distributed", 0)
State.set("reward_distributed", reward_distributed + user_deposit.reward_amount)
State.set("rewards_reserved", res.rewards_reserved - user_deposit.reward_amount)
reward_token_balance = State.get("reward_token_balance")
State.set("reward_token_balance", reward_token_balance - user_deposit.reward_amount)
new_user_deposit = Map.set(user_deposit, "reward_amount", 0)
deposits = Map.set(deposits, user_genesis_address, new_user_deposit)
State.set("deposits", deposits)
end
condition triggered_by: transaction, on: withdraw(amount), as: [
previous_public_key: (
previous_address = Chain.get_previous_address()
genesis_address = Chain.get_genesis_address(previous_address)
deposits = State.get("deposits", Map.new())
user_deposit = Map.get(deposits, genesis_address)
user_deposit != nil && user_deposit.amount >= amount
)
]
actions triggered_by: transaction, on: withdraw(amount) do
previous_address = Chain.get_previous_address(transaction)
user_genesis_address = Chain.get_genesis_address(previous_address)
State.set("reward_token_balance", get_reward_token_balance())
deposits = nil
rewards_reserved = 0
if Time.now() > 1706720400 do
res = calculate_new_rewards()
deposits = res.deposits
rewards_reserved = res.rewards_reserved
State.set("last_calculation_timestamp", res.last_calculation_timestamp)
else
deposits = State.get("deposits", Map.new())
rewards_reserved = State.get("rewards_reserved", 0)
end
user_deposit = Map.get(deposits, user_genesis_address)
if "UCO" == "UCO" do
Contract.add_uco_transfer(to: transaction.address, amount: user_deposit.reward_amount)
else
Contract.add_token_transfer(
to: transaction.address,
amount: user_deposit.reward_amount,
token_address: "UCO"
)
end
Contract.add_token_transfer(
to: transaction.address,
amount: amount,
token_address: 0x00006394EF24DFDC6FDFC3642FDC83827591A485704BB997221C0B9F313A468BDEAF
)
reward_distributed = State.get("reward_distributed", 0)
State.set("reward_distributed", reward_distributed + user_deposit.reward_amount)
State.set("rewards_reserved", rewards_reserved - user_deposit.reward_amount)
reward_token_balance = State.get("reward_token_balance")
State.set("reward_token_balance", reward_token_balance - user_deposit.reward_amount)
lp_token_deposited = State.get("lp_token_deposited")
State.set("lp_token_deposited", lp_token_deposited - amount)
if amount == user_deposit.amount do
deposits = Map.delete(deposits, user_genesis_address)
else
new_deposit = Map.set(user_deposit, "reward_amount", 0)
new_deposit = Map.set(new_deposit, "amount", user_deposit.amount - amount)
deposits = Map.set(deposits, user_genesis_address, new_deposit)
end
State.set("deposits", deposits)
end
condition triggered_by: transaction, on: update_code(), as: [
previous_public_key: (
# Pool code can only be updated from the router contract of the dex
# Transaction is not yet validated so we need to use previous address
# to get the genesis address
previous_address = Chain.get_previous_address()
Chain.get_genesis_address(previous_address) == 0x000066CD867DA536A73D39CF05174387923358DC0009A29CC7162D4AED00675DAB55
)
]
actions triggered_by: transaction, on: update_code() do
params = [
0x00006394EF24DFDC6FDFC3642FDC83827591A485704BB997221C0B9F313A468BDEAF,
1706720400,
1710763200,
"UCO",
0x0000208a670b5590939174d65f88140c05dddba63c0c920582e12162b22f3985e510
]
new_code = Contract.call_function(0x000086E60124C986EBCAA5AFFB7A3DB8213072A132233FE61CF45651FDCF3C4CECEA, "get_farm_code", params)
if Code.is_valid?(new_code) && !Code.is_same?(new_code, contract.code) do
Contract.set_type("contract")
Contract.set_code(new_code)
end
end
fun get_reward_token_balance() do
if "UCO" == "UCO" do
Chain.get_uco_balance(contract.address)
else
Chain.get_token_balance(contract.address, "UCO")
end
end
fun get_user_transfer_amount(tx) do
transfers = Map.get(transaction.token_transfers, 0x0000208a670b5590939174d65f88140c05dddba63c0c920582e12162b22f3985e510, [])
transfer = List.at(transfers, 0)
if transfer != nil && transfer.token_address == 0x00006394EF24DFDC6FDFC3642FDC83827591A485704BB997221C0B9F313A468BDEAF do
transfer.amount
else
0
end
end
fun calculate_new_rewards() do
deposits = State.get("deposits", Map.new())
lp_token_deposited = State.get("lp_token_deposited", 0)
rewards_reserved = State.get("rewards_reserved", 0)
last_calculation_timestamp = State.get("last_calculation_timestamp", 1706720400)
now = Time.now()
if last_calculation_timestamp < now && last_calculation_timestamp < 1710763200 && lp_token_deposited > 0 do
rewards_balance = State.get("reward_token_balance", 0)
available_balance = rewards_balance - rewards_reserved
amount_to_allocate = 0
if now >= 1710763200 do
amount_to_allocate = available_balance
else
time_elapsed = now - last_calculation_timestamp
time_remaining = 1710763200 - last_calculation_timestamp
amount_to_allocate = available_balance * (time_elapsed / time_remaining)
end
if amount_to_allocate > 0 do
for address in Map.keys(deposits) do
deposit = Map.get(deposits, address)
new_reward_amount = amount_to_allocate * (deposit.amount / lp_token_deposited)
if new_reward_amount > 0 do
deposit = Map.set(deposit, "reward_amount", deposit.reward_amount + new_reward_amount)
deposits = Map.set(deposits, address, deposit)
rewards_reserved = rewards_reserved + new_reward_amount
last_calculation_timestamp = now
end
end
end
end
[
deposits: deposits,
rewards_reserved: rewards_reserved,
last_calculation_timestamp: last_calculation_timestamp
]
end
export fun get_farm_infos() do
reward_token_balance = State.get("reward_token_balance")
remaining_reward = nil
if reward_token_balance != nil do
remaining_reward = reward_token_balance - State.get("rewards_reserved", 0)
end
[
lp_token_address: 0x00006394EF24DFDC6FDFC3642FDC83827591A485704BB997221C0B9F313A468BDEAF,
reward_token: "UCO",
start_date: 1706720400,
end_date: 1710763200,
remaining_reward: remaining_reward,
lp_token_deposited: State.get("lp_token_deposited", 0),
nb_deposit: Map.size(State.get("deposits", Map.new())),
stats: [
reward_distributed: State.get("reward_distributed", 0)
]
]
end
export fun get_user_infos(user_genesis_address) do
user_genesis_address = String.to_hex(user_genesis_address)
deposits = State.get("deposits", Map.new())
user_deposit = Map.get(deposits, user_genesis_address)
if user_deposit != nil do
lp_token_deposited = State.get("lp_token_deposited", 0)
last_calculation_timestamp = State.get("last_calculation_timestamp", 1706720400)
now = Time.now()
if now > 1706720400 && last_calculation_timestamp < now && last_calculation_timestamp < 1710763200 && lp_token_deposited > 0 do
rewards_balance = State.get("reward_token_balance", 0)
rewards_reserved = State.get("rewards_reserved", 0)
available_balance = rewards_balance - rewards_reserved
amount_to_allocate = 0
if now >= 1710763200 do
amount_to_allocate = available_balance
else
time_elapsed = now - last_calculation_timestamp
time_remaining = 1710763200 - last_calculation_timestamp
amount_to_allocate = available_balance * (time_elapsed / time_remaining)
end
if amount_to_allocate > 0 do
new_reward_amount = amount_to_allocate * (user_deposit.amount / lp_token_deposited)
if new_reward_amount > 0 do
user_deposit = Map.set(user_deposit, "reward_amount", user_deposit.reward_amount + new_reward_amount)
end
end
end
[deposited_amount: user_deposit.amount, reward_amount: user_deposit.reward_amount]
else
[deposited_amount: 0, reward_amount: 0]
end
end
Content (0 B)
{
"deposits": {
"000024EFC168359BBE0ABF897270CBFABBFF5784622EA02A463BA2EAF7C5219EAFD7": {
"amount": 177.66460711,
"reward_amount": 798.67311487
},
"0000575841F2E8000E8A96C4A523F8D937217ABEB654C12E58C0251300235FCD106F": {
"amount": 0.55110038,
"reward_amount": 0
},
"0000834AD179A291856494A6ECA9AA855AAE0F28E5F221666CBD11D2FF96B2A0FE19": {
"amount": 100.0,
"reward_amount": 1012.31144005
},
"0000D9E7B4300CC29670CA80010FE23292BEE4AE28057328732A0FF4CF11C319D81A": {
"amount": 15.37539248,
"reward_amount": 40.04566262
},
"0000EF25F9910BCF681F5F931F265B4FDD4B2A1FC3469BF20CCE64CDD12CFC2BB57B": {
"amount": 1.08087472,
"reward_amount": 3.51508245
}
},
"last_calculation_timestamp": 1706728365,
"lp_token_deposited": 294.67197469,
"reward_distributed": 115.60118999,
"reward_token_balance": 999884.40106863,
"rewards_reserved": 1854.54529999
}
-
Secret shared with 1 key
Encoded secret
B88808CD0EAD6ED89ED9F5C02935B9BD598FCFD8BADA8FE01CB7FDB0F9B8C1DDA88CF00896FD86717DFA78491E04BDA2B05C83C5229FB630EE78329E
Authorized keys
- 00017877BCF4122095926A49489009649603AB129822A19EF9D573B8FD714911ED7F
Contract recipients (0)
Inputs (0)
Contract inputs (0)
Unspent outputs (2)
-
From 00004034...37C0At 2024-01-31 19:12:51 UTCAmount 999,884.40106863 UCO
-
From 00004034...37C0At 2024-01-31 19:12:51 UTCAmount 294.67197469 00006394...DEAF
Previous public key
0001CD8E006D92A4E7661CAD97E7103D9AF5A69B7ABB088E965BB00EE183BD812D81
Previous signature
D84224EA35B94469E50CF80CD60142620256376C6DAC6426473B47B3B870BB2E04AA4FBD54B30FDD330B27323A8EFB6743D8383452136F8579E2D2B7B268D903
Origin signature
30460221009CEF9CBE160156E718CD26B9992BB45239351AEFEF72E80851671C7BF715C2B6022100D1F11005FD0BE048E410B2AA2D52C75C790E76C784E6A7428C28C57C7777B7B7
Proof of work
010104BB7216545F28C83467606EDA88968E19C436410AB446D1BC88FEBDE3506275F9B0B931CAAE420B96B2A158B7112F13795C878CCC346C76E04A96C59CCFC6FC39
Proof of integrity
009882FDE2CB22AF135F4220A5B1C6074A37B2C424DAB117B11EC3376576B32120
Coordinator signature
BD49A5D4785CB77CBF24C578CA4385294577B6C9F30F4881566E490FFF395B1B886A7031CEB96EC8FD66CC7BBE2EB20C5DA2D18B3445455B7A276AA326076A09
Validator #1 public key
000134772A943DC0F7038B1BABA39E18841C12DD6682B1B6D1D15E08D7CAF5339AB0
Validator #1 signature
4392DBC4C81052F10FC86A8F2618E850360DF8BB9CCB81B179F16CA284783211A3E886D448E87FDA29177493CE2D5B6FC6F04813FC8EFB694A261BF95FBEA802
Validator #2 public key
000151C124A6211CD402FD1CFE560C5DB51ED0CBEF44B09B21A41206028E7E5942BF
Validator #2 signature
FD7FC07CCC07E60EA3011902B40FC69526E3CA587CF709C490103986D8D8072FECEAAC3CF581201BACB057F25B2E6E817D4176CF5B8311FEDE80F93379C30A0E