diff --git a/contracts/communication/MessageTribute.sol b/contracts/communication/MessageTribute.sol index e865b91..78fa5e5 100644 --- a/contracts/communication/MessageTribute.sol +++ b/contracts/communication/MessageTribute.sol @@ -32,6 +32,7 @@ contract MessageTribute { uint256 blockNum; uint256 timestamp; Fee fee; + bytes32 hashedSecret; } mapping(address => mapping(address => Audience)) audienceRequested; @@ -63,8 +64,8 @@ contract MessageTribute { } } - function isFriend(address _friend) public view returns(bool) { - return friendIndex[keccak256(_friend, msg.sender)] > 0; + function areFriends(address sourceAccount, address accountToCheck) public view returns(bool) { + return friendIndex[keccak256(sourceAccount, accountToCheck)] > 0; } function setRequiredTribute(address _to, uint _amount, bool _isTribute, bool _isPermanent) public { @@ -101,7 +102,7 @@ contract MessageTribute { event AudienceCancelled(address indexed from, address indexed to); event AudienceGranted(address indexed from, address indexed to, bool approve); - function requestAudience(address _from) + function requestAudience(address _from, bytes32 hashedSecret) public { Fee memory f = getFee(_from); @@ -109,7 +110,7 @@ contract MessageTribute { require(audienceRequested[_from][msg.sender].blockNum == 0); AudienceRequested(_from, msg.sender); - audienceRequested[_from][msg.sender] = Audience(block.number, now, f); + audienceRequested[_from][msg.sender] = Audience(block.number, now, f, hashedSecret); balances[msg.sender] -= f.amount; } @@ -126,11 +127,13 @@ contract MessageTribute { delete audienceRequested[_from][msg.sender]; } - function grantAudience(address _to, bool _approve) public { + function grantAudience(address _to, bool _approve, bytes32 secret) public { Audience storage aud = audienceRequested[msg.sender][_to]; require(aud.blockNum > 0); + + require(aud.hashedSecret == keccak256(msg.sender, _to, _approve, secret)); AudienceGranted(msg.sender, _to, _approve); @@ -138,6 +141,7 @@ contract MessageTribute { uint256 amount = aud.fee.amount; delete audienceRequested[msg.sender][_to]; + clearFee(msg.sender, _to); if (isTribute) { diff --git a/test/messageTribute.js b/test/messageTribute.js index e44b50d..4937b77 100644 --- a/test/messageTribute.js +++ b/test/messageTribute.js @@ -1,8 +1,15 @@ const TestUtils = require("../utils/testUtils.js"); +const MessageTributeUtils = require("../utils/messageTributeUtils.js"); +const identityJson = require('../dist/contracts/Identity.json'); +const idUtils = require('../utils/identityUtils.js'); describe('MessageTribute', function() { + let identityFactory; + let identity; let accounts; + let identities = []; + let idInstances = []; let SNT; this.timeout(0); @@ -11,6 +18,10 @@ describe('MessageTribute', function() { this.timeout(0); EmbarkSpec.deployAll({ + "IdentityFactory": { + args: ["0xaaaa"], + gas: 5000000 + }, "MiniMeTokenFactory": {}, "MiniMeToken": { "args": [ @@ -26,22 +37,46 @@ describe('MessageTribute', function() { "MessageTribute": { "args": ["$MiniMeToken"] } - }, (_accounts) => { + }, async (_accounts) => { accounts = _accounts; - SNT = MiniMeToken; + SNT = MiniMeToken; - Promise.all([ - SNT.methods.generateTokens(accounts[0], 5000).send(), - SNT.methods.generateTokens(accounts[1], 5000).send(), - SNT.methods.generateTokens(accounts[2], 5000).send(), - SNT.methods.generateTokens(accounts[3], 5000).send(), - SNT.methods.generateTokens(accounts[4], 5000).send(), - SNT.methods.generateTokens(accounts[5], 5000).send(), - SNT.methods.generateTokens(accounts[6], 5000).send(), - SNT.methods.generateTokens(accounts[7], 5000).send(), - SNT.methods.generateTokens(accounts[8], 5000).send(), - SNT.methods.generateTokens(accounts[9], 5000).send() + identities[0] = new web3.eth.Contract(identityJson.abi, (await IdentityFactory.methods.createIdentity().send({from: accounts[0]})).events.IdentityCreated.returnValues.instance, {from: accounts[0]}); + /* identities[1] = new web3.eth.Contract(identityJson.abi, (await IdentityFactory.methods.createIdentity().send({from: accounts[1]})).events.IdentityCreated.returnValues.instance); + identities[2] = new web3.eth.Contract(identityJson.abi, (await IdentityFactory.methods.createIdentity().send({from: accounts[2]})).events.IdentityCreated.returnValues.instance); + identities[3] = new web3.eth.Contract(identityJson.abi, (await IdentityFactory.methods.createIdentity().send({from: accounts[3]})).events.IdentityCreated.returnValues.instance); + identities[4] = new web3.eth.Contract(identityJson.abi, (await IdentityFactory.methods.createIdentity().send({from: accounts[4]})).events.IdentityCreated.returnValues.instance); + identities[5] = new web3.eth.Contract(identityJson.abi, (await IdentityFactory.methods.createIdentity().send({from: accounts[5]})).events.IdentityCreated.returnValues.instance); + identities[6] = new web3.eth.Contract(identityJson.abi, (await IdentityFactory.methods.createIdentity().send({from: accounts[6]})).events.IdentityCreated.returnValues.instance); + identities[7] = new web3.eth.Contract(identityJson.abi, (await IdentityFactory.methods.createIdentity().send({from: accounts[7]})).events.IdentityCreated.returnValues.instance); + identities[8] = new web3.eth.Contract(identityJson.abi, (await IdentityFactory.methods.createIdentity().send({from: accounts[8]})).events.IdentityCreated.returnValues.instance); + identities[9] = new web3.eth.Contract(identityJson.abi, (await IdentityFactory.methods.createIdentity().send({from: accounts[9]})).events.IdentityCreated.returnValues.instance); +*/ + +try { + await identities[0].methods.execute(identities[0].options.address, 0, idUtils.encode.addKey(accounts[2], idUtils.purposes.ACTION, idUtils.types.ADDRESS)).send({from: accounts[0]}) + + +} catch(Er){ + console.log(Er); +} + + + + Promise.all([ + // identities[1].methods.execute(identities[1].options.address, 0, idUtils.encode.addKey(accounts[1], idUtils.purposes.ACTION, idUtils.types.ADDRESS)).send({from: accounts[1]}), + + SNT.methods.generateTokens(identities[0].options.address, 5000).send(), + SNT.methods.generateTokens(identities[1].options.address, 5000).send(), + SNT.methods.generateTokens(identities[2].options.address, 5000).send(), + SNT.methods.generateTokens(identities[3].options.address, 5000).send(), + SNT.methods.generateTokens(identities[4].options.address, 5000).send(), + SNT.methods.generateTokens(identities[5].options.address, 5000).send(), + SNT.methods.generateTokens(identities[6].options.address, 5000).send(), + SNT.methods.generateTokens(identities[7].options.address, 5000).send(), + SNT.methods.generateTokens(identities[8].options.address, 5000).send(), + SNT.methods.generateTokens(identities[9].options.address, 5000).send() ]) .then(() => { console.log(" - Added balances"); @@ -51,33 +86,56 @@ describe('MessageTribute', function() { }); it("Adding friends", async () => { + + /* let tx = await identities[0].methods.execute( + MessageTribute.options.address, + 0, + MessageTributeUtils.encode.addFriends([accounts[1], accounts[2]]) + ).send({from: accounts[0]}); +console.log(tx); +*/ await MessageTribute.methods.addFriends([accounts[1], accounts[2]]).send({from: accounts[0]}); await MessageTribute.methods.addFriends([accounts[3]]).send({from: accounts[1]}); await MessageTribute.methods.addFriends([accounts[4]]).send({from: accounts[1]}); await MessageTribute.methods.addFriends([accounts[5]]).send({from: accounts[1]}); assert.equal( - await MessageTribute.methods.isFriend(accounts[1]).call({from: accounts[0]}), + await MessageTribute.methods.areFriends(identities[0].options.address, identities[1].options.address).call(), true, - accounts[1] + " must be a friend of " + accounts[0]); + identities[1].options.address + " must be a friend of " + identities[0].options.address); assert.equal( - await MessageTribute.methods.isFriend(accounts[3]).call({from: accounts[1]}), + await MessageTribute.methods.areFriends(identities[1].options.address, identities[3].options.address).call(), true, - accounts[3] + " must be a friend of " + accounts[1]); + identities[3].options.address + " must be a friend of " + identities[1].options.address); assert.equal( - await MessageTribute.methods.isFriend(accounts[4]).call({from: accounts[0]}), + await MessageTribute.methods.areFriends(identities[0].options.address, identities[4].options.address).call(), false, - accounts[4] + " must not be a friend of " + accounts[0]); + identities[4].options.address + " must not be a friend of " + identities[0].options.address); assert.equal( - await MessageTribute.methods.isFriend(accounts[2]).call({from: accounts[1]}), + await MessageTribute.methods.areFriends(identities[1].options.address, identities[2].options.address).call(), false, - accounts[2] + " must not be a friend of " + accounts[1]); + identities[2].options.address + " must not be a friend of " + identities[1].options.address); }); + + + + + + + + + + + + + + + it("Removing friends", async () => { await MessageTribute.methods.removeFriends([accounts[3]]).send({from: accounts[1]});