// SPDX-License-Identifier: MIT pragma solidity ^0.6.11; pragma abicoder v2; contract LoyaltyExchange{ //company balances are stored in finney. uint constant welcome_bonus = .01 ether; string[] private temp_users; struct User{ string name; address user_wallet; string email; uint balance; } mapping(address => User) private users; address[] public userAddresses; //User struct uses the mapping methodology to be linked with address of users. struct Company{ string company_name; address company_wallet; } mapping(address => Company) private companies; address[] public companyAddresses; struct CashbackLog{ uint amount; address receiver; address sender; string cashback_id; } mapping(string => CashbackLog) private cashbackLogs; string[] public cashbakLogIds; //Includes .01 ether welcome bonus //individual registering minimum cost is 0.1 ether. function userRegister(string memory _name, string memory _email) public payable{ require(!isRegisteredUser()); require(msg.value >= 0.1 ether); users[msg.sender].name = _name; //set user name users[msg.sender].user_wallet = msg.sender; users[msg.sender].email = _email; users[msg.sender].balance = msg.value; users[msg.sender].balance += welcome_bonus; userAddresses.push(msg.sender); } //company registering minimum cost is 0.5 ether function companyRegister(string memory _companyName) public payable{ require(!isRegisteredCompany()); require(msg.value >= 0.5 ether); companies[msg.sender].company_name = _companyName; companies[msg.sender].company_wallet = msg.sender; companyAddresses.push(msg.sender); } //cashback from company wallet to user wallet. (virtually) //receiver is user, sender is company function createCashback(address receiverAddress) public payable{ require(isRegisteredCompany()); require(msg.value > 0); users[receiverAddress].balance += msg.value; } //cashAmount(finney) //cashback from company wallet to user wallet. (virtually) function spendPoints(uint cashAmount, address receiverAddress) public payable{ require(isRegisteredUser()); if (users[msg.sender].balance >= cashAmount ){ //address comp_address = receiverAddress; uint index = 0; for( uint i=0;i<companyAddresses.length;i++ ){ if(companyAddresses[i] == receiverAddress ){ index = i; } } users[receiverAddress].balance -= cashAmount; payable(companyAddresses[index]).transfer(cashAmount); } } //allows user to get loyalty points to registered address ( %50 percent of balanceremains)(commission) function cashIn() public payable{ require(isRegisteredUser()); uint index = 0; for( uint i=0;i<userAddresses.length;i++ ){ if(userAddresses[i] == msg.sender ){ index = i; } } payable(userAddresses[index]).transfer(users[msg.sender].balance / 2); users[msg.sender].balance = 0; } //it allows some user to send a partion of their loyalty points to another user. function transferToUser(address receiver, uint amount) public { require(isRegisteredUser()); if ( users[msg.sender].balance >= amount){ users[msg.sender].balance -= amount; users[receiver].balance += amount; } } //check if the current user is registered one. function isRegisteredUser() private view returns(bool){ for( uint i=0; i<userAddresses.length;i++ ){ if( userAddresses[i] == msg.sender ) { return true; } } return false; } //check if the current user is registered one. function isRegisteredCompany() private view returns(bool){ for( uint k=0; k<companyAddresses.length;k++ ){ if( companyAddresses[k] == msg.sender ) { return true; } } return false; } function getMyBalance() public view returns(uint){ require(isRegisteredUser()); return users[msg.sender].balance; } }
0.6.11