Skip to content
This repository has been archived by the owner on Nov 6, 2020. It is now read-only.

Add Musicoin and MCIP-3 UBI hardfork. #6621

Merged
merged 41 commits into from
Oct 8, 2017
Merged
Show file tree
Hide file tree
Changes from 23 commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
ec65195
Add musicoin chain spec.
5chdn Sep 20, 2017
71b5108
Add musicoin to parity node
5chdn Sep 20, 2017
e8d519d
Add musicoin to the wallet
5chdn Sep 20, 2017
ce70df4
Add i18n for musicoin
5chdn Sep 20, 2017
fef6698
Align musicoin chain spec with 1.8, ref #6134
5chdn Sep 20, 2017
5dc2a33
Update musicoin bootnodes
5chdn Sep 21, 2017
3442144
Merge branch 'master' into a5-chains-musicoin
5chdn Sep 21, 2017
41dfbfc
Prepare MCIP-3 in musicoin chain spec.
5chdn Sep 21, 2017
2c2ed16
Update musicoin chain spec with contract addresses for MCIP-3
5chdn Sep 21, 2017
d3831af
Extend ethash params by MCIP-3
5chdn Sep 21, 2017
07dbdb8
Fix musicoin chain spec json
5chdn Sep 21, 2017
7940bf6
Use U256 for block rewards.
5chdn Sep 21, 2017
7ca83d9
Update musicoin registrar
5chdn Sep 22, 2017
fa65407
Merge master
5chdn Sep 27, 2017
1cfbea4
Fix merge leftovers
5chdn Sep 27, 2017
77a3ba8
Update musicoin chain spec for latest master
5chdn Sep 27, 2017
f292915
Bestow MCIP-3 block reward(s).
5chdn Sep 27, 2017
44ca37f
Update musicoin registry once and for all
5chdn Sep 28, 2017
d2ecacf
Merge upstream
5chdn Sep 28, 2017
939354c
Align MCIP-3 block reward with go implementation
5chdn Sep 29, 2017
36a852a
Remove mcip3 test chain spec from repository
5chdn Sep 29, 2017
1b9cdfb
Update MCIP-3 block rewards
5chdn Oct 2, 2017
6c087c2
Merge branch 'master' into a5-chains-musicoin
5chdn Oct 2, 2017
072ba1d
Musicoin homestead transition is at 1_150_000
5chdn Oct 3, 2017
c6198a9
Expect mcip3 transtion to be properly defined in chain spec.
5chdn Oct 3, 2017
4c9ead3
Merge branch 'master' into a5-chains-musicoin
5chdn Oct 3, 2017
e4532f9
Panic handling for mcip to default to regular block rewards if not sp…
5chdn Oct 3, 2017
8319991
Giving mcip3 rewards a useful default value.
5chdn Oct 3, 2017
d7db848
Fix ethjson tests.
5chdn Oct 3, 2017
b43006e
Update musicoin chain spec
5chdn Oct 4, 2017
d747307
Merge branch 'master' into a5-chains-musicoin
5chdn Oct 4, 2017
12cd04c
Fix tests 0:)
5chdn Oct 4, 2017
d0d8f1c
Add musicoin mcip3 era test spec.
5chdn Oct 4, 2017
babb3a3
Update musicoin chain spec(s)
5chdn Oct 4, 2017
f49aa0b
Add tests for mcip3 era block rewards
5chdn Oct 4, 2017
559d9a9
Merge branch 'master' into a5-chains-musicoin
5chdn Oct 4, 2017
4e9e8c9
Fix tests
5chdn Oct 4, 2017
21f27b5
Merge branch 'master' into a5-chains-musicoin
5chdn Oct 6, 2017
5a21744
Disable byzantium for musicoin
5chdn Oct 6, 2017
0cb6303
Pass miner reward to the tracer.
5chdn Oct 6, 2017
dd36b4c
Allow modifying blockreward in MCIP-3 transition.
5chdn Oct 6, 2017
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions ethcore/res/ethereum/classic.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
"ecip1010PauseTransition": 3000000,
"ecip1010ContinueTransition": 5000000,
"ecip1017EraRounds": 5000000,

"eip161abcTransition": "0x7fffffffffffffff",
"eip161dTransition": "0x7fffffffffffffff"
}
Expand All @@ -31,7 +30,6 @@
"forkBlock": "0x1d4c00",
"forkCanonHash": "0x94365e3a8c0b35089c1d1195081fe7489b528a84b22199c916180db8b28ade7f",
"eip155Transition": 3000000,

"eip98Transition": "0x7fffffffffffff",
"eip86Transition": "0x7fffffffffffff"
},
Expand Down
113 changes: 113 additions & 0 deletions ethcore/res/ethereum/musicoin.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
{
"name": "Musicoin",
"dataDir": "musicoin",
"engine": {
"Ethash": {
"params": {
"minimumDifficulty": "0x20000",
"difficultyBoundDivisor": "0x800",
"durationLimit": "0xd",
"homesteadTransition": "0x7fffffffffffff",
"eip150Transition": "0x7fffffffffffff",
"eip160Transition": "0x7fffffffffffff",
"eip161abcTransition": "0x7fffffffffffff",
"eip161dTransition": "0x7fffffffffffff",
"blockReward": "0x1105a0185b50a80000",
"mcip3Transition": "0x124f81",
"mcip3MinerReward": "0xd8d726b7177a80000",
"mcip3UbiReward": "0x2b5e3af16b1880000",
"mcip3UbiContract": "0x00efdd5883ec628983e9063c7d969fe268bbf310",
"mcip3DevReward": "0xc249fdd327780000",
"mcip3DevContract": "0x00756cf8159095948496617f5fb17ed95059f536"
}
}
},
"params": {
"gasLimitBoundDivisor": "0x400",
"registrar": "0x5C271c4C9A67E7D73b7b3669d47504741354f21D",
"accountStartNonce": "0x0",
"maximumExtraDataSize": "0x20",
"minGasLimit": "0x1388",
"networkID": "0x76740f",
"forkBlock": "0x5b6",
"forkCanonHash": "0xa5e88ad9e34d113e264e307bc27e8471452c8fc13780324bb3abb96fd0558343",
"eip155Transition": "0x7fffffffffffff",
"eip98Transition": "0x7fffffffffffff",
"eip86Transition": "0x7fffffffffffff"
},
"genesis": {
"seal": {
"ethereum": {
"nonce": "0x000000000000002a",
"mixHash": "0x00000000000000000000000000000000000000647572616c65787365646c6578"
}
},
"difficulty": "0x3d0900",
"author": "0x0000000000000000000000000000000000000000",
"timestamp": "0x00",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"extraData": "",
"gasLimit": "0x7a1200"
},
"nodes": [
"enode://a979fb575495b8d6db44f750317d0f4622bf4c2aa3365d6af7c284339968eef29b69ad0dce72a4d8db5ebb4968de0e3bec910127f134779fbcb0cb6d3331163c@52.16.188.185:30303",
"enode://3f1d12044546b76342d59d4a05532c14b85aa669704bfe1f864fe079415aa2c02d743e03218e57a33fb94523adb54032871a6c51b2cc5514cb7c7e35b3ed0a99@13.93.211.84:30303",
"enode://78de8a0916848093c73790ead81d1928bec737d565119932b98c6b100d944b7a95e94f847f689fc723399d2e31129d182f7ef3863f2b4c820abbf3ab2722344d@191.235.84.50:30303",
"enode://158f8aab45f6d19c6cbf4a089c2670541a8da11978a2f90dbf6a502a4a3bab80d288afdbeb7ec0ef6d92de563767f3b1ea9e8e334ca711e9f8e2df5a0385e8e6@13.75.154.138:30303",
"enode://1118980bf48b0a3640bdba04e0fe78b1add18e1cd99bf22d53daac1fd9972ad650df52176e7c7d89d1114cfef2bc23a2959aa54998a46afcf7d91809f0855082@52.74.57.123:30303",
"enode://979b7fa28feeb35a4741660a16076f1943202cb72b6af70d327f053e248bab9ba81760f39d0701ef1d8f89cc1fbd2cacba0710a12cd5314d5e0c9021aa3637f9@5.1.83.226:30303",
"enode://d302f52c8789ad87ee528f1431a67f1aa646c9bec17babb4665dfb3d61de5b9119a70aa77b2147a5f28854092ba09769323c1c552a6ac6f6a34cbcf767e2d2fe@158.69.248.48:30303",
"enode://c72564bce8331ae298fb8ece113a456e3927d7e5989c2be3e445678b3600579f722410ef9bbfe339335d676af77343cb21b5b1703b7bebc32be85fce937a2220@191.252.185.71:30303",
"enode://e3ae4d25ee64791ff98bf17c37acf90933359f2505c00f65c84f6863231a32a94153cadb0a462e428f18f35ded6bd91cd91033d26576a28558c22678be9cfaee@5.63.158.137:35555"
],
"accounts": {
"0000000000000000000000000000000000000001": {
"balance": "1",
"builtin": {
"name": "ecrecover",
"pricing": {
"linear": {
"base": 3000,
"word": 0
}
}
}
},
"0000000000000000000000000000000000000002": {
"balance": "1",
"builtin": {
"name": "sha256",
"pricing": {
"linear": {
"base": 60,
"word": 12
}
}
}
},
"0000000000000000000000000000000000000003": {
"balance": "1",
"builtin": {
"name": "ripemd160",
"pricing": {
"linear": {
"base": 600,
"word": 120
}
}
}
},
"0000000000000000000000000000000000000004": {
"balance": "1",
"builtin": {
"name": "identity",
"pricing": {
"linear": {
"base": 15,
"word": 3
}
}
}
}
}
}
41 changes: 37 additions & 4 deletions ethcore/src/ethereum/ethash.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ use hash::{KECCAK_EMPTY_LIST_RLP};
use ethash::{quick_get_difficulty, slow_hash_block_number, EthashManager, OptimizeFor};
use bigint::prelude::U256;
use bigint::hash::{H256, H64};
use util::Address;
use unexpected::{OutOfBounds, Mismatch};
use block::*;
use error::{BlockError, Error};
Expand Down Expand Up @@ -69,6 +70,18 @@ pub struct EthashParams {
pub ecip1010_continue_transition: u64,
/// Total block number for one ECIP-1017 era.
pub ecip1017_era_rounds: u64,
/// Number of first block where MCIP-3 begins.
pub mcip3_transition: u64,
/// MCIP-3 Block reward coin-base for miners.
pub mcip3_miner_reward: Option<U256>,
/// MCIP-3 Block reward ubi-base for basic income.
pub mcip3_ubi_reward: Option<U256>,
/// MCIP-3 contract address for universal basic income.
pub mcip3_ubi_contract: Address,
/// MCIP-3 Block reward dev-base for dev funds.
pub mcip3_dev_reward: Option<U256>,
/// MCIP-3 contract address for the developer funds.
pub mcip3_dev_contract: Address,
/// Block reward in base units.
pub block_reward: U256,
/// EIP-649 transition block.
Expand All @@ -95,6 +108,12 @@ impl From<ethjson::spec::EthashParams> for EthashParams {
ecip1010_pause_transition: p.ecip1010_pause_transition.map_or(u64::max_value(), Into::into),
ecip1010_continue_transition: p.ecip1010_continue_transition.map_or(u64::max_value(), Into::into),
ecip1017_era_rounds: p.ecip1017_era_rounds.map_or(u64::max_value(), Into::into),
mcip3_transition: p.mcip3_transition.map_or(u64::max_value(), Into::into),
mcip3_miner_reward: p.mcip3_miner_reward.map(Into::into),
mcip3_ubi_reward: p.mcip3_ubi_reward.map(Into::into),
mcip3_ubi_contract: p.mcip3_ubi_contract.map_or_else(Address::new, Into::into),
mcip3_dev_reward: p.mcip3_dev_reward.map(Into::into),
mcip3_dev_contract: p.mcip3_dev_contract.map_or_else(Address::new, Into::into),
block_reward: p.block_reward.map_or_else(Default::default, Into::into),
eip649_transition: p.eip649_transition.map_or(u64::max_value(), Into::into),
eip649_delay: p.eip649_delay.map_or(DEFAULT_EIP649_DELAY, Into::into),
Expand Down Expand Up @@ -186,24 +205,38 @@ impl Engine<EthereumMachine> for Arc<Ethash> {
let author = *LiveBlock::header(&*block).author();
let number = LiveBlock::header(&*block).number();

// Applies EIP-649 reward.
let reward = if number >= self.ethash_params.eip649_transition {
self.ethash_params.eip649_reward.unwrap_or(self.ethash_params.block_reward)
} else {
self.ethash_params.block_reward
};

// Applies ECIP-1017 eras.
let eras_rounds = self.ethash_params.ecip1017_era_rounds;
let (eras, reward) = ecip1017_eras_block_reward(eras_rounds, reward, number);

let n_uncles = LiveBlock::uncles(&*block).len();

// Bestow block reward
// Bestow block rewards.
let result_block_reward = reward + reward.shr(5) * U256::from(n_uncles);
let mut uncle_rewards = Vec::with_capacity(n_uncles);

self.machine.add_balance(block, &author, &result_block_reward)?;
if number >= self.ethash_params.mcip3_transition {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is it possible to write tests for that?

Copy link
Contributor Author

@5chdn 5chdn Oct 4, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, would be lucky to do that. Do I just add tests at the bottom of ethash.rs? Can I reuse the test_spec() or should I create a new test chain that includes the transition? Edit: Created tests for the block rewards.

let miner_reward = self.ethash_params.mcip3_miner_reward.unwrap();
let ubi_contract = self.ethash_params.mcip3_ubi_contract;
let ubi_reward = self.ethash_params.mcip3_ubi_reward.unwrap();
let dev_contract = self.ethash_params.mcip3_dev_contract;
let dev_reward = self.ethash_params.mcip3_dev_reward.unwrap();
Copy link
Contributor

@rphmeier rphmeier Oct 2, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we don't use unwrap(). favor expect() with a proof that it will never panic. That these fields are either all set or all not should be checked at spec parsing time. Grouping them into a struct mcip3 parsed optionally would make that logic a lot easier.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This makes sense. I have rewritten the logic, now a malformed mcip3 spec will just behave like a default block reward scheme.


// bestow uncle rewards.
self.machine.add_balance(block, &author, &miner_reward)?;
self.machine.add_balance(block, &ubi_contract, &ubi_reward)?;
self.machine.add_balance(block, &dev_contract, &dev_reward)?;
} else {
self.machine.add_balance(block, &author, &result_block_reward)?;
}

// Bestow uncle rewards.
for u in LiveBlock::uncles(&*block) {
let uncle_author = u.author();
let result_uncle_reward = if eras == 0 {
Expand All @@ -219,7 +252,7 @@ impl Engine<EthereumMachine> for Arc<Ethash> {
self.machine.add_balance(block, a, reward)?;
}

// note and trace.
// Note and trace.
self.machine.note_rewards(block, &[(author, result_block_reward)], &uncle_rewards)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

without altering this line, block rewards from this change won't be traced. I would recommend using a
Cow<&'a [(Address, U256)]> to store the main block reward initially to avoid an allocation on every block unless it's a musicoin chain.

Copy link
Contributor

@rphmeier rphmeier Oct 5, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

or a separate call to machine.note_rewards within the musicoin conditional would serve the same purpose.

Copy link
Contributor Author

@5chdn 5chdn Oct 5, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should I call machine.note_rewards for each block reward or only for the miner reward? Also, is the order of machine.add_balance important?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

note_rewards takes two slices of &[(Address, U256)]. The first one is for block rewards and the second for uncle rewards. I don't think it matters if you make multiple calls to the function.

@grbIzl tracing does handle multiple block rewards correctly, right?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@rphmeier it should. It's pretty straightforward.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

good. @5chdn then you would say the correct implementation traces only the miner reward and not any of the others? LGTM if so.

}

Expand Down
5 changes: 5 additions & 0 deletions ethcore/src/ethereum/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,11 @@ pub fn new_expanse<'a, T: Into<SpecParams<'a>>>(params: T) -> Spec {
load(params.into(), include_bytes!("../../res/ethereum/expanse.json"))
}

/// Create a new Musicoin mainnet chain spec.
pub fn new_musicoin<'a, T: Into<SpecParams<'a>>>(params: T) -> Spec {
load(params.into(), include_bytes!("../../res/ethereum/musicoin.json"))
}

/// Create a new Kovan testnet chain spec.
pub fn new_kovan<'a, T: Into<SpecParams<'a>>>(params: T) -> Spec {
load(params.into(), include_bytes!("../../res/ethereum/kovan.json"))
Expand Down
6 changes: 6 additions & 0 deletions ethcore/src/tests/helpers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -377,6 +377,12 @@ pub fn get_default_ethash_params() -> EthashParams {
ecip1010_pause_transition: u64::max_value(),
ecip1010_continue_transition: u64::max_value(),
ecip1017_era_rounds: u64::max_value(),
mcip3_transition: u64::max_value(),
mcip3_miner_reward: None,
mcip3_ubi_reward: None,
mcip3_ubi_contract: "0000000000000000000000000000000000000001".into(),
mcip3_dev_reward: None,
mcip3_dev_contract: "0000000000000000000000000000000000000001".into(),
eip649_transition: u64::max_value(),
eip649_delay: 3_000_000,
eip649_reward: None,
Expand Down
1 change: 1 addition & 0 deletions js/src/i18n/_default/settings.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ export default {
chain_classic: `Parity syncs to the Ethereum Classic network`,
chain_dev: `Parity uses a local development chain`,
chain_expanse: `Parity syncs to the Expanse network`,
chain_musicoin: `Parity syncs to the Musicoin network`,
chain_foundation: `Parity syncs to the Ethereum network launched by the Ethereum Foundation`,
chain_kovan: `Parity syncs to the Kovan test network`,
chain_olympic: `Parity syncs to the Olympic test network`,
Expand Down
1 change: 1 addition & 0 deletions js/src/i18n/nl/settings.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ export default {
chain_classic: `Parity synchroniseert met het Ethereum Classic netwerk`,
chain_dev: `Parity gebruikt een lokale ontwikkelaars chain`,
chain_expanse: `Parity synchroniseert met het Expanse netwerk`,
chain_musicoin: `Parity synchroniseert met het Musicoin netwerk`,
chain_foundation: `Parity synchroniseert met het Ethereum netwerk wat door de Ethereum Foundation is uitgebracht`,
chain_kovan: `Parity synchroniseert met het Kovan test netwerk`,
chain_olympic: `Parity synchroniseert met het Olympic test netwerk`,
Expand Down
1 change: 1 addition & 0 deletions js/src/i18n/zh-Hant-TW/settings.js
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ export default {
chain_classic: `將Parity同步至以太坊經典網路`, // Parity syncs to the Ethereum Classic network
chain_dev: `將Parity使用一條本地開發用區塊鏈`, // Parity uses a local development chain
chain_expanse: `將Parity同步至Expanse網路`, // Parity syncs to the Expanse network
chain_musicoin: `將Parity同步至Musicoin網路`, // Parity syncs to the Musicoin network
chain_foundation: `將Parity同步至以太坊基金會發起的以太坊網路`, // Parity syncs to the Ethereum network launched by the Ethereum Foundation
chain_kovan: `將Parity同步至Kovan測試網路`, // Parity syncs to the Kovan test network
chain_olympic: `將Parity同步至Olympic測試網路`, // Parity syncs to the Olympic test network
Expand Down
1 change: 1 addition & 0 deletions js/src/i18n/zh/settings.js
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ export default {
chain_classic: `将Parity同步至以太坊经典网络`, // Parity syncs to the Ethereum Classic network
chain_dev: `将Parity使用一条本地开发用区块链`, // Parity uses a local development chain
chain_expanse: `将Parity同步至Expanse网络`, // Parity syncs to the Expanse network
chain_musicoin: `将Parity同步至Musicoin网络`, // Parity syncs to the Musicoin network
chain_foundation: `将Parity同步至以太坊基金会发起的以太坊网络`, // Parity syncs to the Ethereum network launched by the Ethereum Foundation
chain_kovan: `将Parity同步至Kovan测试网络`, // Parity syncs to the Kovan test network
chain_olympic: `将Parity同步至Olympic测试网络`, // Parity syncs to the Olympic test network
Expand Down
2 changes: 1 addition & 1 deletion js/src/jsonrpc/interfaces/parity.js
Original file line number Diff line number Diff line change
Expand Up @@ -1756,7 +1756,7 @@ export default {
params: [
{
type: String,
desc: 'Chain spec name, one of: "foundation", "ropsten", "morden", "kovan", "olympic", "classic", "dev", "expanse" or a filename.',
desc: 'Chain spec name, one of: "foundation", "ropsten", "morden", "kovan", "olympic", "classic", "dev", "expanse", "musicoin" or a filename.',
example: 'foundation'
}
],
Expand Down
6 changes: 6 additions & 0 deletions js/src/ui/CurrencySymbol/currencySymbol.example.js
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,12 @@ export default class CurrencySymbolExample extends Component {
netChain='expanse'
/>
</PlaygroundExample>

<PlaygroundExample name='MUSIC Currency Symbol'>
<CurrencySymbol
netChain='musicoin'
/>
</PlaygroundExample>
</div>
);
}
Expand Down
4 changes: 4 additions & 0 deletions js/src/ui/CurrencySymbol/currencySymbol.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import { connect } from 'react-redux';
const SYMBOL_ETC = 'ETC';
const SYMBOL_ETH = 'ETH';
const SYMBOL_EXP = 'EXP';
const SYMBOL_MUSIC = 'MUSIC';

export class CurrencySymbol extends Component {
static propTypes = {
Expand All @@ -45,6 +46,9 @@ export class CurrencySymbol extends Component {
case 'expanse':
return SYMBOL_EXP;

case 'musicoin':
return SYMBOL_MUSIC;

default:
return SYMBOL_ETH;
}
Expand Down
8 changes: 8 additions & 0 deletions js/src/ui/CurrencySymbol/currencySymbol.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,10 @@ describe('ui/CurrencySymbol', () => {
expect(render('expanse').text()).equal('EXP');
});

it('renders MUSIC for musicoin', () => {
expect(render('musicoin').text()).equal('MUSIC');
});

it('renders ETH as default', () => {
expect(render('somethingElse').text()).equal('ETH');
});
Expand All @@ -95,5 +99,9 @@ describe('ui/CurrencySymbol', () => {
it('render EXP', () => {
expect(render('expanse').instance().renderSymbol()).equal('EXP');
});

it('render MUSIC', () => {
expect(render('musicoin').instance().renderSymbol()).equal('MUSIC');
});
});
});
8 changes: 8 additions & 0 deletions js/src/views/Settings/Parity/parity.js
Original file line number Diff line number Diff line change
Expand Up @@ -263,6 +263,14 @@ export default class Parity extends Component {
/>
))
}
{
this.renderItem('musicoin', (
<FormattedMessage
id='settings.parity.chains.chain_musicoin'
defaultMessage='Parity syncs to the Musicoin network'
/>
))
}
{
this.renderItem('dev', (
<FormattedMessage
Expand Down
20 changes: 20 additions & 0 deletions json/src/spec/ethash.rs
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,26 @@ pub struct EthashParams {
/// See main EthashParams docs.
#[serde(rename="ecip1017EraRounds")]
pub ecip1017_era_rounds: Option<Uint>,

/// See main EthashParams docs.
#[serde(rename="mcip3Transition")]
pub mcip3_transition: Option<Uint>,
/// See main EthashParams docs.
#[serde(rename="mcip3MinerReward")]
pub mcip3_miner_reward: Option<Uint>,
/// See main EthashParams docs.
#[serde(rename="mcip3UbiReward")]
pub mcip3_ubi_reward: Option<Uint>,
/// See main EthashParams docs.
#[serde(rename="mcip3UbiContract")]
pub mcip3_ubi_contract: Option<Address>,
/// See main EthashParams docs.
#[serde(rename="mcip3DevReward")]
pub mcip3_dev_reward: Option<Uint>,
/// See main EthashParams docs.
#[serde(rename="mcip3DevContract")]
pub mcip3_dev_contract: Option<Address>,

/// EIP-649 transition block.
#[serde(rename="eip649Transition")]
pub eip649_transition: Option<Uint>,
Expand Down
2 changes: 1 addition & 1 deletion parity/cli/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -301,7 +301,7 @@ usage! {

ARG arg_chain: (String) = "foundation", or |c: &Config| otry!(c.parity).chain.clone(),
"--chain=[CHAIN]",
"Specify the blockchain type. CHAIN may be either a JSON chain specification file or olympic, frontier, homestead, mainnet, morden, ropsten, classic, expanse, testnet, kovan or dev.",
"Specify the blockchain type. CHAIN may be either a JSON chain specification file or olympic, frontier, homestead, mainnet, morden, ropsten, classic, expanse, musicoin, testnet, kovan or dev.",

ARG arg_keys_path: (String) = "$BASE/keys", or |c: &Config| otry!(c.parity).keys_path.clone(),
"--keys-path=[PATH]",
Expand Down
Loading