Skip to content

Commit

Permalink
add native_token to genesis config
Browse files Browse the repository at this point in the history
  • Loading branch information
tzemanovic committed Oct 25, 2022
1 parent 0e12983 commit 8ad36ec
Show file tree
Hide file tree
Showing 5 changed files with 110 additions and 74 deletions.
22 changes: 10 additions & 12 deletions apps/src/lib/client/utils.rs
Original file line number Diff line number Diff line change
Expand Up @@ -612,18 +612,16 @@ pub fn init_network(
})
}

if let Some(token) = &mut config.token {
token.iter_mut().for_each(|(name, config)| {
if config.address.is_none() {
let address = address::gen_established_address("token");
config.address = Some(address.to_string());
wallet.add_address(name.clone(), address);
}
if config.vp.is_none() {
config.vp = Some("vp_token".to_string());
}
})
}
config.token.iter_mut().for_each(|(name, config)| {
if config.address.is_none() {
let address = address::gen_established_address("token");
config.address = Some(address.to_string());
wallet.add_address(name.clone(), address);
}
if config.vp.is_none() {
config.vp = Some("vp_token".to_string());
}
});

if let Some(implicit) = &mut config.implicit {
implicit.iter_mut().for_each(|(name, config)| {
Expand Down
124 changes: 81 additions & 43 deletions apps/src/lib/config/genesis.rs
Original file line number Diff line number Diff line change
Expand Up @@ -104,10 +104,13 @@ pub mod genesis_config {
pub struct GenesisConfig {
// Genesis timestamp
pub genesis_time: Rfc3339String,
// Name of the native token - this must one of the tokens included in
// the `token` field
pub native_token: String,
// Initial validator set
pub validator: HashMap<String, ValidatorConfig>,
// Token accounts present at genesis
pub token: Option<HashMap<String, TokenAccountConfig>>,
pub token: HashMap<String, TokenAccountConfig>,
// Established accounts present at genesis
pub established: Option<HashMap<String, EstablishedAccountConfig>>,
// Implicit accounts present at genesis
Expand Down Expand Up @@ -479,32 +482,53 @@ pub mod genesis_config {
}

pub fn load_genesis_config(config: GenesisConfig) -> Genesis {
let wasms = config.wasm;
let validators: HashMap<String, Validator> = config
.validator
.iter()
.map(|(name, cfg)| (name.clone(), load_validator(cfg, &wasms)))
.collect();
let established_accounts: HashMap<String, EstablishedAccount> = config
.established
.unwrap_or_default()
let GenesisConfig {
genesis_time,
native_token,
validator,
token,
established,
implicit,
parameters,
pos_params,
gov_params,
wasm,
} = config;

let native_token = Address::decode(
token
.get(&native_token)
.expect(
"Native token's alias must be present in the declared \
tokens",
)
.address
.as_ref()
.expect("Missing native token address"),
)
.expect("Invalid address");

let validators: HashMap<String, Validator> = validator
.iter()
.map(|(name, cfg)| (name.clone(), load_established(cfg, &wasms)))
.map(|(name, cfg)| (name.clone(), load_validator(cfg, &wasm)))
.collect();
let implicit_accounts: HashMap<String, ImplicitAccount> = config
.implicit
let established_accounts: HashMap<String, EstablishedAccount> =
established
.unwrap_or_default()
.iter()
.map(|(name, cfg)| (name.clone(), load_established(cfg, &wasm)))
.collect();
let implicit_accounts: HashMap<String, ImplicitAccount> = implicit
.unwrap_or_default()
.iter()
.map(|(name, cfg)| (name.clone(), load_implicit(cfg)))
.collect();
let token_accounts = config
.token
.unwrap_or_default()
let token_accounts = token
.iter()
.map(|(_name, cfg)| {
load_token(
cfg,
&wasms,
&wasm,
&validators,
&established_accounts,
&implicit_accounts,
Expand All @@ -514,53 +538,66 @@ pub mod genesis_config {

let parameters = Parameters {
epoch_duration: EpochDuration {
min_num_of_blocks: config.parameters.min_num_of_blocks,
min_num_of_blocks: parameters.min_num_of_blocks,
min_duration: namada::types::time::Duration::seconds(
config.parameters.min_duration,
parameters.min_duration,
)
.into(),
},
max_expected_time_per_block:
namada::types::time::Duration::seconds(
config.parameters.max_expected_time_per_block,
parameters.max_expected_time_per_block,
)
.into(),
vp_whitelist: config.parameters.vp_whitelist.unwrap_or_default(),
tx_whitelist: config.parameters.tx_whitelist.unwrap_or_default(),
vp_whitelist: parameters.vp_whitelist.unwrap_or_default(),
tx_whitelist: parameters.tx_whitelist.unwrap_or_default(),
};

let GovernanceParamsConfig {
min_proposal_fund,
max_proposal_code_size,
min_proposal_period,
max_proposal_content_size,
min_proposal_grace_epochs,
max_proposal_period,
} = gov_params;
let gov_params = GovParams {
min_proposal_fund: config.gov_params.min_proposal_fund,
max_proposal_code_size: config.gov_params.max_proposal_code_size,
min_proposal_period: config.gov_params.min_proposal_period,
max_proposal_period: config.gov_params.max_proposal_period,
max_proposal_content_size: config
.gov_params
.max_proposal_content_size,
min_proposal_grace_epochs: config
.gov_params
.min_proposal_grace_epochs,
min_proposal_fund,
max_proposal_code_size,
min_proposal_period,
max_proposal_content_size,
min_proposal_grace_epochs,
max_proposal_period,
};

let PosParamsConfig {
max_validator_slots,
pipeline_len,
unbonding_len,
votes_per_token,
block_proposer_reward,
block_vote_reward,
duplicate_vote_slash_rate,
light_client_attack_slash_rate,
} = pos_params;
let pos_params = PosParams {
max_validator_slots: config.pos_params.max_validator_slots,
pipeline_len: config.pos_params.pipeline_len,
unbonding_len: config.pos_params.unbonding_len,
votes_per_token: BasisPoints::new(
config.pos_params.votes_per_token,
),
block_proposer_reward: config.pos_params.block_proposer_reward,
block_vote_reward: config.pos_params.block_vote_reward,
max_validator_slots,
pipeline_len,
unbonding_len,
votes_per_token: BasisPoints::new(votes_per_token),
block_proposer_reward,
block_vote_reward,
duplicate_vote_slash_rate: BasisPoints::new(
config.pos_params.duplicate_vote_slash_rate,
duplicate_vote_slash_rate,
),
light_client_attack_slash_rate: BasisPoints::new(
config.pos_params.light_client_attack_slash_rate,
light_client_attack_slash_rate,
),
};

let mut genesis = Genesis {
genesis_time: config.genesis_time.try_into().unwrap(),
genesis_time: genesis_time.try_into().unwrap(),
native_token,
validators: validators.into_values().collect(),
token_accounts,
established_accounts: established_accounts.into_values().collect(),
Expand Down Expand Up @@ -608,6 +645,7 @@ pub mod genesis_config {
#[borsh_init(init)]
pub struct Genesis {
pub genesis_time: DateTimeUtc,
pub native_token: Address,
pub validators: Vec<Validator>,
pub token_accounts: Vec<TokenAccount>,
pub established_accounts: Vec<EstablishedAccount>,
Expand Down
18 changes: 8 additions & 10 deletions apps/src/lib/wallet/defaults.rs
Original file line number Diff line number Diff line change
Expand Up @@ -33,16 +33,14 @@ pub fn addresses_from_genesis(genesis: GenesisConfig) -> Vec<(Alias, Address)> {
});
addresses.extend(validator_addresses);
// Genesis tokens
if let Some(accounts) = genesis.token {
let token_addresses = accounts.into_iter().map(|(alias, token)| {
// The address must be set in the genesis config file
(
alias.into(),
Address::decode(token.address.unwrap()).unwrap(),
)
});
addresses.extend(token_addresses);
}
let token_addresses = genesis.token.into_iter().map(|(alias, token)| {
// The address must be set in the genesis config file
(
alias.into(),
Address::decode(token.address.unwrap()).unwrap(),
)
});
addresses.extend(token_addresses);
// Genesis established accounts
if let Some(accounts) = genesis.established {
let est_addresses = accounts.into_iter().map(|(alias, established)| {
Expand Down
19 changes: 10 additions & 9 deletions genesis/dev.toml
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
# Example genesis with dev settings.
genesis_time = "2021-09-30:10:00.00Z"
native_token = "NAM"

# A genesis validator with alias "validator".
[validator.validator]
Expand All @@ -26,10 +27,10 @@ net_address = "127.0.0.1:26656"

# Some tokens present at genesis.

[token.nam]
[token.NAM]
address = "atest1v4ehgw36x3prswzxggunzv6pxqmnvdj9xvcyzvpsggeyvs3cg9qnywf589qnwvfsg5erg3fkl09rg5"
vp = "vp_token"
[token.nam.balances]
[token.NAM.balances]
# In token balances, we can use:
# 1. An address any account
a1qyqzsqqqqqcyvvf5xcu5vd6rg4z5233hg9pn23pjgdryzdjy8pz52wzxxscnvvjxx3rryvzz8y5p6mtz = 1000000
Expand All @@ -42,28 +43,28 @@ bertha = 1000000
"bertha.public_key" = 100
"validator.public_key" = 100

[token.btc]
[token.BTC]
address = "atest1v4ehgw36xdzryve5gsc52veeg5cnsv2yx5eygvp38qcrvd29xy6rys6p8yc5xvp4xfpy2v694wgwcp"
vp = "vp_token"
[token.btc.balances]
[token.BTC.balances]
atest1v4ehgw368ycryv2z8qcnxv3cxgmrgvjpxs6yg333gym5vv2zxepnj334g4rryvj9xucrgve4x3xvr4 = 1000000
atest1v4ehgw36x3qng3jzggu5yvpsxgcngv2xgguy2dpkgvu5x33kx3pr2w2zgep5xwfkxscrxs2pj8075p = 1000000
atest1v4ehgw36xvcyyvejgvenxs34g3zygv3jxqunjd6rxyeyys3sxy6rwvfkx4qnj33hg9qnvse4lsfctw = 1000000
a1qyqzsqqqqqcyvvf5xcu5vd6rg4z5233hg9pn23pjgdryzdjy8pz52wzxxscnvvjxx3rryvzz8y5p6mtz = 1000000

[token.eth]
[token.ETH]
address = "atest1v4ehgw36xqmr2d3nx3ryvd2xxgmrq33j8qcns33sxezrgv6zxdzrydjrxveygd2yxumrsdpsf9jc2p"
vp = "vp_token"
[token.eth.balances]
[token.ETH.balances]
atest1v4ehgw368ycryv2z8qcnxv3cxgmrgvjpxs6yg333gym5vv2zxepnj334g4rryvj9xucrgve4x3xvr4 = 1000000
atest1v4ehgw36x3qng3jzggu5yvpsxgcngv2xgguy2dpkgvu5x33kx3pr2w2zgep5xwfkxscrxs2pj8075p = 1000000
atest1v4ehgw36xvcyyvejgvenxs34g3zygv3jxqunjd6rxyeyys3sxy6rwvfkx4qnj33hg9qnvse4lsfctw = 1000000
a1qyqzsqqqqqcyvvf5xcu5vd6rg4z5233hg9pn23pjgdryzdjy8pz52wzxxscnvvjxx3rryvzz8y5p6mtz = 1000000

[token.dot]
[token.DOT]
address = "atest1v4ehgw36gg6nvs2zgfpyxsfjgc65yv6pxy6nwwfsxgungdzrggeyzv35gveyxsjyxymyz335hur2jn"
vp = "vp_token"
[token.dot.balances]
[token.DOT.balances]
atest1v4ehgw368ycryv2z8qcnxv3cxgmrgvjpxs6yg333gym5vv2zxepnj334g4rryvj9xucrgve4x3xvr4 = 1000000
atest1v4ehgw36x3qng3jzggu5yvpsxgcngv2xgguy2dpkgvu5x33kx3pr2w2zgep5xwfkxscrxs2pj8075p = 1000000
atest1v4ehgw36xvcyyvejgvenxs34g3zygv3jxqunjd6rxyeyys3sxy6rwvfkx4qnj33hg9qnvse4lsfctw = 1000000
Expand Down Expand Up @@ -168,7 +169,7 @@ light_client_attack_slash_rate = 500

# Governance parameters.
[gov_params]
# minimum amount of nam token to lock
# minimum amount of NAM token to lock
min_proposal_fund = 500
# proposal code size in bytes
max_proposal_code_size = 300000
Expand Down
1 change: 1 addition & 0 deletions genesis/e2e-tests-single-node.toml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
# - User accounts same as the ones in "dev" build (Albert, Bertha, Christel)

genesis_time = "2021-09-30T10:00:00Z"
native_token = "XAN"

[validator.validator-0]
# Validator's staked NAM at genesis.
Expand Down

0 comments on commit 8ad36ec

Please sign in to comment.