Source Code
| Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
Latest 1 internal transaction
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 235866370 | 472 days ago | Contract Creation | 0 ETH |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
Pipeline
Compiler Version
v0.7.6+commit.7338295f
Optimization Enabled:
Yes with 200 runs
Other Settings:
istanbul EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
//SPDX-License-Identifier: MIT
pragma solidity =0.7.6;
pragma experimental ABIEncoderV2;
import "./interfaces/IPipeline.sol";
import "./libraries/LibFunction.sol";
import "@openzeppelin/contracts/token/ERC1155/ERC1155Holder.sol";
import "@openzeppelin/contracts/token/ERC721/ERC721Holder.sol";
/**
* @title Pipeline
* @author Publius
* @notice Pipeline creates a sandbox to execute any series of function calls on any series of protocols through Pipe functions.
* Any assets left in Pipeline between transactions can be transferred out by any account.
* Users Pipe a series of PipeCalls that each execute a function call to another protocol through Pipeline.
* https://evmpipeline.org
**/
contract Pipeline is IPipeline, ERC1155Holder, ERC721Holder {
/**
* @dev So Pipeline can receive Ether.
*/
receive() external payable {}
/**
* @dev Returns the current version of Pipeline.
*/
function version() external pure returns (string memory) {
return "1.0.1";
}
/**
* @notice Execute a single PipeCall.
* Supports sending Ether through msg.value
* @param p PipeCall to execute
* @return result return value of PipeCall
**/
function pipe(PipeCall calldata p)
external
payable
override
returns (bytes memory result)
{
result = _pipe(p.target, p.data, msg.value);
}
/**
* @notice Execute a list of executes a list of PipeCalls.
* @param pipes list of PipeCalls to execute
* @return results list of return values for each PipeCall
**/
function multiPipe(PipeCall[] calldata pipes)
external
payable
override
returns (bytes[] memory results)
{
results = new bytes[](pipes.length);
for (uint256 i = 0; i < pipes.length; i++) {
results[i] = _pipe(pipes[i].target, pipes[i].data, 0);
}
}
/**
* @notice Execute a list of AdvancedPipeCalls.
* @param pipes list of AdvancedPipeCalls to execute
* @return results list of return values for each AdvancedPipeCalls
**/
function advancedPipe(AdvancedPipeCall[] calldata pipes)
external
payable
override
returns (bytes[] memory results) {
results = new bytes[](pipes.length);
for (uint256 i = 0; i < pipes.length; ++i) {
results[i] = _advancedPipe(pipes[i], results);
}
}
// Execute function call using calldata
function _pipe(
address target,
bytes calldata data,
uint256 value
) private returns (bytes memory result) {
bool success;
(success, result) = target.call{value: value}(data);
LibFunction.checkReturn(success, result);
}
// Execute function call using memory
function _pipeMem(
address target,
bytes memory data,
uint256 value
) private returns (bytes memory result) {
bool success;
(success, result) = target.call{value: value}(data);
LibFunction.checkReturn(success, result);
}
// Execute an AdvancedPipeCall
function _advancedPipe(
AdvancedPipeCall calldata p,
bytes[] memory returnData
) private returns (bytes memory result) {
uint256 value = getEthValue(p.clipboard);
// 0x00 -> Normal pipe: Standard function call
// else > Advanced pipe: Copy return data into function call through buildAdvancedCalldata
if (p.clipboard[0] == 0x00) {
result = _pipe(p.target, p.callData, value);
} else {
result = LibFunction.useClipboard(p.callData, p.clipboard, returnData);
result = _pipeMem(p.target, result, value);
}
}
// Extracts Ether value from a Clipboard
// clipboard[1] indicates whether there is an Ether value in the advanced data
// if 0x00 -> No Ether value, return 0
// else -> return the last 32 bytes of clipboard
function getEthValue(bytes calldata clipboard) private pure returns (uint256 value) {
if (clipboard[1] == 0x00) return 0;
assembly { value := calldataload(sub(add(clipboard.offset, clipboard.length), 32))}
}
}//SPDX-License-Identifier: MIT
pragma solidity =0.7.6;
pragma experimental ABIEncoderV2;
/**
* @title IPipeline
* @author Publius
* @notice Pipeline Interface – Pipeline creates a sandbox to execute any series of function calls on any series of protocols through \term{Pipe} functions.
* Any assets left in Pipeline between transactions can be transferred out by any account.
* Users Pipe a series of PipeCalls that each execute a function call to another protocol through Pipeline.
**/
// PipeCalls specify a function call to be executed by Pipeline.
// Pipeline supports 2 types of PipeCalls: PipeCall and AdvancedPipeCall.
// PipeCall makes a function call with a static target address and callData.
struct PipeCall {
address target;
bytes data;
}
// AdvancedPipeCall makes a function call with a static target address and both static and dynamic callData.
// AdvancedPipeCalls support sending Ether in calls.
// [ PipeCall Type | Send Ether Flag | PipeCall Type data | Ether Value (only if flag == 1)]
// [ 1 byte | 1 byte | n bytes | 0 or 32 bytes ]
// See LibFunction.useClipboard for more details.
struct AdvancedPipeCall {
address target;
bytes callData;
bytes clipboard;
}
interface IPipeline {
function pipe(PipeCall calldata p)
external
payable
returns (bytes memory result);
function multiPipe(PipeCall[] calldata pipes)
external
payable
returns (bytes[] memory results);
function advancedPipe(AdvancedPipeCall[] calldata pipes)
external
payable
returns (bytes[] memory results);
}/*
SPDX-License-Identifier: MIT
*/
pragma solidity =0.7.6;
pragma experimental ABIEncoderV2;
/**
* @title Lib Function
* @author Publius
**/
library LibFunction {
/**
* @notice Checks The return value of a any function call for success, if not returns the error returned in `results`
* @param success Whether the corresponding function call succeeded
* @param result The return data of the corresponding function call
**/
function checkReturn(bool success, bytes memory result) internal pure {
if (!success) {
// Next 5 lines from https://ethereum.stackexchange.com/a/83577
// Also, used in Uniswap V3 https://github.com/Uniswap/v3-periphery/blob/main/contracts/base/Multicall.sol#L17
if (result.length < 68) revert();
assembly {
result := add(result, 0x04)
}
revert(abi.decode(result, (string)));
}
}
/** @notice Use a Clipboard on callData to copy return values stored as returnData from any Advanced Calls
* that have already been executed and paste them into the callData of the next Advanced Call, in a customizable manner
* @param callData The callData bytes of next Advanced Call to paste onto
* @param clipboard 0, 1 or n encoded paste operations and encoded ether value if using Pipeline
* -------------------------------------------------------------------------------------
* Clipboard stores the bytes:
* [ Type | Use Ether Flag* | Type data | Ether Value (only if flag == 1)*]
* [ 1 byte | 1 byte | n bytes | 0 or 32 bytes ]
* * Use Ether Flag and Ether Value are processed in Pipeline.sol (Not used in Farm). See Pipeline.getEthValue for ussage.
* Type: 0x00, 0x01 or 0x002
* - 0x00: 0 Paste Operations (Logic in Pipeline.sol and FarmFacet.sol)
* - 0x01: 1 Paste Operation
* - 0x02: n Paste Operations
* Type Data: There are two types with type data: 0x01, 0x02
* Type 1 (0x01): Copy 1 bytes32 from a previous function return value
* [ pasteParams ]
* [ 32 bytes ]
* Note: Should be encoded with ['bytes2', 'uint80', 'uint80', 'uint80'] where the first two bytes are Type and Send Ether Flag if using Pipeline
* Type 2 (0x02): Copy n bytes32 from a previous function return value
* [ Padding | pasteParams[] ]
* [ 32 bytes | 32 + 32 * n ]
* * The first 32 bytes are the length of the array.
* -------------------------------------------------------------------------------------
* @param returnData A list of return values from previously executed Advanced Calls
@return data The function call return datas
**/
function useClipboard(
bytes calldata callData,
bytes calldata clipboard,
bytes[] memory returnData
) internal pure returns (bytes memory data) {
bytes1 typeId = clipboard[0];
if (typeId == 0x01) {
bytes32 pasteParams = abi.decode(clipboard, (bytes32));
data = LibFunction.pasteAdvancedBytes(callData, returnData, pasteParams);
} else if (typeId == 0x02) {
(, bytes32[] memory pasteParams) = abi.decode(
clipboard,
(uint256, bytes32[])
);
data = callData;
for (uint256 i; i < pasteParams.length; i++)
data = LibFunction.pasteAdvancedBytes(data, returnData, pasteParams[i]);
} else {
revert("Function: Advanced Type not supported");
}
}
/**
* @notice Copies 32 bytes from returnData into callData determined by pasteParams
* @param callData The callData bytes of the next function call
* @param returnData A list of bytes corresponding to return data from previous function calls in the transaction
* @param pasteParams Denotes which data should be copied and where it should be pasted
* Should be in the following format
* [2 bytes | 10 bytes | 10 bytes | 10 bytes ]
* [ N/A | returnDataIndex | copyIndex | pasteIndex ]
* @return pastedData the calldata for the next function call with bytes pasted from returnData
**/
function pasteAdvancedBytes(
bytes memory callData,
bytes[] memory returnData,
bytes32 pasteParams
) internal pure returns (bytes memory pastedData) {
// Shift `pasteParams` right 22 bytes to insolated reduceDataIndex
bytes memory copyData = returnData[uint256((pasteParams << 16) >> 176)];
pastedData = paste32Bytes(
copyData,
callData,
uint256((pasteParams << 96) >> 176), // Isolate copyIndex
uint256((pasteParams << 176) >> 176) // Isolate pasteIndex
);
}
/**
* @notice Copy 32 Bytes from copyData at copyIndex and paste into pasteData at pasteIndex
* @param copyData The data bytes to copy from
* @param pasteData The data bytes to paste into
* @param copyIndex The index in copyData to copying from
* @param pasteIndex The index in pasteData to paste into
* @return pastedData The data with the copied with 32 bytes
**/
function paste32Bytes(
bytes memory copyData,
bytes memory pasteData,
uint256 copyIndex,
uint256 pasteIndex
) internal pure returns (bytes memory pastedData) {
assembly {
mstore(add(pasteData, pasteIndex), mload(add(copyData, copyIndex)))
}
pastedData = pasteData;
}
}// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
import "./ERC1155Receiver.sol";
/**
* @dev _Available since v3.1._
*/
contract ERC1155Holder is ERC1155Receiver {
function onERC1155Received(address, address, uint256, uint256, bytes memory) public virtual override returns (bytes4) {
return this.onERC1155Received.selector;
}
function onERC1155BatchReceived(address, address, uint256[] memory, uint256[] memory, bytes memory) public virtual override returns (bytes4) {
return this.onERC1155BatchReceived.selector;
}
}// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
import "./IERC721Receiver.sol";
/**
* @dev Implementation of the {IERC721Receiver} interface.
*
* Accepts all token transfers.
* Make sure the contract is able to use its token with {IERC721-safeTransferFrom}, {IERC721-approve} or {IERC721-setApprovalForAll}.
*/
contract ERC721Holder is IERC721Receiver {
/**
* @dev See {IERC721Receiver-onERC721Received}.
*
* Always returns `IERC721Receiver.onERC721Received.selector`.
*/
function onERC721Received(address, address, uint256, bytes memory) public virtual override returns (bytes4) {
return this.onERC721Received.selector;
}
}// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
import "./IERC1155Receiver.sol";
import "../../introspection/ERC165.sol";
/**
* @dev _Available since v3.1._
*/
abstract contract ERC1155Receiver is ERC165, IERC1155Receiver {
constructor() internal {
_registerInterface(
ERC1155Receiver(address(0)).onERC1155Received.selector ^
ERC1155Receiver(address(0)).onERC1155BatchReceived.selector
);
}
}// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
/**
* @title ERC721 token receiver interface
* @dev Interface for any contract that wants to support safeTransfers
* from ERC721 asset contracts.
*/
interface IERC721Receiver {
/**
* @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
* by `operator` from `from`, this function is called.
*
* It must return its Solidity selector to confirm the token transfer.
* If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
*
* The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
*/
function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);
}// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
import "../../introspection/IERC165.sol";
/**
* _Available since v3.1._
*/
interface IERC1155Receiver is IERC165 {
/**
@dev Handles the receipt of a single ERC1155 token type. This function is
called at the end of a `safeTransferFrom` after the balance has been updated.
To accept the transfer, this must return
`bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
(i.e. 0xf23a6e61, or its own function selector).
@param operator The address which initiated the transfer (i.e. msg.sender)
@param from The address which previously owned the token
@param id The ID of the token being transferred
@param value The amount of tokens being transferred
@param data Additional data with no specified format
@return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
*/
function onERC1155Received(
address operator,
address from,
uint256 id,
uint256 value,
bytes calldata data
)
external
returns(bytes4);
/**
@dev Handles the receipt of a multiple ERC1155 token types. This function
is called at the end of a `safeBatchTransferFrom` after the balances have
been updated. To accept the transfer(s), this must return
`bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
(i.e. 0xbc197c81, or its own function selector).
@param operator The address which initiated the batch transfer (i.e. msg.sender)
@param from The address which previously owned the token
@param ids An array containing ids of each token being transferred (order and length must match values array)
@param values An array containing amounts of each token being transferred (order and length must match ids array)
@param data Additional data with no specified format
@return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
*/
function onERC1155BatchReceived(
address operator,
address from,
uint256[] calldata ids,
uint256[] calldata values,
bytes calldata data
)
external
returns(bytes4);
}// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
import "./IERC165.sol";
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts may inherit from this and call {_registerInterface} to declare
* their support of an interface.
*/
abstract contract ERC165 is IERC165 {
/*
* bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7
*/
bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;
/**
* @dev Mapping of interface ids to whether or not it's supported.
*/
mapping(bytes4 => bool) private _supportedInterfaces;
constructor () internal {
// Derived contracts need only register support for their own interfaces,
// we register support for ERC165 itself here
_registerInterface(_INTERFACE_ID_ERC165);
}
/**
* @dev See {IERC165-supportsInterface}.
*
* Time complexity O(1), guaranteed to always use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return _supportedInterfaces[interfaceId];
}
/**
* @dev Registers the contract as an implementer of the interface defined by
* `interfaceId`. Support of the actual ERC165 interface is automatic and
* registering its interface id is not required.
*
* See {IERC165-supportsInterface}.
*
* Requirements:
*
* - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).
*/
function _registerInterface(bytes4 interfaceId) internal virtual {
require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
_supportedInterfaces[interfaceId] = true;
}
}// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* 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[EIP 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/=node_modules/@openzeppelin/",
"eth-gas-reporter/=node_modules/eth-gas-reporter/",
"forge-std/=lib/forge-std/src/",
"hardhat/=node_modules/hardhat/"
],
"optimizer": {
"enabled": true,
"runs": 200
},
"metadata": {
"useLiteralContent": false,
"bytecodeHash": "ipfs"
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"evmVersion": "istanbul",
"viaIR": false,
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"components":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"bytes","name":"clipboard","type":"bytes"}],"internalType":"struct AdvancedPipeCall[]","name":"pipes","type":"tuple[]"}],"name":"advancedPipe","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct PipeCall[]","name":"pipes","type":"tuple[]"}],"name":"multiPipe","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct PipeCall","name":"p","type":"tuple"}],"name":"pipe","outputs":[{"internalType":"bytes","name":"result","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
608060405234801561001057600080fd5b506100216301ffc9a760e01b610036565b610031630271189760e51b610036565b6100ba565b6001600160e01b03198082161415610095576040805162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604482015290519081900360640190fd5b6001600160e01b0319166000908152602081905260409020805460ff19166001179055565b610e4b806100c96000396000f3fe60806040526004361061007f5760003560e01c806354fd4d501161004e57806354fd4d501461012e578063bc197c8114610143578063cabec62b14610163578063f23a6e611461017657610086565b806301ffc9a71461008b57806308e1a0ab146100c1578063150b7a02146100e15780631c0a0d5e1461010e57610086565b3661008657005b600080fd5b34801561009757600080fd5b506100ab6100a6366004610a83565b610196565b6040516100b89190610c9e565b60405180910390f35b6100d46100cf366004610b14565b6101b9565b6040516100b89190610cbe565b3480156100ed57600080fd5b506101016100fc366004610965565b6101e4565b6040516100b89190610ca9565b61012161011c366004610a2c565b6101f4565b6040516100b89190610c3e565b34801561013a57600080fd5b506100d461029b565b34801561014f57600080fd5b5061010161015e3660046108c0565b6102ba565b610121610171366004610a2c565b6102cb565b34801561018257600080fd5b506101016101913660046109ca565b6103a6565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b60606101de6101cb602084018461089f565b6101d86020850185610d16565b346103b7565b92915050565b630a85bd0160e11b949350505050565b6060816001600160401b038111801561020c57600080fd5b5060405190808252806020026020018201604052801561024057816020015b606081526020019060019003908161022b5790505b50905060005b828110156102945761027584848381811061025d57fe5b905060200281019061026f9190610d5a565b83610430565b82828151811061028157fe5b6020908102919091010152600101610246565b5092915050565b604080518082019091526005815264312e302e3160d81b602082015290565b63bc197c8160e01b95945050505050565b6060816001600160401b03811180156102e357600080fd5b5060405190808252806020026020018201604052801561031757816020015b60608152602001906001900390816103025790505b50905060005b828110156102945761038784848381811061033457fe5b90506020028101906103469190610d6f565b61035490602081019061089f565b85858481811061036057fe5b90506020028101906103729190610d6f565b610380906020810190610d16565b60006103b7565b82828151811061039357fe5b602090810291909101015260010161031d565b63f23a6e6160e01b95945050505050565b60606000856001600160a01b03168386866040516103d6929190610c12565b60006040518083038185875af1925050503d8060008114610413576040519150601f19603f3d011682016040523d82523d6000602084013e610418565b606091505b509250905061042781836104e7565b50949350505050565b606060006104496104446040860186610d16565b61053b565b90506104586040850185610d16565b600081811061046357fe5b909101356001600160f81b031916151590506104a35761049c610489602086018661089f565b6104966020870187610d16565b846103b7565b9150610294565b6104c66104b36020860186610d16565b6104c06040880188610d16565b87610572565b91506104df6104d8602086018661089f565b83836106b5565b949350505050565b81610537576044815110156104fb57600080fd5b600481019050808060200190518101906105159190610aab565b60405162461bcd60e51b815260040161052e9190610cbe565b60405180910390fd5b5050565b60008282600181811061054a57fe5b909101356001600160f81b03191615159050610568575060006101de565b5001601f19013590565b606060008484600081811061058357fe5b909101356001600160f81b031916915050600160f81b8114156105fb5760006105ae85870187610a6b565b90506105f388888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525088925085915061072b9050565b9250506106ab565b600160f91b6001600160f81b03198216141561069357600061061f85870187610b4b565b91505087878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052509396505050505b815181101561068c57610682848684848151811061067557fe5b602002602001015161072b565b935060010161065b565b50506106ab565b60405162461bcd60e51b815260040161052e90610cd1565b5095945050505050565b60606000846001600160a01b031683856040516106d29190610c22565b60006040518083038185875af1925050503d806000811461070f576040519150601f19603f3d011682016040523d82523d6000602084013e610714565b606091505b509250905061072381836104e7565b509392505050565b606060008360b0601085901b901c60001c8151811061074657fe5b60209081029190910101519050610772818669ffffffffffffffffffff605087901c811690871661077b565b95945050505050565b9201519181019190915290565b80356001600160a01b03811681146101b457600080fd5b60008083601f8401126107b0578182fd5b5081356001600160401b038111156107c6578182fd5b60208301915083602080830285010111156107e057600080fd5b9250929050565b600082601f8301126107f7578081fd5b8135602061080c61080783610da7565b610d84565b8281528181019085830183850287018401881015610828578586fd5b855b858110156108465781358452928401929084019060010161082a565b5090979650505050505050565b600082601f830112610863578081fd5b813561087161080782610dc4565b818152846020838601011115610885578283fd5b816020850160208301379081016020019190915292915050565b6000602082840312156108b0578081fd5b6108b982610788565b9392505050565b600080600080600060a086880312156108d7578081fd5b6108e086610788565b94506108ee60208701610788565b935060408601356001600160401b0380821115610909578283fd5b61091589838a016107e7565b9450606088013591508082111561092a578283fd5b61093689838a016107e7565b9350608088013591508082111561094b578283fd5b5061095888828901610853565b9150509295509295909350565b6000806000806080858703121561097a578384fd5b61098385610788565b935061099160208601610788565b92506040850135915060608501356001600160401b038111156109b2578182fd5b6109be87828801610853565b91505092959194509250565b600080600080600060a086880312156109e1578081fd5b6109ea86610788565b94506109f860208701610788565b9350604086013592506060860135915060808601356001600160401b03811115610a20578182fd5b61095888828901610853565b60008060208385031215610a3e578182fd5b82356001600160401b03811115610a53578283fd5b610a5f8582860161079f565b90969095509350505050565b600060208284031215610a7c578081fd5b5035919050565b600060208284031215610a94578081fd5b81356001600160e01b0319811681146108b9578182fd5b600060208284031215610abc578081fd5b81516001600160401b03811115610ad1578182fd5b8201601f81018413610ae1578182fd5b8051610aef61080782610dc4565b818152856020838501011115610b03578384fd5b610772826020830160208601610de5565b600060208284031215610b25578081fd5b81356001600160401b03811115610b3a578182fd5b8201604081850312156108b9578182fd5b60008060408385031215610b5d578182fd5b823591506020808401356001600160401b03811115610b7a578283fd5b8401601f81018613610b8a578283fd5b8035610b9861080782610da7565b81815283810190838501858402850186018a1015610bb4578687fd5b8694505b83851015610bd6578035835260019490940193918501918501610bb8565b5080955050505050509250929050565b60008151808452610bfe816020860160208601610de5565b601f01601f19169290920160200192915050565b6000828483379101908152919050565b60008251610c34818460208701610de5565b9190910192915050565b6000602080830181845280855180835260408601915060408482028701019250838701855b82811015610c9157603f19888603018452610c7f858351610be6565b94509285019290850190600101610c63565b5092979650505050505050565b901515815260200190565b6001600160e01b031991909116815260200190565b6000602082526108b96020830184610be6565b60208082526025908201527f46756e6374696f6e3a20416476616e6365642054797065206e6f7420737570706040820152641bdc9d195960da1b606082015260800190565b6000808335601e19843603018112610d2c578283fd5b8301803591506001600160401b03821115610d45578283fd5b6020019150368190038213156107e057600080fd5b60008235605e19833603018112610c34578182fd5b60008235603e19833603018112610c34578182fd5b6040518181016001600160401b0381118282101715610d9f57fe5b604052919050565b60006001600160401b03821115610dba57fe5b5060209081020190565b60006001600160401b03821115610dd757fe5b50601f01601f191660200190565b60005b83811015610e00578181015183820152602001610de8565b83811115610e0f576000848401525b5050505056fea264697066735822122018e8772d779177611d15c53e7bbeafb08d42070f3bf9c6cad70954d10d7997af64736f6c63430007060033
Deployed Bytecode
0x60806040526004361061007f5760003560e01c806354fd4d501161004e57806354fd4d501461012e578063bc197c8114610143578063cabec62b14610163578063f23a6e611461017657610086565b806301ffc9a71461008b57806308e1a0ab146100c1578063150b7a02146100e15780631c0a0d5e1461010e57610086565b3661008657005b600080fd5b34801561009757600080fd5b506100ab6100a6366004610a83565b610196565b6040516100b89190610c9e565b60405180910390f35b6100d46100cf366004610b14565b6101b9565b6040516100b89190610cbe565b3480156100ed57600080fd5b506101016100fc366004610965565b6101e4565b6040516100b89190610ca9565b61012161011c366004610a2c565b6101f4565b6040516100b89190610c3e565b34801561013a57600080fd5b506100d461029b565b34801561014f57600080fd5b5061010161015e3660046108c0565b6102ba565b610121610171366004610a2c565b6102cb565b34801561018257600080fd5b506101016101913660046109ca565b6103a6565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b60606101de6101cb602084018461089f565b6101d86020850185610d16565b346103b7565b92915050565b630a85bd0160e11b949350505050565b6060816001600160401b038111801561020c57600080fd5b5060405190808252806020026020018201604052801561024057816020015b606081526020019060019003908161022b5790505b50905060005b828110156102945761027584848381811061025d57fe5b905060200281019061026f9190610d5a565b83610430565b82828151811061028157fe5b6020908102919091010152600101610246565b5092915050565b604080518082019091526005815264312e302e3160d81b602082015290565b63bc197c8160e01b95945050505050565b6060816001600160401b03811180156102e357600080fd5b5060405190808252806020026020018201604052801561031757816020015b60608152602001906001900390816103025790505b50905060005b828110156102945761038784848381811061033457fe5b90506020028101906103469190610d6f565b61035490602081019061089f565b85858481811061036057fe5b90506020028101906103729190610d6f565b610380906020810190610d16565b60006103b7565b82828151811061039357fe5b602090810291909101015260010161031d565b63f23a6e6160e01b95945050505050565b60606000856001600160a01b03168386866040516103d6929190610c12565b60006040518083038185875af1925050503d8060008114610413576040519150601f19603f3d011682016040523d82523d6000602084013e610418565b606091505b509250905061042781836104e7565b50949350505050565b606060006104496104446040860186610d16565b61053b565b90506104586040850185610d16565b600081811061046357fe5b909101356001600160f81b031916151590506104a35761049c610489602086018661089f565b6104966020870187610d16565b846103b7565b9150610294565b6104c66104b36020860186610d16565b6104c06040880188610d16565b87610572565b91506104df6104d8602086018661089f565b83836106b5565b949350505050565b81610537576044815110156104fb57600080fd5b600481019050808060200190518101906105159190610aab565b60405162461bcd60e51b815260040161052e9190610cbe565b60405180910390fd5b5050565b60008282600181811061054a57fe5b909101356001600160f81b03191615159050610568575060006101de565b5001601f19013590565b606060008484600081811061058357fe5b909101356001600160f81b031916915050600160f81b8114156105fb5760006105ae85870187610a6b565b90506105f388888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525088925085915061072b9050565b9250506106ab565b600160f91b6001600160f81b03198216141561069357600061061f85870187610b4b565b91505087878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052509396505050505b815181101561068c57610682848684848151811061067557fe5b602002602001015161072b565b935060010161065b565b50506106ab565b60405162461bcd60e51b815260040161052e90610cd1565b5095945050505050565b60606000846001600160a01b031683856040516106d29190610c22565b60006040518083038185875af1925050503d806000811461070f576040519150601f19603f3d011682016040523d82523d6000602084013e610714565b606091505b509250905061072381836104e7565b509392505050565b606060008360b0601085901b901c60001c8151811061074657fe5b60209081029190910101519050610772818669ffffffffffffffffffff605087901c811690871661077b565b95945050505050565b9201519181019190915290565b80356001600160a01b03811681146101b457600080fd5b60008083601f8401126107b0578182fd5b5081356001600160401b038111156107c6578182fd5b60208301915083602080830285010111156107e057600080fd5b9250929050565b600082601f8301126107f7578081fd5b8135602061080c61080783610da7565b610d84565b8281528181019085830183850287018401881015610828578586fd5b855b858110156108465781358452928401929084019060010161082a565b5090979650505050505050565b600082601f830112610863578081fd5b813561087161080782610dc4565b818152846020838601011115610885578283fd5b816020850160208301379081016020019190915292915050565b6000602082840312156108b0578081fd5b6108b982610788565b9392505050565b600080600080600060a086880312156108d7578081fd5b6108e086610788565b94506108ee60208701610788565b935060408601356001600160401b0380821115610909578283fd5b61091589838a016107e7565b9450606088013591508082111561092a578283fd5b61093689838a016107e7565b9350608088013591508082111561094b578283fd5b5061095888828901610853565b9150509295509295909350565b6000806000806080858703121561097a578384fd5b61098385610788565b935061099160208601610788565b92506040850135915060608501356001600160401b038111156109b2578182fd5b6109be87828801610853565b91505092959194509250565b600080600080600060a086880312156109e1578081fd5b6109ea86610788565b94506109f860208701610788565b9350604086013592506060860135915060808601356001600160401b03811115610a20578182fd5b61095888828901610853565b60008060208385031215610a3e578182fd5b82356001600160401b03811115610a53578283fd5b610a5f8582860161079f565b90969095509350505050565b600060208284031215610a7c578081fd5b5035919050565b600060208284031215610a94578081fd5b81356001600160e01b0319811681146108b9578182fd5b600060208284031215610abc578081fd5b81516001600160401b03811115610ad1578182fd5b8201601f81018413610ae1578182fd5b8051610aef61080782610dc4565b818152856020838501011115610b03578384fd5b610772826020830160208601610de5565b600060208284031215610b25578081fd5b81356001600160401b03811115610b3a578182fd5b8201604081850312156108b9578182fd5b60008060408385031215610b5d578182fd5b823591506020808401356001600160401b03811115610b7a578283fd5b8401601f81018613610b8a578283fd5b8035610b9861080782610da7565b81815283810190838501858402850186018a1015610bb4578687fd5b8694505b83851015610bd6578035835260019490940193918501918501610bb8565b5080955050505050509250929050565b60008151808452610bfe816020860160208601610de5565b601f01601f19169290920160200192915050565b6000828483379101908152919050565b60008251610c34818460208701610de5565b9190910192915050565b6000602080830181845280855180835260408601915060408482028701019250838701855b82811015610c9157603f19888603018452610c7f858351610be6565b94509285019290850190600101610c63565b5092979650505050505050565b901515815260200190565b6001600160e01b031991909116815260200190565b6000602082526108b96020830184610be6565b60208082526025908201527f46756e6374696f6e3a20416476616e6365642054797065206e6f7420737570706040820152641bdc9d195960da1b606082015260800190565b6000808335601e19843603018112610d2c578283fd5b8301803591506001600160401b03821115610d45578283fd5b6020019150368190038213156107e057600080fd5b60008235605e19833603018112610c34578182fd5b60008235603e19833603018112610c34578182fd5b6040518181016001600160401b0381118282101715610d9f57fe5b604052919050565b60006001600160401b03821115610dba57fe5b5060209081020190565b60006001600160401b03821115610dd757fe5b50601f01601f191660200190565b60005b83811015610e00578181015183820152602001610de8565b83811115610e0f576000848401525b5050505056fea264697066735822122018e8772d779177611d15c53e7bbeafb08d42070f3bf9c6cad70954d10d7997af64736f6c63430007060033
Loading...
Loading
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.