Latest 25 from a total of 4,509 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Withdraw | 285123050 | 411 days ago | IN | 0 ETH | 0.00000817 | ||||
| Withdraw | 280951655 | 423 days ago | IN | 0 ETH | 0.00003738 | ||||
| Withdraw | 280903649 | 423 days ago | IN | 0 ETH | 0.00000851 | ||||
| Start Round | 280874024 | 423 days ago | IN | 0 ETH | 0.00000133 | ||||
| Close Round Manu... | 280874004 | 423 days ago | IN | 0 ETH | 0.00001271 | ||||
| Start Round | 279843573 | 426 days ago | IN | 0 ETH | 0.00000091 | ||||
| Close Round Manu... | 279843553 | 426 days ago | IN | 0 ETH | 0.00002066 | ||||
| Withdraw | 279288947 | 428 days ago | IN | 0 ETH | 0.00001191 | ||||
| Withdraw | 279247341 | 428 days ago | IN | 0 ETH | 0.00001204 | ||||
| Withdraw | 279245909 | 428 days ago | IN | 0 ETH | 0.00001062 | ||||
| Start Round | 278814563 | 429 days ago | IN | 0 ETH | 0.00000096 | ||||
| Close Round Manu... | 278814542 | 429 days ago | IN | 0 ETH | 0.00001234 | ||||
| Start Round | 277784921 | 432 days ago | IN | 0 ETH | 0.00000092 | ||||
| Close Round Manu... | 277784858 | 432 days ago | IN | 0 ETH | 0.00001503 | ||||
| Start Round | 276754163 | 435 days ago | IN | 0 ETH | 0.00000119 | ||||
| Close Round Manu... | 276754142 | 435 days ago | IN | 0 ETH | 0.00001528 | ||||
| Start Round | 275723186 | 438 days ago | IN | 0 ETH | 0.00000133 | ||||
| Close Round Manu... | 275723166 | 438 days ago | IN | 0 ETH | 0.00000317 | ||||
| Withdraw | 275599526 | 439 days ago | IN | 0 ETH | 0.00000811 | ||||
| Start Round | 274691739 | 441 days ago | IN | 0 ETH | 0.00000136 | ||||
| Close Round Manu... | 274691719 | 441 days ago | IN | 0 ETH | 0.00001586 | ||||
| Withdraw | 274133160 | 443 days ago | IN | 0 ETH | 0.00029177 | ||||
| Deposit | 273726411 | 444 days ago | IN | 0 ETH | 0.0000161 | ||||
| Start Round | 273661977 | 444 days ago | IN | 0 ETH | 0.00001408 | ||||
| Close Round Manu... | 273661936 | 444 days ago | IN | 0 ETH | 0.00034785 |
Latest 25 internal transactions (View All)
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 72085764 | 1046 days ago | 0 ETH | ||||
| 72085534 | 1046 days ago | 0 ETH | ||||
| 72085534 | 1046 days ago | 0 ETH | ||||
| 72085512 | 1046 days ago | 0 ETH | ||||
| 72085512 | 1046 days ago | 0 ETH | ||||
| 72075922 | 1046 days ago | 0 ETH | ||||
| 72075922 | 1046 days ago | 0 ETH | ||||
| 72074433 | 1046 days ago | 0 ETH | ||||
| 72074433 | 1046 days ago | 0 ETH | ||||
| 72074090 | 1046 days ago | 0 ETH | ||||
| 72074090 | 1046 days ago | 0 ETH | ||||
| 72071236 | 1046 days ago | 0 ETH | ||||
| 72071236 | 1046 days ago | 0 ETH | ||||
| 72070594 | 1046 days ago | 0 ETH | ||||
| 72070594 | 1046 days ago | 0 ETH | ||||
| 72068162 | 1046 days ago | 0 ETH | ||||
| 72068162 | 1046 days ago | 0 ETH | ||||
| 72065798 | 1046 days ago | 0 ETH | ||||
| 72065798 | 1046 days ago | 0 ETH | ||||
| 72062657 | 1046 days ago | 0 ETH | ||||
| 72062657 | 1046 days ago | 0 ETH | ||||
| 72059650 | 1046 days ago | 0 ETH | ||||
| 72059650 | 1046 days ago | 0 ETH | ||||
| 72059483 | 1046 days ago | 0 ETH | ||||
| 72059483 | 1046 days ago | 0 ETH |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
Diamond
Compiler Version
v0.8.18+commit.87f61d96
Optimization Enabled:
Yes with 9999999 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
// import "@forge-std/src/console.sol";
import {LibDiamond} from "./libraries/LibDiamond.sol";
import {DiamondStorage} from "./types/diamond/DiamondStorage.sol";
import {IDiamondCut} from "./interfaces/IDiamondCut.sol";
import {DiamondCutFacet} from "./facets/DiamondCutFacet.sol";
import {DiamondLoupeFacet} from "./facets/DiamondLoupeFacet.sol";
import {ERC165Facet} from "./facets/ERC165Facet.sol";
import {PausableFacet} from "./facets/PausableFacet.sol";
import {FacetCut, FacetCutAction} from "./types/diamond/Facet.sol";
import {LibAccessControl, WithRoles} from "./libraries/LibAccessControl.sol";
import {LibPonzu, PonzuStorage} from "./libraries/LibPonzu.sol";
import {LibQRNG, QRNGStorage} from "./libraries/LibQRNG.sol";
import {AccessControlFacet} from "./facets/AccessControlFacet.sol";
import {DEFAULT_ADMIN_ROLE, GAME_ADMIN_ROLE} from "./types/access/AccessControlStorage.sol";
import {IAirnodeRrpV0} from "@api3/airnode-protocol/contracts/rrp/interfaces/IAirnodeRrpV0.sol";
import {StorageSlot} from "@contracts/libraries/StorageSlot.sol";
// When no function exists for function called
error FunctionNotFound(bytes4 functionSignature);
contract Diamond is WithRoles {
bytes32 constant IMPLEMENTATION_SLOT =
bytes32(uint256(keccak256("eip1967.proxy.implementation")) - 1);
event Upgraded(address indexed implementation);
constructor(
address airnodeRrp,
address blackHole,
address rewardToken,
address contractAdmin,
address diamondCutFacet_,
address diamondLoupeFacet_,
address accessControlFacet_,
address erc165Facet_,
address methodsExposureFacetAddress_,
address pausableFacet_
) payable {
LibAccessControl.grantRole(DEFAULT_ADMIN_ROLE, contractAdmin);
LibAccessControl.grantRole(GAME_ADMIN_ROLE, contractAdmin);
PonzuStorage storage ps = LibPonzu.DS();
ps.blackHole = blackHole;
ps.rewardToken = rewardToken;
ps.depositDeadline = 6 hours;
ps.roundDuration = 3 days;
// QRNG
QRNGStorage storage qs = LibQRNG.DS();
qs.airnodeRrp = airnodeRrp;
IAirnodeRrpV0(airnodeRrp).setSponsorshipStatus(address(this), true);
// Set the implementation address
_setImplementation(methodsExposureFacetAddress_);
// Add the diamondCut external function from the diamondCutFacet
FacetCut[] memory cut = new FacetCut[](1);
bytes4[] memory functionSelectors = new bytes4[](1);
functionSelectors[0] = IDiamondCut.diamondCut.selector;
cut[0] = FacetCut({
facetAddress: diamondCutFacet_,
action: FacetCutAction.Add,
functionSelectors: functionSelectors
});
LibDiamond.diamondCut(cut, address(0), "");
// Add the diamondLoupe external functions from the diamondLoupeFacet
cut = new FacetCut[](1);
functionSelectors = new bytes4[](4);
functionSelectors[0] = DiamondLoupeFacet.facets.selector;
functionSelectors[1] = DiamondLoupeFacet.facetFunctionSelectors.selector;
functionSelectors[2] = DiamondLoupeFacet.facetAddresses.selector;
functionSelectors[3] = DiamondLoupeFacet.facetAddress.selector;
cut[0] = FacetCut({
facetAddress: diamondLoupeFacet_,
action: FacetCutAction.Add,
functionSelectors: functionSelectors
});
LibDiamond.diamondCut(cut, address(0), "");
// Add the access control external functions from the accessControlFacet
cut = new FacetCut[](1);
functionSelectors = new bytes4[](8);
functionSelectors[0] = AccessControlFacet.hasRole.selector;
functionSelectors[1] = AccessControlFacet.getRoleAdmin.selector;
functionSelectors[2] = AccessControlFacet.grantRole.selector;
functionSelectors[3] = AccessControlFacet.revokeRole.selector;
functionSelectors[4] = AccessControlFacet.renounceRole.selector;
functionSelectors[5] = AccessControlFacet.getRoleMember.selector;
functionSelectors[6] = AccessControlFacet.getRoleMemberCount.selector;
functionSelectors[7] = AccessControlFacet.getRoleMembers.selector;
cut[0] = FacetCut({
facetAddress: accessControlFacet_,
action: FacetCutAction.Add,
functionSelectors: functionSelectors
});
LibDiamond.diamondCut(cut, address(0), "");
// Add the ERC165 external functions from the erc165Facet
cut = new FacetCut[](1);
functionSelectors = new bytes4[](1);
functionSelectors[0] = ERC165Facet.supportsInterface.selector;
cut[0] = FacetCut({
facetAddress: erc165Facet_,
action: FacetCutAction.Add,
functionSelectors: functionSelectors
});
LibDiamond.diamondCut(cut, address(0), "");
// Add the Pausable external functions from the pausableFacet
cut = new FacetCut[](1);
functionSelectors = new bytes4[](4);
functionSelectors[0] = PausableFacet.pause.selector;
functionSelectors[1] = PausableFacet.unpause.selector;
functionSelectors[2] = PausableFacet.isPaused.selector;
functionSelectors[3] = PausableFacet.pausedAt.selector;
cut[0] = FacetCut({
facetAddress: pausableFacet_,
action: FacetCutAction.Add,
functionSelectors: functionSelectors
});
LibDiamond.diamondCut(cut, address(0), "");
}
function implementation() public view returns (address) {
return _getImplementation();
}
/**
* @dev Returns the current implementation address.
*/
function _getImplementation() internal view returns (address) {
return StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value;
}
/**
* @dev Stores a new address in the EIP1967 implementation slot.
*/
function _setImplementation(address newImplementation) private {
LibDiamond.enforceHasContractCode(newImplementation);
StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value = newImplementation;
emit Upgraded(newImplementation);
}
/**
* @dev Perform implementation upgrade
*
* Emits an {Upgraded} event.
*/
function setImplementation(address newImplementation) external onlyRole(DEFAULT_ADMIN_ROLE) {
_setImplementation(newImplementation);
}
// Find facet for function that is called and execute the
// function if a facet is found and return any value.
fallback() external payable {
DiamondStorage storage ds;
// get diamond storage
bytes32 position = LibDiamond.DIAMOND_STORAGE_POSITION;
assembly {
ds.slot := position
}
// get facet from function selector
address facet = ds.selectorToFacetAndPosition[msg.sig].facetAddress;
if (facet == address(0)) revert FunctionNotFound(msg.sig);
// Execute external function from facet using delegatecall and return any value.
assembly {
// copy function selector and any arguments
calldatacopy(0, 0, calldatasize())
// execute function call using the facet
let result := delegatecall(gas(), facet, 0, calldatasize(), 0, 0)
// get any return value
returndatacopy(0, 0, returndatasize())
// return any return value or error back to the caller
switch result
case 0 {
revert(0, returndatasize())
}
default {
return(0, returndatasize())
}
}
}
receive() external payable {}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "./IAuthorizationUtilsV0.sol";
import "./ITemplateUtilsV0.sol";
import "./IWithdrawalUtilsV0.sol";
interface IAirnodeRrpV0 is
IAuthorizationUtilsV0,
ITemplateUtilsV0,
IWithdrawalUtilsV0
{
event SetSponsorshipStatus(
address indexed sponsor,
address indexed requester,
bool sponsorshipStatus
);
event MadeTemplateRequest(
address indexed airnode,
bytes32 indexed requestId,
uint256 requesterRequestCount,
uint256 chainId,
address requester,
bytes32 templateId,
address sponsor,
address sponsorWallet,
address fulfillAddress,
bytes4 fulfillFunctionId,
bytes parameters
);
event MadeFullRequest(
address indexed airnode,
bytes32 indexed requestId,
uint256 requesterRequestCount,
uint256 chainId,
address requester,
bytes32 endpointId,
address sponsor,
address sponsorWallet,
address fulfillAddress,
bytes4 fulfillFunctionId,
bytes parameters
);
event FulfilledRequest(
address indexed airnode,
bytes32 indexed requestId,
bytes data
);
event FailedRequest(
address indexed airnode,
bytes32 indexed requestId,
string errorMessage
);
function setSponsorshipStatus(address requester, bool sponsorshipStatus)
external;
function makeTemplateRequest(
bytes32 templateId,
address sponsor,
address sponsorWallet,
address fulfillAddress,
bytes4 fulfillFunctionId,
bytes calldata parameters
) external returns (bytes32 requestId);
function makeFullRequest(
address airnode,
bytes32 endpointId,
address sponsor,
address sponsorWallet,
address fulfillAddress,
bytes4 fulfillFunctionId,
bytes calldata parameters
) external returns (bytes32 requestId);
function fulfill(
bytes32 requestId,
address airnode,
address fulfillAddress,
bytes4 fulfillFunctionId,
bytes calldata data,
bytes calldata signature
) external returns (bool callSuccess, bytes memory callData);
function fail(
bytes32 requestId,
address airnode,
address fulfillAddress,
bytes4 fulfillFunctionId,
string calldata errorMessage
) external;
function sponsorToRequesterToSponsorshipStatus(
address sponsor,
address requester
) external view returns (bool sponsorshipStatus);
function requesterToRequestCountPlusOne(address requester)
external
view
returns (uint256 requestCountPlusOne);
function requestIsAwaitingFulfillment(bytes32 requestId)
external
view
returns (bool isAwaitingFulfillment);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface IAuthorizationUtilsV0 {
function checkAuthorizationStatus(
address[] calldata authorizers,
address airnode,
bytes32 requestId,
bytes32 endpointId,
address sponsor,
address requester
) external view returns (bool status);
function checkAuthorizationStatuses(
address[] calldata authorizers,
address airnode,
bytes32[] calldata requestIds,
bytes32[] calldata endpointIds,
address[] calldata sponsors,
address[] calldata requesters
) external view returns (bool[] memory statuses);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface ITemplateUtilsV0 {
event CreatedTemplate(
bytes32 indexed templateId,
address airnode,
bytes32 endpointId,
bytes parameters
);
function createTemplate(
address airnode,
bytes32 endpointId,
bytes calldata parameters
) external returns (bytes32 templateId);
function getTemplates(bytes32[] calldata templateIds)
external
view
returns (
address[] memory airnodes,
bytes32[] memory endpointIds,
bytes[] memory parameters
);
function templates(bytes32 templateId)
external
view
returns (
address airnode,
bytes32 endpointId,
bytes memory parameters
);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface IWithdrawalUtilsV0 {
event RequestedWithdrawal(
address indexed airnode,
address indexed sponsor,
bytes32 indexed withdrawalRequestId,
address sponsorWallet
);
event FulfilledWithdrawal(
address indexed airnode,
address indexed sponsor,
bytes32 indexed withdrawalRequestId,
address sponsorWallet,
uint256 amount
);
function requestWithdrawal(address airnode, address sponsorWallet) external;
function fulfillWithdrawal(
bytes32 withdrawalRequestId,
address airnode,
address sponsor
) external payable;
function sponsorToWithdrawalRequestCount(address sponsor)
external
view
returns (uint256 withdrawalRequestCount);
}// 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;
/// @solidity memory-safe-assembly
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
// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)
pragma solidity ^0.8.0;
/**
* @dev External interface of AccessControl declared to support ERC165 detection.
*/
interface IAccessControl {
/**
* @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
*
* `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
* {RoleAdminChanged} not being emitted signaling this.
*
* _Available since v3.1._
*/
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);
/**
* @dev Emitted when `account` is granted `role`.
*
* `sender` is the account that originated the contract call, an admin role
* bearer except when using {AccessControl-_setupRole}.
*/
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Emitted when `account` is revoked `role`.
*
* `sender` is the account that originated the contract call:
* - if using `revokeRole`, it is the admin role bearer
* - if using `renounceRole`, it is the role bearer (i.e. `account`)
*/
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) external view returns (bool);
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {AccessControl-_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) external view returns (bytes32);
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function grantRole(bytes32 role, address account) external;
/**
* @dev Revokes `role` from `account`.
*
* If `account` had been granted `role`, emits a {RoleRevoked} event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function revokeRole(bytes32 role, address account) external;
/**
* @dev Revokes `role` from the calling account.
*
* Roles are often managed via {grantRole} and {revokeRole}: this function's
* purpose is to provide a mechanism for accounts to lose their privileges
* if they are compromised (such as when a trusted device is misplaced).
*
* If the calling account had been granted `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `account`.
*/
function renounceRole(bytes32 role, address account) external;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/IAccessControlEnumerable.sol)
pragma solidity ^0.8.0;
import "./IAccessControl.sol";
/**
* @dev External interface of AccessControlEnumerable declared to support ERC165 detection.
*/
interface IAccessControlEnumerable is IAccessControl {
/**
* @dev Returns one of the accounts that have `role`. `index` must be a
* value between 0 and {getRoleMemberCount}, non-inclusive.
*
* Role bearers are not sorted in any particular way, and their ordering may
* change at any point.
*
* WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure
* you perform all queries on the same block. See the following
* https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]
* for more information.
*/
function getRoleMember(bytes32 role, uint256 index) external view returns (address);
/**
* @dev Returns the number of accounts that have `role`. Can be used
* together with {getRoleMember} to enumerate all bearers of a role.
*/
function getRoleMemberCount(bytes32 role) external view returns (uint256);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `from` to `to` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 amount
) external returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
* https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
*
* Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
* presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
* need to send a transaction, and thus is not required to hold Ether at all.
*/
interface IERC20Permit {
/**
* @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
* given ``owner``'s signed approval.
*
* IMPORTANT: The same issues {IERC20-approve} has related to transaction
* ordering also apply here.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `deadline` must be a timestamp in the future.
* - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
* over the EIP712-formatted function arguments.
* - the signature must use ``owner``'s current nonce (see {nonces}).
*
* For more information on the signature format, see the
* https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
* section].
*/
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
/**
* @dev Returns the current nonce for `owner`. This value must be
* included whenever a signature is generated for {permit}.
*
* Every successful call to {permit} increases ``owner``'s nonce by one. This
* prevents a signature from being used multiple times.
*/
function nonces(address owner) external view returns (uint256);
/**
* @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
*/
// solhint-disable-next-line func-name-mixedcase
function DOMAIN_SEPARATOR() external view returns (bytes32);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/utils/SafeERC20.sol)
pragma solidity ^0.8.0;
import "../IERC20.sol";
import "../extensions/draft-IERC20Permit.sol";
import "../../../utils/Address.sol";
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
using Address for address;
function safeTransfer(
IERC20 token,
address to,
uint256 value
) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(
IERC20 token,
address from,
address to,
uint256 value
) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
/**
* @dev Deprecated. This function has issues similar to the ones found in
* {IERC20-approve}, and its usage is discouraged.
*
* Whenever possible, use {safeIncreaseAllowance} and
* {safeDecreaseAllowance} instead.
*/
function safeApprove(
IERC20 token,
address spender,
uint256 value
) internal {
// safeApprove should only be called when setting an initial allowance,
// or when resetting it to zero. To increase and decrease it, use
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
require(
(value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
uint256 newAllowance = token.allowance(address(this), spender) + value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
unchecked {
uint256 oldAllowance = token.allowance(address(this), spender);
require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
uint256 newAllowance = oldAllowance - value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
}
function safePermit(
IERC20Permit token,
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) internal {
uint256 nonceBefore = token.nonces(owner);
token.permit(owner, spender, value, deadline, v, r, s);
uint256 nonceAfter = token.nonces(owner);
require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function _callOptionalReturn(IERC20 token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that
// the target address contains contract code and also asserts for success in the low-level call.
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
if (returndata.length > 0) {
// Return data is optional
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.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 functionCallWithValue(target, data, 0, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
* the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
*
* _Available since v4.8._
*/
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata,
string memory errorMessage
) internal view returns (bytes memory) {
if (success) {
if (returndata.length == 0) {
// only check isContract if the call was successful and the return data is empty
// otherwise we already know that it was a contract
require(isContract(target), "Address: call to non-contract");
}
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
/**
* @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason or using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
function _revert(bytes memory returndata, string memory errorMessage) private pure {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)
pragma solidity ^0.8.0;
import "./math/Math.sol";
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _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) {
unchecked {
uint256 length = Math.log10(value) + 1;
string memory buffer = new string(length);
uint256 ptr;
/// @solidity memory-safe-assembly
assembly {
ptr := add(buffer, add(32, length))
}
while (true) {
ptr--;
/// @solidity memory-safe-assembly
assembly {
mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
}
value /= 10;
if (value == 0) break;
}
return buffer;
}
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
unchecked {
return toHexString(value, Math.log256(value) + 1);
}
}
/**
* @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] = _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.8.0) (utils/math/Math.sol)
pragma solidity ^0.8.0;
/**
* @dev Standard math utilities missing in the Solidity language.
*/
library Math {
enum Rounding {
Down, // Toward negative infinity
Up, // Toward infinity
Zero // Toward zero
}
/**
* @dev Returns the largest of two numbers.
*/
function max(uint256 a, uint256 b) internal pure returns (uint256) {
return a > b ? a : b;
}
/**
* @dev Returns the smallest of two numbers.
*/
function min(uint256 a, uint256 b) internal pure returns (uint256) {
return a < b ? a : b;
}
/**
* @dev Returns the average of two numbers. The result is rounded towards
* zero.
*/
function average(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b) / 2 can overflow.
return (a & b) + (a ^ b) / 2;
}
/**
* @dev Returns the ceiling of the division of two numbers.
*
* This differs from standard division with `/` in that it rounds up instead
* of rounding down.
*/
function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b - 1) / b can overflow on addition, so we distribute.
return a == 0 ? 0 : (a - 1) / b + 1;
}
/**
* @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
* @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
* with further edits by Uniswap Labs also under MIT license.
*/
function mulDiv(
uint256 x,
uint256 y,
uint256 denominator
) internal pure returns (uint256 result) {
unchecked {
// 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
// use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
// variables such that product = prod1 * 2^256 + prod0.
uint256 prod0; // Least significant 256 bits of the product
uint256 prod1; // Most significant 256 bits of the product
assembly {
let mm := mulmod(x, y, not(0))
prod0 := mul(x, y)
prod1 := sub(sub(mm, prod0), lt(mm, prod0))
}
// Handle non-overflow cases, 256 by 256 division.
if (prod1 == 0) {
return prod0 / denominator;
}
// Make sure the result is less than 2^256. Also prevents denominator == 0.
require(denominator > prod1);
///////////////////////////////////////////////
// 512 by 256 division.
///////////////////////////////////////////////
// Make division exact by subtracting the remainder from [prod1 prod0].
uint256 remainder;
assembly {
// Compute remainder using mulmod.
remainder := mulmod(x, y, denominator)
// Subtract 256 bit number from 512 bit number.
prod1 := sub(prod1, gt(remainder, prod0))
prod0 := sub(prod0, remainder)
}
// Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
// See https://cs.stackexchange.com/q/138556/92363.
// Does not overflow because the denominator cannot be zero at this stage in the function.
uint256 twos = denominator & (~denominator + 1);
assembly {
// Divide denominator by twos.
denominator := div(denominator, twos)
// Divide [prod1 prod0] by twos.
prod0 := div(prod0, twos)
// Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
twos := add(div(sub(0, twos), twos), 1)
}
// Shift in bits from prod1 into prod0.
prod0 |= prod1 * twos;
// Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
// that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
// four bits. That is, denominator * inv = 1 mod 2^4.
uint256 inverse = (3 * denominator) ^ 2;
// Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
// in modular arithmetic, doubling the correct bits in each step.
inverse *= 2 - denominator * inverse; // inverse mod 2^8
inverse *= 2 - denominator * inverse; // inverse mod 2^16
inverse *= 2 - denominator * inverse; // inverse mod 2^32
inverse *= 2 - denominator * inverse; // inverse mod 2^64
inverse *= 2 - denominator * inverse; // inverse mod 2^128
inverse *= 2 - denominator * inverse; // inverse mod 2^256
// Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
// This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
// less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
// is no longer required.
result = prod0 * inverse;
return result;
}
}
/**
* @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
*/
function mulDiv(
uint256 x,
uint256 y,
uint256 denominator,
Rounding rounding
) internal pure returns (uint256) {
uint256 result = mulDiv(x, y, denominator);
if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
result += 1;
}
return result;
}
/**
* @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
*
* Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
*/
function sqrt(uint256 a) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
// For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
//
// We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
// `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
//
// This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
// → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
// → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
//
// Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
uint256 result = 1 << (log2(a) >> 1);
// At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
// since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
// every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
// into the expected uint128 result.
unchecked {
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
return min(result, a / result);
}
}
/**
* @notice Calculates sqrt(a), following the selected rounding direction.
*/
function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = sqrt(a);
return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
}
}
/**
* @dev Return the log in base 2, rounded down, of a positive value.
* Returns 0 if given 0.
*/
function log2(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >> 128 > 0) {
value >>= 128;
result += 128;
}
if (value >> 64 > 0) {
value >>= 64;
result += 64;
}
if (value >> 32 > 0) {
value >>= 32;
result += 32;
}
if (value >> 16 > 0) {
value >>= 16;
result += 16;
}
if (value >> 8 > 0) {
value >>= 8;
result += 8;
}
if (value >> 4 > 0) {
value >>= 4;
result += 4;
}
if (value >> 2 > 0) {
value >>= 2;
result += 2;
}
if (value >> 1 > 0) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 2, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log2(value);
return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
}
}
/**
* @dev Return the log in base 10, rounded down, of a positive value.
* Returns 0 if given 0.
*/
function log10(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >= 10**64) {
value /= 10**64;
result += 64;
}
if (value >= 10**32) {
value /= 10**32;
result += 32;
}
if (value >= 10**16) {
value /= 10**16;
result += 16;
}
if (value >= 10**8) {
value /= 10**8;
result += 8;
}
if (value >= 10**4) {
value /= 10**4;
result += 4;
}
if (value >= 10**2) {
value /= 10**2;
result += 2;
}
if (value >= 10**1) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 10, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log10(value);
return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);
}
}
/**
* @dev Return the log in base 256, rounded down, of a positive value.
* Returns 0 if given 0.
*
* Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
*/
function log256(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >> 128 > 0) {
value >>= 128;
result += 16;
}
if (value >> 64 > 0) {
value >>= 64;
result += 8;
}
if (value >> 32 > 0) {
value >>= 32;
result += 4;
}
if (value >> 16 > 0) {
value >>= 16;
result += 2;
}
if (value >> 8 > 0) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 10, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log256(value);
return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
library Bytes4ArrayLibUtils {
function indexOf(bytes4[] memory array, bytes4 value) internal pure returns (uint256) {
for (uint256 i = 0; i < array.length; i++) {
if (array[i] == value) {
return i;
}
}
return type(uint256).max;
}
function filterOut(bytes4[] memory array, bytes4 value) internal pure returns (bytes4[] memory) {
uint256 index = indexOf(array, value);
if (index == type(uint256).max) {
return array;
}
bytes4[] memory newArray = new bytes4[](array.length - 1);
for (uint256 i = 0; i < index; i++) {
newArray[i] = array[i];
}
for (uint256 i = index; i < newArray.length; i++) {
newArray[i] = array[i + 1];
}
return newArray;
}
}
library AddressArrayLibUtils {
function indexOf(address[] memory array, address value) internal pure returns (uint256) {
for (uint256 i = 0; i < array.length; i++) {
if (array[i] == value) {
return i;
}
}
return type(uint256).max;
}
function filterOut(
address[] memory array,
address value
) internal pure returns (address[] memory) {
uint256 index = indexOf(array, value);
if (index == type(uint256).max) {
return array;
}
address[] memory newArray = new address[](array.length - 1);
for (uint256 i = 0; i < index; i++) {
newArray[i] = array[i];
}
for (uint256 i = index; i < newArray.length; i++) {
newArray[i] = array[i + 1];
}
return newArray;
}
function swapOut(address[] storage array, address value) internal {
uint256 index = indexOf(array, value);
address last = array[array.length - 1];
array[index] = last;
array.pop();
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @dev Library for reading and writing primitive types to specific storage slots.
*
* Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.
* This library helps with reading and writing to such slots without the need for inline assembly.
*
* The functions in this library return Slot structs that contain a `value` member that can be used to read or write.
*/
library StorageSlot {
struct AddressSlot {
address value;
}
struct BooleanSlot {
bool value;
}
struct Bytes32Slot {
bytes32 value;
}
struct Uint256Slot {
uint256 value;
}
/**
* @dev Returns an `AddressSlot` with member `value` located at `slot`.
*/
function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {
assembly {
r.slot := slot
}
}
/**
* @dev Returns an `BooleanSlot` with member `value` located at `slot`.
*/
function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {
assembly {
r.slot := slot
}
}
/**
* @dev Returns an `Bytes32Slot` with member `value` located at `slot`.
*/
function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {
assembly {
r.slot := slot
}
}
/**
* @dev Returns an `Uint256Slot` with member `value` located at `slot`.
*/
function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {
assembly {
r.slot := slot
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import {IAccessControl} from "@openzeppelin/contracts/access/IAccessControl.sol";
import {IAccessControlEnumerable} from "@openzeppelin/contracts/access/IAccessControlEnumerable.sol";
import {LibAccessControl, WithRoles} from "../libraries/LibAccessControl.sol";
import {AccessControlStorage, DEFAULT_ADMIN_ROLE} from "../types/access/AccessControlStorage.sol";
import {LibPonzu} from "../libraries/LibPonzu.sol";
contract AccessControlFacet is IAccessControl, IAccessControlEnumerable, WithRoles {
function hasRole(bytes32 _role, address _account) external view override returns (bool) {
AccessControlStorage storage ds = LibAccessControl.DS();
return ds.roles[_role].members[_account];
}
function getRoleAdmin(bytes32 _role) external view override returns (bytes32) {
AccessControlStorage storage ds = LibAccessControl.DS();
return ds.roles[_role].adminRole;
}
function grantRole(bytes32 _role, address _account)
external
override
onlyRole(LibAccessControl.getRoleAdmin(_role))
{
LibAccessControl.grantRole(_role, _account);
}
function revokeRole(bytes32 _role, address _account)
external
override
onlyRole(LibAccessControl.getRoleAdmin(_role))
{
LibAccessControl.revokeRole(_role, _account);
}
function renounceRole(bytes32 _role, address _account) external override {
LibAccessControl.renounceRole(_role, _account);
}
function getRoleMember(bytes32 _role, uint256 _index) external view override returns (address) {
return LibAccessControl.getRoleMember(_role, _index);
}
function getRoleMemberCount(bytes32 _role) external view override returns (uint256) {
return LibAccessControl.getRoleMemberCount(_role);
}
function getRoleMembers(bytes32 _role) external view returns (address[] memory) {
return LibAccessControl.getRoleMembers(_role);
}
}// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /******************************************************************************\ * Author: Nick Mudge <[email protected]> (https://twitter.com/mudgen) * EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535 /******************************************************************************/ import {IDiamondCut} from "../interfaces/IDiamondCut.sol"; import {LibDiamond} from "../libraries/LibDiamond.sol"; import {FacetCut} from "../types/diamond/Facet.sol"; import {WithRoles} from "./AccessControlFacet.sol"; import {DEFAULT_ADMIN_ROLE} from "../types/access/AccessControlStorage.sol"; contract DiamondCutFacet is IDiamondCut, WithRoles { /// @notice Add/replace/remove any number of functions and optionally execute /// a function with delegatecall /// @param _diamondCut Contains the facet addresses and function selectors /// @param _init The address of the contract or facet to execute _calldata /// @param _calldata A function call, including function selector and arguments /// _calldata is executed with delegatecall on _init function diamondCut( FacetCut[] calldata _diamondCut, address _init, bytes calldata _calldata ) external override onlyRole(DEFAULT_ADMIN_ROLE) { LibDiamond.diamondCut(_diamondCut, _init, _calldata); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /******************************************************************************\ * Author: Nick Mudge <[email protected]> (https://twitter.com/mudgen) * EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535 /******************************************************************************/ import {LibDiamond} from "../libraries/LibDiamond.sol"; import {DiamondStorage} from "../types/diamond/DiamondStorage.sol"; import {IDiamondLoupe} from "../interfaces/IDiamondLoupe.sol"; import {Facet} from "../types/diamond/Facet.sol"; contract DiamondLoupeFacet is IDiamondLoupe { // Diamond Loupe Functions //////////////////////////////////////////////////////////////////// /// These functions are expected to be called frequently by tools. // // struct Facet { // address facetAddress; // bytes4[] functionSelectors; // } /// @notice Gets all facets and their selectors. /// @return facets_ Facet function facets() external view override returns (Facet[] memory facets_) { DiamondStorage storage ds = LibDiamond.DS(); uint256 numFacets = ds.facetAddresses.length; facets_ = new Facet[](numFacets); for (uint256 i = 0; i < numFacets; i++) { address facetAddress_ = ds.facetAddresses[i]; facets_[i].facetAddress = facetAddress_; facets_[i].functionSelectors = ds.facetFunctionSelectors[facetAddress_].functionSelectors; } } /// @notice Gets all the function selectors provided by a facet. /// @param _facet The facet address. /// @return facetFunctionSelectors_ function facetFunctionSelectors( address _facet ) external view override returns (bytes4[] memory facetFunctionSelectors_) { DiamondStorage storage ds = LibDiamond.DS(); facetFunctionSelectors_ = ds.facetFunctionSelectors[_facet].functionSelectors; } /// @notice Get all the facet addresses used by a diamond. /// @return facetAddresses_ function facetAddresses() external view override returns (address[] memory facetAddresses_) { DiamondStorage storage ds = LibDiamond.DS(); facetAddresses_ = ds.facetAddresses; } /// @notice Gets the facet that supports the given selector. /// @dev If facet is not found return address(0). /// @param _functionSelector The function selector. /// @return facetAddress_ The facet address. function facetAddress( bytes4 _functionSelector ) external view override returns (address facetAddress_) { DiamondStorage storage ds = LibDiamond.DS(); facetAddress_ = ds.selectorToFacetAndPosition[_functionSelector].facetAddress; } }
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import {LibERC165, ERC165Storage} from "../libraries/LibERC165.sol";
import {IERC165} from "../interfaces/IERC165.sol";
contract ERC165Facet is IERC165 {
// This implements ERC-165.
function supportsInterface(bytes4 _interfaceId) external view override returns (bool) {
ERC165Storage storage ds = LibERC165.DS();
return ds.supportedInterfaces[_interfaceId];
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
import {Strings} from "@openzeppelin/contracts/utils/Strings.sol";
import {WithPausable, LibPausable} from "@contracts/ponzu/libraries/LibPausable.sol";
import {PausableStorage} from "@contracts/ponzu/types/pausable/PausableStorage.sol";
import {WithRoles} from "@contracts/ponzu/libraries/LibAccessControl.sol";
import {DEFAULT_ADMIN_ROLE} from "@contracts/ponzu/types/access/AccessControlStorage.sol";
contract PausableFacet is WithPausable, WithRoles {
using Strings for uint256;
using LibPausable for PausableStorage;
/**
* @dev Triggers stopped state.
*
* Requirements:
*
* - The contract must not be paused.
*/
function pause() external whenNotPaused onlyRole(DEFAULT_ADMIN_ROLE) {
PausableStorage storage pauseStorage = LibPausable.DS();
pauseStorage.pause();
}
/**
* @dev Returns to normal state.
*
* Requirements:
*
* - The contract must be paused.
*/
function unpause() external whenPaused onlyRole(DEFAULT_ADMIN_ROLE) {
PausableStorage storage pauseStorage = LibPausable.DS();
pauseStorage.unpause();
}
/**
* @dev Returns true if the contract is paused, and false otherwise.
*/
function isPaused() external view returns (bool) {
PausableStorage storage pauseStorage = LibPausable.DS();
return pauseStorage.paused;
}
/**
* @dev Returns the timestamp when the contract was paused.
*/
function pausedAt() external view returns (uint256) {
PausableStorage storage pauseStorage = LibPausable.DS();
if (pauseStorage.pausedAt == 0) revert LibPausable.NotPausedError();
return pauseStorage.pausedAt;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
interface IBlackHole {
function feedBlackHole() external;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import {FacetCut} from "../types/diamond/Facet.sol";
/******************************************************************************\
* Author: Nick Mudge <[email protected]> (https://twitter.com/mudgen)
* EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535
/******************************************************************************/
interface IDiamondCut {
/// @notice Add/replace/remove any number of functions and optionally execute
/// a function with delegatecall
/// @param _diamondCut Contains the facet addresses and function selectors
/// @param _init The address of the contract or facet to execute _calldata
/// @param _calldata A function call, including function selector and arguments
/// _calldata is executed with delegatecall on _init
function diamondCut(
FacetCut[] calldata _diamondCut,
address _init,
bytes calldata _calldata
) external;
event DiamondCut(FacetCut[] _diamondCut, address _init, bytes _calldata);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import {Facet} from "../types/diamond/Facet.sol";
/******************************************************************************\
* Author: Nick Mudge <[email protected]> (https://twitter.com/mudgen)
* EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535
/******************************************************************************/
// A loupe is a small magnifying glass used to look at diamonds.
// These functions look at diamonds
interface IDiamondLoupe {
/// These functions are expected to be called frequently
/// by tools.
/// @notice Gets all facet addresses and their four byte function selectors.
/// @return facets_ Facet
function facets() external view returns (Facet[] memory facets_);
/// @notice Gets all the function selectors supported by a specific facet.
/// @param _facet The facet address.
/// @return facetFunctionSelectors_
function facetFunctionSelectors(
address _facet
) external view returns (bytes4[] memory facetFunctionSelectors_);
/// @notice Get all the facet addresses used by a diamond.
/// @return facetAddresses_
function facetAddresses() external view returns (address[] memory facetAddresses_);
/// @notice Gets the facet that supports the given selector.
/// @dev If facet is not found return address(0).
/// @param _functionSelector The function selector.
/// @return facetAddress_ The facet address.
function facetAddress(bytes4 _functionSelector) external view returns (address facetAddress_);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface IERC165 {
/// @notice Query if a contract implements an interface
/// @param interfaceId The interface identifier, as specified in ERC-165
/// @dev Interface identification is specified in ERC-165. This function
/// uses less than 30,000 gas.
/// @return `true` if the contract implements `interfaceID` and
/// `interfaceID` is not 0xffffffff, `false` otherwise
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface IHamachi {
// get the RewardAccount of an account
function getRewardAccount(
address _account
)
external
view
returns (
address account,
int256 index,
int256 numInQueue,
uint256 rewardBalance,
uint256 withdrawableRewards,
uint256 totalRewards,
bool manualClaim
);
// claims the withdrawableRewards of the sender
function claimRewards(bool goHami, uint256 expectedOutput) external;
function setManualClaim(bool _manual) external;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
interface IQRNGReceiver {
/// @notice Called by the Airnode through the AirnodeRrp contract to
/// fulfill the request
/// @dev Note the `onlyAirnodeRrp` modifier. You should only accept RRP
/// fulfillments from this protocol contract. Also note that only
/// fulfillments for the requests made by this contract are accepted, and
/// a request cannot be responded to multiple times.
/// @param requestId Request ID
/// @param data ABI-encoded response
function fulfillUint256(bytes32 requestId, bytes calldata data) external;
/// @notice Called by the Airnode through the AirnodeRrp contract to
/// fulfill the request
/// @param requestId Request ID
/// @param data ABI-encoded response
function fulfillUint256Array(bytes32 requestId, bytes calldata data) external;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import {AccessControlStorage, DEFAULT_ADMIN_ROLE} from "../types/access/AccessControlStorage.sol";
import {AddressArrayLibUtils} from "../../libraries/ArrayLibUtils.sol";
contract WithRoles {
modifier onlyRole(bytes32 role) {
LibAccessControl.checkRole(role);
_;
}
}
library LibAccessControl {
using AddressArrayLibUtils for address[];
error Unauthorized(bytes32 role);
error AlreadyHasRole(bytes32 role);
error RoleNotSet(bytes32 role);
error RenounceAccountNotMsgSender(address account);
/**
* @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
*
* `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
* {RoleAdminChanged} not being emitted signaling this.
*
* _Available since v3.1._
*/
event RoleAdminChanged(
bytes32 indexed role,
bytes32 indexed previousAdminRole,
bytes32 indexed newAdminRole
);
/**
* @dev Emitted when `account` is granted `role`.
*
* `sender` is the account that originated the contract call, an admin role
* bearer except when using {AccessControl-_setupRole}.
*/
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Emitted when `account` is revoked `role`.
*
* `sender` is the account that originated the contract call:
* - if using `revokeRole`, it is the admin role bearer
* - if using `renounceRole`, it is the role bearer (i.e. `account`)
*/
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);
bytes32 internal constant ACCESS_CONTROL_STORAGE_POSITION =
keccak256("diamond.standard.accesscontrol.storage");
function DS() internal pure returns (AccessControlStorage storage ds) {
bytes32 position = ACCESS_CONTROL_STORAGE_POSITION;
assembly {
ds.slot := position
}
}
function hasRole(bytes32 role, address account) internal view returns (bool) {
return DS().roles[role].members[account];
}
function checkRole(bytes32 role, address account) internal view {
if (!hasRole(role, account)) revert Unauthorized(role);
}
function checkRole(bytes32 role) internal view {
checkRole(role, msg.sender);
}
function getRoleAdmin(bytes32 role) internal view returns (bytes32) {
return DS().roles[role].adminRole;
}
function grantRole(bytes32 role, address account) internal {
if (!hasRole(role, account)) {
DS().roles[role].members[account] = true;
DS().roles[role].membersList.push(account);
emit RoleGranted(role, account, msg.sender);
} else revert AlreadyHasRole(role);
}
function revokeRole(bytes32 role, address account) internal {
if (hasRole(role, account)) {
DS().roles[role].members[account] = false;
DS().roles[role].membersList.swapOut(account);
emit RoleRevoked(role, account, msg.sender);
} else revert RoleNotSet(role);
}
function setRoleAdmin(bytes32 role, bytes32 adminRole) internal {
emit RoleAdminChanged(role, getRoleAdmin(role), adminRole);
DS().roles[role].adminRole = adminRole;
}
function renounceRole(bytes32 role, address account) internal {
if (account != msg.sender) revert RenounceAccountNotMsgSender(account);
revokeRole(role, account);
}
function getRoleMember(bytes32 _role, uint256 _index) internal view returns (address) {
AccessControlStorage storage ds = LibAccessControl.DS();
return ds.roles[_role].membersList[_index];
}
function getRoleMemberCount(bytes32 _role) internal view returns (uint256) {
AccessControlStorage storage ds = LibAccessControl.DS();
return ds.roles[_role].membersList.length;
}
function getRoleMembers(bytes32 _role) internal view returns (address[] memory) {
AccessControlStorage storage ds = LibAccessControl.DS();
return ds.roles[_role].membersList;
}
}// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /******************************************************************************\ * Author: Nick Mudge <[email protected]> (https://twitter.com/mudgen) * EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535 /******************************************************************************/ import {IDiamondCut} from "../interfaces/IDiamondCut.sol"; import {FacetCut, FacetCutAction} from "../types/diamond/Facet.sol"; import {DiamondStorage} from "../types/diamond/DiamondStorage.sol"; library LibDiamond { error InValidFacetCutAction(); error NoSelectorsInFacet(); error NoZeroAddress(); error SelectorExists(bytes4 selector); error SameSelectorReplacement(bytes4 selector); error MustBeZeroAddress(); error NoCode(); error NonExistentSelector(bytes4 selector); error ImmutableFunction(bytes4 selector); error NonEmptyCalldata(); error EmptyCalldata(); error InitCallFailed(); bytes32 internal constant DIAMOND_STORAGE_POSITION = keccak256("diamond.standard.diamond.storage"); function DS() internal pure returns (DiamondStorage storage ds) { bytes32 position = DIAMOND_STORAGE_POSITION; assembly { ds.slot := position } } event DiamondCut(FacetCut[] _diamondCut, address _init, bytes _calldata); // Internal function version of diamondCut function diamondCut( FacetCut[] memory _diamondCut, address _init, bytes memory _calldata ) internal { for (uint256 facetIndex; facetIndex < _diamondCut.length; facetIndex++) { FacetCutAction action = _diamondCut[facetIndex].action; if (action == FacetCutAction.Add) { addFunctions( _diamondCut[facetIndex].facetAddress, _diamondCut[facetIndex].functionSelectors ); } else if (action == FacetCutAction.Replace) { replaceFunctions( _diamondCut[facetIndex].facetAddress, _diamondCut[facetIndex].functionSelectors ); } else if (action == FacetCutAction.Remove) { removeFunctions( _diamondCut[facetIndex].facetAddress, _diamondCut[facetIndex].functionSelectors ); } else { revert InValidFacetCutAction(); } } emit DiamondCut(_diamondCut, _init, _calldata); initializeDiamondCut(_init, _calldata); } function addFunctions(address _facetAddress, bytes4[] memory _functionSelectors) internal { if (_functionSelectors.length <= 0) revert NoSelectorsInFacet(); DiamondStorage storage ds = DS(); if (_facetAddress == address(0)) revert NoZeroAddress(); uint96 selectorPosition = uint96( ds.facetFunctionSelectors[_facetAddress].functionSelectors.length ); // add new facet address if it does not exist if (selectorPosition == 0) { addFacet(ds, _facetAddress); } for (uint256 selectorIndex; selectorIndex < _functionSelectors.length; selectorIndex++) { bytes4 selector = _functionSelectors[selectorIndex]; address oldFacetAddress = ds.selectorToFacetAndPosition[selector].facetAddress; if (oldFacetAddress != address(0)) revert SelectorExists(selector); addFunction(ds, selector, selectorPosition, _facetAddress); selectorPosition++; } } function replaceFunctions(address _facetAddress, bytes4[] memory _functionSelectors) internal { if (_functionSelectors.length <= 0) revert NoSelectorsInFacet(); DiamondStorage storage ds = DS(); if (_facetAddress == address(0)) revert NoZeroAddress(); uint96 selectorPosition = uint96( ds.facetFunctionSelectors[_facetAddress].functionSelectors.length ); // add new facet address if it does not exist if (selectorPosition == 0) { addFacet(ds, _facetAddress); } for (uint256 selectorIndex; selectorIndex < _functionSelectors.length; selectorIndex++) { bytes4 selector = _functionSelectors[selectorIndex]; address oldFacetAddress = ds.selectorToFacetAndPosition[selector].facetAddress; if (oldFacetAddress == _facetAddress) revert SameSelectorReplacement(selector); removeFunction(ds, oldFacetAddress, selector); addFunction(ds, selector, selectorPosition, _facetAddress); selectorPosition++; } } function removeFunctions(address _facetAddress, bytes4[] memory _functionSelectors) internal { if (_functionSelectors.length <= 0) revert NoSelectorsInFacet(); DiamondStorage storage ds = DS(); // if function does not exist then do nothing and return if (_facetAddress != address(0)) revert MustBeZeroAddress(); for (uint256 selectorIndex; selectorIndex < _functionSelectors.length; selectorIndex++) { bytes4 selector = _functionSelectors[selectorIndex]; address oldFacetAddress = ds.selectorToFacetAndPosition[selector].facetAddress; removeFunction(ds, oldFacetAddress, selector); } } function addFacet(DiamondStorage storage ds, address _facetAddress) internal { enforceHasContractCode(_facetAddress); ds.facetFunctionSelectors[_facetAddress].facetAddressPosition = ds.facetAddresses.length; ds.facetAddresses.push(_facetAddress); } function addFunction( DiamondStorage storage ds, bytes4 _selector, uint96 _selectorPosition, address _facetAddress ) internal { ds.selectorToFacetAndPosition[_selector].functionSelectorPosition = _selectorPosition; ds.facetFunctionSelectors[_facetAddress].functionSelectors.push(_selector); ds.selectorToFacetAndPosition[_selector].facetAddress = _facetAddress; } function removeFunction( DiamondStorage storage ds, address _facetAddress, bytes4 _selector ) internal { if (_facetAddress == address(0)) revert NonExistentSelector(_selector); // an immutable function is a function defined directly in a diamond if (_facetAddress == address(this)) revert ImmutableFunction(_selector); // replace selector with last selector, then delete last selector uint256 selectorPosition = ds.selectorToFacetAndPosition[_selector].functionSelectorPosition; uint256 lastSelectorPosition = ds .facetFunctionSelectors[_facetAddress] .functionSelectors .length - 1; // if not the same then replace _selector with lastSelector if (selectorPosition != lastSelectorPosition) { bytes4 lastSelector = ds.facetFunctionSelectors[_facetAddress].functionSelectors[ lastSelectorPosition ]; ds.facetFunctionSelectors[_facetAddress].functionSelectors[selectorPosition] = lastSelector; ds.selectorToFacetAndPosition[lastSelector].functionSelectorPosition = uint96( selectorPosition ); } // delete the last selector ds.facetFunctionSelectors[_facetAddress].functionSelectors.pop(); delete ds.selectorToFacetAndPosition[_selector]; // if no more selectors for facet address then delete the facet address if (lastSelectorPosition == 0) { // replace facet address with last facet address and delete last facet address uint256 lastFacetAddressPosition = ds.facetAddresses.length - 1; uint256 facetAddressPosition = ds.facetFunctionSelectors[_facetAddress].facetAddressPosition; if (facetAddressPosition != lastFacetAddressPosition) { address lastFacetAddress = ds.facetAddresses[lastFacetAddressPosition]; ds.facetAddresses[facetAddressPosition] = lastFacetAddress; ds.facetFunctionSelectors[lastFacetAddress].facetAddressPosition = facetAddressPosition; } ds.facetAddresses.pop(); delete ds.facetFunctionSelectors[_facetAddress].facetAddressPosition; } } function initializeDiamondCut(address _init, bytes memory _calldata) internal { if (_init == address(0)) { if (_calldata.length > 0) revert NonEmptyCalldata(); } else { if (_calldata.length == 0) revert EmptyCalldata(); if (_init != address(this)) enforceHasContractCode(_init); (bool success, bytes memory error) = _init.delegatecall(_calldata); if (!success) { if (error.length > 0) revert(string(error)); else revert InitCallFailed(); } } } function enforceHasContractCode(address _contract) internal view { uint256 contractSize; assembly { contractSize := extcodesize(_contract) } if (contractSize <= 0) revert NoCode(); } }
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import {ERC165Storage} from "../types/erc165/ERC165Storage.sol";
library LibERC165 {
bytes32 internal constant ERC165_STORAGE_POSITION = keccak256("diamond.standard.erc165.storage");
function DS() internal pure returns (ERC165Storage storage ds) {
bytes32 position = ERC165_STORAGE_POSITION;
assembly {
ds.slot := position
}
}
function addSupportedInterfaces(bytes4[] memory _interfaces) internal {
ERC165Storage storage ds = DS();
for (uint256 i; i < _interfaces.length; i++) {
ds.supportedInterfaces[_interfaces[i]] = true;
}
}
function addSupportedInterface(bytes4 _interface) internal {
ERC165Storage storage ds = DS();
ds.supportedInterfaces[_interface] = true;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
import {PausableStorage} from "@contracts/ponzu/types/pausable/PausableStorage.sol";
import {PonzuStorage} from "@contracts/ponzu/types/ponzu/PonzuStorage.sol";
import {LibPonzu} from "@contracts/ponzu/libraries/LibPonzu.sol";
abstract contract WithPausable {
/**
* @dev Modifier to make a function callable only when the contract is not paused.
*
* Requirements:
*
* - The contract must not be paused.
*/
modifier whenNotPaused() {
PausableStorage storage pauseStorage = LibPausable.DS();
if (pauseStorage.paused) revert LibPausable.PausedError();
_;
}
/**
* @dev Modifier to make a function callable only when the contract is paused.
*
* Requirements:
*
* - The contract must be paused.
*/
modifier whenPaused() {
PausableStorage memory pauseStorage = LibPausable.DS();
if (!pauseStorage.paused) revert LibPausable.NotPausedError();
_;
}
}
library LibPausable {
using LibPausable for PausableStorage;
using LibPonzu for PonzuStorage;
bytes32 internal constant DIAMOND_STORAGE_POSITION =
keccak256("diamond.standard.pausable.storage");
error PausedError();
error NotPausedError();
/**
* @dev Emitted when the pause is triggered by `account`.
*/
event Paused(address account);
/**
* @dev Emitted when the pause is lifted by `account`.
*/
event Unpaused(address account);
function DS() internal pure returns (PausableStorage storage ds) {
bytes32 position = DIAMOND_STORAGE_POSITION;
assembly {
ds.slot := position
}
}
/**
* @dev Triggers stopped state.
*
* Requirements:
*
* - The contract must not be paused.
*/
function pause(PausableStorage storage pauseStorage) internal {
pauseStorage.paused = true;
pauseStorage.pausedAt = uint64(block.timestamp);
emit Paused(msg.sender);
}
/**
* @dev Returns to normal state.
*
* Requirements:
*
* - The contract must be paused.
*/
function unpause(PausableStorage storage pauseStorage) internal {
pauseStorage.paused = false;
PonzuStorage storage ponzuStorage = LibPonzu.DS();
ponzuStorage.addPausedTime(uint64(block.timestamp) - pauseStorage.pausedAt);
pauseStorage.pausedAt = 0;
emit Unpaused(msg.sender);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
import "@forge-std/src/console.sol";
import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {PonzuStorage, PERCENTAGE_DENOMINATOR, RoundWinner, MAX_DEPOSIT} from "@contracts/ponzu/types/ponzu/PonzuStorage.sol";
import {Participant} from "@contracts/ponzu/types/participant/Participant.sol";
import {IHamachi} from "@contracts/ponzu/interfaces/IHamachi.sol";
import {IBlackHole} from "@contracts/ponzu/interfaces/IBlackHole.sol";
import {AddressArrayLibUtils} from "@contracts/libraries/ArrayLibUtils.sol";
library LibPonzu {
using LibPonzu for PonzuStorage;
using SafeERC20 for IERC20;
using AddressArrayLibUtils for address[];
bytes32 internal constant DIAMOND_STORAGE_POSITION = keccak256("diamond.standard.ponzu.storage");
error DepositZeroAmount();
error InsufficientDeposit();
error MaxDepositReached();
error NoDeposits();
error RoundNotStarted(uint256 roundNumber);
error RoundNotEnded(uint256 roundNumber);
error WinnerNotFound(uint256 roundNumber);
event Deposit(address indexed participant, uint256 amount);
event Withdraw(address indexed participant, uint256 amount);
event WinnerSelected(address indexed winner, uint256 prize, uint256 roundNumber);
event NoWinnerSelected(uint256 roundNumber);
event RewardsAdded(uint256 amount);
function DS() internal pure returns (PonzuStorage storage ds) {
bytes32 position = DIAMOND_STORAGE_POSITION;
assembly {
ds.slot := position
}
}
function addPausedTime(PonzuStorage storage ps, uint256 time) internal {
ps.pausedTimeInRound += time;
}
function startRound(PonzuStorage storage ps, uint256 startTime) internal {
uint256 lastClosedRound = ps.lastClosedRound;
if (ps.startTime != 0) revert RoundNotEnded(lastClosedRound);
ps.startTime = startTime;
}
function deposit(PonzuStorage storage ps, uint256 amount) internal {
if (amount == 0) revert DepositZeroAmount();
(uint256 currentRound, , uint256 curRoundDeadline) = ps.currentRoundTimes();
uint256 lastClosedRound = ps.lastClosedRound;
if (lastClosedRound + 1 == currentRound) {
ps.participantDepositsCleanup(msg.sender, currentRound);
Participant storage participant = ps.participants[msg.sender];
uint256 initialTotal = participant.oldDepositAmount + participant.newDepositAmount;
if (initialTotal == 0) ps.participantsList.push(msg.sender);
if (block.timestamp > curRoundDeadline) {
participant.newDepositAmount += amount;
participant.newDepositRound = currentRound + 1;
} else {
participant.oldDepositAmount += amount;
}
ps.totalDeposited += amount;
// update total deposited
uint256 total = participant.oldDepositAmount + participant.newDepositAmount;
if (total > MAX_DEPOSIT) revert MaxDepositReached();
IERC20(ps.rewardToken).safeTransferFrom(msg.sender, address(this), amount);
// update participant state
emit Deposit(msg.sender, amount);
} else revert RoundNotEnded(lastClosedRound);
}
function withdraw(PonzuStorage storage ps, uint256 amount) internal {
Participant storage participant = ps.participants[msg.sender];
uint256 participantBalance = participant.oldDepositAmount + participant.newDepositAmount;
if (participantBalance < amount) revert InsufficientDeposit();
// uint256 currentRound = ps.currentRoundNumber();
// ps.participantDepositsCleanup(msg.sender, currentRound);
// Update total deposited
ps.totalDeposited -= amount;
// remove from not yet valid deposits
uint256 invalidAmount = participant.newDepositAmount;
if (invalidAmount >= amount) participant.newDepositAmount -= amount;
else {
participant.newDepositAmount = 0;
uint256 amountLeft = amount - invalidAmount;
// remove from valid deposits
uint256 oldDepositAmount = participant.oldDepositAmount;
participant.oldDepositAmount = oldDepositAmount - amountLeft;
if (oldDepositAmount == 0) ps.participantsList.swapOut(msg.sender);
}
// Transfer tokens to participant
IERC20(DS().rewardToken).transfer(msg.sender, amount);
emit Withdraw(msg.sender, amount);
}
function currentRoundNumber(PonzuStorage storage ps) internal view returns (uint256) {
return ps.lastClosedRound + 1;
}
function currentRoundStartTime(PonzuStorage storage ps) internal view returns (uint256) {
return ps.startTime;
}
function currentRoundDeadline(PonzuStorage storage ps) internal view returns (uint256) {
return ps.startTime + ps.pausedTimeInRound + ps.depositDeadline;
}
function currentRoundEndTime(PonzuStorage storage ps) internal view returns (uint256) {
return ps.startTime + ps.pausedTimeInRound + ps.depositDeadline;
}
function currentRoundTimes(
PonzuStorage storage ps
)
internal
view
returns (uint256 currentRound, uint256 curRoundStartTime, uint256 curRoundDeadline)
{
currentRound = ps.currentRoundNumber();
curRoundStartTime = ps.startTime;
curRoundDeadline = ps.startTime + ps.pausedTimeInRound + ps.depositDeadline;
}
function sumTotalValidDeposits(PonzuStorage storage ps) internal view returns (uint256 total) {
for (uint256 i = 0; i < ps.participantsList.length; i++) {
total += ps.participants[ps.participantsList[i]].oldDepositAmount;
if (ps.participants[ps.participantsList[i]].newDepositRound < ps.currentRoundNumber())
total += ps.participants[ps.participantsList[i]].newDepositAmount;
}
}
function participantValidDeposits(
PonzuStorage storage ps,
address user
) internal view returns (uint256 total) {
Participant memory participant = ps.participants[user];
total = participant.oldDepositAmount;
if (participant.newDepositRound < ps.currentRoundNumber())
total += participant.newDepositAmount;
}
function participantTotalDeposits(
PonzuStorage storage ps,
address user
) internal view returns (uint256 total) {
Participant memory participant = ps.participants[user];
total = participant.oldDepositAmount + participant.newDepositAmount;
}
function participantPendingDeposits(
PonzuStorage storage ps,
address user
) internal view returns (uint256 total) {
Participant memory participant = ps.participants[user];
if (participant.newDepositRound > ps.currentRoundNumber()) total = participant.newDepositAmount;
}
function participantDeposits(
PonzuStorage storage ps,
address user
) internal view returns (uint256 valid, uint256 pending) {
Participant memory participant = ps.participants[user];
valid = participant.oldDepositAmount;
if (participant.newDepositRound > ps.currentRoundNumber())
pending = participant.newDepositAmount;
else valid += participant.newDepositAmount;
}
function checkIfNeedCleanup(
PonzuStorage storage ps,
address _participantAddress,
uint256 roundNumber
) internal view returns (bool) {
Participant memory participant = ps.participants[_participantAddress];
return checkIfNeedCleanup(participant, roundNumber);
}
function checkIfNeedCleanup(
Participant memory participant,
uint256 roundNumber
) internal pure returns (bool) {
return participant.newDepositRound <= roundNumber && participant.newDepositAmount > 0;
}
function participantDepositsCleanup(
PonzuStorage storage ps,
address _participantAddress,
uint256 roundNumber
) internal {
if (!ps.checkIfNeedCleanup(_participantAddress, roundNumber)) return;
Participant storage participant = ps.participants[_participantAddress];
participant.oldDepositAmount += participant.newDepositAmount;
participant.newDepositAmount = 0;
}
function selectWinner(PonzuStorage storage ps, uint256 randomNum) internal {
(uint256 roundNum, , uint256 roundDeadline) = ps.currentRoundTimes();
if (block.timestamp < roundDeadline) revert RoundNotEnded(roundNum);
// divide number by total deposited
uint256 winningNumber = randomNum % ps.sumTotalValidDeposits();
// claim rewards which will serve as the prize
ps.claimRewards();
uint256 prizeAmount = ps.currentStoredRewards;
uint256 blackHoleAmount = (prizeAmount * ps.blackHoleShare) / PERCENTAGE_DENOMINATOR;
uint256 winnerAmount = prizeAmount - blackHoleAmount;
address winnerAddress = ps._selectWinner(roundNum, winningNumber);
if (winnerAddress == address(0)) revert WinnerNotFound(randomNum);
ps.roundWinners[roundNum] = RoundWinner(winnerAddress, winnerAmount, randomNum);
// feed part of prize to blackhole
if (blackHoleAmount > 0) {
IERC20(ps.rewardToken).transfer(ps.blackHole, blackHoleAmount);
IBlackHole(ps.blackHole).feedBlackHole();
}
// reset rewards to 0
ps.currentStoredRewards = 0;
// if maxDeposit is reached transfer to winner
if (
winnerAmount > 0 && IERC20(ps.rewardToken).balanceOf(winnerAddress) + winnerAmount > MAX_DEPOSIT
) {
IERC20(ps.rewardToken).transfer(winnerAddress, winnerAmount);
} else {
ps.participants[winnerAddress].oldDepositAmount += winnerAmount;
}
emit WinnerSelected(winnerAddress, winnerAmount, roundNum);
// update last closed round
ps.lastClosedRound = roundNum;
ps.startTime = 0;
ps.pausedTimeInRound = 0;
}
function _selectWinner(
PonzuStorage storage ps,
uint256 roundNum,
uint256 winnerNumber
) internal returns (address winnerAddress) {
// iterate over participants to find winner
for (uint256 i = 0; i < ps.participantsList.length; ++i) {
ps.participantDepositsCleanup(ps.participantsList[i], roundNum);
address participant = ps.participantsList[i];
uint256 pDeposit = ps.participants[participant].oldDepositAmount;
if (pDeposit >= winnerNumber) {
winnerAddress = participant;
break;
} else {
winnerNumber -= pDeposit;
}
}
}
function cleanupAllParticipants(PonzuStorage storage ps, uint256 roundNum) internal {
for (uint256 i = 0; i < ps.participantsList.length; ++i) {
ps.participantDepositsCleanup(ps.participantsList[i], roundNum);
}
}
function cleanupAllParticipantsContinued(
PonzuStorage storage ps,
uint256 roundNum,
bool restartCleanup
) internal {
if (restartCleanup) ps.cleanupIndex = 0;
uint256 index = ps.cleanupIndex;
uint256 endIndex = ps.participantsList.length;
while (index < endIndex) {
if (gasleft() < 100000) {
ps.cleanupIndex = index;
return;
}
ps.participantDepositsCleanup(ps.participantsList[ps.cleanupIndex], roundNum);
index++;
}
}
function cleanupAllParticipantsByIndex(
PonzuStorage storage ps,
uint256 roundNum,
uint256 startIndex,
uint256 endIndex
) internal {
for (uint256 i = startIndex; i < endIndex; ++i) {
ps.participantDepositsCleanup(ps.participantsList[i], roundNum);
}
}
function endRoundWithoutWinner(PonzuStorage storage ps) internal {
(uint256 roundNum, , uint256 roundDeadline) = ps.currentRoundTimes();
if (block.timestamp < roundDeadline) revert RoundNotEnded(roundNum);
uint256 lastRound = ps.lastClosedRound;
// update last closed round
ps.lastClosedRound = lastRound + 1;
ps.startTime = 0;
ps.pausedTimeInRound = 0;
emit NoWinnerSelected(lastRound);
}
function currentPrizePool(
PonzuStorage storage ps
) internal view returns (uint256 withdrawableRewards) {
(, , , , withdrawableRewards, , ) = IHamachi(ps.rewardToken).getRewardAccount(address(this));
withdrawableRewards += ps.currentStoredRewards;
}
function addRewards(PonzuStorage storage ps, address giver, uint256 amount) internal {
IERC20(ps.rewardToken).safeTransferFrom(giver, address(this), amount);
ps.currentStoredRewards += amount;
emit RewardsAdded(amount);
}
function claimRewards(PonzuStorage storage ps) internal returns (uint256) {
uint256 initialRewardTokenBalance = IERC20(ps.rewardToken).balanceOf(address(this));
IHamachi(ps.rewardToken).claimRewards(true, 0);
uint256 prizeAmount = IERC20(ps.rewardToken).balanceOf(address(this)) -
initialRewardTokenBalance;
if (prizeAmount > 0) {
ps.currentStoredRewards += prizeAmount;
emit RewardsAdded(prizeAmount);
}
return prizeAmount;
}
function getPausedTimeInRound(PonzuStorage storage ps) internal view returns (uint256) {
if (ps.pausedTimeInRound == 0) return 0;
return ps.pausedTimeInRound;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
import {IAirnodeRrpV0} from "@api3/airnode-protocol/contracts/rrp/interfaces/IAirnodeRrpV0.sol";
import {QRNGStorage} from "@contracts/ponzu/types/qrng/QRNGStorage.sol";
import {IQRNGReceiver} from "@contracts/ponzu/interfaces/IQRNGReceiver.sol";
import {LibPonzu} from "@contracts/ponzu/libraries/LibPonzu.sol";
import {PonzuStorage} from "@contracts/ponzu/types/ponzu/PonzuStorage.sol";
abstract contract WithAirnodeRrp {
modifier onlyAirnodeRrp() {
require(msg.sender == LibQRNG.DS().airnodeRrp, "Only AirnodeRrp");
_;
}
}
library LibQRNG {
using LibPonzu for PonzuStorage;
bytes32 internal constant DIAMOND_STORAGE_POSITION = keccak256("diamond.standard.qrng.storage");
function DS() internal pure returns (QRNGStorage storage ds) {
bytes32 position = DIAMOND_STORAGE_POSITION;
assembly {
ds.slot := position
}
}
/// @notice Requests a `uint256`
/// @dev This request will be fulfilled by the contract's sponsor wallet,
/// which means spamming it may drain the sponsor wallet. Implement
/// necessary requirements to prevent this, e.g., you can require the user
/// to pitch in by sending some ETH to the sponsor wallet, you can have
/// the user use their own sponsor wallet, you can rate-limit users.
function makeRequestUint256(QRNGStorage storage ds) internal returns (bytes32 requestId) {
PonzuStorage storage ps = LibPonzu.DS();
// If there are no valid deposits, then just end the round;
uint256 totalValidDeposits = ps.sumTotalValidDeposits();
if (totalValidDeposits == 0) ps.endRoundWithoutWinner();
else {
// otherwise, request a random number
requestId = IAirnodeRrpV0(ds.airnodeRrp).makeFullRequest(
ds.airnode,
ds.endpointIdUint256,
address(this),
ds.sponsorWallet,
address(this),
IQRNGReceiver.fulfillUint256.selector,
""
);
ds.expectingRequestWithIdToBeFulfilled[requestId] = true;
}
}
/// @notice Sets parameters used in requesting QRNG services
/// @dev No access control is implemented here for convenience. This is not
/// secure because it allows the contract to be pointed to an arbitrary
/// Airnode. Normally, this function should only be callable by the "owner"
/// or not exist in the first place.
/// @param _airnode Airnode address
/// @param _endpointIdUint256 Endpoint ID used to request a `uint256`
/// @param _sponsorWallet Sponsor wallet address
function setRequestParameters(
QRNGStorage storage ds,
address _airnode,
bytes32 _endpointIdUint256,
address _sponsorWallet
) internal {
// Normally, this function should be protected, as in:
// require(msg.sender == owner, "Sender not owner");
ds.airnode = _airnode;
ds.endpointIdUint256 = _endpointIdUint256;
ds.sponsorWallet = _sponsorWallet;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
struct RoleData {
mapping(address => bool) members;
bytes32 adminRole;
address[] membersList;
}
struct AccessControlStorage {
mapping(bytes32 => RoleData) roles;
}
bytes32 constant DEFAULT_ADMIN_ROLE = 0x00;
bytes32 constant GAME_ADMIN_ROLE = keccak256("GAME_ADMIN_ROLE");// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import {FacetAddressAndPosition, FacetFunctionSelectors} from "./Facet.sol";
struct DiamondStorage {
// maps function selector to the facet address and
// the position of the selector in the facetFunctionSelectors.selectors array
mapping(bytes4 => FacetAddressAndPosition) selectorToFacetAndPosition;
// maps facet addresses to function selectors
mapping(address => FacetFunctionSelectors) facetFunctionSelectors;
// facet addresses
address[] facetAddresses;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
struct Facet {
address facetAddress;
bytes4[] functionSelectors;
}
struct FacetCut {
address facetAddress;
FacetCutAction action;
bytes4[] functionSelectors;
}
enum FacetCutAction {
// Add=0, Replace=1, Remove=2
Add,
Replace,
Remove
}
struct FacetAddressAndPosition {
address facetAddress;
uint96 functionSelectorPosition; // position in facetFunctionSelectors.functionSelectors array
}
struct FacetFunctionSelectors {
bytes4[] functionSelectors;
uint256 facetAddressPosition; // position of facetAddress in facetAddresses array
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
struct ERC165Storage {
// Used to query if a contract implements an interface.
// Used to implement ERC-165.
mapping(bytes4 => bool) supportedInterfaces;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
struct Participant {
uint256 oldDepositAmount;
uint256 newDepositAmount;
uint256 newDepositRound;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
struct PausableStorage {
bool paused;
uint64 pausedAt;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
import {Participant} from "@contracts/ponzu/types/participant/Participant.sol";
struct PonzuStorage {
address rewardToken;
address blackHole;
uint256 blackHoleShare;
mapping(address => Participant) participants;
address[] participantsList;
uint256 startTime;
uint256 pausedTimeInRound;
uint256 totalDeposited;
uint256 lastClosedRound;
mapping(uint256 => RoundWinner) roundWinners;
uint256 currentStoredRewards;
uint256 cleanupIndex;
uint256 roundDuration;
uint256 depositDeadline;
}
struct RoundWinner {
address winner;
uint256 prize;
uint256 randomNumber;
}
uint256 constant MAX_DEPOSIT = 5 * 10 ** 24; // 5M tokens
uint256 constant PERCENTAGE_DENOMINATOR = 10000;// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
struct QRNGStorage {
address airnodeRrp;
address airnode;
bytes32 endpointIdUint256;
address sponsorWallet;
mapping(bytes32 => bool) expectingRequestWithIdToBeFulfilled;
}{
"remappings": [
"@api3/airnode-protocol/=lib/airnode/packages/airnode-protocol/",
"@contracts/=src/contracts/",
"@forge-std/=lib/forge-std/",
"@openzeppelin/=lib/openzeppelin-contracts/",
"@test/=test/",
"@utils/=src/utils/",
"airnode/=lib/airnode/",
"ds-test/=lib/forge-std/lib/ds-test/src/",
"forge-std/=lib/forge-std/src/",
"openzeppelin-contracts/=lib/openzeppelin-contracts/"
],
"optimizer": {
"enabled": true,
"runs": 9999999
},
"metadata": {
"bytecodeHash": "ipfs",
"appendCBOR": true
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"evmVersion": "london",
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"airnodeRrp","type":"address"},{"internalType":"address","name":"blackHole","type":"address"},{"internalType":"address","name":"rewardToken","type":"address"},{"internalType":"address","name":"contractAdmin","type":"address"},{"internalType":"address","name":"diamondCutFacet_","type":"address"},{"internalType":"address","name":"diamondLoupeFacet_","type":"address"},{"internalType":"address","name":"accessControlFacet_","type":"address"},{"internalType":"address","name":"erc165Facet_","type":"address"},{"internalType":"address","name":"methodsExposureFacetAddress_","type":"address"},{"internalType":"address","name":"pausableFacet_","type":"address"}],"stateMutability":"payable","type":"constructor"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"AlreadyHasRole","type":"error"},{"inputs":[],"name":"EmptyCalldata","type":"error"},{"inputs":[{"internalType":"bytes4","name":"functionSignature","type":"bytes4"}],"name":"FunctionNotFound","type":"error"},{"inputs":[{"internalType":"bytes4","name":"selector","type":"bytes4"}],"name":"ImmutableFunction","type":"error"},{"inputs":[],"name":"InValidFacetCutAction","type":"error"},{"inputs":[],"name":"InitCallFailed","type":"error"},{"inputs":[],"name":"MustBeZeroAddress","type":"error"},{"inputs":[],"name":"NoCode","type":"error"},{"inputs":[],"name":"NoSelectorsInFacet","type":"error"},{"inputs":[],"name":"NoZeroAddress","type":"error"},{"inputs":[],"name":"NonEmptyCalldata","type":"error"},{"inputs":[{"internalType":"bytes4","name":"selector","type":"bytes4"}],"name":"NonExistentSelector","type":"error"},{"inputs":[{"internalType":"bytes4","name":"selector","type":"bytes4"}],"name":"SameSelectorReplacement","type":"error"},{"inputs":[{"internalType":"bytes4","name":"selector","type":"bytes4"}],"name":"SelectorExists","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"implementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"setImplementation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60806040526040516200337c3803806200337c833981016040819052620000269162001784565b620000406000801b88620009b060201b620001ad1760201c565b620000777f9b7946abd96dccbe6cfc6cc2c13300ab429d93e16fa72dc459eeccda73817f0888620009b060201b620001ad1760201c565b60006200008e62000a8c60201b620002d91760201c565b6001810180546001600160a01b03199081166001600160a01b038e811691909117909255825416908b16178155615460600d8201556203f480600c82015590506000620000e662000ab0602090811b620002fd17901c565b80546001600160a01b0319166001600160a01b038e169081178255604051632b77c09f60e21b8152306004820152600160248201529192509063addf027c90604401600060405180830381600087803b1580156200014357600080fd5b505af115801562000158573d6000803e3d6000fd5b505050506200016d8462000ad460201b60201c565b604080516001808252818301909252600091816020015b60408051606080820183526000808352602083015291810191909152815260200190600190039081620001845750506040805160018082528183019092529192506000919060208083019080368337019050509050631f931c1c60e01b81600081518110620001f757620001f762001853565b6001600160e01b031990921660209283029190910182015260408051606081019091526001600160a01b038c1681529081016000815260200182815250826000815181106200024a576200024a62001853565b60200260200101819052506200027d8260006040518060200160405280600081525062000b7a60201b620003211760201c565b60408051600180825281830190925290816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816200029257505060408051600480825260a0820190925291935060208201608080368337019050509050637a0ed62760e01b8160008151811062000302576200030262001853565b6001600160e01b03199092166020928302919091019091015280516356fe50af60e11b90829060019081106200033c576200033c62001853565b6001600160e01b03199092166020928302919091019091015280516314bbdacb60e21b908290600290811062000376576200037662001853565b6001600160e01b03199092166020928302919091019091015280516366ffd66360e11b9082906003908110620003b057620003b062001853565b6001600160e01b031990921660209283029190910182015260408051606081019091526001600160a01b038b16815290810160008152602001828152508260008151811062000403576200040362001853565b6020026020010181905250620004368260006040518060200160405280600081525062000b7a60201b620003211760201c565b60408051600180825281830190925290816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816200044b575050604080516008808252610120820190925291935060208201610100803683370190505090506391d1485460e01b81600081518110620004bd57620004bd62001853565b6001600160e01b031990921660209283029190910190910152805163248a9ca360e01b9082906001908110620004f757620004f762001853565b6001600160e01b0319909216602092830291909101909101528051632f2ff15d60e01b908290600290811062000531576200053162001853565b6001600160e01b031990921660209283029190910190910152805163d547741f60e01b90829060039081106200056b576200056b62001853565b6001600160e01b0319909216602092830291909101909101528051631b2b455f60e11b9082906004908110620005a557620005a562001853565b6001600160e01b0319909216602092830291909101909101528051632404341f60e21b9082906005908110620005df57620005df62001853565b6001600160e01b031990921660209283029190910190910152805163ca15c87360e01b908290600690811062000619576200061962001853565b6001600160e01b031990921660209283029190910190910152805163a3246ad360e01b908290600790811062000653576200065362001853565b6001600160e01b031990921660209283029190910182015260408051606081019091526001600160a01b038a168152908101600081526020018281525082600081518110620006a657620006a662001853565b6020026020010181905250620006d98260006040518060200160405280600081525062000b7a60201b620003211760201c565b60408051600180825281830190925290816020015b60408051606080820183526000808352602083015291810191909152815260200190600190039081620006ee575050604080516001808252818301909252919350602080830190803683370190505090506301ffc9a760e01b816000815181106200075d576200075d62001853565b6001600160e01b031990921660209283029190910182015260408051606081019091526001600160a01b0389168152908101600081526020018281525082600081518110620007b057620007b062001853565b6020026020010181905250620007e38260006040518060200160405280600081525062000b7a60201b620003211760201c565b60408051600180825281830190925290816020015b60408051606080820183526000808352602083015291810191909152815260200190600190039081620007f857505060408051600480825260a0820190925291935060208201608080368337019050509050638456cb5960e01b8160008151811062000868576200086862001853565b6001600160e01b0319909216602092830291909101909101528051631fa5d41d60e11b9082906001908110620008a257620008a262001853565b6001600160e01b03199092166020928302919091019091015280516358c3de9360e11b9082906002908110620008dc57620008dc62001853565b6001600160e01b031990921660209283029190910190910152805163172ae87960e11b908290600390811062000916576200091662001853565b6001600160e01b031990921660209283029190910182015260408051606081019091526001600160a01b038716815290810160008152602001828152508260008151811062000969576200096962001853565b60200260200101819052506200099c8260006040518060200160405280600081525062000b7a60201b620003211760201c565b505050505050505050505050505062001aa3565b620009bc828262000d90565b62000a675760008281527fe5cb39755cb78f26672219e0622fde0b2d8d8809a820c8db9a008a728832e96a602081815260408084206001600160a01b038616808652818452828620805460ff19166001908117909155948452600290910180549485018155855291842090920180546001600160a01b031916821790559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b6040516387c6028b60e01b8152600481018390526024015b60405180910390fd5b5050565b7fbfe566d688b3616d00a68f72fe8ac7ad5be1f5fa137d384b7691a525b2f017a190565b7f78c851884b9162fe32cb64c65ef21933ad7a317fb7a1cd72f1e291dc755fc05c90565b62000aea8162000ddc60201b6200050c1760201c565b8062000b3062000b1c60017f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbd62001895565b60001b62000dfd60201b620005451760201c565b80546001600160a01b0319166001600160a01b03928316179055604051908216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60005b835181101562000d4157600084828151811062000b9e5762000b9e62001853565b60200260200101516020015190506000600281111562000bc25762000bc262001869565b81600281111562000bd75762000bd762001869565b0362000c355762000c2f85838151811062000bf65762000bf662001853565b60200260200101516000015186848151811062000c175762000c1762001853565b60200260200101516040015162000e0060201b60201c565b62000d2b565b600181600281111562000c4c5762000c4c62001869565b0362000ca45762000c2f85838151811062000c6b5762000c6b62001853565b60200260200101516000015186848151811062000c8c5762000c8c62001853565b60200260200101516040015162000fdd60201b60201c565b600281600281111562000cbb5762000cbb62001869565b0362000d135762000c2f85838151811062000cda5762000cda62001853565b60200260200101516000015186848151811062000cfb5762000cfb62001853565b602002602001015160400151620011c560201b60201c565b60405162c5e5d760e31b815260040160405180910390fd5b508062000d3881620018ab565b91505062000b7d565b507f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb67383838360405162000d77939291906200191b565b60405180910390a162000d8b8282620012a2565b505050565b60008281527fe5cb39755cb78f26672219e0622fde0b2d8d8809a820c8db9a008a728832e96a602090815260408083206001600160a01b038516845290915290205460ff165b92915050565b803b8062000a8857604051633c11a9c560e21b815260040160405180910390fd5b90565b600081511162000e235760405163092d2fe560e41b815260040160405180910390fd5b6000805160206200335c8339815191526001600160a01b03831662000e5b5760405163ddbadd5f60e01b815260040160405180910390fd5b6001600160a01b0383166000908152600182016020526040812054906001600160601b038216900362000e945762000e948285620013b8565b60005b835181101562000fd657600084828151811062000eb85762000eb862001853565b6020908102919091018101516001600160e01b031981166000908152918690526040909120549091506001600160a01b0316801562000f175760405163501e70c760e01b81526001600160e01b03198316600482015260240162000a7f565b6001600160e01b0319821660008181526020878152604080832080546001600160a01b03908116600160a01b6001600160601b038c16021782558c168085526001808c0185529285208054938401815585528385206008840401805463ffffffff60079095166004026101000a948502191660e08a901c94909402939093179092559390925287905281546001600160a01b0319161790558362000fbb8162001a22565b9450505050808062000fcd90620018ab565b91505062000e97565b5050505050565b6000815111620010005760405163092d2fe560e41b815260040160405180910390fd5b6000805160206200335c8339815191526001600160a01b038316620010385760405163ddbadd5f60e01b815260040160405180910390fd5b6001600160a01b0383166000908152600182016020526040812054906001600160601b03821690036200107157620010718285620013b8565b60005b835181101562000fd657600084828151811062001095576200109562001853565b6020908102919091018101516001600160e01b031981166000908152918690526040909120549091506001600160a01b039081169087168103620010f957604051631c04188b60e31b81526001600160e01b03198316600482015260240162000a7f565b620011068582846200140b565b6001600160e01b0319821660008181526020878152604080832080546001600160a01b03908116600160a01b6001600160601b038c16021782558c168085526001808c0185529285208054938401815585528385206008840401805463ffffffff60079095166004026101000a948502191660e08a901c94909402939093179092559390925287905281546001600160a01b03191617905583620011aa8162001a22565b94505050508080620011bc90620018ab565b91505062001074565b6000815111620011e85760405163092d2fe560e41b815260040160405180910390fd5b6000805160206200335c8339815191526001600160a01b038316156200122157604051631be65fe560e21b815260040160405180910390fd5b60005b82518110156200129c57600083828151811062001245576200124562001853565b6020908102919091018101516001600160e01b031981166000908152918590526040909120549091506001600160a01b0316620012848482846200140b565b505080806200129390620018ab565b91505062001224565b50505050565b6001600160a01b038216620012d25780511562000a885760405163c21b1ab760e01b815260040160405180910390fd5b8051600003620012f557604051633011e86160e21b815260040160405180910390fd5b6001600160a01b03821630146200131157620013118262000ddc565b600080836001600160a01b0316836040516200132e919062001a53565b600060405180830381855af49150503d80600081146200136b576040519150601f19603f3d011682016040523d82523d6000602084013e62001370565b606091505b5091509150816200129c578051156200139f578060405162461bcd60e51b815260040162000a7f919062001a71565b604051633a18f8dd60e01b815260040160405180910390fd5b620013c38162000ddc565b6002820180546001600160a01b0390921660008181526001948501602090815260408220860185905594840183559182529290200180546001600160a01b0319169091179055565b6001600160a01b0382166200143f57604051622902d360e91b81526001600160e01b03198216600482015260240162000a7f565b306001600160a01b03831603620014765760405163069731c560e41b81526001600160e01b03198216600482015260240162000a7f565b6001600160e01b03198116600090815260208481526040808320546001600160a01b0386168452600180880190935290832054600160a01b9091046001600160601b03169291620014c79162001895565b9050808214620015c0576001600160a01b0384166000908152600186016020526040812080548390811062001500576200150062001853565b600091825260208083206008830401546001600160a01b038916845260018a019091526040909220805460079092166004026101000a90920460e01b92508291908590811062001554576200155462001853565b600091825260208083206008830401805463ffffffff60079094166004026101000a938402191660e09590951c929092029390931790556001600160e01b03199290921682528690526040902080546001600160a01b0316600160a01b6001600160601b038516021790555b6001600160a01b03841660009081526001860160205260409020805480620015ec57620015ec62001a8d565b60008281526020808220600860001990940193840401805463ffffffff600460078716026101000a0219169055919092556001600160e01b0319851682528690526040812081905581900362000fd6576002850154600090620016529060019062001895565b6001600160a01b03861660009081526001808901602052604090912001549091508082146200170857600087600201838154811062001695576200169562001853565b6000918252602090912001546002890180546001600160a01b039092169250829184908110620016c957620016c962001853565b600091825260208083209190910180546001600160a01b0319166001600160a01b03948516179055929091168152600189810190925260409020018190555b866002018054806200171e576200171e62001a8d565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b0388168252600189810190915260408220015550505050505050565b80516001600160a01b03811681146200177f57600080fd5b919050565b6000806000806000806000806000806101408b8d031215620017a557600080fd5b620017b08b62001767565b9950620017c060208c0162001767565b9850620017d060408c0162001767565b9750620017e060608c0162001767565b9650620017f060808c0162001767565b95506200180060a08c0162001767565b94506200181060c08c0162001767565b93506200182060e08c0162001767565b9250620018316101008c0162001767565b9150620018426101208c0162001767565b90509295989b9194979a5092959850565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8181038181111562000dd65762000dd66200187f565b600060018201620018c057620018c06200187f565b5060010190565b60005b83811015620018e4578181015183820152602001620018ca565b50506000910152565b6000815180845262001907816020860160208601620018c7565b601f01601f19169290920160200192915050565b60006060808301818452808751808352608092508286019150828160051b8701016020808b0160005b84811015620019f057898403607f19018652815180516001600160a01b031685528381015189860190600381106200198c57634e487b7160e01b600052602160045260246000fd5b868601526040918201519186018a905281519081905290840190600090898701905b80831015620019da5783516001600160e01b0319168252928601926001929092019190860190620019ae565b5097850197955050509082019060010162001944565b50506001600160a01b038a1690880152868103604088015262001a148189620018ed565b9a9950505050505050505050565b60006001600160601b038281166002600160601b0319810162001a495762001a496200187f565b6001019392505050565b6000825162001a67818460208701620018c7565b9190910192915050565b60208152600062001a866020830184620018ed565b9392505050565b634e487b7160e01b600052603160045260246000fd5b6118a98062001ab36000396000f3fe60806040526004361061002d5760003560e01c80635c60da1b14610128578063d784d4261461016657610034565b3661003457005b600080357fffffffff000000000000000000000000000000000000000000000000000000001681527fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c6020819052604090912054819073ffffffffffffffffffffffffffffffffffffffff1680610102576040517f5416eb980000000000000000000000000000000000000000000000000000000081527fffffffff000000000000000000000000000000000000000000000000000000006000351660048201526024015b60405180910390fd5b3660008037600080366000845af43d6000803e808015610121573d6000f35b3d6000fd5b005b34801561013457600080fd5b5061013d610186565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b34801561017257600080fd5b506101266101813660046114ff565b610195565b6000610190610548565b905090565b60006101a081610594565b6101a9826105a1565b5050565b6101b78282610648565b6102a45760008281527fe5cb39755cb78f26672219e0622fde0b2d8d8809a820c8db9a008a728832e96a6020818152604080842073ffffffffffffffffffffffffffffffffffffffff861680865281845282862080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001908117909155948452600290910180549485018155855291842090920180547fffffffffffffffffffffffff000000000000000000000000000000000000000016821790559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b6040517f87c6028b000000000000000000000000000000000000000000000000000000008152600481018390526024016100f9565b7fbfe566d688b3616d00a68f72fe8ac7ad5be1f5fa137d384b7691a525b2f017a190565b7f78c851884b9162fe32cb64c65ef21933ad7a317fb7a1cd72f1e291dc755fc05c90565b60005b83518110156104c15760008482815181106103415761034161153c565b6020026020010151602001519050600060028111156103625761036261156b565b8160028111156103745761037461156b565b036103c2576103bd85838151811061038e5761038e61153c565b6020026020010151600001518684815181106103ac576103ac61153c565b6020026020010151604001516106a1565b6104ae565b60018160028111156103d6576103d661156b565b0361041f576103bd8583815181106103f0576103f061153c565b60200260200101516000015186848151811061040e5761040e61153c565b602002602001015160400151610979565b60028160028111156104335761043361156b565b0361047c576103bd85838151811061044d5761044d61153c565b60200260200101516000015186848151811061046b5761046b61153c565b602002602001015160400151610c5a565b6040517f062f2eb800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50806104b9816115c9565b915050610324565b507f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb6738383836040516104f59392919061166f565b60405180910390a16105078282610da1565b505050565b803b806101a9576040517ff046a71400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b90565b600061057861054560017f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbd6117d7565b5473ffffffffffffffffffffffffffffffffffffffff16919050565b61059e8133610f35565b50565b6105aa8161050c565b806105d961054560017f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbd6117d7565b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff928316179055604051908216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60008281527fe5cb39755cb78f26672219e0622fde0b2d8d8809a820c8db9a008a728832e96a6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff165b92915050565b60008151116106dc576040517f92d2fe5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c73ffffffffffffffffffffffffffffffffffffffff831661074a576040517fddbadd5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83166000908152600182016020526040812054906bffffffffffffffffffffffff82169003610792576107928285610f78565b60005b83518110156109725760008482815181106107b2576107b261153c565b6020908102919091018101517fffffffff00000000000000000000000000000000000000000000000000000000811660009081529186905260409091205490915073ffffffffffffffffffffffffffffffffffffffff168015610865576040517f501e70c70000000000000000000000000000000000000000000000000000000081527fffffffff00000000000000000000000000000000000000000000000000000000831660048201526024016100f9565b7fffffffff000000000000000000000000000000000000000000000000000000008216600081815260208781526040808320805473ffffffffffffffffffffffffffffffffffffffff908116740100000000000000000000000000000000000000006bffffffffffffffffffffffff8c16021782558c168085526001808c0185529285208054938401815585528385206008840401805463ffffffff60079095166004026101000a948502191660e08a901c94909402939093179092559390925287905281547fffffffffffffffffffffffff0000000000000000000000000000000000000000161790558361095a816117ea565b9450505050808061096a906115c9565b915050610795565b5050505050565b60008151116109b4576040517f92d2fe5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c73ffffffffffffffffffffffffffffffffffffffff8316610a22576040517fddbadd5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83166000908152600182016020526040812054906bffffffffffffffffffffffff82169003610a6a57610a6a8285610f78565b60005b8351811015610972576000848281518110610a8a57610a8a61153c565b6020908102919091018101517fffffffff00000000000000000000000000000000000000000000000000000000811660009081529186905260409091205490915073ffffffffffffffffffffffffffffffffffffffff9081169087168103610b42576040517fe020c4580000000000000000000000000000000000000000000000000000000081527fffffffff00000000000000000000000000000000000000000000000000000000831660048201526024016100f9565b610b4d858284610fee565b7fffffffff000000000000000000000000000000000000000000000000000000008216600081815260208781526040808320805473ffffffffffffffffffffffffffffffffffffffff908116740100000000000000000000000000000000000000006bffffffffffffffffffffffff8c16021782558c168085526001808c0185529285208054938401815585528385206008840401805463ffffffff60079095166004026101000a948502191660e08a901c94909402939093179092559390925287905281547fffffffffffffffffffffffff00000000000000000000000000000000000000001617905583610c42816117ea565b94505050508080610c52906115c9565b915050610a6d565b6000815111610c95576040517f92d2fe5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c73ffffffffffffffffffffffffffffffffffffffff831615610d04576040517f6f997f9400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8251811015610d9b576000838281518110610d2457610d2461153c565b6020908102919091018101517fffffffff00000000000000000000000000000000000000000000000000000000811660009081529185905260409091205490915073ffffffffffffffffffffffffffffffffffffffff16610d86848284610fee565b50508080610d93906115c9565b915050610d07565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8216610df5578051156101a9576040517fc21b1ab700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051600003610e30576040517fc047a18400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82163014610e5657610e568261050c565b6000808373ffffffffffffffffffffffffffffffffffffffff1683604051610e7e9190611815565b600060405180830381855af49150503d8060008114610eb9576040519150601f19603f3d011682016040523d82523d6000602084013e610ebe565b606091505b509150915081610d9b57805115610f0357806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f99190611831565b6040517f3a18f8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f3f8282610648565b6101a9576040517fe66c48da000000000000000000000000000000000000000000000000000000008152600481018390526024016100f9565b610f818161050c565b60028201805473ffffffffffffffffffffffffffffffffffffffff90921660008181526001948501602090815260408220860185905594840183559182529290200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169091179055565b73ffffffffffffffffffffffffffffffffffffffff821661105f576040517f5205a6000000000000000000000000000000000000000000000000000000000081527fffffffff00000000000000000000000000000000000000000000000000000000821660048201526024016100f9565b3073ffffffffffffffffffffffffffffffffffffffff8316036110d2576040517f69731c500000000000000000000000000000000000000000000000000000000081527fffffffff00000000000000000000000000000000000000000000000000000000821660048201526024016100f9565b7fffffffff0000000000000000000000000000000000000000000000000000000081166000908152602084815260408083205473ffffffffffffffffffffffffffffffffffffffff86168452600180880190935290832054740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff16929161115c916117d7565b90508082146112a35773ffffffffffffffffffffffffffffffffffffffff84166000908152600186016020526040812080548390811061119e5761119e61153c565b6000918252602080832060088304015473ffffffffffffffffffffffffffffffffffffffff8916845260018a019091526040909220805460079092166004026101000a90920460e01b9250829190859081106111fc576111fc61153c565b600091825260208083206008830401805463ffffffff60079094166004026101000a938402191660e09590951c929092029390931790557fffffffff0000000000000000000000000000000000000000000000000000000092909216825286905260409020805473ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000006bffffffffffffffffffffffff8516021790555b73ffffffffffffffffffffffffffffffffffffffff8416600090815260018601602052604090208054806112d9576112d9611844565b6000828152602080822060087fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90940193840401805463ffffffff600460078716026101000a0219169055919092557fffffffff000000000000000000000000000000000000000000000000000000008516825286905260408120819055819003610972576002850154600090611372906001906117d7565b73ffffffffffffffffffffffffffffffffffffffff861660009081526001808901602052604090912001549091508082146114605760008760020183815481106113be576113be61153c565b60009182526020909120015460028901805473ffffffffffffffffffffffffffffffffffffffff90921692508291849081106113fc576113fc61153c565b600091825260208083209190910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff948516179055929091168152600189810190925260409020018190555b8660020180548061147357611473611844565b6000828152602080822083017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905590920190925573ffffffffffffffffffffffffffffffffffffffff88168252600189810190915260408220015550505050505050565b60006020828403121561151157600080fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811461153557600080fd5b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036115fa576115fa61159a565b5060010190565b60005b8381101561161c578181015183820152602001611604565b50506000910152565b6000815180845261163d816020860160208601611601565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60006060808301818452808751808352608092508286019150828160051b8701016020808b0160005b8481101561179a577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808a8503018652815188850173ffffffffffffffffffffffffffffffffffffffff82511686528482015160038110611721577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b868601526040918201519186018a905281519081905290840190600090898701905b808310156117855783517fffffffff00000000000000000000000000000000000000000000000000000000168252928601926001929092019190860190611743565b50978501979550505090820190600101611698565b505073ffffffffffffffffffffffffffffffffffffffff8a169088015286810360408801526117c98189611625565b9a9950505050505050505050565b8181038181111561069b5761069b61159a565b60006bffffffffffffffffffffffff80831681810361180b5761180b61159a565b6001019392505050565b60008251611827818460208701611601565b9190910192915050565b6020815260006115356020830184611625565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220acff77d1b5a875889d8f7d593a85e0989aae207f85e4f37d0aeb31ec92331d8f64736f6c63430008120033c8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c000000000000000000000000b015aceedd478fc497a798ab45fced8bded089240000000000000000000000000ad1f3685335a1cfa9b026cfe664f13e40a7444600000000000000000000000002150e97271fdc0d6e3a16d9094a0948266f07dd0000000000000000000000005fdc879d4414b449efaaa372e25e61eef25c0d90000000000000000000000000bce9288563bbdcc64589957a00a550e56bc24d760000000000000000000000000e0fa2ec263955753b868ec0345c9254dd924ba10000000000000000000000009accff1a1c36313cdbaacb4f935c22e14cf7f0ba000000000000000000000000929dfe5a7244d286db2ba9b2f3cce958001719df000000000000000000000000f55b72307c88479c5530eb2f945ed63f584d4af3000000000000000000000000e3f3db45255655a43a2f3bb20bb5de5ae895eaa8
Deployed Bytecode
0x60806040526004361061002d5760003560e01c80635c60da1b14610128578063d784d4261461016657610034565b3661003457005b600080357fffffffff000000000000000000000000000000000000000000000000000000001681527fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c6020819052604090912054819073ffffffffffffffffffffffffffffffffffffffff1680610102576040517f5416eb980000000000000000000000000000000000000000000000000000000081527fffffffff000000000000000000000000000000000000000000000000000000006000351660048201526024015b60405180910390fd5b3660008037600080366000845af43d6000803e808015610121573d6000f35b3d6000fd5b005b34801561013457600080fd5b5061013d610186565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b34801561017257600080fd5b506101266101813660046114ff565b610195565b6000610190610548565b905090565b60006101a081610594565b6101a9826105a1565b5050565b6101b78282610648565b6102a45760008281527fe5cb39755cb78f26672219e0622fde0b2d8d8809a820c8db9a008a728832e96a6020818152604080842073ffffffffffffffffffffffffffffffffffffffff861680865281845282862080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001908117909155948452600290910180549485018155855291842090920180547fffffffffffffffffffffffff000000000000000000000000000000000000000016821790559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b6040517f87c6028b000000000000000000000000000000000000000000000000000000008152600481018390526024016100f9565b7fbfe566d688b3616d00a68f72fe8ac7ad5be1f5fa137d384b7691a525b2f017a190565b7f78c851884b9162fe32cb64c65ef21933ad7a317fb7a1cd72f1e291dc755fc05c90565b60005b83518110156104c15760008482815181106103415761034161153c565b6020026020010151602001519050600060028111156103625761036261156b565b8160028111156103745761037461156b565b036103c2576103bd85838151811061038e5761038e61153c565b6020026020010151600001518684815181106103ac576103ac61153c565b6020026020010151604001516106a1565b6104ae565b60018160028111156103d6576103d661156b565b0361041f576103bd8583815181106103f0576103f061153c565b60200260200101516000015186848151811061040e5761040e61153c565b602002602001015160400151610979565b60028160028111156104335761043361156b565b0361047c576103bd85838151811061044d5761044d61153c565b60200260200101516000015186848151811061046b5761046b61153c565b602002602001015160400151610c5a565b6040517f062f2eb800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50806104b9816115c9565b915050610324565b507f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb6738383836040516104f59392919061166f565b60405180910390a16105078282610da1565b505050565b803b806101a9576040517ff046a71400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b90565b600061057861054560017f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbd6117d7565b5473ffffffffffffffffffffffffffffffffffffffff16919050565b61059e8133610f35565b50565b6105aa8161050c565b806105d961054560017f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbd6117d7565b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff928316179055604051908216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60008281527fe5cb39755cb78f26672219e0622fde0b2d8d8809a820c8db9a008a728832e96a6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff165b92915050565b60008151116106dc576040517f92d2fe5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c73ffffffffffffffffffffffffffffffffffffffff831661074a576040517fddbadd5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83166000908152600182016020526040812054906bffffffffffffffffffffffff82169003610792576107928285610f78565b60005b83518110156109725760008482815181106107b2576107b261153c565b6020908102919091018101517fffffffff00000000000000000000000000000000000000000000000000000000811660009081529186905260409091205490915073ffffffffffffffffffffffffffffffffffffffff168015610865576040517f501e70c70000000000000000000000000000000000000000000000000000000081527fffffffff00000000000000000000000000000000000000000000000000000000831660048201526024016100f9565b7fffffffff000000000000000000000000000000000000000000000000000000008216600081815260208781526040808320805473ffffffffffffffffffffffffffffffffffffffff908116740100000000000000000000000000000000000000006bffffffffffffffffffffffff8c16021782558c168085526001808c0185529285208054938401815585528385206008840401805463ffffffff60079095166004026101000a948502191660e08a901c94909402939093179092559390925287905281547fffffffffffffffffffffffff0000000000000000000000000000000000000000161790558361095a816117ea565b9450505050808061096a906115c9565b915050610795565b5050505050565b60008151116109b4576040517f92d2fe5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c73ffffffffffffffffffffffffffffffffffffffff8316610a22576040517fddbadd5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83166000908152600182016020526040812054906bffffffffffffffffffffffff82169003610a6a57610a6a8285610f78565b60005b8351811015610972576000848281518110610a8a57610a8a61153c565b6020908102919091018101517fffffffff00000000000000000000000000000000000000000000000000000000811660009081529186905260409091205490915073ffffffffffffffffffffffffffffffffffffffff9081169087168103610b42576040517fe020c4580000000000000000000000000000000000000000000000000000000081527fffffffff00000000000000000000000000000000000000000000000000000000831660048201526024016100f9565b610b4d858284610fee565b7fffffffff000000000000000000000000000000000000000000000000000000008216600081815260208781526040808320805473ffffffffffffffffffffffffffffffffffffffff908116740100000000000000000000000000000000000000006bffffffffffffffffffffffff8c16021782558c168085526001808c0185529285208054938401815585528385206008840401805463ffffffff60079095166004026101000a948502191660e08a901c94909402939093179092559390925287905281547fffffffffffffffffffffffff00000000000000000000000000000000000000001617905583610c42816117ea565b94505050508080610c52906115c9565b915050610a6d565b6000815111610c95576040517f92d2fe5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c73ffffffffffffffffffffffffffffffffffffffff831615610d04576040517f6f997f9400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8251811015610d9b576000838281518110610d2457610d2461153c565b6020908102919091018101517fffffffff00000000000000000000000000000000000000000000000000000000811660009081529185905260409091205490915073ffffffffffffffffffffffffffffffffffffffff16610d86848284610fee565b50508080610d93906115c9565b915050610d07565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8216610df5578051156101a9576040517fc21b1ab700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051600003610e30576040517fc047a18400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82163014610e5657610e568261050c565b6000808373ffffffffffffffffffffffffffffffffffffffff1683604051610e7e9190611815565b600060405180830381855af49150503d8060008114610eb9576040519150601f19603f3d011682016040523d82523d6000602084013e610ebe565b606091505b509150915081610d9b57805115610f0357806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f99190611831565b6040517f3a18f8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f3f8282610648565b6101a9576040517fe66c48da000000000000000000000000000000000000000000000000000000008152600481018390526024016100f9565b610f818161050c565b60028201805473ffffffffffffffffffffffffffffffffffffffff90921660008181526001948501602090815260408220860185905594840183559182529290200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169091179055565b73ffffffffffffffffffffffffffffffffffffffff821661105f576040517f5205a6000000000000000000000000000000000000000000000000000000000081527fffffffff00000000000000000000000000000000000000000000000000000000821660048201526024016100f9565b3073ffffffffffffffffffffffffffffffffffffffff8316036110d2576040517f69731c500000000000000000000000000000000000000000000000000000000081527fffffffff00000000000000000000000000000000000000000000000000000000821660048201526024016100f9565b7fffffffff0000000000000000000000000000000000000000000000000000000081166000908152602084815260408083205473ffffffffffffffffffffffffffffffffffffffff86168452600180880190935290832054740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff16929161115c916117d7565b90508082146112a35773ffffffffffffffffffffffffffffffffffffffff84166000908152600186016020526040812080548390811061119e5761119e61153c565b6000918252602080832060088304015473ffffffffffffffffffffffffffffffffffffffff8916845260018a019091526040909220805460079092166004026101000a90920460e01b9250829190859081106111fc576111fc61153c565b600091825260208083206008830401805463ffffffff60079094166004026101000a938402191660e09590951c929092029390931790557fffffffff0000000000000000000000000000000000000000000000000000000092909216825286905260409020805473ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000006bffffffffffffffffffffffff8516021790555b73ffffffffffffffffffffffffffffffffffffffff8416600090815260018601602052604090208054806112d9576112d9611844565b6000828152602080822060087fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90940193840401805463ffffffff600460078716026101000a0219169055919092557fffffffff000000000000000000000000000000000000000000000000000000008516825286905260408120819055819003610972576002850154600090611372906001906117d7565b73ffffffffffffffffffffffffffffffffffffffff861660009081526001808901602052604090912001549091508082146114605760008760020183815481106113be576113be61153c565b60009182526020909120015460028901805473ffffffffffffffffffffffffffffffffffffffff90921692508291849081106113fc576113fc61153c565b600091825260208083209190910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff948516179055929091168152600189810190925260409020018190555b8660020180548061147357611473611844565b6000828152602080822083017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905590920190925573ffffffffffffffffffffffffffffffffffffffff88168252600189810190915260408220015550505050505050565b60006020828403121561151157600080fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811461153557600080fd5b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036115fa576115fa61159a565b5060010190565b60005b8381101561161c578181015183820152602001611604565b50506000910152565b6000815180845261163d816020860160208601611601565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60006060808301818452808751808352608092508286019150828160051b8701016020808b0160005b8481101561179a577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808a8503018652815188850173ffffffffffffffffffffffffffffffffffffffff82511686528482015160038110611721577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b868601526040918201519186018a905281519081905290840190600090898701905b808310156117855783517fffffffff00000000000000000000000000000000000000000000000000000000168252928601926001929092019190860190611743565b50978501979550505090820190600101611698565b505073ffffffffffffffffffffffffffffffffffffffff8a169088015286810360408801526117c98189611625565b9a9950505050505050505050565b8181038181111561069b5761069b61159a565b60006bffffffffffffffffffffffff80831681810361180b5761180b61159a565b6001019392505050565b60008251611827818460208701611601565b9190910192915050565b6020815260006115356020830184611625565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220acff77d1b5a875889d8f7d593a85e0989aae207f85e4f37d0aeb31ec92331d8f64736f6c63430008120033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000b015aceedd478fc497a798ab45fced8bded089240000000000000000000000000ad1f3685335a1cfa9b026cfe664f13e40a7444600000000000000000000000002150e97271fdc0d6e3a16d9094a0948266f07dd0000000000000000000000005fdc879d4414b449efaaa372e25e61eef25c0d90000000000000000000000000bce9288563bbdcc64589957a00a550e56bc24d760000000000000000000000000e0fa2ec263955753b868ec0345c9254dd924ba10000000000000000000000009accff1a1c36313cdbaacb4f935c22e14cf7f0ba000000000000000000000000929dfe5a7244d286db2ba9b2f3cce958001719df000000000000000000000000f55b72307c88479c5530eb2f945ed63f584d4af3000000000000000000000000e3f3db45255655a43a2f3bb20bb5de5ae895eaa8
-----Decoded View---------------
Arg [0] : airnodeRrp (address): 0xb015ACeEdD478fc497A798Ab45fcED8BdEd08924
Arg [1] : blackHole (address): 0x0ad1F3685335A1CfA9B026Cfe664f13e40a74446
Arg [2] : rewardToken (address): 0x02150e97271fDC0D6E3A16d9094A0948266F07dD
Arg [3] : contractAdmin (address): 0x5fdc879D4414B449EFaAa372e25e61eeF25C0D90
Arg [4] : diamondCutFacet_ (address): 0xBce9288563bbDcC64589957a00a550e56bC24D76
Arg [5] : diamondLoupeFacet_ (address): 0x0E0FA2EC263955753B868eC0345c9254DD924Ba1
Arg [6] : accessControlFacet_ (address): 0x9aCCFF1a1c36313CDbaacb4F935C22e14cf7f0BA
Arg [7] : erc165Facet_ (address): 0x929Dfe5a7244D286dB2Ba9b2f3cce958001719Df
Arg [8] : methodsExposureFacetAddress_ (address): 0xF55B72307c88479c5530eB2f945eD63f584D4AF3
Arg [9] : pausableFacet_ (address): 0xe3f3dB45255655A43A2F3bB20bB5De5AE895Eaa8
-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 000000000000000000000000b015aceedd478fc497a798ab45fced8bded08924
Arg [1] : 0000000000000000000000000ad1f3685335a1cfa9b026cfe664f13e40a74446
Arg [2] : 00000000000000000000000002150e97271fdc0d6e3a16d9094a0948266f07dd
Arg [3] : 0000000000000000000000005fdc879d4414b449efaaa372e25e61eef25c0d90
Arg [4] : 000000000000000000000000bce9288563bbdcc64589957a00a550e56bc24d76
Arg [5] : 0000000000000000000000000e0fa2ec263955753b868ec0345c9254dd924ba1
Arg [6] : 0000000000000000000000009accff1a1c36313cdbaacb4f935c22e14cf7f0ba
Arg [7] : 000000000000000000000000929dfe5a7244d286db2ba9b2f3cce958001719df
Arg [8] : 000000000000000000000000f55b72307c88479c5530eb2f945ed63f584d4af3
Arg [9] : 000000000000000000000000e3f3db45255655a43a2f3bb20bb5de5ae895eaa8
Loading...
Loading
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ 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.