/*
* Copyright (c) [2016] [ <ether.camp> ]
* This file is part of the ethereumJ library.
*
* The ethereumJ library is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* The ethereumJ library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with the ethereumJ library. If not, see <http://www.gnu.org/licenses/>.
*/
package org.ethereum.config.blockchain;
import org.ethereum.config.BlockchainConfig;
import org.ethereum.core.BlockHeader;
import java.math.BigInteger;
import static org.ethereum.util.BIUtil.max;
/**
* Ethereum Classic HF on Block #3_000_000:
* - EXP reprice (EIP-160)
* - Replay Protection (EIP-155) (chainID: 61)
* - Difficulty Bomb delay (ECIP-1010) (https://github.com/ethereumproject/ECIPs/blob/master/ECIPs/ECIP-1010.md)
*
* Created by Anton Nashatyrev on 13.01.2017.
*/
public class ETCFork3M extends Eip160HFConfig {
public ETCFork3M(BlockchainConfig parent) {
super(parent);
}
@Override
public Integer getChainId() {
return 61;
}
@Override
public boolean eip161() {
return false;
}
@Override
public BigInteger calcDifficulty(BlockHeader curBlock, BlockHeader parent) {
BigInteger pd = parent.getDifficultyBI();
BigInteger quotient = pd.divide(getConstants().getDIFFICULTY_BOUND_DIVISOR());
BigInteger sign = getCalcDifficultyMultiplier(curBlock, parent);
BigInteger fromParent = pd.add(quotient.multiply(sign));
BigInteger difficulty = max(getConstants().getMINIMUM_DIFFICULTY(), fromParent);
int explosion = getExplosion(curBlock, parent);
if (explosion >= 0) {
difficulty = max(getConstants().getMINIMUM_DIFFICULTY(), difficulty.add(BigInteger.ONE.shiftLeft(explosion)));
}
return difficulty;
}
protected BigInteger getCalcDifficultyMultiplier(BlockHeader curBlock, BlockHeader parent) {
return BigInteger.valueOf(Math.max(1 - (curBlock.getTimestamp() - parent.getTimestamp()) / 10, -99));
}
protected int getExplosion(BlockHeader curBlock, BlockHeader parent) {
int pauseBlock = 3000000;
int contBlock = 5000000;
int delay = (contBlock - pauseBlock) / 100000;
int fixedDiff = (pauseBlock / 100000) - 2;
if (curBlock.getNumber() < contBlock) {
return fixedDiff;
} else {
return (int) ((curBlock.getNumber() / 100000) - delay - 2);
}
}
}