Skip to content

Instantly share code, notes, and snippets.

@caseyjkey
Created May 8, 2020 00:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save caseyjkey/722d86667748abef695f83850274c99a to your computer and use it in GitHub Desktop.
Save caseyjkey/722d86667748abef695f83850274c99a to your computer and use it in GitHub Desktop.
Console Logging Member's Balance
pragma experimental ABIEncoderV2;
// Uncomment for console.log support
import "@nomiclabs/buidler/console.sol";
contract PaymentHub {
// Mapping for finding a user's groups
mapping (address => Group[]) public userToGroups;
mapping (address => int256) public userToBalance;
mapping (address => Member) public userToMember;
Group[] public groups; // The contract stores all groups, serves as a hub. Various groups will not interact with each other
string public memberName = string(userToMember[msg.sender].name);
struct Member {
string name;
int balance;
address addy;
bool nameSet;
}
struct Group {
string name;
Member[] friends;
uint256 id;
}
constructor() public {
// This data structure found at
// https://bit.ly/3azD3fx
createGroup("PayPals", "Creator");
createGroup("PaymentPals", "Creator");
Member memory member = Member("Cofounder", 200, address(0x6A46eF78714f530e995369B03BB9F471583D114D), false);
Member memory member2 = Member("Investor", 10000, address(0x2C10f237735e65e777D33348475000d9FAe0b7Dd), false);
addFriend(member, 0);
addFriend(member, 2); // For some reason PaymentPals is group 2, not 1?
addFriend(member2, 2);
}
function getName() view external returns(string memory){
Member memory member = userToMember[msg.sender];
return member.name;
}
function setName(string memory _name) public {
Member memory member = userToMember[msg.sender];
member.name = _name;
member.nameSet = true;
userToMember[msg.sender] = member;
}
function createGroup(string memory _groupName, string memory _groupOwnerName) public returns(uint) {
groups.length++;
Group storage group = groups[groups.length - 1];
Member memory member = Member(_groupOwnerName, 0, msg.sender, true);
userToMember[msg.sender] = member;
group.friends.push(member); // Add the first member, which is the creator
group.name = _groupName; // Manually set the group name
group.id = groups.length - 1;
userToGroups[msg.sender].push(group);
groups.push(group);
}
function getGroup(uint _gid) public view returns (uint) {
return groups[_gid].id;
}
// Mainly for testing, can be removed later
function getGroupSize() public view returns (uint) {
return groups.length;
}
// Mainly for testing, can be removed later
function friendInGroup(uint _gid, uint _fid) public view returns (Member memory) {
return groups[_gid].friends[_fid];
}
// Mainly for testing, can be removed later
function numFriendsInGroup(uint _gid) public view returns (uint) {
return groups[_gid].friends.length;
}
function addFriend(Member memory _newFriend, uint _groupID) public {
groups[_groupID].friends.push(_newFriend);
userToMember[_newFriend.addy] = _newFriend;
}
function payFriend(address payable _friend, uint _gid) external payable {
//_friend.transfer(msg.value);
int256 paymentEthers = int256(msg.value/1000000000000000000);
Member memory member = userToMember[msg.sender];
member.balance -= paymentEthers;
updateMember(member, _gid);
console.log(member.balance);
member = userToMember[_friend];
member.balance += paymentEthers;
updateMember(member, _gid);
console.log(member.balance);
}
function getNumUserGroups(address _add) public view returns (uint){
return userToGroups[_add].length;
}
function isNameSet() public view returns(bool){
Member memory member = userToMember[msg.sender];
return member.nameSet;
}
function updateMember(Member memory member, uint _gid) internal returns (bool) {
for (uint i = 0; i < groups[_gid].friends.length; i++) {
if(groups[_gid].friends[i].addy == member.addy) {
groups[_gid].friends[i] = member;
userToMember[member.addy] = member;
console.log("yo");
return true;
}
}
return false;
}
// consider renaming to payForFriends a
function transaction(address[] memory _payedFor, int[] memory _amounts, uint _gid) public {
int total = 0;
Member memory member;
for (uint i = 0; i < _payedFor.length; i++) {
member = userToMember[_payedFor[i]];
member.balance -= _amounts[i];
updateMember(member, _gid);
total += _amounts[i];
}
member = userToMember[msg.sender];
member.balance += total;
//console.log("Total being added to sender's balance", total);
//console.log("Sender:", member.name, member.balance);
bool result = updateMember(member, _gid);
//console.log("Result of updating member", result);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment