Overview
S Balance
S Value
$0.00More Info
Private Name Tags
ContractCreator
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Latest 1 internal transaction
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
9980149 | 26 hrs ago | Contract Creation | 0 S |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
PendleCommonSYFactory
Compiler Version
v0.8.24+commit.e11b9ed9
Optimization Enabled:
Yes with 1000000 runs
Other Settings:
shanghai EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity ^0.8.17; import "../../core/libraries/BoringOwnableUpgradeable.sol"; import "../../core/libraries/BaseSplitCodeFactory.sol"; import "../../interfaces/IOwnable.sol"; contract PendleCommonSYFactory is BoringOwnableUpgradeable { error InvalidCreationCode(bytes32 id, CreationCode code); error InvalidSYId(bytes32 id); struct CreationCode { address creationCodeContractA; uint256 creationCodeSizeA; address creationCodeContractB; uint256 creationCodeSizeB; } event SetSYCreationCode(bytes32 id, CreationCode code); event DeployedSY(bytes32 id, bytes constructorParams, address SY); mapping(bytes32 => CreationCode) public creationCodes; constructor() { _disableInitializers(); } function initialize() external initializer { __BoringOwnable_init(); } function setSYCreationCode(bytes32 id, CreationCode memory code) external onlyOwner { if ( code.creationCodeContractA == address(0) || code.creationCodeContractB == address(0) || code.creationCodeSizeA == 0 || code.creationCodeSizeB == 0 ) { revert InvalidCreationCode(id, code); } creationCodes[id] = code; emit SetSYCreationCode(id, code); } function deploySY(bytes32 id, bytes memory constructorParams, address syOwner) external returns (address SY) { CreationCode memory code = creationCodes[id]; if (code.creationCodeContractA == address(0)) { revert InvalidSYId(id); } SY = BaseSplitCodeFactory._create2( 0, bytes32(block.chainid), constructorParams, code.creationCodeContractA, code.creationCodeSizeA, code.creationCodeContractB, code.creationCodeSizeB ); emit DeployedSY(id, constructorParams, SY); IOwnable(SY).transferOwnership(syOwner, true, false); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.2; import "../../utils/AddressUpgradeable.sol"; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ```solidity * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. * * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a * constructor. * * Emits an {Initialized} event. */ modifier initializer() { bool isTopLevelCall = !_initializing; require( (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1), "Initializable: contract is already initialized" ); _initialized = 1; if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * A reinitializer may be used after the original initialization step. This is essential to configure modules that * are added through upgrades and that require initialization. * * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer` * cannot be nested. If one is invoked in the context of another, execution will revert. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. * * WARNING: setting the version to 255 will prevent any future reinitialization. * * Emits an {Initialized} event. */ modifier reinitializer(uint8 version) { require(!_initializing && _initialized < version, "Initializable: contract is already initialized"); _initialized = version; _initializing = true; _; _initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. * * Emits an {Initialized} event the first time it is successfully executed. */ function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); if (_initialized != type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } /** * @dev Returns the highest version that has been initialized. See {reinitializer}. */ function _getInitializedVersion() internal view returns (uint8) { return _initialized; } /** * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}. */ function _isInitializing() internal view returns (bool) { return _initializing; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/Create2.sol) pragma solidity ^0.8.0; /** * @dev Helper to make usage of the `CREATE2` EVM opcode easier and safer. * `CREATE2` can be used to compute in advance the address where a smart * contract will be deployed, which allows for interesting new mechanisms known * as 'counterfactual interactions'. * * See the https://eips.ethereum.org/EIPS/eip-1014#motivation[EIP] for more * information. */ library Create2 { /** * @dev Deploys a contract using `CREATE2`. The address where the contract * will be deployed can be known in advance via {computeAddress}. * * The bytecode for a contract can be obtained from Solidity with * `type(contractName).creationCode`. * * Requirements: * * - `bytecode` must not be empty. * - `salt` must have not been used for `bytecode` already. * - the factory must have a balance of at least `amount`. * - if `amount` is non-zero, `bytecode` must have a `payable` constructor. */ function deploy(uint256 amount, bytes32 salt, bytes memory bytecode) internal returns (address addr) { require(address(this).balance >= amount, "Create2: insufficient balance"); require(bytecode.length != 0, "Create2: bytecode length is zero"); /// @solidity memory-safe-assembly assembly { addr := create2(amount, add(bytecode, 0x20), mload(bytecode), salt) } require(addr != address(0), "Create2: Failed on deploy"); } /** * @dev Returns the address where a contract will be stored if deployed via {deploy}. Any change in the * `bytecodeHash` or `salt` will result in a new destination address. */ function computeAddress(bytes32 salt, bytes32 bytecodeHash) internal view returns (address) { return computeAddress(salt, bytecodeHash, address(this)); } /** * @dev Returns the address where a contract will be stored if deployed via {deploy} from a contract located at * `deployer`. If `deployer` is this contract's address, returns the same value as {computeAddress}. */ function computeAddress(bytes32 salt, bytes32 bytecodeHash, address deployer) internal pure returns (address addr) { /// @solidity memory-safe-assembly assembly { let ptr := mload(0x40) // Get free memory pointer // | | ↓ ptr ... ↓ ptr + 0x0B (start) ... ↓ ptr + 0x20 ... ↓ ptr + 0x40 ... | // |-------------------|---------------------------------------------------------------------------| // | bytecodeHash | CCCCCCCCCCCCC...CC | // | salt | BBBBBBBBBBBBB...BB | // | deployer | 000000...0000AAAAAAAAAAAAAAAAAAA...AA | // | 0xFF | FF | // |-------------------|---------------------------------------------------------------------------| // | memory | 000000...00FFAAAAAAAAAAAAAAAAAAA...AABBBBBBBBBBBBB...BBCCCCCCCCCCCCC...CC | // | keccak(start, 85) | ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ | mstore(add(ptr, 0x40), bytecodeHash) mstore(add(ptr, 0x20), salt) mstore(ptr, deployer) // Right-aligned with 12 preceding garbage bytes let start := add(ptr, 0x0b) // The hashed data starts at the final garbage byte which we will set to 0xff mstore8(start, 0xff) addr := keccak256(start, 85) } } }
// SPDX-License-Identifier: GPL-3.0-or-later // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity ^0.8.0; import "@openzeppelin/contracts/utils/Create2.sol"; library CodeDeployer { // During contract construction, the full code supplied exists as code, and can be accessed via `codesize` and // `codecopy`. This is not the contract's final code however: whatever the constructor returns is what will be // stored as its code. // // We use this mechanism to have a simple constructor that stores whatever is appended to it. The following opcode // sequence corresponds to the creation code of the following equivalent Solidity contract, plus padding to make the // full code 32 bytes long: // // contract CodeDeployer { // constructor() payable { // uint256 size; // assembly { // size := sub(codesize(), 32) // size of appended data, as constructor is 32 bytes long // codecopy(0, 32, size) // copy all appended data to memory at position 0 // return(0, size) // return appended data for it to be stored as code // } // } // } // // More specifically, it is composed of the following opcodes (plus padding): // // [1] PUSH1 0x20 // [2] CODESIZE // [3] SUB // [4] DUP1 // [6] PUSH1 0x20 // [8] PUSH1 0x00 // [9] CODECOPY // [11] PUSH1 0x00 // [12] RETURN // // The padding is just the 0xfe sequence (invalid opcode). It is important as it lets us work in-place, avoiding // memory allocation and copying. bytes32 private constant _DEPLOYER_CREATION_CODE = 0x602038038060206000396000f3fefefefefefefefefefefefefefefefefefefe; /** * @dev Deploys a contract with `code` as its code, returning the destination address. * * Reverts if deployment fails. */ function deploy(bytes memory code) internal returns (address destination) { bytes32 deployerCreationCode = _DEPLOYER_CREATION_CODE; // We need to concatenate the deployer creation code and `code` in memory, but want to avoid copying all of // `code` (which could be quite long) into a new memory location. Therefore, we operate in-place using // assembly. // solhint-disable-next-line no-inline-assembly assembly { let codeLength := mload(code) // `code` is composed of length and data. We've already stored its length in `codeLength`, so we simply // replace it with the deployer creation code (which is exactly 32 bytes long). mstore(code, deployerCreationCode) // At this point, `code` now points to the deployer creation code immediately followed by `code`'s data // contents. This is exactly what the deployer expects to receive when created. destination := create(0, code, add(codeLength, 32)) // Finally, we restore the original length in order to not mutate `code`. mstore(code, codeLength) } // The create opcode returns the zero address when contract creation fails, so we revert if this happens. require(destination != address(0), "DEPLOYMENT_FAILED_BALANCER"); } } library BaseSplitCodeFactory { function setCreationCode( bytes memory creationCode ) internal returns ( address creationCodeContractA, uint256 creationCodeSizeA, address creationCodeContractB, uint256 creationCodeSizeB ) { unchecked { require(creationCode.length > 0, "zero length"); uint256 creationCodeSize = creationCode.length; // We are going to deploy two contracts: one with approximately the first half of `creationCode`'s contents // (A), and another with the remaining half (B). // We store the lengths in both immutable and stack variables, since immutable variables cannot be read during // construction. creationCodeSizeA = creationCodeSize / 2; creationCodeSizeB = creationCodeSize - creationCodeSizeA; // To deploy the contracts, we're going to use `CodeDeployer.deploy()`, which expects a memory array with // the code to deploy. Note that we cannot simply create arrays for A and B's code by copying or moving // `creationCode`'s contents as they are expected to be very large (> 24kB), so we must operate in-place. // Memory: [ code length ] [ A.data ] [ B.data ] // Creating A's array is simple: we simply replace `creationCode`'s length with A's length. We'll later restore // the original length. bytes memory creationCodeA; assembly { creationCodeA := creationCode mstore(creationCodeA, creationCodeSizeA) } // Memory: [ A.length ] [ A.data ] [ B.data ] // ^ creationCodeA creationCodeContractA = CodeDeployer.deploy(creationCodeA); // Creating B's array is a bit more involved: since we cannot move B's contents, we are going to create a 'new' // memory array starting at A's last 32 bytes, which will be replaced with B's length. We'll back-up this last // byte to later restore it. bytes memory creationCodeB; bytes32 lastByteA; assembly { // `creationCode` points to the array's length, not data, so by adding A's length to it we arrive at A's // last 32 bytes. creationCodeB := add(creationCode, creationCodeSizeA) lastByteA := mload(creationCodeB) mstore(creationCodeB, creationCodeSizeB) } // Memory: [ A.length ] [ A.data[ : -1] ] [ B.length ][ B.data ] // ^ creationCodeA ^ creationCodeB creationCodeContractB = CodeDeployer.deploy(creationCodeB); // We now restore the original contents of `creationCode` by writing back the original length and A's last byte. assembly { mstore(creationCodeA, creationCodeSize) mstore(creationCodeB, lastByteA) } } } /** * @dev Returns the creation code of the contract this factory creates. */ function getCreationCode( address creationCodeContractA, uint256 creationCodeSizeA, address creationCodeContractB, uint256 creationCodeSizeB ) internal view returns (bytes memory) { return _getCreationCodeWithArgs( "", creationCodeContractA, creationCodeSizeA, creationCodeContractB, creationCodeSizeB ); } /** * @dev Returns the creation code that will result in a contract being deployed with `constructorArgs`. */ function _getCreationCodeWithArgs( bytes memory constructorArgs, address creationCodeContractA, uint256 creationCodeSizeA, address creationCodeContractB, uint256 creationCodeSizeB ) private view returns (bytes memory code) { unchecked { // This function exists because `abi.encode()` cannot be instructed to place its result at a specific address. // We need for the ABI-encoded constructor arguments to be located immediately after the creation code, but // cannot rely on `abi.encodePacked()` to perform concatenation as that would involve copying the creation code, // which would be prohibitively expensive. // Instead, we compute the creation code in a pre-allocated array that is large enough to hold *both* the // creation code and the constructor arguments, and then copy the ABI-encoded arguments (which should not be // overly long) right after the end of the creation code. // Immutable variables cannot be used in assembly, so we store them in the stack first. uint256 creationCodeSize = creationCodeSizeA + creationCodeSizeB; uint256 constructorArgsSize = constructorArgs.length; uint256 codeSize = creationCodeSize + constructorArgsSize; assembly { // First, we allocate memory for `code` by retrieving the free memory pointer and then moving it ahead of // `code` by the size of the creation code plus constructor arguments, and 32 bytes for the array length. code := mload(0x40) mstore(0x40, add(code, add(codeSize, 32))) // We now store the length of the code plus constructor arguments. mstore(code, codeSize) // Next, we concatenate the creation code stored in A and B. let dataStart := add(code, 32) extcodecopy(creationCodeContractA, dataStart, 0, creationCodeSizeA) extcodecopy(creationCodeContractB, add(dataStart, creationCodeSizeA), 0, creationCodeSizeB) } // Finally, we copy the constructorArgs to the end of the array. Unfortunately there is no way to avoid this // copy, as it is not possible to tell Solidity where to store the result of `abi.encode()`. uint256 constructorArgsDataPtr; uint256 constructorArgsCodeDataPtr; assembly { constructorArgsDataPtr := add(constructorArgs, 32) constructorArgsCodeDataPtr := add(add(code, 32), creationCodeSize) } _memcpy(constructorArgsCodeDataPtr, constructorArgsDataPtr, constructorArgsSize); } } /** * @dev Deploys a contract with constructor arguments. To create `constructorArgs`, call `abi.encode()` with the * contract's constructor arguments, in order. */ function _create2( uint256 amount, bytes32 salt, bytes memory constructorArgs, address creationCodeContractA, uint256 creationCodeSizeA, address creationCodeContractB, uint256 creationCodeSizeB ) internal returns (address) { unchecked { bytes memory creationCode = _getCreationCodeWithArgs( constructorArgs, creationCodeContractA, creationCodeSizeA, creationCodeContractB, creationCodeSizeB ); return Create2.deploy(amount, salt, creationCode); } } // From // https://github.com/Arachnid/solidity-stringutils/blob/b9a6f6615cf18a87a823cbc461ce9e140a61c305/src/strings.sol function _memcpy(uint256 dest, uint256 src, uint256 len) private pure { unchecked { // Copy word-length chunks while possible for (; len >= 32; len -= 32) { assembly { mstore(dest, mload(src)) } dest += 32; src += 32; } // Copy remaining bytes uint256 mask = 256 ** (32 - len) - 1; assembly { let srcpart := and(mload(src), not(mask)) let destpart := and(mload(dest), mask) mstore(dest, or(destpart, srcpart)) } } } }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity ^0.8.0; import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; contract BoringOwnableUpgradeableData { address public owner; address public pendingOwner; } abstract contract BoringOwnableUpgradeable is BoringOwnableUpgradeableData, Initializable { event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); function __BoringOwnable_init() internal onlyInitializing { owner = msg.sender; } /// @notice Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner. /// Can only be invoked by the current `owner`. /// @param newOwner Address of the new owner. /// @param direct True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`. /// @param renounce Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise. function transferOwnership(address newOwner, bool direct, bool renounce) public onlyOwner { if (direct) { // Checks require(newOwner != address(0) || renounce, "Ownable: zero address"); // Effects emit OwnershipTransferred(owner, newOwner); owner = newOwner; pendingOwner = address(0); } else { // Effects pendingOwner = newOwner; } } /// @notice Needs to be called by `pendingOwner` to claim ownership. function claimOwnership() public { address _pendingOwner = pendingOwner; // Checks require(msg.sender == _pendingOwner, "Ownable: caller != pending owner"); // Effects emit OwnershipTransferred(owner, _pendingOwner); owner = _pendingOwner; pendingOwner = address(0); } /// @notice Only allows the `owner` to execute the function. modifier onlyOwner() { require(msg.sender == owner, "Ownable: caller is not the owner"); _; } uint256[48] private __gap; }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity ^0.8.0; interface IOwnable { function transferOwnership(address newOwner, bool direct, bool renounce) external; }
{ "optimizer": { "enabled": true, "runs": 1000000 }, "viaIR": true, "evmVersion": "shanghai", "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"bytes32","name":"id","type":"bytes32"},{"components":[{"internalType":"address","name":"creationCodeContractA","type":"address"},{"internalType":"uint256","name":"creationCodeSizeA","type":"uint256"},{"internalType":"address","name":"creationCodeContractB","type":"address"},{"internalType":"uint256","name":"creationCodeSizeB","type":"uint256"}],"internalType":"struct PendleCommonSYFactory.CreationCode","name":"code","type":"tuple"}],"name":"InvalidCreationCode","type":"error"},{"inputs":[{"internalType":"bytes32","name":"id","type":"bytes32"}],"name":"InvalidSYId","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"id","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"constructorParams","type":"bytes"},{"indexed":false,"internalType":"address","name":"SY","type":"address"}],"name":"DeployedSY","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","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":"bytes32","name":"id","type":"bytes32"},{"components":[{"internalType":"address","name":"creationCodeContractA","type":"address"},{"internalType":"uint256","name":"creationCodeSizeA","type":"uint256"},{"internalType":"address","name":"creationCodeContractB","type":"address"},{"internalType":"uint256","name":"creationCodeSizeB","type":"uint256"}],"indexed":false,"internalType":"struct PendleCommonSYFactory.CreationCode","name":"code","type":"tuple"}],"name":"SetSYCreationCode","type":"event"},{"inputs":[],"name":"claimOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"creationCodes","outputs":[{"internalType":"address","name":"creationCodeContractA","type":"address"},{"internalType":"uint256","name":"creationCodeSizeA","type":"uint256"},{"internalType":"address","name":"creationCodeContractB","type":"address"},{"internalType":"uint256","name":"creationCodeSizeB","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"id","type":"bytes32"},{"internalType":"bytes","name":"constructorParams","type":"bytes"},{"internalType":"address","name":"syOwner","type":"address"}],"name":"deploySY","outputs":[{"internalType":"address","name":"SY","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"id","type":"bytes32"},{"components":[{"internalType":"address","name":"creationCodeContractA","type":"address"},{"internalType":"uint256","name":"creationCodeSizeA","type":"uint256"},{"internalType":"address","name":"creationCodeContractB","type":"address"},{"internalType":"uint256","name":"creationCodeSizeB","type":"uint256"}],"internalType":"struct PendleCommonSYFactory.CreationCode","name":"code","type":"tuple"}],"name":"setSYCreationCode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"},{"internalType":"bool","name":"direct","type":"bool"},{"internalType":"bool","name":"renounce","type":"bool"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608080604052346100cc576001549060ff8260a81c1661007a575060ff808260a01c1603610037575b6040516111b190816100d18239f35b60ff60a01b191660ff60a01b1760015560405160ff81527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602090a15f610028565b62461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608490fd5b5f80fdfe60806040526004361015610011575f80fd5b5f3560e01c8063078dfbe7146100945780631aad829a1461008f5780634d0bccc51461008a5780634e71e0c8146100855780638129fc1c146100805780638da5cb5b1461007b578063e1bfd477146100765763e30c397814610071575f80fd5b6108f2565b610802565b6107b2565b61062d565b6104eb565b61045f565b6103ae565b346102805760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610280576100cb610284565b6100d36102ed565b906100dc6102fc565b9173ffffffffffffffffffffffffffffffffffffffff90610101825f54163314610943565b1561025057811691821590811591610248575b50156101ea576101bb9161015861013f5f5473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a373ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff00000000000000000000000000000000000000005f5416175f55565b6101e87fffffffffffffffffffffffff000000000000000000000000000000000000000060015416600155565b005b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4f776e61626c653a207a65726f206164647265737300000000000000000000006044820152fd5b905083610114565b9150167fffffffffffffffffffffffff000000000000000000000000000000000000000060015416176001555f80f35b5f80fd5b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361028057565b6064359073ffffffffffffffffffffffffffffffffffffffff8216820361028057565b6044359073ffffffffffffffffffffffffffffffffffffffff8216820361028057565b60243590811515820361028057565b60443590811515820361028057565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6080810190811067ffffffffffffffff82111761035457604052565b61030b565b67ffffffffffffffff811161035457604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761035457604052565b346102805760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102805760807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc3601126102805760405161041381610338565b6024359073ffffffffffffffffffffffffffffffffffffffff82168203610280576101e8918152604435602082015261044a6102a7565b604082015260843560608201526004356109a8565b346102805760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610280576004355f526032602052608060405f2073ffffffffffffffffffffffffffffffffffffffff8082541691600360018201549260028301541691015491604051938452602084015260408301526060820152f35b5f91031261028057565b34610280575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102805773ffffffffffffffffffffffffffffffffffffffff80600154168033036105cf57806105a5925f54167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a373ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff00000000000000000000000000000000000000005f5416175f55565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055005b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602060248201527f4f776e61626c653a2063616c6c657220213d2070656e64696e67206f776e65726044820152fd5b34610280575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102805760015461067f60ff8260a81c1615809281936107a0575b811561077d575b50610c09565b806106c4740100000000000000000000000000000000000000007fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff6001541617600155565b610733575b6106d1610f18565b6106d757005b6107047fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff60015416600155565b604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602090a1005b61077875010000000000000000000000000000000000000000007fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff6001541617600155565b6106c9565b303b1591508161078f575b505f610679565b60a01c60ff1660011490505f610788565b9050600160ff8260a01c161090610672565b34610280575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261028057602073ffffffffffffffffffffffffffffffffffffffff5f5416604051908152f35b346102805760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102805767ffffffffffffffff60243581811161028057366023820112156102805780600401359182116103545760405161089060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f860116018261036d565b8281523660248484010111610280575f6020846108ee9560246108c7960183860137830101526108be6102ca565b90600435610d72565b60405173ffffffffffffffffffffffffffffffffffffffff90911681529081906020820190565b0390f35b34610280575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261028057602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b1561094a57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b73ffffffffffffffffffffffffffffffffffffffff6109cb815f54163314610943565b825173ffffffffffffffffffffffffffffffffffffffff1616158015610b1d575b8015610b11575b8015610b05575b610a93579081610a3c82610a377f5f419bdcef2cdc4cdb667c8d94e4b419b1d6beec9dfb92d205a530c54f0de3cc955f52603260205260405f2090565b610b48565b610a8e60405192839283909291606060809160a0840195845273ffffffffffffffffffffffffffffffffffffffff80825116602086015260208201516040860152604082015116828501520151910152565b0390a1565b604080517f1da0be980000000000000000000000000000000000000000000000000000000081526004810192909252825173ffffffffffffffffffffffffffffffffffffffff90811660248401526020840151604484015290830151166064820152606090910151608482015260a490fd5b506060820151156109fa565b506020820151156109f3565b50610b4261013f604084015173ffffffffffffffffffffffffffffffffffffffff1690565b156109ec565b906060600391610c0273ffffffffffffffffffffffffffffffffffffffff610bae81845116879073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b60208301516001870155604083015116600286019073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b0151910155565b15610c1057565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152fd5b90604051610ca181610338565b60606003829473ffffffffffffffffffffffffffffffffffffffff8082541685526001820154602086015260028201541660408501520154910152565b919093929382526020606060208401528151918260608501525f5b838110610d535750505073ffffffffffffffffffffffffffffffffffffffff60807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f845f846040978901015201168401019416910152565b818101830151858201608001528201610cf9565b6040513d5f823e3d90fd5b929190610d8f610d8a855f52603260205260405f2090565b610c94565b9073ffffffffffffffffffffffffffffffffffffffff9182610dc5825173ffffffffffffffffffffffffffffffffffffffff1690565b1615610ee65790610e4382610e0f7f07a80415c524a669398df01e97c487fc00986190468c09e2741b44181c5dc8c3945173ffffffffffffffffffffffffffffffffffffffff1690565b9060208101516060610e38604084015173ffffffffffffffffffffffffffffffffffffffff1690565b920151928546610fd4565b95610e548760405193849384610cde565b0390a18316803b15610280576040517f078dfbe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff929092166004830152600160248301525f60448301819052908290606490829084905af18015610ee157610ecc5750565b80610ed9610edf92610359565b806104e1565b565b610d67565b6040517f9661f39100000000000000000000000000000000000000000000000000000000815260048101879052602490fd5b60ff60015460a81c1615610f5057337fffffffffffffffffffffffff00000000000000000000000000000000000000005f5416175f55565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152fd5b92915f9695919282810192845190898286019860405199858b9660209e8f998a8a8682809d9881990101604052815201903c8b0101903c930191850101915b8681101561105d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9061105a9697036101000a0190811990511690825116179052611090565b90565b8151835291860191908601907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001611013565b9080511561111d576020815191015ff59073ffffffffffffffffffffffffffffffffffffffff8216156110bf57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f79000000000000006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602060248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f6044820152fdfea26469706673582212209f3bbac18f1260e35e6906b9fbccf901bcbd066718cf6eccdb71e2cd3ad8f09564736f6c63430008180033
Deployed Bytecode
0x60806040526004361015610011575f80fd5b5f3560e01c8063078dfbe7146100945780631aad829a1461008f5780634d0bccc51461008a5780634e71e0c8146100855780638129fc1c146100805780638da5cb5b1461007b578063e1bfd477146100765763e30c397814610071575f80fd5b6108f2565b610802565b6107b2565b61062d565b6104eb565b61045f565b6103ae565b346102805760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610280576100cb610284565b6100d36102ed565b906100dc6102fc565b9173ffffffffffffffffffffffffffffffffffffffff90610101825f54163314610943565b1561025057811691821590811591610248575b50156101ea576101bb9161015861013f5f5473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a373ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff00000000000000000000000000000000000000005f5416175f55565b6101e87fffffffffffffffffffffffff000000000000000000000000000000000000000060015416600155565b005b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4f776e61626c653a207a65726f206164647265737300000000000000000000006044820152fd5b905083610114565b9150167fffffffffffffffffffffffff000000000000000000000000000000000000000060015416176001555f80f35b5f80fd5b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361028057565b6064359073ffffffffffffffffffffffffffffffffffffffff8216820361028057565b6044359073ffffffffffffffffffffffffffffffffffffffff8216820361028057565b60243590811515820361028057565b60443590811515820361028057565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6080810190811067ffffffffffffffff82111761035457604052565b61030b565b67ffffffffffffffff811161035457604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761035457604052565b346102805760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102805760807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc3601126102805760405161041381610338565b6024359073ffffffffffffffffffffffffffffffffffffffff82168203610280576101e8918152604435602082015261044a6102a7565b604082015260843560608201526004356109a8565b346102805760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610280576004355f526032602052608060405f2073ffffffffffffffffffffffffffffffffffffffff8082541691600360018201549260028301541691015491604051938452602084015260408301526060820152f35b5f91031261028057565b34610280575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102805773ffffffffffffffffffffffffffffffffffffffff80600154168033036105cf57806105a5925f54167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a373ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff00000000000000000000000000000000000000005f5416175f55565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055005b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602060248201527f4f776e61626c653a2063616c6c657220213d2070656e64696e67206f776e65726044820152fd5b34610280575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102805760015461067f60ff8260a81c1615809281936107a0575b811561077d575b50610c09565b806106c4740100000000000000000000000000000000000000007fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff6001541617600155565b610733575b6106d1610f18565b6106d757005b6107047fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff60015416600155565b604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602090a1005b61077875010000000000000000000000000000000000000000007fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff6001541617600155565b6106c9565b303b1591508161078f575b505f610679565b60a01c60ff1660011490505f610788565b9050600160ff8260a01c161090610672565b34610280575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261028057602073ffffffffffffffffffffffffffffffffffffffff5f5416604051908152f35b346102805760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102805767ffffffffffffffff60243581811161028057366023820112156102805780600401359182116103545760405161089060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f860116018261036d565b8281523660248484010111610280575f6020846108ee9560246108c7960183860137830101526108be6102ca565b90600435610d72565b60405173ffffffffffffffffffffffffffffffffffffffff90911681529081906020820190565b0390f35b34610280575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261028057602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b1561094a57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b73ffffffffffffffffffffffffffffffffffffffff6109cb815f54163314610943565b825173ffffffffffffffffffffffffffffffffffffffff1616158015610b1d575b8015610b11575b8015610b05575b610a93579081610a3c82610a377f5f419bdcef2cdc4cdb667c8d94e4b419b1d6beec9dfb92d205a530c54f0de3cc955f52603260205260405f2090565b610b48565b610a8e60405192839283909291606060809160a0840195845273ffffffffffffffffffffffffffffffffffffffff80825116602086015260208201516040860152604082015116828501520151910152565b0390a1565b604080517f1da0be980000000000000000000000000000000000000000000000000000000081526004810192909252825173ffffffffffffffffffffffffffffffffffffffff90811660248401526020840151604484015290830151166064820152606090910151608482015260a490fd5b506060820151156109fa565b506020820151156109f3565b50610b4261013f604084015173ffffffffffffffffffffffffffffffffffffffff1690565b156109ec565b906060600391610c0273ffffffffffffffffffffffffffffffffffffffff610bae81845116879073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b60208301516001870155604083015116600286019073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b0151910155565b15610c1057565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152fd5b90604051610ca181610338565b60606003829473ffffffffffffffffffffffffffffffffffffffff8082541685526001820154602086015260028201541660408501520154910152565b919093929382526020606060208401528151918260608501525f5b838110610d535750505073ffffffffffffffffffffffffffffffffffffffff60807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f845f846040978901015201168401019416910152565b818101830151858201608001528201610cf9565b6040513d5f823e3d90fd5b929190610d8f610d8a855f52603260205260405f2090565b610c94565b9073ffffffffffffffffffffffffffffffffffffffff9182610dc5825173ffffffffffffffffffffffffffffffffffffffff1690565b1615610ee65790610e4382610e0f7f07a80415c524a669398df01e97c487fc00986190468c09e2741b44181c5dc8c3945173ffffffffffffffffffffffffffffffffffffffff1690565b9060208101516060610e38604084015173ffffffffffffffffffffffffffffffffffffffff1690565b920151928546610fd4565b95610e548760405193849384610cde565b0390a18316803b15610280576040517f078dfbe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff929092166004830152600160248301525f60448301819052908290606490829084905af18015610ee157610ecc5750565b80610ed9610edf92610359565b806104e1565b565b610d67565b6040517f9661f39100000000000000000000000000000000000000000000000000000000815260048101879052602490fd5b60ff60015460a81c1615610f5057337fffffffffffffffffffffffff00000000000000000000000000000000000000005f5416175f55565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152fd5b92915f9695919282810192845190898286019860405199858b9660209e8f998a8a8682809d9881990101604052815201903c8b0101903c930191850101915b8681101561105d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9061105a9697036101000a0190811990511690825116179052611090565b90565b8151835291860191908601907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001611013565b9080511561111d576020815191015ff59073ffffffffffffffffffffffffffffffffffffffff8216156110bf57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f79000000000000006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602060248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f6044820152fdfea26469706673582212209f3bbac18f1260e35e6906b9fbccf901bcbd066718cf6eccdb71e2cd3ad8f09564736f6c63430008180033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.