improve replaceKey

This commit is contained in:
Ricardo Guilherme Schmidt 2018-05-11 01:53:22 -03:00
parent 5b7124fc57
commit 15975dbce3
1 changed files with 55 additions and 10 deletions

View File

@ -224,25 +224,22 @@ contract Identity is ERC725, ERC735, MessageSigned {
}
/**
* @notice Replaces one `_oldKey` with other `_recoveryNewKey`
* @notice Replaces one `_oldKey` with other `_newKey`
* @param _purpose what purpose being replaced
* @param _oldKey key to remove
* @param _recoveryNewKey key to add
* @param _newType inform type of `_recoveryNewKey`
* @param _newKey key to add
* @param _newType inform type of `_newKey`
*/
function replaceKey(
uint256 _purpose,
bytes32 _oldKey,
bytes32 _recoveryNewKey,
bytes32 _newKey,
uint256 _newType
)
public
managementOnly
returns (bool success)
{
_addKey(_recoveryNewKey, _purpose, _newType, salt);
_removeKey(_oldKey, _purpose, salt);
return true;
{
return _replaceKey(_oldKey, _newKey, _newType, salt);
}
/**
@ -582,7 +579,6 @@ contract Identity is ERC725, ERC735, MessageSigned {
emit KeyAdded(_key, _purpose, _type);
}
function _removeKey(
bytes32 _key,
uint256 _purpose,
@ -635,6 +631,55 @@ contract Identity is ERC725, ERC735, MessageSigned {
emit KeyRemoved(_key, _purpose, _type);
}
/**
* @notice Replaces one `_oldKey` with other `_newKey`
* @param _oldKey key to remove
* @param _newKey key to add
* @param _newType inform type of `_newKey`
* @param _salt current salt
*/
function _replaceKey(
bytes32 _oldKey,
bytes32 _newKey,
uint256 _newType,
uint256 _salt
)
private
returns (bool success)
{
bytes32 newKeySaltedHash = keccak256(_newKey, _salt); // key storage pointer
if (_oldKey == _newKey) { //not replacing key, just keyType
keys[newKeySaltedHash].keyType == _newType;
return true;
}
bytes32 oldKeySaltedHash = keccak256(_oldKey, _salt); // key storage pointer
Key memory oldKey = keys[oldKeySaltedHash];
delete keys[oldKeySaltedHash];
uint256 len = oldKey.purposes.length;
for (uint i = 0; i < len; i++) {
uint256 _purpose = oldKey.purposes[i];
bytes32 purposeSaltedHash = keccak256(_purpose, _salt); // salted accounts by purpose array index pointer
bytes32 saltedOldKeyPurposeHash = keccak256(oldKeySaltedHash, _purpose); // accounts by purpose hash element index pointer
bytes32 saltedNewKeyPurposeHash = keccak256(newKeySaltedHash, _purpose); // accounts by purpose hash element index pointer
bytes32 oldKeyPurposeSaltedHash = keccak256(_oldKey, _purpose, _salt); //account purpose array element index
bytes32 newKeyPurposeSaltedHash = keccak256(_newKey, _purpose, _salt); //account purpose array element index
delete isKeyPurpose[saltedOldKeyPurposeHash]; //clear oldKey auth
isKeyPurpose[saltedNewKeyPurposeHash] = true; //set newKey auth
uint256 replacedKeyElementIndex = indexes[saltedOldKeyPurposeHash];
delete indexes[saltedOldKeyPurposeHash];
keysByPurpose[purposeSaltedHash][replacedKeyElementIndex] = _newKey; //replace key at list by purpose
indexes[saltedNewKeyPurposeHash] = replacedKeyElementIndex; // save index
indexes[newKeyPurposeSaltedHash] = indexes[oldKeyPurposeSaltedHash]; //transfer key purposes list index
delete indexes[oldKeyPurposeSaltedHash];
}
keys[newKeySaltedHash] = Key(oldKey.purposes, _newType, _newKey); //add new key
return true;
}
function _includeClaim(
bytes32 _claimHash,
uint256 _claimType,