// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.24;
interface ChainlinkOracle {
function latestAnswer() external view returns (int256);
function decimals() external view returns (uint8);
}
contract PaymentsV2 {
address public deployer;
address public chainlinkETHFeed =
0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419;
bool public isDepositOpen;
mapping(string => uint256) public dollarDepositAmount;
event Deposit(
string depositor,
uint256 ethValue,
uint256 dollarValue,
uint256 timestamp
);
constructor() payable {
deployer = msg.sender;
}
function setChainlinkETHFeed(address _chainlinkETHFeed) external {
require(msg.sender == deployer, "No permission");
chainlinkETHFeed = _chainlinkETHFeed;
}
function deposit(string calldata _depositor) external payable {
require(isDepositOpen == true, "Deposit not open");
uint ethPrice = uint(ChainlinkOracle(chainlinkETHFeed).latestAnswer());
require(ethPrice > 0, "Invalid ETH price");
uint8 chainlinkPriceFeedDecimals = ChainlinkOracle(chainlinkETHFeed)
.decimals();
uint depositAmountETH = msg.value;
// Only 16 to keep Dollars in cents
uint depositAmountDollar = (depositAmountETH * ethPrice) /
(10 ** (16 + chainlinkPriceFeedDecimals));
dollarDepositAmount[_depositor] += depositAmountDollar;
emit Deposit(
_depositor,
depositAmountETH,
depositAmountDollar,
block.timestamp
);
}
function getUserTotalDeposit(
string calldata user
) external view returns (uint) {
return dollarDepositAmount[user];
}
//////////////////////////////////////////////////////////Admin Functions////////////////////////////////////////////////
function extractValue() external {
require(msg.sender == deployer, "No permission");
if (address(this).balance > 0) {
payable(deployer).transfer(address(this).balance);
}
}
function toggleDeposit(bool isOpen) external {
require(msg.sender == deployer, "No permission");
isDepositOpen = isOpen;
}
receive() external payable {}
}
{
"compilationTarget": {
"PaymentsV2.sol": "PaymentsV2"
},
"evmVersion": "shanghai",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"inputs":[],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"depositor","type":"string"},{"indexed":false,"internalType":"uint256","name":"ethValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"dollarValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Deposit","type":"event"},{"inputs":[],"name":"chainlinkETHFeed","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deployer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_depositor","type":"string"}],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"dollarDepositAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"extractValue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"user","type":"string"}],"name":"getUserTotalDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isDepositOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_chainlinkETHFeed","type":"address"}],"name":"setChainlinkETHFeed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isOpen","type":"bool"}],"name":"toggleDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]