Contract con_neb_vault_int_035


Contract Code


  
1 # _ _ _ _ _____ _ _ __ __ _ _
2 # | \ | | | | | | |_ _| | | | | \ \ / / | | |
3 # | \| | ___| |__ _ _| | __ _ | | _ __ | |_ ___ _ __ _ __ __ _| | \ \ / /_ _ _ _| | |_
4 # | . ` |/ _ \ '_ \| | | | |/ _` | | | | '_ \| __/ _ \ '__| '_ \ / _` | | \ \/ / _` | | | | | __|
5 # | |\ | __/ |_) | |_| | | (_| | _| |_| | | | || __/ | | | | | (_| | | \ / (_| | |_| | | |_
6 # |_| \_|\___|_.__/ \__,_|_|\__,_| |_____|_| |_|\__\___|_| |_| |_|\__,_|_| \/ \__,_|\__,_|_|\__|
7 #
8 # Version 1.2
9
10 I = importlib
11
12 staking = Hash(default_value=0.0)
13 payouts = Hash(default_value=0.0)
14
15 emission_con = Variable()
16 total_emission = Variable()
17
18 total_stake = Variable()
19 current_stake = Variable()
20
21 active = Variable()
22 funded = Variable()
23
24 start_date = Variable()
25 start_date_end = Variable()
26 end_date = Variable()
27
28 NEB_FEE = 2
29 NEB_CONTRACT = 'con_nebula'
30 LP_VAULT = 'con_neb_vault_lp_005'
31 MIN_STAKE_PERIOD = 2880
32 MAX_RUNTIME = 129600
33
34 OPERATORS = [
35 'ae7d14d6d9b8443f881ba6244727b69b681010e782d4fe482dbfb0b6aca02d5d',
36 'e787ed5907742fa8d50b3ca2701ab8e03ec749ced806a15cdab800a127d7f863'
37 ]
38
39 @export
40 def fund_vault(emission_contract: str, total_emission_amount: float, total_stake_amount: float,
41 minutes_till_start: int, start_period_in_minutes: int, minutes_till_end: int):
42
43 assert isinstance(total_emission_amount, decimal), 'Type of total_emission_amount must be float'
44 assert isinstance(total_stake_amount, decimal), 'Type of total_stake_amount must be float'
45 assert isinstance(minutes_till_start, int), 'Type of minutes_till_start must be int'
46 assert isinstance(start_period_in_minutes, int), 'Type of start_period_in_minutes must be int'
47 assert isinstance(minutes_till_end, int), 'Type of minutes_till_end must be int'
48
49 assert funded.get() != True, 'Vault is already funded!'
50 assert total_emission_amount > 0, 'total_emission_amount not valid!'
51 assert total_stake_amount > 0, 'total_stake_amount not valid!'
52 assert minutes_till_start > 0, 'minutes_till_start not valid!'
53 assert start_period_in_minutes >= MIN_STAKE_PERIOD, 'Staking needs to be open for at least 2 days!'
54 assert minutes_till_end > 0 and minutes_till_end <= MAX_RUNTIME, 'minutes_till_end not valid!'
55
56 ec = I.import_module(emission_contract)
57 emission_con.set(emission_contract)
58
59 current_stake.set(decimal(0))
60 total_emission.set(total_emission_amount)
61 total_stake.set(total_stake_amount)
62
63 start_date.set(now + datetime.timedelta(minutes=minutes_till_start))
64 start_date_end.set(start_date.get() + datetime.timedelta(minutes=start_period_in_minutes))
65 end_date.set(start_date_end.get() + datetime.timedelta(minutes=minutes_till_end))
66
67 single_fee = (total_emission.get() / 100 * decimal(NEB_FEE)) / decimal(len(OPERATORS))
68
69 for address in OPERATORS:
70 I.import_module(emission_con.get()).transfer_from(
71 main_account=ctx.caller,
72 amount=single_fee,
73 to=address)
74
75 send_to_vault(emission_con.get(), total_emission.get())
76
77 active.set(True)
78 funded.set(True)
79
80 @export
81 def send_to_vault(contract: str, amount: float):
82 I.import_module(contract).transfer_from(
83 main_account=ctx.caller,
84 amount=amount,
85 to=ctx.this)
86
87 @export
88 def stake(neb_amount: float):
89 assert_active()
90
91 assert neb_amount > 0, 'Negative amounts are not allowed'
92 assert isinstance(neb_amount, decimal), 'Type of neb_amount must be float'
93 assert now > start_date.get(), f'Staking not started yet: {start_date.get()}'
94 assert now < start_date_end.get(), f'Staking period ended: {start_date_end.get()}'
95
96 staking[ctx.caller] += neb_amount
97 send_to_vault(NEB_CONTRACT, neb_amount)
98 current_stake.set(current_stake.get() + neb_amount)
99
100 level = I.import_module(LP_VAULT).lock()
101
102 max_stake = total_stake.get() / 100 * level['emission']
103
104 assert staking[ctx.caller] <= max_stake, f'Max stake exceeded: {max_stake} NEB (Level {level["level"]})'
105 assert current_stake.get() <= total_stake.get(), f'Max total stake exceeded: {total_stake.get()} NEB'
106
107 @export
108 def unstake():
109 assert_active()
110
111 assert staking[ctx.caller] > 0, f'Address is not staking!'
112 assert now > end_date.get(), f'End date not reached: {end_date.get()}'
113
114 stake_percent = staking[ctx.caller] / current_stake.get() * 100
115 user_emission = total_emission.get() / 100 * stake_percent
116
117 I.import_module(emission_con.get()).transfer(
118 amount=user_emission,
119 to=ctx.caller)
120
121 I.import_module(NEB_CONTRACT).transfer(
122 amount=staking[ctx.caller],
123 to=ctx.caller)
124
125 I.import_module(LP_VAULT).unlock()
126
127 staking[ctx.caller] = decimal(0)
128 payouts[ctx.caller] = user_emission
129
130 return f'Emission: {user_emission} {emission_con.get()}'
131
132 @export
133 def active(is_active: bool):
134 active.set(is_active)
135 assert_owner()
136
137 @export
138 def emergency_withdraw(contract: str, amount: float):
139 I.import_module(contract).transfer(amount, ctx.caller)
140 assert_owner()
141
142 @export
143 def emergency_set_stake(address: str, amount: float):
144 staking[address] = amount
145 assert_owner()
146
147 def assert_active():
148 assert active.get() == True, 'Vault inactive!'
149
150 def assert_owner():
151 assert ctx.caller in OPERATORS, 'Only executable by operators!'

Byte Code

e30000000000000000000000000800000040000000736801000065005a0165026503640083016401640264038d035a0465026503640083016401640464038d035a0565066401640564068d025a0765066401640764068d025a0865066401640864068d025a0965066401640964068d025a0a65066401640a64068d025a0b65066401640b64068d025a0c65066401640c64068d025a0d65066401640d64068d025a0e65066401640e64068d025a0f640f5a1064105a1164115a1264125a1364135a146414641567025a1565166401830165176518651865196519651964169c0664176418840483015a1a6516640183016517651864199c02641a641b840483015a1b6516640183016518641c9c01641d641e840483015a1c651664018301641f6420840083015a1d651664018301651e64219c016422640a840483015a1f6516640183016517651864199c0264236424840483015a206516640183016517651864259c0264266427840483015a216428642984005a22642a642b84005a23642c5300292d7a03302e30da15636f6e5f6e65625f7661756c745f696e745f303335da077374616b696e672903da0d64656661756c745f76616c7565da08636f6e7472616374da046e616d65da077061796f757473da0c656d697373696f6e5f636f6e290272040000007205000000da0e746f74616c5f656d697373696f6eda0b746f74616c5f7374616b65da0d63757272656e745f7374616b65da06616374697665da0666756e646564da0a73746172745f64617465da0e73746172745f646174655f656e64da08656e645f64617465e902000000da0a636f6e5f6e6562756c61da14636f6e5f6e65625f7661756c745f6c705f30303569400b00006940fa0100da4061653764313464366439623834343366383831626136323434373237623639623638313031306537383264346665343832646266623062366163613032643564da40653738376564353930373734326661386435306233636132373031616238653033656337343963656438303661313563646162383030613132376437663836332906da11656d697373696f6e5f636f6e7472616374da15746f74616c5f656d697373696f6e5f616d6f756e74da12746f74616c5f7374616b655f616d6f756e74da126d696e757465735f74696c6c5f7374617274da1773746172745f706572696f645f696e5f6d696e75746573da106d696e757465735f74696c6c5f656e6463060000000000000009000000060000004300000073bc01000074007c01740183027312740264018301820174007c02740183027324740264028301820174007c03740383027336740264038301820174007c04740383027348740264048301820174007c0574038302735a740264058301820174046a05830064066b03736e74026407830182017c0164086b04737e74026409830182017c0264086b04738e7402640a830182017c0364086b04739e7402640b830182017c0474066b0573ae7402640c830182017c0564086b0472be7c0574076b0173c67402640d8301820174086a097c0083017d06740a6a0b7c0083010100740c6a0b74016408830183010100740d6a0b7c0183010100740e6a0b7c0283010100740f6a0b741074116a127c03640e8d0117008301010074136a0b740f6a05830074116a127c04640e8d0117008301010074146a0b74136a05830074116a127c05640e8d01170083010100740d6a058300640f1b007401741583011400740174167417830183011b007d07782a741744005d227d0874086a09740a6a05830083016a1874196a1a7c077c0864108d0301009001716c5700741b740a6a058300740d6a05830083020100741c6a0b64068301010074046a0b6406830101006400530029114e7a2b54797065206f6620746f74616c5f656d697373696f6e5f616d6f756e74206d75737420626520666c6f61747a2854797065206f6620746f74616c5f7374616b655f616d6f756e74206d75737420626520666c6f61747a2654797065206f66206d696e757465735f74696c6c5f7374617274206d75737420626520696e747a2b54797065206f662073746172745f706572696f645f696e5f6d696e75746573206d75737420626520696e747a2454797065206f66206d696e757465735f74696c6c5f656e64206d75737420626520696e74547a185661756c7420697320616c72656164792066756e64656421e9000000007a20746f74616c5f656d697373696f6e5f616d6f756e74206e6f742076616c6964217a1d746f74616c5f7374616b655f616d6f756e74206e6f742076616c6964217a1d6d696e757465735f74696c6c5f7374617274206e6f742076616c6964217a2d5374616b696e67206e6565647320746f206265206f70656e20666f72206174206c6561737420322064617973217a1b6d696e757465735f74696c6c5f656e64206e6f742076616c6964212901da076d696e75746573e9640000002903da0c6d61696e5f6163636f756e74da06616d6f756e74da02746f291dda0a6973696e7374616e6365da07646563696d616cda0e417373657274696f6e4572726f72da03696e74da085f5f66756e646564da03676574da104d494e5f5354414b455f504552494f44da0b4d41585f52554e54494d45da0149da0d696d706f72745f6d6f64756c65da0e5f5f656d697373696f6e5f636f6eda03736574da0f5f5f63757272656e745f7374616b65da105f5f746f74616c5f656d697373696f6eda0d5f5f746f74616c5f7374616b65da0c5f5f73746172745f64617465da036e6f77da086461746574696d65da0974696d6564656c7461da105f5f73746172745f646174655f656e64da0a5f5f656e645f64617465da074e45425f464545da036c656eda094f50455241544f5253da0d7472616e736665725f66726f6dda03637478da0663616c6c6572da0d73656e645f746f5f7661756c74da085f5f616374697665290972150000007216000000721700000072180000007219000000721a000000da026563da0a73696e676c655f666565da0761646472657373a9007241000000da00da0a66756e645f7661756c741c000000734400000000040c0106010c0106010c0106010c0106010c0106011401100110011001100118010a010a010e010a010a0116010e010c010e010c0116010a010a010e01140112010a01724300000029027204000000721f000000630200000000000000020000000500000043000000731e00000074006a017c0083016a0274036a047c0174036a0564018d0301006400530029024e2903721e000000721f000000722000000029067229000000722a0000007239000000723a000000723b000000da047468697329027204000000721f000000724100000072410000007242000000723c00000044000000730400000000020e01723c0000002901da0a6e65625f616d6f756e7463010000000000000003000000060000004300000073060100007400830001007c0064016b047316740164028301820174027c007403830273287401640383018201740474056a0683006b0473467401640474056a0683009b009d0283018201740474076a0683006b0073647401640574076a0683009b009d0283018201740874096a0a050019007c00370003003c00740b740c7c0083020100740d6a0e740d6a0683007c00170083010100740f6a10741183016a1283007d0174136a06830064061b007c016407190014007d02740874096a0a19007c026b0173dc740164087c029b0064097c01640a19009b00640b9d0583018201740d6a06830074136a0683006b01900173027401640c74136a0683009b00640d9d038301820164005300290e4e721b0000007a204e6567617469766520616d6f756e747320617265206e6f7420616c6c6f7765647a2054797065206f66206e65625f616d6f756e74206d75737420626520666c6f61747a195374616b696e67206e6f742073746172746564207965743a207a165374616b696e6720706572696f6420656e6465643a20721d000000da08656d697373696f6e7a144d6178207374616b652065786365656465643a207a0c204e454220284c6576656c20da056c6576656cfa01297a1a4d617820746f74616c207374616b652065786365656465643a207a04204e45422914da0f5f5f6173736572745f6163746976657223000000722100000072220000007231000000723000000072260000007234000000da095f5f7374616b696e67723a000000723b000000723c000000da0c4e45425f434f4e5452414354722d000000722c0000007229000000722a000000da084c505f5641554c54da046c6f636b722f000000290372450000007247000000da096d61785f7374616b65724100000072410000007242000000da057374616b654a000000732000000000020601100112010e0110010e01100112010a0112010e011401080120011401724f00000063000000000000000002000000040000004300000073d0000000740083000100740174026a03190064016b04731c7404640283018201740574066a0783006b04733a7404640374066a0783009b009d0283018201740174026a03190074086a0783001b00640414007d0074096a07830064041b007c0014007d01740a6a0b740c6a07830083016a0d7c0174026a0364058d020100740a6a0b740e83016a0d740174026a03190074026a0364058d020100740a6a0b740f83016a1083000100741164018301740174026a033c007c01741274026a033c0064067c019b006407740c6a0783009b009d04530029084e721b0000007a1741646472657373206973206e6f74207374616b696e67217a16456e642064617465206e6f7420726561636865643a20721d0000002902721f00000072200000007a0a456d697373696f6e3a20fa012029137249000000724a000000723a000000723b0000007223000000723100000072350000007226000000722d000000722e0000007229000000722a000000722b000000da087472616e73666572724b000000724c000000da06756e6c6f636b7222000000da095f5f7061796f7574732902da0d7374616b655f70657263656e74da0d757365725f656d697373696f6e724100000072410000007242000000da07756e7374616b655e000000731a0000000002060116011e011601100110010a0112010a010e010e010a0172560000002901da0969735f616374697665630100000000000000010000000200000043000000731400000074006a017c00830101007402830001006400530029014e2903723d000000722c000000da0e5f5f6173736572745f6f776e657229017257000000724100000072410000007242000000720b0000006f000000730400000000020a01630200000000000000020000000300000043000000731e00000074006a017c0083016a027c0174036a04830201007405830001006400530029014e29067229000000722a0000007251000000723a000000723b000000725800000029027204000000721f000000724100000072410000007242000000da12656d657267656e63795f776974686472617775000000730400000000021401725900000029027240000000721f00000063020000000000000002000000030000004300000073120000007c0174007c003c007401830001006400530029014e2902724a000000725800000029027240000000721f000000724100000072410000007242000000da13656d657267656e63795f7365745f7374616b657b000000730400000000020801725a000000630000000000000000000000000200000043000000731800000074006a01830064016b02731474026402830182016400530029034e547a0f5661756c7420696e616374697665212903723d000000722600000072230000007241000000724100000072410000007242000000724900000081000000730200000000017249000000630000000000000000000000000200000043000000731600000074006a0174026b06731274036401830182016400530029024e7a1d4f6e6c792065786563757461626c65206279206f70657261746f7273212904723a000000723b0000007238000000722300000072410000007241000000724100000072420000007258000000850000007302000000000172580000004e2924da09696d706f72746c69627229000000da04486173687222000000724a0000007253000000da085661726961626c65722b000000722e000000722f000000722d000000723d00000072250000007230000000723400000072350000007236000000724b000000724c000000722700000072280000007238000000da085f5f6578706f7274da03737472da05666c6f617472240000007243000000723c000000724f0000007256000000da04626f6f6c720b0000007259000000725a000000724900000072580000007241000000724100000072410000007242000000da083c6d6f64756c653e010000007350000000040108010a0108010a010c02040108010c01040108010c010c010c01040108010c0104010401040104010401020106030601040104011225060112050601101310110601100506011205060112050804