mirror of
https://github.com/status-im/contracts.git
synced 2025-02-24 04:28:51 +00:00
- Modified Identity to setup recovery contract address
- Added initial version of test unit for recovery contract
This commit is contained in:
parent
260c20561a
commit
d17265ed63
@ -20,7 +20,7 @@ contract FriendsRecovery {
|
||||
function FriendsRecovery( uint256 _threshold, bytes32[] _friendHashes) public {
|
||||
threshold = _threshold;
|
||||
uint len = _friendHashes.length;
|
||||
require(len < threshold);
|
||||
require(threshold <= len);
|
||||
for (uint i = 0; i < len; i++) {
|
||||
friendAllowed[_friendHashes[i]] = true;
|
||||
}
|
||||
|
@ -2,7 +2,6 @@ pragma solidity ^0.4.17;
|
||||
|
||||
import "./ERC725.sol";
|
||||
import "./ERC735.sol";
|
||||
import "./Recovery.sol";
|
||||
|
||||
contract Identity is ERC725, ERC735 {
|
||||
|
||||
@ -16,7 +15,7 @@ contract Identity is ERC725, ERC735 {
|
||||
bytes32[] pendingTransactions;
|
||||
uint nonce = 0;
|
||||
bool recoverySet;
|
||||
Recovery recoveryContract;
|
||||
address recoveryContract;
|
||||
|
||||
struct Transaction {
|
||||
address to;
|
||||
@ -29,12 +28,18 @@ contract Identity is ERC725, ERC735 {
|
||||
}
|
||||
|
||||
modifier managerOnly {
|
||||
require(isKeyType(bytes32(msg.sender), MANAGEMENT_KEY));
|
||||
require(
|
||||
isKeyType(bytes32(msg.sender), MANAGEMENT_KEY) ||
|
||||
(recoverySet && msg.sender == address(recoveryContract))
|
||||
);
|
||||
_;
|
||||
}
|
||||
|
||||
modifier selfOnly {
|
||||
require(msg.sender == address(this));
|
||||
require(
|
||||
msg.sender == address(this) ||
|
||||
(recoverySet && msg.sender == address(recoveryContract))
|
||||
);
|
||||
_;
|
||||
}
|
||||
|
||||
@ -51,7 +56,8 @@ contract Identity is ERC725, ERC735 {
|
||||
modifier managerOrActor {
|
||||
require(
|
||||
isKeyType(bytes32(msg.sender), MANAGEMENT_KEY) ||
|
||||
isKeyType(bytes32(msg.sender), ACTION_KEY)
|
||||
isKeyType(bytes32(msg.sender), ACTION_KEY) ||
|
||||
(recoverySet && msg.sender == address(recoveryContract))
|
||||
);
|
||||
_;
|
||||
}
|
||||
@ -114,6 +120,7 @@ contract Identity is ERC725, ERC735 {
|
||||
managerOrActor
|
||||
returns (bool success)
|
||||
{
|
||||
|
||||
Transaction storage trx = txx[_id];
|
||||
|
||||
bytes32 managerKeyHash = keccak256(bytes32(msg.sender), MANAGEMENT_KEY);
|
||||
@ -368,37 +375,15 @@ contract Identity is ERC725, ERC735 {
|
||||
return claimsByType[_claimType];
|
||||
}
|
||||
|
||||
// ---- Recovery Specific Functions
|
||||
event RecoverySetUp(address sender, bytes32[] recoveryHashes);
|
||||
event RecoveryCompleted(bytes32 newManagementKey);
|
||||
|
||||
function setupRecovery(bytes32[] _recoveryHashes)
|
||||
function setupRecovery(address _recoveryContract)
|
||||
public
|
||||
managerOnly
|
||||
selfOnly
|
||||
{
|
||||
require(recoverySet == false);
|
||||
RecoverySetUp(msg.sender, _recoveryHashes);
|
||||
recoveryContract = new Recovery(this, _recoveryHashes);
|
||||
recoveryContract = _recoveryContract;
|
||||
recoverySet = true;
|
||||
}
|
||||
|
||||
function completeRecovery() public {
|
||||
require(recoverySet == true);
|
||||
address newManager = recoveryContract.getNewManager();
|
||||
require(newManager != address(0x0));
|
||||
|
||||
RecoveryCompleted(bytes32(newManager));
|
||||
|
||||
bytes32[] memory managementKeys = getKeysByPurpose(MANAGEMENT_KEY);
|
||||
for (uint256 i = 0; i < managementKeys.length; i++) {
|
||||
_removeKey(managementKeys[i], MANAGEMENT_KEY);
|
||||
}
|
||||
addKey(bytes32(newManager), MANAGEMENT_KEY, 1);
|
||||
setMiminumApprovalsByKeyType(MANAGEMENT_KEY, 1);
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -16,5 +16,8 @@
|
||||
"homepage": "https://github.com/status-im/contracts#readme",
|
||||
"devDependencies": {
|
||||
"solidity-coverage": "^0.4.4"
|
||||
},
|
||||
"dependencies": {
|
||||
"web3": "^1.0.0-beta.30"
|
||||
}
|
||||
}
|
||||
|
42
test/friendsRecovery.js
Normal file
42
test/friendsRecovery.js
Normal file
@ -0,0 +1,42 @@
|
||||
const TestUtils = require("./TestUtils.js")
|
||||
const Identity = artifacts.require("./identity/Identity.sol");
|
||||
const FriendsRecovery = artifacts.require("./identity/FriendsRecovery.sol");
|
||||
|
||||
const web3EthAbi = require("web3-eth-abi");
|
||||
|
||||
contract('FriendsRecovery', function(accounts) {
|
||||
|
||||
|
||||
describe("FriendsRecovery()", () => {
|
||||
it("test1", async () => {
|
||||
|
||||
let identity = await Identity.new({from: accounts[0]});
|
||||
|
||||
|
||||
// TODO setup recovery contract with real hashes
|
||||
let threshold = 3;
|
||||
let friendHashes = ["0x1", "0x2", "0x3", "0x4"];
|
||||
let recoveryContract = await FriendsRecovery.new(threshold, friendHashes, {from: accounts[0]});
|
||||
|
||||
let functionPayload = web3EthAbi.encodeFunctionCall({
|
||||
name: 'setupRecovery',
|
||||
type: 'function',
|
||||
inputs: [{
|
||||
type: 'address',
|
||||
name: '_recoveryContract'
|
||||
}]
|
||||
}, [recoveryContract.address]);
|
||||
|
||||
|
||||
// Setting up recovery contract for identity
|
||||
let tx = await identity.execute(identity.address, 0, functionPayload, {from: accounts[0]} );
|
||||
|
||||
|
||||
console.log(tx.logs);
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
|
||||
|
||||
});
|
Loading…
x
Reference in New Issue
Block a user