Overview
ETH Balance
ETH Value
$0.00Latest 5 from a total of 5 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Update Deposit C... | 19246529 | 256 days ago | IN | 0 ETH | 0.00000004 | ||||
| Update Generator... | 4428639 | 599 days ago | IN | 0 ETH | 0.00009505 | ||||
| Update Generator... | 4034294 | 608 days ago | IN | 0 ETH | 0.00000007 | ||||
| Update Generator... | 240717 | 696 days ago | IN | 0 ETH | 0.00017705 | ||||
| Update Deposit C... | 240713 | 696 days ago | IN | 0 ETH | 0.00029565 |
Latest 25 internal transactions (View All)
| Parent Transaction Hash | Block | From | To | ||||
|---|---|---|---|---|---|---|---|
| 19246636 | 256 days ago | 0 ETH | |||||
| 19246636 | 256 days ago | 0 ETH | |||||
| 19246633 | 256 days ago | 0 ETH | |||||
| 19246633 | 256 days ago | 0 ETH | |||||
| 19246633 | 256 days ago | 0 ETH | |||||
| 19246633 | 256 days ago | 0 ETH | |||||
| 19246605 | 256 days ago | 0 ETH | |||||
| 19246605 | 256 days ago | 0 ETH | |||||
| 19246602 | 256 days ago | 0 ETH | |||||
| 19246602 | 256 days ago | 0 ETH | |||||
| 19246602 | 256 days ago | 0 ETH | |||||
| 19246602 | 256 days ago | 0 ETH | |||||
| 16406267 | 322 days ago | 0 ETH | |||||
| 16406267 | 322 days ago | 0 ETH | |||||
| 16406265 | 322 days ago | 0 ETH | |||||
| 16406265 | 322 days ago | 0 ETH | |||||
| 16406265 | 322 days ago | 0 ETH | |||||
| 16406265 | 322 days ago | 0 ETH | |||||
| 16406253 | 322 days ago | 0 ETH | |||||
| 16406253 | 322 days ago | 0 ETH | |||||
| 16406251 | 322 days ago | 0 ETH | |||||
| 16406251 | 322 days ago | 0 ETH | |||||
| 16406251 | 322 days ago | 0 ETH | |||||
| 16406251 | 322 days ago | 0 ETH | |||||
| 16406222 | 322 days ago | 0 ETH |
Cross-Chain Transactions
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity 0.8.19;
import {ReentrancyGuard} from "./ReentrancyGuard.sol";
import {IDepositContract} from "./IDepositContract.sol";
import {Ownable2Step} from "./Ownable2Step.sol";
import {ISupraRouterContract} from "./ISupraRouterContract.sol";
import {CheckContractAddress} from "./CheckContractAddress.sol";
/// @title VRF Router Contract
/// @author Supra Developer
/// @notice You can use this contract to interact with VRF Generator contract & Client contract
/// @dev All function calls are currently implemented without side effects
contract SupraRouterContract is
ReentrancyGuard,
Ownable2Step,
ISupraRouterContract,
CheckContractAddress
{
/// @dev nonce is an incremental counter which is associated with request
uint256 internal _nonce = 0;
/// @dev Generator contract address to forward random number request
address public _supraGeneratorContract;
/// @dev To put constraint on generator contract upgradability
bool private _upgradable;
///@dev Deposit Contract address to check fund details of relevant user
address public _depositContract;
IDepositContract public depositContract;
constructor() {
_upgradable = true;
}
///@notice This function is for updating the Deposit Contract Address
///@dev To update deposit contract address
///@param _contractAddress contract address of the deposit/new deposit contract
function updateDepositContract(address _contractAddress)
external
onlyOwner
{
require(
isContract(_contractAddress),
"Deposit contract address cannot be EOA"
);
require(
_contractAddress != address(0),
"Deposit contract address cannot be a zero address"
);
_depositContract = _contractAddress;
depositContract = IDepositContract(_contractAddress);
}
/// @notice This function is updating the generator contract address
/// @dev To update the generator contract address
/// @param _contractAddress contract address of new generator contract
function updateGeneratorContract(address _contractAddress)
external
onlyOwner
{
require(
isContract(_contractAddress),
"Generator contract address cannot be EOA"
);
require(
_contractAddress != address(0),
"Generator contract address cannot be a zero address"
);
require(_upgradable, "Generator contract address cannot be updated");
_supraGeneratorContract = _contractAddress;
}
/// @notice By calling this function updation of generator contract address functionality would stop
/// @dev It will freeze the upgradability of Generator contract address
function freezeUpgradability() external onlyOwner {
_upgradable = false;
}
/// @notice It will Generate the random number request to generator contract
/// @dev It will forward the random number generation request by calling generator contracts function
/// @param _functionSig A combination of a function and the types of parameters it takes, combined together as a string with no spaces
/// @param _rngCount Number of random numbers requested
/// @param _numConfirmations Number of Confirmations
/// @return _nonce nonce is an incremental counter which is associated with request
function generateRequest(
string memory _functionSig,
uint8 _rngCount,
uint256 _numConfirmations,
address _clientWalletAddress
) external override nonReentrant returns (uint256) {
return
generateRequest(
_functionSig,
_rngCount,
_numConfirmations,
0,
_clientWalletAddress
);
}
/// @notice It will Generate the random number request to generator contract with client's randomness added
/// @dev It will forward the random number generation request by calling generator contracts function which takes seed value other than required parameter to add randomness
/// @param _functionSig A combination of a function and the types of parameters it takes, combined together as a string with no spaces
/// @param _rngCount Number of random numbers requested
/// @param _numConfirmations Number of Confirmations
/// @param _clientSeed Use of this is to add some extra randomness
/// @return _nonce nonce is an incremental counter which is associated with request
function generateRequest(
string memory _functionSig,
uint8 _rngCount,
uint256 _numConfirmations,
uint256 _clientSeed,
address _clientWalletAddress
) public override returns (uint256) {
//_functionSig should be in a format such that it should carry the parameter type altogether
require(
depositContract.isContractEligible(
_clientWalletAddress,
msg.sender
),
"Contract not eligible to request"
);
require(
!depositContract.isMinimumBalanceReached(_clientWalletAddress),
"Insufficient Funds: Minimum balance reached for request"
);
bytes memory _functionSigbytes = bytes(_functionSig);
require(_rngCount > 0, "Invalid rngCount");
require(_numConfirmations >= 0, "Invalid numConfirmations");
require(_functionSigbytes.length > 0, "Invalid functionSig");
_nonce++;
// we want to cap the number of confirmations to 20
// if (_numConfirmations >= 0) {
// _numConfirmations = 0;
// }
if (_numConfirmations > 20) {
_numConfirmations = 20;
}
uint256 nonce_ = _nonce;
(bool _success, bytes memory _data) = _supraGeneratorContract.call(
abi.encodeWithSignature(
"rngRequest(uint256,string,uint8,address,uint256,uint256,address)",
nonce_,
_functionSig,
_rngCount,
msg.sender,
_numConfirmations,
_clientSeed,
_clientWalletAddress
)
);
require(_success, "Generator Contract call failed");
return _nonce;
}
/// @notice This is the call back function to serve random number request
/// @dev This function will be called from generator contract address to fulfill random number request which goes to client contract
/// @param nonce nonce is an incremental counter which is associated with request
/// @param _clientContractAddress Actual contract address from which request has been generated
/// @param _functionSig A combination of a function and the types of parameters it takes, combined together as a string with no spaces
/// @return success bool variable which shows the status of request
/// @return data data getting from client contract address
function rngCallback(
uint256 nonce,
uint256[] memory rngList,
address _clientContractAddress,
string memory _functionSig
) public returns (bool, bytes memory) {
require(
msg.sender == _supraGeneratorContract,
"Caller cannot generate the callback"
);
(bool success, bytes memory data) = _clientContractAddress.call(
abi.encodeWithSignature(_functionSig, nonce, rngList)
);
return (success, data);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)
pragma solidity 0.8.19;
/**
* @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;
}
/**
* @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
* `nonReentrant` function in the call stack.
*/
function _reentrancyGuardEntered() internal view returns (bool) {
return _status == _ENTERED;
}
}// INSTRUCTIONS : Contains methods that will be used by the ROUTER and GENERATOR contracts.
// SPDX-License-Identifier: MIT
pragma solidity 0.8.19;
interface IDepositContract {
function isContractEligible(address _clientAddress, address _contractAddress) external view returns (bool);
function isMinimumBalanceReached(address _clientAddress) external view returns (bool);
function checkMinBalance(address _clientAddress) external view returns (uint256);
function checkClientFund(address _clientAddress) external view returns (uint256);
function collectFund(address _clientAddress, uint256 _amount) external;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (access/Ownable2Step.sol)
pragma solidity 0.8.19;
import "./Ownable.sol";
/**
* @dev Contract module which provides 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} and {acceptOwnership}.
*
* This module is used through inheritance. It will make available all functions
* from parent (Ownable).
*/
abstract contract Ownable2Step is Ownable {
address private _pendingOwner;
event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);
/**
* @dev Returns the address of the pending owner.
*/
function pendingOwner() public view virtual returns (address) {
return _pendingOwner;
}
/**
* @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one.
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual override onlyOwner {
_pendingOwner = newOwner;
emit OwnershipTransferStarted(owner(), newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner.
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual override {
delete _pendingOwner;
super._transferOwnership(newOwner);
}
/**
* @dev The new owner accepts the ownership transfer.
*/
function acceptOwnership() public virtual {
address sender = _msgSender();
require(pendingOwner() == sender, "Ownable2Step: caller is not the new owner");
_transferOwnership(sender);
}
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.19;
interface ISupraRouterContract {
function generateRequest(
string memory _functionSig,
uint8 _rngCount,
uint256 _numConfirmations,
uint256 _clientSeed,
address _clientWalletAddress
) external returns (uint256);
function generateRequest(
string memory _functionSig,
uint8 _rngCount,
uint256 _numConfirmations,
address _clientWalletAddress
) external returns (uint256);
function rngCallback(
uint256 nonce,
uint256[] memory rngList,
address _clientContractAddress,
string memory _functionSig
) external returns (bool, bytes memory) ;
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.19;
contract CheckContractAddress {
/// @dev Returns a boolean indicating whether the given address is a contract or not.
/// @param _addr The address to be checked.
/// @return A boolean indicating whether the given address is a contract or not.
function isContract(address _addr) internal view returns (bool) {
uint256 size;
assembly {
size := extcodesize(_addr)
}
return size > 0;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)
pragma solidity 0.8.19;
import "./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 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 v4.4.1 (utils/Context.sol)
pragma solidity 0.8.19;
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}{
"remappings": [
"ds-test/=lib/forge-std/lib/ds-test/src/",
"forge-std/=lib/forge-std/src/"
],
"viaIR": true,
"optimizer": {
"enabled": true,
"runs": 200
},
"metadata": {
"useLiteralContent": false,
"bytecodeHash": "ipfs",
"appendCBOR": true
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"abi"
]
}
},
"evmVersion": "paris",
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"_depositContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_supraGeneratorContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"depositContract","outputs":[{"internalType":"contract IDepositContract","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freezeUpgradability","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_functionSig","type":"string"},{"internalType":"uint8","name":"_rngCount","type":"uint8"},{"internalType":"uint256","name":"_numConfirmations","type":"uint256"},{"internalType":"uint256","name":"_clientSeed","type":"uint256"},{"internalType":"address","name":"_clientWalletAddress","type":"address"}],"name":"generateRequest","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_functionSig","type":"string"},{"internalType":"uint8","name":"_rngCount","type":"uint8"},{"internalType":"uint256","name":"_numConfirmations","type":"uint256"},{"internalType":"address","name":"_clientWalletAddress","type":"address"}],"name":"generateRequest","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256[]","name":"rngList","type":"uint256[]"},{"internalType":"address","name":"_clientContractAddress","type":"address"},{"internalType":"string","name":"_functionSig","type":"string"}],"name":"rngCallback","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"}],"name":"updateDepositContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"}],"name":"updateGeneratorContract","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
608080604052346100825760016000818155600280546001600160a01b03199081169091558254908116339081179093556001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a360006003556004805460ff60a01b1916600160a01b179055610ff190816100888239f35b600080fdfe6040608081526004908136101561001557600080fd5b600090813560e01c80632932f04114610cb1578063660db17514610c8957806379ba509714610bbd5780638da5cb5b14610b95578063a1fa0c2d14610b6d578063b7b3243a1461082f578063c55dc8fa14610807578063d291ba0914610462578063df9d902814610352578063e30c39781461032a578063e94ad65b14610302578063f2fde38b146102915763f3c21ee0146100b057600080fd5b3461028d57608036600319011261028d57602491823567ffffffffffffffff8082116102895736602383011215610289578186013594818611610278578560051b96855193602097610104898b0187610e30565b855287850183819a8301019136831161026057848a9101915b838310610268575050604435956001600160a01b03949092509050838616860361026457606435858111610260576101589036908501610e84565b9383541633036102135787518451948a01949094206001600160e01b031916948411610202578884019485526064840192359084015286604484015251809152608482019790855b8181106101ee575050509083826101c78295946101ea98999a03601f198101835282610e30565b51925af1916101d4610f8b565b9080805195869515158652850152830190610edb565b0390f35b82518a5298880198918801916001016101a0565b634e487b7160e01b87526041835286fd5b8260236084928b8b519362461bcd60e51b85528401528201527f43616c6c65722063616e6e6f742067656e6572617465207468652063616c6c6260448201526261636b60e81b6064820152fd5b8780fd5b8680fd5b82358152918101918a910161011d565b634e487b7160e01b84526041875283fd5b8280fd5b5080fd5b82346102ff5760203660031901126102ff576102ab610e15565b6102b3610f1b565b600280546001600160a01b0319166001600160a01b039283169081179091556001549091167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227008380a380f35b80fd5b503461028d578160031936011261028d5760065490516001600160a01b039091168152602090f35b503461028d578160031936011261028d5760025490516001600160a01b039091168152602090f35b5082346102895760203660031901126102895761036d610e15565b610375610f1b565b803b15610410576001600160a01b03169182156103b35750506bffffffffffffffffffffffff60a01b81816005541617600555600654161760065580f35b906020608492519162461bcd60e51b8352820152603160248201527f4465706f73697420636f6e747261637420616464726573732063616e6e6f742060448201527062652061207a65726f206164647265737360781b6064820152fd5b506020608492519162461bcd60e51b8352820152602660248201527f4465706f73697420636f6e747261637420616464726573732063616e6e6f7420604482015265626520454f4160d01b6064820152fd5b503461028d57608036600319011261028d57823567ffffffffffffffff8111610289576104929036908501610e84565b61049a610ecb565b604490813560649384359060018060a01b038083168093036108035760028954146107c2579089959493929160028a558391816006541695848b519d8e636012107960e11b815201526024968d883391015260209d8e818b81855afa9081156107b6578f8f92610799575b505015610758578d86898c8f51948593849263263cc27360e21b84528301525afa90811561074e578e8e92610721575b50506106c05760ff1691821561068a5781511561065157600354600019811461063f578d8b8e9893978e978b978b9a978f8f90998d9a601460016105d59b019b8c60035511610636575b9160e0916105ad949354169d519a8b998a019d8e63a5e36129851b90528a0152880152610104870190610edb565b9385015233608485015260a48401528560c484015260e483015203601f198101835282610e30565b51925af16105e1610f8b565b50156105f857505050506001600354925551908152f35b845162461bcd60e51b8152928301879052601e908301527f47656e657261746f7220436f6e74726163742063616c6c206661696c6564000090820152fd5b6014955061057f565b634e487b7160e01b8d5260118a52878dfd5b50505050505090601372496e76616c69642066756e6374696f6e53696760681b928887519562461bcd60e51b8752860152840152820152fd5b5050505050509060106f125b9d985b1a59081c9b99d0dbdd5b9d60821b928887519562461bcd60e51b8752860152840152820152fd5b50895162461bcd60e51b81528089018d90526037818801527f496e73756666696369656e742046756e64733a204d696e696d756d2062616c6181890152761b98d9481c995858da195908199bdc881c995c5d595cdd604a1b818b0152608490fd5b6107409250803d10610747575b6107388183610e30565b810190610f73565b388e610535565b503d61072e565b8c513d8f823e3d90fd5b50505087877f436f6e7472616374206e6f7420656c696769626c6520746f2072657175657374888e89818f519562461bcd60e51b8752860152840152820152fd5b6107af9250803d10610747576107388183610e30565b388f610505565b8e8e51903d90823e3d90fd5b875162461bcd60e51b81526020818c0152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00818801528790fd5b8880fd5b503461028d578160031936011261028d5760055490516001600160a01b039091168152602090f35b5082346102895760a036600319011261028957803567ffffffffffffffff8111610b69576108609036908301610e84565b92610869610ecb565b9360449182356001600160a01b0360843581811690819003610b69578282600654169589519a636012107960e11b8c52838a8d01526024978c893391015260209c8d818c81855afa908115610b5f578e8a92610b42575b505015610b00578c858a8d8f51948593849263263cc27360e21b84528301525afa908115610af6578891610ad9575b50610a765760ff16938415610a4057815115610a075760035460001981146109f5578b9589958b8f93968b9a968f9661098e97601460018f9c019a8b600355116109ec575b9360e091610962949554169c51998a9889019c8d63a5e36129851b9052890152870152610104860190610edb565b92606485015233608485015260a484015260643560c484015260e483015203601f198101835282610e30565b51925af161099a610f8b565b50156109ad575050506003549051908152f35b601e906064957f47656e657261746f7220436f6e74726163742063616c6c206661696c656400009495519562461bcd60e51b8752860152840152820152fd5b60149350610934565b634e487b7160e01b885260118b528888fd5b5050885162461bcd60e51b81528089018b905260138188015272496e76616c69642066756e6374696f6e53696760681b81890152606490fd5b5050885162461bcd60e51b81528089018b90526010818801526f125b9d985b1a59081c9b99d0dbdd5b9d60821b81890152606490fd5b5050885162461bcd60e51b81528089018b90526037818801527f496e73756666696369656e742046756e64733a204d696e696d756d2062616c6181890152761b98d9481c995858da195908199bdc881c995c5d595cdd604a1b6064820152608490fd5b610af091508d803d10610747576107388183610e30565b8d6108ef565b8c513d8a823e3d90fd5b508a5162461bcd60e51b8152808b018d90528089018d90527f436f6e7472616374206e6f7420656c696769626c6520746f2072657175657374818b0152606490fd5b610b589250803d10610747576107388183610e30565b8e8e6108c0565b8d513d8b823e3d90fd5b8380fd5b5082346102895782600319360112610289575490516001600160a01b03909116815260209150f35b503461028d578160031936011261028d5760015490516001600160a01b039091168152602090f35b50829034610289578260031936011261028957600254916001600160a01b03913383851603610c345750506bffffffffffffffffffffffff60a01b8092166002556001549133908316176001553391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b906020608492519162461bcd60e51b8352820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b6064820152fd5b82843461028d578160031936011261028d57610ca3610f1b565b805460ff60a01b1916905580f35b5082903461028957602036600319011261028957610ccd610e15565b610cd5610f1b565b803b15610dc1576001600160a01b0316908115610d635782549060ff8260a01c1615610d0c57506001600160a01b03191617905580f35b5162461bcd60e51b8152602081850152602c60248201527f47656e657261746f7220636f6e747261637420616464726573732063616e6e6f60448201526b1d081899481d5c19185d195960a21b6064820152608490fd5b5162461bcd60e51b8152602081840152603360248201527f47656e657261746f7220636f6e747261637420616464726573732063616e6e6f604482015272742062652061207a65726f206164647265737360681b6064820152608490fd5b815162461bcd60e51b8152602081850152602860248201527f47656e657261746f7220636f6e747261637420616464726573732063616e6e6f6044820152677420626520454f4160c01b6064820152608490fd5b600435906001600160a01b0382168203610e2b57565b600080fd5b90601f8019910116810190811067ffffffffffffffff821117610e5257604052565b634e487b7160e01b600052604160045260246000fd5b67ffffffffffffffff8111610e5257601f01601f191660200190565b81601f82011215610e2b57803590610e9b82610e68565b92610ea96040519485610e30565b82845260208383010111610e2b57816000926020809301838601378301015290565b6024359060ff82168203610e2b57565b919082519283825260005b848110610f07575050826000602080949584010152601f8019910116010190565b602081830181015184830182015201610ee6565b6001546001600160a01b03163303610f2f57565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b90816020910312610e2b57518015158103610e2b5790565b3d15610fb6573d90610f9c82610e68565b91610faa6040519384610e30565b82523d6000602084013e565b60609056fea2646970667358221220ae76edba4d971cd6d304ad24d0945b1c79ad970403148b99f59d66bb33ddea1c64736f6c63430008130033
Deployed Bytecode
0x6040608081526004908136101561001557600080fd5b600090813560e01c80632932f04114610cb1578063660db17514610c8957806379ba509714610bbd5780638da5cb5b14610b95578063a1fa0c2d14610b6d578063b7b3243a1461082f578063c55dc8fa14610807578063d291ba0914610462578063df9d902814610352578063e30c39781461032a578063e94ad65b14610302578063f2fde38b146102915763f3c21ee0146100b057600080fd5b3461028d57608036600319011261028d57602491823567ffffffffffffffff8082116102895736602383011215610289578186013594818611610278578560051b96855193602097610104898b0187610e30565b855287850183819a8301019136831161026057848a9101915b838310610268575050604435956001600160a01b03949092509050838616860361026457606435858111610260576101589036908501610e84565b9383541633036102135787518451948a01949094206001600160e01b031916948411610202578884019485526064840192359084015286604484015251809152608482019790855b8181106101ee575050509083826101c78295946101ea98999a03601f198101835282610e30565b51925af1916101d4610f8b565b9080805195869515158652850152830190610edb565b0390f35b82518a5298880198918801916001016101a0565b634e487b7160e01b87526041835286fd5b8260236084928b8b519362461bcd60e51b85528401528201527f43616c6c65722063616e6e6f742067656e6572617465207468652063616c6c6260448201526261636b60e81b6064820152fd5b8780fd5b8680fd5b82358152918101918a910161011d565b634e487b7160e01b84526041875283fd5b8280fd5b5080fd5b82346102ff5760203660031901126102ff576102ab610e15565b6102b3610f1b565b600280546001600160a01b0319166001600160a01b039283169081179091556001549091167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227008380a380f35b80fd5b503461028d578160031936011261028d5760065490516001600160a01b039091168152602090f35b503461028d578160031936011261028d5760025490516001600160a01b039091168152602090f35b5082346102895760203660031901126102895761036d610e15565b610375610f1b565b803b15610410576001600160a01b03169182156103b35750506bffffffffffffffffffffffff60a01b81816005541617600555600654161760065580f35b906020608492519162461bcd60e51b8352820152603160248201527f4465706f73697420636f6e747261637420616464726573732063616e6e6f742060448201527062652061207a65726f206164647265737360781b6064820152fd5b506020608492519162461bcd60e51b8352820152602660248201527f4465706f73697420636f6e747261637420616464726573732063616e6e6f7420604482015265626520454f4160d01b6064820152fd5b503461028d57608036600319011261028d57823567ffffffffffffffff8111610289576104929036908501610e84565b61049a610ecb565b604490813560649384359060018060a01b038083168093036108035760028954146107c2579089959493929160028a558391816006541695848b519d8e636012107960e11b815201526024968d883391015260209d8e818b81855afa9081156107b6578f8f92610799575b505015610758578d86898c8f51948593849263263cc27360e21b84528301525afa90811561074e578e8e92610721575b50506106c05760ff1691821561068a5781511561065157600354600019811461063f578d8b8e9893978e978b978b9a978f8f90998d9a601460016105d59b019b8c60035511610636575b9160e0916105ad949354169d519a8b998a019d8e63a5e36129851b90528a0152880152610104870190610edb565b9385015233608485015260a48401528560c484015260e483015203601f198101835282610e30565b51925af16105e1610f8b565b50156105f857505050506001600354925551908152f35b845162461bcd60e51b8152928301879052601e908301527f47656e657261746f7220436f6e74726163742063616c6c206661696c6564000090820152fd5b6014955061057f565b634e487b7160e01b8d5260118a52878dfd5b50505050505090601372496e76616c69642066756e6374696f6e53696760681b928887519562461bcd60e51b8752860152840152820152fd5b5050505050509060106f125b9d985b1a59081c9b99d0dbdd5b9d60821b928887519562461bcd60e51b8752860152840152820152fd5b50895162461bcd60e51b81528089018d90526037818801527f496e73756666696369656e742046756e64733a204d696e696d756d2062616c6181890152761b98d9481c995858da195908199bdc881c995c5d595cdd604a1b818b0152608490fd5b6107409250803d10610747575b6107388183610e30565b810190610f73565b388e610535565b503d61072e565b8c513d8f823e3d90fd5b50505087877f436f6e7472616374206e6f7420656c696769626c6520746f2072657175657374888e89818f519562461bcd60e51b8752860152840152820152fd5b6107af9250803d10610747576107388183610e30565b388f610505565b8e8e51903d90823e3d90fd5b875162461bcd60e51b81526020818c0152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00818801528790fd5b8880fd5b503461028d578160031936011261028d5760055490516001600160a01b039091168152602090f35b5082346102895760a036600319011261028957803567ffffffffffffffff8111610b69576108609036908301610e84565b92610869610ecb565b9360449182356001600160a01b0360843581811690819003610b69578282600654169589519a636012107960e11b8c52838a8d01526024978c893391015260209c8d818c81855afa908115610b5f578e8a92610b42575b505015610b00578c858a8d8f51948593849263263cc27360e21b84528301525afa908115610af6578891610ad9575b50610a765760ff16938415610a4057815115610a075760035460001981146109f5578b9589958b8f93968b9a968f9661098e97601460018f9c019a8b600355116109ec575b9360e091610962949554169c51998a9889019c8d63a5e36129851b9052890152870152610104860190610edb565b92606485015233608485015260a484015260643560c484015260e483015203601f198101835282610e30565b51925af161099a610f8b565b50156109ad575050506003549051908152f35b601e906064957f47656e657261746f7220436f6e74726163742063616c6c206661696c656400009495519562461bcd60e51b8752860152840152820152fd5b60149350610934565b634e487b7160e01b885260118b528888fd5b5050885162461bcd60e51b81528089018b905260138188015272496e76616c69642066756e6374696f6e53696760681b81890152606490fd5b5050885162461bcd60e51b81528089018b90526010818801526f125b9d985b1a59081c9b99d0dbdd5b9d60821b81890152606490fd5b5050885162461bcd60e51b81528089018b90526037818801527f496e73756666696369656e742046756e64733a204d696e696d756d2062616c6181890152761b98d9481c995858da195908199bdc881c995c5d595cdd604a1b6064820152608490fd5b610af091508d803d10610747576107388183610e30565b8d6108ef565b8c513d8a823e3d90fd5b508a5162461bcd60e51b8152808b018d90528089018d90527f436f6e7472616374206e6f7420656c696769626c6520746f2072657175657374818b0152606490fd5b610b589250803d10610747576107388183610e30565b8e8e6108c0565b8d513d8b823e3d90fd5b8380fd5b5082346102895782600319360112610289575490516001600160a01b03909116815260209150f35b503461028d578160031936011261028d5760015490516001600160a01b039091168152602090f35b50829034610289578260031936011261028957600254916001600160a01b03913383851603610c345750506bffffffffffffffffffffffff60a01b8092166002556001549133908316176001553391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b906020608492519162461bcd60e51b8352820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b6064820152fd5b82843461028d578160031936011261028d57610ca3610f1b565b805460ff60a01b1916905580f35b5082903461028957602036600319011261028957610ccd610e15565b610cd5610f1b565b803b15610dc1576001600160a01b0316908115610d635782549060ff8260a01c1615610d0c57506001600160a01b03191617905580f35b5162461bcd60e51b8152602081850152602c60248201527f47656e657261746f7220636f6e747261637420616464726573732063616e6e6f60448201526b1d081899481d5c19185d195960a21b6064820152608490fd5b5162461bcd60e51b8152602081840152603360248201527f47656e657261746f7220636f6e747261637420616464726573732063616e6e6f604482015272742062652061207a65726f206164647265737360681b6064820152608490fd5b815162461bcd60e51b8152602081850152602860248201527f47656e657261746f7220636f6e747261637420616464726573732063616e6e6f6044820152677420626520454f4160c01b6064820152608490fd5b600435906001600160a01b0382168203610e2b57565b600080fd5b90601f8019910116810190811067ffffffffffffffff821117610e5257604052565b634e487b7160e01b600052604160045260246000fd5b67ffffffffffffffff8111610e5257601f01601f191660200190565b81601f82011215610e2b57803590610e9b82610e68565b92610ea96040519485610e30565b82845260208383010111610e2b57816000926020809301838601378301015290565b6024359060ff82168203610e2b57565b919082519283825260005b848110610f07575050826000602080949584010152601f8019910116010190565b602081830181015184830182015201610ee6565b6001546001600160a01b03163303610f2f57565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b90816020910312610e2b57518015158103610e2b5790565b3d15610fb6573d90610f9c82610e68565b91610faa6040519384610e30565b82523d6000602084013e565b60609056fea2646970667358221220ae76edba4d971cd6d304ad24d0945b1c79ad970403148b99f59d66bb33ddea1c64736f6c63430008130033
Deployed Bytecode Sourcemap
580:6902:7:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4878:114;580:6902;4878:114;;;580:6902;;;;;4878:114;580:6902;4878:114;;;580:6902;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;580:6902:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;580:6902:7;;;-1:-1:-1;;;;;580:6902:7;;;-1:-1:-1;580:6902:7;-1:-1:-1;580:6902:7;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;7193:10;:37;580:6902;;;;;;;;;7378:53;;;;-1:-1:-1;;;;;;580:6902:7;;;;;;7378:53;;;;;;580:6902;;;;;7378:53;;;580:6902;;;;;;;;;;;;;;;;;;;;;;7378:53;;;;;;;;;;580:6902;7378:53;;;;5852:332;;7378:53;;;;;;:::i;:::-;7337:104;;;;;;;:::i;:::-;580:6902;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;580:6902:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;580:6902:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;580:6902:7;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;580:6902:7;;;;;;:::i;:::-;1056:62:4;;:::i;:::-;1228:24:5;580:6902:7;;-1:-1:-1;;;;;;580:6902:7;-1:-1:-1;;;;;580:6902:7;;;;;;;;;;;;;;1267:43:5;;;;580:6902:7;;;;;;;;;;;;;;;;;;1133:39;580:6902;;;-1:-1:-1;;;;;580:6902:7;;;;;;;;;;;;;;;;;;;;;926:13:5;580:6902:7;;;-1:-1:-1;;;;;580:6902:7;;;;;;;;;;;;;;;;-1:-1:-1;;580:6902:7;;;;;;:::i;:::-;1056:62:4;;:::i;:::-;412:59:0;;487:8;580:6902:7;;-1:-1:-1;;;;;580:6902:7;;1681:30;;580:6902;;;;;;;;;1796:35;580:6902;;;1796:35;580:6902;1841:52;580:6902;;;1841:52;580:6902;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;580:6902:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;580:6902:7;;;;;;;;;;;;-1:-1:-1;;580:6902:7;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;1759:1:6;580:6902:7;;2468:19:6;1759:1;;;;;;;;;;;;3647:154:7;580:6902;;4878:15;580:6902;;;;;;;;;;;4878:114;;;580:6902;;4968:10;;;;580:6902;;;4878:114;;;;;;;;;;;;;;;;;;;580:6902;;;;;;;;;;;;;;;;;;;;5082:61;;;;580:6902;5082:61;;;;;;;;;;;;580:6902;5081:62;;580:6902;;;;5305:13;;;580:6902;;;;5426:28;580:6902;;;;-1:-1:-1;;580:6902:7;;;;;;;;;;;;;;;;;;;;;;;5679:2;580:6902;5852:332;580:6902;;1759:1:6;;580:6902:7;1759:1:6;5659:22:7;5655:75;;580:6902;;;;;;;;;;;5852:332;;;;;;;;;;;;;;580:6902;;;;;;;;;:::i;:::-;;;;;4968:10;580:6902;;;;;;;;;;;;;;;;;5852:332;;;;;;;;;:::i;:::-;5810:384;;;;;;:::i;:::-;;580:6902;;;;;;;;;;1759:1:6;;580:6902:7;;;;;;;;-1:-1:-1;;;580:6902:7;;;;;;;;;;;;;;;;;;;5655:75;5679:2;;-1:-1:-1;5655:75:7;;580:6902;-1:-1:-1;;;580:6902:7;;;;;;;;;;;;;;;;;-1:-1:-1;;;580:6902:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;580:6902:7;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;580:6902:7;;-1:-1:-1;;;580:6902:7;;;;;;;;;;;;;;;;;;-1:-1:-1;;;580:6902:7;;;;;;;5082:61;;;;;;-1:-1:-1;5082:61:7;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;580:6902;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4878:114;;;;;;-1:-1:-1;4878:114:7;;;;;;:::i;:::-;;;;;;580:6902;;;;;;;;;;;1759:1:6;580:6902:7;;-1:-1:-1;;;1759:1:6;;580:6902:7;1759:1:6;;;;;580:6902:7;1759:1:6;;580:6902:7;1759:1:6;580:6902:7;;;1759:1:6;580:6902:7;;1759:1:6;580:6902:7;;;;;;;;;;;;;;;;;1096:31;580:6902;;;-1:-1:-1;;;;;580:6902:7;;;;;;;;;;;;;;;;-1:-1:-1;;580:6902:7;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;;;;;;-1:-1:-1;;;;;580:6902:7;;;;;;;;;;;;;4878:15;580:6902;;;;;;;;;4878:114;;;;;;580:6902;;4968:10;;;;580:6902;;;4878:114;;;;;;;;;;;;;;;;;;;580:6902;;;;;;;;;;;;;;;;;;;;5082:61;;;;580:6902;5082:61;;;;;;;;;;;580:6902;5081:62;580:6902;;;;5305:13;;;580:6902;;;;5426:28;580:6902;;;;-1:-1:-1;;580:6902:7;;;;;;;;;;;;;;;;;5852:332;580:6902;5679:2;580:6902;;;;1759:1:6;;580:6902:7;1759:1:6;5659:22:7;5655:75;;580:6902;;;;;;;;;;;5852:332;;;;;;;;;;;;;;580:6902;;;;;;;;;:::i;:::-;;;;;;4968:10;580:6902;;;;;;;;;;;;;;;;;;5852:332;;;;;;;;;:::i;:::-;5810:384;;;;;;:::i;:::-;;580:6902;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5655:75;5679:2;;-1:-1:-1;5655:75:7;;580:6902;-1:-1:-1;;;580:6902:7;;;;;;;;;-1:-1:-1;;580:6902:7;;-1:-1:-1;;;580:6902:7;;;;;;;;;;;;;-1:-1:-1;;;580:6902:7;;;;;;;;-1:-1:-1;;580:6902:7;;-1:-1:-1;;;580:6902:7;;;;;;;;;;;;;-1:-1:-1;;;580:6902:7;;;;;;;;-1:-1:-1;;580:6902:7;;-1:-1:-1;;;580:6902:7;;;;;;;;;;;;;;;;;;-1:-1:-1;;;580:6902:7;;;;;;;5082:61;;;;;;;-1:-1:-1;5082:61:7;;;;;;:::i;:::-;;;;;580:6902;;;;;;;;;;-1:-1:-1;580:6902:7;;-1:-1:-1;;;580:6902:7;;;;;;;;;;;;;;;;;;;;;;4878:114;;;;;;-1:-1:-1;4878:114:7;;;;;;:::i;:::-;;;;;;580:6902;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;580:6902:7;;;;;;;-1:-1:-1;580:6902:7;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;580:6902:7;;;;;;;;;;;;;;;;;;;;;;;926:13:5;580:6902:7;;-1:-1:-1;;;;;580:6902:7;222:10:1;580:6902:7;;;1833:24:5;580:6902:7;;;;;;;;;;926:13:5;580:6902:7;;;222:10:1;;580:6902:7;;;;;;222:10:1;580:6902:7;;2123:40:4;;;;580:6902:7;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;580:6902:7;;;;;;;;;;;;;;;;;;;1056:62:4;;:::i;:::-;580:6902:7;;-1:-1:-1;;;;580:6902:7;;;;;;;;;;;;;;-1:-1:-1;;580:6902:7;;;;;;:::i;:::-;1056:62:4;;:::i;:::-;412:59:0;;487:8;580:6902:7;;-1:-1:-1;;;;;580:6902:7;;2354:30;;580:6902;;;;;;;;;;;;;-1:-1:-1;;;;;;;580:6902:7;;;;;;;;-1:-1:-1;;;580:6902:7;;;;;;;;;;;;;;;;;-1:-1:-1;;;580:6902:7;;;;;;;;;-1:-1:-1;;;580:6902:7;;;;;;;;;;;;;;;;;-1:-1:-1;;;580:6902:7;;;;;;;;;;-1:-1:-1;;;580:6902:7;;;;;;;;;;;;;;;;;-1:-1:-1;;;580:6902:7;;;;;;;;;;;-1:-1:-1;;;;;580:6902:7;;;;;;:::o;:::-;;;;;;5852:332;;;580:6902;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;5852:332;580:6902;-1:-1:-1;;580:6902:7;;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;580:6902:7;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;5852:332;;;580:6902;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;1352:130:4;580:6902:7;;-1:-1:-1;;;;;580:6902:7;222:10:1;1415:23:4;580:6902:7;;1352:130:4:o;580:6902:7:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;-1:-1:-1;580:6902:7;;;;:::o;:::-;;;:::o
Swarm Source
ipfs://ae76edba4d971cd6d304ad24d0945b1c79ad970403148b99f59d66bb33ddea1c
Net Worth in USD
Net Worth in ETH
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
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.