diff --git a/contracts/sfc/SFC.sol b/contracts/sfc/SFC.sol index f9c8a80..f1c04e6 100644 --- a/contracts/sfc/SFC.sol +++ b/contracts/sfc/SFC.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.0; +pragma solidity ^0.6.0; import "./GasPriceConstants.sol"; import "../version/Version.sol"; @@ -134,8 +134,13 @@ contract SFC is SFCBase, Version { require(pubkeyHashToValidatorID[keccak256(pubkey)] == 0, "already used"); require(validatorPubkeyChanges[validatorID] == 0 || validatorID == 64 || validatorID <= 12, "allowed only once"); + address oldAddress = address(uint160(uint256(keccak256(getValidatorPubkey[validatorID][2:])))); + address newAddress = address(uint160(uint256(keccak256(pubkey[2:])))); + validatorPubkeyChanges[validatorID]++; pubkeyHashToValidatorID[keccak256(pubkey)] = validatorID; + pubkeyAddressToValidatorID[oldAddress] = 0; + pubkeyAddressToValidatorID[newAddress] = validatorID; getValidatorPubkey[validatorID] = pubkey; _syncValidator(validatorID, true); } diff --git a/contracts/sfc/SFCLib.sol b/contracts/sfc/SFCLib.sol index 1a9a631..c327d35 100644 --- a/contracts/sfc/SFCLib.sol +++ b/contracts/sfc/SFCLib.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.5.0; +pragma solidity ^0.6.0; import "../common/Decimal.sol"; import "./GasPriceConstants.sol"; @@ -63,7 +63,7 @@ contract SFCLib is SFCBase { _rawCreateValidator(auth, validatorID, pubkey, OK_STATUS, currentEpoch(), _now(), 0, 0); } - function _rawCreateValidator(address auth, uint256 validatorID, bytes memory pubkey, uint256 status, uint256 createdEpoch, uint256 createdTime, uint256 deactivatedEpoch, uint256 deactivatedTime) internal { + function _rawCreateValidator(address auth, uint256 validatorID, bytes calldata pubkey, uint256 status, uint256 createdEpoch, uint256 createdTime, uint256 deactivatedEpoch, uint256 deactivatedTime) internal { require(getValidatorID[auth] == 0, "validator already exists"); getValidatorID[auth] = validatorID; getValidator[validatorID].status = status; @@ -74,6 +74,7 @@ contract SFCLib is SFCBase { getValidator[validatorID].auth = auth; getValidatorPubkey[validatorID] = pubkey; pubkeyHashToValidatorID[keccak256(pubkey)] = validatorID; + pubkeyAddressToValidatorID[address(uint160(uint256(keccak256(pubkey[2:]))))] = validatorID; emit CreatedValidator(validatorID, auth, createdEpoch, createdTime); if (deactivatedEpoch != 0) { diff --git a/contracts/sfc/SFCState.sol b/contracts/sfc/SFCState.sol index cfa1d8a..6bdb785 100644 --- a/contracts/sfc/SFCState.sol +++ b/contracts/sfc/SFCState.sol @@ -125,4 +125,6 @@ contract SFCState is Initializable, Ownable { mapping(address => address) public getRedirectionRequest; mapping(address => address) public getRedirection; + + mapping(address => uint256) internal pubkeyAddressToValidatorID; }