Address Contract Partially Verified
Address
0xaBFbF345dD103993c2524D9c5F3260845e372f2F
Balance
0 ETH
Nonce
1
Code Size
3819 bytes
Creator
0x3FcB35a1...cB28 at tx 0x619d7f50...697fc6
Last Active
Indexed Transactions
8 (24,217,128 → 24,314,679)
Gas Used (indexed)
602,971
Contract Bytecode
3819 bytes
0x608060405234801561001057600080fd5b50600436106100935760003560e01c80635aa6e675116100665780635aa6e6751461011e57806370a082311461013c578063c5f956af1461016c578063e6a69ab81461018a578063eb820312146101a857610093565b806319a18528146100985780632e1a7d4d146100b457806338d52e0f146100d0578063505bd3da146100ee575b600080fd5b6100b260048036038101906100ad9190610904565b6101da565b005b6100ce60048036038101906100c99190610957565b6103ca565b005b6100d861060b565b6040516100e591906109e3565b60405180910390f35b610108600480360381019061010391906109fe565b61062f565b6040516101159190610a3a565b60405180910390f35b610126610647565b6040516101339190610a64565b60405180910390f35b610156600480360381019061015191906109fe565b61066b565b6040516101639190610a3a565b60405180910390f35b610174610780565b6040516101819190610a64565b60405180910390f35b6101926107a4565b60405161019f9190610a3a565b60405180910390f35b6101c260048036038101906101bd91906109fe565b6107ac565b6040516101d193929190610a7f565b60405180910390f35b6101e3836107d6565b7f000000000000000000000000926df14a23be491164dcf93f4c468a50ef659d5b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610271576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161026890610b39565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036102e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102d790610bcb565b60405180910390fd5b428110156102ec574290505b60405180606001604052804281526020016301e133808461030d9190610c49565b8152602001828152506000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010155604082015181600201559050508273ffffffffffffffffffffffffffffffffffffffff167f28b64f730251697cc9ca7319e7f1ee458be4a53b280e027589d19fdbb03defdc83836040516103bd929190610c7a565b60405180910390a2505050565b6103d3336107d6565b600081600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541161046057600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610462565b815b905080600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546104b39190610ca3565b925050819055507f000000000000000000000000865377367054516e17014ccded1e7d814edc9ce473ffffffffffffffffffffffffffffffffffffffff166323b872dd7f000000000000000000000000926df14a23be491164dcf93f4c468a50ef659d5b33846040518463ffffffff1660e01b815260040161053793929190610cd7565b6020604051808303816000875af1158015610556573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061057a9190610d46565b6105b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105b090610de5565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167f058b581e2433b8b02263f5b0e5c2889fcb7b3495112884a3147619038fba46d8826040516105ff9190610a3a565b60405180910390a25050565b7f000000000000000000000000865377367054516e17014ccded1e7d814edc9ce481565b60016020528060005260406000206000915090505481565b7f000000000000000000000000926df14a23be491164dcf93f4c468a50ef659d5b81565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180606001604052908160008201548152602001600182015481526020016002820154815250509050600081604001514210610731578160400151610733565b425b9050600081836000015110610748578161074e565b82600001515b9050808261075c9190610ca3565b836020015161076b9190610e05565b846107769190610e5f565b9350505050919050565b7f000000000000000000000000926df14a23be491164dcf93f4c468a50ef659d5b81565b6301e1338081565b60006020528060005260406000206000915090508060000154908060010154908060020154905083565b6107df8161066b565b600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550426000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018190555050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061089b82610870565b9050919050565b6108ab81610890565b81146108b657600080fd5b50565b6000813590506108c8816108a2565b92915050565b6000819050919050565b6108e1816108ce565b81146108ec57600080fd5b50565b6000813590506108fe816108d8565b92915050565b60008060006060848603121561091d5761091c61086b565b5b600061092b868287016108b9565b935050602061093c868287016108ef565b925050604061094d868287016108ef565b9150509250925092565b60006020828403121561096d5761096c61086b565b5b600061097b848285016108ef565b91505092915050565b6000819050919050565b60006109a96109a461099f84610870565b610984565b610870565b9050919050565b60006109bb8261098e565b9050919050565b60006109cd826109b0565b9050919050565b6109dd816109c2565b82525050565b60006020820190506109f860008301846109d4565b92915050565b600060208284031215610a1457610a1361086b565b5b6000610a22848285016108b9565b91505092915050565b610a34816108ce565b82525050565b6000602082019050610a4f6000830184610a2b565b92915050565b610a5e81610890565b82525050565b6000602082019050610a796000830184610a55565b92915050565b6000606082019050610a946000830186610a2b565b610aa16020830185610a2b565b610aae6040830184610a2b565b949350505050565b600082825260208201905092915050565b7f506179726f6c6c3a3a736574526563697069656e743a206f6e6c7920676f766560008201527f726e616e63650000000000000000000000000000000000000000000000000000602082015250565b6000610b23602683610ab6565b9150610b2e82610ac7565b604082019050919050565b60006020820190508181036000830152610b5281610b16565b9050919050565b7f506179726f6c6c3a3a736574526563697069656e743a207a65726f206164647260008201527f6573732100000000000000000000000000000000000000000000000000000000602082015250565b6000610bb5602483610ab6565b9150610bc082610b59565b604082019050919050565b60006020820190508181036000830152610be481610ba8565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610c54826108ce565b9150610c5f836108ce565b925082610c6f57610c6e610beb565b5b828204905092915050565b6000604082019050610c8f6000830185610a2b565b610c9c6020830184610a2b565b9392505050565b6000610cae826108ce565b9150610cb9836108ce565b925082821015610ccc57610ccb610c1a565b5b828203905092915050565b6000606082019050610cec6000830186610a55565b610cf96020830185610a55565b610d066040830184610a2b565b949350505050565b60008115159050919050565b610d2381610d0e565b8114610d2e57600080fd5b50565b600081519050610d4081610d1a565b92915050565b600060208284031215610d5c57610d5b61086b565b5b6000610d6a84828501610d31565b91505092915050565b7f506179726f6c6c3a3a77697468647261773a207472616e73666572206661696c60008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b6000610dcf602283610ab6565b9150610dda82610d73565b604082019050919050565b60006020820190508181036000830152610dfe81610dc2565b9050919050565b6000610e10826108ce565b9150610e1b836108ce565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610e5457610e53610c1a565b5b828202905092915050565b6000610e6a826108ce565b9150610e75836108ce565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115610eaa57610ea9610c1a565b5b82820190509291505056fea264697066735822122039371c4b6a736560335e876adaa55cf2cebf4282c5643c172965e9731aee97af64736f6c634300080d0033
Verified Source Code Partial Match
Compiler: v0.8.13+commit.abaa5c0e
EVM: london
Optimization: No
Payroll.sol 81 lines
pragma solidity 0.8.13;
interface IERC20 {
function transferFrom(address from, address to, uint256 amount) external returns (bool);
function decimals() external view returns (uint8);
}
// WARNING: THIS CONTRACT IS NOT COMPATIBLE WITH NON-STANDARD ERC20 TOKENS (e.g. USDT)
contract Payroll {
mapping(address => Recipient) public recipients;
mapping(address => uint256) public unclaimed;
address public immutable treasuryAddress;
address public immutable governance;
IERC20 public immutable asset;
uint256 public constant SECONDS_PER_YEAR = 365 days;
struct Recipient {
uint256 lastClaim;
uint256 ratePerSecond;
uint256 endTime;
}
event SetRecipient(address indexed recipient, uint256 amount, uint256 endTime);
event AmountWithdrawn(address indexed recipient, uint256 amount);
constructor(address _treasuryAddress, address _governance, address _asset) {
require(IERC20(_asset).decimals() == 18, "Payroll::constructor: asset must have 18 decimals");
treasuryAddress = _treasuryAddress;
governance = _governance;
asset = IERC20(_asset);
}
function balanceOf(address _recipient) public view returns (uint256 bal) {
bal = unclaimed[_recipient];
Recipient memory recipient = recipients[_recipient];
uint256 accrualEnd = block.timestamp < recipient.endTime ? block.timestamp : recipient.endTime;
uint256 accrualStart = recipient.lastClaim < accrualEnd ? recipient.lastClaim : accrualEnd;
bal += recipient.ratePerSecond * (accrualEnd - accrualStart);
}
function updateRecipient(address recipient) internal {
unclaimed[recipient] = balanceOf(recipient);
recipients[recipient].lastClaim = block.timestamp;
}
function setRecipient(address _recipient, uint256 _yearlyAmount, uint256 _endTime) external {
updateRecipient(_recipient);
require(msg.sender == governance, "Payroll::setRecipient: only governance");
require(_recipient != address(0), "Payroll::setRecipient: zero address!");
// endTime cannot be in the past
if(_endTime < block.timestamp) {
_endTime = block.timestamp;
}
recipients[_recipient] = Recipient({
lastClaim: block.timestamp,
ratePerSecond: _yearlyAmount / SECONDS_PER_YEAR,
endTime: _endTime
});
emit SetRecipient(_recipient, _yearlyAmount, _endTime);
}
/**
* @notice withdraw salary
*/
function withdraw(uint256 amount) external {
updateRecipient(msg.sender);
uint256 withdrawAmount = unclaimed[msg.sender] > amount ? amount : unclaimed[msg.sender];
unclaimed[msg.sender] -= withdrawAmount;
require(asset.transferFrom(treasuryAddress, msg.sender, withdrawAmount), "Payroll::withdraw: transfer failed");
emit AmountWithdrawn(msg.sender, withdrawAmount);
}
}
Read Contract
SECONDS_PER_YEAR 0xe6a69ab8 → uint256
asset 0x38d52e0f → address
balanceOf 0x70a08231 → uint256
governance 0x5aa6e675 → address
recipients 0xeb820312 → uint256, uint256, uint256
treasuryAddress 0xc5f956af → address
unclaimed 0x505bd3da → uint256
Write Contract 2 functions
These functions modify contract state and require a wallet transaction to execute.
setRecipient 0x19a18528
address _recipient
uint256 _yearlyAmount
uint256 _endTime
withdraw 0x2e1a7d4d
uint256 amount
Top Interactions
| Address | Txns | Sent | Received |
|---|---|---|---|
| 0xd01a2040...A38C | 3 | 3 | |
| 0x16EC2AeA...51cb | 2 | 2 | |
| 0x7ad367A6...B90b | 1 | 1 | |
| 0xE58ED128...9413 | 1 | 1 | |
| 0xFDa9365E...59CE | 1 | 1 |
Recent Transactions
|
| Hash | Block | Age | From/To | Value | |
|---|---|---|---|---|---|
| 0x721155ae...8d0059 | 24,314,679 | IN | 0xd01a2040...A38C | 0 ETH | |
| 0x12fcc159...ffa577 | 24,312,610 | IN | 0x16EC2AeA...51cb | 0 ETH | |
| 0xfba56131...2a1d9a | 24,312,119 | IN | 0x7ad367A6...B90b | 0 ETH | |
| 0x156a009b...57945b | 24,311,948 | IN | 0xFDa9365E...59CE | 0 ETH | |
| 0x2cc1f8ae...789eb4 | 24,242,596 | IN | 0xd01a2040...A38C | 0 ETH | |
| 0xed8ad454...c17f64 | 24,220,067 | IN | 0x16EC2AeA...51cb | 0 ETH | |
| 0xc05cbdc0...1fbae8 | 24,219,595 | IN | 0xE58ED128...9413 | 0 ETH | |
| 0x4139d201...b5a585 | 24,217,128 | IN | 0xd01a2040...A38C | 0 ETH |