Source Code
Latest 25 from a total of 271 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Sign | 40818585 | 5 hrs ago | IN | 0 ETH | 0.00000026 | ||||
| Sign | 40813400 | 7 hrs ago | IN | 0 ETH | 0.00000063 | ||||
| Sign | 40812067 | 8 hrs ago | IN | 0 ETH | 0.000001 | ||||
| Sign | 40809657 | 10 hrs ago | IN | 0 ETH | 0.00000283 | ||||
| Sign | 40800414 | 15 hrs ago | IN | 0 ETH | 0.00000096 | ||||
| Sign | 40799610 | 15 hrs ago | IN | 0 ETH | 0.00000084 | ||||
| Unstake | 40797712 | 16 hrs ago | IN | 0 ETH | 0.00000026 | ||||
| Unstake | 40797679 | 16 hrs ago | IN | 0 ETH | 0.00000026 | ||||
| Unstake | 40776870 | 28 hrs ago | IN | 0 ETH | 0.00000223 | ||||
| Unstake | 40776852 | 28 hrs ago | IN | 0 ETH | 0.00000206 | ||||
| Unstake | 40776836 | 28 hrs ago | IN | 0 ETH | 0.00000227 | ||||
| Unstake | 40776818 | 28 hrs ago | IN | 0 ETH | 0.00000287 | ||||
| Sign | 40776478 | 28 hrs ago | IN | 0 ETH | 0.00001313 | ||||
| Unstake | 40776398 | 28 hrs ago | IN | 0 ETH | 0.00000034 | ||||
| Sign | 40775910 | 28 hrs ago | IN | 0 ETH | 0.00000057 | ||||
| Sign | 40775900 | 28 hrs ago | IN | 0 ETH | 0.00000055 | ||||
| Sign | 40775887 | 28 hrs ago | IN | 0 ETH | 0.00000067 | ||||
| Sign | 40775859 | 28 hrs ago | IN | 0 ETH | 0.00000058 | ||||
| Unstake | 40774488 | 29 hrs ago | IN | 0 ETH | 0.00000025 | ||||
| Unstake | 40774484 | 29 hrs ago | IN | 0 ETH | 0.00000025 | ||||
| Unstake | 40774481 | 29 hrs ago | IN | 0 ETH | 0.00000025 | ||||
| Unstake | 40774306 | 29 hrs ago | IN | 0 ETH | 0.00000028 | ||||
| Unstake | 40774303 | 29 hrs ago | IN | 0 ETH | 0.00000028 | ||||
| Unstake | 40774296 | 29 hrs ago | IN | 0 ETH | 0.00000034 | ||||
| Unstake | 40774290 | 29 hrs ago | IN | 0 ETH | 0.00000025 |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
A0Signatures
Compiler Version
v0.8.26+commit.8a97fa7a
Optimization Enabled:
Yes with 2000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
// Contract for digital signature and staking
contract A0Signatures {
// Instance of the A0T token (must be ERC20-compatible)
IERC20 public immutable token;
// Structure for digital signatures
struct Signature {
bytes32 identifier;
bytes32 data;
address signer;
uint256 timestamp;
uint256 stake;
uint256 stakeLock;
}
// Mapping from signature identifier to stored Signature
mapping(bytes32 => Signature) public signatures;
// Event emitted when a new signature is recorded.
event SignatureCreated(
bytes32 indexed identifier,
address indexed signer,
uint256 timestamp
);
// Event emitted when a signature is unstaked.
event SignatureUnstaked(
bytes32 indexed identifier,
address indexed signer,
uint256 timestamp,
uint256 unstakedAmount
);
// constructor to set the token instance
constructor(address tokenAddress) {
token = IERC20(tokenAddress);
}
// function to issue a digital signature, foundation for off-chain dApps
// can be used for time-locking A0T tokens
function sign(Signature[] calldata signaturesIn) external {
uint256 totalStakeNeeded = 0;
uint256 len = signaturesIn.length;
for (uint256 i = 0; i < len; i++) {
totalStakeNeeded += signaturesIn[i].stake;
}
// Transfer the total stake from the user to this contract using allowance.
require(
token.transferFrom(msg.sender, address(this), totalStakeNeeded),
"Token transfer failed, check allowance and balance"
);
// Process each signature.
for (uint256 i = 0; i < len; i++) {
bytes32 id = signaturesIn[i].identifier;
// Ensure the identifier has not been used yet.
require(signatures[id].timestamp == 0, "Identifier already signed");
Signature memory sig = signaturesIn[i];
sig.signer = msg.sender;
sig.timestamp = block.timestamp;
// Store the signature.
signatures[id] = sig;
emit SignatureCreated(id, msg.sender, block.timestamp);
}
}
// function to return staked tokens from signatures
// can be used after stake is no longer needed and stakeLock timestamp has passed
function unstake(bytes32[] calldata identifiers) external {
uint256 totalToUnstake = 0;
uint256 len = identifiers.length;
for (uint256 i = 0; i < len; i++) {
Signature storage sig = signatures[identifiers[i]];
require(sig.timestamp != 0, "Signature does not exist");
require(sig.signer == msg.sender, "Not the signature owner");
require(sig.stake > 0, "No stake to unstake");
require(sig.stakeLock <= block.timestamp, "Stake is still locked");
totalToUnstake += sig.stake;
uint256 stakedAmount = sig.stake;
// Mark the signature's stake as claimed.
sig.stake = 0;
emit SignatureUnstaked(
identifiers[i],
msg.sender,
block.timestamp,
stakedAmount
);
}
require(totalToUnstake > 0, "Nothing to unstake");
require(
token.transfer(msg.sender, totalToUnstake),
"Token transfer failed"
);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC-20 standard as defined in the ERC.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the value of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the value of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves a `value` amount of tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 value) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets a `value` amount of tokens as the allowance of `spender` over the
* caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 value) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from `from` to `to` using the
* allowance mechanism. `value` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 value) external returns (bool);
}{
"optimizer": {
"enabled": true,
"runs": 2000
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"remappings": []
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"identifier","type":"bytes32"},{"indexed":true,"internalType":"address","name":"signer","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"SignatureCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"identifier","type":"bytes32"},{"indexed":true,"internalType":"address","name":"signer","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"unstakedAmount","type":"uint256"}],"name":"SignatureUnstaked","type":"event"},{"inputs":[{"components":[{"internalType":"bytes32","name":"identifier","type":"bytes32"},{"internalType":"bytes32","name":"data","type":"bytes32"},{"internalType":"address","name":"signer","type":"address"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"stakeLock","type":"uint256"}],"internalType":"struct A0Signatures.Signature[]","name":"signaturesIn","type":"tuple[]"}],"name":"sign","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"signatures","outputs":[{"internalType":"bytes32","name":"identifier","type":"bytes32"},{"internalType":"bytes32","name":"data","type":"bytes32"},{"internalType":"address","name":"signer","type":"address"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"stakeLock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"identifiers","type":"bytes32[]"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60a0604052348015600e575f80fd5b50604051610a91380380610a91833981016040819052602b91603b565b6001600160a01b03166080526066565b5f60208284031215604a575f80fd5b81516001600160a01b0381168114605f575f80fd5b9392505050565b608051610a0561008c5f395f8181610121015281816101e101526107030152610a055ff3fe608060405234801561000f575f80fd5b506004361061004a575f3560e01c80632422224e1461004e5780638c6995aa146100f4578063b12c10f714610109578063fc0c546a1461011c575b5f80fd5b6100a761005c3660046107d4565b5f602081905290815260409020805460018201546002830154600384015460048501546005909501549394929373ffffffffffffffffffffffffffffffffffffffff90921692909186565b60408051968752602087019590955273ffffffffffffffffffffffffffffffffffffffff909316938501939093526060840152608083019190915260a082015260c0015b60405180910390f35b6101076101023660046107eb565b610168565b005b61010761011736600461085c565b610462565b6101437f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100eb565b5f81815b818110156101a557848482818110610186576101866108bd565b905060c00201608001358361019b91906108d1565b925060010161016c565b506040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018390527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906323b872dd906064016020604051808303815f875af115801561023c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061026091906108f6565b6102d75760405162461bcd60e51b815260206004820152603260248201527f546f6b656e207472616e73666572206661696c65642c20636865636b20616c6c60448201527f6f77616e636520616e642062616c616e6365000000000000000000000000000060648201526084015b60405180910390fd5b5f5b8181101561045b575f8585838181106102f4576102f46108bd565b60c00291909101355f8181526020819052604090206003015490925015905061035f5760405162461bcd60e51b815260206004820152601960248201527f4964656e74696669657220616c7265616479207369676e65640000000000000060448201526064016102ce565b5f868684818110610372576103726108bd565b905060c002018036038101906103889190610944565b33604082810182815242606085018181525f8881526020818152908590208751815581880151600182015593516002850180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909216919091179055905160038401556080860151600484015560a08601516005909301929092559151918252929350909184917f99824c4b9387c6f8f10dd730fcd8568e01a8842521fd8d372c05b455f3e1bbff910160405180910390a350506001016102d9565b5050505050565b5f81815b8181101561067e575f805f878785818110610483576104836108bd565b9050602002013581526020019081526020015f20905080600301545f036104ec5760405162461bcd60e51b815260206004820152601860248201527f5369676e617475726520646f6573206e6f74206578697374000000000000000060448201526064016102ce565b600281015473ffffffffffffffffffffffffffffffffffffffff1633146105555760405162461bcd60e51b815260206004820152601760248201527f4e6f7420746865207369676e6174757265206f776e657200000000000000000060448201526064016102ce565b5f8160040154116105a85760405162461bcd60e51b815260206004820152601360248201527f4e6f207374616b6520746f20756e7374616b650000000000000000000000000060448201526064016102ce565b42816005015411156105fc5760405162461bcd60e51b815260206004820152601560248201527f5374616b65206973207374696c6c206c6f636b6564000000000000000000000060448201526064016102ce565b600481015461060b90856108d1565b6004820180545f9091559094503387878581811061062b5761062b6108bd565b905060200201357ff5867e3cc2b1e5abc30afd63bc326c6c3032f68ca4485656eaa9e815919e3e21428460405161066c929190918252602082015260400190565b60405180910390a35050600101610466565b505f82116106ce5760405162461bcd60e51b815260206004820152601260248201527f4e6f7468696e6720746f20756e7374616b65000000000000000000000000000060448201526064016102ce565b6040517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481018390527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063a9059cbb906044016020604051808303815f875af115801561075e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061078291906108f6565b6107ce5760405162461bcd60e51b815260206004820152601560248201527f546f6b656e207472616e73666572206661696c6564000000000000000000000060448201526064016102ce565b50505050565b5f602082840312156107e4575f80fd5b5035919050565b5f80602083850312156107fc575f80fd5b823567ffffffffffffffff811115610812575f80fd5b8301601f81018513610822575f80fd5b803567ffffffffffffffff811115610838575f80fd5b85602060c08302840101111561084c575f80fd5b6020919091019590945092505050565b5f806020838503121561086d575f80fd5b823567ffffffffffffffff811115610883575f80fd5b8301601f81018513610893575f80fd5b803567ffffffffffffffff8111156108a9575f80fd5b8560208260051b840101111561084c575f80fd5b634e487b7160e01b5f52603260045260245ffd5b808201808211156108f057634e487b7160e01b5f52601160045260245ffd5b92915050565b5f60208284031215610906575f80fd5b81518015158114610915575f80fd5b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461093f575f80fd5b919050565b5f60c0828403128015610955575f80fd5b5060405160c0810167ffffffffffffffff8111828210171561098557634e487b7160e01b5f52604160045260245ffd5b604090815283358252602080850135908301526109a390840161091c565b6040820152606083810135908201526080808401359082015260a092830135928101929092525091905056fea2646970667358221220bd966bf3971efada45be87b8fe30c7af94db9a7a099d77d6c1781a77d977fcdc64736f6c634300081a0033000000000000000000000000cc4adb618253ed0d4d8a188fb901d70c54735e03
Deployed Bytecode
0x608060405234801561000f575f80fd5b506004361061004a575f3560e01c80632422224e1461004e5780638c6995aa146100f4578063b12c10f714610109578063fc0c546a1461011c575b5f80fd5b6100a761005c3660046107d4565b5f602081905290815260409020805460018201546002830154600384015460048501546005909501549394929373ffffffffffffffffffffffffffffffffffffffff90921692909186565b60408051968752602087019590955273ffffffffffffffffffffffffffffffffffffffff909316938501939093526060840152608083019190915260a082015260c0015b60405180910390f35b6101076101023660046107eb565b610168565b005b61010761011736600461085c565b610462565b6101437f000000000000000000000000cc4adb618253ed0d4d8a188fb901d70c54735e0381565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100eb565b5f81815b818110156101a557848482818110610186576101866108bd565b905060c00201608001358361019b91906108d1565b925060010161016c565b506040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018390527f000000000000000000000000cc4adb618253ed0d4d8a188fb901d70c54735e0373ffffffffffffffffffffffffffffffffffffffff16906323b872dd906064016020604051808303815f875af115801561023c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061026091906108f6565b6102d75760405162461bcd60e51b815260206004820152603260248201527f546f6b656e207472616e73666572206661696c65642c20636865636b20616c6c60448201527f6f77616e636520616e642062616c616e6365000000000000000000000000000060648201526084015b60405180910390fd5b5f5b8181101561045b575f8585838181106102f4576102f46108bd565b60c00291909101355f8181526020819052604090206003015490925015905061035f5760405162461bcd60e51b815260206004820152601960248201527f4964656e74696669657220616c7265616479207369676e65640000000000000060448201526064016102ce565b5f868684818110610372576103726108bd565b905060c002018036038101906103889190610944565b33604082810182815242606085018181525f8881526020818152908590208751815581880151600182015593516002850180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909216919091179055905160038401556080860151600484015560a08601516005909301929092559151918252929350909184917f99824c4b9387c6f8f10dd730fcd8568e01a8842521fd8d372c05b455f3e1bbff910160405180910390a350506001016102d9565b5050505050565b5f81815b8181101561067e575f805f878785818110610483576104836108bd565b9050602002013581526020019081526020015f20905080600301545f036104ec5760405162461bcd60e51b815260206004820152601860248201527f5369676e617475726520646f6573206e6f74206578697374000000000000000060448201526064016102ce565b600281015473ffffffffffffffffffffffffffffffffffffffff1633146105555760405162461bcd60e51b815260206004820152601760248201527f4e6f7420746865207369676e6174757265206f776e657200000000000000000060448201526064016102ce565b5f8160040154116105a85760405162461bcd60e51b815260206004820152601360248201527f4e6f207374616b6520746f20756e7374616b650000000000000000000000000060448201526064016102ce565b42816005015411156105fc5760405162461bcd60e51b815260206004820152601560248201527f5374616b65206973207374696c6c206c6f636b6564000000000000000000000060448201526064016102ce565b600481015461060b90856108d1565b6004820180545f9091559094503387878581811061062b5761062b6108bd565b905060200201357ff5867e3cc2b1e5abc30afd63bc326c6c3032f68ca4485656eaa9e815919e3e21428460405161066c929190918252602082015260400190565b60405180910390a35050600101610466565b505f82116106ce5760405162461bcd60e51b815260206004820152601260248201527f4e6f7468696e6720746f20756e7374616b65000000000000000000000000000060448201526064016102ce565b6040517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481018390527f000000000000000000000000cc4adb618253ed0d4d8a188fb901d70c54735e0373ffffffffffffffffffffffffffffffffffffffff169063a9059cbb906044016020604051808303815f875af115801561075e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061078291906108f6565b6107ce5760405162461bcd60e51b815260206004820152601560248201527f546f6b656e207472616e73666572206661696c6564000000000000000000000060448201526064016102ce565b50505050565b5f602082840312156107e4575f80fd5b5035919050565b5f80602083850312156107fc575f80fd5b823567ffffffffffffffff811115610812575f80fd5b8301601f81018513610822575f80fd5b803567ffffffffffffffff811115610838575f80fd5b85602060c08302840101111561084c575f80fd5b6020919091019590945092505050565b5f806020838503121561086d575f80fd5b823567ffffffffffffffff811115610883575f80fd5b8301601f81018513610893575f80fd5b803567ffffffffffffffff8111156108a9575f80fd5b8560208260051b840101111561084c575f80fd5b634e487b7160e01b5f52603260045260245ffd5b808201808211156108f057634e487b7160e01b5f52601160045260245ffd5b92915050565b5f60208284031215610906575f80fd5b81518015158114610915575f80fd5b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461093f575f80fd5b919050565b5f60c0828403128015610955575f80fd5b5060405160c0810167ffffffffffffffff8111828210171561098557634e487b7160e01b5f52604160045260245ffd5b604090815283358252602080850135908301526109a390840161091c565b6040820152606083810135908201526080808401359082015260a092830135928101929092525091905056fea2646970667358221220bd966bf3971efada45be87b8fe30c7af94db9a7a099d77d6c1781a77d977fcdc64736f6c634300081a0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000cc4adb618253ed0d4d8a188fb901d70c54735e03
-----Decoded View---------------
Arg [0] : tokenAddress (address): 0xCc4ADB618253ED0d4d8A188fB901d70C54735e03
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000cc4adb618253ed0d4d8a188fb901d70c54735e03
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$135,599.13
Net Worth in ETH
40.967354
Token Allocations
A0T
100.00%
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| BASE | 100.00% | $3.88 | 34,948.23 | $135,599.13 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.