From 0d60ab925658568211a5c504937a7a61782b7110 Mon Sep 17 00:00:00 2001 From: C-note Date: Mon, 30 Dec 2019 11:20:29 +0100 Subject: [PATCH 1/4] Issue encountered After deployment, function failed to assign accumulated point to rated member. Suggested Solution Replace with just in function addMember, whiteListMember, blackListMember, isWhiteListed. Replace with just in function rateMember Pending/brainstorming Issue When an admin/owner rates a member, the accumulated point issued is 1 not 3. --- contract.sol | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/contract.sol b/contract.sol index 95ec7b8..044db87 100644 --- a/contract.sol +++ b/contract.sol @@ -47,36 +47,30 @@ contract TokenReward { function AddMember(address __member, string memory __memberName) public OnlyAdminOrOwner returns(bool) { - Member memory __memberStruct; - __memberStruct.name = __memberName; - __memberStruct.isWhitelisted = true; - members[__member] = __memberStruct; - + members[__member].name = __memberName; + members[__member].isWhitelisted = true; + emit NewMember(__memberName); return true; } function whiteListMember(address __member) public OnlyAdminOrOwner returns(bool) { - Member memory memberStruct = members[__member]; - memberStruct.isWhitelisted = true; + members[__member].isWhitelisted = true; return true; } function blackListMember(address __member) public OnlyAdminOrOwner returns(bool) { - Member memory memberStruct = members[__member]; - memberStruct.isWhitelisted = false; + members[__member].isWhitelisted = false; return true; } function isWhitelisted(address __member) view internal returns(bool) { - Member memory memberStruct = members[__member]; - return memberStruct.isWhitelisted; + return members[__member].isWhitelisted; } function rateMember(address __membertorate) public IsWhitelisted(__membertorate) returns(bool) { - Member memory __memberStruct = members[__membertorate]; uint8 ratingPoint; require(admins[msg.sender] || isWhitelisted(msg.sender), "You're not qualified to rate any member"); if (admins[msg.sender]) { @@ -87,11 +81,11 @@ contract TokenReward { } else { ratingPoint = 1; } - __memberStruct.accumulatedPoints = __memberStruct.accumulatedPoints + ratingPoint; + members[__membertorate].accumulatedPoints = members[__membertorate].accumulatedPoints + ratingPoint; - (uint8 __memberPoint, uint8 __starRating) = calculateReward(__memberStruct.accumulatedPoints, __memberStruct.rating); - __memberStruct.accumulatedPoints = __memberPoint; - __memberStruct.rating = __starRating; + (uint8 __memberPoint, uint8 __starRating) = calculateReward( members[__membertorate].accumulatedPoints, members[__membertorate].rating); + members[__membertorate].accumulatedPoints = __memberPoint; + members[__membertorate].rating = __starRating; emit NewRating(msg.sender, __membertorate, ratingPoint); return true; From 664af20c9d1c638b7f7f7255d3789919a79f6904 Mon Sep 17 00:00:00 2001 From: C-note Date: Mon, 30 Dec 2019 16:50:56 +0100 Subject: [PATCH 2/4] added else if to function rateMember --- contract.sol | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/contract.sol b/contract.sol index 044db87..a997208 100644 --- a/contract.sol +++ b/contract.sol @@ -1,6 +1,5 @@ pragma solidity >=0.5.0 < 0.6.0; contract TokenReward { - struct Member { uint8 rating; string name; @@ -30,8 +29,7 @@ contract TokenReward { } modifier IsWhitelisted(address __member) { - Member memory memberStruct = members[__member]; - require(memberStruct.isWhitelisted == true, "This address is not whitelisted"); + require(members[__member].isWhitelisted == true, "This address is not whitelisted"); _; } @@ -49,34 +47,36 @@ contract TokenReward { function AddMember(address __member, string memory __memberName) public OnlyAdminOrOwner returns(bool) { members[__member].name = __memberName; members[__member].isWhitelisted = true; - + + emit NewMember(__memberName); return true; } function whiteListMember(address __member) public OnlyAdminOrOwner returns(bool) { - members[__member].isWhitelisted = true; + members[__member].isWhitelisted = true; return true; } function blackListMember(address __member) public OnlyAdminOrOwner returns(bool) { - members[__member].isWhitelisted = false; + members[__member].isWhitelisted = false; return true; } function isWhitelisted(address __member) view internal returns(bool) { - return members[__member].isWhitelisted; + return members[__member].isWhitelisted; } - function rateMember(address __membertorate) public IsWhitelisted(__membertorate) returns(bool) { + function rateMember(address __membertorate) public returns(bool) { uint8 ratingPoint; require(admins[msg.sender] || isWhitelisted(msg.sender), "You're not qualified to rate any member"); + if (admins[msg.sender]) { - ratingPoint = 3; + ratingPoint = 3; } - if (members[__membertorate].rating == 5) { + else if (members[__membertorate].rating == 5) { ratingPoint = 2; } else { ratingPoint = 1; @@ -99,7 +99,7 @@ contract TokenReward { } function calculateReward(uint8 __pointsScored, uint8 __starRating) pure internal returns(uint8, uint8) { - if (__pointsScored < 10 ) { + if (__pointsScored < 15 ) { return (__pointsScored, __starRating); } uint8 __pointremained = __pointsScored % uint8(15); @@ -110,8 +110,4 @@ contract TokenReward { return (__pointremained, __starRating ); } -} - - - - +} \ No newline at end of file From 072dbb435d78de2d505ba0894a5bea77a8f88c3c Mon Sep 17 00:00:00 2001 From: C-note Date: Fri, 3 Jan 2020 10:50:52 +0100 Subject: [PATCH 3/4] Added ERC, ExternalStorage file, and MemberId --- ExternalStorage.sol | 16 +++++++ contract.sol | 102 ++++++++++++++++++++++++++++++-------------- 2 files changed, 86 insertions(+), 32 deletions(-) create mode 100644 ExternalStorage.sol diff --git a/ExternalStorage.sol b/ExternalStorage.sol new file mode 100644 index 0000000..9665b08 --- /dev/null +++ b/ExternalStorage.sol @@ -0,0 +1,16 @@ +pragma solidity >=0.5.0 < 0.6.0; + +contract ExternalStorage { + + mapping(address => Member) public members; + mapping(address => bool ) public admins; + mapping(address => uint ) public balanceOf; + + struct Member { + string name; + bool isWhitelisted; + uint8 rating; + uint8 accumulatedPoints; + uint memberId; + } +} \ No newline at end of file diff --git a/contract.sol b/contract.sol index a997208..dc0528d 100644 --- a/contract.sol +++ b/contract.sol @@ -1,22 +1,34 @@ + pragma solidity >=0.5.0 < 0.6.0; -contract TokenReward { - struct Member { - uint8 rating; - string name; - bool isWhitelisted; - uint8 accumulatedPoints; - } + +import "./ExternalStorage.sol"; + +contract TokenReward is ExternalStorage { - address owner; - mapping(address => Member) public members; - mapping(address => uint ) public reward; - mapping(address => bool ) public admins; - mapping(address => uint ) public balances; + string public symbol = "5ND"; + string public tokenName = "500NgDev"; + string public standard = "500NgDev Token v1.0"; + + uint private membersIds = 0; - event NewMember(string _name); + uint public tokenTotalSupply; + + + event NewMember(string _name, uint tagId); event Blacklisted(address indexed _member, string _name); - event NewReward(address indexed _member, uint reward); + event CNewMemeberReward(address indexed __memberToReward, uint _toId, uint _value); + event CNewMemRewardFromMem(address indexed _from, uint _fromId, address indexed _to, uint _toId, uint _value); event NewRating(address indexed _ratedBy, address indexed _memberRated, uint rating); + event Transfer(address _from, address _to, uint _memberId); + + address owner; + + constructor(uint256 _initialSupply) public { + owner = msg.sender; + admins[msg.sender] = true; + balanceOf[msg.sender] = _initialSupply; + tokenTotalSupply = _initialSupply; + } modifier OnlyOwner() { require(msg.sender == owner, "Only contract owner is allowed to call this function"); @@ -32,24 +44,21 @@ contract TokenReward { require(members[__member].isWhitelisted == true, "This address is not whitelisted"); _; } - - constructor () public { - owner = msg.sender; - admins[msg.sender] = true; - } - + function addAdmin(address __newAdmin) public OnlyOwner returns(bool) { admins[__newAdmin] = true; return true; } - function AddMember(address __member, string memory __memberName) public OnlyAdminOrOwner returns(bool) { members[__member].name = __memberName; members[__member].isWhitelisted = true; + membersIds += 1; - - emit NewMember(__memberName); + members[__member].memberId = membersIds; + uint tagId = membersIds; + + emit NewMember(__memberName, tagId); return true; } @@ -68,8 +77,8 @@ contract TokenReward { function isWhitelisted(address __member) view internal returns(bool) { return members[__member].isWhitelisted; } - - function rateMember(address __membertorate) public returns(bool) { + + function rateMember(address __membertorate) public IsWhitelisted(__membertorate) returns(bool) { uint8 ratingPoint; require(admins[msg.sender] || isWhitelisted(msg.sender), "You're not qualified to rate any member"); @@ -81,6 +90,7 @@ contract TokenReward { } else { ratingPoint = 1; } + members[__membertorate].accumulatedPoints = members[__membertorate].accumulatedPoints + ratingPoint; (uint8 __memberPoint, uint8 __starRating) = calculateReward( members[__membertorate].accumulatedPoints, members[__membertorate].rating); @@ -91,11 +101,8 @@ contract TokenReward { return true; } - function rewardMember(address __memberToReward) public OnlyAdminOrOwner returns(bool) { - require(admins[__memberToReward] == false, "admins cannot be rewarded tokens"); - require(members[__memberToReward].rating >= 3, "member do not have a proven track record"); - balances[__memberToReward] = balances[__memberToReward] + 2; - return true; + function rewardMember() internal view OnlyAdminOrOwner returns(bool) { + return true; } function calculateReward(uint8 __pointsScored, uint8 __starRating) pure internal returns(uint8, uint8) { @@ -107,7 +114,38 @@ contract TokenReward { uint8 currentStarRating = __starRating + uint8(1); return (__pointremained, currentStarRating); } - return (__pointremained, __starRating - ); + return (__pointremained, __starRating); + } + + function memberToRewardMember(address _from, address _to) internal view IsWhitelisted(_from) returns(bool) { + require(isWhitelisted(msg.sender)); + require(_to != address(this)); + } + + function cRewardMember(address __memberToReward, uint _memberId, uint256 _value) public payable OnlyAdminOrOwner returns (bool success) { + require(_value != uint256(0)); + require(admins[__memberToReward] == false, "admins cannot be rewarded tokens"); + //require(members[__memberToReward].rating >= 3, "member do not have a proven track record"); + require(members[__memberToReward].memberId == _memberId); + balanceOf[__memberToReward] = balanceOf[__memberToReward] + _value; + balanceOf[msg.sender] = balanceOf[msg.sender] - _value; + + emit CNewMemeberReward( __memberToReward, _memberId, _value); + return true; + } + + function cMemberToRewardMember(address _from, uint _fromId, address _to, uint _toId, uint256 _value) public payable IsWhitelisted(_from) IsWhitelisted(_to) returns (bool success) { + require(_value != uint256(0)); + require(isWhitelisted(msg.sender)); + require(members[_to].rating >= 1, "member must have up to 1 rating"); + require(members[_from].memberId == _fromId); + require(members[_to].memberId == _toId); + require(balanceOf[_from] >= _value); + balanceOf[_from] = balanceOf[_from] - _value; + balanceOf[_to] = balanceOf[_to] + _value; + + emit CNewMemRewardFromMem( _from, _fromId, _to, _toId, _value); + return true; } + } \ No newline at end of file From 4361cdc936ed536ef065afcb8ded0bd0312150ba Mon Sep 17 00:00:00 2001 From: C-note Date: Sat, 4 Jan 2020 07:12:16 +0100 Subject: [PATCH 4/4] removed // --- contract.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contract.sol b/contract.sol index dc0528d..ce5b151 100644 --- a/contract.sol +++ b/contract.sol @@ -125,7 +125,7 @@ contract TokenReward is ExternalStorage { function cRewardMember(address __memberToReward, uint _memberId, uint256 _value) public payable OnlyAdminOrOwner returns (bool success) { require(_value != uint256(0)); require(admins[__memberToReward] == false, "admins cannot be rewarded tokens"); - //require(members[__memberToReward].rating >= 3, "member do not have a proven track record"); + require(members[__memberToReward].rating >= 3, "member do not have a proven track record"); require(members[__memberToReward].memberId == _memberId); balanceOf[__memberToReward] = balanceOf[__memberToReward] + _value; balanceOf[msg.sender] = balanceOf[msg.sender] - _value;