Contract con_taurus_nft_farms


Contract Code


  
1 I = importlib
2
3
4 token_interface = [I.Func('transfer', args=('amount', 'to')), I.Func(
5 'approve', args=('amount', 'to')), I.Func('transfer_from', args=(
6 'amount', 'to', 'main_account'))]
7 nft_interface = [I.Func('transfer', args=('name', 'amount', 'to')), I.Func(
8 'approve', args=('amount', 'name', 'to')), I.Func('transfer_from', args=(
9 'name', 'amount', 'to', 'main_account'))]
10
11
12 farms = Hash(default_value = False)
13 operator = Variable()
14 existing_farms = Variable()
15 fee = Variable()
16
17
18 @construct
19 def seed():
20 operator.set(ctx.caller)
21 existing_farms.set(0)
22 fee.set(2)
23
24
25 @export
26 def change_op(new_op: str):
27 assert operator.get() == ctx.caller, "You are not the current op"
28 operator.set(new_op)
29
30
31 @export
32 def change_fee(new_fee: float):
33 assert operator.get() == ctx.caller, "You are not the current op"
34 fee.set(new_fee)
35
36
37 @export
38 def create_farm(nft_collection_contract:str, reward_token_contract: str, total_payout: float, end_year: int, end_month: int, end_day: int, end_hour: int, end_minute: int):
39 assert total_payout > 0, "Total Payout needs to be more then 0"
40 assert datetime.datetime(year=end_year,month=end_month,day=end_day) > now, "End Time needs to be in the future"
41
42 collection = I.import_module(nft_collection_contract)
43 assert I.enforce_interface(collection, nft_interface
44 ), 'Invalid nft collection interface!'
45
46 token = I.import_module(reward_token_contract)
47 assert I.enforce_interface(token, token_interface
48 ), 'Invalid token interface!'
49
50 total_payout_deposit = total_payout / 100 * (100 - fee.get())
51 op_fee = total_payout - total_payout_deposit
52
53 token.transfer_from(amount=total_payout_deposit, to=ctx.this, main_account=ctx.
54 caller)
55 token.transfer_from(amount=op_fee, to=operator.get(), main_account=ctx.
56 caller)
57
58 new_farm_id = existing_farms.get() + 1
59 farms[new_farm_id, 'info'] = {"nft_collection_contract": nft_collection_contract, "reward_token_contract": reward_token_contract, "end_time": datetime.datetime(year=end_year,month=end_month,day=end_day, hour=end_hour, minute=end_minute), "start_time":now, "reward_token_balance": total_payout_deposit, "current_epoch": 0}
60 farms[new_farm_id, 'epochs', 0] = {"staked": 0, "amount_per_second": total_payout_deposit / timedelta_to_seconds(from_datetime=now,to_datetime=datetime.datetime(year=end_year,month=end_month,day=end_day, hour=end_hour, minute=end_minute)), "epoch_end": None, "epoch_start": now}
61 existing_farms.set(new_farm_id)
62
63 return 0
64
65
66 @export
67 def deposit_to_farm(farm_id:int, nft_name:str):
68 assert farms[farm_id, 'info'] != False, "This farm does not exist"
69 assert farms[farm_id, 'info']['end_time'] > now, "This farm is closed"
70
71 collection = I.import_module(farms[farm_id, 'info']['nft_collection_contract'])
72 collection.transfer_from(name=nft_name, amount=1, to=ctx.this, main_account=ctx.caller)
73 end_epoch(farm_id)
74 new_epoch_id=create_new_epoch(farm_id, "deposit")
75 farms[farm_id, 'deposits', ctx.caller, nft_name] = {"start_epoch":new_epoch_id, "start_time":now}
76
77
78 return True
79
80 @export
81 def withdraw_rewards_and_nft(farm_id:int, nft_name:str):
82 assert farms[farm_id, 'deposits', ctx.caller, nft_name] != False, "You don't have that NFT deposited in the farm"
83 assert farms[farm_id, 'info']['end_time'] > now, "This farm is closed"
84
85 epoch_of_deposit = farms[farm_id, 'deposits', ctx.caller, nft_name]["start_epoch"]
86 time_of_deposit = farms[farm_id, 'deposits', ctx.caller, nft_name]["start_time"]
87 current_epoch = farms[farm_id, 'info']['current_epoch']
88 farm_info = farms[farm_id, 'info']
89 epochs_staked = current_epoch - epoch_of_deposit
90
91 end_epoch(farm_id)
92
93 rewards = 0
94 for epoch in range(epoch_of_deposit, current_epoch + 1):
95 this_epoch = farms[farm_id, 'epochs', epoch]
96 this_epoch_reward = this_epoch['amount_per_second']
97 if(time_of_deposit > this_epoch['epoch_end']):
98 seconds_staked_in_epoch = timedelta_to_seconds(from_datetime=time_of_deposit,to_datetime=this_epoch['epoch_end'])
99 else:
100 seconds_staked_in_epoch = timedelta_to_seconds(from_datetime=this_epoch['epoch_start'],to_datetime=this_epoch['epoch_end'])
101 rewards += this_epoch_reward * seconds_staked_in_epoch
102
103
104 collection = I.import_module(farms[farm_id, 'info']['nft_collection_contract'])
105 collection.transfer(name=nft_name, amount=1, to=ctx.caller)
106
107 token = I.import_module(farms[farm_id, 'info']['reward_token_contract'])
108
109 calc_rewards = 0
110
111 if(farms[farm_id, 'withdrawals', ctx.caller, nft_name] == False):
112 calc_rewards = rewards
113 token.transfer(amount=calc_rewards, to=ctx.caller)
114 farms[farm_id, 'withdrawals', ctx.caller, nft_name] = calc_rewards
115 else:
116 calc_rewards = rewards - farms[farm_id, 'withdrawals', ctx.caller, nft_name]
117 token.transfer(amount=calc_rewards, to=ctx.caller)
118 farms[farm_id, 'withdrawals', ctx.caller, nft_name] += calc_rewards
119
120 farms[farm_id, 'info'] = farm_info
121 new_epoch_id = create_new_epoch(farm_id, "withdraw")
122 return new_epoch_id
123
124
125 def timedelta_to_seconds(from_datetime: datetime.datetime, to_datetime: datetime.datetime):
126 delta = to_datetime - from_datetime
127 total = 0
128 total += delta.weeks * 604800
129 total += delta.days * 86400
130 total += delta.hours * 3600
131 total += delta.minutes * 60
132 total += delta.seconds
133 return total
134
135 def end_epoch(farm_id: int):
136 current_epoch_number = farms[farm_id, 'info']['current_epoch']
137 current_epoch_data = farms[farm_id, 'epochs', current_epoch_number]
138
139 current_epoch_data["epoch_end"] = now
140 farms[farm_id, 'epochs', current_epoch_number] = current_epoch_data
141
142 current_farm_info = farms[farm_id, 'info']
143 current_farm_info["current_epoch"] = current_epoch_number + 1
144 farms[farm_id, 'info'] = current_farm_info
145
146
147 def create_new_epoch(farm_id:int, method:str):
148 current_farm_info = farms[farm_id, 'info']
149 current_epoch_number = farms[farm_id, 'info']['current_epoch'] - 1
150 current_epoch_data = farms[farm_id, 'epochs', current_epoch_number]
151
152 new_epoch_number = current_epoch_number + 1
153 new_epoch_data = dict(current_epoch_data)
154
155 if(method == "deposit"):
156 new_epoch_data["staked"] += 1
157
158 if(method == "withdraw"):
159 new_epoch_data["staked"] -= 1
160
161
162 if(new_epoch_data["staked"] == 0):
163 new_epoch_data["amount_per_second"] = (current_farm_info["reward_token_balance"] / timedelta_to_seconds(from_datetime=current_farm_info["start_time"],to_datetime=current_farm_info["end_time"]))
164 else:
165 new_epoch_data["amount_per_second"] = (current_farm_info["reward_token_balance"] / timedelta_to_seconds(from_datetime=current_farm_info["start_time"],to_datetime=current_farm_info["end_time"]) / new_epoch_data["staked"])
166
167
168 new_epoch_data["epoch_start"] = now
169 farms[farm_id, 'epochs', new_epoch_number] = new_epoch_data
170
171 return new_epoch_number
172
173 @export
174 def emergency_withdraw_token(token_contract:str, amount:float):
175 assert ctx.caller == operator.get(), "You are not the operator"
176 token = I.import_module(token_contract)
177 token.transfer(amount=amount, to=ctx.caller)
178
179 @export
180 def emergency_withdraw_nft(contract:str, name:str, amount:int):
181 assert ctx.caller == operator.get(), "You are not the operator"
182 collection = I.import_module(contract)
183 collection.transfer(name=name, amount=amount, to=ctx.caller)

Byte Code

e30000000000000000000000000a00000040000000737601000065005a0165016a026400643064038d0265016a026404643164038d0265016a026405643264038d0267035a0365016a026400643364038d0265016a026404643464038d0265016a026405643564038d0267035a04650564086409640a640b8d035a0665076409640c640d8d025a0865076409640e640d8d025a0965076409640f640d8d025a0a6410641184005a0b650c64098301650d64129c0164136414840483015a0e650c64098301650f64159c0164166417840483015a10650c64098301650d650d650f6511651165116511651164189c086419641a840483015a12650c640983016511650d641b9c02641c641d840483015a13650c640983016511650d641b9c02641e641f840483015a1465156a1565156a1564209c026421642284045a16651164239c016424642584045a176511650d64269c026427642884045a18650c64098301650d650f64299c02642a642b840483015a19650c64098301650d650d6511642c9c03642d642e840483015a1a642f53002936da087472616e73666572da06616d6f756e74da02746f2901da0461726773da07617070726f7665da0d7472616e736665725f66726f6dda0c6d61696e5f6163636f756e74da046e616d6546da14636f6e5f7461757275735f6e66745f6661726d73da056661726d732903da0d64656661756c745f76616c7565da08636f6e74726163747208000000da086f70657261746f722902720c0000007208000000da0e6578697374696e675f6661726d73da03666565630000000000000000000000000200000043000000732400000074006a0174026a038301010074046a0164018301010074056a016402830101006400530029034ee900000000e9020000002906da0a5f5f6f70657261746f72da03736574da03637478da0663616c6c6572da105f5f6578697374696e675f6661726d73da055f5f666565a90072180000007218000000da00da045f5f5f5f10000000730600000000010c010a01721a0000002901da066e65775f6f70630100000000000000010000000200000043000000732400000074006a01830074026a036b027316740464018301820174006a057c00830101006400530029024e7a1a596f7520617265206e6f74207468652063757272656e74206f7029067212000000da0367657472140000007215000000da0e417373657274696f6e4572726f7272130000002901721b000000721800000072180000007219000000da096368616e67655f6f7016000000730400000000021601721e0000002901da076e65775f666565630100000000000000010000000200000043000000732400000074006a01830074026a036b027316740464018301820174056a067c00830101006400530029024e7a1a596f7520617265206e6f74207468652063757272656e74206f7029077212000000721c00000072140000007215000000721d000000721700000072130000002901721f000000721800000072180000007219000000da0a6368616e67655f6665651c00000073040000000002160172200000002908da176e66745f636f6c6c656374696f6e5f636f6e7472616374da157265776172645f746f6b656e5f636f6e7472616374da0c746f74616c5f7061796f7574da08656e645f79656172da09656e645f6d6f6e7468da07656e645f646179da08656e645f686f7572da0a656e645f6d696e7574656308000000000000000d0000000b0000004300000073260100007c0264016b047310740064028301820174016a017c037c047c0564038d0374026b04732c740064048301820174036a047c0083017d0874036a057c0874068302734a740064058301820174036a047c0183017d0974036a057c0974078302736874006406830182017c0264071b00640774086a098300180014007d0a7c027c0a18007d0b7c096a0a7c0a740b6a0c740b6a0d64088d0301007c096a0a7c0b740e6a098300740b6a0d64088d030100740f6a098300640917007d0c7c007c0174016a017c037c047c057c067c07640a8d0574027c0a6401640b9c0674107c0c640c66023c0064017c0a7411740274016a017c037c047c057c067c07640a8d05640d8d021b0064007402640e9c0474107c0c640f640166033c00740f6a127c0c830101006401530029104e72100000007a24546f74616c205061796f7574206e6565647320746f206265206d6f7265207468656e20302903da0479656172da056d6f6e7468da036461797a22456e642054696d65206e6565647320746f20626520696e20746865206675747572657a21496e76616c6964206e667420636f6c6c656374696f6e20696e74657266616365217a18496e76616c696420746f6b656e20696e7465726661636521e9640000002903720200000072030000007207000000e90100000029057229000000722a000000722b000000da04686f7572da066d696e757465290672210000007222000000da08656e645f74696d65da0a73746172745f74696d65da147265776172645f746f6b656e5f62616c616e6365da0d63757272656e745f65706f6368da04696e666f2902da0d66726f6d5f6461746574696d65da0b746f5f6461746574696d652904da067374616b6564da11616d6f756e745f7065725f7365636f6e64da0965706f63685f656e64da0b65706f63685f7374617274da0665706f6368732913721d000000da086461746574696d65da036e6f77da0149da0d696d706f72745f6d6f64756c65da11656e666f7263655f696e74657266616365da0d6e66745f696e74657266616365da0f746f6b656e5f696e746572666163657217000000721c00000072060000007214000000da0474686973721500000072120000007216000000da075f5f6661726d73da165f5f74696d6564656c74615f746f5f7365636f6e64737213000000290d72210000007222000000722300000072240000007225000000722600000072270000007228000000da0a636f6c6c656374696f6eda05746f6b656eda14746f74616c5f7061796f75745f6465706f736974da066f705f666565da0b6e65775f6661726d5f6964721800000072180000007219000000da0b6372656174655f6661726d220000007338000000000410010e010e010a010e0106010a010e010601140108010a010a010c010a010c02020108010c0104011001020106010801120112010a01724b0000002902da076661726d5f6964da086e66745f6e616d65630200000000000000040000000600000043000000738e00000074007c0064016602190064026b037318740164038301820174007c006401660219006404190074026b047334740164058301820174036a0474007c006401660219006406190083017d027c026a057c01640774066a0774066a0864088d04010074097c0083010100740a7c00640983027d037c037402640a9c0274007c00640b74066a087c0166043c00640c5300290d4e7234000000467a1854686973206661726d20646f6573206e6f7420657869737472300000007a1354686973206661726d20697320636c6f7365647221000000722d00000029047208000000720200000072030000007207000000da076465706f7369742902da0b73746172745f65706f63687231000000da086465706f7369747354290b7244000000721d000000723d000000723e000000723f0000007206000000721400000072430000007215000000da0b5f5f656e645f65706f6368da125f5f6372656174655f6e65775f65706f63682904724c000000724d0000007246000000da0c6e65775f65706f63685f6964721800000072180000007219000000da0f6465706f7369745f746f5f6661726d450000007314000000000218011c010e0108010c010a0108010a021801725400000063020000000000000010000000060000004300000073de01000074007c00640174016a027c016604190064026b03731e740364038301820174007c006404660219006405190074046b04733a740364068301820174007c00640174016a027c0166041900640719007d0274007c00640174016a027c0166041900640819007d0374007c00640466021900640919007d0474007c006404660219007d057c047c0218007d0674057c0083010100640a7d07786a74067c027c04640b1700830244005d587d0874007c00640c7c08660319007d097c09640d19007d0a7c037c09640e19006b0472de74077c037c09640e1900640f8d027d0b6e1474077c09641019007c09640e1900640f8d027d0b7c077c0a7c0b140037007d0771a6570074086a0974007c006404660219006411190083017d0c7c0c6a0a7c01640b74016a0264128d03010074086a0974007c006404660219006413190083017d0d640a7d0e74007c00641474016a027c016604190064026b02900172847c077d0e7c0d6a0a7c0e74016a0264158d0201007c0e74007c00641474016a027c0166043c006e407c0774007c00641474016a027c016604190018007d0e7c0d6a0a7c0e74016a0264158d02010074007c00641474016a027c016604050019007c0e370003003c007c0574007c00640466023c00740b7c00641683027d0f7c0f530029174e7250000000467a2d596f7520646f6e277420686176652074686174204e4654206465706f736974656420696e20746865206661726d723400000072300000007a1354686973206661726d20697320636c6f736564724f000000723100000072330000007210000000722d000000723b00000072380000007239000000290272350000007236000000723a000000722100000029037208000000720200000072030000007222000000da0b7769746864726177616c73290272020000007203000000da087769746864726177290c724400000072140000007215000000721d000000723d0000007251000000da0572616e67657245000000723e000000723f000000720100000072520000002910724c000000724d000000da1065706f63685f6f665f6465706f736974da0f74696d655f6f665f6465706f7369747233000000da096661726d5f696e666fda0d65706f6368735f7374616b6564da0772657761726473da0565706f6368da0a746869735f65706f6368da11746869735f65706f63685f726577617264da177365636f6e64735f7374616b65645f696e5f65706f636872460000007247000000da0c63616c635f726577617264737253000000721800000072180000007219000000da1877697468647261775f726577617264735f616e645f6e667454000000734a000000000210010e011c01100106011001060110010c0108010801040114010e0108010c01020110020201120110010e01080112011601040118010401100114020c010a0110011a010c010a01726200000029027235000000723600000063020000000000000004000000030000004300000073520000007c017c0018007d0264017d037c037c026a006402140037007d037c037c026a016403140037007d037c037c026a026404140037007d037c037c026a036405140037007d037c037c026a0437007d037c03530029064e721000000069803a0900698051010069100e0000e93c0000002905da057765656b73da0464617973da05686f757273da076d696e75746573da077365636f6e6473290472350000007236000000da0564656c7461da05746f74616c72180000007218000000721900000072450000007f00000073100000000002080104010e010e010e010e010a0172450000002901724c000000630100000000000000040000000500000043000000735c00000074007c00640166021900640219007d0174007c0064037c01660319007d0274017c0264043c007c0274007c0064037c0166033c0074007c006401660219007d037c01640517007c0364023c007c0374007c00640166023c006400530029064e72340000007233000000723b0000007239000000722d00000029027244000000723d0000002904724c000000da1463757272656e745f65706f63685f6e756d626572da1263757272656e745f65706f63685f64617461da1163757272656e745f6661726d5f696e666f72180000007218000000721900000072510000008b000000730e000000000110010e0108010e010c010c0172510000002902724c000000da066d6574686f6463020000000000000007000000050000004300000073de00000074007c006401660219007d0274007c0064016602190064021900640318007d0374007c0064047c03660319007d047c03640317007d0574017c0483017d067c0164056b0272567c066406050019006403370003003c007c0164076b02726e7c066406050019006403380003003c007c066406190064086b02729c7c026409190074027c02640a19007c02640b1900640c8d021b007c06640d3c006e287c026409190074027c02640a19007c02640b1900640c8d021b007c06640619001b007c06640d3c0074037c06640e3c007c0674007c0064047c0566033c007c055300290f4e72340000007233000000722d000000723b000000724e0000007237000000725600000072100000007232000000723100000072300000002902723500000072360000007238000000723a00000029047244000000da04646963747245000000723d0000002907724c000000726e000000726d000000726b000000726c000000da106e65775f65706f63685f6e756d626572da0e6e65775f65706f63685f64617461721800000072180000007219000000725200000095000000732400000000010c0114010e010801080108011001080110010c010201060108011205280108010e0172520000002902da0e746f6b656e5f636f6e74726163747202000000630200000000000000030000000400000043000000733400000074006a0174026a0383006b027316740464018301820174056a067c0083017d027c026a077c0174006a0164028d0201006400530029034e7a18596f7520617265206e6f7420746865206f70657261746f722902720200000072030000002908721400000072150000007212000000721c000000721d000000723e000000723f00000072010000002903727200000072020000007247000000721800000072180000007219000000da18656d657267656e63795f77697468647261775f746f6b656eae0000007306000000000216010a0172730000002903720c00000072080000007202000000630300000000000000040000000500000043000000733600000074006a0174026a0383006b027316740464018301820174056a067c0083017d037c036a077c017c0274006a0164028d0301006400530029034e7a18596f7520617265206e6f7420746865206f70657261746f7229037208000000720200000072030000002908721400000072150000007212000000721c000000721d000000723e000000723f00000072010000002904720c000000720800000072020000007246000000721800000072180000007219000000da16656d657267656e63795f77697468647261775f6e6674b50000007306000000000216010a0172740000004e29027202000000720300000029027202000000720300000029037202000000720300000072070000002903720800000072020000007203000000290372020000007208000000720300000029047208000000720200000072030000007207000000291bda09696d706f72746c6962723e000000da0446756e6372420000007241000000da04486173687244000000da085661726961626c65721200000072160000007217000000721a000000da085f5f6578706f7274da03737472721e000000da05666c6f61747220000000da03696e74724b00000072540000007262000000723c000000724500000072510000007252000000727300000072740000007218000000721800000072180000007219000000da083c6d6f64756c653e010000007342000000040110010e010a0110010e010a01060108010c01040108010c030806060110050601100506010401080112200601120e0601122a0401100b0e0a1019060112060601