Source Code
Overview
MON Balance
MON Value
$0.00Latest 1 from a total of 1 transactions
| Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Set Platform Ope... | 50543130 | 6 days ago | IN | 0 MON | 0.00618313 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
PlayOracleV3
Compiler Version
v0.8.30+commit.73712a01
Optimization Enabled:
Yes with 1 runs
Other Settings:
prague EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
/**
* @title IMusicSubscription
* @notice Interface for MusicSubscription contract
*/
interface IMusicSubscription {
function recordPlay(address user, uint256 masterTokenId, uint256 duration) external;
}
/**
* @title PlayOracleV3
* @notice Oracle contract for recording music plays from backend
* @dev Authorized operators can submit validated play records to MusicSubscription
*
* V3 Changes:
* - Added DAO timelock support for governance
* - Added platform operator for registering User Safes
* - Added pause functionality for emergencies
* - Added onlyOwnerOrDAO modifier for operator management
*/
contract PlayOracleV3 is Ownable, ReentrancyGuard {
// MusicSubscription contract reference
IMusicSubscription public musicSubscription;
// Authorized operators (backend services, User Safes)
mapping(address => bool) public operators;
// Platform operator for registering User Safes
address public platformOperator;
// DAO Timelock for governance actions
address public daoTimelock;
// Pause state for emergencies
bool public paused;
// Minimum replay interval (prevent spam)
uint256 public minReplayInterval = 30; // 30 seconds default
// Track last play time per user per song
mapping(address => mapping(uint256 => uint256)) public lastPlayTime;
// Total plays recorded
uint256 public totalPlaysRecorded;
// ============================================
// Events
// ============================================
event PlayRecorded(address indexed user, uint256 indexed masterTokenId, uint256 duration, uint256 timestamp);
event OperatorAdded(address indexed operator);
event OperatorRemoved(address indexed operator);
event MusicSubscriptionUpdated(address indexed newAddress);
event ReplayIntervalUpdated(uint256 newInterval);
event DAOTimelockUpdated(address indexed oldTimelock, address indexed newTimelock);
event PlatformOperatorUpdated(address indexed oldOperator, address indexed newOperator);
event Paused(address indexed by);
event Unpaused(address indexed by);
// ============================================
// Modifiers
// ============================================
modifier onlyOperator() {
require(operators[msg.sender] || msg.sender == owner(), "Not an authorized operator");
_;
}
modifier onlyOwnerOrDAO() {
require(
msg.sender == owner() || msg.sender == daoTimelock,
"Only owner or DAO"
);
_;
}
modifier whenNotPaused() {
require(!paused, "Oracle is paused");
_;
}
constructor(address _musicSubscription) Ownable(msg.sender) {
musicSubscription = IMusicSubscription(_musicSubscription);
// Add deployer as initial operator
operators[msg.sender] = true;
emit OperatorAdded(msg.sender);
}
// ============================================
// Core Functions
// ============================================
/**
* @notice Record a validated play from the backend
* @param user The address of the user who played the song
* @param masterTokenId The master NFT token ID
* @param duration Play duration in seconds
*/
function recordPlay(
address user,
uint256 masterTokenId,
uint256 duration
) external onlyOperator nonReentrant whenNotPaused {
require(user != address(0), "Invalid user address");
require(masterTokenId > 0, "Invalid masterTokenId");
require(duration >= 30, "Duration too short");
// Check replay interval
require(
block.timestamp >= lastPlayTime[user][masterTokenId] + minReplayInterval,
"Replay too soon"
);
// Update last play time
lastPlayTime[user][masterTokenId] = block.timestamp;
totalPlaysRecorded++;
// Forward to MusicSubscription
musicSubscription.recordPlay(user, masterTokenId, duration);
emit PlayRecorded(user, masterTokenId, duration, block.timestamp);
}
/**
* @notice Batch record multiple plays (gas efficient for high volume)
* @param users Array of user addresses
* @param masterTokenIds Array of master token IDs
* @param durations Array of play durations
*/
function batchRecordPlays(
address[] calldata users,
uint256[] calldata masterTokenIds,
uint256[] calldata durations
) external onlyOperator nonReentrant whenNotPaused {
require(users.length == masterTokenIds.length && users.length == durations.length, "Array length mismatch");
require(users.length <= 50, "Batch too large");
for (uint256 i = 0; i < users.length; i++) {
address user = users[i];
uint256 masterTokenId = masterTokenIds[i];
uint256 duration = durations[i];
if (user == address(0) || masterTokenId == 0 || duration < 30) {
continue; // Skip invalid entries
}
if (block.timestamp < lastPlayTime[user][masterTokenId] + minReplayInterval) {
continue; // Skip if replay too soon
}
lastPlayTime[user][masterTokenId] = block.timestamp;
totalPlaysRecorded++;
musicSubscription.recordPlay(user, masterTokenId, duration);
emit PlayRecorded(user, masterTokenId, duration, block.timestamp);
}
}
// ============================================
// View Functions
// ============================================
/**
* @notice Check if a user can play a song (replay interval passed)
*/
function canPlay(address user, uint256 masterTokenId) external view returns (bool) {
return block.timestamp >= lastPlayTime[user][masterTokenId] + minReplayInterval;
}
/**
* @notice Get last play timestamp for a user and song
*/
function getLastPlayTime(address user, uint256 masterTokenId) external view returns (uint256) {
return lastPlayTime[user][masterTokenId];
}
// ============================================
// Operator Management (DAO Governed)
// ============================================
/**
* @notice Add an operator (owner or DAO)
* @param operator Address to add as operator
*/
function addOperator(address operator) external onlyOwnerOrDAO {
require(operator != address(0), "Invalid operator");
require(!operators[operator], "Already an operator");
operators[operator] = true;
emit OperatorAdded(operator);
}
/**
* @notice Remove an operator (owner or DAO)
* @param operator Address to remove
*/
function removeOperator(address operator) external onlyOwnerOrDAO {
require(operators[operator], "Not an operator");
operators[operator] = false;
emit OperatorRemoved(operator);
}
/**
* @notice Register a User Safe as an operator (for delegated execution)
* @dev Called by platform operator when user creates their Safe
* @param userSafe The User Safe address to authorize
*/
function registerUserSafeAsOperator(address userSafe) external {
require(msg.sender == platformOperator, "Only platform operator");
require(userSafe != address(0), "Invalid Safe address");
operators[userSafe] = true;
emit OperatorAdded(userSafe);
}
// ============================================
// Admin Functions
// ============================================
/**
* @notice Set DAO timelock address for future governance
* @param _daoTimelock Address of the DAO timelock contract
*/
function setDAOTimelock(address _daoTimelock) external onlyOwner {
address oldTimelock = daoTimelock;
daoTimelock = _daoTimelock;
emit DAOTimelockUpdated(oldTimelock, _daoTimelock);
}
/**
* @notice Set platform operator address
* @param _platformOperator Address of platform operator
*/
function setPlatformOperator(address _platformOperator) external onlyOwner {
address oldOperator = platformOperator;
platformOperator = _platformOperator;
emit PlatformOperatorUpdated(oldOperator, _platformOperator);
}
/**
* @notice Update MusicSubscription contract address
* @param _musicSubscription New MusicSubscription address
*/
function setMusicSubscription(address _musicSubscription) external onlyOwner {
require(_musicSubscription != address(0), "Invalid address");
musicSubscription = IMusicSubscription(_musicSubscription);
emit MusicSubscriptionUpdated(_musicSubscription);
}
/**
* @notice Set minimum replay interval
* @param _interval New interval in seconds (10 to 3600)
*/
function setMinReplayInterval(uint256 _interval) external onlyOwner {
require(_interval >= 10 && _interval <= 3600, "Interval out of range");
minReplayInterval = _interval;
emit ReplayIntervalUpdated(_interval);
}
/**
* @notice Pause oracle operations (emergency only)
*/
function pause() external onlyOwnerOrDAO {
paused = true;
emit Paused(msg.sender);
}
/**
* @notice Unpause oracle operations
*/
function unpause() external onlyOwnerOrDAO {
paused = false;
emit Unpaused(msg.sender);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)
pragma solidity ^0.8.20;
import {Context} from "../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.
*
* The initial owner is set to the address provided by the deployer. 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;
/**
* @dev The caller account is not authorized to perform an operation.
*/
error OwnableUnauthorizedAccount(address account);
/**
* @dev The owner is not a valid owner account. (eg. `address(0)`)
*/
error OwnableInvalidOwner(address owner);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the address provided by the deployer as the initial owner.
*/
constructor(address initialOwner) {
if (initialOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(initialOwner);
}
/**
* @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 {
if (owner() != _msgSender()) {
revert OwnableUnauthorizedAccount(_msgSender());
}
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling 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 {
if (newOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_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 v5.0.0) (utils/ReentrancyGuard.sol)
pragma solidity ^0.8.20;
/**
* @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;
/**
* @dev Unauthorized reentrant call.
*/
error ReentrancyGuardReentrantCall();
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
if (_status == ENTERED) {
revert ReentrancyGuardReentrantCall();
}
// 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;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/Context.sol)
pragma solidity ^0.8.20;
/**
* @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;
}
}{
"remappings": [
"@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
"forge-std/=lib/forge-std/src/",
"ds-test/=lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/src/",
"erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
"hardhat/=node_modules/hardhat/",
"openzeppelin-contracts/=lib/openzeppelin-contracts/"
],
"optimizer": {
"enabled": true,
"runs": 1
},
"metadata": {
"useLiteralContent": false,
"bytecodeHash": "ipfs",
"appendCBOR": true
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"evmVersion": "prague",
"viaIR": true
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_musicSubscription","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldTimelock","type":"address"},{"indexed":true,"internalType":"address","name":"newTimelock","type":"address"}],"name":"DAOTimelockUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"}],"name":"MusicSubscriptionUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"}],"name":"OperatorAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"}],"name":"OperatorRemoved","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"by","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldOperator","type":"address"},{"indexed":true,"internalType":"address","name":"newOperator","type":"address"}],"name":"PlatformOperatorUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"masterTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"PlayRecorded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newInterval","type":"uint256"}],"name":"ReplayIntervalUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"by","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"addOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"users","type":"address[]"},{"internalType":"uint256[]","name":"masterTokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"durations","type":"uint256[]"}],"name":"batchRecordPlays","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"masterTokenId","type":"uint256"}],"name":"canPlay","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"daoTimelock","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"masterTokenId","type":"uint256"}],"name":"getLastPlayTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"lastPlayTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minReplayInterval","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"musicSubscription","outputs":[{"internalType":"contract IMusicSubscription","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"operators","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"platformOperator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"masterTokenId","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"recordPlay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"userSafe","type":"address"}],"name":"registerUserSafeAsOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"removeOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_daoTimelock","type":"address"}],"name":"setDAOTimelock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_interval","type":"uint256"}],"name":"setMinReplayInterval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_musicSubscription","type":"address"}],"name":"setMusicSubscription","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_platformOperator","type":"address"}],"name":"setPlatformOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalPlaysRecorded","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60803461011357601f61126538819003918201601f19168301916001600160401b038311848410176101175780849260209460405283398101031261011357516001600160a01b03811690819003610113573315610100575f8054336001600160a01b0319821681178355604051939290916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a360018055601e60065560018060a01b03196002541617600255335f52600360205260405f20600160ff19825416179055337fac6fa858e9350a46cec16539926e0fde25b7629f84b5a72bffaae4df888ae86d5f80a2611139908161012c8239f35b631e4fbdf760e01b5f525f60045260245ffd5b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe6080806040526004361015610012575f80fd5b5f905f3560e01c90816308744e7414610e845750806313e7c9d814610e475780631963a7aa14610e1f5780631af023d414610d795780631f0cc57014610c9b5780632692b40614610c7e5780632bdc145914610a265780633f4ba83a146109af57806351bc9a16146105225780635c975abb146109895780636bb582da1461091e578063715018a6146108d75780637be16adc146108845780638456cb591461080757806387bba1e91461079c5780638da5cb5b146107755780639870d7fe14610669578063ac8a584a1461058e578063b85962e314610565578063bccd649014610522578063c377301514610504578063c85883ad1461023c578063da2f0be01461019b5763f2fde38b14610126575f80fd5b346101985760203660031901126101985761013f610ea7565b61014761105d565b6001600160a01b031680156101845781546001600160a01b03198116821783556001600160a01b03165f5160206110a45f395f51905f528380a380f35b631e4fbdf760e01b82526004829052602482fd5b80fd5b5034610198576020366003190112610198576101b5610ea7565b6101bd61105d565b6001600160a01b0316801561020557600280546001600160a01b031916821790557ffcc1bf6d6ac2af4fedb45aa17c1468936e527aa6843436bdec6a11f2e519f9e58280a280f35b60405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606490fd5b5034610198576060366003190112610198576004356001600160401b0381116105005761026d903690600401610ebd565b906024356001600160401b0381116104fc5761028d903690600401610ebd565b92906044356001600160401b0381116104f8576102ae903690600401610ebd565b9092338752600360205260ff60408820541680156104e5575b6102d090610eed565b6102d8611083565b6102ea60ff60055460a01c1615610f36565b858114806104dc575b1561049f576032811161046857865b81811061031157876001805580f35b61031c818388611039565b35906001600160a01b0382168083036104645761033a828a88611039565b35908a61034884888b611039565b35948215801561045c575b8015610452575b61044557828252600760205260408220848352602052610381604083205460065490610f75565b4210610445578282526007602052604082208483526020524260408320556103aa600854610f96565b6008556002546001600160a01b0316803b156104415786839186836103e69560405196879586948593632bdc145960e01b855260048501610fdb565b03925af180156104365761041d575b50505f5160206110e45f395f51905f5260406001958151908152426020820152a35b01610302565b8161042791610fa4565b610432578a5f6103f5565b8a80fd5b6040513d84823e3d90fd5b8280fd5b5050505060019150610417565b50601e861061035a565b508315610353565b8980fd5b60405162461bcd60e51b815260206004820152600f60248201526e426174636820746f6f206c6172676560881b6044820152606490fd5b60405162461bcd60e51b8152602060048201526015602482015274082e4e4c2f240d8cadccee8d040dad2e6dac2e8c6d605b1b6044820152606490fd5b508181146102f3565b5086546001600160a01b031633146102c7565b8580fd5b8380fd5b5080fd5b50346101985780600319360112610198576020600854604051908152f35b5034610198576040366003190112610198576020906040906001600160a01b0361054a610ea7565b16815260078352818120602435825283522054604051908152f35b50346101985780600319360112610198576005546040516001600160a01b039091168152602090f35b5034610198576020366003190112610198576105a8610ea7565b81546001600160a01b031633148015610655575b6105c590610ff9565b6001600160a01b03168082526003602052604082205460ff161561061e57808252600360205260408220805460ff191690557f80c0b871b97b595b16a7741c1b06fed0c6f6f558639f18ccbce50724325dc40d8280a280f35b60405162461bcd60e51b815260206004820152600f60248201526e2737ba1030b71037b832b930ba37b960891b6044820152606490fd5b506005546001600160a01b031633146105bc565b503461019857602036600319011261019857610683610ea7565b81546001600160a01b031633148015610761575b6106a090610ff9565b6001600160a01b0316801561072957808252600360205260ff6040832054166106ee57808252600360205260408220805460ff191660011790555f5160206110c45f395f51905f528280a280f35b60405162461bcd60e51b815260206004820152601360248201527220b63932b0b23c9030b71037b832b930ba37b960691b6044820152606490fd5b60405162461bcd60e51b815260206004820152601060248201526f24b73b30b634b21037b832b930ba37b960811b6044820152606490fd5b506005546001600160a01b03163314610697565b5034610198578060031936011261019857546040516001600160a01b039091168152602090f35b5034610198576020366003190112610198576107b6610ea7565b6107be61105d565b600480546001600160a01b039283166001600160a01b0319821681179092559091167f5a573b258c80ee71c73b7d2356277ec2153698b328c6d95cb16dd5c9730d7a2f8380a380f35b503461019857806003193601126101985780546001600160a01b031633148015610870575b61083590610ff9565b6005805460ff60a01b1916600160a01b179055337f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2588280a280f35b506005546001600160a01b0316331461082c565b5034610198576040366003190112610198576020906108cc906040906001600160a01b036108b0610ea7565b1681526007845281812060243582528452205460065490610f75565b421015604051908152f35b50346101985780600319360112610198576108f061105d565b80546001600160a01b03198116825581906001600160a01b03165f5160206110a45f395f51905f528280a380f35b503461019857602036600319011261019857610938610ea7565b61094061105d565b600580546001600160a01b039283166001600160a01b0319821681179092559091167fad99ec16ff9b9004b2ddbacc44c5139d53cc9b33f00257772bd5101bc69bd5328380a380f35b5034610198578060031936011261019857602060ff60055460a01c166040519015158152f35b503461019857806003193601126101985780546001600160a01b031633148015610a12575b6109dd90610ff9565b6005805460ff60a01b19169055337f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa8280a280f35b506005546001600160a01b031633146109d4565b5034610b7d576060366003190112610b7d57610a40610ea7565b60243590604435335f52600360205260ff60405f2054168015610c6b575b610a6790610eed565b610a6f611083565b610a8160ff60055460a01c1615610f36565b6001600160a01b038216918215610c2f578315610bf257601e8210610bb857825f52600760205260405f20845f52602052610ac360405f205460065490610f75565b4210610b8157825f52600760205260405f20845f526020524260405f2055610aec600854610f96565b6008556002546001600160a01b0316803b15610b7d57825f918683610b289560405196879586948593632bdc145960e01b855260048501610fdb565b03925af18015610b7257610b5c575b5060405f5160206110e45f395f51905f52918151908152426020820152a36001805580f35b610b699194505f90610fa4565b5f926040610b37565b6040513d5f823e3d90fd5b5f80fd5b60405162461bcd60e51b815260206004820152600f60248201526e2932b83630bc903a37b79039b7b7b760891b6044820152606490fd5b60405162461bcd60e51b8152602060048201526012602482015271111d5c985d1a5bdb881d1bdbc81cda1bdc9d60721b6044820152606490fd5b60405162461bcd60e51b8152602060048201526015602482015274125b9d985b1a59081b585cdd195c951bdad95b9259605a1b6044820152606490fd5b60405162461bcd60e51b8152602060048201526014602482015273496e76616c69642075736572206164647265737360601b6044820152606490fd5b505f546001600160a01b03163314610a5e565b34610b7d575f366003190112610b7d576020600654604051908152f35b34610b7d576020366003190112610b7d57610cb4610ea7565b6004546001600160a01b03163303610d3b576001600160a01b03168015610cff57805f52600360205260405f20600160ff198254161790555f5160206110c45f395f51905f525f80a2005b60405162461bcd60e51b8152602060048201526014602482015273496e76616c69642053616665206164647265737360601b6044820152606490fd5b60405162461bcd60e51b815260206004820152601660248201527527b7363c90383630ba3337b9369037b832b930ba37b960511b6044820152606490fd5b34610b7d576020366003190112610b7d57600435610d9561105d565b600a81101580610e13575b15610dd6576020817f1f601f37d70b3a9fef08d3e595edb67d615cc8decc188ef4fbac4b3968cf670b92600655604051908152a1005b60405162461bcd60e51b8152602060048201526015602482015274496e74657276616c206f7574206f662072616e676560581b6044820152606490fd5b50610e10811115610da0565b34610b7d575f366003190112610b7d576002546040516001600160a01b039091168152602090f35b34610b7d576020366003190112610b7d576001600160a01b03610e68610ea7565b165f526003602052602060ff60405f2054166040519015158152f35b34610b7d575f366003190112610b7d576004546001600160a01b03168152602090f35b600435906001600160a01b0382168203610b7d57565b9181601f84011215610b7d578235916001600160401b038311610b7d576020808501948460051b010111610b7d57565b15610ef457565b60405162461bcd60e51b815260206004820152601a6024820152792737ba1030b71030baba3437b934bd32b21037b832b930ba37b960311b6044820152606490fd5b15610f3d57565b60405162461bcd60e51b815260206004820152601060248201526f13dc9858db19481a5cc81c185d5cd95960821b6044820152606490fd5b91908201809211610f8257565b634e487b7160e01b5f52601160045260245ffd5b5f198114610f825760010190565b601f909101601f19168101906001600160401b03821190821017610fc757604052565b634e487b7160e01b5f52604160045260245ffd5b604091949392606082019560018060a01b0316825260208201520152565b1561100057565b60405162461bcd60e51b81526020600482015260116024820152704f6e6c79206f776e6572206f722044414f60781b6044820152606490fd5b91908110156110495760051b0190565b634e487b7160e01b5f52603260045260245ffd5b5f546001600160a01b0316330361107057565b63118cdaa760e01b5f523360045260245ffd5b600260015414611094576002600155565b633ee5aeb560e01b5f5260045ffdfe8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0ac6fa858e9350a46cec16539926e0fde25b7629f84b5a72bffaae4df888ae86df39503129ba19bf173751c70fcadbac7d2d5d8af082e69b1be2de2d385cd1f4aa2646970667358221220fe47dd42ed34589aa0de24a194e4d33f8b5c324f67f371c24a88f233d14ad55664736f6c634300081e0033000000000000000000000000cb11282e5797e036c98d321b276cb162cde845e5
Deployed Bytecode
0x6080806040526004361015610012575f80fd5b5f905f3560e01c90816308744e7414610e845750806313e7c9d814610e475780631963a7aa14610e1f5780631af023d414610d795780631f0cc57014610c9b5780632692b40614610c7e5780632bdc145914610a265780633f4ba83a146109af57806351bc9a16146105225780635c975abb146109895780636bb582da1461091e578063715018a6146108d75780637be16adc146108845780638456cb591461080757806387bba1e91461079c5780638da5cb5b146107755780639870d7fe14610669578063ac8a584a1461058e578063b85962e314610565578063bccd649014610522578063c377301514610504578063c85883ad1461023c578063da2f0be01461019b5763f2fde38b14610126575f80fd5b346101985760203660031901126101985761013f610ea7565b61014761105d565b6001600160a01b031680156101845781546001600160a01b03198116821783556001600160a01b03165f5160206110a45f395f51905f528380a380f35b631e4fbdf760e01b82526004829052602482fd5b80fd5b5034610198576020366003190112610198576101b5610ea7565b6101bd61105d565b6001600160a01b0316801561020557600280546001600160a01b031916821790557ffcc1bf6d6ac2af4fedb45aa17c1468936e527aa6843436bdec6a11f2e519f9e58280a280f35b60405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606490fd5b5034610198576060366003190112610198576004356001600160401b0381116105005761026d903690600401610ebd565b906024356001600160401b0381116104fc5761028d903690600401610ebd565b92906044356001600160401b0381116104f8576102ae903690600401610ebd565b9092338752600360205260ff60408820541680156104e5575b6102d090610eed565b6102d8611083565b6102ea60ff60055460a01c1615610f36565b858114806104dc575b1561049f576032811161046857865b81811061031157876001805580f35b61031c818388611039565b35906001600160a01b0382168083036104645761033a828a88611039565b35908a61034884888b611039565b35948215801561045c575b8015610452575b61044557828252600760205260408220848352602052610381604083205460065490610f75565b4210610445578282526007602052604082208483526020524260408320556103aa600854610f96565b6008556002546001600160a01b0316803b156104415786839186836103e69560405196879586948593632bdc145960e01b855260048501610fdb565b03925af180156104365761041d575b50505f5160206110e45f395f51905f5260406001958151908152426020820152a35b01610302565b8161042791610fa4565b610432578a5f6103f5565b8a80fd5b6040513d84823e3d90fd5b8280fd5b5050505060019150610417565b50601e861061035a565b508315610353565b8980fd5b60405162461bcd60e51b815260206004820152600f60248201526e426174636820746f6f206c6172676560881b6044820152606490fd5b60405162461bcd60e51b8152602060048201526015602482015274082e4e4c2f240d8cadccee8d040dad2e6dac2e8c6d605b1b6044820152606490fd5b508181146102f3565b5086546001600160a01b031633146102c7565b8580fd5b8380fd5b5080fd5b50346101985780600319360112610198576020600854604051908152f35b5034610198576040366003190112610198576020906040906001600160a01b0361054a610ea7565b16815260078352818120602435825283522054604051908152f35b50346101985780600319360112610198576005546040516001600160a01b039091168152602090f35b5034610198576020366003190112610198576105a8610ea7565b81546001600160a01b031633148015610655575b6105c590610ff9565b6001600160a01b03168082526003602052604082205460ff161561061e57808252600360205260408220805460ff191690557f80c0b871b97b595b16a7741c1b06fed0c6f6f558639f18ccbce50724325dc40d8280a280f35b60405162461bcd60e51b815260206004820152600f60248201526e2737ba1030b71037b832b930ba37b960891b6044820152606490fd5b506005546001600160a01b031633146105bc565b503461019857602036600319011261019857610683610ea7565b81546001600160a01b031633148015610761575b6106a090610ff9565b6001600160a01b0316801561072957808252600360205260ff6040832054166106ee57808252600360205260408220805460ff191660011790555f5160206110c45f395f51905f528280a280f35b60405162461bcd60e51b815260206004820152601360248201527220b63932b0b23c9030b71037b832b930ba37b960691b6044820152606490fd5b60405162461bcd60e51b815260206004820152601060248201526f24b73b30b634b21037b832b930ba37b960811b6044820152606490fd5b506005546001600160a01b03163314610697565b5034610198578060031936011261019857546040516001600160a01b039091168152602090f35b5034610198576020366003190112610198576107b6610ea7565b6107be61105d565b600480546001600160a01b039283166001600160a01b0319821681179092559091167f5a573b258c80ee71c73b7d2356277ec2153698b328c6d95cb16dd5c9730d7a2f8380a380f35b503461019857806003193601126101985780546001600160a01b031633148015610870575b61083590610ff9565b6005805460ff60a01b1916600160a01b179055337f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2588280a280f35b506005546001600160a01b0316331461082c565b5034610198576040366003190112610198576020906108cc906040906001600160a01b036108b0610ea7565b1681526007845281812060243582528452205460065490610f75565b421015604051908152f35b50346101985780600319360112610198576108f061105d565b80546001600160a01b03198116825581906001600160a01b03165f5160206110a45f395f51905f528280a380f35b503461019857602036600319011261019857610938610ea7565b61094061105d565b600580546001600160a01b039283166001600160a01b0319821681179092559091167fad99ec16ff9b9004b2ddbacc44c5139d53cc9b33f00257772bd5101bc69bd5328380a380f35b5034610198578060031936011261019857602060ff60055460a01c166040519015158152f35b503461019857806003193601126101985780546001600160a01b031633148015610a12575b6109dd90610ff9565b6005805460ff60a01b19169055337f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa8280a280f35b506005546001600160a01b031633146109d4565b5034610b7d576060366003190112610b7d57610a40610ea7565b60243590604435335f52600360205260ff60405f2054168015610c6b575b610a6790610eed565b610a6f611083565b610a8160ff60055460a01c1615610f36565b6001600160a01b038216918215610c2f578315610bf257601e8210610bb857825f52600760205260405f20845f52602052610ac360405f205460065490610f75565b4210610b8157825f52600760205260405f20845f526020524260405f2055610aec600854610f96565b6008556002546001600160a01b0316803b15610b7d57825f918683610b289560405196879586948593632bdc145960e01b855260048501610fdb565b03925af18015610b7257610b5c575b5060405f5160206110e45f395f51905f52918151908152426020820152a36001805580f35b610b699194505f90610fa4565b5f926040610b37565b6040513d5f823e3d90fd5b5f80fd5b60405162461bcd60e51b815260206004820152600f60248201526e2932b83630bc903a37b79039b7b7b760891b6044820152606490fd5b60405162461bcd60e51b8152602060048201526012602482015271111d5c985d1a5bdb881d1bdbc81cda1bdc9d60721b6044820152606490fd5b60405162461bcd60e51b8152602060048201526015602482015274125b9d985b1a59081b585cdd195c951bdad95b9259605a1b6044820152606490fd5b60405162461bcd60e51b8152602060048201526014602482015273496e76616c69642075736572206164647265737360601b6044820152606490fd5b505f546001600160a01b03163314610a5e565b34610b7d575f366003190112610b7d576020600654604051908152f35b34610b7d576020366003190112610b7d57610cb4610ea7565b6004546001600160a01b03163303610d3b576001600160a01b03168015610cff57805f52600360205260405f20600160ff198254161790555f5160206110c45f395f51905f525f80a2005b60405162461bcd60e51b8152602060048201526014602482015273496e76616c69642053616665206164647265737360601b6044820152606490fd5b60405162461bcd60e51b815260206004820152601660248201527527b7363c90383630ba3337b9369037b832b930ba37b960511b6044820152606490fd5b34610b7d576020366003190112610b7d57600435610d9561105d565b600a81101580610e13575b15610dd6576020817f1f601f37d70b3a9fef08d3e595edb67d615cc8decc188ef4fbac4b3968cf670b92600655604051908152a1005b60405162461bcd60e51b8152602060048201526015602482015274496e74657276616c206f7574206f662072616e676560581b6044820152606490fd5b50610e10811115610da0565b34610b7d575f366003190112610b7d576002546040516001600160a01b039091168152602090f35b34610b7d576020366003190112610b7d576001600160a01b03610e68610ea7565b165f526003602052602060ff60405f2054166040519015158152f35b34610b7d575f366003190112610b7d576004546001600160a01b03168152602090f35b600435906001600160a01b0382168203610b7d57565b9181601f84011215610b7d578235916001600160401b038311610b7d576020808501948460051b010111610b7d57565b15610ef457565b60405162461bcd60e51b815260206004820152601a6024820152792737ba1030b71030baba3437b934bd32b21037b832b930ba37b960311b6044820152606490fd5b15610f3d57565b60405162461bcd60e51b815260206004820152601060248201526f13dc9858db19481a5cc81c185d5cd95960821b6044820152606490fd5b91908201809211610f8257565b634e487b7160e01b5f52601160045260245ffd5b5f198114610f825760010190565b601f909101601f19168101906001600160401b03821190821017610fc757604052565b634e487b7160e01b5f52604160045260245ffd5b604091949392606082019560018060a01b0316825260208201520152565b1561100057565b60405162461bcd60e51b81526020600482015260116024820152704f6e6c79206f776e6572206f722044414f60781b6044820152606490fd5b91908110156110495760051b0190565b634e487b7160e01b5f52603260045260245ffd5b5f546001600160a01b0316330361107057565b63118cdaa760e01b5f523360045260245ffd5b600260015414611094576002600155565b633ee5aeb560e01b5f5260045ffdfe8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0ac6fa858e9350a46cec16539926e0fde25b7629f84b5a72bffaae4df888ae86df39503129ba19bf173751c70fcadbac7d2d5d8af082e69b1be2de2d385cd1f4aa2646970667358221220fe47dd42ed34589aa0de24a194e4d33f8b5c324f67f371c24a88f233d14ad55664736f6c634300081e0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000cb11282e5797e036c98d321b276cb162cde845e5
-----Decoded View---------------
Arg [0] : _musicSubscription (address): 0xCB11282E5797E036C98D321b276Cb162cde845E5
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000cb11282e5797e036c98d321b276cb162cde845e5
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in MON
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
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.