@@ -7,7 +7,7 @@ defmodule BIC.Epoch do
77
88 @ a 23_072_960_000
99 @ c 1110.573766
10- @ start_epoch 500
10+ @ start_epoch 420
1111
1212 def epoch_emission ( epoch ) when epoch >= @ start_epoch do
1313 floor ( 0.5 * @ a / :math . pow ( epoch - @ start_epoch + @ c , 1.5 ) )
@@ -140,12 +140,15 @@ defmodule BIC.Epoch do
140140 end
141141
142142 def next ( env ) do
143- epoch_fin = env . entry_epoch
144- epoch_next = epoch_fin + 1
143+ if env . entry_epoch >= 295 or env . entry_epoch < 420 do
144+ next_420 ( env )
145+ else
146+ epoch_cur = env . entry_epoch
147+ epoch_next = epoch_cur + 1
145148 top_x = 99
146149
147150 # slash sols for malicious trainers
148- removedTrainers = kv_get ( "bic:epoch:trainers:removed:#{ epoch_fin } " , % { term: true } ) || [ ]
151+ removedTrainers = kv_get ( "bic:epoch:trainers:removed:#{ epoch_cur } " , % { term: true } ) || [ ]
149152 leaders = kv_get_prefix ( "bic:epoch:solutions_count:" , % { to_integer: true } )
150153 |> Enum . reduce ( % { } , fn ( { pk , count } , acc ) ->
151154 if pk in removedTrainers do
@@ -156,14 +159,14 @@ defmodule BIC.Epoch do
156159 end )
157160 |> Enum . sort_by ( & { elem ( & 1 , 1 ) , elem ( & 1 , 0 ) } , :desc )
158161
159- trainers = kv_get ( "bic:epoch:trainers:#{ epoch_fin } " , % { term: true } )
162+ trainers = kv_get ( "bic:epoch:trainers:#{ epoch_cur } " , % { term: true } )
160163 trainers_to_recv_emissions = leaders
161164 |> Enum . filter ( & elem ( & 1 , 0 ) in trainers )
162165 |> Enum . take ( top_x )
163166
164167 total_sols = Enum . reduce ( trainers_to_recv_emissions , 0 , & & 2 + elem ( & 1 , 1 ) )
165168 Enum . each ( trainers_to_recv_emissions , fn ( { trainer , trainer_sols } ) ->
166- coins = div ( trainer_sols * epoch_emission ( epoch_fin ) , total_sols )
169+ coins = div ( trainer_sols * epoch_emission ( epoch_cur ) , total_sols )
167170
168171 emission_address = kv_get ( "bic:epoch:emission_address:#{ trainer } " )
169172 if emission_address do
@@ -189,6 +192,91 @@ defmodule BIC.Epoch do
189192
190193 height = String . pad_leading ( "#{ env . entry_height + 1 } " , 12 , "0" )
191194 kv_put ( "bic:epoch:trainers:height:#{ height } " , new_validators , % { term: true } )
195+ end
196+ end
197+
198+ def next_420 ( env ) do
199+ epoch_cur = env . entry_epoch
200+ epoch_next = epoch_cur + 1
201+ top_x = 99
202+
203+ # slash sols for malicious trainers
204+ removedTrainers = kv_get ( "bic:epoch:trainers:removed:#{ epoch_cur } " , % { term: true } ) || [ ]
205+ leaders = kv_get_prefix ( "bic:epoch:solutions_count:" , % { to_integer: true } )
206+ |> Enum . reduce ( % { } , fn ( { pk , count } , acc ) ->
207+ if pk in removedTrainers do
208+ acc
209+ else
210+ Map . put ( acc , pk , count )
211+ end
212+ end )
213+ |> Enum . sort_by ( & { elem ( & 1 , 1 ) , elem ( & 1 , 0 ) } , :desc )
214+
215+ trainers = kv_get ( "bic:epoch:trainers:#{ epoch_cur } " , % { term: true } )
216+ trainers_to_recv_emissions = leaders
217+ |> Enum . filter ( & elem ( & 1 , 0 ) in trainers and elem ( & 1 , 0 ) not in @ peddlebike67 )
218+ |> Enum . take ( top_x )
219+
220+ epoch_total_emission = epoch_emission ( epoch_cur )
221+ epoch_early_adopter_emission = div ( epoch_total_emission , 7 )
222+ epoch_communityfund_emission = epoch_total_emission - epoch_early_adopter_emission
223+ #Community fund for grants such as building open source code and building onchain/ecosystem
224+ #alot of interest from early adopters to receive grants for building
225+
226+ n_count = length ( @ peddlebike67 )
227+ q = div ( epoch_communityfund_emission , n_count )
228+ r = rem ( epoch_communityfund_emission , n_count )
229+ n_summed = List . duplicate ( q + 1 , r ) ++ List . duplicate ( q , n_count - r )
230+
231+ Enum . zip ( @ peddlebike67 , n_summed )
232+ |> Enum . each ( fn ( { trainer , coins } ) ->
233+ emission_address = kv_get ( "bic:epoch:emission_address:#{ trainer } " )
234+ if emission_address do
235+ kv_increment ( "bic:coin:balance:#{ emission_address } :AMA" , coins )
236+ else
237+ kv_increment ( "bic:coin:balance:#{ trainer } :AMA" , coins )
238+ end
239+ end )
240+
241+ total_sols = Enum . reduce ( trainers_to_recv_emissions , 0 , & & 2 + elem ( & 1 , 1 ) )
242+ if total_sols > 0 do
243+ Enum . each ( trainers_to_recv_emissions , fn ( { trainer , trainer_sols } ) ->
244+ coins = div ( trainer_sols * epoch_early_adopter_emission , total_sols )
245+
246+ emission_address = kv_get ( "bic:epoch:emission_address:#{ trainer } " )
247+ if emission_address do
248+ kv_increment ( "bic:coin:balance:#{ emission_address } :AMA" , coins )
249+ else
250+ kv_increment ( "bic:coin:balance:#{ trainer } :AMA" , coins )
251+ end
252+ end )
253+ end
254+
255+ leaders = Enum . map ( leaders , fn { pk , _ } -> pk end )
256+
257+ #REMOVE THIS LATER, first we must start with a peddle bike as a
258+ #UAV proved to have a lack of skilled pilots
259+ leaders = leaders -- @ peddlebike67
260+ new_validators = ( @ peddlebike67 ++ leaders )
261+ |> Enum . take ( top_x )
262+ |> Enum . shuffle ( )
263+
264+ kv_put ( "bic:epoch:trainers:#{ epoch_next } " , new_validators , % { term: true } )
265+
266+ height = String . pad_leading ( "#{ env . entry_height + 1 } " , 12 , "0" )
267+ kv_put ( "bic:epoch:trainers:height:#{ height } " , new_validators , % { term: true } )
268+
269+ #new difficulty handling
270+ old_diff_bits = kv_get ( "bic:epoch:diff_bits" , % { to_integer: true } ) || 24
271+ next_diff_bits = SolDifficulty . next ( old_diff_bits , total_sols )
272+ kv_put ( "bic:epoch:diff_bits" , next_diff_bits , % { to_integer: true } )
273+
274+ #log for analysis / potential backseek in future upgrade
275+ kv_put ( "bic:epoch:diff_bits:#{ epoch_next } " , next_diff_bits , % { to_integer: true } )
276+ kv_put ( "bic:epoch:total_sols:#{ epoch_cur } " , total_sols , % { to_integer: true } )
277+
278+ kv_clear ( "bic:epoch:solbloom:" )
279+ kv_clear ( "bic:epoch:solutions_count:" )
192280 end
193281
194282 def slash_trainer_verify ( cur_epoch , malicious_pk , trainers , mask , signature ) do
0 commit comments