// SPDX-License-Identifier: GPL-3.0-or-later
// This file is part of the http://github.com/aaronbloomfield/ccc repoistory,
// and is released under the GPL 3.0 license.
pragma solidity ^0.8.24;
contract Debts {
// holds in the necessary information about each alias / entry
struct Entry {
uint id; // the index in the 'entries' mapping
string thealias; // their string alias
string name; // their string name
address addr; // their account address
int balance; // how much they owe (if negative) or are owed (if positive)
}
// allow notification when a debt is entered
event paidEvent();
// allow notification when an alias is entered
event aliasAddedEvent();
// holds all the alias entry structs from above
mapping (uint => Entry) public entries;
// holds true if that account address has an entry in 'entries'
mapping (address => bool) public addressHasEntry;
// holds true if that alias has an entry in 'entries'
mapping (string => bool) public aliasHasEntry;
// given an alias, this will give the index into the 'entries' array for that alias
mapping (string => uint) public findByAlias;
// given an account address, this will give the index into the 'entries' array for that account address
mapping (address => uint) public findByAddress;
// how many alias exist in the 'entries' mapping
uint public num_entries;
constructor() {
}
function addAlias (string memory _alias, string memory _name) public {
// ensure that the alias name does not already exist
require(!aliasHasEntry[_alias], "string entry name already exists");
// ensure that the sender doesn't already have an alias
require(!addressHasEntry[msg.sender], "your address already has an alias");
// add an entry in the mapping of whether that string alias exists
aliasHasEntry[_alias] = true;
// add an entry in the mapping of whether a given account address has an alias
addressHasEntry[msg.sender] = true;
// add an entry in the mapping from alias strings to alias indices
findByAlias[_alias] = num_entries;
// add an entry in the mapping from account addresses to alias indices
findByAddress[msg.sender] = num_entries;
// add the alias entry itself
entries[num_entries] = Entry(num_entries,_alias,_name,msg.sender,0);
// increment the number of aliases so far
num_entries++;
// emit the event
emit aliasAddedEvent();
}
function payToAlias (string memory _alias, int amount) public {
// limit amounts from -100 to +100
require (amount >= -100 && amount <= 100, "Amounts must be between -100 and 100");
// amount cannot be zero
require (amount != 0, "amount cannot be zero");
// ensure that the caller has an alias
require(addressHasEntry[msg.sender], "your address does not have an alias");
// ensure that the 'to' has an alias entry
require(aliasHasEntry[_alias], "string entry name does not exist");
// get the alias index of who it's from, as we know they already exist
uint from = findByAddress[msg.sender];
// get who it's to as we know they already exist
uint to = findByAlias[_alias];
// one cannot enter a debt to themselves
require(entries[to].addr!=msg.sender, "you cannot enter a debt to yourself");
// adjust amounts on both ends
entries[from].balance += amount;
entries[to].balance -= amount;
// emit the event
emit paidEvent();
}
}