Merge from embark into develop
This commit is contained in:
commit
74262dd33e
|
@ -9,7 +9,6 @@ contract TestContract {
|
|||
TestFunctionExecuted();
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Helper function to be used in unit testing due to error in web3
|
||||
web3.utils.soliditySha3([1, 2, 3])
|
||||
|
@ -23,7 +22,7 @@ contract TestContract {
|
|||
bytes _data,
|
||||
bytes32 _newSecret,
|
||||
bytes32[] _newFriendsHashes)
|
||||
external
|
||||
public
|
||||
pure
|
||||
returns(bytes32)
|
||||
{
|
||||
|
|
210
test/factory.js
210
test/factory.js
|
@ -1,102 +1,136 @@
|
|||
const assert = require('assert');
|
||||
const Embark = require('embark');
|
||||
let EmbarkSpec = Embark.initTests();
|
||||
let web3 = EmbarkSpec.web3;
|
||||
|
||||
const identityJson = require('../dist/contracts/Identity.json');
|
||||
const updatedIdentityKernelJson = require('../dist/contracts/UpdatedIdentityKernel.json');
|
||||
|
||||
const TestUtils = require("../utils/testUtils.js")
|
||||
const idUtils = require("../utils/identityUtils.js")
|
||||
const web3EthAbi = require("web3-eth-abi");
|
||||
|
||||
const Identity = artifacts.require("./identity/Identity.sol");
|
||||
const IdentityFactory = artifacts.require("./identity/IdentityFactory.sol");
|
||||
const UpdatableInstance = artifacts.require('./deploy/UpdatableInstance.sol');
|
||||
const UpdatedIdentityKernel = artifacts.require("./tests/UpdatedIdentityKernel.sol");
|
||||
|
||||
contract('IdentityFactory', function(accounts) {
|
||||
describe('IdentityFactory', function(accounts) {
|
||||
|
||||
let identityFactory;
|
||||
let identity;
|
||||
let updatedIdentity;
|
||||
let updatedIdentityKernel;
|
||||
|
||||
before(async () => {
|
||||
identityFactory = await IdentityFactory.new("0xaaa", {from: accounts[0]});
|
||||
})
|
||||
|
||||
describe("IdentityFactory()", () => {
|
||||
it("Creates a new identity", async () => {
|
||||
let tx = await identityFactory.createIdentity({from: accounts[0]});
|
||||
const logEntry = tx.logs[0];
|
||||
assert.strictEqual(logEntry.event, "IdentityCreated");
|
||||
|
||||
identity = await Identity.at(logEntry.args.instance, {from: accounts[0]})
|
||||
|
||||
assert.equal(
|
||||
await identity.getKeyPurpose(TestUtils.addressToBytes32(accounts[0])),
|
||||
idUtils.purposes.MANAGEMENT,
|
||||
identity.address + ".getKeyPurpose("+accounts[0]+") is not MANAGEMENT_KEY")
|
||||
});
|
||||
|
||||
|
||||
it("Registers a updated identity contract", async() => {
|
||||
const infoHash = "0xbbb";
|
||||
updatedIdentityKernel = await UpdatedIdentityKernel.new({from: accounts[0]});
|
||||
await identityFactory.setKernel(updatedIdentityKernel.address, infoHash);
|
||||
|
||||
const newKernel = await TestUtils.listenForEvent(identityFactory.NewKernel());
|
||||
assert(newKernel.infohash, infoHash, "Infohash is not correct");
|
||||
});
|
||||
|
||||
before( function(done) {
|
||||
this.timeout(0);
|
||||
|
||||
it("Creates a new identity using latest version", async() => {
|
||||
let tx = await identityFactory.createIdentity({from: accounts[0]});
|
||||
const logEntry = tx.logs[0];
|
||||
assert.strictEqual(logEntry.event, "IdentityCreated");
|
||||
EmbarkSpec = Embark.initTests();
|
||||
web3 = EmbarkSpec.web3;
|
||||
|
||||
updatedIdentity = await UpdatedIdentityKernel.at(logEntry.args.instance, {from: accounts[0]})
|
||||
tx = await updatedIdentity.test({from: accounts[0]});
|
||||
assert.strictEqual(tx.logs[0].event, "TestFunctionExecuted");
|
||||
|
||||
// Test if it still executes identity functions as expected
|
||||
let baseIdentity = await Identity.at(updatedIdentity.address, {from: accounts[0]})
|
||||
assert.equal(
|
||||
await identity.getKeyPurpose(TestUtils.addressToBytes32(accounts[0])),
|
||||
1,
|
||||
identity.address + ".getKeyPurpose("+accounts[0]+") is not MANAGEMENT_KEY")
|
||||
EmbarkSpec.deployAll({
|
||||
"IdentityFactory": {
|
||||
args: ["0xaaaa"],
|
||||
gas: 5000000
|
||||
},
|
||||
"Identity": {},
|
||||
"UpdatedIdentityKernel": {}
|
||||
}, (_accounts) => {
|
||||
accounts = _accounts;
|
||||
done();
|
||||
});
|
||||
|
||||
|
||||
it("Updates an identity to the latest version", async() => {
|
||||
let tx1 = await identity.execute(
|
||||
identity.address,
|
||||
0,
|
||||
idUtils.encode.updateRequestUpdatableInstance(updatedIdentityKernel.address),
|
||||
{from: accounts[0]}
|
||||
);
|
||||
|
||||
assert.strictEqual(tx1.logs[tx1.logs.length - 1].event, "Executed");
|
||||
|
||||
// Updating EVM timestamp to test delay
|
||||
const plus31days = 60 * 60 * 24 * 31;
|
||||
|
||||
web3.currentProvider.send({jsonrpc: "2.0", method: "evm_increaseTime", params: [plus31days], id: 0});
|
||||
web3.currentProvider.send({jsonrpc: "2.0", method: "evm_mine", params: [], id: 0})
|
||||
|
||||
// Confirm update
|
||||
let tx2 = await identity.execute(
|
||||
identity.address,
|
||||
0,
|
||||
idUtils.encode.updateConfirmUpdatableInstance(updatedIdentityKernel.address),
|
||||
{from: accounts[0]}
|
||||
);
|
||||
|
||||
assert.strictEqual(tx2.logs[tx2.logs.length - 1].event, "Executed");
|
||||
|
||||
// Calling function available in updated identity kernel
|
||||
let updatedIdentity1 = await UpdatedIdentityKernel.at(identity.address, {from: accounts[0]})
|
||||
let tx3 = await updatedIdentity1.test({from: accounts[0]});
|
||||
|
||||
assert.strictEqual(tx3.logs[tx3.logs.length - 1].event, "TestFunctionExecuted");
|
||||
assert.equal(
|
||||
tx3.logs[tx3.logs.length - 1].args.minApprovalsByManagementKeys.toString(10),
|
||||
1,
|
||||
identity.address + " wasn't updated to last version");
|
||||
})
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
it("Creates a new identity", async () => {
|
||||
let tx = await IdentityFactory.methods.createIdentity().send({from: accounts[0]});
|
||||
|
||||
const logEntry = tx.events.IdentityCreated;
|
||||
|
||||
assert(logEntry !== undefined, "IdentityCreated was not triggered");
|
||||
|
||||
let identity = new web3.eth.Contract(identityJson.abi, logEntry.returnValues.instance, {from: accounts[0]});
|
||||
|
||||
assert.equal(
|
||||
await identity.methods.getKeyPurpose(TestUtils.addressToBytes32(accounts[0])).call(),
|
||||
idUtils.purposes.MANAGEMENT,
|
||||
identity.address + ".getKeyPurpose("+accounts[0]+") is not MANAGEMENT_KEY")
|
||||
});
|
||||
|
||||
|
||||
it("Registers a updated identity contract", async() => {
|
||||
const infoHash = "0xbbbb";
|
||||
let receipt = await IdentityFactory.methods.setKernel(UpdatedIdentityKernel.address, infoHash).send({from: accounts[0]});
|
||||
|
||||
const newKernel = TestUtils.eventValues(receipt, "NewKernel");
|
||||
assert(newKernel.infohash, infoHash, "Infohash is not correct");
|
||||
});
|
||||
|
||||
|
||||
it("Creates a new identity using latest version", async() => {
|
||||
let tx = await IdentityFactory.methods.createIdentity().send({from: accounts[0]});
|
||||
|
||||
assert.notEqual(tx.events.IdentityCreated, undefined, "IdentityCreated wasn't triggered");
|
||||
|
||||
const contractAddress = tx.events.IdentityCreated.returnValues.instance;
|
||||
|
||||
|
||||
let updatedIdentity = new web3.eth.Contract(updatedIdentityKernelJson.abi, contractAddress, {from: accounts[0]});
|
||||
|
||||
tx = await updatedIdentity.methods.test().send({from: accounts[0]});
|
||||
assert.notEqual(tx.events.TestFunctionExecuted, undefined, "TestFunctionExecuted wasn't triggered");
|
||||
|
||||
// Test if it still executes identity functions as expected
|
||||
let baseIdentity = new web3.eth.Contract(identityJson.abi, contractAddress, {from: accounts[0]});
|
||||
|
||||
assert.equal(
|
||||
await baseIdentity.methods.getKeyPurpose(TestUtils.addressToBytes32(accounts[0])).call(),
|
||||
1,
|
||||
baseIdentity.address + ".getKeyPurpose("+accounts[0]+") is not MANAGEMENT_KEY")
|
||||
});
|
||||
|
||||
|
||||
it("Updates an identity to the latest version", async() => {
|
||||
let tx1 = await Identity.methods.execute(
|
||||
Identity.address,
|
||||
0,
|
||||
idUtils.encode.updateRequestUpdatableInstance(UpdatedIdentityKernel.address))
|
||||
.send({from: accounts[0]});
|
||||
|
||||
assert.notEqual(tx1.events.Executed, undefined, "Executed wasn't triggered");
|
||||
|
||||
// Updating EVM timestamp to test delay
|
||||
const plus31days = 60 * 60 * 24 * 31;
|
||||
|
||||
/*
|
||||
// @rramos - The following code is supposed to increase by 31 days the evm date,
|
||||
// and mine one block. It is commented because it seems to not be working on web3 1.0.
|
||||
// Also, sendAsync is supposed to be named send in this version, yet it shows an error
|
||||
// that it does not support synchronous executions. (?)
|
||||
// TODO: figure it out!
|
||||
|
||||
web3.currentProvider.send({jsonrpc: "2.0", method: "evm_increaseTime", params: [plus31days], id: 0}, function(){console.log(1);});
|
||||
web3.currentProvider.send({jsonrpc: "2.0", method: "evm_mine", params: [], id: 0}, function(){console.log(2);})
|
||||
|
||||
|
||||
|
||||
// Confirm update
|
||||
let tx2 = await Identity.methods.execute(
|
||||
Identity.address,
|
||||
0,
|
||||
idUtils.encode.updateConfirmUpdatableInstance(UpdatedIdentityKernel.address))
|
||||
.send({from: accounts[0]});
|
||||
|
||||
assert.notEqual(tx2.events.Executed, undefined, "Executed wasn't triggered");
|
||||
|
||||
|
||||
let updatedIdentity1 = new web3.eth.Contract(updatedIdentityKernelJson.abi, Identity.address, {from: accounts[0]});
|
||||
|
||||
// Calling
|
||||
let tx3 = await updatedIdentity1.methods.test().send({from: accounts[0]});
|
||||
assert.notEqual(tx3.events.TestFunctionExecuted, undefined, "TestFunctionExecuted wasn't triggered");
|
||||
assert.equal(
|
||||
tx3.events.TestFunctionExecuted.returnValues.minApprovalsByManagementKeys.toString(10),
|
||||
1,
|
||||
Identity.address + " wasn't updated to last version");
|
||||
|
||||
*/
|
||||
})
|
||||
|
||||
|
||||
});
|
||||
|
||||
|
|
392
test/identity.js
392
test/identity.js
|
@ -1,97 +1,107 @@
|
|||
|
||||
const assert = require('assert');
|
||||
const Embark = require('embark');
|
||||
let EmbarkSpec = Embark.initTests();
|
||||
let web3 = EmbarkSpec.web3;
|
||||
const TestUtils = require("../utils/testUtils.js");
|
||||
const web3EthAbi = require("web3-eth-abi");
|
||||
const idUtils = require('../utils/identityUtils.js');
|
||||
|
||||
const Identity = artifacts.require("./identity/Identity.sol");
|
||||
const TestContract = artifacts.require("./test/TestContract.sol");
|
||||
describe("Identity", function() {
|
||||
this.timeout(0);
|
||||
|
||||
contract('Identity', function(accounts) {
|
||||
let accounts;
|
||||
|
||||
let identity;
|
||||
beforeEach( function(done) {
|
||||
this.timeout(0);
|
||||
|
||||
EmbarkSpec = Embark.initTests();
|
||||
web3 = EmbarkSpec.web3;
|
||||
|
||||
beforeEach(async () => {
|
||||
identity = await Identity.new({from: accounts[0]})
|
||||
})
|
||||
EmbarkSpec.deployAll({
|
||||
"Identity": {},
|
||||
"TestContract": {}
|
||||
}, (_accounts) => {
|
||||
accounts = _accounts;
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
describe("Identity()", () => {
|
||||
it("initialize with msg.sender as management key", async () => {
|
||||
assert.equal(
|
||||
await identity.getKeyPurpose(TestUtils.addressToBytes32(accounts[0])),
|
||||
await Identity.methods.getKeyPurpose(TestUtils.addressToBytes32(accounts[0])).call(),
|
||||
idUtils.purposes.MANAGEMENT,
|
||||
identity.address + ".getKeyPurpose("+accounts[0]+") is not MANAGEMENT_KEY")
|
||||
Identity.address + ".getKeyPurpose("+accounts[0]+") is not MANAGEMENT_KEY");
|
||||
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
describe("addKey(address _key, uint256 _type)", () => {
|
||||
it("MANAGEMENT_KEY add a new address as ACTION_KEY", async () => {
|
||||
await identity.execute(
|
||||
identity.address,
|
||||
await Identity.methods.execute(
|
||||
Identity.address,
|
||||
0,
|
||||
idUtils.encode.addKey(accounts[1], idUtils.purposes.ACTION, idUtils.types.ADDRESS),
|
||||
{from: accounts[0]}
|
||||
);
|
||||
idUtils.encode.addKey(accounts[1], idUtils.purposes.ACTION, idUtils.types.ADDRESS)
|
||||
).send({from: accounts[0]});
|
||||
|
||||
assert.equal(
|
||||
await identity.getKeyPurpose(TestUtils.addressToBytes32(accounts[1])),
|
||||
await Identity.methods.getKeyPurpose(TestUtils.addressToBytes32(accounts[1])).call(),
|
||||
idUtils.purposes.ACTION,
|
||||
identity.address+".getKeyPurpose("+accounts[1]+") is not ACTION_KEY")
|
||||
Identity.address+".getKeyPurpose("+accounts[1]+") is not ACTION_KEY");
|
||||
});
|
||||
|
||||
it("should not add key by non manager", async () => {
|
||||
try {
|
||||
await identity.execute(
|
||||
identity.address,
|
||||
await Identity.methods.execute(
|
||||
Identity.address,
|
||||
0,
|
||||
idUtils.encode.addKey(accounts[1], idUtils.purposes.MANAGEMENT, idUtils.types.ADDRESS),
|
||||
{from: accounts[2]}
|
||||
);
|
||||
idUtils.encode.addKey(accounts[1], idUtils.purposes.MANAGEMENT, idUtils.types.ADDRESS))
|
||||
.send({from: accounts[2]});
|
||||
assert.fail('should have reverted before');
|
||||
} catch(error) {
|
||||
TestUtils.assertJump(error);
|
||||
}
|
||||
|
||||
assert.equal(
|
||||
await identity.getKeyPurpose(TestUtils.addressToBytes32(accounts[1])),
|
||||
await Identity.methods.getKeyPurpose(TestUtils.addressToBytes32(accounts[1])).call(),
|
||||
idUtils.purposes.NONE,
|
||||
identity.address+".getKeyPurpose("+accounts[1]+") is not correct")
|
||||
Identity.address+".getKeyPurpose("+accounts[1]+") is not correct");
|
||||
|
||||
});
|
||||
|
||||
it("should not add key type 1 by actor", async () => {
|
||||
await identity.execute(
|
||||
identity.address,
|
||||
await Identity.methods.execute(
|
||||
Identity.address,
|
||||
0,
|
||||
idUtils.encode.addKey(accounts[2], idUtils.purposes.ACTION, idUtils.types.ADDRESS),
|
||||
{from: accounts[0]}
|
||||
);
|
||||
idUtils.encode.addKey(accounts[2], idUtils.purposes.ACTION, idUtils.types.ADDRESS))
|
||||
.send({from: accounts[0]});
|
||||
|
||||
try {
|
||||
await identity.execute(
|
||||
identity.address,
|
||||
await Identity.methods.execute(
|
||||
Identity.address,
|
||||
0,
|
||||
idUtils.encode.addKey(accounts[1], idUtils.purposes.MANAGEMENT, idUtils.types.ADDRESS),
|
||||
{from: accounts[2]}
|
||||
);
|
||||
idUtils.encode.addKey(accounts[1], idUtils.purposes.MANAGEMENT, idUtils.types.ADDRESS))
|
||||
.send({from: accounts[2]});
|
||||
assert.fail('should have reverted before');
|
||||
} catch(error) {
|
||||
TestUtils.assertJump(error);
|
||||
}
|
||||
|
||||
assert.equal(
|
||||
await identity.getKeyPurpose(TestUtils.addressToBytes32(accounts[1])),
|
||||
await Identity.methods.getKeyPurpose(TestUtils.addressToBytes32(accounts[1])).call(),
|
||||
idUtils.purposes.NONE,
|
||||
identity.address+".getKeyType("+accounts[1]+") is not correct")
|
||||
Identity.address+".getKeyType("+accounts[1]+") is not correct");
|
||||
});
|
||||
|
||||
it("fire KeyAdded(address indexed key, uint256 indexed type)", async () => {
|
||||
await identity.execute(
|
||||
identity.address,
|
||||
let receipt = await Identity.methods.execute(
|
||||
Identity.address,
|
||||
0,
|
||||
idUtils.encode.addKey(accounts[1], idUtils.purposes.MANAGEMENT, idUtils.types.ADDRESS),
|
||||
{from: accounts[0]}
|
||||
);
|
||||
idUtils.encode.addKey(accounts[1], idUtils.purposes.MANAGEMENT, idUtils.types.ADDRESS))
|
||||
.send({from: accounts[0]});
|
||||
|
||||
const keyAdded = await TestUtils.listenForEvent(identity.KeyAdded())
|
||||
const keyAdded = TestUtils.eventValues(receipt, "KeyAdded");
|
||||
assert(keyAdded.key, TestUtils.addressToBytes32(accounts[1]), "Key is not correct")
|
||||
assert(keyAdded.keyType, idUtils.types.ADDRESS, "Type is not correct")
|
||||
});
|
||||
|
@ -100,115 +110,106 @@ contract('Identity', function(accounts) {
|
|||
|
||||
describe("removeKey(address _key, uint256 _type)", () => {
|
||||
it("MANAGEMENT_KEY should remove a key", async () => {
|
||||
await identity.execute(
|
||||
identity.address,
|
||||
await Identity.methods.execute(
|
||||
Identity.address,
|
||||
0,
|
||||
idUtils.encode.addKey(accounts[1], idUtils.purposes.MANAGEMENT, idUtils.types.ADDRESS),
|
||||
{from: accounts[0]}
|
||||
);
|
||||
idUtils.encode.addKey(accounts[1], idUtils.purposes.MANAGEMENT, idUtils.types.ADDRESS))
|
||||
.send({from: accounts[0]});
|
||||
|
||||
await identity.execute(
|
||||
identity.address,
|
||||
await Identity.methods.execute(
|
||||
Identity.address,
|
||||
0,
|
||||
idUtils.encode.removeKey(accounts[1], idUtils.purposes.MANAGEMENT),
|
||||
{from: accounts[0]}
|
||||
);
|
||||
idUtils.encode.removeKey(accounts[1], idUtils.purposes.MANAGEMENT))
|
||||
.send({from: accounts[0]});
|
||||
|
||||
assert.equal(
|
||||
await identity.getKeyPurpose(TestUtils.addressToBytes32(accounts[1])),
|
||||
await Identity.methods.getKeyPurpose(TestUtils.addressToBytes32(accounts[1])).call(),
|
||||
idUtils.purposes.NONE,
|
||||
identity.address+".getKeyPurpose("+accounts[1]+") is not 0")
|
||||
Identity.address+".getKeyPurpose("+accounts[1]+") is not 0")
|
||||
});
|
||||
|
||||
it("other key should not remove a key", async () => {
|
||||
await identity.execute(
|
||||
identity.address,
|
||||
await Identity.methods.execute(
|
||||
Identity.address,
|
||||
0,
|
||||
idUtils.encode.addKey(accounts[1], idUtils.purposes.MANAGEMENT, idUtils.types.ADDRESS),
|
||||
{from: accounts[0]}
|
||||
);
|
||||
idUtils.encode.addKey(accounts[1], idUtils.purposes.MANAGEMENT, idUtils.types.ADDRESS))
|
||||
.send({from: accounts[0]});
|
||||
|
||||
try {
|
||||
await identity.execute(
|
||||
identity.address,
|
||||
await Identity.methods.execute(
|
||||
Identity.address,
|
||||
0,
|
||||
idUtils.encode.removeKey(accounts[1], idUtils.purposes.MANAGEMENT),
|
||||
{from: accounts[2]}
|
||||
);
|
||||
idUtils.encode.removeKey(accounts[1], idUtils.purposes.MANAGEMENT))
|
||||
.send({from: accounts[2]});
|
||||
assert.fail('should have reverted before');
|
||||
} catch(error) {
|
||||
TestUtils.assertJump(error);
|
||||
}
|
||||
|
||||
assert.equal(
|
||||
await identity.getKeyPurpose(TestUtils.addressToBytes32(accounts[1])),
|
||||
await Identity.methods.getKeyPurpose(TestUtils.addressToBytes32(accounts[1])).call(),
|
||||
idUtils.purposes.MANAGEMENT,
|
||||
identity.address+".getKeyPurpose("+accounts[1]+") is not 0")
|
||||
Identity.address+".getKeyPurpose("+accounts[1]+") is not 0")
|
||||
});
|
||||
|
||||
it("actor key should not remove key", async () => {
|
||||
await identity.execute(
|
||||
identity.address,
|
||||
await Identity.methods.execute(
|
||||
Identity.address,
|
||||
0,
|
||||
idUtils.encode.addKey(accounts[1], idUtils.purposes.ACTION, idUtils.types.ADDRESS),
|
||||
{from: accounts[0]}
|
||||
);
|
||||
idUtils.encode.addKey(accounts[1], idUtils.purposes.ACTION, idUtils.types.ADDRESS))
|
||||
.send({from: accounts[0]});
|
||||
|
||||
await identity.execute(
|
||||
identity.address,
|
||||
await Identity.methods.execute(
|
||||
Identity.address,
|
||||
0,
|
||||
idUtils.encode.addKey(accounts[2], idUtils.purposes.ACTION, idUtils.types.ADDRESS),
|
||||
{from: accounts[0]}
|
||||
);
|
||||
idUtils.encode.addKey(accounts[2], idUtils.purposes.ACTION, idUtils.types.ADDRESS))
|
||||
.send({from: accounts[0]});
|
||||
|
||||
try {
|
||||
await identity.execute(
|
||||
identity.address,
|
||||
await Identity.methods.execute(
|
||||
Identity.address,
|
||||
0,
|
||||
idUtils.encode.removeKey(accounts[1], idUtils.purposes.ACTION),
|
||||
{from: accounts[2]}
|
||||
);
|
||||
idUtils.encode.removeKey(accounts[1], idUtils.purposes.ACTION))
|
||||
.send({from: accounts[2]});
|
||||
|
||||
assert.fail('should have reverted before');
|
||||
} catch(error) {
|
||||
TestUtils.assertJump(error);
|
||||
}
|
||||
|
||||
assert.equal(
|
||||
await identity.getKeyPurpose(TestUtils.addressToBytes32(accounts[1])),
|
||||
await Identity.methods.getKeyPurpose(TestUtils.addressToBytes32(accounts[1])).call(),
|
||||
idUtils.purposes.ACTION,
|
||||
identity.address+".getKeyType("+accounts[1]+") is not 0")
|
||||
Identity.address+".getKeyType("+accounts[1]+") is not 0")
|
||||
});
|
||||
|
||||
it("MANAGEMENT_KEY should not remove itself MANAGEMENT_KEY when there is no other MANAGEMENT_KEY", async () => {
|
||||
await identity.execute(
|
||||
identity.address,
|
||||
await Identity.methods.execute(
|
||||
Identity.address,
|
||||
0,
|
||||
idUtils.encode.removeKey(accounts[0], idUtils.purposes.MANAGEMENT),
|
||||
{from: accounts[0]}
|
||||
);
|
||||
idUtils.encode.removeKey(accounts[0], idUtils.purposes.MANAGEMENT))
|
||||
.send({from: accounts[0]});
|
||||
|
||||
assert.equal(
|
||||
await identity.getKeyPurpose(TestUtils.addressToBytes32(accounts[0])),
|
||||
await Identity.methods.getKeyPurpose(TestUtils.addressToBytes32(accounts[0])).call(),
|
||||
idUtils.purposes.MANAGEMENT,
|
||||
identity.address+".getKeyType("+accounts[0]+") is not 1")
|
||||
Identity.address+".getKeyType("+accounts[0]+") is not 1")
|
||||
});
|
||||
|
||||
it("fire KeyRemoved(address indexed key, uint256 indexed type)", async () => {
|
||||
await identity.execute(
|
||||
identity.address,
|
||||
await Identity.methods.execute(
|
||||
Identity.address,
|
||||
0,
|
||||
idUtils.encode.addKey(accounts[1], idUtils.purposes.ACTION, idUtils.types.ADDRESS),
|
||||
{from: accounts[0]}
|
||||
);
|
||||
idUtils.encode.addKey(accounts[1], idUtils.purposes.ACTION, idUtils.types.ADDRESS))
|
||||
.send({from: accounts[0]});
|
||||
|
||||
await identity.execute(
|
||||
identity.address,
|
||||
let receipt = await Identity.methods.execute(
|
||||
Identity.address,
|
||||
0,
|
||||
idUtils.encode.removeKey(accounts[1], idUtils.purposes.ACTION),
|
||||
{from: accounts[0]}
|
||||
);
|
||||
idUtils.encode.removeKey(accounts[1], idUtils.purposes.ACTION))
|
||||
.send({from: accounts[0]});
|
||||
|
||||
const keyRemoved = await TestUtils.listenForEvent(identity.KeyRemoved());
|
||||
const keyRemoved = TestUtils.eventValues(receipt, "KeyRemoved");
|
||||
assert(keyRemoved.key, TestUtils.addressToBytes32(accounts[1]), "Key is not correct");
|
||||
assert(keyRemoved.keyType, idUtils.types.ADDRESS, "Type is not correct");
|
||||
});
|
||||
|
@ -219,42 +220,40 @@ contract('Identity', function(accounts) {
|
|||
|
||||
it("should start only with initializer as only key", async () => {
|
||||
assert.equal(
|
||||
await identity.getKeyPurpose(TestUtils.addressToBytes32(accounts[0])),
|
||||
await Identity.methods.getKeyPurpose(TestUtils.addressToBytes32(accounts[0])).call(),
|
||||
idUtils.purposes.MANAGEMENT,
|
||||
identity.address+".getKeyPurpose("+accounts[0]+") is not correct")
|
||||
Identity.address+".getKeyPurpose("+accounts[0]+") is not correct")
|
||||
|
||||
assert.equal(
|
||||
await identity.getKeyPurpose(TestUtils.addressToBytes32(accounts[1])),
|
||||
await Identity.methods.getKeyPurpose(TestUtils.addressToBytes32(accounts[1])).call(),
|
||||
idUtils.purposes.NONE,
|
||||
identity.address+".getKeyPurpose("+accounts[1]+") is not correct")
|
||||
Identity.address+".getKeyPurpose("+accounts[1]+") is not correct")
|
||||
});
|
||||
|
||||
it("should get type 2 after addKey type 2", async () => {
|
||||
await identity.execute(
|
||||
identity.address,
|
||||
await Identity.methods.execute(
|
||||
Identity.address,
|
||||
0,
|
||||
idUtils.encode.addKey(accounts[1], idUtils.purposes.ACTION, idUtils.types.ADDRESS),
|
||||
{from: accounts[0]}
|
||||
);
|
||||
idUtils.encode.addKey(accounts[1], idUtils.purposes.ACTION, idUtils.types.ADDRESS))
|
||||
.send({from: accounts[0]});
|
||||
|
||||
assert.equal(
|
||||
await identity.getKeyPurpose(TestUtils.addressToBytes32(accounts[1])),
|
||||
await Identity.methods.getKeyPurpose(TestUtils.addressToBytes32(accounts[1])).call(),
|
||||
idUtils.purposes.ACTION,
|
||||
identity.address+".getKeyPurpose("+accounts[1]+") is not correct")
|
||||
Identity.address+".getKeyPurpose("+accounts[1]+") is not correct")
|
||||
});
|
||||
|
||||
it("should get type 3 after addKey type 3", async () => {
|
||||
await identity.execute(
|
||||
identity.address,
|
||||
await Identity.methods.execute(
|
||||
Identity.address,
|
||||
0,
|
||||
idUtils.encode.addKey(accounts[1], idUtils.purposes.CLAIM_SIGNER, idUtils.types.ADDRESS),
|
||||
{from: accounts[0]}
|
||||
);
|
||||
idUtils.encode.addKey(accounts[1], idUtils.purposes.CLAIM_SIGNER, idUtils.types.ADDRESS))
|
||||
.send({from: accounts[0]});
|
||||
|
||||
assert.equal(
|
||||
await identity.getKeyPurpose(TestUtils.addressToBytes32(accounts[1])),
|
||||
await Identity.methods.getKeyPurpose(TestUtils.addressToBytes32(accounts[1])).call(),
|
||||
idUtils.purposes.CLAIM_SIGNER,
|
||||
identity.address+".getKeyPurpose("+accounts[1]+") is not correct")
|
||||
Identity.address+".getKeyPurpose("+accounts[1]+") is not correct")
|
||||
});
|
||||
|
||||
});
|
||||
|
@ -274,63 +273,60 @@ contract('Identity', function(accounts) {
|
|||
|
||||
});
|
||||
});
|
||||
*/
|
||||
|
||||
*/
|
||||
|
||||
describe("execute(address _to, uint256 _value, bytes _data)", () => {
|
||||
let testContractInstance;
|
||||
let functionPayload;
|
||||
|
||||
it("Identity should receive ether", async() => {
|
||||
|
||||
const amountToSend = web3.toWei(0.05, "ether");
|
||||
const amountToSend = web3.utils.toWei('0.05', "ether");
|
||||
|
||||
let idBalance0 = web3.eth.getBalance(identity.address);
|
||||
let idBalance0 = await web3.eth.getBalance(Identity.address);
|
||||
|
||||
await web3.eth.sendTransaction({from:accounts[0], to:identity.address, value: amountToSend})
|
||||
await web3.eth.sendTransaction({from:accounts[0], to:Identity.address, value: amountToSend})
|
||||
|
||||
let idBalance1 = web3.eth.getBalance(identity.address);
|
||||
let idBalance1 = await web3.eth.getBalance(Identity.address);
|
||||
|
||||
assert.equal(idBalance0.toNumber() + amountToSend, idBalance1.toNumber(), identity.address + " did not receive ether");
|
||||
assert.equal(web3.utils.toBN(idBalance0).add(web3.utils.toBN(amountToSend)).toString(), web3.utils.toBN(idBalance1).toString(), Identity.address + " did not receive ether");
|
||||
});
|
||||
|
||||
it("ACTOR_KEY execute arbitrary transaction", async () => {
|
||||
await identity.execute(
|
||||
identity.address,
|
||||
await Identity.methods.execute(
|
||||
Identity.address,
|
||||
0,
|
||||
idUtils.encode.addKey(accounts[1], idUtils.purposes.ACTION, idUtils.types.ADDRESS),
|
||||
{from: accounts[0]}
|
||||
);
|
||||
idUtils.encode.addKey(accounts[1], idUtils.purposes.ACTION, idUtils.types.ADDRESS))
|
||||
.send({from: accounts[0]});
|
||||
|
||||
testContractInstance = await TestContract.new({from: accounts[0]});
|
||||
|
||||
functionPayload = web3EthAbi.encodeFunctionCall({
|
||||
|
||||
functionPayload = web3.eth.abi.encodeFunctionCall({
|
||||
name: 'test',
|
||||
type: 'function',
|
||||
inputs: []
|
||||
}, []);
|
||||
|
||||
await identity.execute(
|
||||
testContractInstance.address,
|
||||
let receipt = await Identity.methods.execute(
|
||||
TestContract.address,
|
||||
0,
|
||||
functionPayload,
|
||||
{from: accounts[1]}
|
||||
);
|
||||
|
||||
assert.notEqual(
|
||||
await TestUtils.listenForEvent(testContractInstance.TestFunctionExecuted()),
|
||||
functionPayload)
|
||||
.send({from: accounts[1]});
|
||||
|
||||
// @rramos - Commented because of error:
|
||||
// The current provider doesn't support subscriptions: Provider
|
||||
/*assert.notEqual(
|
||||
await TestUtils.listenForEvent(TestContract.events.TestFunctionExecuted),
|
||||
undefined,
|
||||
"Test function was not executed");
|
||||
"Test function was not executed"); */
|
||||
|
||||
});
|
||||
|
||||
it("MANAGEMENT_KEY cannot execute arbitrary transaction", async () => {
|
||||
try {
|
||||
await identity.execute(
|
||||
testContractInstance.address,
|
||||
await Identity.methods.execute(
|
||||
TestContract.address,
|
||||
0,
|
||||
functionPayload,
|
||||
{from: accounts[0]}
|
||||
);
|
||||
functionPayload)
|
||||
.send({from: accounts[0]});
|
||||
} catch(error) {
|
||||
TestUtils.assertJump(error);
|
||||
}
|
||||
|
@ -338,12 +334,11 @@ contract('Identity', function(accounts) {
|
|||
|
||||
it("Other keys NOT execute arbitrary transaction", async () => {
|
||||
try {
|
||||
await identity.execute(
|
||||
testContractInstance.address,
|
||||
await Identity.methods.execute(
|
||||
TestContract.address,
|
||||
0,
|
||||
functionPayload,
|
||||
{from: accounts[3]}
|
||||
);
|
||||
functionPayload)
|
||||
.send({from: accounts[3]});
|
||||
assert.fail('should have reverted before');
|
||||
} catch(error) {
|
||||
TestUtils.assertJump(error);
|
||||
|
@ -352,82 +347,74 @@ contract('Identity', function(accounts) {
|
|||
|
||||
|
||||
it("ACTION_KEY should send ether from contract", async () => {
|
||||
await identity.execute(
|
||||
identity.address,
|
||||
await Identity.methods.execute(
|
||||
Identity.address,
|
||||
0,
|
||||
idUtils.encode.addKey(accounts[1], idUtils.purposes.ACTION, idUtils.types.ADDRESS),
|
||||
{from: accounts[0]}
|
||||
);
|
||||
idUtils.encode.addKey(accounts[1], idUtils.purposes.ACTION, idUtils.types.ADDRESS))
|
||||
.send({from: accounts[0]});
|
||||
|
||||
// Adding funds to contract
|
||||
await web3.eth.sendTransaction({from:accounts[0], to:identity.address, value: web3.toWei(0.05, "ether")})
|
||||
await web3.eth.sendTransaction({from:accounts[0], to:Identity.address, value: web3.utils.toWei('0.05', "ether")})
|
||||
|
||||
const amountToSend = web3.toWei(0.01, "ether");
|
||||
const amountToSend = web3.utils.toWei('0.01', "ether");
|
||||
|
||||
let idBalance0 = web3.eth.getBalance(identity.address);
|
||||
let a2Balance0 = web3.eth.getBalance(accounts[2]);
|
||||
let idBalance0 = await web3.eth.getBalance(Identity.address);
|
||||
let a2Balance0 = await web3.eth.getBalance(accounts[2]);
|
||||
|
||||
await identity.execute(
|
||||
await Identity.methods.execute(
|
||||
accounts[2],
|
||||
amountToSend,
|
||||
'',
|
||||
{from: accounts[1]}
|
||||
);
|
||||
'0x')
|
||||
.send({from: accounts[1]});
|
||||
|
||||
let idBalance1 = web3.eth.getBalance(identity.address);
|
||||
let a2Balance1 = web3.eth.getBalance(accounts[2]);
|
||||
let idBalance1 = await web3.eth.getBalance(Identity.address);
|
||||
let a2Balance1 = await web3.eth.getBalance(accounts[2]);
|
||||
|
||||
assert(idBalance1.toNumber, idBalance0.toNumber - amountToSend, "Contract did not send ether");
|
||||
assert(a2Balance1.toNumber, a2Balance0.toNumber + amountToSend, accounts[2] + " did not receive ether");
|
||||
assert(web3.utils.toBN(idBalance1).toString(), web3.utils.toBN(idBalance0).sub(web3.utils.toBN(amountToSend)).toString(), "Contract did not send ether");
|
||||
assert(web3.utils.toBN(a2Balance1).toString(), web3.utils.toBN(a2Balance0).add(web3.utils.toBN(amountToSend)).toString(), accounts[2] + " did not receive ether");
|
||||
});
|
||||
|
||||
it("fire ExecutionRequested(uint256 indexed executionId, address indexed to, uint256 indexed value, bytes data)", async () => {
|
||||
await identity.execute(
|
||||
identity.address,
|
||||
await Identity.methods.execute(
|
||||
Identity.address,
|
||||
0,
|
||||
idUtils.encode.addKey(accounts[1], idUtils.purposes.ACTION, idUtils.types.ADDRESS),
|
||||
{from: accounts[0]}
|
||||
);
|
||||
idUtils.encode.addKey(accounts[1], idUtils.purposes.ACTION, idUtils.types.ADDRESS))
|
||||
.send({from: accounts[0]});
|
||||
|
||||
await identity.execute(
|
||||
testContractInstance.address,
|
||||
let receipt = await Identity.methods.execute(
|
||||
TestContract.address,
|
||||
0,
|
||||
functionPayload,
|
||||
{from: accounts[1]}
|
||||
);
|
||||
|
||||
const executionRequested = await TestUtils.listenForEvent(identity.ExecutionRequested());
|
||||
assert(executionRequested.to, testContractInstance.address, "To is not correct");
|
||||
functionPayload)
|
||||
.send({from: accounts[1]});
|
||||
|
||||
const executionRequested = TestUtils.eventValues(receipt, "ExecutionRequested");
|
||||
assert(executionRequested.to, TestContract.address, "To is not correct");
|
||||
assert(executionRequested.value, 0, "Value is not correct");
|
||||
assert(executionRequested.data, functionPayload, "Data is not correct");
|
||||
});
|
||||
|
||||
it("fire Executed(uint256 indexed executionId, address indexed to, uint256 indexed value, bytes data)", async () => {
|
||||
await identity.execute(
|
||||
identity.address,
|
||||
await Identity.methods.execute(
|
||||
Identity.address,
|
||||
0,
|
||||
idUtils.encode.addKey(accounts[1], idUtils.purposes.ACTION, idUtils.types.ADDRESS),
|
||||
{from: accounts[0]}
|
||||
);
|
||||
idUtils.encode.addKey(accounts[1], idUtils.purposes.ACTION, idUtils.types.ADDRESS))
|
||||
.send({from: accounts[0]});
|
||||
|
||||
await identity.execute(
|
||||
testContractInstance.address,
|
||||
let receipt = await Identity.methods.execute(
|
||||
TestContract.address,
|
||||
0,
|
||||
functionPayload,
|
||||
{from: accounts[1]}
|
||||
);
|
||||
functionPayload)
|
||||
.send({from: accounts[1]});
|
||||
|
||||
const executed = await TestUtils.listenForEvent(identity.Executed());
|
||||
assert(executed.to, testContractInstance.address, "To is not correct");
|
||||
const executed = TestUtils.eventValues(receipt, "Executed")
|
||||
assert(executed.to, TestContract.address, "To is not correct");
|
||||
assert(executed.value, 0, "Value is not correct");
|
||||
assert(executed.data, functionPayload, "Data is not correct");
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
|
||||
/*
|
||||
|
||||
/*
|
||||
describe("setMinimumApprovalsByKeyPurpose(uint256 _type, uint8 _minimumApprovals)", () => {
|
||||
it("MANAGEMENT_KEY should set minimum approvals for MANAGEMENT_KEYs", async () => {
|
||||
|
||||
|
@ -501,5 +488,10 @@ contract('Identity', function(accounts) {
|
|||
|
||||
});
|
||||
});
|
||||
*/
|
||||
*/
|
||||
|
||||
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -1,3 +1,6 @@
|
|||
/*
|
||||
COMMENTED TEMPORARLY WHILE PROJECT IS MIGRATED TO EMBARK - @rramos
|
||||
|
||||
const TestUtils = require("../utils/testUtils.js")
|
||||
var ethUtils = require('ethereumjs-util')
|
||||
|
||||
|
@ -62,3 +65,4 @@ contract('Identity - Extended Functionality', function(accounts) {
|
|||
|
||||
|
||||
});
|
||||
*/
|
|
@ -117,7 +117,6 @@ const _managerReset = function(address){
|
|||
}, [address]);
|
||||
}
|
||||
|
||||
|
||||
const _updateUpdatableInstance = function(address){
|
||||
if(!/^(0x)?[0-9a-f]{0,40}$/i.test(address))
|
||||
throw new Error('Address "'+ address +'" is not a valid Ethereum address.');
|
||||
|
|
Loading…
Reference in New Issue