Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 15599319 | 670 days ago | IN | Create: HumanboundTransferLogic | 0 ETH | 0.01059226 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
HumanboundTransferLogic
Compiler Version
v0.8.13+commit.abaa5c0e
Optimization Enabled:
Yes with 800 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity >=0.8.13; import "../EAT/AccessTokenConsumerExtension.sol"; import "./IHumanboundTransferLogic.sol"; contract HumanboundTransferLogic is HumanboundTransferExtension, AccessTokenConsumerExtension { /** * @dev See {ITransferLogic-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { revert("HumanboundTransferLogic-transferFrom: disallowed without EAT"); } /** * @dev See {ITransferLogic-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { revert("HumanboundTransferLogic-safeTransferFrom: disallowed without EAT"); } /** * @dev See {ITransferLogic-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { revert("HumanboundTransferLogic-safeTransferFrom: disallowed without EAT"); } function transferFrom( uint8 v, bytes32 r, bytes32 s, uint256 expiry, address from, address to, uint256 tokenId ) public override(IHumanboundTransferLogic) requiresAuth(v, r, s, expiry) { _transfer(from, to, tokenId); } function safeTransferFrom( uint8 v, bytes32 r, bytes32 s, uint256 expiry, address from, address to, uint256 tokenId ) public override(IHumanboundTransferLogic) requiresAuth(v, r, s, expiry) { _safeTransfer(from, to, tokenId, ""); } function safeTransferFrom( uint8 v, bytes32 r, bytes32 s, uint256 expiry, address from, address to, uint256 tokenId, bytes memory data ) public override(IHumanboundTransferLogic) requiresAuth(v, r, s, expiry) { _safeTransfer(from, to, tokenId, data); } }
// SPDX-License-Identifier: MIT pragma solidity >=0.8.13; import "@violetprotocol/ethereum-access-token/contracts/AccessTokenConsumer.sol"; import "./IEATVerifierConnector.sol"; /** * @title Abstract Extension to be inherited by Extensions that have functions that wish to consume * Ethereum Access Tokens * * @dev Inherit this contract to implement functions that are EAT-gated * @notice Exposes the `requiresAuth` modifier by child contracts */ abstract contract AccessTokenConsumerExtension is Extension { modifier requiresAuth( uint8 v, bytes32 r, bytes32 s, uint256 expiry ) { require(_verify(v, r, s, expiry), "AccessToken: verification failure"); _; } function _verify( uint8 v, bytes32 r, bytes32 s, uint256 expiry ) internal returns (bool) { AccessToken memory token = constructToken(expiry); address verifier = IEATVerifierConnector(address(this)).getVerifier(); return IAccessTokenVerifier(verifier).verify(token, v, r, s); } function constructToken(uint256 expiry) internal view returns (AccessToken memory token) { FunctionCall memory functionCall; functionCall.functionSignature = msg.sig; functionCall.target = address(this); functionCall.caller = msg.sender; functionCall.parameters = extractInputs(); token.functionCall = functionCall; token.expiry = expiry; } // Takes calldata and extracts non-signature, non-expiry function inputs as a byte array // Removes all references to the proof object except any offsets related to // other inputs that are pushed by the proof function extractInputs() internal pure returns (bytes memory inputs) { assembly { let ptr := mload(0x40) calldatacopy(ptr, 0, calldatasize()) mstore(0x40, add(ptr, calldatasize())) let startPos := 0x04 let endOfSigExp := add(startPos, 0x80) let totalInputSize := sub(calldatasize(), endOfSigExp) // Overwrite data to calldata pointer inputs := ptr // Store expected length of total byte array as first value mstore(inputs, totalInputSize) // Copy bytes from end of signature and expiry section to end of calldata calldatacopy(add(inputs, 0x20), endOfSigExp, totalInputSize) } } }
// SPDX-License-Identifier: MIT pragma solidity >=0.8.13; import "@violetprotocol/erc721extendable/contracts/extensions/base/transfer/TransferLogic.sol"; interface IHumanboundTransferLogic { function transferFrom( uint8 v, bytes32 r, bytes32 s, uint256 expiry, address from, address to, uint256 tokenId ) external; function safeTransferFrom( uint8 v, bytes32 r, bytes32 s, uint256 expiry, address from, address to, uint256 tokenId ) external; function safeTransferFrom( uint8 v, bytes32 r, bytes32 s, uint256 expiry, address from, address to, uint256 tokenId, bytes memory data ) external; } abstract contract HumanboundTransferExtension is IHumanboundTransferLogic, TransferLogic { /** * @dev see {IExtension-getSolidityInterface} */ function getSolidityInterface() public pure virtual override returns (string memory) { return string( abi.encodePacked( super.getSolidityInterface(), "function transferFrom(uint8 v, bytes32 r, bytes32 s, uint256 expiry, address from, address to, uint256 tokenId) external;\n" "function safeTransferFrom(uint8 v, bytes32 r, bytes32 s, uint256 expiry, address from, address to, uint256 tokenId) external;\n" "function safeTransferFrom(uint8 v, bytes32 r, bytes32 s, uint256 expiry, address from, address to, uint256 tokenId, bytes memory data) external;\n" ) ); } /** * @dev see {IExtension-getInterface} */ function getInterface() public virtual override returns (Interface[] memory interfaces) { interfaces = new Interface[](2); bytes4[] memory functions = new bytes4[](3); functions[0] = IHumanboundTransferLogic.transferFrom.selector; functions[1] = bytes4(keccak256("safeTransferFrom(uint8,bytes32,bytes32,uint256,address,address,uint256)")); functions[2] = bytes4( keccak256("safeTransferFrom(uint8,bytes32,bytes32,uint256,address,address,uint256,bytes)") ); interfaces[0] = super.getInterface()[0]; interfaces[1] = Interface(type(IHumanboundTransferLogic).interfaceId, functions); } }
// SPDX-License-Identifier: MIT pragma solidity >=0.8.13; import "hardhat/console.sol"; import "./IAccessTokenVerifier.sol"; contract AccessTokenConsumer { IAccessTokenVerifier private _verifier; constructor(address accessTokenVerifier) { _verifier = IAccessTokenVerifier(accessTokenVerifier); } modifier requiresAuth( uint8 v, bytes32 r, bytes32 s, uint256 expiry ) { require(verify(v, r, s, expiry), "AccessToken: verification failure"); _; } function verify( uint8 v, bytes32 r, bytes32 s, uint256 expiry ) internal view returns (bool) { AccessToken memory token = constructToken(expiry); return _verifier.verify(token, v, r, s); } function constructToken(uint256 expiry) internal view returns (AccessToken memory token) { FunctionCall memory functionCall; functionCall.functionSignature = msg.sig; functionCall.target = address(this); functionCall.caller = msg.sender; functionCall.parameters = extractInputs(); token.functionCall = functionCall; token.expiry = expiry; } // Takes calldata and extracts non-signature, non-expiry function inputs as a byte array // Removes all references to the proof object except any offsets related to // other inputs that are pushed by the proof function extractInputs() public pure returns (bytes memory inputs) { assembly { let ptr := mload(0x40) calldatacopy(ptr, 0, calldatasize()) mstore(0x40, add(ptr, calldatasize())) let startPos := 0x04 let endOfSigExp := add(startPos, 0x80) let totalInputSize := sub(calldatasize(), endOfSigExp) // Overwrite data to calldata pointer inputs := ptr // Store expected length of total byte array as first value mstore(inputs, totalInputSize) // Copy bytes from end of signature and expiry section to end of calldata calldatacopy(add(inputs, 0x20), endOfSigExp, totalInputSize) } } }
// SPDX-License-Identifier: MIT pragma solidity >=0.8.13; import "@violetprotocol/extendable/extensions/Extension.sol"; interface IEATVerifierConnector { function setVerifier(address verifier) external; function getVerifier() external returns (address); } abstract contract EATVerifierConnectorExtension is IEATVerifierConnector, Extension { /** * @dev see {IExtension-getSolidityInterface} */ function getSolidityInterface() public pure virtual override returns (string memory) { return "function setVerifier(address verifier) external;\n" "function getVerifier() external returns (address);\n"; } /** * @dev see {IExtension-getInterface} */ function getInterface() public virtual override returns (Interface[] memory interfaces) { interfaces = new Interface[](1); bytes4[] memory functions = new bytes4[](2); functions[0] = IEATVerifierConnector.setVerifier.selector; functions[1] = IEATVerifierConnector.getVerifier.selector; interfaces[0] = Interface(type(IEATVerifierConnector).interfaceId, functions); } }
// SPDX-License-Identifier: MIT pragma solidity >= 0.4.22 <0.9.0; library console { address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67); function _sendLogPayload(bytes memory payload) private view { uint256 payloadLength = payload.length; address consoleAddress = CONSOLE_ADDRESS; assembly { let payloadStart := add(payload, 32) let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0) } } function log() internal view { _sendLogPayload(abi.encodeWithSignature("log()")); } function logInt(int p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(int)", p0)); } function logUint(uint p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint)", p0)); } function logString(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function logBool(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function logAddress(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function logBytes(bytes memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0)); } function logBytes1(bytes1 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0)); } function logBytes2(bytes2 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0)); } function logBytes3(bytes3 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0)); } function logBytes4(bytes4 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0)); } function logBytes5(bytes5 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0)); } function logBytes6(bytes6 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0)); } function logBytes7(bytes7 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0)); } function logBytes8(bytes8 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0)); } function logBytes9(bytes9 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0)); } function logBytes10(bytes10 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0)); } function logBytes11(bytes11 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0)); } function logBytes12(bytes12 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0)); } function logBytes13(bytes13 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0)); } function logBytes14(bytes14 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0)); } function logBytes15(bytes15 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0)); } function logBytes16(bytes16 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0)); } function logBytes17(bytes17 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0)); } function logBytes18(bytes18 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0)); } function logBytes19(bytes19 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0)); } function logBytes20(bytes20 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0)); } function logBytes21(bytes21 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0)); } function logBytes22(bytes22 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0)); } function logBytes23(bytes23 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0)); } function logBytes24(bytes24 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0)); } function logBytes25(bytes25 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0)); } function logBytes26(bytes26 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0)); } function logBytes27(bytes27 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0)); } function logBytes28(bytes28 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0)); } function logBytes29(bytes29 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0)); } function logBytes30(bytes30 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0)); } function logBytes31(bytes31 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0)); } function logBytes32(bytes32 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0)); } function log(uint p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint)", p0)); } function log(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function log(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function log(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function log(uint p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint)", p0, p1)); } function log(uint p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string)", p0, p1)); } function log(uint p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool)", p0, p1)); } function log(uint p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address)", p0, p1)); } function log(string memory p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint)", p0, p1)); } function log(string memory p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1)); } function log(string memory p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1)); } function log(string memory p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1)); } function log(bool p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint)", p0, p1)); } function log(bool p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1)); } function log(bool p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1)); } function log(bool p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1)); } function log(address p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint)", p0, p1)); } function log(address p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1)); } function log(address p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1)); } function log(address p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1)); } function log(uint p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint)", p0, p1, p2)); } function log(uint p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string)", p0, p1, p2)); } function log(uint p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool)", p0, p1, p2)); } function log(uint p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address)", p0, p1, p2)); } function log(uint p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint)", p0, p1, p2)); } function log(uint p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string)", p0, p1, p2)); } function log(uint p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool)", p0, p1, p2)); } function log(uint p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address)", p0, p1, p2)); } function log(uint p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint)", p0, p1, p2)); } function log(uint p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string)", p0, p1, p2)); } function log(uint p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool)", p0, p1, p2)); } function log(uint p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address)", p0, p1, p2)); } function log(uint p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint)", p0, p1, p2)); } function log(uint p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string)", p0, p1, p2)); } function log(uint p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool)", p0, p1, p2)); } function log(uint p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address)", p0, p1, p2)); } function log(string memory p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint)", p0, p1, p2)); } function log(string memory p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string)", p0, p1, p2)); } function log(string memory p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool)", p0, p1, p2)); } function log(string memory p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address)", p0, p1, p2)); } function log(string memory p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint)", p0, p1, p2)); } function log(string memory p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2)); } function log(string memory p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2)); } function log(string memory p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2)); } function log(string memory p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint)", p0, p1, p2)); } function log(string memory p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2)); } function log(string memory p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2)); } function log(string memory p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2)); } function log(string memory p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint)", p0, p1, p2)); } function log(string memory p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2)); } function log(string memory p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2)); } function log(string memory p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2)); } function log(bool p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint)", p0, p1, p2)); } function log(bool p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string)", p0, p1, p2)); } function log(bool p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool)", p0, p1, p2)); } function log(bool p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address)", p0, p1, p2)); } function log(bool p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint)", p0, p1, p2)); } function log(bool p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2)); } function log(bool p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2)); } function log(bool p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2)); } function log(bool p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint)", p0, p1, p2)); } function log(bool p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2)); } function log(bool p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2)); } function log(bool p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2)); } function log(bool p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint)", p0, p1, p2)); } function log(bool p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2)); } function log(bool p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2)); } function log(bool p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2)); } function log(address p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint)", p0, p1, p2)); } function log(address p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string)", p0, p1, p2)); } function log(address p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool)", p0, p1, p2)); } function log(address p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address)", p0, p1, p2)); } function log(address p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint)", p0, p1, p2)); } function log(address p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2)); } function log(address p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2)); } function log(address p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2)); } function log(address p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint)", p0, p1, p2)); } function log(address p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2)); } function log(address p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2)); } function log(address p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2)); } function log(address p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint)", p0, p1, p2)); } function log(address p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2)); } function log(address p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2)); } function log(address p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2)); } function log(uint p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,string)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,address)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3)); } }
// SPDX-License-Identifier: MIT pragma solidity >=0.8.13; struct EIP712Domain { string name; string version; uint256 chainId; address verifyingContract; } // struct FunctionParam { // string typ; // explicit full solidity atomic type of the parameter // bytes value; // the byte formatted parameter value // } struct FunctionCall { // string name; // name of the function being called bytes4 functionSignature; address target; address caller; bytes parameters; // FunctionParam[] parameters; // array of input parameters to the function call } struct AccessToken { uint256 expiry; FunctionCall functionCall; } interface IAccessTokenVerifier { function verify( AccessToken memory token, uint8 v, bytes32 r, bytes32 s ) external view returns (bool); }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.4; import "./IExtension.sol"; import "../errors/Errors.sol"; import "../utils/CallerContext.sol"; import "../erc165/IERC165Logic.sol"; /** * ______ __ __ ______ ______ __ __ _____ ______ ______ __ ______ * /\ ___\/\_\_\_\/\__ _\/\ ___\/\ "-.\ \/\ __-./\ __ \/\ == \/\ \ /\ ___\ * \ \ __\\/_/\_\/\/_/\ \/\ \ __\\ \ \-. \ \ \/\ \ \ __ \ \ __<\ \ \___\ \ __\ * \ \_____\/\_\/\_\ \ \_\ \ \_____\ \_\\"\_\ \____-\ \_\ \_\ \_____\ \_____\ \_____\ * \/_____/\/_/\/_/ \/_/ \/_____/\/_/ \/_/\/____/ \/_/\/_/\/_____/\/_____/\/_____/ * * Base contract for Extensions in the Extendable Framework * * Inherit and implement this contract to create Extension contracts! * * Implements the EIP-165 standard for interface detection of implementations during runtime. * Uses the ERC165 singleton pattern where the actual implementation logic of the interface is * deployed in a separate contract. See ERC165Logic. Deterministic deployment guarantees the * ERC165Logic contract to always exist as static address 0x16C940672fA7820C36b2123E657029d982629070 * * Define your custom Extension interface and implement it whilst inheriting this contract: * contract YourExtension is IYourExtension, Extension {...} * */ abstract contract Extension is CallerContext, IExtension, IERC165, IERC165Register { address constant ERC165LogicAddress = 0x16C940672fA7820C36b2123E657029d982629070; /** * @dev Constructor registers your custom Extension interface under EIP-165: * https://eips.ethereum.org/EIPS/eip-165 */ constructor() { Interface[] memory interfaces = getInterface(); for (uint256 i = 0; i < interfaces.length; i++) { Interface memory iface = interfaces[i]; registerInterface(iface.interfaceId); for (uint256 j = 0; j < iface.functions.length; j++) { registerInterface(iface.functions[j]); } } registerInterface(type(IExtension).interfaceId); } function supportsInterface(bytes4 interfaceId) external override virtual returns(bool) { (bool success, bytes memory result) = ERC165LogicAddress.delegatecall(abi.encodeWithSignature("supportsInterface(bytes4)", interfaceId)); if (!success) { assembly { revert(result, returndatasize()) } } return abi.decode(result, (bool)); } function registerInterface(bytes4 interfaceId) public override virtual { (bool success, ) = ERC165LogicAddress.delegatecall(abi.encodeWithSignature("registerInterface(bytes4)", interfaceId)); if (!success) { assembly { returndatacopy(0, 0, returndatasize()) revert(0, returndatasize()) } } } /** * @dev Unidentified function signature calls to any Extension reverts with * ExtensionNotImplemented error */ function _fallback() internal virtual { revert ExtensionNotImplemented(); } /** * @dev Fallback function passes to internal _fallback() logic */ fallback() external payable virtual { _fallback(); } /** * @dev Payable fallback function passes to internal _fallback() logic */ receive() external payable virtual { _fallback(); } /** * @dev Virtual override declaration of getFunctionSelectors() function to silence compiler * * Must be implemented in inherited contract. */ function getInterface() override public virtual returns(Interface[] memory); }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.4; struct Interface { bytes4 interfaceId; bytes4[] functions; } /** * @dev Interface for Extension */ interface IExtension { /** * @dev Returns a full view of the functional interface of the extension * * Must return a list of the functions in the interface of your custom Extension * in the same format and syntax as in the interface itself as a string, * escaped-newline separated. * * OPEN TO SUGGESTIONS FOR IMPROVEMENT ON THIS METHODOLOGY FOR * DEEP DESCRIPTIVE RUNTIME INTROSPECTION * * Intent is to allow developers that want to integrate with an Extendable contract * that will have a constantly evolving interface, due to the nature of Extendables, * to be able to easily inspect and query for the current state of the interface and * integrate with it. * * See {ExtendLogic-getSolidityInterface} for an example. */ function getSolidityInterface() external pure returns(string memory); /** * @dev Returns the interface IDs that are implemented by the Extension * * These are full interface IDs and ARE NOT function selectors. Full interface IDs are * XOR'd function selectors of an interface. For example the interface ID of the ERC721 * interface is 0x80ac58cd determined by the XOR or all function selectors of the interface. * * If an interface only consists of a single function, then the interface ID is identical * to that function selector. * * Provides a simple abstraction from the developer for any custom Extension to * be EIP-165 compliant out-of-the-box simply by implementing this function. * * Excludes any functions either already described by other interface definitions * that are not developed on top of this backbone i.e. EIP-165, IExtension */ function getInterface() external returns(Interface[] memory interfaces); }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.4; /** * @dev ExtensionNotImplemented error is emitted by Extendable and Extensions * where no implementation for a specified function signature exists * in the contract */ error ExtensionNotImplemented(); /** * @dev Utility library for contracts to catch custom errors * Pass in a return `result` from a call, and the selector for your error message * and the `catchCustomError` function will return `true` if the error was found * or `false` otherwise */ library Errors { function catchCustomError(bytes memory result, bytes4 errorSelector) internal pure returns(bool) { bytes4 caught; assembly { caught := mload(add(result, 0x20)) } return caught == errorSelector; } }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.4; import {CallerState, CallerContextStorage} from "../storage/CallerContextStorage.sol"; /** * @dev CallerContext contract provides Extensions with proper caller-scoped contexts. * Inherit this contract with your Extension to make use of caller references. * * `msg.sender` may not behave as developer intends when using within Extensions as many * calls may be exchanged between intra-contract extensions which result in a `msg.sender` as self. * Instead of using `msg.sender`, replace it with * - `_lastExternalCaller()` for the most recent caller in the call chain that is external to this contract * - `_lastCaller()` for the most recent caller * * CallerContext provides a deep callstack to track the caller of the Extension/Extendable contract * at any point in the execution cycle. * */ contract CallerContext { /** * @dev Returns the most recent caller of this contract that came from outside this contract. * * Used by extensions that require fetching msg.sender that aren't cross-extension calls. * Cross-extension calls resolve msg.sender as the current contract and so the actual * caller context is obfuscated. * * This function should be used in place of `msg.sender` where external callers are read. */ function _lastExternalCaller() internal view returns(address) { CallerState storage state = CallerContextStorage._getState(); for (uint i = state.callerStack.length - 1; i >= 0; i--) { address lastSubsequentCaller = state.callerStack[i]; if (lastSubsequentCaller != address(this)) { return lastSubsequentCaller; } } revert("_lastExternalCaller: end of stack"); } /** * @dev Returns the most recent caller of this contract. * * Last caller may also be the current contract. * * If the call is directly to the contract, without passing an Extendable, return `msg.sender` instead */ function _lastCaller() internal view returns(address) { CallerState storage state = CallerContextStorage._getState(); if (state.callerStack.length > 0) return state.callerStack[state.callerStack.length - 1]; else return msg.sender; } }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.4; /** * @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 returns (bool); } /** * @dev Storage based implementation of the {IERC165} interface. * * Uses Extendable storage pattern to populate the registered interfaces storage variable. */ interface IERC165Register { /** * @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. * * Requirements: * * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`). */ function registerInterface(bytes4 interfaceId) external; }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.4; struct CallerState { // Stores a list of callers in the order they are received // The current caller context is always the last-most address address[] callerStack; } library CallerContextStorage { bytes32 constant private STORAGE_NAME = keccak256("extendable.framework.v1:caller-state"); function _getState() internal view returns (CallerState storage callerState) { bytes32 position = keccak256(abi.encodePacked(address(this), STORAGE_NAME)); assembly { callerState.slot := position } } }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.4; import "@openzeppelin/contracts/utils/Strings.sol"; import "@openzeppelin/contracts/utils/Address.sol"; import { ERC721State, ERC721Storage } from "../../../storage/ERC721Storage.sol"; import { RoleState, Permissions } from "@violetprotocol/extendable/storage/PermissionStorage.sol"; import "../getter/IGetterLogic.sol"; import "../receiver/IOnReceiveLogic.sol"; import "../approve/IApproveLogic.sol"; import "../hooks/IERC721Hooks.sol"; import "./ITransferLogic.sol"; import "../Events.sol"; // Functional logic extracted from openZeppelin: // https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.sol contract TransferLogic is TransferExtension, Events { using Address for address; using Strings for uint256; /** * @dev See {ITransferLogic-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { require( IGetterLogic(address(this))._isApprovedOrOwner(_lastExternalCaller(), tokenId), "ERC721: transfer caller is not owner nor approved" ); _transfer(from, to, tokenId); } /** * @dev See {ITransferLogic-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {ITransferLogic-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require( IGetterLogic(address(this))._isApprovedOrOwner(_lastExternalCaller(), tokenId), "ERC721: transfer caller is not owner nor approved" ); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, * it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require( IOnReceiveLogic(address(this))._checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(IGetterLogic(address(this)).ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); IERC721Hooks(address(this))._beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner IApproveLogic(address(this))._approve(address(0), tokenId); ERC721State storage erc721State = ERC721Storage._getState(); erc721State._balances[from] -= 1; erc721State._balances[to] += 1; erc721State._owners[tokenId] = to; emit Events.Transfer(from, to, tokenId); IERC721Hooks(address(this))._afterTokenTransfer(from, to, tokenId); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @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 * ==== * * [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://diligence.consensys.net/posts/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.5.11/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 functionCall(target, data, "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"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(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) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(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) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason 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 { // 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 pragma solidity ^0.8.4; struct ERC721State { // Token name string _name; // Token symbol string _symbol; // Mapping from token ID to owner address mapping(uint256 => address) _owners; // Mapping owner address to token count mapping(address => uint256) _balances; // Mapping from token ID to approved address mapping(uint256 => address) _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) _operatorApprovals; } library ERC721Storage { bytes32 constant STORAGE_NAME = keccak256("extendable:erc721:base"); function _getState() internal view returns (ERC721State storage erc721State) { bytes32 position = keccak256(abi.encodePacked(address(this), STORAGE_NAME)); assembly { erc721State.slot := position } } }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.4; /** * @dev Storage struct used to hold state for Permissioning roles */ struct RoleState { address owner; // Can add more for DAOs/multisigs or more complex role capture for example: // address admin; // address manager: } /** * @dev Storage library to access storage slot for the state struct */ library Permissions { bytes32 constant private STORAGE_NAME = keccak256("extendable.framework.v1:permissions-state"); function _getState() internal view returns (RoleState storage roleState) { bytes32 position = keccak256(abi.encodePacked(address(this), STORAGE_NAME)); assembly { roleState.slot := position } } }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.4; import "@violetprotocol/extendable/extensions/InternalExtension.sol"; interface IGetterLogic { /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) external returns (uint256); /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) external returns (address); /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) external returns (address); /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) external returns (bool); /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). * * Requirements: * * - Must be modified with `public _internal`. */ function _exists(uint256 tokenId) external returns (bool); /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. * - Must be modified with `public _internal`. */ function _isApprovedOrOwner(address spender, uint256 tokenId) external returns (bool); } abstract contract GetterExtension is IGetterLogic, InternalExtension { /** * @dev see {IExtension-getSolidityInterface} */ function getSolidityInterface() public pure virtual override returns (string memory) { return "function balanceOf(address owner) external view returns (uint256);\n" "function ownerOf(uint256 tokenId) external view returns (address);\n" "function getApproved(uint256 tokenId) external view returns (address);\n" "function isApprovedForAll(address owner, address operator) external view returns (bool);\n" "function _exists(uint256 tokenId) external view returns (bool);\n" "function _isApprovedOrOwner(address spender, uint256 tokenId) external view returns (bool);\n"; } /** * @dev see {IExtension-getInterface} */ function getInterface() public virtual override returns (Interface[] memory interfaces) { interfaces = new Interface[](1); bytes4[] memory functions = new bytes4[](6); functions[0] = IGetterLogic.balanceOf.selector; functions[1] = IGetterLogic.ownerOf.selector; functions[2] = IGetterLogic.getApproved.selector; functions[3] = IGetterLogic.isApprovedForAll.selector; functions[4] = IGetterLogic._exists.selector; functions[5] = IGetterLogic._isApprovedOrOwner.selector; interfaces[0] = Interface(type(IGetterLogic).interfaceId, functions); } }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.4; import "@violetprotocol/extendable/extensions/InternalExtension.sol"; /** * OnReceive interface for contract-receiver hooks */ interface IOnReceiveLogic { function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) external returns (bool); } abstract contract OnReceiveExtension is IOnReceiveLogic, InternalExtension { /** * @dev see {IExtension-getSolidityInterface} */ function getSolidityInterface() public pure virtual override returns (string memory) { return "function _checkOnERC721Received(" "address from, address to, uint256 tokenId, bytes memory _data" ") external returns (bool);\n"; } /** * @dev see {IExtension-getInterface} */ function getInterface() public virtual override returns (Interface[] memory interfaces) { interfaces = new Interface[](1); bytes4[] memory functions = new bytes4[](1); functions[0] = IOnReceiveLogic._checkOnERC721Received.selector; interfaces[0] = Interface(type(IOnReceiveLogic).interfaceId, functions); } }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.4; import "@violetprotocol/extendable/extensions/InternalExtension.sol"; interface IApproveLogic { /** * @dev See {IERC721-Approval}. */ event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId); /** * @dev See {IERC721-ApprovalForAll}. */ event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved); /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) external; /** * @dev See {IERC721-approve}. */ function _approve(address to, uint256 tokenId) external; } abstract contract ApproveExtension is IApproveLogic, InternalExtension { /** * @dev see {IExtension-getSolidityInterface} */ function getSolidityInterface() public pure virtual override returns (string memory) { return "function approve(address to, uint256 tokenId) external;\n" "function setApprovalForAll(address operator, bool approved) external;\n" "function _approve(address to, uint256 tokenId) external;\n"; } /** * @dev see {IExtension-getInterface} */ function getInterface() public virtual override returns (Interface[] memory interfaces) { interfaces = new Interface[](1); bytes4[] memory functions = new bytes4[](3); functions[0] = IApproveLogic.approve.selector; functions[1] = IApproveLogic.setApprovalForAll.selector; functions[2] = IApproveLogic._approve.selector; interfaces[0] = Interface(type(IApproveLogic).interfaceId, functions); } }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.4; import "@violetprotocol/extendable/extensions/InternalExtension.sol"; interface IERC721Hooks { /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to https://docs.openzeppelin.com/contracts/3.x/extending-contracts#using-hooks. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) external; /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to https://docs.openzeppelin.com/contracts/3.x/extending-contracts#using-hooks. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) external; } abstract contract ERC721HooksExtension is IERC721Hooks, InternalExtension { /** * @dev see {IExtension-getSolidityInterface} */ function getSolidityInterface() public pure virtual override returns (string memory) { return "function _beforeTokenTransfer(address from, address to, uint256 tokenId) external;\n" "function _afterTokenTransfer(address from, address to, uint256 tokenId) external;\n"; } /** * @dev see {IExtension-getInterface} */ function getInterface() public virtual override returns (Interface[] memory interfaces) { interfaces = new Interface[](1); bytes4[] memory functions = new bytes4[](2); functions[0] = IERC721Hooks._beforeTokenTransfer.selector; functions[1] = IERC721Hooks._afterTokenTransfer.selector; interfaces[0] = Interface(type(IERC721Hooks).interfaceId, functions); } }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.4; import "@violetprotocol/extendable/extensions/Extension.sol"; // Functional logic extracted from openZeppelin: // https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.sol // To follow Extension principles, maybe best to separate each function into a different Extension interface ITransferLogic { /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) external; } abstract contract TransferExtension is ITransferLogic, Extension { /** * @dev see {IExtension-getSolidityInterface} */ function getSolidityInterface() public pure virtual override returns (string memory) { return "function transferFrom(address from, address to, uint256 tokenId) external;\n" "function safeTransferFrom(address from, address to, uint256 tokenId) external;\n" "function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) external;\n"; } /** * @dev see {IExtension-getInterface} */ function getInterface() public virtual override returns (Interface[] memory interfaces) { interfaces = new Interface[](1); bytes4[] memory functions = new bytes4[](3); functions[0] = ITransferLogic.transferFrom.selector; functions[1] = bytes4(keccak256("safeTransferFrom(address,address,uint256)")); functions[2] = bytes4(keccak256("safeTransferFrom(address,address,uint256,bytes)")); interfaces[0] = Interface(type(ITransferLogic).interfaceId, functions); } }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.4; /** * @dev Common Events interface, to be inherited by extensions that share events */ interface Events { /** * @dev See {IERC721-Transfer}. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.4; import "./Extension.sol"; import "../utils/Internal.sol"; import "../errors/Errors.sol"; /** * ______ __ __ ______ ______ __ __ _____ ______ ______ __ ______ * /\ ___\/\_\_\_\/\__ _\/\ ___\/\ "-.\ \/\ __-./\ __ \/\ == \/\ \ /\ ___\ * \ \ __\\/_/\_\/\/_/\ \/\ \ __\\ \ \-. \ \ \/\ \ \ __ \ \ __<\ \ \___\ \ __\ * \ \_____\/\_\/\_\ \ \_\ \ \_____\ \_\\"\_\ \____-\ \_\ \_\ \_____\ \_____\ \_____\ * \/_____/\/_/\/_/ \/_/ \/_____/\/_/ \/_/\/____/ \/_/\/_/\/_____/\/_____/\/_____/ * * Base contract for Internal Extensions in the Extendable Framework * * Internal Extensions are used to house common functions that are used by other contract extensions. * This is used to make internal functions usable across all your extensions without exposing it * to the external world. * * Define your custom Extension interface and implement it whilst inheriting this contract: * contract YourExtension is IYourExtension, InternalExtension {...} * * Then define your function and simply modify it in the following way: * contract YourExtension is IYourExtension, InternalExtension { * function _someFunc() public _internal {} * } * * Notice that your internal function carries both the `public` visibility modifier and the `_internal` * modifier. This is because cross-extension calls are resolved as external calls and `public` allows * your other extensions to call them whilst `_internal` restricts callers to only extensions of the * same contract. * * Note: * Use underscores `_` as internal function prefixes as general naming convention. */ abstract contract InternalExtension is Internal, Extension {}
//SPDX-License-Identifier: MIT pragma solidity ^0.8.4; /** * @dev Internal contract base inherited by InternalExtension to allow access * to `_internal` modifier for functions that should only be callable by * other Extensions of the current contract thus keeping the functions * 'internal' with respects to Extendable contract scope. * * Modify your functions with `_internal` to restrict callers to only originate * from the current Extendable contract. * * Note that due to the nature of cross-Extension calls, they are deemed as external * calls and thus your functions must counterintuitively be marked as both: * * `public _internal` * * function yourFunction() public _internal {} */ contract Internal { modifier _internal() { require(msg.sender == address(this), "external caller not allowed"); _; } }
{ "metadata": { "bytecodeHash": "none" }, "optimizer": { "enabled": true, "runs": 800 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"name":"ExtensionNotImplemented","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"getInterface","outputs":[{"components":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"},{"internalType":"bytes4[]","name":"functions","type":"bytes4[]"}],"internalType":"struct Interface[]","name":"interfaces","type":"tuple[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getSolidityInterface","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"registerInterface","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060006200001e620000ec565b905060005b8151811015620000d257600082828151811062000044576200004462000511565b60200260200101519050620000638160000151620002d960201b60201c565b60005b816020015151811015620000ba57620000a58260200151828151811062000091576200009162000511565b6020026020010151620002d960201b60201c565b80620000b18162000527565b91505062000066565b50508080620000c99062000527565b91505062000023565b50620000e56377841c7160e11b620002d9565b506200058d565b6040805160028082526060828101909352816020015b60408051808201909152600081526060602082015281526020019060019003908162000102575050604080516003808252608082019092529192506000919060208201606080368337019050509050639bd82d5d60e01b816000815181106200016f576200016f62000511565b60200260200101906001600160e01b03191690816001600160e01b031916815250507f0ac2e7cf760c598b326d88e5053941acee2d4bf9e2e1f7830f184ce375e3017781600181518110620001c857620001c862000511565b60200260200101906001600160e01b03191690816001600160e01b031916815250507f6e747bcc7202163d53ede2e861d2ea749fc12a60a5d645ee6853eebbd0dd2a4b8160028151811062000221576200022162000511565b6001600160e01b03199092166020928302919091018201526200024d906200083a62000398821b17901c565b60008151811062000262576200026262000511565b60200260200101518260008151811062000280576200028062000511565b6020026020010181905250604051806040016040528060016248a75160e11b03196001600160e01b03191681526020018281525082600181518110620002ca57620002ca62000511565b60200260200101819052505090565b6040516001600160e01b0319821660248201526000907316c940672fa7820c36b2123e657029d9826290709060440160408051601f198184030181529181526020820180516001600160e01b0316624299b760e71b179052516200033e91906200054f565b600060405180830381855af49150503d80600081146200037b576040519150601f19603f3d011682016040523d82523d6000602084013e62000380565b606091505b505090508062000394573d6000803e3d6000fd5b5050565b604080516001808252818301909252606091816020015b604080518082019091526000815260606020820152815260200190600190039081620003af5750506040805160038082526080820190925291925060009190602082016060803683370190505090506323b872dd60e01b816000815181106200041c576200041c62000511565b60200260200101906001600160e01b03191690816001600160e01b031916815250507f42842e0eb38857a7775b4e7364b2775df7325074d088e7fb39590cd6281184ed8160018151811062000475576200047562000511565b60200260200101906001600160e01b03191690816001600160e01b031916815250507fb88d4fde60196325a28bb7f99a2582e0b46de55b18761e960c14ad7a3209946581600281518110620004ce57620004ce62000511565b6001600160e01b03199092166020928302919091018201526040805180820190915263d9b1130d60e01b815290810182905282518390600090620002ca57620002ca5b634e487b7160e01b600052603260045260246000fd5b6000600182016200054857634e487b7160e01b600052601160045260246000fd5b5060010190565b6000825160005b8181101562000572576020818601810151858301520162000556565b8181111562000582576000828501525b509190910192915050565b611883806200059d6000396000f3fe6080604052600436106100b55760003560e01c806342842e0e116100695780639bd82d5d1161004e5780639bd82d5d146101c3578063b88d4fde146101e3578063df1827df146101fe576100c4565b806342842e0e146101835780636e747bcc146101a3576100c4565b8063214cdb801161009a578063214cdb801461012157806323b872dd1461014157806330101f3d14610161576100c4565b806301ffc9a7146100cc5780630ac2e7cf14610101576100c4565b366100c4576100c2610220565b005b6100c2610220565b3480156100d857600080fd5b506100ec6100e7366004611016565b610239565b60405190151581526020015b60405180910390f35b34801561010d57600080fd5b506100c261011c366004611075565b61030b565b34801561012d57600080fd5b506100c261013c366004611016565b61039e565b34801561014d57600080fd5b506100c261015c3660046110e5565b610458565b34801561016d57600080fd5b506101766104c6565b6040516100f8919061117e565b34801561018f57600080fd5b506100c261019e3660046110e5565b6104f4565b3480156101af57600080fd5b506100c26101be366004611234565b610564565b3480156101cf57600080fd5b506100c26101de366004611075565b6105e4565b3480156101ef57600080fd5b506100c261019e3660046112ce565b34801561020a57600080fd5b50610213610655565b6040516100f8919061133a565b60405163deba8f3160e01b815260040160405180910390fd5b6040516001600160e01b031982166024820152600090819081907316c940672fa7820c36b2123e657029d9826290709060440160408051601f198184030181529181526020820180516001600160e01b03166301ffc9a760e01b179052516102a191906113ea565b600060405180830381855af49150503d80600081146102dc576040519150601f19603f3d011682016040523d82523d6000602084013e6102e1565b606091505b5091509150816102ef573d81fd5b808060200190518101906103039190611406565b949350505050565b8686868661031b848484846109ab565b6103765760405162461bcd60e51b815260206004820152602160248201527f416363657373546f6b656e3a20766572696669636174696f6e206661696c75726044820152606560f81b60648201526084015b60405180910390fd5b61039187878760405180602001604052806000815250610aa0565b5050505050505050505050565b6040516001600160e01b0319821660248201526000907316c940672fa7820c36b2123e657029d9826290709060440160408051601f198184030181529181526020820180516001600160e01b0316624299b760e71b1790525161040191906113ea565b600060405180830381855af49150503d806000811461043c576040519150601f19603f3d011682016040523d82523d6000602084013e610441565b606091505b5050905080610454573d6000803e3d6000fd5b5050565b60405162461bcd60e51b815260206004820152603c60248201527f48756d616e626f756e645472616e736665724c6f6769632d7472616e7366657260448201527f46726f6d3a20646973616c6c6f77656420776974686f75742045415400000000606482015260840161036d565b60606104d0610b8f565b6040516020016104e09190611428565b604051602081830303815290604052905090565b6040805162461bcd60e51b81526020600482015260248101919091527f48756d616e626f756e645472616e736665724c6f6769632d736166655472616e60448201527f7366657246726f6d3a20646973616c6c6f77656420776974686f757420454154606482015260840161036d565b87878787610574848484846109ab565b6105ca5760405162461bcd60e51b815260206004820152602160248201527f416363657373546f6b656e3a20766572696669636174696f6e206661696c75726044820152606560f81b606482015260840161036d565b6105d688888888610aa0565b505050505050505050505050565b868686866105f4848484846109ab565b61064a5760405162461bcd60e51b815260206004820152602160248201527f416363657373546f6b656e3a20766572696669636174696f6e206661696c75726044820152606560f81b606482015260840161036d565b610391878787610bb0565b6040805160028082526060828101909352816020015b60408051808201909152600081526060602082015281526020019060019003908161066b575050604080516003808252608082019092529192506000919060208201606080368337019050509050639bd82d5d60e01b816000815181106106d4576106d4611637565b60200260200101906001600160e01b03191690816001600160e01b031916815250507f0ac2e7cf760c598b326d88e5053941acee2d4bf9e2e1f7830f184ce375e301778160018151811061072a5761072a611637565b60200260200101906001600160e01b03191690816001600160e01b031916815250507f6e747bcc7202163d53ede2e861d2ea749fc12a60a5d645ee6853eebbd0dd2a4b8160028151811061078057610780611637565b6001600160e01b0319909216602092830291909101909101526107a161083a565b6000815181106107b3576107b3611637565b6020026020010151826000815181106107ce576107ce611637565b602002602001018190525060405180604001604052807fff6eb15e000000000000000000000000000000000000000000000000000000006001600160e01b0319168152602001828152508260018151811061082b5761082b611637565b60200260200101819052505090565b604080516001808252818301909252606091816020015b6040805180820190915260008152606060208201528152602001906001900390816108515750506040805160038082526080820190925291925060009190602082016060803683370190505090506323b872dd60e01b816000815181106108ba576108ba611637565b60200260200101906001600160e01b03191690816001600160e01b031916815250507f42842e0eb38857a7775b4e7364b2775df7325074d088e7fb39590cd6281184ed8160018151811061091057610910611637565b60200260200101906001600160e01b03191690816001600160e01b031916815250507fb88d4fde60196325a28bb7f99a2582e0b46de55b18761e960c14ad7a320994658160028151811061096657610966611637565b6001600160e01b03199092166020928302919091018201526040805180820190915263d9b1130d60e01b81529081018290528251839060009061082b5761082b611637565b6000806109b783610f6b565b90506000306001600160a01b03166346657fe96040518163ffffffff1660e01b81526004016020604051808303816000875af11580156109fb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a1f919061164d565b60405163fda7127960e01b81529091506001600160a01b0382169063fda7127990610a549085908b908b908b9060040161166a565b602060405180830381865afa158015610a71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a959190611406565b979650505050505050565b610aab848484610bb0565b604051631fd01de160e01b81523090631fd01de190610ad49087908790879087906004016116f8565b6020604051808303816000875af1158015610af3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b179190611406565b610b895760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161036d565b50505050565b606060405180610120016040528060fd815260200161177a60fd9139905090565b6040516331a9108f60e11b8152600481018290526001600160a01b038416903090636352211e906024016020604051808303816000875af1158015610bf9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1d919061164d565b6001600160a01b031614610c995760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e6572000000000000000000000000000000000000000000000000000000606482015260840161036d565b6001600160a01b038216610cfb5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161036d565b60405163cad3be8360e01b81526001600160a01b0380851660048301528316602482015260448101829052309063cad3be8390606401600060405180830381600087803b158015610d4b57600080fd5b505af1158015610d5f573d6000803e3d6000fd5b5050604051637b7d722560e01b81526000600482015260248101849052309250637b7d72259150604401600060405180830381600087803b158015610da357600080fd5b505af1158015610db7573d6000803e3d6000fd5b505050506000610e276040516bffffffffffffffffffffffff193060601b1660208201527f9e4673de1ccd04f1c4802d719ca4663f19655a024fdf4ebb6d488d3e26150fb56034820152600090819060540160408051601f19818403018152919052805160209091012092915050565b6001600160a01b038516600090815260038201602052604081208054929350600192909190610e5790849061174a565b90915550506001600160a01b03831660009081526003820160205260408120805460019290610e87908490611761565b9091555050600082815260028201602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0387811691821790925591518593918816917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a46040516323e0468760e21b81526001600160a01b03808616600483015284166024820152604481018390523090638f811a1c90606401600060405180830381600087803b158015610f4d57600080fd5b505af1158015610f61573d6000803e3d6000fd5b5050505050505050565b610fa460408051808201825260008082528251608081018452818152602081810183905293810191909152606080820152909182015290565b604080516080810182526060808201526000356001600160e01b03191681523060208201523391810191909152610fd9610fe9565b6060820152602082015290815290565b60606040513660008237368181016040526083190180825290915081906084908082602085013750505090565b60006020828403121561102857600080fd5b81356001600160e01b03198116811461104057600080fd5b9392505050565b803560ff8116811461105857600080fd5b919050565b6001600160a01b038116811461107257600080fd5b50565b600080600080600080600060e0888a03121561109057600080fd5b61109988611047565b965060208801359550604088013594506060880135935060808801356110be8161105d565b925060a08801356110ce8161105d565b8092505060c0880135905092959891949750929550565b6000806000606084860312156110fa57600080fd5b83356111058161105d565b925060208401356111158161105d565b929592945050506040919091013590565b60005b83811015611141578181015183820152602001611129565b83811115610b895750506000910152565b6000815180845261116a816020860160208601611126565b601f01601f19169290920160200192915050565b6020815260006110406020830184611152565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126111b857600080fd5b813567ffffffffffffffff808211156111d3576111d3611191565b604051601f8301601f19908116603f011681019082821181831017156111fb576111fb611191565b8160405283815286602085880101111561121457600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600080610100898b03121561125157600080fd5b61125a89611047565b9750602089013596506040890135955060608901359450608089013561127f8161105d565b935060a089013561128f8161105d565b925060c0890135915060e089013567ffffffffffffffff8111156112b257600080fd5b6112be8b828c016111a7565b9150509295985092959890939650565b600080600080608085870312156112e457600080fd5b84356112ef8161105d565b935060208501356112ff8161105d565b925060408501359150606085013567ffffffffffffffff81111561132257600080fd5b61132e878288016111a7565b91505092959194509250565b60006020808301818452808551808352604092508286019150828160051b8701018488016000805b848110156113db57898403603f19018652825180516001600160e01b03199081168652908901518986018990528051898701819052908a0191849160608801905b808410156113c557845183168252938c019360019390930192908c01906113a3565b50988b0198965050509288019250600101611362565b50919998505050505050505050565b600082516113fc818460208701611126565b9190910192915050565b60006020828403121561141857600080fd5b8151801515811461104057600080fd5b6000825161143a818460208701611126565b7f66756e6374696f6e207472616e7366657246726f6d2875696e743820762c20629201918252507f79746573333220722c206279746573333220732c2075696e743235362065787060208201527f6972792c20616464726573732066726f6d2c206164647265737320746f2c207560408201527f696e7432353620746f6b656e4964292065787465726e616c3b0a66756e63746960608201527f6f6e20736166655472616e7366657246726f6d2875696e743820762c2062797460808201527f6573333220722c206279746573333220732c2075696e7432353620657870697260a08201527f792c20616464726573732066726f6d2c206164647265737320746f2c2075696e60c08201527f7432353620746f6b656e4964292065787465726e616c3b0a66756e6374696f6e60e08201527f20736166655472616e7366657246726f6d2875696e743820762c2062797465736101008201527f333220722c206279746573333220732c2075696e74323536206578706972792c6101208201527f20616464726573732066726f6d2c206164647265737320746f2c2075696e74326101408201527f353620746f6b656e49642c206279746573206d656d6f727920646174612920656101608201527f787465726e616c3b0a000000000000000000000000000000000000000000000061018082015261018901919050565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561165f57600080fd5b81516110408161105d565b608081528451608082015260006020860151604060a084015263ffffffff60e01b81511660c084015260208101516001600160a01b0380821660e08601528060408401511661010086015250506060810151905060806101208401526116d4610140840182611152565b9150506116e6602083018660ff169052565b60408201939093526060015292915050565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261172a6080830184611152565b9695505050505050565b634e487b7160e01b600052601160045260246000fd5b60008282101561175c5761175c611734565b500390565b6000821982111561177457611774611734565b50019056fe66756e6374696f6e207472616e7366657246726f6d28616464726573732066726f6d2c206164647265737320746f2c2075696e7432353620746f6b656e4964292065787465726e616c3b0a66756e6374696f6e20736166655472616e7366657246726f6d28616464726573732066726f6d2c206164647265737320746f2c2075696e7432353620746f6b656e4964292065787465726e616c3b0a66756e6374696f6e20736166655472616e7366657246726f6d28616464726573732066726f6d2c206164647265737320746f2c2075696e7432353620746f6b656e49642c206279746573206d656d6f7279205f64617461292065787465726e616c3b0aa164736f6c634300080d000a
Deployed Bytecode
0x6080604052600436106100b55760003560e01c806342842e0e116100695780639bd82d5d1161004e5780639bd82d5d146101c3578063b88d4fde146101e3578063df1827df146101fe576100c4565b806342842e0e146101835780636e747bcc146101a3576100c4565b8063214cdb801161009a578063214cdb801461012157806323b872dd1461014157806330101f3d14610161576100c4565b806301ffc9a7146100cc5780630ac2e7cf14610101576100c4565b366100c4576100c2610220565b005b6100c2610220565b3480156100d857600080fd5b506100ec6100e7366004611016565b610239565b60405190151581526020015b60405180910390f35b34801561010d57600080fd5b506100c261011c366004611075565b61030b565b34801561012d57600080fd5b506100c261013c366004611016565b61039e565b34801561014d57600080fd5b506100c261015c3660046110e5565b610458565b34801561016d57600080fd5b506101766104c6565b6040516100f8919061117e565b34801561018f57600080fd5b506100c261019e3660046110e5565b6104f4565b3480156101af57600080fd5b506100c26101be366004611234565b610564565b3480156101cf57600080fd5b506100c26101de366004611075565b6105e4565b3480156101ef57600080fd5b506100c261019e3660046112ce565b34801561020a57600080fd5b50610213610655565b6040516100f8919061133a565b60405163deba8f3160e01b815260040160405180910390fd5b6040516001600160e01b031982166024820152600090819081907316c940672fa7820c36b2123e657029d9826290709060440160408051601f198184030181529181526020820180516001600160e01b03166301ffc9a760e01b179052516102a191906113ea565b600060405180830381855af49150503d80600081146102dc576040519150601f19603f3d011682016040523d82523d6000602084013e6102e1565b606091505b5091509150816102ef573d81fd5b808060200190518101906103039190611406565b949350505050565b8686868661031b848484846109ab565b6103765760405162461bcd60e51b815260206004820152602160248201527f416363657373546f6b656e3a20766572696669636174696f6e206661696c75726044820152606560f81b60648201526084015b60405180910390fd5b61039187878760405180602001604052806000815250610aa0565b5050505050505050505050565b6040516001600160e01b0319821660248201526000907316c940672fa7820c36b2123e657029d9826290709060440160408051601f198184030181529181526020820180516001600160e01b0316624299b760e71b1790525161040191906113ea565b600060405180830381855af49150503d806000811461043c576040519150601f19603f3d011682016040523d82523d6000602084013e610441565b606091505b5050905080610454573d6000803e3d6000fd5b5050565b60405162461bcd60e51b815260206004820152603c60248201527f48756d616e626f756e645472616e736665724c6f6769632d7472616e7366657260448201527f46726f6d3a20646973616c6c6f77656420776974686f75742045415400000000606482015260840161036d565b60606104d0610b8f565b6040516020016104e09190611428565b604051602081830303815290604052905090565b6040805162461bcd60e51b81526020600482015260248101919091527f48756d616e626f756e645472616e736665724c6f6769632d736166655472616e60448201527f7366657246726f6d3a20646973616c6c6f77656420776974686f757420454154606482015260840161036d565b87878787610574848484846109ab565b6105ca5760405162461bcd60e51b815260206004820152602160248201527f416363657373546f6b656e3a20766572696669636174696f6e206661696c75726044820152606560f81b606482015260840161036d565b6105d688888888610aa0565b505050505050505050505050565b868686866105f4848484846109ab565b61064a5760405162461bcd60e51b815260206004820152602160248201527f416363657373546f6b656e3a20766572696669636174696f6e206661696c75726044820152606560f81b606482015260840161036d565b610391878787610bb0565b6040805160028082526060828101909352816020015b60408051808201909152600081526060602082015281526020019060019003908161066b575050604080516003808252608082019092529192506000919060208201606080368337019050509050639bd82d5d60e01b816000815181106106d4576106d4611637565b60200260200101906001600160e01b03191690816001600160e01b031916815250507f0ac2e7cf760c598b326d88e5053941acee2d4bf9e2e1f7830f184ce375e301778160018151811061072a5761072a611637565b60200260200101906001600160e01b03191690816001600160e01b031916815250507f6e747bcc7202163d53ede2e861d2ea749fc12a60a5d645ee6853eebbd0dd2a4b8160028151811061078057610780611637565b6001600160e01b0319909216602092830291909101909101526107a161083a565b6000815181106107b3576107b3611637565b6020026020010151826000815181106107ce576107ce611637565b602002602001018190525060405180604001604052807fff6eb15e000000000000000000000000000000000000000000000000000000006001600160e01b0319168152602001828152508260018151811061082b5761082b611637565b60200260200101819052505090565b604080516001808252818301909252606091816020015b6040805180820190915260008152606060208201528152602001906001900390816108515750506040805160038082526080820190925291925060009190602082016060803683370190505090506323b872dd60e01b816000815181106108ba576108ba611637565b60200260200101906001600160e01b03191690816001600160e01b031916815250507f42842e0eb38857a7775b4e7364b2775df7325074d088e7fb39590cd6281184ed8160018151811061091057610910611637565b60200260200101906001600160e01b03191690816001600160e01b031916815250507fb88d4fde60196325a28bb7f99a2582e0b46de55b18761e960c14ad7a320994658160028151811061096657610966611637565b6001600160e01b03199092166020928302919091018201526040805180820190915263d9b1130d60e01b81529081018290528251839060009061082b5761082b611637565b6000806109b783610f6b565b90506000306001600160a01b03166346657fe96040518163ffffffff1660e01b81526004016020604051808303816000875af11580156109fb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a1f919061164d565b60405163fda7127960e01b81529091506001600160a01b0382169063fda7127990610a549085908b908b908b9060040161166a565b602060405180830381865afa158015610a71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a959190611406565b979650505050505050565b610aab848484610bb0565b604051631fd01de160e01b81523090631fd01de190610ad49087908790879087906004016116f8565b6020604051808303816000875af1158015610af3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b179190611406565b610b895760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161036d565b50505050565b606060405180610120016040528060fd815260200161177a60fd9139905090565b6040516331a9108f60e11b8152600481018290526001600160a01b038416903090636352211e906024016020604051808303816000875af1158015610bf9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1d919061164d565b6001600160a01b031614610c995760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e6572000000000000000000000000000000000000000000000000000000606482015260840161036d565b6001600160a01b038216610cfb5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161036d565b60405163cad3be8360e01b81526001600160a01b0380851660048301528316602482015260448101829052309063cad3be8390606401600060405180830381600087803b158015610d4b57600080fd5b505af1158015610d5f573d6000803e3d6000fd5b5050604051637b7d722560e01b81526000600482015260248101849052309250637b7d72259150604401600060405180830381600087803b158015610da357600080fd5b505af1158015610db7573d6000803e3d6000fd5b505050506000610e276040516bffffffffffffffffffffffff193060601b1660208201527f9e4673de1ccd04f1c4802d719ca4663f19655a024fdf4ebb6d488d3e26150fb56034820152600090819060540160408051601f19818403018152919052805160209091012092915050565b6001600160a01b038516600090815260038201602052604081208054929350600192909190610e5790849061174a565b90915550506001600160a01b03831660009081526003820160205260408120805460019290610e87908490611761565b9091555050600082815260028201602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0387811691821790925591518593918816917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a46040516323e0468760e21b81526001600160a01b03808616600483015284166024820152604481018390523090638f811a1c90606401600060405180830381600087803b158015610f4d57600080fd5b505af1158015610f61573d6000803e3d6000fd5b5050505050505050565b610fa460408051808201825260008082528251608081018452818152602081810183905293810191909152606080820152909182015290565b604080516080810182526060808201526000356001600160e01b03191681523060208201523391810191909152610fd9610fe9565b6060820152602082015290815290565b60606040513660008237368181016040526083190180825290915081906084908082602085013750505090565b60006020828403121561102857600080fd5b81356001600160e01b03198116811461104057600080fd5b9392505050565b803560ff8116811461105857600080fd5b919050565b6001600160a01b038116811461107257600080fd5b50565b600080600080600080600060e0888a03121561109057600080fd5b61109988611047565b965060208801359550604088013594506060880135935060808801356110be8161105d565b925060a08801356110ce8161105d565b8092505060c0880135905092959891949750929550565b6000806000606084860312156110fa57600080fd5b83356111058161105d565b925060208401356111158161105d565b929592945050506040919091013590565b60005b83811015611141578181015183820152602001611129565b83811115610b895750506000910152565b6000815180845261116a816020860160208601611126565b601f01601f19169290920160200192915050565b6020815260006110406020830184611152565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126111b857600080fd5b813567ffffffffffffffff808211156111d3576111d3611191565b604051601f8301601f19908116603f011681019082821181831017156111fb576111fb611191565b8160405283815286602085880101111561121457600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600080610100898b03121561125157600080fd5b61125a89611047565b9750602089013596506040890135955060608901359450608089013561127f8161105d565b935060a089013561128f8161105d565b925060c0890135915060e089013567ffffffffffffffff8111156112b257600080fd5b6112be8b828c016111a7565b9150509295985092959890939650565b600080600080608085870312156112e457600080fd5b84356112ef8161105d565b935060208501356112ff8161105d565b925060408501359150606085013567ffffffffffffffff81111561132257600080fd5b61132e878288016111a7565b91505092959194509250565b60006020808301818452808551808352604092508286019150828160051b8701018488016000805b848110156113db57898403603f19018652825180516001600160e01b03199081168652908901518986018990528051898701819052908a0191849160608801905b808410156113c557845183168252938c019360019390930192908c01906113a3565b50988b0198965050509288019250600101611362565b50919998505050505050505050565b600082516113fc818460208701611126565b9190910192915050565b60006020828403121561141857600080fd5b8151801515811461104057600080fd5b6000825161143a818460208701611126565b7f66756e6374696f6e207472616e7366657246726f6d2875696e743820762c20629201918252507f79746573333220722c206279746573333220732c2075696e743235362065787060208201527f6972792c20616464726573732066726f6d2c206164647265737320746f2c207560408201527f696e7432353620746f6b656e4964292065787465726e616c3b0a66756e63746960608201527f6f6e20736166655472616e7366657246726f6d2875696e743820762c2062797460808201527f6573333220722c206279746573333220732c2075696e7432353620657870697260a08201527f792c20616464726573732066726f6d2c206164647265737320746f2c2075696e60c08201527f7432353620746f6b656e4964292065787465726e616c3b0a66756e6374696f6e60e08201527f20736166655472616e7366657246726f6d2875696e743820762c2062797465736101008201527f333220722c206279746573333220732c2075696e74323536206578706972792c6101208201527f20616464726573732066726f6d2c206164647265737320746f2c2075696e74326101408201527f353620746f6b656e49642c206279746573206d656d6f727920646174612920656101608201527f787465726e616c3b0a000000000000000000000000000000000000000000000061018082015261018901919050565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561165f57600080fd5b81516110408161105d565b608081528451608082015260006020860151604060a084015263ffffffff60e01b81511660c084015260208101516001600160a01b0380821660e08601528060408401511661010086015250506060810151905060806101208401526116d4610140840182611152565b9150506116e6602083018660ff169052565b60408201939093526060015292915050565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261172a6080830184611152565b9695505050505050565b634e487b7160e01b600052601160045260246000fd5b60008282101561175c5761175c611734565b500390565b6000821982111561177457611774611734565b50019056fe66756e6374696f6e207472616e7366657246726f6d28616464726573732066726f6d2c206164647265737320746f2c2075696e7432353620746f6b656e4964292065787465726e616c3b0a66756e6374696f6e20736166655472616e7366657246726f6d28616464726573732066726f6d2c206164647265737320746f2c2075696e7432353620746f6b656e4964292065787465726e616c3b0a66756e6374696f6e20736166655472616e7366657246726f6d28616464726573732066726f6d2c206164647265737320746f2c2075696e7432353620746f6b656e49642c206279746573206d656d6f7279205f64617461292065787465726e616c3b0aa164736f6c634300080d000a
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.