pragma solidity ^0.4.24; import "./Token.sol"; contract QDoss is Token { constructor( string tokenName, string tokenSymbol ) public Token(tokenName, tokenSymbol) {} struct User{ string userName; uint rewardCardNumber; string tierLevel; uint tierExpiryDate; address userAccountAddress; bool exists; } mapping (string => User) userMapByName; mapping (uint => User) userMapByCardNumber; function registerUserProfile( string userName, uint rewardCardNumber, string tierLevel, uint tierExpiryDate, address userAccountAddress ) public onlyOwner { User memory user = User({ userName : userName, rewardCardNumber : rewardCardNumber, tierLevel : tierLevel, tierExpiryDate : tierExpiryDate, userAccountAddress : userAccountAddress, exists : true }); userMapByName[userName] = user; userMapByCardNumber[rewardCardNumber] = user; } function getRewardPointsByUserName(string userName) view public returns(uint) { require(userMapByName[userName].exists); address userAccountAddress = userMapByName[userName].userAccountAddress; return balanceOf[userAccountAddress]; } function getRewardPointsByCardNumber(uint cardNumber) view public returns(uint) { require(userMapByCardNumber[cardNumber].exists); address userAccountAddress = userMapByCardNumber[cardNumber].userAccountAddress; return balanceOf[userAccountAddress]; } function getUserTierLevelByUserName(string userName) view public returns(string) { require(userMapByName[userName].exists); return userMapByName[userName].tierLevel; } //tierLevel (calculated at controller layer) -- send null if no change function addUserPoints(string userName, uint rewardPoints, string tierLevel) public onlyOwner { require(userMapByName[userName].exists); address userAccountAddress = userMapByName[userName].userAccountAddress; mintToken(userAccountAddress, rewardPoints); int updateTier = compare(tierLevel,"null"); if(updateTier != 0){ uint rewardCardNumber = userMapByName[userName].rewardCardNumber; userMapByName[userName].tierLevel = tierLevel; userMapByCardNumber[rewardCardNumber].tierLevel = tierLevel; } } //scheduler -- yet to be done; new points and tierLevel at controller layer function reduceUserPoints(string userName, uint rewardPoints, string tierLevel) public onlyOwner { require(userMapByName[userName].exists); address userAccountAddress = userMapByName[userName].userAccountAddress; burnFrom(userAccountAddress, rewardPoints); int updateTier = compare(tierLevel,"null"); if(updateTier != 0){ uint rewardCardNumber = userMapByName[userName].rewardCardNumber; userMapByName[userName].tierLevel = tierLevel; userMapByCardNumber[rewardCardNumber].tierLevel = tierLevel; } } // Does a byte-by-byte lexicographical comparison of two strings. // @return a negative number if `_a` is smaller, zero if they are equal and a positive numbe if `_b` is smaller. function compare(string _a, string _b) private pure returns (int) { bytes memory a = bytes(_a); bytes memory b = bytes(_b); uint minLength = a.length; if (b.length < minLength) minLength = b.length; //@todo unroll the loop into increments of 32 and do full 32 byte comparisons for (uint i = 0; i < minLength; i ++) if (a[i] < b[i]) return -1; else if (a[i] > b[i]) return 1; if (a.length < b.length) return -1; else if (a.length > b.length) return 1; else return 0; } function getUserProfileByUserName(string userName) view public returns(string,uint,string,uint,address) { require(userMapByName[userName].exists); return (userMapByName[userName].userName, userMapByName[userName].rewardCardNumber, userMapByName[userName].tierLevel, userMapByName[userName].tierExpiryDate, userMapByName[userName].userAccountAddress); } }
0.4.18