Compare commits

...

3 Commits

Author SHA1 Message Date
e207b779b8
fix: set indexed address to filter 2023-06-12 20:19:43 +08:00
260568d62d
fix: fix simplify repay() function 2023-06-12 20:19:28 +08:00
c7a26f1a7e
fix something about contracts 2023-06-09 22:16:36 +08:00
2 changed files with 41 additions and 45 deletions

View File

@ -11,7 +11,7 @@ struct Order {
contract Bank { contract Bank {
using Counters for Counters.Counter; using Counters for Counters.Counter;
Counters.Counter private id_counter; // Counters.Counter private id_counter;
SoulboundToken public sbt; SoulboundToken public sbt;
address public owner; address public owner;
@ -55,47 +55,42 @@ contract Bank {
require(target == number, "This is not your SBT number."); require(target == number, "This is not your SBT number.");
require(sbt_number[msg.sender] == 0, "You have registered."); require(sbt_number[msg.sender] == 0, "You have registered.");
sbt_number[msg.sender] = target; sbt_number[msg.sender] = target;
credits[msg.sender] = 1000000000000000000;
} }
function pay(address shop, uint amount) public onlyClient { function pay(uint id, address shop, uint amount) public onlyClient {
require(amount <= (credits[msg.sender]-arrears[msg.sender]), "You don't have enough credit."); require(amount <= (credits[msg.sender]-arrears[msg.sender]), "You don't have enough credit.");
id_counter.increment(); // id_counter.increment();
uint id = id_counter.current(); // uint id = id_counter.current();
arrears[msg.sender] += amount; arrears[msg.sender] += amount;
order_info[id] = Order(false, amount, shop); order_info[id] = Order(false, amount, shop);
client_orders[msg.sender].push(id); client_orders[msg.sender].push(id);
payable(shop).transfer(amount); payable(shop).transfer(amount);
sbt.logBorrowing(msg.sender, id, amount); sbt.logBorrowing(msg.sender, shop, id, amount);
} }
function repay() public payable onlyClient returns (uint, uint) { function repay() public payable onlyClient {
require(recv, "It's not the time to repay."); require(recv, "It's not the time to repay.");
uint value = msg.value; uint value = msg.value;
uint repay_amount = 0; // uint repay_amount = 0;
uint should_pay; uint should_pay = 0;
uint refund; // uint refund;
uint item_counter = 0; // uint item_counter = 0;
for (uint i=0; i<client_orders[msg.sender].length; i++) { for (uint i=0; i<client_orders[msg.sender].length; i++) {
should_pay = order_info[client_orders[msg.sender][i]].amount; should_pay += order_info[client_orders[msg.sender][i]].amount;
if ((value - repay_amount) >= should_pay){
repay_amount += should_pay;
order_info[client_orders[msg.sender][i]].isFinished = true;
sbt.logRepaying(msg.sender, client_orders[msg.sender][i], should_pay);
} else {
client_orders[msg.sender][item_counter] = client_orders[msg.sender][i];
item_counter += 1;
}
} }
for(uint i=0; i<(client_orders[msg.sender].length-item_counter); i++){ require(value>=should_pay, "You dont have enough ETH to repay");
client_orders[msg.sender].pop(); for (uint i=0; i<client_orders[msg.sender].length; i++) {
order_info[client_orders[msg.sender][i]].isFinished = true;
sbt.logRepaying(msg.sender, client_orders[msg.sender][i], should_pay);
} }
refund = value - repay_amount; client_orders[msg.sender] = new uint[](0);
arrears[msg.sender] -= repay_amount; arrears[msg.sender] = 0;
if (refund != 0){ }
payable(msg.sender).transfer(refund);
} function warning(address client) public onlyBank {
return (client_orders[msg.sender].length, refund); sbt.logWarning(client);
} }
function start_recv() public onlyBank { function start_recv() public onlyBank {
@ -110,15 +105,19 @@ contract Bank {
return credits[client]; return credits[client];
} }
function getArrear(address client) public view onlySelfOrBank(client) return (uint) { function getArrear(address client) public view onlySelfOrBank(client) returns (uint) {
return arrears[client]; return arrears[client];
} }
function getClientOrders(address client) public view onlySelfOrBank(client) returns (Order[] memory){ function getClientOrders(address client) public view onlySelfOrBank(client) returns (uint[] memory){
Order[] memory orders = new Order[]( client_orders[client].length ); // Order[] memory orders = new Order[]( client_orders[client].length );
for(uint i=0; i<client_orders[client].length; i++){ // for(uint i=0; i<client_orders[client].length; i++){
orders[i] = order_info[client_orders[client][i]]; // orders[i] = order_info[client_orders[client][i]];
} // }
return orders; return client_orders[client];
}
function getSBTNumber(address client) public view onlySelfOrBank(client) returns (uint) {
return sbt_number[client];
} }
} }

View File

@ -19,13 +19,13 @@ contract SoulboundToken is ERC721, Ownable {
mapping(address => Certificate[]) private certificates; mapping(address => Certificate[]) private certificates;
mapping(address => uint) private address_to_number; mapping(address => uint) private address_to_number;
event Borrow(address client, address bank, uint id, uint amount); event Borrow(address indexed client, address indexed shop, address indexed bank, uint id, uint amount);
event Repay(address client, address bank, uint id, uint amount); event Repay(address indexed client, address indexed bank, uint id, uint amount);
event Warning(address client, address bank); event Warning(address indexed client, address indexed bank);
constructor() ERC721("Credit System Soulbound Token", "CS_SBT") {} constructor() ERC721("Credit System Soulbound Token", "CS_SBT") {}
function mint(address player) public onlyOwner returns (uint256) { function mint(address player) public returns (uint256) {
_tokenIds.increment(); _tokenIds.increment();
uint256 newItemId = _tokenIds.current(); uint256 newItemId = _tokenIds.current();
_mint(player, newItemId); _mint(player, newItemId);
@ -72,11 +72,9 @@ contract SoulboundToken is ERC721, Ownable {
require(isReliableBank[msg.sender] == true, "Only bank can access this function"); require(isReliableBank[msg.sender] == true, "Only bank can access this function");
_; _;
} }
event HERE(address);
modifier onlySelfOrBank(address addr) { modifier onlySelfOrBank(address addr) {
emit HERE(addr); require(isReliableBank[msg.sender] == true || (msg.sender == addr), "Only the owner can access this function.");
require((msg.sender == owner()) || (msg.sender == addr), "Only the owner can access this function.");
_; _;
} }
@ -93,8 +91,8 @@ contract SoulboundToken is ERC721, Ownable {
isReliableBank[bank] = false; isReliableBank[bank] = false;
} }
function logBorrowing(address client, uint id, uint amount) public onlyBank { function logBorrowing(address client, address shop, uint id, uint amount) public onlyBank {
emit Borrow(client, msg.sender, id, amount); emit Borrow(client, shop, msg.sender, id, amount);
} }
function logRepaying(address client, uint id, uint amount) public onlyBank { function logRepaying(address client, uint id, uint amount) public onlyBank {
@ -113,8 +111,7 @@ contract SoulboundToken is ERC721, Ownable {
return certificates[client]; return certificates[client];
} }
function getAccountNumber(address client) public onlySelfOrBank(client) returns (uint) { function getAccountNumber(address client) public view onlySelfOrBank(client) returns (uint) {
return address_to_number[client]; return address_to_number[client];
} }
} }