Source Code
Latest 25 from a total of 3,506 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Infuse Soul | 81904594 | 3 days ago | IN | 0 POL | 0.14219821 | ||||
| Infuse Soul | 81773386 | 6 days ago | IN | 0 POL | 0.11296538 | ||||
| Infuse Soul | 81768096 | 6 days ago | IN | 0 POL | 0.15562516 | ||||
| Infuse Soul | 81767278 | 6 days ago | IN | 0 POL | 0.15098023 | ||||
| Infuse Soul | 81719008 | 8 days ago | IN | 0 POL | 0.08006446 | ||||
| Infuse Soul | 81646093 | 9 days ago | IN | 0 POL | 0.16254072 | ||||
| Infuse Soul | 81643811 | 9 days ago | IN | 0 POL | 0.22130674 | ||||
| Infuse Soul | 81612115 | 10 days ago | IN | 0 POL | 0.15998807 | ||||
| Infuse Soul | 81593900 | 10 days ago | IN | 0 POL | 0.12556216 | ||||
| Infuse Soul | 81593455 | 11 days ago | IN | 0 POL | 0.18943437 | ||||
| Infuse Soul | 81370944 | 16 days ago | IN | 0 POL | 1.11467344 | ||||
| Infuse Soul | 81036284 | 23 days ago | IN | 0 POL | 1.10491935 | ||||
| Infuse Soul | 80811605 | 29 days ago | IN | 0 POL | 0.02006701 | ||||
| Infuse Soul | 80216195 | 43 days ago | IN | 0 POL | 0.00953254 | ||||
| Infuse Soul | 80085427 | 46 days ago | IN | 0 POL | 0.01039158 | ||||
| Infuse Soul | 79145641 | 67 days ago | IN | 0 POL | 0.13665942 | ||||
| Infuse Soul | 79135991 | 68 days ago | IN | 0 POL | 0.07355409 | ||||
| Infuse Soul | 78542122 | 81 days ago | IN | 0 POL | 0.0295754 | ||||
| Infuse Soul | 78449834 | 83 days ago | IN | 0 POL | 0.01840742 | ||||
| Infuse Soul | 78349028 | 86 days ago | IN | 0 POL | 0.02343202 | ||||
| Infuse Soul | 78288011 | 87 days ago | IN | 0 POL | 0.00861521 | ||||
| Infuse Soul | 78268450 | 88 days ago | IN | 0 POL | 0.01017632 | ||||
| Infuse Soul | 78237820 | 88 days ago | IN | 0 POL | 0.00858669 | ||||
| Infuse Soul | 78234851 | 88 days ago | IN | 0 POL | 0.01035302 | ||||
| Infuse Soul | 78201064 | 89 days ago | IN | 0 POL | 0.00899082 |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
MagicAlchemyFountainOfLife
Compiler Version
v0.8.28+commit.7893614a
Optimization Enabled:
Yes with 200 runs
Other Settings:
cancun EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// 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);
}// 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)
}
}
}// 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);
}{
"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
- No Contract Security Audit Submitted- Submit Audit Here
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"}]Contract Creation Code
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
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in POL
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.