Overview
ETH Balance
ETH Value
$0.00Latest 1 from a total of 1 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Set Oracle Addre... | 300692263 | 349 days ago | IN | 0 ETH | 0.00000061 |
Latest 25 internal transactions (View All)
Cross-Chain Transactions
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.2;
import "lib/openzeppelin-contracts/contracts/access/Ownable.sol";
import "lib/openzeppelin-contracts/contracts/proxy/Clones.sol";
import "./SettlementPool.sol";
import "./interfaces/ISettlementPoolFactory.sol";
/// @title Canonical Settlement Pool Factory
/// @notice Deploys and manages Settlement Pools with EIP-1167 Minimal Proxies
contract SettlementPoolFactory is ISettlementPoolFactory, Ownable {
IOracle public override oracle;
IERC20 public immutable override usdcAddress;
address public immutable implementation; // Logic contract address
mapping(uint128 => address) public override getPool;
constructor(address _implementation, address _usdcAddress) {
implementation = _implementation; // Shared logic contract for proxies
usdcAddress = IERC20(_usdcAddress); // ERC20 token used in pools
}
/// @notice Deploys a new settlement pool
function createPool(
address creatorAddress,
address[] calldata otherAddresses,
uint128 poolUuid,
uint128 rfqUuid,
uint128 parentQuoteUuid,
address feeRequestor,
address feePaidBy,
uint256 feeAmount
) external override returns (address pool) {
require(
msg.sender == owner() || msg.sender == address(oracle),
"SettlementPoolFactory: caller must be owner or oracle"
);
require(
creatorAddress != address(0),
"SettlementPoolFactory: creatorAddress must be a non-zero address"
);
require(
otherAddresses.length >= 1,
"SettlementPoolFactory: at least two parties are required"
);
require(
feeAmount == 0 || feeAmount > 0 && feeRequestor != address(0) && feePaidBy != address(0),
"SettlementPoolFactory: feeRequestor and feePaidBy must be set if feeAmount > 0"
);
for (uint i = 0; i < otherAddresses.length; i++) {
require(
otherAddresses[i] != address(0),
"SettlementPoolFactory: each party must have a non-zero address"
);
require(
otherAddresses[i] != creatorAddress,
"SettlementPoolFactory: parties must be different"
);
for (uint j = i + 1; j < otherAddresses.length; j++) {
require(
otherAddresses[i] != otherAddresses[j],
"SettlementPoolFactory: parties must be different"
);
}
}
require(
poolUuid != 0,
"SettlementPoolFactory: poolUuid must be non-zero"
);
pool = getPool[poolUuid];
require(
pool == address(0),
"SettlementPoolFactory: pool for uuid already exists"
);
if (feeAmount > 0) {
try usdcAddress.transferFrom(feePaidBy, feeRequestor, feeAmount) {
} catch {
revert("SettlementPoolFactory: cannot withdraw creation fee");
}
}
// Deploy a minimal proxy
pool = Clones.clone(implementation);
// Initialize the proxy
SettlementPool(pool).initialize(
creatorAddress,
address(this),
otherAddresses,
poolUuid
);
// Store the pool in the mapping
getPool[poolUuid] = pool;
emit PoolCreated(creatorAddress, otherAddresses, poolUuid, pool, rfqUuid, parentQuoteUuid, feePaidBy, feeAmount);
}
/// @notice Updates the Oracle address
function setOracleAddress(address newAddress) external onlyOwner {
oracle = IOracle(newAddress);
emit OracleAddressChanged(newAddress);
}
/// @inheritdoc ISettlementPoolFactory
function getOwner() external view override returns (address) {
return owner();
}
}// 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 (last updated v4.7.0) (access/Ownable.sol)
pragma solidity ^0.8.0;
import "../utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (proxy/Clones.sol)
pragma solidity ^0.8.0;
/**
* @dev https://eips.ethereum.org/EIPS/eip-1167[EIP 1167] is a standard for
* deploying minimal proxy contracts, also known as "clones".
*
* > To simply and cheaply clone contract functionality in an immutable way, this standard specifies
* > a minimal bytecode implementation that delegates all calls to a known, fixed address.
*
* The library includes functions to deploy a proxy using either `create` (traditional deployment) or `create2`
* (salted deterministic deployment). It also includes functions to predict the addresses of clones deployed using the
* deterministic method.
*
* _Available since v3.4._
*/
library Clones {
/**
* @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`.
*
* This function uses the create opcode, which should never revert.
*/
function clone(address implementation) internal returns (address instance) {
/// @solidity memory-safe-assembly
assembly {
// Cleans the upper 96 bits of the `implementation` word, then packs the first 3 bytes
// of the `implementation` address with the bytecode before the address.
mstore(0x00, or(shr(0xe8, shl(0x60, implementation)), 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000))
// Packs the remaining 17 bytes of `implementation` with the bytecode after the address.
mstore(0x20, or(shl(0x78, implementation), 0x5af43d82803e903d91602b57fd5bf3))
instance := create(0, 0x09, 0x37)
}
require(instance != address(0), "ERC1167: create failed");
}
/**
* @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`.
*
* This function uses the create2 opcode and a `salt` to deterministically deploy
* the clone. Using the same `implementation` and `salt` multiple time will revert, since
* the clones cannot be deployed twice at the same address.
*/
function cloneDeterministic(address implementation, bytes32 salt) internal returns (address instance) {
/// @solidity memory-safe-assembly
assembly {
// Cleans the upper 96 bits of the `implementation` word, then packs the first 3 bytes
// of the `implementation` address with the bytecode before the address.
mstore(0x00, or(shr(0xe8, shl(0x60, implementation)), 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000))
// Packs the remaining 17 bytes of `implementation` with the bytecode after the address.
mstore(0x20, or(shl(0x78, implementation), 0x5af43d82803e903d91602b57fd5bf3))
instance := create2(0, 0x09, 0x37, salt)
}
require(instance != address(0), "ERC1167: create2 failed");
}
/**
* @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}.
*/
function predictDeterministicAddress(
address implementation,
bytes32 salt,
address deployer
) internal pure returns (address predicted) {
/// @solidity memory-safe-assembly
assembly {
let ptr := mload(0x40)
mstore(add(ptr, 0x38), deployer)
mstore(add(ptr, 0x24), 0x5af43d82803e903d91602b57fd5bf3ff)
mstore(add(ptr, 0x14), implementation)
mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73)
mstore(add(ptr, 0x58), salt)
mstore(add(ptr, 0x78), keccak256(add(ptr, 0x0c), 0x37))
predicted := keccak256(add(ptr, 0x43), 0x55)
}
}
/**
* @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}.
*/
function predictDeterministicAddress(address implementation, bytes32 salt)
internal
view
returns (address predicted)
{
return predictDeterministicAddress(implementation, salt, address(this));
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and making it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
// On the first call to nonReentrant, _status will be _NOT_ENTERED
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
}
function _nonReentrantAfter() private {
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
}// 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 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.2;
import "lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol";
import "lib/openzeppelin-contracts/contracts/security/ReentrancyGuard.sol";
import "./interfaces/ISettlementPool.sol";
import "./interfaces/ISettlementPoolDeployer.sol";
import "./interfaces/ISettlementPoolFactory.sol";
import "./interfaces/IOracle.sol";
import "./library/SettlementPools.sol";
import {console} from "../lib/forge-std/src/console.sol";
contract SettlementPool is ISettlementPool, ReentrancyGuard {
/// @inheritdoc ISettlementPoolMembers
address public override factory;
/// @inheritdoc ISettlementPoolMembers
address public override creatorAddress;
/// @inheritdoc ISettlementPoolMembers
uint128 public override poolUuid;
// TODO: docs
uint256 private randNonce = 0;
mapping(address => bool) public otherAddresses;
mapping(uint128 => bool) public transfers_processed;
modifier onlyParties() {
require(
msg.sender == creatorAddress || otherAddresses[msg.sender],
"SettlementPool: Unauthorized."
);
_;
}
modifier onlyFactoryOwner() {
require(
msg.sender == ISettlementPoolFactory(factory).getOwner(),
"SettlementPool: Unauthorized."
);
_;
}
modifier onlyOracle() {
require(
msg.sender == address(_oracle()),
"SettlementPool: Unauthorized."
);
_;
}
/// @notice Initialize the pool with its data
function initialize(
address _creatorAddress,
address _factory,
address[] calldata _otherAddresses,
uint128 _poolUuid
) external nonReentrant {
require(msg.sender != address(0), "SettlementPool: Sender must be non-zero");
require(msg.sender == address(ISettlementPoolFactory(_factory)), "SettlementPool: Only factory can initialize");
require(factory == address(0), "SettlementPool: can only initialize once");
require(_creatorAddress != address(0), "SettlementPool: Creator address must be non-zero");
// Initialize state
creatorAddress = _creatorAddress;
poolUuid = _poolUuid;
factory = _factory;
for (uint256 i = 0; i < _otherAddresses.length; i++) {
require(_otherAddresses[i] != address(0), "SettlementPool: Other address must be non-zero");
otherAddresses[_otherAddresses[i]] = true;
}
}
/// @dev Get the pool's balance of USDC
/// @dev This function could be further optimized
/// See https://github.com/Uniswap/v3-core/blob/main/contracts/UniswapV3Pool.sol#L140
function _totalBalance() private view returns (uint256) {
return _usdc().balanceOf(address(this));
}
function _oracle() private view returns (IOracle) {
return ISettlementPoolFactory(factory).oracle();
}
function _usdc() private view returns (IERC20) {
return ISettlementPoolFactory(factory).usdcAddress();
}
function _depositUSDCOnBehalf(
address sender,
uint256 amount,
uint128 transferUuid,
bool emitDepositedEvent
) private {
require(amount > 0, "SettlementPool: Cannot deposit 0 USDC.");
require(transfers_processed[transferUuid] == false, "this transfer has already been processed");
uint256 allowance = _usdc().allowance(sender, address(this));
require(
allowance >= amount,
"SettlementPool: You must approve the contract to transfer at least the amount you are trying to deposit."
);
// todo: We first should make sure that there is not negative equity in the pool before incrementing tokens owed
try _usdc().transferFrom(sender, address(this), amount) {
if (transferUuid != 0) {
transfers_processed[transferUuid] = true;
}
if (emitDepositedEvent) {
emit Deposited(address(this), sender, amount, transferUuid);
}
} catch {
revert("SettlementPool: Could not deposit USDC.");
}
}
/// @inheritdoc ISettlementPool
function checkOtherAddress(address addr) external view override returns (bool) {
return otherAddresses[addr];
}
function batchDepositUSDCAtomic(
address creatorPartyAddress,
uint256 creatorPartyAmountRequested,
SettlementPools.AtomicDepositBatchItem[] calldata items
) external nonReentrant onlyOracle {
for (uint i = 0; i < items.length; i++) {
require(creatorPartyAmountRequested > 0 || items[i].otherPartyAmountRequested > 0, "SettlementPool: when creator amount is 0, all other amounts must be > 0");
uint128 transferUuid = items[i].parentQuoteUuid;
if (creatorPartyAmountRequested > 0) {
_depositUSDCOnBehalf(
creatorPartyAddress,
creatorPartyAmountRequested,
transferUuid,
false /* emitDepositedEvent */
);
// we reset this to 0 now in case there is also a deposit required for the other company. We only
// need to check dupes once per atomic deposit so by resetting this to 0 here the second deposit will
// skip the dupe check
transferUuid = 0;
}
if (items[i].otherPartyAmountRequested > 0) {
_depositUSDCOnBehalf(
items[i].otherPartyAddress,
items[i].otherPartyAmountRequested,
transferUuid,
false /* emitDepositedEvent */
);
}
}
emit BatchDepositedAtomic(
address(this),
creatorPartyAddress,
creatorPartyAmountRequested,
items
);
}
function depositUSDCAtomic(
address partyOneAddress,
address partyTwoAddress,
uint256 partyOneAmountRequested,
uint256 partyTwoAmountRequested,
uint128 rfqUuid,
uint128 parentQuoteUuid
) external nonReentrant onlyOracle {
// if only the first party requested deposit we skip the rest and simply emit the event because
// we already completed the single party transfer in the calling function
if (partyOneAmountRequested > 0 && partyTwoAmountRequested == 0) {
emit DepositedAtomic(
address(this),
partyOneAddress,
partyTwoAddress,
partyOneAmountRequested,
partyTwoAmountRequested,
rfqUuid,
parentQuoteUuid
);
return;
}
require(parentQuoteUuid != 0, "SettlementPool: parentQuoteUuid must be non-zero");
require(
partyOneAmountRequested > 0 || partyTwoAmountRequested > 0,
"one of the two deposit amounts must be non-zero"
);
uint128 transferUuid = parentQuoteUuid;
if (partyOneAmountRequested > 0) {
_depositUSDCOnBehalf(
partyOneAddress,
partyOneAmountRequested,
transferUuid,
false /* emitDepositedEvent */
);
// we reset this to 0 now in case there is also a deposit required for the other company. We only
// need to check dupes once per atomic deposit so by resetting this to 0 here the second deposit will
// skip the dupe check
transferUuid = 0;
}
if (partyTwoAmountRequested > 0) {
_depositUSDCOnBehalf(
partyTwoAddress,
partyTwoAmountRequested,
transferUuid,
false /* emitDepositedEvent */
);
}
emit DepositedAtomic(
address(this),
partyOneAddress,
partyTwoAddress,
partyOneAmountRequested,
partyTwoAmountRequested,
rfqUuid,
parentQuoteUuid
);
}
// depositUSDC deposits USDC tokens to the settlement pool on behalf of creator or one of the other parties
// TODO: here and below document check, effects, interact patter in each key function
function depositUSDC(
uint256 amount,
uint128 transferUuid
) external nonReentrant onlyParties {
require(transferUuid != 0, "SettlementPool: transferUuid must be non-zero");
_depositUSDCOnBehalf(
msg.sender,
amount,
transferUuid,
true /* emitDepositedEvent */
);
}
function depositUSDCOnBehalfOfParty(
address sender,
uint256 amount,
uint128 transferUuid
) external nonReentrant onlyOracle {
require(transferUuid != 0, "SettlementPool: transferUuid must be non-zero");
_depositUSDCOnBehalf(
sender,
amount,
transferUuid,
true /* emitDepositedEvent */
);
}
function withdrawFees(
address requestor,
uint256 amountRequested,
uint128 fees_batch_id
) external nonReentrant onlyOracle {
require(amountRequested > 0, "SettlementPool: Cannot withdraw 0 USDC.");
require(fees_batch_id != 0, "must provide non-zero fees_batch_id");
require(transfers_processed[fees_batch_id] == false, "this fees batch has already been processed");
try _usdc().transfer(requestor, amountRequested) {
transfers_processed[fees_batch_id] = true;
} catch {
revert("SettlementPool: Could not withdraw USDC.");
}
}
function _withdrawUSDCOnBehalf(
address requestor,
uint256 amountRequested,
uint128 transferUuid,
bool emitDepositedEvent
) private {
require(amountRequested > 0, "SettlementPool: Cannot withdraw 0 USDC.");
require(transferUuid != 0, "must provide non-zero transferUuid");
require(
requestor == creatorAddress || otherAddresses[requestor] == true,
"requestor must be one of creatorCompany or otherCompany"
);
require(transfers_processed[transferUuid] == false, "this transfer has already been processed");
try _usdc().transfer(requestor, amountRequested) {
transfers_processed[transferUuid] = true;
if (emitDepositedEvent) {
emit Withdrawn(address(this), requestor, amountRequested, transferUuid);
}
} catch {
revert("SettlementPool: Could not withdraw USDC.");
}
}
function depositUSDCNoEvent(
address sender,
uint256 amount,
uint128 transferUuid
) external nonReentrant onlyOracle {
_depositUSDCOnBehalf(
sender,
amount,
transferUuid,
false /* emitDepositedEvent */
);
}
function withdrawUSDCNoEvent(
address requestor,
uint256 amountRequested,
uint128 transferUuid
) external nonReentrant onlyOracle {
_withdrawUSDCOnBehalf(
requestor,
amountRequested,
transferUuid,
false /* emit_event */
);
}
function withdrawUSDC(
address requestor,
uint256 amountRequested,
uint128 transferUuid
) external nonReentrant onlyOracle {
_withdrawUSDCOnBehalf(
requestor,
amountRequested,
transferUuid,
true /* emit_event */
);
}
function addOtherParty(address otherAddress) external nonReentrant onlyOracle {
require(
otherAddresses[otherAddress] == false,
"SettlementPool: the given address is already a party in the pool"
);
otherAddresses[otherAddress] = true;
emit OtherPartyAdded(address(this), otherAddress);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.2;
import "./oracle/IOracleActions.sol";
import "./oracle/IOracleOwnerActions.sol";
import "./oracle/IOracleEvents.sol";
/// @title An interface for the oracle contract
/// @notice An oracle contract facilitates the aggregation of data from multiple providers
/// which respond to off-chain requests for data
/// @dev The oracle interface is broken up into many smaller pieces
interface IOracle is
IOracleActions,
IOracleOwnerActions,
IOracleEvents
{
/// @notice Returns the address of the configured factory
function factory() external view returns (ISettlementPoolFactory);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.2;
import "./pool/ISettlementPoolMembers.sol";
import "./pool/ISettlementPoolEvents.sol";
/// @title An interface for the core settlement pool
/// @notice A settlement pool facilitates the depositing and withdrawal of collateral by two parties,
/// based upon a set of positions that are held by the pool
/// @dev The pool interface is broken up into many smaller pieces
interface ISettlementPool is
ISettlementPoolMembers,
ISettlementPoolEvents
{
/// @notice Checks whether an address is a party in the pool
/// @return Check result
function checkOtherAddress(address addr) external view returns (bool);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.2;
/// @title An interface for a contract that is capable of deploying settlement pools
/// @notice A contract that constructs a settlement pool must implement this to pass arguments to the pool
/// @dev This is used to avoid having constructor arguments in the pool contract, which results in the init code hash
/// of the pool being constant allowing the CREATE2 address of the pool to be cheaply computed on-chain
interface ISettlementPoolDeployer {
/// @notice Get the parameters to be used in constructing the pool, set transiently during pool creation.
/// @dev Called by the pool constructor to fetch the parameters of the pool
/// Returns factory The factory address
/// Returns party0 The first party of the pool by address sort order
/// Returns party1 The second party of the pool by address sort order
/// Returns poolUuid The UUID associated with the (pending) settlement pool being deployed
function parameters()
external
view
returns (
address factory,
address creatorAddress,
address[] calldata otherAddresses,
uint128 poolUuid
);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.2;
import "lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol";
import "./IOracle.sol";
/// @title The interface for the settlement pool Factory
/// @notice The settlement pool Factory facilitates creation of settlement pools and control over pool configurations
interface ISettlementPoolFactory {
/// @notice Returns the address of the configured oracle
function oracle() external view returns (IOracle);
/// @notice Returns the address of the configured USDC contract
function usdcAddress() external view returns (IERC20);
/// @notice Returns the address of the owner of the factory
function getOwner() external view returns (address);
/// @notice Emitted when a pool is created
/// @param creatorAddress The creator of the desired settlement pool
/// @param otherAddresses Other participants in the pool
/// @param poolUuid A UUID associated with created settlement pool
/// @param pool The address of the created pool
/// @param rfqUuid GUUID associated with RFQ (optional)
/// @param parentQuoteUuid GUUID associated with quote (optional)
event PoolCreated(
address indexed creatorAddress,
address[] otherAddresses,
uint128 indexed poolUuid,
address pool,
uint128 rfqUuid,
uint128 parentQuoteUuid,
address feePaidBy,
uint256 feeAmount
);
/// @notice Emitted when the oracle address is updated
event OracleAddressChanged(address newAddress);
/// @notice Returns the settlement pool address for a given pool, given the assigned UUID
/// @param poolUuid The UUID associated with this settlement pool
/// @return pool The pool address
function getPool(uint128 poolUuid) external view returns (address pool);
/// @notice Creates a settlement pool for the given pair of counterparties
/// @param creatorAddress Creator of the desired pool
/// @param otherAddresses The other parties in the desired pool
/// @param poolUuid The UUID associated with (pending) settlement pool
/// @dev The call will revert if the pool already exists, the fee is invalid,
// or the party arguments are invalid.
/// @return pool The address of the newly created pool
/// @param rfqUuid GUUID associated with RFQ (optional, only if pool is being created as part of RFQ flow)
/// @param parentQuoteUuid GUUID associated with quote (optional, only if pool is being created as part of RFQ)
function createPool(
address creatorAddress,
address[] calldata otherAddresses,
uint128 poolUuid,
uint128 rfqUuid,
uint128 parentQuoteUuid,
address feeRequestor,
address feePaidBy,
uint256 feeAmount
) external returns (address pool);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.2;
import "../ISettlementPoolFactory.sol";
import "../../library/Fees.sol";
import "../../library/TreasuryManagement.sol";
import "../../library/SettlementPools.sol";
interface IOracleActions {
function createPool(
address creatorAddress,
address[] calldata otherAddresses,
uint128 poolUuid,
uint128 rfqUuid,
uint128 parentQuoteUuid,
address feePaidBy,
uint256 feeAmount
) external;
function depositUSDC(
address sender,
uint256 amount,
uint128 poolUuid,
uint128 transferUuid
) external;
function atomicDeposit(
address partyOneAddress,
address partyTwoAddress,
uint256 partyOneAmountRequested,
uint256 partyTwoAmountRequested,
uint128 poolUuid,
uint128 rfqUuid,
uint128 parentQuoteUuid
) external;
function batchAtomicDeposit(
uint128 poolUuid,
address creatorPartyAddress,
uint256 creatorPartyAmountRequested,
SettlementPools.AtomicDepositBatchItem[] calldata items
) external;
function collectFees(
Fees.CollectionRequest[] memory requests
) external;
function processTreasuryManagementWithdrawals(
address requestor,
TreasuryManagement.Withdrawal[] memory withdrawals
) external;
function transferFromOLPToPool(
address olpWallet,
address poolAddress,
uint256 amount,
uint128 poolUuid,
uint128 rfqUuid,
uint128 parentQuoteUuid
) external;
function withdrawUSDC(
address requestor,
uint256 amountRequested,
uint128 poolUuid,
uint128 transferUuid
) external;
function addOtherParty(
uint128 poolUuid,
address otherAddress
) external;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.2;
import "../../library/Fees.sol";
import "../../library/Errors.sol";
import {TreasuryManagement} from "../../library/TreasuryManagement.sol";
interface IOracleEvents {
event FactoryUpdated(address factoryAddress);
event ProviderAdded(address providerAddress);
event ProviderRemoved(address providerAddress);
event MinQuorumChanged(uint256 threshold);
/// @notice Emitted when a fee batch has been processed
/// @param successes requests that were claimed successfully
/// @param failures requests that could not be claimed
event FeeBatchProcessed(
Fees.CollectionRequest[] successes,
Errors.ProcessingError[] failures
);
/// @notice Emitted when a fee batch has been processed
/// @param successes requests that were claimed successfully
/// @param failures requests that could not be claimed
event TreasuryManagementDepositsProcessed(
Fees.CollectionRequest[] successes,
Errors.ProcessingError[] failures
);
/**
* @dev Emitted when deposit requests are processed.
* @param requestor The address initiating the deposits.
* @param successes An array of transfer UUIDs where deposits succeeded.
* @param failures An error with description per withdrawal failure.
*/
event DepositsProcessed(
address indexed requestor,
uint128[] successes,
Errors.ProcessingError[] failures
);
/**
* @dev Emitted when withdrawal requests are processed.
* @param requestor The address initiating the withdrawals.
* @param successes An array of transfer UUIDs where withdrawals succeeded.
* @param failures An error with description per withdrawal failure.
*/
event WithdrawalsProcessed(
address indexed requestor,
uint128[] successes,
Errors.ProcessingError[] failures
);
event OLPToPoolTransfer(
address indexed olpWallet,
address indexed poolAddress,
uint128 poolUuid,
uint256 amount,
uint128 rfqUuid,
uint128 parentQuoteUuid
);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.2;
interface IOracleOwnerActions {
// TODO: docs
function addProvider(address provider) external;
function setSettlementPoolFactory(address factoryAddress) external;
function removeProvider(address provider) external;
// Allows Default Admin to pause the contract
function pause() external;
// Allows Default Admin to unpause the contract
function unpause() external;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.2;
import "../../library/SettlementPools.sol";
/// @title Events emitted by a pool
/// @notice Contains all events emitted by the pool
interface ISettlementPoolEvents {
/// @notice Emitted when a USDC deposits are made on behalf of both parties (atomically)
/// @param poolAddress The address of the pool
/// @param partyOneAddress The address that made the deposit
/// @param partyTwoAddress The address belonging to other company
/// @param partyOneAmountRequested The amount of USDC tokens deposited by party one
/// @param partyTwoAmountRequested The amount of USDC tokens deposited by party two
/// @param rfqUuid GUUID associated with RFQ (optional)
/// @param parentQuoteUuid GUUID associated with quote (optional)
event DepositedAtomic(
address indexed poolAddress,
address indexed partyOneAddress,
address indexed partyTwoAddress,
uint256 partyOneAmountRequested,
uint256 partyTwoAmountRequested,
uint128 rfqUuid,
uint128 parentQuoteUuid
);
/// @notice Emitted when a USDC deposits are made on behalf of multiple parties (atomically)
/// @param poolAddress The address of the pool
/// @param creatorAddress The address that made the deposit
/// @param creatorPartyAmountRequested The amount of USDC tokens deposited by party one
/// @param items Other sides of the deposit
event BatchDepositedAtomic(
address indexed poolAddress,
address indexed creatorAddress,
uint256 creatorPartyAmountRequested,
SettlementPools.AtomicDepositBatchItem[] items
);
/// @notice Emitted when a USDC deposit is made by a party to the pool
/// @param poolAddress The address of the pool
/// @param payer The address that made the deposit
/// @param amount The amount of USDC tokens deposited
/// @param transferUuid The UUID associated with (pending) deposit
event Deposited(
address indexed poolAddress,
address indexed payer,
uint256 amount,
uint128 transferUuid
);
/// @notice Emitted when a USDC withdrawal is made by a party from the pool
/// @param poolAddress The address of the pool
/// @param payee The address that made the withdrawal
/// @param amount The amount of USDC tokens withdrawn
/// @param transferUuid The UUID associated with (pending) withdrawal
event Withdrawn(
address indexed poolAddress,
address indexed payee,
uint256 amount,
uint128 transferUuid
);
/// @notice Emitted when a USDC withdrawal is made by a party from the pool
/// @param poolAddress The address of the pool
/// @param otherAddress The address of the added party
event OtherPartyAdded(
address indexed poolAddress,
address indexed otherAddress
);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.2;
import "../IOracle.sol";
/// @title Pool state that never changes
/// @notice These parameters are fixed for a pool forever, i.e., the methods will always return the same values
interface ISettlementPoolMembers {
/// @notice The contract that deployed the pool, which must adhere to the ISettlementPoolDeployer interface
/// @return The contract address
function factory() external view returns (address);
/// @notice The first of the parties to the pool
/// @return The party wallet address
function creatorAddress() external view returns (address);
/// @notice The UUID associated with this pool
/// @return The pool's UUID
function poolUuid() external view returns (uint128);
}// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.10;
library Errors {
struct ProcessingError {
uint128 requestId;
string failureReason;
}
}// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;
library Fees {
struct CollectionRequest {
uint128 poolUuid;
uint256 amountRequested;
uint128 feesBatchId;
}
}// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;
library SettlementPools {
struct AtomicDepositBatchItem {
address otherPartyAddress;
uint256 otherPartyAmountRequested;
uint128 rfqUuid;
uint128 parentQuoteUuid;
}
}// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;
library TreasuryManagement {
struct Deposit {
uint128 poolUuid;
uint128 transferUuid;
uint256 amountRequested;
}
struct Withdrawal {
uint128 poolUuid;
uint128 transferUuid;
uint256 amountRequested;
}
}{
"evmVersion": "cancun",
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 20000
},
"remappings": [
":ds-test/=lib/forge-std/lib/ds-test/src/",
":forge-std/=lib/forge-std/src/",
":openzeppelin-contracts/=lib/openzeppelin-contracts/"
],
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"abi"
]
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_implementation","type":"address"},{"internalType":"address","name":"_usdcAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newAddress","type":"address"}],"name":"OracleAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"creatorAddress","type":"address"},{"indexed":false,"internalType":"address[]","name":"otherAddresses","type":"address[]"},{"indexed":true,"internalType":"uint128","name":"poolUuid","type":"uint128"},{"indexed":false,"internalType":"address","name":"pool","type":"address"},{"indexed":false,"internalType":"uint128","name":"rfqUuid","type":"uint128"},{"indexed":false,"internalType":"uint128","name":"parentQuoteUuid","type":"uint128"},{"indexed":false,"internalType":"address","name":"feePaidBy","type":"address"},{"indexed":false,"internalType":"uint256","name":"feeAmount","type":"uint256"}],"name":"PoolCreated","type":"event"},{"inputs":[{"internalType":"address","name":"creatorAddress","type":"address"},{"internalType":"address[]","name":"otherAddresses","type":"address[]"},{"internalType":"uint128","name":"poolUuid","type":"uint128"},{"internalType":"uint128","name":"rfqUuid","type":"uint128"},{"internalType":"uint128","name":"parentQuoteUuid","type":"uint128"},{"internalType":"address","name":"feeRequestor","type":"address"},{"internalType":"address","name":"feePaidBy","type":"address"},{"internalType":"uint256","name":"feeAmount","type":"uint256"}],"name":"createPool","outputs":[{"internalType":"address","name":"pool","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint128","name":"","type":"uint128"}],"name":"getPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"implementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oracle","outputs":[{"internalType":"contract IOracle","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"setOracleAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"usdcAddress","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"}]Contract Creation Code
60c060405234801561000f575f5ffd5b5060405161136e38038061136e83398101604081905261002e916100b8565b6100373361004e565b6001600160a01b0391821660a052166080526100e9565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b03811681146100b3575f5ffd5b919050565b5f5f604083850312156100c9575f5ffd5b6100d28361009d565b91506100e06020840161009d565b90509250929050565b60805160a0516112576101175f395f818161016f0152610aa801525f818160c2015261099301526112575ff3fe608060405234801561000f575f5ffd5b50600436106100b9575f3560e01c8063715018a611610072578063893d20e811610058578063893d20e8146101b95780638da5cb5b146101b9578063f2fde38b146101d6575f5ffd5b8063715018a6146101915780637dc0d1d014610199575f5ffd5b80634c69c00f116100a25780634c69c00f146101205780635af595b4146101355780635c60da1b1461016a575f5ffd5b806302d45457146100bd57806327c82c851461010d575b5f5ffd5b6100e47f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6100e461011b366004610f55565b6101e9565b61013361012e366004611033565b610c0f565b005b6100e4610143366004611053565b60026020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b6100e47f000000000000000000000000000000000000000000000000000000000000000081565b610133610c90565b6001546100e49073ffffffffffffffffffffffffffffffffffffffff1681565b5f5473ffffffffffffffffffffffffffffffffffffffff166100e4565b6101336101e4366004611033565b610ca3565b5f805473ffffffffffffffffffffffffffffffffffffffff16331480610226575060015473ffffffffffffffffffffffffffffffffffffffff1633145b6102b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f536574746c656d656e74506f6f6c466163746f72793a2063616c6c6572206d7560448201527f7374206265206f776e6572206f72206f7261636c65000000000000000000000060648201526084015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8a1661035c57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f536574746c656d656e74506f6f6c466163746f72793a2063726561746f72416460448201527f6472657373206d7573742062652061206e6f6e2d7a65726f206164647265737360648201526084016102ae565b60018810156103ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f536574746c656d656e74506f6f6c466163746f72793a206174206c656173742060448201527f74776f207061727469657320617265207265717569726564000000000000000060648201526084016102ae565b81158061043a57505f82118015610419575073ffffffffffffffffffffffffffffffffffffffff841615155b801561043a575073ffffffffffffffffffffffffffffffffffffffff831615155b6104ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604e60248201527f536574746c656d656e74506f6f6c466163746f72793a2066656552657175657360448201527f746f7220616e6420666565506169644279206d7573742062652073657420696660648201527f20666565416d6f756e74203e2030000000000000000000000000000000000000608482015260a4016102ae565b5f5b888110156107d1575f8a8a838181106105095761050961106c565b905060200201602081019061051e9190611033565b73ffffffffffffffffffffffffffffffffffffffff16036105c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f536574746c656d656e74506f6f6c466163746f72793a2065616368207061727460448201527f79206d75737420686176652061206e6f6e2d7a65726f2061646472657373000060648201526084016102ae565b8a73ffffffffffffffffffffffffffffffffffffffff168a8a838181106105ea576105ea61106c565b90506020020160208101906105ff9190611033565b73ffffffffffffffffffffffffffffffffffffffff16036106a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f536574746c656d656e74506f6f6c466163746f72793a2070617274696573206d60448201527f75737420626520646966666572656e740000000000000000000000000000000060648201526084016102ae565b5f6106ae826001611099565b90505b898110156107c8578a8a828181106106cb576106cb61106c565b90506020020160208101906106e09190611033565b73ffffffffffffffffffffffffffffffffffffffff168b8b848181106107085761070861106c565b905060200201602081019061071d9190611033565b73ffffffffffffffffffffffffffffffffffffffff16036107c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f536574746c656d656e74506f6f6c466163746f72793a2070617274696573206d60448201527f75737420626520646966666572656e740000000000000000000000000000000060648201526084016102ae565b6001016106b1565b506001016104ee565b50866fffffffffffffffffffffffffffffffff165f03610873576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f536574746c656d656e74506f6f6c466163746f72793a20706f6f6c557569642060448201527f6d757374206265206e6f6e2d7a65726f0000000000000000000000000000000060648201526084016102ae565b506fffffffffffffffffffffffffffffffff86165f9081526002602052604090205473ffffffffffffffffffffffffffffffffffffffff168015610939576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f536574746c656d656e74506f6f6c466163746f72793a20706f6f6c20666f722060448201527f7575696420616c7265616479206578697374730000000000000000000000000060648201526084016102ae565b8115610aa3576040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301528581166024830152604482018490527f000000000000000000000000000000000000000000000000000000000000000016906323b872dd906064016020604051808303815f875af1925050508015610a15575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252610a12918101906110d7565b60015b610aa1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f536574746c656d656e74506f6f6c466163746f72793a2063616e6e6f7420776960448201527f746864726177206372656174696f6e206665650000000000000000000000000060648201526084016102ae565b505b610acc7f0000000000000000000000000000000000000000000000000000000000000000610d5a565b6040517faaf0e03900000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff82169063aaf0e03990610b29908d9030908e908e908e90600401611149565b5f604051808303815f87803b158015610b40575f5ffd5b505af1158015610b52573d5f5f3e3d5ffd5b505050506fffffffffffffffffffffffffffffffff87165f818152600260205260409081902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff858116919091179091559051908c16907f0b33722ea9d97f05fb7128e0987e4060c182350308a3d0a19f8ec53512fe149390610bfa908d908d9087908d908d908c908c906111b8565b60405180910390a39998505050505050505050565b610c17610e1f565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fe420b96152542f57ce3d2d26d939a3c2860a82361801ad0a970a3badc32d538e9060200160405180910390a150565b610c98610e1f565b610ca15f610e9f565b565b610cab610e1f565b73ffffffffffffffffffffffffffffffffffffffff8116610d4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016102ae565b610d5781610e9f565b50565b5f763d602d80600a3d3981f3363d3d373d3d3d363d730000008260601b60e81c175f526e5af43d82803e903d91602b57fd5bf38260781b17602052603760095ff0905073ffffffffffffffffffffffffffffffffffffffff8116610e1a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f455243313136373a20637265617465206661696c65640000000000000000000060448201526064016102ae565b919050565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610ca1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102ae565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610e1a575f5ffd5b80356fffffffffffffffffffffffffffffffff81168114610e1a575f5ffd5b5f5f5f5f5f5f5f5f5f6101008a8c031215610f6e575f5ffd5b610f778a610f13565b985060208a013567ffffffffffffffff811115610f92575f5ffd5b8a01601f81018c13610fa2575f5ffd5b803567ffffffffffffffff811115610fb8575f5ffd5b8c60208260051b8401011115610fcc575f5ffd5b60209190910198509650610fe260408b01610f36565b9550610ff060608b01610f36565b9450610ffe60808b01610f36565b935061100c60a08b01610f13565b925061101a60c08b01610f13565b989b979a50959894979396929550909360e00135919050565b5f60208284031215611043575f5ffd5b61104c82610f13565b9392505050565b5f60208284031215611063575f5ffd5b61104c82610f36565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b808201808211156110d1577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b92915050565b5f602082840312156110e7575f5ffd5b8151801515811461104c575f5ffd5b8183526020830192505f815f5b8481101561113f5773ffffffffffffffffffffffffffffffffffffffff61112983610f13565b1686526020958601959190910190600101611103565b5093949350505050565b73ffffffffffffffffffffffffffffffffffffffff8616815273ffffffffffffffffffffffffffffffffffffffff85166020820152608060408201525f6111946080830185876110f6565b90506fffffffffffffffffffffffffffffffff831660608301529695505050505050565b60c081525f6111cb60c08301898b6110f6565b73ffffffffffffffffffffffffffffffffffffffff97881660208401526fffffffffffffffffffffffffffffffff968716604084015294909516606082015291909416608082015260a00192909252509291505056fea2646970667358221220f31142f6e6d62902d30ef1c41be175b454b035d4f0364fba5f7ec111ad88508a64736f6c634300081c00330000000000000000000000008db6c8b7a085c3839e93eb8dad45b93fb1ef5836000000000000000000000000af88d065e77c8cc2239327c5edb3a432268e5831
Deployed Bytecode
0x608060405234801561000f575f5ffd5b50600436106100b9575f3560e01c8063715018a611610072578063893d20e811610058578063893d20e8146101b95780638da5cb5b146101b9578063f2fde38b146101d6575f5ffd5b8063715018a6146101915780637dc0d1d014610199575f5ffd5b80634c69c00f116100a25780634c69c00f146101205780635af595b4146101355780635c60da1b1461016a575f5ffd5b806302d45457146100bd57806327c82c851461010d575b5f5ffd5b6100e47f000000000000000000000000af88d065e77c8cc2239327c5edb3a432268e583181565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6100e461011b366004610f55565b6101e9565b61013361012e366004611033565b610c0f565b005b6100e4610143366004611053565b60026020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b6100e47f0000000000000000000000008db6c8b7a085c3839e93eb8dad45b93fb1ef583681565b610133610c90565b6001546100e49073ffffffffffffffffffffffffffffffffffffffff1681565b5f5473ffffffffffffffffffffffffffffffffffffffff166100e4565b6101336101e4366004611033565b610ca3565b5f805473ffffffffffffffffffffffffffffffffffffffff16331480610226575060015473ffffffffffffffffffffffffffffffffffffffff1633145b6102b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f536574746c656d656e74506f6f6c466163746f72793a2063616c6c6572206d7560448201527f7374206265206f776e6572206f72206f7261636c65000000000000000000000060648201526084015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8a1661035c57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f536574746c656d656e74506f6f6c466163746f72793a2063726561746f72416460448201527f6472657373206d7573742062652061206e6f6e2d7a65726f206164647265737360648201526084016102ae565b60018810156103ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f536574746c656d656e74506f6f6c466163746f72793a206174206c656173742060448201527f74776f207061727469657320617265207265717569726564000000000000000060648201526084016102ae565b81158061043a57505f82118015610419575073ffffffffffffffffffffffffffffffffffffffff841615155b801561043a575073ffffffffffffffffffffffffffffffffffffffff831615155b6104ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604e60248201527f536574746c656d656e74506f6f6c466163746f72793a2066656552657175657360448201527f746f7220616e6420666565506169644279206d7573742062652073657420696660648201527f20666565416d6f756e74203e2030000000000000000000000000000000000000608482015260a4016102ae565b5f5b888110156107d1575f8a8a838181106105095761050961106c565b905060200201602081019061051e9190611033565b73ffffffffffffffffffffffffffffffffffffffff16036105c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f536574746c656d656e74506f6f6c466163746f72793a2065616368207061727460448201527f79206d75737420686176652061206e6f6e2d7a65726f2061646472657373000060648201526084016102ae565b8a73ffffffffffffffffffffffffffffffffffffffff168a8a838181106105ea576105ea61106c565b90506020020160208101906105ff9190611033565b73ffffffffffffffffffffffffffffffffffffffff16036106a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f536574746c656d656e74506f6f6c466163746f72793a2070617274696573206d60448201527f75737420626520646966666572656e740000000000000000000000000000000060648201526084016102ae565b5f6106ae826001611099565b90505b898110156107c8578a8a828181106106cb576106cb61106c565b90506020020160208101906106e09190611033565b73ffffffffffffffffffffffffffffffffffffffff168b8b848181106107085761070861106c565b905060200201602081019061071d9190611033565b73ffffffffffffffffffffffffffffffffffffffff16036107c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f536574746c656d656e74506f6f6c466163746f72793a2070617274696573206d60448201527f75737420626520646966666572656e740000000000000000000000000000000060648201526084016102ae565b6001016106b1565b506001016104ee565b50866fffffffffffffffffffffffffffffffff165f03610873576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f536574746c656d656e74506f6f6c466163746f72793a20706f6f6c557569642060448201527f6d757374206265206e6f6e2d7a65726f0000000000000000000000000000000060648201526084016102ae565b506fffffffffffffffffffffffffffffffff86165f9081526002602052604090205473ffffffffffffffffffffffffffffffffffffffff168015610939576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f536574746c656d656e74506f6f6c466163746f72793a20706f6f6c20666f722060448201527f7575696420616c7265616479206578697374730000000000000000000000000060648201526084016102ae565b8115610aa3576040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301528581166024830152604482018490527f000000000000000000000000af88d065e77c8cc2239327c5edb3a432268e583116906323b872dd906064016020604051808303815f875af1925050508015610a15575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252610a12918101906110d7565b60015b610aa1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f536574746c656d656e74506f6f6c466163746f72793a2063616e6e6f7420776960448201527f746864726177206372656174696f6e206665650000000000000000000000000060648201526084016102ae565b505b610acc7f0000000000000000000000008db6c8b7a085c3839e93eb8dad45b93fb1ef5836610d5a565b6040517faaf0e03900000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff82169063aaf0e03990610b29908d9030908e908e908e90600401611149565b5f604051808303815f87803b158015610b40575f5ffd5b505af1158015610b52573d5f5f3e3d5ffd5b505050506fffffffffffffffffffffffffffffffff87165f818152600260205260409081902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff858116919091179091559051908c16907f0b33722ea9d97f05fb7128e0987e4060c182350308a3d0a19f8ec53512fe149390610bfa908d908d9087908d908d908c908c906111b8565b60405180910390a39998505050505050505050565b610c17610e1f565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fe420b96152542f57ce3d2d26d939a3c2860a82361801ad0a970a3badc32d538e9060200160405180910390a150565b610c98610e1f565b610ca15f610e9f565b565b610cab610e1f565b73ffffffffffffffffffffffffffffffffffffffff8116610d4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016102ae565b610d5781610e9f565b50565b5f763d602d80600a3d3981f3363d3d373d3d3d363d730000008260601b60e81c175f526e5af43d82803e903d91602b57fd5bf38260781b17602052603760095ff0905073ffffffffffffffffffffffffffffffffffffffff8116610e1a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f455243313136373a20637265617465206661696c65640000000000000000000060448201526064016102ae565b919050565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610ca1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102ae565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610e1a575f5ffd5b80356fffffffffffffffffffffffffffffffff81168114610e1a575f5ffd5b5f5f5f5f5f5f5f5f5f6101008a8c031215610f6e575f5ffd5b610f778a610f13565b985060208a013567ffffffffffffffff811115610f92575f5ffd5b8a01601f81018c13610fa2575f5ffd5b803567ffffffffffffffff811115610fb8575f5ffd5b8c60208260051b8401011115610fcc575f5ffd5b60209190910198509650610fe260408b01610f36565b9550610ff060608b01610f36565b9450610ffe60808b01610f36565b935061100c60a08b01610f13565b925061101a60c08b01610f13565b989b979a50959894979396929550909360e00135919050565b5f60208284031215611043575f5ffd5b61104c82610f13565b9392505050565b5f60208284031215611063575f5ffd5b61104c82610f36565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b808201808211156110d1577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b92915050565b5f602082840312156110e7575f5ffd5b8151801515811461104c575f5ffd5b8183526020830192505f815f5b8481101561113f5773ffffffffffffffffffffffffffffffffffffffff61112983610f13565b1686526020958601959190910190600101611103565b5093949350505050565b73ffffffffffffffffffffffffffffffffffffffff8616815273ffffffffffffffffffffffffffffffffffffffff85166020820152608060408201525f6111946080830185876110f6565b90506fffffffffffffffffffffffffffffffff831660608301529695505050505050565b60c081525f6111cb60c08301898b6110f6565b73ffffffffffffffffffffffffffffffffffffffff97881660208401526fffffffffffffffffffffffffffffffff968716604084015294909516606082015291909416608082015260a00192909252509291505056fea2646970667358221220f31142f6e6d62902d30ef1c41be175b454b035d4f0364fba5f7ec111ad88508a64736f6c634300081c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000008db6c8b7a085c3839e93eb8dad45b93fb1ef5836000000000000000000000000af88d065e77c8cc2239327c5edb3a432268e5831
-----Decoded View---------------
Arg [0] : _implementation (address): 0x8db6c8B7a085C3839e93EB8DaD45b93FB1ef5836
Arg [1] : _usdcAddress (address): 0xaf88d065e77c8cC2239327C5EDb3A432268e5831
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000008db6c8b7a085c3839e93eb8dad45b93fb1ef5836
Arg [1] : 000000000000000000000000af88d065e77c8cc2239327c5edb3a432268e5831
Deployed Bytecode Sourcemap
393:3528:7:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;501:44;;;;;;;;205:42:21;193:55;;;175:74;;163:2;148:18;501:44:7;;;;;;;951:2620;;;;;;:::i;:::-;;:::i;3621:157::-;;;;;;:::i;:::-;;:::i;:::-;;623:51;;;;;;:::i;:::-;;;;;;;;;;;;;;;;551:39;;;;;1831:101:1;;;:::i;465:30:7:-;;;;;;;;;3827:92;3879:7;1273:6:1;;;3827:92:7;;2081:198:1;;;;;;:::i;:::-;;:::i;951:2620:7:-;1247:12;1273:6:1;;;;1292:10:7;:21;;:54;;-1:-1:-1;1339:6:7;;;;1317:10;:29;1292:54;1271:154;;;;;;;2894:2:21;1271:154:7;;;2876:21:21;2933:2;2913:18;;;2906:30;2972:34;2952:18;;;2945:62;3043:23;3023:18;;;3016:51;3084:19;;1271:154:7;;;;;;;;;1456:28;;;1435:139;;;;;;;;3316:2:21;1435:139:7;;;3298:21:21;3335:18;;;3328:30;;;;3394:34;3374:18;;;3367:62;3465:34;3445:18;;;3438:62;3517:19;;1435:139:7;3114:428:21;1435:139:7;1630:1;1605:26;;;1584:129;;;;;;;3749:2:21;1584:129:7;;;3731:21:21;3788:2;3768:18;;;3761:30;3827:34;3807:18;;;3800:62;3898:26;3878:18;;;3871:54;3942:19;;1584:129:7;3547:420:21;1584:129:7;1744:14;;;:88;;;1774:1;1762:9;:13;:43;;;;-1:-1:-1;1779:26:7;;;;;1762:43;:70;;;;-1:-1:-1;1809:23:7;;;;;1762:70;1723:213;;;;;;;4174:2:21;1723:213:7;;;4156:21:21;4213:2;4193:18;;;4186:30;4252:34;4232:18;;;4225:62;4323:34;4303:18;;;4296:62;4395:16;4374:19;;;4367:45;4429:19;;1723:213:7;3972:482:21;1723:213:7;1951:6;1946:638;1963:25;;;1946:638;;;2063:1;2034:14;;2049:1;2034:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;:31;;;2009:152;;;;;;;4850:2:21;2009:152:7;;;4832:21:21;4889:2;4869:18;;;4862:30;4928:34;4908:18;;;4901:62;4999:32;4979:18;;;4972:60;5049:19;;2009:152:7;4648:426:21;2009:152:7;2221:14;2200:35;;:14;;2215:1;2200:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;:35;;;2175:142;;;;;;;5281:2:21;2175:142:7;;;5263:21:21;5320:2;5300:18;;;5293:30;5359:34;5339:18;;;5332:62;5430:18;5410;;;5403:46;5466:19;;2175:142:7;5079:412:21;2175:142:7;2336:6;2345:5;:1;2349;2345:5;:::i;:::-;2336:14;;2331:243;2352:25;;;2331:243;;;2452:14;;2467:1;2452:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;2431:38;;:14;;2446:1;2431:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;:38;;;2402:157;;;;;;;5281:2:21;2402:157:7;;;5263:21:21;5320:2;5300:18;;;5293:30;5359:34;5339:18;;;5332:62;5430:18;5410;;;5403:46;5466:19;;2402:157:7;5079:412:21;2402:157:7;2379:3;;2331:243;;;-1:-1:-1;1990:3:7;;1946:638;;;;2615:8;:13;;2627:1;2615:13;2594:108;;;;;;;5982:2:21;2594:108:7;;;5964:21:21;6021:2;6001:18;;;5994:30;6060:34;6040:18;;;6033:62;6131:18;6111;;;6104:46;6167:19;;2594:108:7;5780:412:21;2594:108:7;-1:-1:-1;2719:17:7;;;;;;;:7;:17;;;;;;;;2767:18;;2746:116;;;;;;;6399:2:21;2746:116:7;;;6381:21:21;6438:2;6418:18;;;6411:30;6477:34;6457:18;;;6450:62;6548:21;6528:18;;;6521:49;6587:19;;2746:116:7;6197:415:21;2746:116:7;2877:13;;2873:224;;2910:60;;;;;:24;6837:55:21;;;2910:60:7;;;6819:74:21;6929:55;;;6909:18;;;6902:83;7001:18;;;6994:34;;;2910:11:7;:24;;;;6792:18:21;;2910:60:7;;;;;;;;;;;;;;;;;;;-1:-1:-1;2910:60:7;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;2906:181;;3011:61;;;;;7523:2:21;3011:61:7;;;7505:21:21;7562:2;7542:18;;;7535:30;7601:34;7581:18;;;7574:62;7672:21;7652:18;;;7645:49;7711:19;;3011:61:7;7321:415:21;2906:181:7;;;3148:28;3161:14;3148:12;:28::i;:::-;3219:146;;;;;3141:35;;-1:-1:-1;3219:31:7;;;;;;:146;;3264:14;;3300:4;;3319:14;;;;3347:8;;3219:146;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;3417:17:7;;;;;;;:7;:17;;;;;;;:24;;;;;;;;;;;;;;;3457:107;;;;;;;;;;3485:14;;;;3417:24;;3517:7;;3526:15;;3543:9;;3554;;3457:107;:::i;:::-;;;;;;;;951:2620;;;;;;;;;;;:::o;3621:157::-;1094:13:1;:11;:13::i;:::-;3696:6:7::1;:28:::0;;;::::1;;::::0;::::1;::::0;;::::1;::::0;;;3739:32:::1;::::0;175:74:21;;;3739:32:7::1;::::0;163:2:21;148:18;3739:32:7::1;;;;;;;3621:157:::0;:::o;1831:101:1:-;1094:13;:11;:13::i;:::-;1895:30:::1;1922:1;1895:18;:30::i;:::-;1831:101::o:0;2081:198::-;1094:13;:11;:13::i;:::-;2169:22:::1;::::0;::::1;2161:73;;;::::0;::::1;::::0;;9880:2:21;2161:73:1::1;::::0;::::1;9862:21:21::0;9919:2;9899:18;;;9892:30;9958:34;9938:18;;;9931:62;10029:8;10009:18;;;10002:36;10055:19;;2161:73:1::1;9678:402:21::0;2161:73:1::1;2244:28;2263:8;2244:18;:28::i;:::-;2081:198:::0;:::o;973:759:2:-;1030:16;1362:48;1344:14;1338:4;1334:25;1328:4;1324:36;1321:90;1315:4;1308:104;1569:32;1552:14;1546:4;1542:25;1539:63;1533:4;1526:77;1644:4;1638;1635:1;1628:21;1616:33;-1:-1:-1;1676:22:2;;;1668:57;;;;;;;10287:2:21;1668:57:2;;;10269:21:21;10326:2;10306:18;;;10299:30;10365:24;10345:18;;;10338:52;10407:18;;1668:57:2;10085:346:21;1668:57:2;973:759;;;:::o;1359:130:1:-;1247:7;1273:6;1422:23;1273:6;719:10:5;1422:23:1;1414:68;;;;;;;10638:2:21;1414:68:1;;;10620:21:21;;;10657:18;;;10650:30;10716:34;10696:18;;;10689:62;10768:18;;1414:68:1;10436:356:21;2433:187:1;2506:16;2525:6;;;2541:17;;;;;;;;;;2573:40;;2525:6;;;;;;;2573:40;;2506:16;2573:40;2496:124;2433:187;:::o;260:196:21:-;328:20;;388:42;377:54;;367:65;;357:93;;446:1;443;436:12;461:188;529:20;;589:34;578:46;;568:57;;558:85;;639:1;636;629:12;654:1173;803:6;811;819;827;835;843;851;859;867;920:3;908:9;899:7;895:23;891:33;888:53;;;937:1;934;927:12;888:53;960:29;979:9;960:29;:::i;:::-;950:39;;1040:2;1029:9;1025:18;1012:32;1067:18;1059:6;1056:30;1053:50;;;1099:1;1096;1089:12;1053:50;1122:22;;1175:4;1167:13;;1163:27;-1:-1:-1;1153:55:21;;1204:1;1201;1194:12;1153:55;1244:2;1231:16;1270:18;1262:6;1259:30;1256:50;;;1302:1;1299;1292:12;1256:50;1355:7;1350:2;1340:6;1337:1;1333:14;1329:2;1325:23;1321:32;1318:45;1315:65;;;1376:1;1373;1366:12;1315:65;1407:2;1399:11;;;;;-1:-1:-1;1429:6:21;-1:-1:-1;1454:38:21;1488:2;1473:18;;1454:38;:::i;:::-;1444:48;;1511:38;1545:2;1534:9;1530:18;1511:38;:::i;:::-;1501:48;;1568:39;1602:3;1591:9;1587:19;1568:39;:::i;:::-;1558:49;;1626:39;1660:3;1649:9;1645:19;1626:39;:::i;:::-;1616:49;;1684:39;1718:3;1707:9;1703:19;1684:39;:::i;:::-;654:1173;;;;-1:-1:-1;654:1173:21;;;;;;;;-1:-1:-1;654:1173:21;;1792:3;1777:19;1764:33;;654:1173;-1:-1:-1;654:1173:21:o;2063:186::-;2122:6;2175:2;2163:9;2154:7;2150:23;2146:32;2143:52;;;2191:1;2188;2181:12;2143:52;2214:29;2233:9;2214:29;:::i;:::-;2204:39;2063:186;-1:-1:-1;;;2063:186:21:o;2254:::-;2313:6;2366:2;2354:9;2345:7;2341:23;2337:32;2334:52;;;2382:1;2379;2372:12;2334:52;2405:29;2424:9;2405:29;:::i;4459:184::-;4511:77;4508:1;4501:88;4608:4;4605:1;4598:15;4632:4;4629:1;4622:15;5496:279;5561:9;;;5582:10;;;5579:190;;;5625:77;5622:1;5615:88;5726:4;5723:1;5716:15;5754:4;5751:1;5744:15;5579:190;5496:279;;;;:::o;7039:277::-;7106:6;7159:2;7147:9;7138:7;7134:23;7130:32;7127:52;;;7175:1;7172;7165:12;7127:52;7207:9;7201:16;7260:5;7253:13;7246:21;7239:5;7236:32;7226:60;;7282:1;7279;7272:12;7741:453;7841:6;7836:3;7829:19;7873:4;7868:3;7864:14;7857:21;;7811:3;7901:5;7924:1;7934:235;7948:6;7945:1;7942:13;7934:235;;;8041:42;8013:26;8032:6;8013:26;:::i;:::-;8009:75;7997:88;;8114:4;8105:14;;;;8142:17;;;;;7970:1;7963:9;7934:235;;;-1:-1:-1;8185:3:21;;7741:453;-1:-1:-1;;;;7741:453:21:o;8199:642::-;8484:42;8476:6;8472:55;8461:9;8454:74;8576:42;8568:6;8564:55;8559:2;8548:9;8544:18;8537:83;8656:3;8651:2;8640:9;8636:18;8629:31;8435:4;8677:74;8746:3;8735:9;8731:19;8723:6;8715;8677:74;:::i;:::-;8669:82;;8799:34;8791:6;8787:47;8782:2;8771:9;8767:18;8760:75;8199:642;;;;;;;;:::o;8846:827::-;9175:3;9164:9;9157:22;9138:4;9196:74;9265:3;9254:9;9250:19;9242:6;9234;9196:74;:::i;:::-;9318:42;9306:55;;;9301:2;9286:18;;9279:83;9410:34;9398:47;;;9393:2;9378:18;;9371:75;9482:47;;;;9477:2;9462:18;;9455:75;9567:55;;;;9561:3;9546:19;;9539:84;9654:3;9639:19;9632:35;;;;-1:-1:-1;9188:82:21;8846:827;-1:-1:-1;;8846:827:21:o
Swarm Source
ipfs://f31142f6e6d62902d30ef1c41be175b454b035d4f0364fba5f7ec111ad88508a
Net Worth in USD
Net Worth in ETH
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
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.