Contract con_vault_ext_011


Contract Code


  
1 staking = Hash(default_value=0)
2
3 stake_con = Variable()
4 emission_con = Variable()
5
6 total_emission = Variable()
7 total_stake = Variable()
8
9 current_stake = Variable()
10 max_single_stake = Variable()
11
12 active = Variable()
13
14 dev_addr = Variable()
15 dev_lock = Variable()
16
17 start_date = Variable()
18 start_date_end = Variable()
19 end_date = Variable()
20
21 NEB_FEE = 2
22 OPERATORS = [
23 'ae7d14d6d9b8443f881ba6244727b69b681010e782d4fe482dbfb0b6aca02d5d',
24 'e787ed5907742fa8d50b3ca2701ab8e03ec749ced806a15cdab800a127d7f863'
25 ]
26
27 @export
28 def fund_vault(stake_contract: str, emission_contract: str, total_emission_amount: float, total_stake_amount: float,
29 minutes_till_start: int, start_period_in_minutes: int, minutes_till_end: int, dev_lock_amount: float, max_single_stake_percent: float):
30
31 assert total_emission_amount > 0, 'total_emission_amount not valid!'
32 assert total_stake_amount > 0, 'total_stake_amount not valid!'
33 assert minutes_till_start > 0, 'minutes_till_start not valid!'
34 assert start_period_in_minutes >= 5, 'Staking needs to be open for at least 2 days!'
35 assert minutes_till_end > 0, 'minutes_till_end not valid!'
36 assert dev_lock_amount >= 0, 'dev_fee not valid!'
37 assert max_single_stake_percent > 0, 'max_single_stake_percent not valid!'
38
39 dev_addr.set(ctx.caller)
40 dev_lock.set(dev_lock_amount)
41
42 stake_con.set(stake_contract)
43 emission_con.set(emission_contract)
44
45 current_stake.set(0)
46 total_emission.set(total_emission_amount)
47 total_stake.set(total_stake_amount)
48 max_single_stake.set(total_stake_amount / 100 * max_single_stake_percent)
49
50 start_date.set(now + datetime.timedelta(minutes=minutes_till_start))
51 start_date_end.set(start_date.get() + datetime.timedelta(minutes=start_period_in_minutes))
52 end_date.set(start_date_end.get() + datetime.timedelta(minutes=minutes_till_end))
53
54 vault = ForeignVariable(foreign_contract='con_nebula', foreign_name='vault_contract')
55
56 if not vault.get():
57 vault = Variable()
58 vault.set('INTERNAL_NEB_VAULT')
59
60 # Pay Nebula fee
61 importlib.import_module(emission_con.get()).transfer_from(
62 amount=total_emission.get() / 100 * NEB_FEE,
63 main_account=ctx.caller,
64 to=vault.get())
65
66 # Pay dev fee
67 if dev_lock.get() > 0:
68 send_to_vault(emission_con.get(), dev_lock.get())
69
70 # Pay total emission amount
71 send_to_vault(emission_con.get(), total_emission.get())
72
73 active.set(True)
74
75 @export
76 def send_to_vault(contract: str, amount: float):
77 importlib.import_module(contract).transfer_from(
78 main_account=ctx.caller,
79 amount=amount,
80 to=ctx.this)
81
82 @export
83 def stake(amount: float):
84 assert_active()
85
86 assert now > start_date.get(), f'Staking not started yet: {start_date.get()}'
87 assert now < start_date_end.get(), f'Staking period ended: {start_date_end.get()}'
88 assert amount > 0, 'Amount must be > 0'
89
90 staking[ctx.caller] += amount
91 send_to_vault(stake_con.get(), amount)
92 current_stake.set(current_stake.get() + amount)
93
94 # Check if max stake amount is reached
95 assert staking[ctx.caller] <= max_single_stake.get(), f'Max stake amount exceeded: {max_single_stake.get()}'
96
97 @export
98 def unstake():
99 assert_active()
100
101 assert staking[ctx.caller] != 0, f'Address is not staking!'
102 assert now > end_date.get(), f'End date not reached: {end_date.get()}'
103
104 stake_percent = staking[ctx.caller] / current_stake.get() * 100
105 user_emission = total_emission.get() / 100 * stake_percent
106
107 # Pay emissions to user
108 importlib.import_module(emission_con.get()).transfer(
109 amount=user_emission,
110 to=ctx.caller)
111
112 # Pay stake to user
113 importlib.import_module(stake_con.get()).transfer(
114 amount=staking[ctx.caller],
115 to=ctx.caller)
116
117 staking[ctx.caller] = 0
118
119 return f'Emission: {emission} {emission_contract}'
120
121 @export
122 def enable_vault():
123 assert_owner()
124 active.set(True)
125
126 @export
127 def disable_vault():
128 assert_owner()
129 active.set(False)
130
131 @export
132 def emergency_withdraw(contract: str, amount: float):
133 assert_owner()
134 importlib.import_module(contract).transfer(amount, ctx.caller)
135
136 @export
137 def pay_back_dev_fee():
138 assert_active()
139
140 assert now > end_date.get(), f'End date not reached: {end_date.get()}'
141 assert dev_addr.get() == ctx.caller, 'You are not the vault creator!'
142 assert dev_lock.get() > 0, 'No dev funds locked!'
143
144 # Pay locked dev fund back to dev
145 importlib.import_module(emission_con.get()).transfer(
146 amount=dev_lock.get(),
147 to=dev_addr.get())
148
149 def assert_active():
150 assert active.get() == True, 'Vault inactive!'
151
152 def assert_owner():
153 assert ctx.caller in OPERATORS, 'Only executable by operators!'

Byte Code

e30000000000000000000000000b00000040000000736a010000650064006401640264038d035a0165026401640464058d025a0365026401640664058d025a0465026401640764058d025a0565026401640864058d025a0665026401640964058d025a0765026401640a64058d025a0865026401640b64058d025a0965026401640c64058d025a0a65026401640d64058d025a0b65026401640e64058d025a0c65026401640f64058d025a0d65026401641064058d025a0e64115a0f6412641367025a1065116401830165126512651365136514651465146513651364149c0964156416840483015a156511640183016512651364179c0264186419840483015a166511640183016513641a9c01641b641c840483015a17651164018301641d641e840083015a18651164018301641f6420840083015a1965116401830164216422840083015a1a6511640183016512651364179c0264236424840483015a1b65116401830164256426840083015a1c6427642884005a1d6429642a84005a1e642b5300292ce900000000da11636f6e5f7661756c745f6578745f303131da077374616b696e672903da0d64656661756c745f76616c7565da08636f6e7472616374da046e616d65da097374616b655f636f6e290272050000007206000000da0c656d697373696f6e5f636f6eda0e746f74616c5f656d697373696f6eda0b746f74616c5f7374616b65da0d63757272656e745f7374616b65da106d61785f73696e676c655f7374616b65da06616374697665da086465765f61646472da086465765f6c6f636bda0a73746172745f64617465da0e73746172745f646174655f656e64da08656e645f64617465e902000000da4061653764313464366439623834343366383831626136323434373237623639623638313031306537383264346665343832646266623062366163613032643564da40653738376564353930373734326661386435306233636132373031616238653033656337343963656438303661313563646162383030613132376437663836332909da0e7374616b655f636f6e7472616374da11656d697373696f6e5f636f6e7472616374da15746f74616c5f656d697373696f6e5f616d6f756e74da12746f74616c5f7374616b655f616d6f756e74da126d696e757465735f74696c6c5f7374617274da1773746172745f706572696f645f696e5f6d696e75746573da106d696e757465735f74696c6c5f656e64da0f6465765f6c6f636b5f616d6f756e74da186d61785f73696e676c655f7374616b655f70657263656e746309000000000000000a000000060000004300000073b00100007c0264016b04731074006402830182017c0364016b04732074006403830182017c0464016b04733074006404830182017c0564056b05734074006406830182017c0664016b04735074006407830182017c0764016b05736074006408830182017c0864016b047370740064098301820174016a0274036a048301010074056a027c078301010074066a027c008301010074076a027c018301010074086a0264018301010074096a027c0283010100740a6a027c0383010100740b6a027c03640a1b007c08140083010100740c6a02740d740e6a0f7c04640b8d0117008301010074106a02740c6a118300740e6a0f7c05640b8d0117008301010074126a0274106a118300740e6a0f7c06640b8d011700830101007413640c640d640e640f64108d047d097c096a118300900173447414640e640f64118d027d097c096a0264128301010074156a1674076a11830083016a1774096a118300640a1b007418140074036a047c096a11830064138d03010074056a11830064016b0490017290741974076a11830074056a11830083020100741974076a11830074096a11830083020100741a6a026414830101006400530029154e72010000007a20746f74616c5f656d697373696f6e5f616d6f756e74206e6f742076616c6964217a1d746f74616c5f7374616b655f616d6f756e74206e6f742076616c6964217a1d6d696e757465735f74696c6c5f7374617274206e6f742076616c696421e9050000007a2d5374616b696e67206e6565647320746f206265206f70656e20666f72206174206c6561737420322064617973217a1b6d696e757465735f74696c6c5f656e64206e6f742076616c6964217a126465765f666565206e6f742076616c6964217a236d61785f73696e676c655f7374616b655f70657263656e74206e6f742076616c696421e9640000002901da076d696e75746573da0a636f6e5f6e6562756c61da0e7661756c745f636f6e74726163747202000000da057661756c742904da10666f726569676e5f636f6e7472616374da0c666f726569676e5f6e616d6572050000007206000000290272050000007206000000da12494e5445524e414c5f4e45425f5641554c542903da06616d6f756e74da0c6d61696e5f6163636f756e74da02746f54291bda0e417373657274696f6e4572726f72da0a5f5f6465765f61646472da03736574da03637478da0663616c6c6572da0a5f5f6465765f6c6f636bda0b5f5f7374616b655f636f6eda0e5f5f656d697373696f6e5f636f6eda0f5f5f63757272656e745f7374616b65da105f5f746f74616c5f656d697373696f6eda0d5f5f746f74616c5f7374616b65da125f5f6d61785f73696e676c655f7374616b65da0c5f5f73746172745f64617465da036e6f77da086461746574696d65da0974696d6564656c7461da105f5f73746172745f646174655f656e64da03676574da0a5f5f656e645f64617465da0f466f726569676e5661726961626c65da085661726961626c65da09696d706f72746c6962da0d696d706f72745f6d6f64756c65da0d7472616e736665725f66726f6dda074e45425f464545da0d73656e645f746f5f7661756c74da085f5f616374697665290a7216000000721700000072180000007219000000721a000000721b000000721c000000721d000000721e000000da075f5f7661756c74a9007247000000da00da0a66756e645f7661756c74160000007340000000000510011001100110011001100110010c010a010a010a010a010a010a01120116010e010c010e010c0104010c010a010c010a010e0112010c010e01120112017249000000290272050000007228000000630200000000000000020000000500000043000000731e00000074006a017c0083016a0274036a047c0174036a0564018d0301006400530029024e290372290000007228000000722a0000002906724000000072410000007242000000722e000000722f000000da047468697329027205000000722800000072470000007247000000724800000072440000003d000000730400000000020e0172440000002901722800000063010000000000000001000000040000004300000073ac000000740083000100740174026a0383006b0473247404640174026a0383009b009d0283018201740174056a0383006b0073427404640274056a0383009b009d02830182017c0064036b0473527404640483018201740674076a08050019007c00370003003c007409740a6a0383007c0083020100740b6a0c740b6a0383007c00170083010100740674076a081900740d6a0383006b0173a874046405740d6a0383009b009d02830182016400530029064e7a195374616b696e67206e6f742073746172746564207965743a207a165374616b696e6720706572696f6420656e6465643a2072010000007a12416d6f756e74206d757374206265203e20307a1b4d6178207374616b6520616d6f756e742065786365656465643a20290eda0f5f5f6173736572745f61637469766572380000007237000000723c000000722b000000723b000000da095f5f7374616b696e67722e000000722f000000724400000072310000007233000000722d000000723600000029017228000000724700000072470000007248000000da057374616b65430000007316000000000206010e0110010e011001100112010e0112011401724d00000063000000000000000002000000040000004300000073b4000000740083000100740174026a03190064016b03731c7404640283018201740574066a0783006b04733a7404640374066a0783009b009d0283018201740174026a03190074086a0783001b00640414007d0074096a07830064041b007c0014007d01740a6a0b740c6a07830083016a0d7c0174026a0364058d020100740a6a0b740e6a07830083016a0d740174026a03190074026a0364058d0201006401740174026a033c006406740f9b00640774109b009d04530029084e72010000007a1741646472657373206973206e6f74207374616b696e67217a16456e642064617465206e6f7420726561636865643a20722000000029027228000000722a0000007a0a456d697373696f6e3a20fa01202911724b000000724c000000722e000000722f000000722b0000007238000000723d000000723c00000072330000007234000000724000000072410000007232000000da087472616e736665727231000000da08656d697373696f6e72170000002902da0d7374616b655f70657263656e74da0d757365725f656d697373696f6e724700000072470000007248000000da07756e7374616b655200000073160000000002060116011e01160110010e010c01100110010a017253000000630000000000000000000000000200000043000000731400000074008300010074016a026401830101006400530029024e542903da0e5f5f6173736572745f6f776e65727245000000722d0000007247000000724700000072470000007248000000da0c656e61626c655f7661756c74610000007304000000000206017255000000630000000000000000000000000200000043000000731400000074008300010074016a026401830101006400530029024e46290372540000007245000000722d0000007247000000724700000072470000007248000000da0d64697361626c655f7661756c74670000007304000000000206017256000000630200000000000000020000000300000043000000731e00000074008300010074016a027c0083016a037c0174046a05830201006400530029014e2906725400000072400000007241000000724f000000722e000000722f000000290272050000007228000000724700000072470000007248000000da12656d657267656e63795f77697468647261776d00000073040000000002060172570000006300000000000000000000000004000000430000007372000000740083000100740174026a0383006b0473247404640174026a0383009b009d028301820174056a03830074066a076b02733a740464028301820174086a03830064036b04734e740464048301820174096a0a740b6a03830083016a0c74086a03830074056a03830064058d0201006400530029064e7a16456e642064617465206e6f7420726561636865643a207a1e596f7520617265206e6f7420746865207661756c742063726561746f722172010000007a144e6f206465762066756e6473206c6f636b65642129027228000000722a000000290d724b0000007238000000723d000000723c000000722b000000722c000000722e000000722f0000007230000000724000000072410000007232000000724f0000007247000000724700000072470000007248000000da107061795f6261636b5f6465765f66656573000000730c000000000206011e01160114010e017258000000630000000000000000000000000200000043000000731800000074006a01830064016b02731474026402830182016400530029034e547a0f5661756c7420696e6163746976652129037245000000723c000000722b0000007247000000724700000072470000007248000000724b0000007d00000073020000000001724b000000630000000000000000000000000200000043000000731600000074006a0174026b06731274036401830182016400530029024e7a1d4f6e6c792065786563757461626c65206279206f70657261746f7273212904722e000000722f000000da094f50455241544f5253722b00000072470000007247000000724700000072480000007254000000810000007302000000000172540000004e291fda0448617368724c000000723f0000007231000000723200000072340000007235000000723300000072360000007245000000722c00000072300000007237000000723b000000723d00000072430000007259000000da085f5f6578706f7274da03737472da05666c6f6174da03696e7472490000007244000000724d00000072530000007255000000725600000072570000007258000000724b00000072540000007247000000724700000072470000007248000000da083c6d6f64756c653e0100000073420000000e010c010c010c020c010c01040108010c010c010c010c010c020c0104010201060306010401040104011423060112050601100e100f1006100606011205100a0804