POL Price: $0.127216 (-3.51%)
 

Overview

POL Balance

Polygon PoS Chain LogoPolygon PoS Chain LogoPolygon PoS Chain Logo0 POL

POL Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Block
From
To
Infuse Soul819045942026-01-20 17:12:403 days ago1768929160IN
0x0a1109bC...795ef2DbA
0 POL0.14219821518.67818157
Infuse Soul817733862026-01-17 16:19:046 days ago1768666744IN
0x0a1109bC...795ef2DbA
0 POL0.11296538389.58820041
Infuse Soul817680962026-01-17 13:22:446 days ago1768656164IN
0x0a1109bC...795ef2DbA
0 POL0.15562516519.28020321
Infuse Soul817672782026-01-17 12:55:286 days ago1768654528IN
0x0a1109bC...795ef2DbA
0 POL0.15098023550.68712306
Infuse Soul817190082026-01-16 10:06:288 days ago1768557988IN
0x0a1109bC...795ef2DbA
0 POL0.08006446289.08834752
Infuse Soul816460932026-01-14 17:35:589 days ago1768412158IN
0x0a1109bC...795ef2DbA
0 POL0.16254072547.3544304
Infuse Soul816438112026-01-14 16:19:549 days ago1768407594IN
0x0a1109bC...795ef2DbA
0 POL0.22130674745.43671319
Infuse Soul816121152026-01-13 22:43:2210 days ago1768344202IN
0x0a1109bC...795ef2DbA
0 POL0.15998807577.66813198
Infuse Soul815939002026-01-13 12:35:5110 days ago1768307751IN
0x0a1109bC...795ef2DbA
0 POL0.12556216422.93625664
Infuse Soul815934552026-01-13 12:21:0111 days ago1768306861IN
0x0a1109bC...795ef2DbA
0 POL0.18943437644.15495165
Infuse Soul813709442026-01-08 8:32:2716 days ago1767861147IN
0x0a1109bC...795ef2DbA
0 POL1.114673441,542.20294235
Infuse Soul810362842025-12-31 14:37:0723 days ago1767191827IN
0x0a1109bC...795ef2DbA
0 POL1.104919351,539.97875756
Infuse Soul808116052025-12-26 9:47:3329 days ago1766742453IN
0x0a1109bC...795ef2DbA
0 POL0.0200670173.19589113
Infuse Soul802161952025-12-12 11:08:4643 days ago1765537726IN
0x0a1109bC...795ef2DbA
0 POL0.0095325434.77064581
Infuse Soul800854272025-12-09 10:25:0746 days ago1765275907IN
0x0a1109bC...795ef2DbA
0 POL0.0103915835.00240455
Infuse Soul791456412025-11-17 16:18:3367 days ago1763396313IN
0x0a1109bC...795ef2DbA
0 POL0.13665942466.81430878
Infuse Soul791359912025-11-17 10:56:5368 days ago1763377013IN
0x0a1109bC...795ef2DbA
0 POL0.07355409103.51683429
Infuse Soul785421222025-11-03 16:58:2781 days ago1762189107IN
0x0a1109bC...795ef2DbA
0 POL0.0295754102.98810812
Infuse Soul784498342025-11-01 13:41:4983 days ago1762004509IN
0x0a1109bC...795ef2DbA
0 POL0.0184074262
Infuse Soul783490282025-10-30 5:41:2586 days ago1761802885IN
0x0a1109bC...795ef2DbA
0 POL0.0234320285.46623293
Infuse Soul782880112025-10-28 19:47:3187 days ago1761680851IN
0x0a1109bC...795ef2DbA
0 POL0.0086152130.00007515
Infuse Soul782684502025-10-28 8:55:2988 days ago1761641729IN
0x0a1109bC...795ef2DbA
0 POL0.0101763233.95572747
Infuse Soul782378202025-10-27 15:54:2788 days ago1761580467IN
0x0a1109bC...795ef2DbA
0 POL0.0085866931.32060096
Infuse Soul782348512025-10-27 14:15:2988 days ago1761574529IN
0x0a1109bC...795ef2DbA
0 POL0.0103530235.70340495
Infuse Soul782010642025-10-26 19:29:1589 days ago1761506955IN
0x0a1109bC...795ef2DbA
0 POL0.0089908230
View all transactions

Parent Transaction Hash Block From To
View All Internal Transactions
Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
MagicAlchemyFountainOfLife

Compiler Version
v0.8.28+commit.7893614a

Optimization Enabled:
Yes with 200 runs

Other Settings:
cancun EvmVersion
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.28;

import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {Pausable} from "@openzeppelin/contracts/utils/Pausable.sol";
import {ReentrancyGuardTransient} from "@openzeppelin/contracts/utils/ReentrancyGuardTransient.sol";

import {IMagicAlchemyMarathonNft} from "./interfaces/IMagicAlchemyMarathonNft.sol";
import {IMagicAlchemyAlchemistIngredient} from "./interfaces/IMagicAlchemyAlchemistIngredient.sol";
import {IMagicAlchemyAlchemist} from "./interfaces/IMagicAlchemyAlchemist.sol";

import {MagicAlchemyRarity as Rarity} from "./utils/MagicAlchemyRarity.sol";

contract MagicAlchemyFountainOfLife is Ownable, Pausable, ReentrancyGuardTransient {
    uint256 public constant ALT_UGLY_BROTH_AMOUNT = 12;

    /* -------------------------------------------------------------------------- */
    /*                                   EVENTS                                   */
    /* -------------------------------------------------------------------------- */

    event UglyBrothSetup(IMagicAlchemyAlchemistIngredient indexed uglyBroth);

    event EmbryoFlaskSetup(IMagicAlchemyAlchemistIngredient indexed embryo);

    event AlchemistSetup(IMagicAlchemyAlchemist indexed alchemist);

    event SoulInfused(
        address indexed player,
        uint256 indexed alchemistId,
        Rarity alchemistRarity,
        uint256 indexed embryoFlaskId,
        uint256[] uglyBrothIds
    );

    /* -------------------------------------------------------------------------- */
    /*                                   ERRORS                                   */
    /* -------------------------------------------------------------------------- */

    error SenderIsNotOwner(address sender, address owner, address tokenContract, uint256 tokenId);

    error BadUglyBrothAmount(uint256 amount);
    error BadUglyBrothAmountForRarity(Rarity rarity, uint256 amount);
    error BadUglyBrothRarity(Rarity targetRarity, Rarity uglyBrothRarity, uint256 tokenId);

    error InvalidInterface(bytes4 required);

    error UnknownRarity(uint8 rarity);

    /* -------------------------------------------------------------------------- */
    /*                              STATE VARIABLES                               */
    /* -------------------------------------------------------------------------- */

    IMagicAlchemyAlchemistIngredient private _uglyBroth;
    IMagicAlchemyAlchemistIngredient private _embryoFlask;
    IMagicAlchemyAlchemist private _alchemist;

    /* -------------------------------------------------------------------------- */
    /*                                 CONSTRUCTOR                                */
    /* -------------------------------------------------------------------------- */

    constructor(
        IMagicAlchemyAlchemistIngredient uglyBroth_,
        IMagicAlchemyAlchemistIngredient embryoFlask_,
        IMagicAlchemyAlchemist alchemist_,
        address initialOwner_
    ) Pausable() Ownable(initialOwner_) {
        _pause();

        _setUglyBroth(uglyBroth_);
        _setEmbryoFlask(embryoFlask_);
        _setAlchemist(alchemist_);
    }

    /* -------------------------------------------------------------------------- */
    /*                              VIEW FUNCTIONS                                */
    /* -------------------------------------------------------------------------- */

    function uglyBroth() public view returns (IMagicAlchemyAlchemistIngredient) {
        return _uglyBroth;
    }

    function embryoFlask() public view returns (IMagicAlchemyAlchemistIngredient) {
        return _embryoFlask;
    }

    function alchemist() public view returns (IMagicAlchemyAlchemist) {
        return _alchemist;
    }

    /* -------------------------------------------------------------------------- */
    /*                             STATE CHANGING FUNCTIONS                       */
    /* -------------------------------------------------------------------------- */

    function infuseSoul(uint256 embryoFlaskId_, uint256[] calldata uglyBrothIds_)
        public
        whenNotPaused
        nonReentrant
        returns (uint256)
    {
        if (uglyBrothIds_.length != 1 && uglyBrothIds_.length != ALT_UGLY_BROTH_AMOUNT) {
            revert BadUglyBrothAmount(uglyBrothIds_.length);
        }

        address player_ = _msgSender();
        _checkIngredientsOwnership(player_, embryoFlaskId_, uglyBrothIds_);

        Rarity embryoRarity_ = _embryoFlask.rarityOf(embryoFlaskId_);
        _checkAlchemistRecipe(embryoRarity_, uglyBrothIds_);

        _embryoFlask.burn(embryoFlaskId_);
        for (uint256 index_ = 0; index_ < uglyBrothIds_.length; ++index_) {
            _uglyBroth.burn(uglyBrothIds_[index_]);
        }

        uint256 alchemistId_ = _alchemist.mint(player_, embryoRarity_);
        _alchemist.setTokenLevel(alchemistId_, 1);

        Rarity alchemistRarity_ = _alchemist.rarityOf(alchemistId_);
        emit SoulInfused(player_, alchemistId_, alchemistRarity_, embryoFlaskId_, uglyBrothIds_);

        return alchemistId_;
    }

    /* -------------------------------------------------------------------------- */
    /*                         OWNER-RESTRICTED FUNCTIONS                         */
    /* -------------------------------------------------------------------------- */

    function pause() public onlyOwner {
        _pause();
    }

    function unpause() public onlyOwner {
        _unpause();
    }

    function setUglyBroth(IMagicAlchemyAlchemistIngredient uglyBroth_) public onlyOwner {
        _setUglyBroth(uglyBroth_);
    }

    function setEmbryoFlask(IMagicAlchemyAlchemistIngredient embryoFlask_) public onlyOwner {
        _setEmbryoFlask(embryoFlask_);
    }

    function setAlchemist(IMagicAlchemyAlchemist alchemist_) public onlyOwner {
        _setAlchemist(alchemist_);
    }

    /* -------------------------------------------------------------------------- */
    /*                              INTERNAL FUNCTIONS                            */
    /* -------------------------------------------------------------------------- */

    function _setUglyBroth(IMagicAlchemyAlchemistIngredient uglyBroth_) private {
        if (!uglyBroth_.supportsInterface(type(IMagicAlchemyMarathonNft).interfaceId)) {
            revert InvalidInterface(type(IMagicAlchemyMarathonNft).interfaceId);
        }

        _uglyBroth = uglyBroth_;
        emit UglyBrothSetup(uglyBroth_);
    }

    function _setEmbryoFlask(IMagicAlchemyAlchemistIngredient embryoFlask_) private {
        if (!embryoFlask_.supportsInterface(type(IMagicAlchemyMarathonNft).interfaceId)) {
            revert InvalidInterface(type(IMagicAlchemyMarathonNft).interfaceId);
        }

        _embryoFlask = embryoFlask_;
        emit EmbryoFlaskSetup(embryoFlask_);
    }

    function _setAlchemist(IMagicAlchemyAlchemist alchemist_) private {
        if (!alchemist_.supportsInterface(type(IMagicAlchemyAlchemist).interfaceId)) {
            revert InvalidInterface(type(IMagicAlchemyAlchemist).interfaceId);
        }

        _alchemist = alchemist_;
        emit AlchemistSetup(alchemist_);
    }

    function _checkIngredientsOwnership(address player_, uint256 embryoFlaskId_, uint256[] calldata uglyBrothIds_)
        private
        view
    {
        {
            address embryoFlaskOwner_ = _embryoFlask.ownerOf(embryoFlaskId_);
            if (player_ != embryoFlaskOwner_) {
                revert SenderIsNotOwner(player_, embryoFlaskOwner_, address(_embryoFlask), embryoFlaskId_);
            }
        }

        for (uint256 index_ = 0; index_ < uglyBrothIds_.length; ++index_) {
            uint256 uglyBrothId_ = uglyBrothIds_[index_];
            address uglyBrothOwner_ = _uglyBroth.ownerOf(uglyBrothId_);
            if (player_ != uglyBrothOwner_) {
                revert SenderIsNotOwner(player_, uglyBrothOwner_, address(_uglyBroth), uglyBrothId_);
            }
        }
    }

    function _checkAlchemistRecipe(Rarity embryoRarity_, uint256[] calldata uglyBrothIds_) private view {
        if (embryoRarity_ == Rarity.Common || embryoRarity_ == Rarity.Rare) {
            if (uglyBrothIds_.length == 1) {
                _checkUglyBrothRarities(embryoRarity_, uglyBrothIds_);
            } else {
                revert BadUglyBrothAmountForRarity(embryoRarity_, uglyBrothIds_.length);
            }
        } else if (embryoRarity_ == Rarity.Epic || embryoRarity_ == Rarity.Legendary) {
            if (uglyBrothIds_.length == 1) {
                _checkUglyBrothRarities(Rarity.Epic, uglyBrothIds_);
            } else if (uglyBrothIds_.length == 12) {
                _checkUglyBrothRarities(Rarity.Common, uglyBrothIds_);
            } else {
                revert BadUglyBrothAmountForRarity(embryoRarity_, uglyBrothIds_.length);
            }
        } else {
            revert UnknownRarity(uint8(embryoRarity_));
        }
    }

    function _checkUglyBrothRarities(Rarity targetRarity_, uint256[] calldata uglyBrothIds_) private view {
        for (uint256 index_ = 0; index_ < uglyBrothIds_.length; ++index_) {
            uint256 uglyBrothId_ = uglyBrothIds_[index_];
            Rarity uglyBrothRarity_ = _uglyBroth.rarityOf(uglyBrothId_);
            if (uglyBrothRarity_ != targetRarity_) {
                revert BadUglyBrothRarity(targetRarity_, uglyBrothRarity_, uglyBrothId_);
            }
        }
    }
}

// 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/Pausable.sol)

pragma solidity ^0.8.20;

import {Context} from "../utils/Context.sol";

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    bool private _paused;

    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    /**
     * @dev The operation failed because the contract is paused.
     */
    error EnforcedPause();

    /**
     * @dev The operation failed because the contract is not paused.
     */
    error ExpectedPause();

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        _requireNotPaused();
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        _requirePaused();
        _;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused() internal view virtual {
        if (paused()) {
            revert EnforcedPause();
        }
    }

    /**
     * @dev Throws if the contract is not paused.
     */
    function _requirePaused() internal view virtual {
        if (!paused()) {
            revert ExpectedPause();
        }
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuardTransient.sol)

pragma solidity ^0.8.24;

import {TransientSlot} from "./TransientSlot.sol";

/**
 * @dev Variant of {ReentrancyGuard} that uses transient storage.
 *
 * NOTE: This variant only works on networks where EIP-1153 is available.
 *
 * _Available since v5.1._
 */
abstract contract ReentrancyGuardTransient {
    using TransientSlot for *;

    // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.ReentrancyGuard")) - 1)) & ~bytes32(uint256(0xff))
    bytes32 private constant REENTRANCY_GUARD_STORAGE =
        0x9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00;

    /**
     * @dev Unauthorized reentrant call.
     */
    error ReentrancyGuardReentrantCall();

    /**
     * @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 (_reentrancyGuardEntered()) {
            revert ReentrancyGuardReentrantCall();
        }

        // Any calls to nonReentrant after this point will fail
        REENTRANCY_GUARD_STORAGE.asBoolean().tstore(true);
    }

    function _nonReentrantAfter() private {
        REENTRANCY_GUARD_STORAGE.asBoolean().tstore(false);
    }

    /**
     * @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 REENTRANCY_GUARD_STORAGE.asBoolean().tload();
    }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.28;

import {IERC165} from "openzeppelin-contracts/contracts/interfaces/IERC165.sol";

import {MagicAlchemyRarity as Rarity} from "../utils/MagicAlchemyRarity.sol";

interface IMagicAlchemyMarathonNft is IERC165 {
    function rarityOf(uint256 tokenId) external view returns (Rarity);
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.28;

import {IMagicAlchemyMarathonNft} from "./IMagicAlchemyMarathonNft.sol";

interface IMagicAlchemyAlchemistIngredient is IMagicAlchemyMarathonNft {
    function ownerOf(uint256 tokenId) external view returns (address owner);
    function burn(uint256 tokenId) external;
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.28;

import {IMagicAlchemyMarathonNft} from "./IMagicAlchemyMarathonNft.sol";

import {MagicAlchemyRarity as Rarity} from "../utils/MagicAlchemyRarity.sol";

interface IMagicAlchemyAlchemist is IMagicAlchemyMarathonNft {
    function levelOf(uint256 tokenId) external view returns (uint256 level);
    function setTokenLevel(uint256 tokenId, uint256 level) external;
    function mint(address to, Rarity rarity) external returns (uint256 tokenId);
}

File 8 of 12 : MagicAlchemyRarity.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.28;

/**
 * @dev Enumeration of rarity levels used throughout the Magic Alchemy contracts.
 * It defines the four distinct tiers: Common, Rare, Epic, and Legendary.
 */
enum MagicAlchemyRarity {
    Common,
    Rare,
    Epic,
    Legendary
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (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;
    }

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (utils/TransientSlot.sol)
// This file was procedurally generated from scripts/generate/templates/TransientSlot.js.

pragma solidity ^0.8.24;

/**
 * @dev Library for reading and writing value-types to specific transient storage slots.
 *
 * Transient slots are often used to store temporary values that are removed after the current transaction.
 * This library helps with reading and writing to such slots without the need for inline assembly.
 *
 *  * Example reading and writing values using transient storage:
 * ```solidity
 * contract Lock {
 *     using TransientSlot for *;
 *
 *     // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.
 *     bytes32 internal constant _LOCK_SLOT = 0xf4678858b2b588224636b8522b729e7722d32fc491da849ed75b3fdf3c84f542;
 *
 *     modifier locked() {
 *         require(!_LOCK_SLOT.asBoolean().tload());
 *
 *         _LOCK_SLOT.asBoolean().tstore(true);
 *         _;
 *         _LOCK_SLOT.asBoolean().tstore(false);
 *     }
 * }
 * ```
 *
 * TIP: Consider using this library along with {SlotDerivation}.
 */
library TransientSlot {
    /**
     * @dev UDVT that represent a slot holding a address.
     */
    type AddressSlot is bytes32;

    /**
     * @dev Cast an arbitrary slot to a AddressSlot.
     */
    function asAddress(bytes32 slot) internal pure returns (AddressSlot) {
        return AddressSlot.wrap(slot);
    }

    /**
     * @dev UDVT that represent a slot holding a bool.
     */
    type BooleanSlot is bytes32;

    /**
     * @dev Cast an arbitrary slot to a BooleanSlot.
     */
    function asBoolean(bytes32 slot) internal pure returns (BooleanSlot) {
        return BooleanSlot.wrap(slot);
    }

    /**
     * @dev UDVT that represent a slot holding a bytes32.
     */
    type Bytes32Slot is bytes32;

    /**
     * @dev Cast an arbitrary slot to a Bytes32Slot.
     */
    function asBytes32(bytes32 slot) internal pure returns (Bytes32Slot) {
        return Bytes32Slot.wrap(slot);
    }

    /**
     * @dev UDVT that represent a slot holding a uint256.
     */
    type Uint256Slot is bytes32;

    /**
     * @dev Cast an arbitrary slot to a Uint256Slot.
     */
    function asUint256(bytes32 slot) internal pure returns (Uint256Slot) {
        return Uint256Slot.wrap(slot);
    }

    /**
     * @dev UDVT that represent a slot holding a int256.
     */
    type Int256Slot is bytes32;

    /**
     * @dev Cast an arbitrary slot to a Int256Slot.
     */
    function asInt256(bytes32 slot) internal pure returns (Int256Slot) {
        return Int256Slot.wrap(slot);
    }

    /**
     * @dev Load the value held at location `slot` in transient storage.
     */
    function tload(AddressSlot slot) internal view returns (address value) {
        assembly ("memory-safe") {
            value := tload(slot)
        }
    }

    /**
     * @dev Store `value` at location `slot` in transient storage.
     */
    function tstore(AddressSlot slot, address value) internal {
        assembly ("memory-safe") {
            tstore(slot, value)
        }
    }

    /**
     * @dev Load the value held at location `slot` in transient storage.
     */
    function tload(BooleanSlot slot) internal view returns (bool value) {
        assembly ("memory-safe") {
            value := tload(slot)
        }
    }

    /**
     * @dev Store `value` at location `slot` in transient storage.
     */
    function tstore(BooleanSlot slot, bool value) internal {
        assembly ("memory-safe") {
            tstore(slot, value)
        }
    }

    /**
     * @dev Load the value held at location `slot` in transient storage.
     */
    function tload(Bytes32Slot slot) internal view returns (bytes32 value) {
        assembly ("memory-safe") {
            value := tload(slot)
        }
    }

    /**
     * @dev Store `value` at location `slot` in transient storage.
     */
    function tstore(Bytes32Slot slot, bytes32 value) internal {
        assembly ("memory-safe") {
            tstore(slot, value)
        }
    }

    /**
     * @dev Load the value held at location `slot` in transient storage.
     */
    function tload(Uint256Slot slot) internal view returns (uint256 value) {
        assembly ("memory-safe") {
            value := tload(slot)
        }
    }

    /**
     * @dev Store `value` at location `slot` in transient storage.
     */
    function tstore(Uint256Slot slot, uint256 value) internal {
        assembly ("memory-safe") {
            tstore(slot, value)
        }
    }

    /**
     * @dev Load the value held at location `slot` in transient storage.
     */
    function tload(Int256Slot slot) internal view returns (int256 value) {
        assembly ("memory-safe") {
            value := tload(slot)
        }
    }

    /**
     * @dev Store `value` at location `slot` in transient storage.
     */
    function tstore(Int256Slot slot, int256 value) internal {
        assembly ("memory-safe") {
            tstore(slot, value)
        }
    }
}

File 11 of 12 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC165.sol)

pragma solidity ^0.8.20;

import {IERC165} from "../utils/introspection/IERC165.sol";

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/IERC165.sol)

pragma solidity ^0.8.20;

/**
 * @dev Interface of the ERC-165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[ERC].
 *
 * 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[ERC 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);
}

Settings
{
  "remappings": [
    "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
    "chainlink/=lib/chainlink/",
    "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
    "forge-std/=lib/forge-std/src/",
    "halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "cancun",
  "viaIR": true,
  "libraries": {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"contract IMagicAlchemyAlchemistIngredient","name":"uglyBroth_","type":"address"},{"internalType":"contract IMagicAlchemyAlchemistIngredient","name":"embryoFlask_","type":"address"},{"internalType":"contract IMagicAlchemyAlchemist","name":"alchemist_","type":"address"},{"internalType":"address","name":"initialOwner_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BadUglyBrothAmount","type":"error"},{"inputs":[{"internalType":"enum MagicAlchemyRarity","name":"rarity","type":"uint8"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BadUglyBrothAmountForRarity","type":"error"},{"inputs":[{"internalType":"enum MagicAlchemyRarity","name":"targetRarity","type":"uint8"},{"internalType":"enum MagicAlchemyRarity","name":"uglyBrothRarity","type":"uint8"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"BadUglyBrothRarity","type":"error"},{"inputs":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"ExpectedPause","type":"error"},{"inputs":[{"internalType":"bytes4","name":"required","type":"bytes4"}],"name":"InvalidInterface","type":"error"},{"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"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"SenderIsNotOwner","type":"error"},{"inputs":[{"internalType":"uint8","name":"rarity","type":"uint8"}],"name":"UnknownRarity","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IMagicAlchemyAlchemist","name":"alchemist","type":"address"}],"name":"AlchemistSetup","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IMagicAlchemyAlchemistIngredient","name":"embryo","type":"address"}],"name":"EmbryoFlaskSetup","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"player","type":"address"},{"indexed":true,"internalType":"uint256","name":"alchemistId","type":"uint256"},{"indexed":false,"internalType":"enum MagicAlchemyRarity","name":"alchemistRarity","type":"uint8"},{"indexed":true,"internalType":"uint256","name":"embryoFlaskId","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"uglyBrothIds","type":"uint256[]"}],"name":"SoulInfused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IMagicAlchemyAlchemistIngredient","name":"uglyBroth","type":"address"}],"name":"UglyBrothSetup","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"ALT_UGLY_BROTH_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"alchemist","outputs":[{"internalType":"contract IMagicAlchemyAlchemist","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"embryoFlask","outputs":[{"internalType":"contract IMagicAlchemyAlchemistIngredient","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"embryoFlaskId_","type":"uint256"},{"internalType":"uint256[]","name":"uglyBrothIds_","type":"uint256[]"}],"name":"infuseSoul","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":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IMagicAlchemyAlchemist","name":"alchemist_","type":"address"}],"name":"setAlchemist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IMagicAlchemyAlchemistIngredient","name":"embryoFlask_","type":"address"}],"name":"setEmbryoFlask","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IMagicAlchemyAlchemistIngredient","name":"uglyBroth_","type":"address"}],"name":"setUglyBroth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uglyBroth","outputs":[{"internalType":"contract IMagicAlchemyAlchemistIngredient","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608080604052346103395760808161129b803803809161001f828561033d565b8339810103126103395761003281610374565b61003e60208301610374565b60408301516001600160a01b038116939192919084900361033957606001516001600160a01b03811690819003610339578015610326575f8054604051929182906001600160a01b038316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a36001600160a81b0319161760a081901c60ff1661031757600160a01b175f553381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25890602090a16040516301ffc9a760e01b8152636e9dafcd60e11b60048201526001600160a01b03919091169190602081602481865afa9081156102b2575f916102f8575b50156102bd57600180546001600160a01b03191683179055604051917f027226b2f8497438c514139ace63e9b9612ef31f0f0b01338458118937873c3c5f80a26301ffc9a760e01b8252636e9dafcd60e11b60048301526001600160a01b031690602081602481855afa9081156102b2575f916102d9575b50156102bd57600280546001600160a01b03191682179055604051907ffdf24252aba5b6859ae3b5bb59bc098152760debec253064163c1a00f47f66ce5f80a26301ffc9a760e01b81526319c5609d60e31b6004820152602081602481855afa9081156102b2575f91610283575b501561026757600380546001600160a01b03191682179055604051907f85d7f0158b55b1ce83a2f8b906eb6000cebc061f7ff22bcfb728aeaa4a856e2a5f80a2610efa90816103a18239f35b631fea787760e11b5f9081526319c5609d60e31b600452602490fd5b6102a5915060203d6020116102ab575b61029d818361033d565b810190610388565b5f61021b565b503d610293565b6040513d5f823e3d90fd5b631fea787760e11b5f908152636e9dafcd60e11b600452602490fd5b6102f2915060203d6020116102ab5761029d818361033d565b5f6101ad565b610311915060203d6020116102ab5761029d818361033d565b5f610135565b63d93c066560e01b5f5260045ffd5b631e4fbdf760e01b5f525f60045260245ffd5b5f80fd5b601f909101601f19168101906001600160401b0382119082101761036057604052565b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b038216820361033957565b9081602091031261033957518015158103610339579056fe60806040526004361015610011575f80fd5b5f3560e01c80624c65aa14610cf35780630bad7c791461050b5780633f4ba83a1461049f5780635c975abb1461047b5780636987f20214610460578063715018a6146104095780638456cb59146103a95780638da5cb5b146103825780638de925f61461035a578063c22ee31814610282578063d31756121461025a578063dcd0913914610232578063f1af775f1461013f5763f2fde38b146100b2575f80fd5b3461013b57602036600319011261013b576004356001600160a01b0381169081900361013b576100e0610e4a565b8015610128575f80546001600160a01b03198116831782556001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a3005b631e4fbdf760e01b5f525f60045260245ffd5b5f80fd5b3461013b57602036600319011261013b576004356001600160a01b0381169081900361013b5761016d610e4a565b6040516301ffc9a760e01b81526319c5609d60e31b6004820152602081602481855afa908115610227575f916101f8575b50156101dc57600380546001600160a01b031916821790557f85d7f0158b55b1ce83a2f8b906eb6000cebc061f7ff22bcfb728aeaa4a856e2a5f80a2005b631fea787760e11b5f9081526319c5609d60e31b600452602490fd5b61021a915060203d602011610220575b6102128183610daf565b810190610e70565b8261019e565b503d610208565b6040513d5f823e3d90fd5b3461013b575f36600319011261013b576002546040516001600160a01b039091168152602090f35b3461013b575f36600319011261013b576001546040516001600160a01b039091168152602090f35b3461013b57602036600319011261013b576004356001600160a01b0381169081900361013b576102b0610e4a565b6040516301ffc9a760e01b8152636e9dafcd60e11b6004820152602081602481855afa908115610227575f9161033b575b501561031f57600180546001600160a01b031916821790557f027226b2f8497438c514139ace63e9b9612ef31f0f0b01338458118937873c3c5f80a2005b631fea787760e11b5f908152636e9dafcd60e11b600452602490fd5b610354915060203d602011610220576102128183610daf565b826102e1565b3461013b575f36600319011261013b576003546040516001600160a01b039091168152602090f35b3461013b575f36600319011261013b575f546040516001600160a01b039091168152602090f35b3461013b575f36600319011261013b576103c1610e4a565b6103c9610e88565b5f805460ff60a01b1916600160a01b1790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25890602090a1005b3461013b575f36600319011261013b57610421610e4a565b5f80546001600160a01b0319811682556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b3461013b575f36600319011261013b576020604051600c8152f35b3461013b575f36600319011261013b57602060ff5f5460a01c166040519015158152f35b3461013b575f36600319011261013b576104b7610e4a565b5f5460ff8160a01c16156104fc5760ff60a01b19165f556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa90602090a1005b638dfc202b60e01b5f5260045ffd5b3461013b57604036600319011261013b5760043560243567ffffffffffffffff811161013b573660238201121561013b5780600401359167ffffffffffffffff831161013b5760248201928060051b92602484369201011161013b5761056f610e88565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005c610ce45760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005d6001811492831580610cd9575b610cc6576002546040516331a9108f60e11b8152600481018590526001600160a01b0390911690602081602481855afa908115610227575f91610ca7575b506001600160a01b0381163303610c7157506001546001600160a01b03165f5b848110610bb7575050604051636e9dafcd60e11b81526004810185905294602086602481855afa958615610227575f96610b96575b50600486109081158061098e5787158015610b8a575b156109e15750156109c2576001546001600160a01b031690155f5b858110610913575050505b803b1561013b575f8091602460405180948193630852cd8d60e31b83528960048401525af1801561022757610903575b505f5b82811061089e5750600354604051630348ab1560e51b815233600482015294602091869160449183915f916001600160a01b03169061070b906024850190610e3d565b5af1938415610227575f9461086a575b506003546001600160a01b031691823b1561013b575f80936044604051809681936365302b3d60e11b83528a6004840152600160248401525af19283156102275760249361085a575b50600354604051636e9dafcd60e11b8152600481018790529360209185919082906001600160a01b03165afa928315610227575f93610829575b506107ac6040518094610e3d565b60406020840181905283018190526001600160fb1b031061013b577f7e0760497ce67ebe9cbf5a55c828789b7e42ed12ed3f3fc6769223cef4ade9fc828260209760608896013760608133948101030190a45f7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005d604051908152f35b61084c91935060203d602011610853575b6108448183610daf565b810190610de5565b918661079e565b503d61083a565b5f61086491610daf565b86610764565b9093506020813d602011610896575b8161088660209383610daf565b8101031261013b5751928561071b565b3d9150610879565b6001546001600160a01b0316906108b6818589610dfd565b35823b1561013b575f92602484926040519586938492630852cd8d60e31b845260048401525af1918215610227576001926108f3575b50016106c8565b5f6108fd91610daf565b876108ec565b5f61090d91610daf565b856106c5565b61091e81878b610dfd565b35604051636e9dafcd60e11b8152816004820152602081602481885afa9081156102275784905f926109a2575b5061098e57600481101561098e5789810361096a57505060010161068a565b6307349d8360e41b5f52610986906109818b610e21565b610e2f565b60445260645ffd5b634e487b7160e01b5f52602160045260245ffd5b6109bb91925060203d8111610853576108448183610daf565b908c61094b565b6001620aebf960e21b03195f52836109d987610e21565b60245260445ffd5b8091925061098e57600287148015610b7e575b15610b62575015610aa3576001546001600160a01b03165f5b848110610a1b575050610695565b610a2681868a610dfd565b35604051636e9dafcd60e11b8152816004820152602081602481875afa908115610227575f91610a85575b50600481101561098e5760028103610a6d575050600101610a0d565b6307349d8360e41b5f52600260045261098690610e2f565b610a9d915060203d8111610853576108448183610daf565b8a610a51565b600c8303610b4b576001546001600160a01b03165f5b848110610ac7575050610695565b610ad281868a610dfd565b35604051636e9dafcd60e11b8152816004820152602081602481875afa908115610227575f91610b2d575b50600481101561098e5780610b16575050600101610ab9565b6307349d8360e41b5f52610986905f600452610e2f565b610b45915060203d8111610853576108448183610daf565b8a610afd565b6001620aebf960e21b03195f52826109d986610e21565b869061098e5760ff906392f7c52760e01b5f521660045260245ffd5b50505f600387146109f4565b50505f6001881461066f565b610bb091965060203d602011610853576108448183610daf565b9487610659565b610bc281868a610dfd565b6040516331a9108f60e11b8152903560048201819052602082602481875afa918215610227575f92610c41575b506001600160a01b0382163303610c0a575050600101610624565b60405163a8ef085160e01b81523360048201526001600160a01b039283166024820152939091166044840152606483015250608490fd5b610c6391925060203d8111610c6a575b610c5b8183610daf565b810190610ea5565b908a610bef565b503d610c51565b60405163a8ef085160e01b81523360048201526001600160a01b0391821660248201529116604482015260648101849052608490fd5b610cc0915060203d602011610c6a57610c5b8183610daf565b87610604565b5063c8017cd760e01b5f5260045260245ffd5b50600c8214156105c6565b633ee5aeb560e01b5f5260045ffd5b3461013b57602036600319011261013b576004356001600160a01b0381169081900361013b57610d21610e4a565b6040516301ffc9a760e01b8152636e9dafcd60e11b6004820152602081602481855afa908115610227575f91610d90575b501561031f57600280546001600160a01b031916821790557ffdf24252aba5b6859ae3b5bb59bc098152760debec253064163c1a00f47f66ce5f80a2005b610da9915060203d602011610220576102128183610daf565b82610d52565b90601f8019910116810190811067ffffffffffffffff821117610dd157604052565b634e487b7160e01b5f52604160045260245ffd5b9081602091031261013b5751600481101561013b5790565b9190811015610e0d5760051b0190565b634e487b7160e01b5f52603260045260245ffd5b600481101561098e57600452565b600481101561098e57602452565b90600482101561098e5752565b5f546001600160a01b03163303610e5d57565b63118cdaa760e01b5f523360045260245ffd5b9081602091031261013b5751801515810361013b5790565b60ff5f5460a01c16610e9657565b63d93c066560e01b5f5260045ffd5b9081602091031261013b57516001600160a01b038116810361013b579056fea2646970667358221220f3e266663a5f01d0e5540aa75c4d09a047714fc2734ce6f20ac038fa5725a2ce64736f6c634300081c00330000000000000000000000004d111ccfe0e93c5da951c191bf1a3b8f73425ca4000000000000000000000000903cc78fdd424431ff74bee1f68579243a6132a300000000000000000000000005638c8d7135f21d355ef2dfbb013d110603c92a00000000000000000000000029c9613590b3adac1007c9f399a2cafa12ab8389

Deployed Bytecode

0x60806040526004361015610011575f80fd5b5f3560e01c80624c65aa14610cf35780630bad7c791461050b5780633f4ba83a1461049f5780635c975abb1461047b5780636987f20214610460578063715018a6146104095780638456cb59146103a95780638da5cb5b146103825780638de925f61461035a578063c22ee31814610282578063d31756121461025a578063dcd0913914610232578063f1af775f1461013f5763f2fde38b146100b2575f80fd5b3461013b57602036600319011261013b576004356001600160a01b0381169081900361013b576100e0610e4a565b8015610128575f80546001600160a01b03198116831782556001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a3005b631e4fbdf760e01b5f525f60045260245ffd5b5f80fd5b3461013b57602036600319011261013b576004356001600160a01b0381169081900361013b5761016d610e4a565b6040516301ffc9a760e01b81526319c5609d60e31b6004820152602081602481855afa908115610227575f916101f8575b50156101dc57600380546001600160a01b031916821790557f85d7f0158b55b1ce83a2f8b906eb6000cebc061f7ff22bcfb728aeaa4a856e2a5f80a2005b631fea787760e11b5f9081526319c5609d60e31b600452602490fd5b61021a915060203d602011610220575b6102128183610daf565b810190610e70565b8261019e565b503d610208565b6040513d5f823e3d90fd5b3461013b575f36600319011261013b576002546040516001600160a01b039091168152602090f35b3461013b575f36600319011261013b576001546040516001600160a01b039091168152602090f35b3461013b57602036600319011261013b576004356001600160a01b0381169081900361013b576102b0610e4a565b6040516301ffc9a760e01b8152636e9dafcd60e11b6004820152602081602481855afa908115610227575f9161033b575b501561031f57600180546001600160a01b031916821790557f027226b2f8497438c514139ace63e9b9612ef31f0f0b01338458118937873c3c5f80a2005b631fea787760e11b5f908152636e9dafcd60e11b600452602490fd5b610354915060203d602011610220576102128183610daf565b826102e1565b3461013b575f36600319011261013b576003546040516001600160a01b039091168152602090f35b3461013b575f36600319011261013b575f546040516001600160a01b039091168152602090f35b3461013b575f36600319011261013b576103c1610e4a565b6103c9610e88565b5f805460ff60a01b1916600160a01b1790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25890602090a1005b3461013b575f36600319011261013b57610421610e4a565b5f80546001600160a01b0319811682556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b3461013b575f36600319011261013b576020604051600c8152f35b3461013b575f36600319011261013b57602060ff5f5460a01c166040519015158152f35b3461013b575f36600319011261013b576104b7610e4a565b5f5460ff8160a01c16156104fc5760ff60a01b19165f556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa90602090a1005b638dfc202b60e01b5f5260045ffd5b3461013b57604036600319011261013b5760043560243567ffffffffffffffff811161013b573660238201121561013b5780600401359167ffffffffffffffff831161013b5760248201928060051b92602484369201011161013b5761056f610e88565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005c610ce45760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005d6001811492831580610cd9575b610cc6576002546040516331a9108f60e11b8152600481018590526001600160a01b0390911690602081602481855afa908115610227575f91610ca7575b506001600160a01b0381163303610c7157506001546001600160a01b03165f5b848110610bb7575050604051636e9dafcd60e11b81526004810185905294602086602481855afa958615610227575f96610b96575b50600486109081158061098e5787158015610b8a575b156109e15750156109c2576001546001600160a01b031690155f5b858110610913575050505b803b1561013b575f8091602460405180948193630852cd8d60e31b83528960048401525af1801561022757610903575b505f5b82811061089e5750600354604051630348ab1560e51b815233600482015294602091869160449183915f916001600160a01b03169061070b906024850190610e3d565b5af1938415610227575f9461086a575b506003546001600160a01b031691823b1561013b575f80936044604051809681936365302b3d60e11b83528a6004840152600160248401525af19283156102275760249361085a575b50600354604051636e9dafcd60e11b8152600481018790529360209185919082906001600160a01b03165afa928315610227575f93610829575b506107ac6040518094610e3d565b60406020840181905283018190526001600160fb1b031061013b577f7e0760497ce67ebe9cbf5a55c828789b7e42ed12ed3f3fc6769223cef4ade9fc828260209760608896013760608133948101030190a45f7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005d604051908152f35b61084c91935060203d602011610853575b6108448183610daf565b810190610de5565b918661079e565b503d61083a565b5f61086491610daf565b86610764565b9093506020813d602011610896575b8161088660209383610daf565b8101031261013b5751928561071b565b3d9150610879565b6001546001600160a01b0316906108b6818589610dfd565b35823b1561013b575f92602484926040519586938492630852cd8d60e31b845260048401525af1918215610227576001926108f3575b50016106c8565b5f6108fd91610daf565b876108ec565b5f61090d91610daf565b856106c5565b61091e81878b610dfd565b35604051636e9dafcd60e11b8152816004820152602081602481885afa9081156102275784905f926109a2575b5061098e57600481101561098e5789810361096a57505060010161068a565b6307349d8360e41b5f52610986906109818b610e21565b610e2f565b60445260645ffd5b634e487b7160e01b5f52602160045260245ffd5b6109bb91925060203d8111610853576108448183610daf565b908c61094b565b6001620aebf960e21b03195f52836109d987610e21565b60245260445ffd5b8091925061098e57600287148015610b7e575b15610b62575015610aa3576001546001600160a01b03165f5b848110610a1b575050610695565b610a2681868a610dfd565b35604051636e9dafcd60e11b8152816004820152602081602481875afa908115610227575f91610a85575b50600481101561098e5760028103610a6d575050600101610a0d565b6307349d8360e41b5f52600260045261098690610e2f565b610a9d915060203d8111610853576108448183610daf565b8a610a51565b600c8303610b4b576001546001600160a01b03165f5b848110610ac7575050610695565b610ad281868a610dfd565b35604051636e9dafcd60e11b8152816004820152602081602481875afa908115610227575f91610b2d575b50600481101561098e5780610b16575050600101610ab9565b6307349d8360e41b5f52610986905f600452610e2f565b610b45915060203d8111610853576108448183610daf565b8a610afd565b6001620aebf960e21b03195f52826109d986610e21565b869061098e5760ff906392f7c52760e01b5f521660045260245ffd5b50505f600387146109f4565b50505f6001881461066f565b610bb091965060203d602011610853576108448183610daf565b9487610659565b610bc281868a610dfd565b6040516331a9108f60e11b8152903560048201819052602082602481875afa918215610227575f92610c41575b506001600160a01b0382163303610c0a575050600101610624565b60405163a8ef085160e01b81523360048201526001600160a01b039283166024820152939091166044840152606483015250608490fd5b610c6391925060203d8111610c6a575b610c5b8183610daf565b810190610ea5565b908a610bef565b503d610c51565b60405163a8ef085160e01b81523360048201526001600160a01b0391821660248201529116604482015260648101849052608490fd5b610cc0915060203d602011610c6a57610c5b8183610daf565b87610604565b5063c8017cd760e01b5f5260045260245ffd5b50600c8214156105c6565b633ee5aeb560e01b5f5260045ffd5b3461013b57602036600319011261013b576004356001600160a01b0381169081900361013b57610d21610e4a565b6040516301ffc9a760e01b8152636e9dafcd60e11b6004820152602081602481855afa908115610227575f91610d90575b501561031f57600280546001600160a01b031916821790557ffdf24252aba5b6859ae3b5bb59bc098152760debec253064163c1a00f47f66ce5f80a2005b610da9915060203d602011610220576102128183610daf565b82610d52565b90601f8019910116810190811067ffffffffffffffff821117610dd157604052565b634e487b7160e01b5f52604160045260245ffd5b9081602091031261013b5751600481101561013b5790565b9190811015610e0d5760051b0190565b634e487b7160e01b5f52603260045260245ffd5b600481101561098e57600452565b600481101561098e57602452565b90600482101561098e5752565b5f546001600160a01b03163303610e5d57565b63118cdaa760e01b5f523360045260245ffd5b9081602091031261013b5751801515810361013b5790565b60ff5f5460a01c16610e9657565b63d93c066560e01b5f5260045ffd5b9081602091031261013b57516001600160a01b038116810361013b579056fea2646970667358221220f3e266663a5f01d0e5540aa75c4d09a047714fc2734ce6f20ac038fa5725a2ce64736f6c634300081c0033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000004d111ccfe0e93c5da951c191bf1a3b8f73425ca4000000000000000000000000903cc78fdd424431ff74bee1f68579243a6132a300000000000000000000000005638c8d7135f21d355ef2dfbb013d110603c92a00000000000000000000000029c9613590b3adac1007c9f399a2cafa12ab8389

-----Decoded View---------------
Arg [0] : uglyBroth_ (address): 0x4d111CCfE0E93c5dA951c191Bf1a3B8F73425cA4
Arg [1] : embryoFlask_ (address): 0x903Cc78fdd424431ff74bEE1f68579243A6132a3
Arg [2] : alchemist_ (address): 0x05638C8D7135F21d355ef2DFbb013D110603C92A
Arg [3] : initialOwner_ (address): 0x29c9613590b3aDaC1007c9F399a2cafA12aB8389

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000004d111ccfe0e93c5da951c191bf1a3b8f73425ca4
Arg [1] : 000000000000000000000000903cc78fdd424431ff74bee1f68579243a6132a3
Arg [2] : 00000000000000000000000005638c8d7135f21d355ef2dfbb013d110603c92a
Arg [3] : 00000000000000000000000029c9613590b3adac1007c9f399a2cafa12ab8389


Block Transaction Gas Used Reward
view all blocks produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
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.