1 module tagion.tools.boot.genesis;
2 
3 import std.algorithm;
4 import std.array;
5 import tagion.basic.Types;
6 import tagion.crypto.Types : Pubkey;
7 import tagion.hibon.Document;
8 import tagion.hibon.HiBONJSON;
9 import tagion.hibon.HiBONtoText : decode;
10 import tagion.script.common;
11 import tagion.script.namerecords;
12 import tagion.tools.Basic;
13 import tagion.tools.toolsexception;
14 import tagion.utils.StdTime;
15 
16 
17 @safe:
18 Document[] createGenesis(const(string[]) nodes_param, Document testamony, TagionGlobals globals) {
19     import std.stdio;
20 
21     Document[] result;
22     static struct NodeSettings {
23         string name;
24         Pubkey owner;
25         string address;
26         this(string params) {
27             const list = params.split(",");
28             check(list.length == 3,
29                     "Argument %s should have three parameter seperated with a ','", params);
30             name = list[0];
31             owner = Pubkey(list[1].decode);
32             address = list[2];
33         }
34     }
35 
36     const node_settings = nodes_param
37         .map!((param) => NodeSettings(param))
38         .array;
39 
40     const time = currentTime;
41     NetworkNameCard[] name_cards;
42     NetworkNodeRecord[] node_records;
43     foreach (node_setting; node_settings) {
44         NetworkNameCard name_card;
45         name_card.name = node_setting.name;
46         name_card.owner = node_setting.owner.mut;
47         //name_card.address=node_setting.address;
48         name_card.lang = "en";
49         name_card.time = cast(sdt_t) time;
50         name_cards ~= name_card;
51         NetworkNodeRecord node_record;
52         node_record.channel = node_setting.owner.mut;
53         node_record.name = node_setting.name;
54         node_record.time = cast(sdt_t) time;
55         node_record.state = NetworkNodeRecord.State.ACTIVE;
56         node_record.address = node_setting.address;
57         node_records ~= node_record;
58     }
59     GenesisEpoch genesis_epoch;
60     genesis_epoch.epoch_number = 0;
61     genesis_epoch.nodes = node_settings
62         .map!((node_setting) => node_setting.owner.mut)
63         .array;
64     //.sort;
65     genesis_epoch.time = cast(sdt_t) time;
66     genesis_epoch.testamony = testamony;
67     genesis_epoch.globals = globals;
68 
69     
70     name_cards.each!((name_card) => verbose("%s", name_card.toPretty));
71     node_records.each!((name_card) => verbose("%s", name_card.toPretty));
72     verbose("%s", genesis_epoch.toPretty);
73     result ~= name_cards.map!((name_card) => name_card.toDoc).array;
74 
75     result ~= node_records.map!(node_record => node_record.toDoc).array;
76     result ~= genesis_epoch.toDoc;
77     return result;
78 }