Contract con_neb_external_vault_light1


Contract Code


  
1 # _ _ _ _ ______ _ _ __ __ _ _
2 # | \ | | | | | | | ____| | | | | \ \ / / | | |
3 # | \| | ___| |__ _ _| | __ _ | |__ __ _| |_ ___ _ __ _ __ __ _| | \ \ / /_ _ _ _| | |_
4 # | . ` |/ _ \ '_ \| | | | |/ _` | | __| \ \/ / __/ _ \ '__| '_ \ / _` | | \ \/ / _` | | | | | __|
5 # | |\ | __/ |_) | |_| | | (_| | | |____ > <| || __/ | | | | | (_| | | \ / (_| | |_| | | |_
6 # |_| \_|\___|_.__/ \__,_|_|\__,_| |______/_/\_\\__\___|_| |_| |_|\__,_|_| \/ \__,_|\__,_|_|\__|
7 #
8 # Version 1.4
9
10 I = importlib
11
12 staking = Hash(default_value=0)
13 payouts = Hash(default_value=0)
14
15 stake_con = Variable()
16 emission_con = Variable()
17
18 total_emission = Variable()
19 total_stake = Variable()
20
21 current_stake = Variable()
22 max_single_stake = Variable()
23
24 creator_addr = Variable()
25 creator_lock = Variable()
26
27 start_date = Variable()
28 start_date_end = Variable()
29 end_date = Variable()
30
31 funded = Variable()
32
33 NEB_FEE = 2
34 NEB_FEE_DISCOUNT = 0.2
35 NEB_INSTANT_FEE = 5000
36
37 NEB_CONTRACT = 'con_nebula'
38 NEB_KEY_CONTRACT = 'con_neb_key001'
39
40 MIN_START_TIME = 5
41 MAX_START_TIME = 10080
42
43 MIN_STAKE_TIME = 1440
44 MAX_STAKE_TIME = 10080
45
46 MIN_LOCK_TIME = 1440
47 MAX_LOCK_TIME = 518400
48
49 @export
50 def fund_vault(stake_contract: str, total_stake_amount: float, emission_contract: str, total_emission_amount: float,
51 minutes_till_start: int, start_period_in_minutes: int, minutes_till_end: int,
52 max_single_stake_percent: float, creator_lock_amount: float = 0):
53
54 assert funded.get() != True, 'Vault is already funded!'
55
56 assert total_stake_amount > 0, 'Total stake amount must be > 0'
57 assert total_emission_amount > 0, 'Total emission amount must be > 0'
58
59 assert creator_lock_amount >= 0, 'Creator lock amount must be >= 0'
60
61 assert max_single_stake_percent > 0, 'Maximum single stake percent must be > 0'
62 assert max_single_stake_percent < 100, 'Maximum single stake percent must be < 100'
63
64 assert minutes_till_start >= MIN_START_TIME, f'Minimum time from vault start to staking start: {MIN_START_TIME} minutes'
65 assert minutes_till_start <= MAX_START_TIME, f'Maximum time from vault start to staking start: {MAX_START_TIME} minutes'
66
67 assert start_period_in_minutes >= MIN_STAKE_TIME, f'Minimum time from staking start to staking end: {MIN_STAKE_TIME / 60} hours'
68 assert start_period_in_minutes <= MAX_STAKE_TIME, f'Maximum time from staking start to staking end: {MAX_STAKE_TIME / 60 / 24} days'
69
70 assert minutes_till_end >= MIN_LOCK_TIME, f'Minimum time from staking end to vault end: {MIN_LOCK_TIME / 60} hours'
71 assert minutes_till_end <= MAX_LOCK_TIME, f'Maximum time from staking end to vault end: {MAX_LOCK_TIME / 60 / 24} days'
72
73 sc = I.import_module(stake_contract)
74 ec = I.import_module(emission_contract)
75
76 stake_con.set(stake_contract)
77 emission_con.set(emission_contract)
78
79 creator_addr.set(ctx.caller)
80 creator_lock.set(creator_lock_amount)
81
82 current_stake.set(0)
83 total_stake.set(total_stake_amount)
84 total_emission.set(total_emission_amount)
85 max_single_stake.set(total_stake_amount / 100 * max_single_stake_percent)
86
87 start_date.set(now + datetime.timedelta(minutes=minutes_till_start))
88 start_date_end.set(start_date.get() + datetime.timedelta(minutes=start_period_in_minutes))
89 end_date.set(start_date_end.get() + datetime.timedelta(minutes=minutes_till_end))
90
91 neb_key_balances = ForeignHash(foreign_contract=NEB_KEY_CONTRACT, foreign_name='balances')
92
93 if neb_key_balances[ctx.caller] and neb_key_balances[ctx.caller] >= 1:
94 discount = NEB_FEE_DISCOUNT
95 else:
96 discount = 0
97
98 fee = total_emission.get() / 100 * (NEB_FEE - discount)
99 total_amount = total_emission.get() + fee + creator_lock.get()
100
101 send_to_vault(emission_con.get(), total_amount)
102
103 treasury = ForeignVariable(foreign_contract=NEB_CONTRACT, foreign_name='vault_contract')
104 assert treasury.get(), 'Treasury contract not set!'
105
106 I.import_module(emission_con.get()).transfer(
107 to=treasury.get(),
108 amount=fee)
109
110 I.import_module(NEB_CONTRACT).transfer_from(
111 main_account=ctx.caller,
112 amount=NEB_INSTANT_FEE,
113 to='NEBULA_BURN_ADDRESS')
114
115 funded.set(True)
116
117 def send_to_vault(contract: str, amount: float):
118 I.import_module(contract).transfer_from(
119 main_account=ctx.caller,
120 amount=amount,
121 to=ctx.this)
122
123 @export
124 def stake(amount: float):
125 assert amount > 0, 'Negative amounts are not allowed'
126 assert now > start_date.get(), f'Staking not started yet: {start_date.get()}'
127 assert now < start_date_end.get(), f'Staking period ended: {start_date_end.get()}'
128
129 staking[ctx.caller] += amount
130 send_to_vault(stake_con.get(), amount)
131 current_stake.set(current_stake.get() + amount)
132
133 assert staking[ctx.caller] <= max_single_stake.get(), f'Max user stake exceeded: {max_single_stake.get()}'
134 assert current_stake.get() <= total_stake.get(), f'Max total stake exceeded: {total_stake.get()}'
135
136 @export
137 def unstake():
138 assert staking[ctx.caller] != 0, f'Address is not staking!'
139 assert now > end_date.get(), f'End date not reached: {end_date.get()}'
140
141 stake_percent = staking[ctx.caller] / current_stake.get() * 100
142 user_emission = total_emission.get() / 100 * stake_percent
143
144 I.import_module(emission_con.get()).transfer(
145 amount=user_emission,
146 to=ctx.caller)
147
148 I.import_module(stake_con.get()).transfer(
149 amount=staking[ctx.caller],
150 to=ctx.caller)
151
152 staking[ctx.caller] = 0
153 payouts[ctx.caller] = user_emission
154
155 return f'Emission: {user_emission} {emission_con.get()}'
156
157 @export
158 def payout_only_stake(amount: float):
159 assert staking[ctx.caller] != 0, f'Address is not staking!'
160 assert now > end_date.get(), f'End date not reached: {end_date.get()}'
161 assert amount <= staking[ctx.caller], f'Max unstake amount is {staking[ctx.caller]}'
162
163 I.import_module(stake_con.get()).transfer(
164 amount=amount,
165 to=ctx.caller)
166
167 current_stake.set(current_stake.get() - amount)
168
169 staking[ctx.caller] -= amount
170 payouts[ctx.caller] = 0
171
172 return f'Remaining Stake: {staking[ctx.caller]} {stake_con.get()}'
173
174 @export
175 def pay_back_locked_creator_tokens(pay_to_address: str):
176 assert now > end_date.get(), f'End date not reached: {end_date.get()}'
177 assert creator_addr.get() == ctx.caller, 'You are not the vault creator!'
178 assert creator_lock.get() > 0, 'No creator funds locked!'
179
180 I.import_module(emission_con.get()).transfer(
181 amount=creator_lock.get(),
182 to=pay_to_address)

Byte Code

e30000000000000000000000000c00000040000000736e01000065005a01650264006401640264038d035a03650264006401640464038d035a0465056401640564068d025a0665056401640764068d025a0765056401640864068d025a0865056401640964068d025a0965056401640a64068d025a0a65056401640b64068d025a0b65056401640c64068d025a0c65056401640d64068d025a0d65056401640e64068d025a0e65056401640f64068d025a0f65056401641064068d025a1065056401641164068d025a1164125a126513641383015a1464145a1564155a1664165a1764175a1864185a1964195a1a64185a1b64195a1c641a5a1d651e64018301642c651f6520651f652065216521652165206520641b9c09641c641d840583015a22651f6520641e9c02641f642084045a23651e64018301652064219c0164226423840483015a24651e6401830164246425840083015a25651e64018301652064219c0164266427840483015a26651e64018301651f64289c016429642a840483015a27642b5300292de900000000da1d636f6e5f6e65625f65787465726e616c5f7661756c745f6c6967687431da077374616b696e672903da0d64656661756c745f76616c7565da08636f6e7472616374da046e616d65da077061796f757473da097374616b655f636f6e290272050000007206000000da0c656d697373696f6e5f636f6eda0e746f74616c5f656d697373696f6eda0b746f74616c5f7374616b65da0d63757272656e745f7374616b65da106d61785f73696e676c655f7374616b65da0c63726561746f725f61646472da0c63726561746f725f6c6f636bda0a73746172745f64617465da0e73746172745f646174655f656e64da08656e645f64617465da0666756e646564e9020000007a03302e326988130000da0a636f6e5f6e6562756c61da0e636f6e5f6e65625f6b6579303031e905000000696027000069a00500006900e907002909da0e7374616b655f636f6e7472616374da12746f74616c5f7374616b655f616d6f756e74da11656d697373696f6e5f636f6e7472616374da15746f74616c5f656d697373696f6e5f616d6f756e74da126d696e757465735f74696c6c5f7374617274da1773746172745f706572696f645f696e5f6d696e75746573da106d696e757465735f74696c6c5f656e64da186d61785f73696e676c655f7374616b655f70657263656e74da1363726561746f725f6c6f636b5f616d6f756e74630900000000000000100000000600000043000000739602000074006a01830064016b03731474026402830182017c0164036b04732474026404830182017c0364036b04733474026405830182017c0864036b05734474026406830182017c0764036b04735474026407830182017c0764086b00736474026409830182017c0474036b05737c7402640a74039b00640b9d03830182017c0474046b0173947402640c74049b00640b9d03830182017c0574056b0573b07402640d7405640e1b009b00640f9d03830182017c0574066b0173d0740264107406640e1b0064111b009b0064129d03830182017c0674076b0573ec740264137407640e1b009b00640f9d03830182017c0674086b019001730e740264147408640e1b0064111b009b0064129d038301820174096a0a7c0083017d0974096a0a7c0283017d0a740b6a0c7c0083010100740d6a0c7c0283010100740e6a0c740f6a108301010074116a0c7c088301010074126a0c64038301010074136a0c7c018301010074146a0c7c038301010074156a0c7c0164081b007c0714008301010074166a0c741774186a197c0464158d01170083010100741a6a0c74166a01830074186a197c0564158d01170083010100741b6a0c741a6a01830074186a197c0664158d01170083010100741c741d64166417641864198d047d0b7c0b740f6a101900900172f87c0b740f6a101900641a6b05900172f8741e7d0c6e0464037d0c74146a01830064081b00741f7c0c180014007d0d74146a0183007c0d170074116a01830017007d0e7420740d6a0183007c0e8302010074217422641b6417641c64198d047d0f7c0f6a018300900273547402641d8301820174096a0a740d6a01830083016a237c0f6a0183007c0d641e8d02010074096a0a742283016a24740f6a107425641f64208d03010074006a0c6401830101006400530029214e547a185661756c7420697320616c72656164792066756e6465642172010000007a1e546f74616c207374616b6520616d6f756e74206d757374206265203e20307a21546f74616c20656d697373696f6e20616d6f756e74206d757374206265203e20307a2043726561746f72206c6f636b20616d6f756e74206d757374206265203e3d20307a284d6178696d756d2073696e676c65207374616b652070657263656e74206d757374206265203e2030e9640000007a2a4d6178696d756d2073696e676c65207374616b652070657263656e74206d757374206265203c203130307a304d696e696d756d2074696d652066726f6d207661756c7420737461727420746f207374616b696e672073746172743a207a08206d696e757465737a304d6178696d756d2074696d652066726f6d207661756c7420737461727420746f207374616b696e672073746172743a207a304d696e696d756d2074696d652066726f6d207374616b696e6720737461727420746f207374616b696e6720656e643a20e93c0000007a0620686f7572737a304d6178696d756d2074696d652066726f6d207374616b696e6720737461727420746f207374616b696e6720656e643a20e9180000007a0520646179737a2c4d696e696d756d2074696d652066726f6d207374616b696e6720656e6420746f207661756c7420656e643a207a2c4d6178696d756d2074696d652066726f6d207374616b696e6720656e6420746f207661756c7420656e643a202901da076d696e75746573da0862616c616e6365737202000000da106e65625f6b65795f62616c616e6365732904da10666f726569676e5f636f6e7472616374da0c666f726569676e5f6e616d6572050000007206000000e901000000da0e7661756c745f636f6e7472616374da0874726561737572797a1a547265617375727920636f6e7472616374206e6f7420736574212902da02746fda06616d6f756e74da134e4542554c415f4255524e5f414444524553532903da0c6d61696e5f6163636f756e74722d000000722c0000002926da085f5f66756e646564da03676574da0e417373657274696f6e4572726f72da0e4d494e5f53544152545f54494d45da0e4d41585f53544152545f54494d45da0e4d494e5f5354414b455f54494d45da0e4d41585f5354414b455f54494d45da0d4d494e5f4c4f434b5f54494d45da0d4d41585f4c4f434b5f54494d45da0149da0d696d706f72745f6d6f64756c65da0b5f5f7374616b655f636f6eda03736574da0e5f5f656d697373696f6e5f636f6eda0e5f5f63726561746f725f61646472da03637478da0663616c6c6572da0e5f5f63726561746f725f6c6f636bda0f5f5f63757272656e745f7374616b65da0d5f5f746f74616c5f7374616b65da105f5f746f74616c5f656d697373696f6eda125f5f6d61785f73696e676c655f7374616b65da0c5f5f73746172745f64617465da036e6f77da086461746574696d65da0974696d6564656c7461da105f5f73746172745f646174655f656e64da0a5f5f656e645f64617465da0b466f726569676e48617368da104e45425f4b45595f434f4e5452414354da104e45425f4645455f444953434f554e54da074e45425f464545da0f5f5f73656e645f746f5f7661756c74da0f466f726569676e5661726961626c65da0c4e45425f434f4e5452414354da087472616e73666572da0d7472616e736665725f66726f6dda0f4e45425f494e5354414e545f464545291072180000007219000000721a000000721b000000721c000000721d000000721e000000721f0000007220000000da027363da026563da125f5f6e65625f6b65795f62616c616e636573da08646973636f756e74da03666565da0c746f74616c5f616d6f756e74da0a5f5f7472656173757279a900725d000000da00da0a66756e645f7661756c742a000000735a0000000005140110011001100110011001180118011c0120011c0122010a010a010a010a010c010a010a010a010a01120116010e010c010e010c010401040108011c0106020401140114010e01040102010a011201140108010e010a01725f00000029027205000000722d000000630200000000000000020000000500000043000000731e00000074006a017c0083016a0274036a047c0174036a0564018d0301006400530029024e2903722f000000722d000000722c00000029067239000000723a0000007254000000723f0000007240000000da047468697329027205000000722d000000725d000000725d000000725e00000072500000005f000000730400000000010e0172500000002901722d00000063010000000000000001000000040000004300000073c80000007c0064016b0473107400640283018201740174026a0383006b04732e7400640374026a0383009b009d0283018201740174046a0383006b00734c7400640474046a0383009b009d0283018201740574066a07050019007c00370003003c00740874096a0383007c0083020100740a6a0b740a6a0383007c00170083010100740574066a071900740c6a0383006b0173a274006405740c6a0383009b009d0283018201740a6a038300740d6a0383006b0173c474006406740d6a0383009b009d02830182016400530029074e72010000007a204e6567617469766520616d6f756e747320617265206e6f7420616c6c6f7765647a195374616b696e67206e6f742073746172746564207965743a207a165374616b696e6720706572696f6420656e6465643a207a194d61782075736572207374616b652065786365656465643a207a1a4d617820746f74616c207374616b652065786365656465643a20290e7232000000724700000072460000007231000000724a000000da095f5f7374616b696e67723f00000072400000007250000000723b0000007242000000723c000000724500000072430000002901722d000000725d000000725d000000725e000000da057374616b65640000007318000000000210010e0110010e01100112010e011201140110011201726200000063000000000000000002000000040000004300000073bc000000740074016a02190064016b0373167403640283018201740474056a0683006b0473347403640374056a0683009b009d0283018201740074016a02190074076a0683001b00640414007d0074086a06830064041b007c0014007d0174096a0a740b6a06830083016a0c7c0174016a0264058d02010074096a0a740d6a06830083016a0c740074016a02190074016a0264058d0201006401740074016a023c007c01740e74016a023c0064067c019b006407740b6a0683009b009d04530029084e72010000007a1741646472657373206973206e6f74207374616b696e67217a16456e642064617465206e6f7420726561636865643a2072210000002902722d000000722c0000007a0a456d697373696f6e3a20fa0120290f7261000000723f000000724000000072320000007247000000724b0000007231000000724200000072440000007239000000723a000000723d0000007253000000723b000000da095f5f7061796f7574732902da0d7374616b655f70657263656e74da0d757365725f656d697373696f6e725d000000725d000000725e000000da07756e7374616b65740000007316000000000216011e011601100110010a0116010a010a010a01726700000063010000000000000001000000040000004300000073b8000000740074016a02190064016b0373167403640283018201740474056a0683006b0473347403640374056a0683009b009d02830182017c00740074016a0219006b01735674036404740074016a0219009b009d028301820174076a0874096a06830083016a0a7c0074016a0264058d020100740b6a0c740b6a0683007c00180083010100740074016a02050019007c00380003003c006401740d74016a023c006406740074016a0219009b00640774096a0683009b009d04530029084e72010000007a1741646472657373206973206e6f74207374616b696e67217a16456e642064617465206e6f7420726561636865643a207a164d617820756e7374616b6520616d6f756e74206973202902722d000000722c0000007a1152656d61696e696e67205374616b653a207263000000290e7261000000723f000000724000000072320000007247000000724b00000072310000007239000000723a000000723b00000072530000007242000000723c00000072640000002901722d000000725d000000725d000000725e000000da117061796f75745f6f6e6c795f7374616b65830000007312000000000216011e01100112011a01120112010a0172680000002901da0e7061795f746f5f616464726573736301000000000000000100000004000000430000007368000000740074016a0283006b04731e7403640174016a0283009b009d028301820174046a02830074056a066b027334740364028301820174076a02830064036b047348740364048301820174086a09740a6a02830083016a0b74076a0283007c0064058d0201006400530029064e7a16456e642064617465206e6f7420726561636865643a207a1e596f7520617265206e6f7420746865207661756c742063726561746f722172010000007a184e6f2063726561746f722066756e6473206c6f636b6564212902722d000000722c000000290c7247000000724b00000072310000007232000000723e000000723f000000724000000072410000007239000000723a000000723d000000725300000029017269000000725d000000725d000000725e000000da1e7061795f6261636b5f6c6f636b65645f63726561746f725f746f6b656e7390000000730a00000000021e01160114011401726a0000004e290172010000002928da09696d706f72746c69627239000000da044861736872610000007264000000da085661726961626c65723b000000723d0000007244000000724300000072420000007245000000723e00000072410000007246000000724a000000724b0000007230000000724f000000da07646563696d616c724e00000072550000007252000000724d000000723300000072340000007235000000723600000072370000007238000000da085f5f6578706f7274da03737472da05666c6f6174da03696e74725f0000007250000000726200000072670000007268000000726a000000725d000000725d000000725d000000725e000000da083c6d6f64756c653e01000000735e00000004010601080106010801040108010401080104010801040108010401080104010801040108010401080104010801040108010c020c01040108010401040104010401040104010401040104030604223110050601100f100f0601100c0601