编译器
0.8.20+commit.a1b79de6
文件 1 的 6:Context.sol
pragma solidity ^0.8.0;
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}
文件 2 的 6:IERC20.sol
pragma solidity ^0.8.0;
interface IERC20 {
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address to, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(address from, address to, uint256 amount) external returns (bool);
}
文件 3 的 6:IKCash.sol
pragma solidity ^0.8.12;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
interface IKCash is IERC20 {
struct Bucket {
uint256 reward1;
uint256 reward2;
uint256 reward3;
}
struct BucketSignature {
uint256 reward1;
uint256 reward2;
uint256 reward3;
}
struct AdminTransferSignature {
uint32 nonce;
address from;
address to;
BucketSignature deductionFromSender;
BucketSignature additionToRecipient;
bytes signature;
}
struct TransferFromReward3ToReward2Signature {
uint32 nonce;
address from;
address to;
uint256 amount;
bytes signature;
}
struct TransferFromReward3ToReward1Signature {
uint32 nonce;
address from;
address to;
uint256 amount;
bytes signature;
}
function initialize(address _owner, address _designatedSigner) external;
function decimals() external pure returns (uint8);
function mint(
address _to,
uint256 _amount,
Bucket calldata _bucket
) external;
function bulkMint(
address[] calldata accounts,
uint256[] calldata amounts,
Bucket[] calldata _bucket
) external;
function bulkApprove(
address[] calldata spenders,
uint256[] calldata amounts
) external returns (bool);
function bulkGrantRoles(bytes32 role, address[] calldata accounts) external;
function adminTransferWithSignature(
AdminTransferSignature calldata signature
) external;
function adminTransferWithSignatureBulk(
AdminTransferSignature[] calldata signatures
) external;
function adminTransfer(
address to,
Bucket calldata deductionFromSender,
Bucket calldata additionToRecipient
) external;
function adminTranferBulk(
address[] calldata to,
Bucket[] calldata deductionFromSender,
Bucket[] calldata additionToRecipient
) external;
function transferToReward3(address to, Bucket calldata _bucket) external;
function transferToReward3Bulk(
address[] calldata to,
Bucket[] calldata _bucket
) external;
function transferReward3ToReward3(address to, uint256 amount) external;
function transferReward3ToReward3Bulk(
address[] calldata to,
uint256[] calldata amounts
) external;
function transferFromReward3ToReward1(
TransferFromReward3ToReward1Signature calldata signature
) external;
function transferFromReward3ToReward1Bulk(
TransferFromReward3ToReward1Signature[] calldata signatures
) external;
function transferFromReward3ToReward2(
TransferFromReward3ToReward2Signature calldata signature
) external;
function transferFromReward3ToReward2Bulk(
TransferFromReward3ToReward2Signature[] calldata signatures
) external;
function transfer(address to, uint256 amount) external returns (bool);
function transferFrom(
address from,
address to,
uint256 amount
) external returns (bool);
function bulkTransfer(
address[] calldata accounts,
uint256[] calldata amounts
) external returns (bool);
function setDesignatedSigner(address _designatedSigner) external;
function getBalanceWithBucket(
address _address
) external view returns (uint256, Bucket memory);
function adminTransferFromReward3ToReward1(
address to,
uint256 amount
) external;
function adminTransferFromReward3ToReward1Bulk(
address[] calldata to,
uint256[] calldata amounts
) external;
function adminTransferFromReward3ToReward2(
address to,
uint256 amount
) external;
function adminTransferFromReward3ToReward2Bulk(
address[] calldata to,
uint256[] calldata amounts
) external;
function adminTransferFrom(
address from,
address to,
Bucket calldata bucket
) external;
function adminBurn(address from, uint256 amount, Bucket calldata _bucket) external;
function adminBurnFrom(
address account,
uint256 amount,
Bucket calldata _bucket
) external;
}
文件 4 的 6:KCashTreasury.sol
pragma solidity ^0.8.17;
import "@openzeppelin/contracts/access/Ownable2Step.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "./Interfaces/IKCash.sol";
contract KCashTreasury is Ownable2Step {
IKCash public kcash;
uint8 public treasuryType;
constructor(address _kcash, address _owner, uint8 _treasuryType) {
kcash = IKCash(_kcash);
treasuryType = _treasuryType;
_transferOwnership(_owner);
}
function updateKcash(address _kcash) external onlyOwner {
kcash = IKCash(_kcash);
}
function withdraw() external onlyOwner {
kcash.transfer(owner(), kcash.balanceOf(address(this)));
}
function addReward3(uint256 _amount) external onlyOwner {
kcash.adminTransferFrom(msg.sender, address(this), IKCash.Bucket(0,0,_amount));
}
function bulkDisburse(
address[] calldata _to,
uint256[] calldata _amounts
) external onlyOwner {
require(_to.length == _amounts.length, "Array length mismatch");
if (treasuryType == 1) {
kcash.adminTransferFromReward3ToReward1Bulk(_to, _amounts);
} else if (treasuryType == 2) {
kcash.adminTransferFromReward3ToReward2Bulk(_to, _amounts);
} else {
kcash.transferReward3ToReward3Bulk(_to, _amounts);
}
}
function setTreasuryType(uint8 _treasuryType) external onlyOwner {
treasuryType = _treasuryType;
}
}
文件 5 的 6:Ownable.sol
pragma solidity ^0.8.0;
import "../utils/Context.sol";
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor() {
_transferOwnership(_msgSender());
}
modifier onlyOwner() {
_checkOwner();
_;
}
function owner() public view virtual returns (address) {
return _owner;
}
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
文件 6 的 6:Ownable2Step.sol
pragma solidity ^0.8.0;
import "./Ownable.sol";
abstract contract Ownable2Step is Ownable {
address private _pendingOwner;
event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);
function pendingOwner() public view virtual returns (address) {
return _pendingOwner;
}
function transferOwnership(address newOwner) public virtual override onlyOwner {
_pendingOwner = newOwner;
emit OwnershipTransferStarted(owner(), newOwner);
}
function _transferOwnership(address newOwner) internal virtual override {
delete _pendingOwner;
super._transferOwnership(newOwner);
}
function acceptOwnership() public virtual {
address sender = _msgSender();
require(pendingOwner() == sender, "Ownable2Step: caller is not the new owner");
_transferOwnership(sender);
}
}
{
"compilationTarget": {
"contracts/KCashTreasury.sol": "KCashTreasury"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs",
"useLiteralContent": true
},
"optimizer": {
"enabled": true,
"runs": 1000
},
"remappings": []
}
[{"inputs":[{"internalType":"address","name":"_kcash","type":"address"},{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint8","name":"_treasuryType","type":"uint8"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"addReward3","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_to","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"bulkDisburse","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"kcash","outputs":[{"internalType":"contract IKCash","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_treasuryType","type":"uint8"}],"name":"setTreasuryType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryType","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_kcash","type":"address"}],"name":"updateKcash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]