Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 25 from a total of 1,431 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Dekrystalize | 20338246 | 592 days ago | IN | 0 ETH | 0.00289396 | ||||
| Dekrystalize | 19772878 | 671 days ago | IN | 0 ETH | 0.00055645 | ||||
| Dekrystalize | 19585010 | 697 days ago | IN | 0 ETH | 0.00237427 | ||||
| Dekrystalize | 19459753 | 715 days ago | IN | 0 ETH | 0.00241709 | ||||
| Dekrystalize | 19452124 | 716 days ago | IN | 0 ETH | 0.00201893 | ||||
| Dekrystalize | 19372283 | 727 days ago | IN | 0 ETH | 0.00659991 | ||||
| Dekrystalize | 19357879 | 729 days ago | IN | 0 ETH | 0.01053241 | ||||
| Dekrystalize | 19329585 | 733 days ago | IN | 0 ETH | 0.00516066 | ||||
| Dekrystalize | 19312904 | 736 days ago | IN | 0 ETH | 0.00654644 | ||||
| Dekrystalize | 19310043 | 736 days ago | IN | 0 ETH | 0.00235535 | ||||
| Dekrystalize | 19309585 | 736 days ago | IN | 0 ETH | 0.00255739 | ||||
| Dekrystalize | 19309582 | 736 days ago | IN | 0 ETH | 0.00284183 | ||||
| Dekrystalize | 19306727 | 737 days ago | IN | 0 ETH | 0.00317318 | ||||
| Dekrystalize | 19304615 | 737 days ago | IN | 0 ETH | 0.00291612 | ||||
| Dekrystalize | 19303939 | 737 days ago | IN | 0 ETH | 0.00230197 | ||||
| Dekrystalize | 19294983 | 738 days ago | IN | 0 ETH | 0.00199529 | ||||
| Dekrystalize | 19267019 | 742 days ago | IN | 0 ETH | 0.0024361 | ||||
| Dekrystalize | 19253374 | 744 days ago | IN | 0 ETH | 0.00169869 | ||||
| Dekrystalize | 19242626 | 746 days ago | IN | 0 ETH | 0.00210243 | ||||
| Dekrystalize | 19236640 | 746 days ago | IN | 0 ETH | 0.0026204 | ||||
| Dekrystalize | 19232427 | 747 days ago | IN | 0 ETH | 0.00198178 | ||||
| Dekrystalize | 19209521 | 750 days ago | IN | 0 ETH | 0.00233141 | ||||
| Dekrystalize | 19202885 | 751 days ago | IN | 0 ETH | 0.00239171 | ||||
| Dekrystalize | 19186455 | 753 days ago | IN | 0 ETH | 0.04103467 | ||||
| Dekrystalize | 19184380 | 754 days ago | IN | 0 ETH | 0.00727622 |
Advanced mode: Intended for advanced users or developers and will display all Internal Transactions including zero value transfers.
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
|||
|---|---|---|---|---|---|---|---|---|
| Tokenize | 20338246 | 592 days ago | 0 ETH | |||||
| Burn Tokens | 20338246 | 592 days ago | 0 ETH | |||||
| Transfer* | 20338246 | 592 days ago | 0 ETH | |||||
| Tokenize | 19772878 | 671 days ago | 0 ETH | |||||
| Burn Tokens | 19772878 | 671 days ago | 0 ETH | |||||
| Transfer* | 19772878 | 671 days ago | 0 ETH | |||||
| Tokenize | 19585010 | 697 days ago | 0 ETH | |||||
| Burn Tokens | 19585010 | 697 days ago | 0 ETH | |||||
| Transfer* | 19585010 | 697 days ago | 0 ETH | |||||
| Tokenize | 19459753 | 715 days ago | 0 ETH | |||||
| Burn Tokens | 19459753 | 715 days ago | 0 ETH | |||||
| Transfer* | 19459753 | 715 days ago | 0 ETH | |||||
| Tokenize | 19452124 | 716 days ago | 0 ETH | |||||
| Burn Tokens | 19452124 | 716 days ago | 0 ETH | |||||
| Transfer* | 19452124 | 716 days ago | 0 ETH | |||||
| Tokenize | 19372283 | 727 days ago | 0 ETH | |||||
| Burn Tokens | 19372283 | 727 days ago | 0 ETH | |||||
| Transfer* | 19372283 | 727 days ago | 0 ETH | |||||
| Tokenize | 19357879 | 729 days ago | 0 ETH | |||||
| Burn Tokens | 19357879 | 729 days ago | 0 ETH | |||||
| Transfer* | 19357879 | 729 days ago | 0 ETH | |||||
| Tokenize | 19329585 | 733 days ago | 0 ETH | |||||
| Burn Tokens | 19329585 | 733 days ago | 0 ETH | |||||
| Transfer* | 19329585 | 733 days ago | 0 ETH | |||||
| Tokenize | 19312904 | 736 days ago | 0 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
Dekrystalizer
Compiler Version
v0.8.16+commit.07a7930e
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.16;
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";
import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
import "@openzeppelin/contracts/token/ERC1155/IERC1155.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
enum RewardType {
ERC721,
ERC1155
}
struct Reward {
address contractAddress;
RewardType rewardType;
uint256 token;
}
interface IKrystals {
function burnTokens(uint256[] memory) external;
function getTier(uint256) external view returns (uint256);
function lockedTokens(uint256) external view returns (bool);
}
interface ITraits {
function tokenize(
address,
uint256[] calldata,
uint256[] calldata
) external;
}
struct Voucher {
uint256[] krystals;
uint256[] traitIds;
uint256[] traitAmounts;
uint256[] rewardIds;
bytes signature;
}
contract Dekrystalizer is Ownable, ReentrancyGuard {
using ECDSA for bytes32;
IKrystals public immutable krystalsContract;
ITraits public immutable traitsContract;
mapping(uint256 => Reward) public rewards;
address public signer;
address public vault;
error NotAllowed();
error InvalidSignature();
constructor(address krystals, address traits) {
krystalsContract = IKrystals(krystals);
traitsContract = ITraits(traits);
}
function dekrystalize(Voucher memory voucher) public nonReentrant {
checkSignature(voucher);
krystalsContract.burnTokens(voucher.krystals);
traitsContract.tokenize(
msg.sender,
voucher.traitIds,
voucher.traitAmounts
);
for (uint256 i = 0; i < voucher.rewardIds.length; i++) {
uint256 id = voucher.rewardIds[i];
Reward memory r = rewards[id];
if (r.rewardType == RewardType.ERC1155) {
IERC1155 c = IERC1155(r.contractAddress);
c.safeTransferFrom(vault, msg.sender, r.token, 1, "");
} else if (r.rewardType == RewardType.ERC721) {
IERC721 c = IERC721(r.contractAddress);
c.transferFrom(vault, msg.sender, r.token);
}
}
}
function getTiers(uint256[] memory krystals)
public
view
returns (uint256[] memory)
{
uint256[] memory ret = new uint256[](krystals.length);
for (uint256 i = 0; i < krystals.length; i++) {
ret[i] = krystalsContract.getTier(krystals[i]);
}
return ret;
}
function getLockedStatus(uint256[] memory krystals)
public
view
returns (bool[] memory)
{
bool[] memory ret = new bool[](krystals.length);
for (uint256 i = 0; i < krystals.length; i++) {
ret[i] = krystalsContract.lockedTokens(krystals[i]);
}
return ret;
}
function setSigner(address _signer) external onlyOwner {
signer = _signer;
}
function setVault(address _vault) external onlyOwner {
vault = _vault;
}
function setupReward(
uint256 id,
address contractAddress,
RewardType rewardType,
uint256 token
) external onlyOwner {
rewards[id] = Reward(contractAddress, rewardType, token);
}
function setupRewards(uint256[] calldata ids, Reward[] calldata _rewards)
external
onlyOwner
{
for (uint256 i = 0; i < ids.length; i++) {
uint256 id = ids[i];
rewards[id] = _rewards[i];
}
}
function deleteReward(uint256 id) external onlyOwner {
delete rewards[id];
}
function checkSignature(Voucher memory voucher) private view {
if (
signer !=
ECDSA
.toEthSignedMessageHash(
abi.encodePacked(
msg.sender,
voucher.krystals.length,
voucher.traitIds.length,
voucher.krystals,
voucher.traitIds,
voucher.traitAmounts,
voucher.rewardIds
)
)
.recover(voucher.signature)
) revert InvalidSignature();
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)
pragma solidity ^0.8.0;
import "../utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol)
pragma solidity ^0.8.0;
import "../Strings.sol";
/**
* @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
*
* These functions can be used to verify that a message was signed by the holder
* of the private keys of a given address.
*/
library ECDSA {
enum RecoverError {
NoError,
InvalidSignature,
InvalidSignatureLength,
InvalidSignatureS,
InvalidSignatureV // Deprecated in v4.8
}
function _throwError(RecoverError error) private pure {
if (error == RecoverError.NoError) {
return; // no error: do nothing
} else if (error == RecoverError.InvalidSignature) {
revert("ECDSA: invalid signature");
} else if (error == RecoverError.InvalidSignatureLength) {
revert("ECDSA: invalid signature length");
} else if (error == RecoverError.InvalidSignatureS) {
revert("ECDSA: invalid signature 's' value");
}
}
/**
* @dev Returns the address that signed a hashed message (`hash`) with
* `signature` or error string. This address can then be used for verification purposes.
*
* The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
* this function rejects them by requiring the `s` value to be in the lower
* half order, and the `v` value to be either 27 or 28.
*
* IMPORTANT: `hash` _must_ be the result of a hash operation for the
* verification to be secure: it is possible to craft signatures that
* recover to arbitrary addresses for non-hashed data. A safe way to ensure
* this is by receiving a hash of the original message (which may otherwise
* be too long), and then calling {toEthSignedMessageHash} on it.
*
* Documentation for signature generation:
* - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
* - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
*
* _Available since v4.3._
*/
function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
if (signature.length == 65) {
bytes32 r;
bytes32 s;
uint8 v;
// ecrecover takes the signature parameters, and the only way to get them
// currently is to use assembly.
/// @solidity memory-safe-assembly
assembly {
r := mload(add(signature, 0x20))
s := mload(add(signature, 0x40))
v := byte(0, mload(add(signature, 0x60)))
}
return tryRecover(hash, v, r, s);
} else {
return (address(0), RecoverError.InvalidSignatureLength);
}
}
/**
* @dev Returns the address that signed a hashed message (`hash`) with
* `signature`. This address can then be used for verification purposes.
*
* The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
* this function rejects them by requiring the `s` value to be in the lower
* half order, and the `v` value to be either 27 or 28.
*
* IMPORTANT: `hash` _must_ be the result of a hash operation for the
* verification to be secure: it is possible to craft signatures that
* recover to arbitrary addresses for non-hashed data. A safe way to ensure
* this is by receiving a hash of the original message (which may otherwise
* be too long), and then calling {toEthSignedMessageHash} on it.
*/
function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
(address recovered, RecoverError error) = tryRecover(hash, signature);
_throwError(error);
return recovered;
}
/**
* @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
*
* See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
*
* _Available since v4.3._
*/
function tryRecover(
bytes32 hash,
bytes32 r,
bytes32 vs
) internal pure returns (address, RecoverError) {
bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
uint8 v = uint8((uint256(vs) >> 255) + 27);
return tryRecover(hash, v, r, s);
}
/**
* @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
*
* _Available since v4.2._
*/
function recover(
bytes32 hash,
bytes32 r,
bytes32 vs
) internal pure returns (address) {
(address recovered, RecoverError error) = tryRecover(hash, r, vs);
_throwError(error);
return recovered;
}
/**
* @dev Overload of {ECDSA-tryRecover} that receives the `v`,
* `r` and `s` signature fields separately.
*
* _Available since v4.3._
*/
function tryRecover(
bytes32 hash,
uint8 v,
bytes32 r,
bytes32 s
) internal pure returns (address, RecoverError) {
// EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
// unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
// the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
// signatures from current libraries generate a unique signature with an s-value in the lower half order.
//
// If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
// with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
// vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
// these malleable signatures as well.
if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
return (address(0), RecoverError.InvalidSignatureS);
}
// If the signature is valid (and not malleable), return the signer address
address signer = ecrecover(hash, v, r, s);
if (signer == address(0)) {
return (address(0), RecoverError.InvalidSignature);
}
return (signer, RecoverError.NoError);
}
/**
* @dev Overload of {ECDSA-recover} that receives the `v`,
* `r` and `s` signature fields separately.
*/
function recover(
bytes32 hash,
uint8 v,
bytes32 r,
bytes32 s
) internal pure returns (address) {
(address recovered, RecoverError error) = tryRecover(hash, v, r, s);
_throwError(error);
return recovered;
}
/**
* @dev Returns an Ethereum Signed Message, created from a `hash`. This
* produces hash corresponding to the one signed with the
* https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
* JSON-RPC method as part of EIP-191.
*
* See {recover}.
*/
function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
// 32 is the length in bytes of hash,
// enforced by the type signature above
return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
}
/**
* @dev Returns an Ethereum Signed Message, created from `s`. This
* produces hash corresponding to the one signed with the
* https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
* JSON-RPC method as part of EIP-191.
*
* See {recover}.
*/
function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
}
/**
* @dev Returns an Ethereum Signed Typed Data, created from a
* `domainSeparator` and a `structHash`. This produces hash corresponding
* to the one signed with the
* https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
* JSON-RPC method as part of EIP-712.
*
* See {recover}.
*/
function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and making it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
// On the first call to nonReentrant, _status will be _NOT_ENTERED
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
}
function _nonReentrantAfter() private {
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol)
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165.sol";
/**
* @dev Required interface of an ERC1155 compliant contract, as defined in the
* https://eips.ethereum.org/EIPS/eip-1155[EIP].
*
* _Available since v3.1._
*/
interface IERC1155 is IERC165 {
/**
* @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
*/
event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);
/**
* @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
* transfers.
*/
event TransferBatch(
address indexed operator,
address indexed from,
address indexed to,
uint256[] ids,
uint256[] values
);
/**
* @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
* `approved`.
*/
event ApprovalForAll(address indexed account, address indexed operator, bool approved);
/**
* @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
*
* If an {URI} event was emitted for `id`, the standard
* https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
* returned by {IERC1155MetadataURI-uri}.
*/
event URI(string value, uint256 indexed id);
/**
* @dev Returns the amount of tokens of token type `id` owned by `account`.
*
* Requirements:
*
* - `account` cannot be the zero address.
*/
function balanceOf(address account, uint256 id) external view returns (uint256);
/**
* @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
*
* Requirements:
*
* - `accounts` and `ids` must have the same length.
*/
function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
external
view
returns (uint256[] memory);
/**
* @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
*
* Emits an {ApprovalForAll} event.
*
* Requirements:
*
* - `operator` cannot be the caller.
*/
function setApprovalForAll(address operator, bool approved) external;
/**
* @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
*
* See {setApprovalForAll}.
*/
function isApprovedForAll(address account, address operator) external view returns (bool);
/**
* @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
*
* Emits a {TransferSingle} event.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.
* - `from` must have a balance of tokens of type `id` of at least `amount`.
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
* acceptance magic value.
*/
function safeTransferFrom(
address from,
address to,
uint256 id,
uint256 amount,
bytes calldata data
) external;
/**
* @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
*
* Emits a {TransferBatch} event.
*
* Requirements:
*
* - `ids` and `amounts` must have the same length.
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
* acceptance magic value.
*/
function safeBatchTransferFrom(
address from,
address to,
uint256[] calldata ids,
uint256[] calldata amounts,
bytes calldata data
) external;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol)
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165.sol";
/**
* @dev Required interface of an ERC721 compliant contract.
*/
interface IERC721 is IERC165 {
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes calldata data
) external;
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Transfers `tokenId` token from `from` to `to`.
*
* WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
* or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
* understand this adds an external call which potentially creates a reentrancy vulnerability.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account.
* The approval is cleared when the token is transferred.
*
* Only a single account can be approved at a time, so approving the zero address clears previous approvals.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/
function approve(address to, uint256 tokenId) external;
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the caller.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool _approved) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}
*/
function isApprovedForAll(address owner, address operator) external view returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)
pragma solidity ^0.8.0;
import "./math/Math.sol";
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _SYMBOLS = "0123456789abcdef";
uint8 private constant _ADDRESS_LENGTH = 20;
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
unchecked {
uint256 length = Math.log10(value) + 1;
string memory buffer = new string(length);
uint256 ptr;
/// @solidity memory-safe-assembly
assembly {
ptr := add(buffer, add(32, length))
}
while (true) {
ptr--;
/// @solidity memory-safe-assembly
assembly {
mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
}
value /= 10;
if (value == 0) break;
}
return buffer;
}
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
unchecked {
return toHexString(value, Math.log256(value) + 1);
}
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
*/
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = _SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
/**
* @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
*/
function toHexString(address addr) internal pure returns (string memory) {
return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)
pragma solidity ^0.8.0;
/**
* @dev Standard math utilities missing in the Solidity language.
*/
library Math {
enum Rounding {
Down, // Toward negative infinity
Up, // Toward infinity
Zero // Toward zero
}
/**
* @dev Returns the largest of two numbers.
*/
function max(uint256 a, uint256 b) internal pure returns (uint256) {
return a > b ? a : b;
}
/**
* @dev Returns the smallest of two numbers.
*/
function min(uint256 a, uint256 b) internal pure returns (uint256) {
return a < b ? a : b;
}
/**
* @dev Returns the average of two numbers. The result is rounded towards
* zero.
*/
function average(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b) / 2 can overflow.
return (a & b) + (a ^ b) / 2;
}
/**
* @dev Returns the ceiling of the division of two numbers.
*
* This differs from standard division with `/` in that it rounds up instead
* of rounding down.
*/
function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b - 1) / b can overflow on addition, so we distribute.
return a == 0 ? 0 : (a - 1) / b + 1;
}
/**
* @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
* @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
* with further edits by Uniswap Labs also under MIT license.
*/
function mulDiv(
uint256 x,
uint256 y,
uint256 denominator
) internal pure returns (uint256 result) {
unchecked {
// 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
// use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
// variables such that product = prod1 * 2^256 + prod0.
uint256 prod0; // Least significant 256 bits of the product
uint256 prod1; // Most significant 256 bits of the product
assembly {
let mm := mulmod(x, y, not(0))
prod0 := mul(x, y)
prod1 := sub(sub(mm, prod0), lt(mm, prod0))
}
// Handle non-overflow cases, 256 by 256 division.
if (prod1 == 0) {
return prod0 / denominator;
}
// Make sure the result is less than 2^256. Also prevents denominator == 0.
require(denominator > prod1);
///////////////////////////////////////////////
// 512 by 256 division.
///////////////////////////////////////////////
// Make division exact by subtracting the remainder from [prod1 prod0].
uint256 remainder;
assembly {
// Compute remainder using mulmod.
remainder := mulmod(x, y, denominator)
// Subtract 256 bit number from 512 bit number.
prod1 := sub(prod1, gt(remainder, prod0))
prod0 := sub(prod0, remainder)
}
// Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
// See https://cs.stackexchange.com/q/138556/92363.
// Does not overflow because the denominator cannot be zero at this stage in the function.
uint256 twos = denominator & (~denominator + 1);
assembly {
// Divide denominator by twos.
denominator := div(denominator, twos)
// Divide [prod1 prod0] by twos.
prod0 := div(prod0, twos)
// Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
twos := add(div(sub(0, twos), twos), 1)
}
// Shift in bits from prod1 into prod0.
prod0 |= prod1 * twos;
// Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
// that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
// four bits. That is, denominator * inv = 1 mod 2^4.
uint256 inverse = (3 * denominator) ^ 2;
// Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
// in modular arithmetic, doubling the correct bits in each step.
inverse *= 2 - denominator * inverse; // inverse mod 2^8
inverse *= 2 - denominator * inverse; // inverse mod 2^16
inverse *= 2 - denominator * inverse; // inverse mod 2^32
inverse *= 2 - denominator * inverse; // inverse mod 2^64
inverse *= 2 - denominator * inverse; // inverse mod 2^128
inverse *= 2 - denominator * inverse; // inverse mod 2^256
// Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
// This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
// less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
// is no longer required.
result = prod0 * inverse;
return result;
}
}
/**
* @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
*/
function mulDiv(
uint256 x,
uint256 y,
uint256 denominator,
Rounding rounding
) internal pure returns (uint256) {
uint256 result = mulDiv(x, y, denominator);
if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
result += 1;
}
return result;
}
/**
* @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
*
* Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
*/
function sqrt(uint256 a) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
// For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
//
// We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
// `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
//
// This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
// → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
// → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
//
// Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
uint256 result = 1 << (log2(a) >> 1);
// At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
// since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
// every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
// into the expected uint128 result.
unchecked {
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
return min(result, a / result);
}
}
/**
* @notice Calculates sqrt(a), following the selected rounding direction.
*/
function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = sqrt(a);
return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
}
}
/**
* @dev Return the log in base 2, rounded down, of a positive value.
* Returns 0 if given 0.
*/
function log2(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >> 128 > 0) {
value >>= 128;
result += 128;
}
if (value >> 64 > 0) {
value >>= 64;
result += 64;
}
if (value >> 32 > 0) {
value >>= 32;
result += 32;
}
if (value >> 16 > 0) {
value >>= 16;
result += 16;
}
if (value >> 8 > 0) {
value >>= 8;
result += 8;
}
if (value >> 4 > 0) {
value >>= 4;
result += 4;
}
if (value >> 2 > 0) {
value >>= 2;
result += 2;
}
if (value >> 1 > 0) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 2, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log2(value);
return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
}
}
/**
* @dev Return the log in base 10, rounded down, of a positive value.
* Returns 0 if given 0.
*/
function log10(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >= 10**64) {
value /= 10**64;
result += 64;
}
if (value >= 10**32) {
value /= 10**32;
result += 32;
}
if (value >= 10**16) {
value /= 10**16;
result += 16;
}
if (value >= 10**8) {
value /= 10**8;
result += 8;
}
if (value >= 10**4) {
value /= 10**4;
result += 4;
}
if (value >= 10**2) {
value /= 10**2;
result += 2;
}
if (value >= 10**1) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 10, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log10(value);
return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);
}
}
/**
* @dev Return the log in base 256, rounded down, of a positive value.
* Returns 0 if given 0.
*
* Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
*/
function log256(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >> 128 > 0) {
value >>= 128;
result += 16;
}
if (value >> 64 > 0) {
value >>= 64;
result += 8;
}
if (value >> 32 > 0) {
value >>= 32;
result += 4;
}
if (value >> 16 > 0) {
value >>= 16;
result += 2;
}
if (value >> 8 > 0) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 10, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log256(value);
return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}{
"optimizer": {
"enabled": true,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"krystals","type":"address"},{"internalType":"address","name":"traits","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"InvalidSignature","type":"error"},{"inputs":[],"name":"NotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"components":[{"internalType":"uint256[]","name":"krystals","type":"uint256[]"},{"internalType":"uint256[]","name":"traitIds","type":"uint256[]"},{"internalType":"uint256[]","name":"traitAmounts","type":"uint256[]"},{"internalType":"uint256[]","name":"rewardIds","type":"uint256[]"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct Voucher","name":"voucher","type":"tuple"}],"name":"dekrystalize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"deleteReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"krystals","type":"uint256[]"}],"name":"getLockedStatus","outputs":[{"internalType":"bool[]","name":"","type":"bool[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"krystals","type":"uint256[]"}],"name":"getTiers","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"krystalsContract","outputs":[{"internalType":"contract IKrystals","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewards","outputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"enum RewardType","name":"rewardType","type":"uint8"},{"internalType":"uint256","name":"token","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_signer","type":"address"}],"name":"setSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"}],"name":"setVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"enum RewardType","name":"rewardType","type":"uint8"},{"internalType":"uint256","name":"token","type":"uint256"}],"name":"setupReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"components":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"enum RewardType","name":"rewardType","type":"uint8"},{"internalType":"uint256","name":"token","type":"uint256"}],"internalType":"struct Reward[]","name":"_rewards","type":"tuple[]"}],"name":"setupRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"signer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"traitsContract","outputs":[{"internalType":"contract ITraits","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]Contract Creation Code
60c06040523480156200001157600080fd5b50604051620018c7380380620018c78339810160408190526200003491620000c8565b6200003f336200005b565b600180556001600160a01b039182166080521660a05262000100565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b0381168114620000c357600080fd5b919050565b60008060408385031215620000dc57600080fd5b620000e783620000ab565b9150620000f760208401620000ab565b90509250929050565b60805160a05161178562000142600039600081816101d501526105be0152600081816101ae0152818161031a01528181610538015261092b01526117856000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c8063c093afdb11610097578063ed70543a11610066578063ed70543a14610230578063f2fde38b14610250578063f301af4214610263578063fbfa77cf146102af57600080fd5b8063c093afdb146101d0578063e3e3657d146101f7578063e7cf1ab71461020a578063ebb8d6c51461021d57600080fd5b80636c19e783116100d35780636c19e7831461017d578063715018a6146101905780638da5cb5b14610198578063912f8087146101a957600080fd5b8063238ac933146101055780633f957b64146101355780634a230cbd146101555780636817031b1461016a575b600080fd5b600354610118906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b610148610143366004611116565b6102c2565b60405161012c9190611153565b6101686101633660046111bb565b6103fb565b005b610168610178366004611203565b6104a6565b61016861018b366004611203565b6104d0565b6101686104fa565b6000546001600160a01b0316610118565b6101187f000000000000000000000000000000000000000000000000000000000000000081565b6101187f000000000000000000000000000000000000000000000000000000000000000081565b610168610205366004611297565b61050e565b610168610218366004611394565b610824565b61016861022b3660046113ad565b61084e565b61024361023e366004611116565b6108d3565b60405161012c91906114b0565b61016861025e366004611203565b610a00565b6102a0610271366004611394565b600260205260009081526040902080546001909101546001600160a01b03821691600160a01b900460ff169083565b60405161012c939291906114d9565b600454610118906001600160a01b031681565b60606000825167ffffffffffffffff8111156102e0576102e0611026565b604051908082528060200260200182016040528015610309578160200160208202803683370190505b50905060005b83518110156103f4577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dcec329485838151811061035957610359611518565b60200260200101516040518263ffffffff1660e01b815260040161037f91815260200190565b602060405180830381865afa15801561039c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103c0919061152e565b8282815181106103d2576103d2611518565b91151560209283029190910190910152806103ec81611550565b91505061030f565b5092915050565b610403610a7b565b6040518060600160405280846001600160a01b0316815260200183600181111561042f5761042f6114c3565b8152602090810183905260008681526002825260409020825181546001600160a01b039091166001600160a01b031982168117835592840151919283916001600160a81b03191617600160a01b83600181111561048e5761048e6114c3565b02179055506040820151816001015590505050505050565b6104ae610a7b565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6104d8610a7b565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b610502610a7b565b61050c6000610ad5565b565b610516610b25565b61051f81610b7e565b80516040516367a5317360e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916367a531739161056c91906004016114b0565b600060405180830381600087803b15801561058657600080fd5b505af115801561059a573d6000803e3d6000fd5b5050506020820151604080840151905163b92d248960e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016935063b92d2489926105f4923392600401611577565b600060405180830381600087803b15801561060e57600080fd5b505af1158015610622573d6000803e3d6000fd5b5050505060005b8160600151518110156108175760008260600151828151811061064e5761064e611518565b602090810291909101810151600081815260028352604080822081516060810190925280546001600160a01b03811683529395509193909290830190600160a01b900460ff1660018111156106a5576106a56114c3565b60018111156106b6576106b66114c3565b8152600191820154602090910152909150816020015160018111156106dd576106dd6114c3565b03610770578051600480546040808501519051637921219560e11b81526001600160a01b039283169381019390935233602484015260448301526001606483015260a06084830152600060a483015282169063f242432a9060c401600060405180830381600087803b15801561075257600080fd5b505af1158015610766573d6000803e3d6000fd5b5050505050610802565b600081602001516001811115610788576107886114c3565b036108025780516004805460408085015190516323b872dd60e01b81526001600160a01b039283169381019390935233602484015260448301528216906323b872dd90606401600060405180830381600087803b1580156107e857600080fd5b505af11580156107fc573d6000803e3d6000fd5b50505050505b5050808061080f90611550565b915050610629565b5061082160018055565b50565b61082c610a7b565b600090815260026020526040812080546001600160a81b031916815560010155565b610856610a7b565b60005b838110156108cc57600085858381811061087557610875611518565b90506020020135905083838381811061089057610890611518565b9050606002016002600083815260200190815260200160002081816108b591906115b7565b9050505080806108c490611550565b915050610859565b5050505050565b60606000825167ffffffffffffffff8111156108f1576108f1611026565b60405190808252806020026020018201604052801561091a578160200160208202803683370190505b50905060005b83518110156103f4577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316634f062c5a85838151811061096a5761096a611518565b60200260200101516040518263ffffffff1660e01b815260040161099091815260200190565b602060405180830381865afa1580156109ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109d1919061163a565b8282815181106109e3576109e3611518565b6020908102919091010152806109f881611550565b915050610920565b610a08610a7b565b6001600160a01b038116610a725760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b61082181610ad5565b6000546001600160a01b0316331461050c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a69565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600260015403610b775760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a69565b6002600155565b610bda8160800151610bd4338460000151518560200151518660000151876020015188604001518960600151604051602001610bc09796959493929190611678565b604051602081830303815290604052610c08565b90610c43565b6003546001600160a01b0390811691161461082157604051638baa579f60e01b815260040160405180910390fd5b6000610c148251610c67565b82604051602001610c269291906116f4565b604051602081830303815290604052805190602001209050919050565b6000806000610c528585610cfa565b91509150610c5f81610d3f565b509392505050565b60606000610c7483610e89565b600101905060008167ffffffffffffffff811115610c9457610c94611026565b6040519080825280601f01601f191660200182016040528015610cbe576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084610cc857509392505050565b6000808251604103610d305760208301516040840151606085015160001a610d2487828585610f62565b94509450505050610d38565b506000905060025b9250929050565b6000816004811115610d5357610d536114c3565b03610d5b5750565b6001816004811115610d6f57610d6f6114c3565b03610dbc5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610a69565b6002816004811115610dd057610dd06114c3565b03610e1d5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610a69565b6003816004811115610e3157610e316114c3565b036108215760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610a69565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310610ec85772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310610ef4576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310610f1257662386f26fc10000830492506010015b6305f5e1008310610f2a576305f5e100830492506008015b6127108310610f3e57612710830492506004015b60648310610f50576064830492506002015b600a8310610f5c576001015b92915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115610f99575060009050600361101d565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610fed573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166110165760006001925092505061101d565b9150600090505b94509492505050565b634e487b7160e01b600052604160045260246000fd5b60405160a0810167ffffffffffffffff8111828210171561105f5761105f611026565b60405290565b604051601f8201601f1916810167ffffffffffffffff8111828210171561108e5761108e611026565b604052919050565b600082601f8301126110a757600080fd5b8135602067ffffffffffffffff8211156110c3576110c3611026565b8160051b6110d2828201611065565b92835284810182019282810190878511156110ec57600080fd5b83870192505b8483101561110b578235825291830191908301906110f2565b979650505050505050565b60006020828403121561112857600080fd5b813567ffffffffffffffff81111561113f57600080fd5b61114b84828501611096565b949350505050565b6020808252825182820181905260009190848201906040850190845b8181101561118d57835115158352928401929184019160010161116f565b50909695505050505050565b6001600160a01b038116811461082157600080fd5b6002811061082157600080fd5b600080600080608085870312156111d157600080fd5b8435935060208501356111e381611199565b925060408501356111f3816111ae565b9396929550929360600135925050565b60006020828403121561121557600080fd5b813561122081611199565b9392505050565b600082601f83011261123857600080fd5b813567ffffffffffffffff81111561125257611252611026565b611265601f8201601f1916602001611065565b81815284602083860101111561127a57600080fd5b816020850160208301376000918101602001919091529392505050565b6000602082840312156112a957600080fd5b813567ffffffffffffffff808211156112c157600080fd5b9083019060a082860312156112d557600080fd5b6112dd61103c565b8235828111156112ec57600080fd5b6112f887828601611096565b82525060208301358281111561130d57600080fd5b61131987828601611096565b60208301525060408301358281111561133157600080fd5b61133d87828601611096565b60408301525060608301358281111561135557600080fd5b61136187828601611096565b60608301525060808301358281111561137957600080fd5b61138587828601611227565b60808301525095945050505050565b6000602082840312156113a657600080fd5b5035919050565b600080600080604085870312156113c357600080fd5b843567ffffffffffffffff808211156113db57600080fd5b818701915087601f8301126113ef57600080fd5b8135818111156113fe57600080fd5b8860208260051b850101111561141357600080fd5b60209283019650945090860135908082111561142e57600080fd5b818701915087601f83011261144257600080fd5b81358181111561145157600080fd5b88602060608302850101111561146657600080fd5b95989497505060200194505050565b600081518084526020808501945080840160005b838110156114a557815187529582019590820190600101611489565b509495945050505050565b6020815260006112206020830184611475565b634e487b7160e01b600052602160045260246000fd5b6001600160a01b0384168152606081016002841061150757634e487b7160e01b600052602160045260246000fd5b602082019390935260400152919050565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561154057600080fd5b8151801515811461122057600080fd5b60006001820161157057634e487b7160e01b600052601160045260246000fd5b5060010190565b6001600160a01b038416815260606020820181905260009061159b90830185611475565b82810360408401526115ad8185611475565b9695505050505050565b81356115c281611199565b81546001600160a01b031981166001600160a01b0392909216918217835560208401356115ee816111ae565b6002811061160c57634e487b7160e01b600052602160045260246000fd5b6001600160a81b03199190911690911760a09190911b60ff60a01b1617815560409190910135600190910155565b60006020828403121561164c57600080fd5b5051919050565b805160009060208084018383156114a557815187529582019590820190600101611489565b6bffffffffffffffffffffffff198860601b16815286601482015285603482015260006116c36116bd6116b76116b1605486018a611653565b88611653565b86611653565b84611653565b9998505050505050505050565b60005b838110156116eb5781810151838201526020016116d3565b50506000910152565b7f19457468657265756d205369676e6564204d6573736167653a0a00000000000081526000835161172c81601a8501602088016116d0565b83519083019061174381601a8401602088016116d0565b01601a0194935050505056fea2646970667358221220fdaee125f8c6e54c5ba04a025d0d6277a5f80b9567c60004ce1516353b02d65664736f6c63430008100033000000000000000000000000e30167956d09acdcb64fa4b1a2af93444c060f780000000000000000000000000e9e3eff16d2d19f5d7a04717d70b81f2c7465a5
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101005760003560e01c8063c093afdb11610097578063ed70543a11610066578063ed70543a14610230578063f2fde38b14610250578063f301af4214610263578063fbfa77cf146102af57600080fd5b8063c093afdb146101d0578063e3e3657d146101f7578063e7cf1ab71461020a578063ebb8d6c51461021d57600080fd5b80636c19e783116100d35780636c19e7831461017d578063715018a6146101905780638da5cb5b14610198578063912f8087146101a957600080fd5b8063238ac933146101055780633f957b64146101355780634a230cbd146101555780636817031b1461016a575b600080fd5b600354610118906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b610148610143366004611116565b6102c2565b60405161012c9190611153565b6101686101633660046111bb565b6103fb565b005b610168610178366004611203565b6104a6565b61016861018b366004611203565b6104d0565b6101686104fa565b6000546001600160a01b0316610118565b6101187f000000000000000000000000e30167956d09acdcb64fa4b1a2af93444c060f7881565b6101187f0000000000000000000000000e9e3eff16d2d19f5d7a04717d70b81f2c7465a581565b610168610205366004611297565b61050e565b610168610218366004611394565b610824565b61016861022b3660046113ad565b61084e565b61024361023e366004611116565b6108d3565b60405161012c91906114b0565b61016861025e366004611203565b610a00565b6102a0610271366004611394565b600260205260009081526040902080546001909101546001600160a01b03821691600160a01b900460ff169083565b60405161012c939291906114d9565b600454610118906001600160a01b031681565b60606000825167ffffffffffffffff8111156102e0576102e0611026565b604051908082528060200260200182016040528015610309578160200160208202803683370190505b50905060005b83518110156103f4577f000000000000000000000000e30167956d09acdcb64fa4b1a2af93444c060f786001600160a01b031663dcec329485838151811061035957610359611518565b60200260200101516040518263ffffffff1660e01b815260040161037f91815260200190565b602060405180830381865afa15801561039c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103c0919061152e565b8282815181106103d2576103d2611518565b91151560209283029190910190910152806103ec81611550565b91505061030f565b5092915050565b610403610a7b565b6040518060600160405280846001600160a01b0316815260200183600181111561042f5761042f6114c3565b8152602090810183905260008681526002825260409020825181546001600160a01b039091166001600160a01b031982168117835592840151919283916001600160a81b03191617600160a01b83600181111561048e5761048e6114c3565b02179055506040820151816001015590505050505050565b6104ae610a7b565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6104d8610a7b565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b610502610a7b565b61050c6000610ad5565b565b610516610b25565b61051f81610b7e565b80516040516367a5317360e01b81526001600160a01b037f000000000000000000000000e30167956d09acdcb64fa4b1a2af93444c060f7816916367a531739161056c91906004016114b0565b600060405180830381600087803b15801561058657600080fd5b505af115801561059a573d6000803e3d6000fd5b5050506020820151604080840151905163b92d248960e01b81526001600160a01b037f0000000000000000000000000e9e3eff16d2d19f5d7a04717d70b81f2c7465a516935063b92d2489926105f4923392600401611577565b600060405180830381600087803b15801561060e57600080fd5b505af1158015610622573d6000803e3d6000fd5b5050505060005b8160600151518110156108175760008260600151828151811061064e5761064e611518565b602090810291909101810151600081815260028352604080822081516060810190925280546001600160a01b03811683529395509193909290830190600160a01b900460ff1660018111156106a5576106a56114c3565b60018111156106b6576106b66114c3565b8152600191820154602090910152909150816020015160018111156106dd576106dd6114c3565b03610770578051600480546040808501519051637921219560e11b81526001600160a01b039283169381019390935233602484015260448301526001606483015260a06084830152600060a483015282169063f242432a9060c401600060405180830381600087803b15801561075257600080fd5b505af1158015610766573d6000803e3d6000fd5b5050505050610802565b600081602001516001811115610788576107886114c3565b036108025780516004805460408085015190516323b872dd60e01b81526001600160a01b039283169381019390935233602484015260448301528216906323b872dd90606401600060405180830381600087803b1580156107e857600080fd5b505af11580156107fc573d6000803e3d6000fd5b50505050505b5050808061080f90611550565b915050610629565b5061082160018055565b50565b61082c610a7b565b600090815260026020526040812080546001600160a81b031916815560010155565b610856610a7b565b60005b838110156108cc57600085858381811061087557610875611518565b90506020020135905083838381811061089057610890611518565b9050606002016002600083815260200190815260200160002081816108b591906115b7565b9050505080806108c490611550565b915050610859565b5050505050565b60606000825167ffffffffffffffff8111156108f1576108f1611026565b60405190808252806020026020018201604052801561091a578160200160208202803683370190505b50905060005b83518110156103f4577f000000000000000000000000e30167956d09acdcb64fa4b1a2af93444c060f786001600160a01b0316634f062c5a85838151811061096a5761096a611518565b60200260200101516040518263ffffffff1660e01b815260040161099091815260200190565b602060405180830381865afa1580156109ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109d1919061163a565b8282815181106109e3576109e3611518565b6020908102919091010152806109f881611550565b915050610920565b610a08610a7b565b6001600160a01b038116610a725760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b61082181610ad5565b6000546001600160a01b0316331461050c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a69565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600260015403610b775760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a69565b6002600155565b610bda8160800151610bd4338460000151518560200151518660000151876020015188604001518960600151604051602001610bc09796959493929190611678565b604051602081830303815290604052610c08565b90610c43565b6003546001600160a01b0390811691161461082157604051638baa579f60e01b815260040160405180910390fd5b6000610c148251610c67565b82604051602001610c269291906116f4565b604051602081830303815290604052805190602001209050919050565b6000806000610c528585610cfa565b91509150610c5f81610d3f565b509392505050565b60606000610c7483610e89565b600101905060008167ffffffffffffffff811115610c9457610c94611026565b6040519080825280601f01601f191660200182016040528015610cbe576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084610cc857509392505050565b6000808251604103610d305760208301516040840151606085015160001a610d2487828585610f62565b94509450505050610d38565b506000905060025b9250929050565b6000816004811115610d5357610d536114c3565b03610d5b5750565b6001816004811115610d6f57610d6f6114c3565b03610dbc5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610a69565b6002816004811115610dd057610dd06114c3565b03610e1d5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610a69565b6003816004811115610e3157610e316114c3565b036108215760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610a69565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310610ec85772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310610ef4576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310610f1257662386f26fc10000830492506010015b6305f5e1008310610f2a576305f5e100830492506008015b6127108310610f3e57612710830492506004015b60648310610f50576064830492506002015b600a8310610f5c576001015b92915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115610f99575060009050600361101d565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610fed573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166110165760006001925092505061101d565b9150600090505b94509492505050565b634e487b7160e01b600052604160045260246000fd5b60405160a0810167ffffffffffffffff8111828210171561105f5761105f611026565b60405290565b604051601f8201601f1916810167ffffffffffffffff8111828210171561108e5761108e611026565b604052919050565b600082601f8301126110a757600080fd5b8135602067ffffffffffffffff8211156110c3576110c3611026565b8160051b6110d2828201611065565b92835284810182019282810190878511156110ec57600080fd5b83870192505b8483101561110b578235825291830191908301906110f2565b979650505050505050565b60006020828403121561112857600080fd5b813567ffffffffffffffff81111561113f57600080fd5b61114b84828501611096565b949350505050565b6020808252825182820181905260009190848201906040850190845b8181101561118d57835115158352928401929184019160010161116f565b50909695505050505050565b6001600160a01b038116811461082157600080fd5b6002811061082157600080fd5b600080600080608085870312156111d157600080fd5b8435935060208501356111e381611199565b925060408501356111f3816111ae565b9396929550929360600135925050565b60006020828403121561121557600080fd5b813561122081611199565b9392505050565b600082601f83011261123857600080fd5b813567ffffffffffffffff81111561125257611252611026565b611265601f8201601f1916602001611065565b81815284602083860101111561127a57600080fd5b816020850160208301376000918101602001919091529392505050565b6000602082840312156112a957600080fd5b813567ffffffffffffffff808211156112c157600080fd5b9083019060a082860312156112d557600080fd5b6112dd61103c565b8235828111156112ec57600080fd5b6112f887828601611096565b82525060208301358281111561130d57600080fd5b61131987828601611096565b60208301525060408301358281111561133157600080fd5b61133d87828601611096565b60408301525060608301358281111561135557600080fd5b61136187828601611096565b60608301525060808301358281111561137957600080fd5b61138587828601611227565b60808301525095945050505050565b6000602082840312156113a657600080fd5b5035919050565b600080600080604085870312156113c357600080fd5b843567ffffffffffffffff808211156113db57600080fd5b818701915087601f8301126113ef57600080fd5b8135818111156113fe57600080fd5b8860208260051b850101111561141357600080fd5b60209283019650945090860135908082111561142e57600080fd5b818701915087601f83011261144257600080fd5b81358181111561145157600080fd5b88602060608302850101111561146657600080fd5b95989497505060200194505050565b600081518084526020808501945080840160005b838110156114a557815187529582019590820190600101611489565b509495945050505050565b6020815260006112206020830184611475565b634e487b7160e01b600052602160045260246000fd5b6001600160a01b0384168152606081016002841061150757634e487b7160e01b600052602160045260246000fd5b602082019390935260400152919050565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561154057600080fd5b8151801515811461122057600080fd5b60006001820161157057634e487b7160e01b600052601160045260246000fd5b5060010190565b6001600160a01b038416815260606020820181905260009061159b90830185611475565b82810360408401526115ad8185611475565b9695505050505050565b81356115c281611199565b81546001600160a01b031981166001600160a01b0392909216918217835560208401356115ee816111ae565b6002811061160c57634e487b7160e01b600052602160045260246000fd5b6001600160a81b03199190911690911760a09190911b60ff60a01b1617815560409190910135600190910155565b60006020828403121561164c57600080fd5b5051919050565b805160009060208084018383156114a557815187529582019590820190600101611489565b6bffffffffffffffffffffffff198860601b16815286601482015285603482015260006116c36116bd6116b76116b1605486018a611653565b88611653565b86611653565b84611653565b9998505050505050505050565b60005b838110156116eb5781810151838201526020016116d3565b50506000910152565b7f19457468657265756d205369676e6564204d6573736167653a0a00000000000081526000835161172c81601a8501602088016116d0565b83519083019061174381601a8401602088016116d0565b01601a0194935050505056fea2646970667358221220fdaee125f8c6e54c5ba04a025d0d6277a5f80b9567c60004ce1516353b02d65664736f6c63430008100033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000e30167956d09acdcb64fa4b1a2af93444c060f780000000000000000000000000e9e3eff16d2d19f5d7a04717d70b81f2c7465a5
-----Decoded View---------------
Arg [0] : krystals (address): 0xe30167956D09aCDcB64FA4B1a2aF93444c060f78
Arg [1] : traits (address): 0x0e9E3eFF16d2d19f5d7a04717d70b81f2C7465A5
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000e30167956d09acdcb64fa4b1a2af93444c060f78
Arg [1] : 0000000000000000000000000e9e3eff16d2d19f5d7a04717d70b81f2c7465a5
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
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.