Contract con_neb_vlt_tst_001


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

Byte Code

e30000000000000000000000000b000000400000007376010000650064006401640264038d035a0165026401640464058d025a0365026401640664058d025a0465026401640764058d025a0565026401640864058d025a0665026401640964058d025a0765026401640a64058d025a0865026401640b64058d025a0965026401640c64058d025a0a65026401640d64058d025a0b65026401640e64058d025a0c65026401640f64058d025a0d65026401641064058d025a0e65026401641164058d025a0f64125a106413641467025a1165126401830165136513651465146515651565156514651464159c0964166417840483015a166512640183016513651464189c026419641a840483015a176512640183016514641b9c01641c641d840483015a18651264018301641e641f840083015a1965126401830164206421840083015a1a65126401830164226423840083015a1b6512640183016513651464189c0264246425840483015a1c65126401830164266427840083015a1d6428642984005a1e642a642b84005a1f642c5300292de900000000da13636f6e5f6e65625f766c745f7473745f303031da077374616b696e672903da0d64656661756c745f76616c7565da08636f6e7472616374da046e616d65da097374616b655f636f6e290272050000007206000000da0c656d697373696f6e5f636f6eda0e746f74616c5f656d697373696f6eda0b746f74616c5f7374616b65da0d63757272656e745f7374616b65da106d61785f73696e676c655f7374616b65da06616374697665da0666756e646564da0c63726561746f725f61646472da0c63726561746f725f6c6f636bda0a73746172745f64617465da0e73746172745f646174655f656e64da08656e645f64617465e902000000da4061653764313464366439623834343366383831626136323434373237623639623638313031306537383264346665343832646266623062366163613032643564da40653738376564353930373734326661386435306233636132373031616238653033656337343963656438303661313563646162383030613132376437663836332909da0e7374616b655f636f6e7472616374da11656d697373696f6e5f636f6e7472616374da15746f74616c5f656d697373696f6e5f616d6f756e74da12746f74616c5f7374616b655f616d6f756e74da126d696e757465735f74696c6c5f7374617274da1773746172745f706572696f645f696e5f6d696e75746573da106d696e757465735f74696c6c5f656e64da1363726561746f725f6c6f636b5f616d6f756e74da186d61785f73696e676c655f7374616b655f70657263656e746309000000000000000a000000060000004300000073ce01000074006a01830064016b03731474026402830182017c0264036b04732474026404830182017c0364036b04733474026405830182017c0464036b04734474026406830182017c0564076b05735474026408830182017c0664036b04736474026409830182017c0764036b0573747402640a830182017c0864036b0473847402640b8301820174036a0474056a068301010074076a047c078301010074086a047c008301010074096a047c0183010100740a6a04640383010100740b6a047c0283010100740c6a047c0383010100740d6a047c03640c1b007c08140083010100740e6a04740f74106a117c04640d8d0117008301010074126a04740e6a01830074106a117c05640d8d0117008301010074136a0474126a01830074106a117c06640d8d011700830101007414640e640f6410641164128d047d097c096a0183009001735874156410641164138d027d097c096a0464148301010074166a1774096a01830083016a18740b6a018300640c1b007419140074056a067c096a01830064158d03010074076a01830064036b04900172a4741a74096a01830074076a01830083020100741a74096a018300740b6a01830083020100741b6a0464018301010074006a046401830101006400530029164e547a185661756c7420697320616c72656164792066756e6465642172010000007a20746f74616c5f656d697373696f6e5f616d6f756e74206e6f742076616c6964217a1d746f74616c5f7374616b655f616d6f756e74206e6f742076616c6964217a1d6d696e757465735f74696c6c5f7374617274206e6f742076616c69642169400b00007a2d5374616b696e67206e6565647320746f206265206f70656e20666f72206174206c6561737420322064617973217a1b6d696e757465735f74696c6c5f656e64206e6f742076616c6964217a126465765f666565206e6f742076616c6964217a236d61785f73696e676c655f7374616b655f70657263656e74206e6f742076616c696421e9640000002901da076d696e75746573da0a636f6e5f6e6562756c61da0e7661756c745f636f6e74726163747202000000da057661756c742904da10666f726569676e5f636f6e7472616374da0c666f726569676e5f6e616d6572050000007206000000290272050000007206000000da12494e5445524e414c5f4e45425f5641554c542903da06616d6f756e74da0c6d61696e5f6163636f756e74da02746f291cda085f5f66756e646564da03676574da0e417373657274696f6e4572726f72da0e5f5f63726561746f725f61646472da03736574da03637478da0663616c6c6572da0e5f5f63726561746f725f6c6f636bda0b5f5f7374616b655f636f6eda0e5f5f656d697373696f6e5f636f6eda0f5f5f63757272656e745f7374616b65da105f5f746f74616c5f656d697373696f6eda0d5f5f746f74616c5f7374616b65da125f5f6d61785f73696e676c655f7374616b65da0c5f5f73746172745f64617465da036e6f77da086461746574696d65da0974696d6564656c7461da105f5f73746172745f646174655f656e64da0a5f5f656e645f64617465da0f466f726569676e5661726961626c65da085661726961626c65da09696d706f72746c6962da0d696d706f72745f6d6f64756c65da0d7472616e736665725f66726f6dda074e45425f464545da0d73656e645f746f5f7661756c74da085f5f616374697665290a721700000072180000007219000000721a000000721b000000721c000000721d000000721e000000721f000000da075f5f7661756c74a9007248000000da00da0a66756e645f7661756c741900000073440000000005140110011001100110011001100110010c010a010a010a010a010a010a01120116010e010c010e010c0104010c010a010c010a010e0112010c010e01120112010a01724a000000290272050000007228000000630200000000000000020000000500000043000000731e00000074006a017c0083016a0274036a047c0174036a0564018d0301006400530029024e290372290000007228000000722a000000290672410000007242000000724300000072300000007231000000da0474686973290272050000007228000000724800000072480000007249000000724500000042000000730400000000020e0172450000002901722800000063010000000000000001000000040000004300000073ce000000740083000100740174026a0383006b0473247404640174026a0383009b009d0283018201740174056a0383006b0073427404640274056a0383009b009d02830182017c0064036b0473527404640483018201740674076a08050019007c00370003003c007409740a6a0383007c0083020100740b6a0c740b6a0383007c00170083010100740674076a081900740d6a0383006b0173a874046405740d6a0383009b009d0283018201740b6a038300740e6a0383006b0173ca74046406740e6a0383009b009d02830182016400530029074e7a195374616b696e67206e6f742073746172746564207965743a207a165374616b696e6720706572696f6420656e6465643a2072010000007a12416d6f756e74206d757374206265203e20307a194d61782075736572207374616b652065786365656465643a207a1a4d617820746f74616c207374616b652065786365656465643a20290fda0f5f5f6173736572745f616374697665723a0000007239000000722c000000722d000000723d000000da095f5f7374616b696e6772300000007231000000724500000072330000007235000000722f0000007238000000723700000029017228000000724800000072480000007249000000da057374616b6548000000731a000000000206010e0110010e011001100112010e011201140110011201724e00000063000000000000000002000000040000004300000073b8000000740083000100740174026a03190064016b03731c7404640283018201740574066a0783006b04733a7404640374066a0783009b009d0283018201740174026a03190074086a0783001b00640414007d0074096a07830064041b007c0014007d01740a6a0b740c6a07830083016a0d7c0174026a0364058d020100740a6a0b740e6a07830083016a0d740174026a03190074026a0364058d0201006401740174026a033c0064067c019b006407740c6a0783009b009d04530029084e72010000007a1741646472657373206973206e6f74207374616b696e67217a16456e642064617465206e6f7420726561636865643a20722000000029027228000000722a0000007a0a456d697373696f6e3a20fa0120290f724c000000724d00000072300000007231000000722d000000723a000000723e000000722c00000072350000007236000000724100000072420000007234000000da087472616e7366657272330000002902da0d7374616b655f70657263656e74da0d757365725f656d697373696f6e724800000072480000007249000000da07756e7374616b655900000073160000000002060116011e01160110010e010c01100110010a017253000000630000000000000000000000000200000043000000731400000074008300010074016a026401830101006400530029024e542903da0e5f5f6173736572745f6f776e65727246000000722f0000007248000000724800000072480000007249000000da0c656e61626c655f7661756c74680000007304000000000206017255000000630000000000000000000000000200000043000000731400000074008300010074016a026401830101006400530029024e46290372540000007246000000722f0000007248000000724800000072480000007249000000da0d64697361626c655f7661756c746e0000007304000000000206017256000000630200000000000000020000000300000043000000731e00000074008300010074016a027c0083016a037c0174046a05830201006400530029014e2906725400000072410000007242000000725000000072300000007231000000290272050000007228000000724800000072480000007249000000da12656d657267656e63795f77697468647261777400000073040000000002060172570000006300000000000000000000000004000000430000007372000000740083000100740174026a0383006b0473247404640174026a0383009b009d028301820174056a03830074066a076b02733a740464028301820174086a03830064036b04734e740464048301820174096a0a740b6a03830083016a0c74086a03830074056a03830064058d0201006400530029064e7a16456e642064617465206e6f7420726561636865643a207a1e596f7520617265206e6f7420746865207661756c742063726561746f722172010000007a184e6f2063726561746f722066756e6473206c6f636b65642129027228000000722a000000290d724c000000723a000000723e000000722c000000722d000000722e00000072300000007231000000723200000072410000007242000000723400000072500000007248000000724800000072480000007249000000da1e7061795f6261636b5f6c6f636b65645f63726561746f725f746f6b656e737a000000730c000000000206011e01160114010e017258000000630000000000000000000000000200000043000000731800000074006a01830064016b02731474026402830182016400530029034e547a0f5661756c7420696e6163746976652129037246000000722c000000722d0000007248000000724800000072480000007249000000724c0000008400000073020000000001724c000000630000000000000000000000000200000043000000731600000074006a0174026b06731274036401830182016400530029024e7a1d4f6e6c792065786563757461626c65206279206f70657261746f727321290472300000007231000000da094f50455241544f5253722d00000072480000007248000000724800000072490000007254000000880000007302000000000172540000004e2920da0448617368724d00000072400000007233000000723400000072360000007237000000723500000072380000007246000000722b000000722e00000072320000007239000000723d000000723e00000072440000007259000000da085f5f6578706f7274da03737472da05666c6f6174da03696e74724a0000007245000000724e00000072530000007255000000725600000072570000007258000000724c00000072540000007248000000724800000072480000007249000000da083c6d6f64756c653e01000000734a000000060108010c010c01040108010c010c02040108010c010c010c010c010c01040108010c01040102010603060104010401040114250601120506011010100f1006100606011205100a0804