编译器
0.8.19+commit.7dd6d404
文件 1 的 17:Constants.sol
pragma solidity ^0.8.17;
library Constants {
uint256 internal constant CONTRACT_BALANCE = 0x8000000000000000000000000000000000000000000000000000000000000000;
uint256 internal constant ALREADY_PAID = 0;
address internal constant ETH = address(0);
address internal constant ETH_ADDRESS = address(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE);
address internal constant MSG_SENDER = address(1);
address internal constant ADDRESS_THIS = address(2);
}
文件 2 的 17:ERC1155.sol
pragma solidity >=0.8.0;
abstract contract ERC1155 {
event TransferSingle(
address indexed operator,
address indexed from,
address indexed to,
uint256 id,
uint256 amount
);
event TransferBatch(
address indexed operator,
address indexed from,
address indexed to,
uint256[] ids,
uint256[] amounts
);
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
event URI(string value, uint256 indexed id);
mapping(address => mapping(uint256 => uint256)) public balanceOf;
mapping(address => mapping(address => bool)) public isApprovedForAll;
function uri(uint256 id) public view virtual returns (string memory);
function setApprovalForAll(address operator, bool approved) public virtual {
isApprovedForAll[msg.sender][operator] = approved;
emit ApprovalForAll(msg.sender, operator, approved);
}
function safeTransferFrom(
address from,
address to,
uint256 id,
uint256 amount,
bytes calldata data
) public virtual {
require(msg.sender == from || isApprovedForAll[from][msg.sender], "NOT_AUTHORIZED");
balanceOf[from][id] -= amount;
balanceOf[to][id] += amount;
emit TransferSingle(msg.sender, from, to, id, amount);
require(
to.code.length == 0
? to != address(0)
: ERC1155TokenReceiver(to).onERC1155Received(msg.sender, from, id, amount, data) ==
ERC1155TokenReceiver.onERC1155Received.selector,
"UNSAFE_RECIPIENT"
);
}
function safeBatchTransferFrom(
address from,
address to,
uint256[] calldata ids,
uint256[] calldata amounts,
bytes calldata data
) public virtual {
require(ids.length == amounts.length, "LENGTH_MISMATCH");
require(msg.sender == from || isApprovedForAll[from][msg.sender], "NOT_AUTHORIZED");
uint256 id;
uint256 amount;
for (uint256 i = 0; i < ids.length; ) {
id = ids[i];
amount = amounts[i];
balanceOf[from][id] -= amount;
balanceOf[to][id] += amount;
unchecked {
++i;
}
}
emit TransferBatch(msg.sender, from, to, ids, amounts);
require(
to.code.length == 0
? to != address(0)
: ERC1155TokenReceiver(to).onERC1155BatchReceived(msg.sender, from, ids, amounts, data) ==
ERC1155TokenReceiver.onERC1155BatchReceived.selector,
"UNSAFE_RECIPIENT"
);
}
function balanceOfBatch(address[] calldata owners, uint256[] calldata ids)
public
view
virtual
returns (uint256[] memory balances)
{
require(owners.length == ids.length, "LENGTH_MISMATCH");
balances = new uint256[](owners.length);
unchecked {
for (uint256 i = 0; i < owners.length; ++i) {
balances[i] = balanceOf[owners[i]][ids[i]];
}
}
}
function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
return
interfaceId == 0x01ffc9a7 ||
interfaceId == 0xd9b67a26 ||
interfaceId == 0x0e89341c;
}
function _mint(
address to,
uint256 id,
uint256 amount,
bytes memory data
) internal virtual {
balanceOf[to][id] += amount;
emit TransferSingle(msg.sender, address(0), to, id, amount);
require(
to.code.length == 0
? to != address(0)
: ERC1155TokenReceiver(to).onERC1155Received(msg.sender, address(0), id, amount, data) ==
ERC1155TokenReceiver.onERC1155Received.selector,
"UNSAFE_RECIPIENT"
);
}
function _batchMint(
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) internal virtual {
uint256 idsLength = ids.length;
require(idsLength == amounts.length, "LENGTH_MISMATCH");
for (uint256 i = 0; i < idsLength; ) {
balanceOf[to][ids[i]] += amounts[i];
unchecked {
++i;
}
}
emit TransferBatch(msg.sender, address(0), to, ids, amounts);
require(
to.code.length == 0
? to != address(0)
: ERC1155TokenReceiver(to).onERC1155BatchReceived(msg.sender, address(0), ids, amounts, data) ==
ERC1155TokenReceiver.onERC1155BatchReceived.selector,
"UNSAFE_RECIPIENT"
);
}
function _batchBurn(
address from,
uint256[] memory ids,
uint256[] memory amounts
) internal virtual {
uint256 idsLength = ids.length;
require(idsLength == amounts.length, "LENGTH_MISMATCH");
for (uint256 i = 0; i < idsLength; ) {
balanceOf[from][ids[i]] -= amounts[i];
unchecked {
++i;
}
}
emit TransferBatch(msg.sender, from, address(0), ids, amounts);
}
function _burn(
address from,
uint256 id,
uint256 amount
) internal virtual {
balanceOf[from][id] -= amount;
emit TransferSingle(msg.sender, from, address(0), id, amount);
}
}
abstract contract ERC1155TokenReceiver {
function onERC1155Received(
address,
address,
uint256,
uint256,
bytes calldata
) external virtual returns (bytes4) {
return ERC1155TokenReceiver.onERC1155Received.selector;
}
function onERC1155BatchReceived(
address,
address,
uint256[] calldata,
uint256[] calldata,
bytes calldata
) external virtual returns (bytes4) {
return ERC1155TokenReceiver.onERC1155BatchReceived.selector;
}
}
文件 3 的 17:ERC20.sol
pragma solidity >=0.8.0;
abstract contract ERC20 {
event Transfer(address indexed from, address indexed to, uint256 amount);
event Approval(address indexed owner, address indexed spender, uint256 amount);
string public name;
string public symbol;
uint8 public immutable decimals;
uint256 public totalSupply;
mapping(address => uint256) public balanceOf;
mapping(address => mapping(address => uint256)) public allowance;
uint256 internal immutable INITIAL_CHAIN_ID;
bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR;
mapping(address => uint256) public nonces;
constructor(
string memory _name,
string memory _symbol,
uint8 _decimals
) {
name = _name;
symbol = _symbol;
decimals = _decimals;
INITIAL_CHAIN_ID = block.chainid;
INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator();
}
function approve(address spender, uint256 amount) public virtual returns (bool) {
allowance[msg.sender][spender] = amount;
emit Approval(msg.sender, spender, amount);
return true;
}
function transfer(address to, uint256 amount) public virtual returns (bool) {
balanceOf[msg.sender] -= amount;
unchecked {
balanceOf[to] += amount;
}
emit Transfer(msg.sender, to, amount);
return true;
}
function transferFrom(
address from,
address to,
uint256 amount
) public virtual returns (bool) {
uint256 allowed = allowance[from][msg.sender];
if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount;
balanceOf[from] -= amount;
unchecked {
balanceOf[to] += amount;
}
emit Transfer(from, to, amount);
return true;
}
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) public virtual {
require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED");
unchecked {
address recoveredAddress = ecrecover(
keccak256(
abi.encodePacked(
"\x19\x01",
DOMAIN_SEPARATOR(),
keccak256(
abi.encode(
keccak256(
"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"
),
owner,
spender,
value,
nonces[owner]++,
deadline
)
)
)
),
v,
r,
s
);
require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER");
allowance[recoveredAddress][spender] = value;
}
emit Approval(owner, spender, value);
}
function DOMAIN_SEPARATOR() public view virtual returns (bytes32) {
return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator();
}
function computeDomainSeparator() internal view virtual returns (bytes32) {
return
keccak256(
abi.encode(
keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
keccak256(bytes(name)),
keccak256("1"),
block.chainid,
address(this)
)
);
}
function _mint(address to, uint256 amount) internal virtual {
totalSupply += amount;
unchecked {
balanceOf[to] += amount;
}
emit Transfer(address(0), to, amount);
}
function _burn(address from, uint256 amount) internal virtual {
balanceOf[from] -= amount;
unchecked {
totalSupply -= amount;
}
emit Transfer(from, address(0), amount);
}
}
文件 4 的 17:ERC721.sol
pragma solidity >=0.8.0;
abstract contract ERC721 {
event Transfer(address indexed from, address indexed to, uint256 indexed id);
event Approval(address indexed owner, address indexed spender, uint256 indexed id);
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
string public name;
string public symbol;
function tokenURI(uint256 id) public view virtual returns (string memory);
mapping(uint256 => address) internal _ownerOf;
mapping(address => uint256) internal _balanceOf;
function ownerOf(uint256 id) public view virtual returns (address owner) {
require((owner = _ownerOf[id]) != address(0), "NOT_MINTED");
}
function balanceOf(address owner) public view virtual returns (uint256) {
require(owner != address(0), "ZERO_ADDRESS");
return _balanceOf[owner];
}
mapping(uint256 => address) public getApproved;
mapping(address => mapping(address => bool)) public isApprovedForAll;
constructor(string memory _name, string memory _symbol) {
name = _name;
symbol = _symbol;
}
function approve(address spender, uint256 id) public virtual {
address owner = _ownerOf[id];
require(msg.sender == owner || isApprovedForAll[owner][msg.sender], "NOT_AUTHORIZED");
getApproved[id] = spender;
emit Approval(owner, spender, id);
}
function setApprovalForAll(address operator, bool approved) public virtual {
isApprovedForAll[msg.sender][operator] = approved;
emit ApprovalForAll(msg.sender, operator, approved);
}
function transferFrom(
address from,
address to,
uint256 id
) public virtual {
require(from == _ownerOf[id], "WRONG_FROM");
require(to != address(0), "INVALID_RECIPIENT");
require(
msg.sender == from || isApprovedForAll[from][msg.sender] || msg.sender == getApproved[id],
"NOT_AUTHORIZED"
);
unchecked {
_balanceOf[from]--;
_balanceOf[to]++;
}
_ownerOf[id] = to;
delete getApproved[id];
emit Transfer(from, to, id);
}
function safeTransferFrom(
address from,
address to,
uint256 id
) public virtual {
transferFrom(from, to, id);
require(
to.code.length == 0 ||
ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, "") ==
ERC721TokenReceiver.onERC721Received.selector,
"UNSAFE_RECIPIENT"
);
}
function safeTransferFrom(
address from,
address to,
uint256 id,
bytes calldata data
) public virtual {
transferFrom(from, to, id);
require(
to.code.length == 0 ||
ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, data) ==
ERC721TokenReceiver.onERC721Received.selector,
"UNSAFE_RECIPIENT"
);
}
function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
return
interfaceId == 0x01ffc9a7 ||
interfaceId == 0x80ac58cd ||
interfaceId == 0x5b5e139f;
}
function _mint(address to, uint256 id) internal virtual {
require(to != address(0), "INVALID_RECIPIENT");
require(_ownerOf[id] == address(0), "ALREADY_MINTED");
unchecked {
_balanceOf[to]++;
}
_ownerOf[id] = to;
emit Transfer(address(0), to, id);
}
function _burn(uint256 id) internal virtual {
address owner = _ownerOf[id];
require(owner != address(0), "NOT_MINTED");
unchecked {
_balanceOf[owner]--;
}
delete _ownerOf[id];
delete getApproved[id];
emit Transfer(owner, address(0), id);
}
function _safeMint(address to, uint256 id) internal virtual {
_mint(to, id);
require(
to.code.length == 0 ||
ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, "") ==
ERC721TokenReceiver.onERC721Received.selector,
"UNSAFE_RECIPIENT"
);
}
function _safeMint(
address to,
uint256 id,
bytes memory data
) internal virtual {
_mint(to, id);
require(
to.code.length == 0 ||
ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, data) ==
ERC721TokenReceiver.onERC721Received.selector,
"UNSAFE_RECIPIENT"
);
}
}
abstract contract ERC721TokenReceiver {
function onERC721Received(
address,
address,
uint256,
bytes calldata
) external virtual returns (bytes4) {
return ERC721TokenReceiver.onERC721Received.selector;
}
}
文件 5 的 17:EisenDiamond.sol
pragma solidity 0.8.19;
import {LibDiamond} from "contracts/Libraries/LibDiamond.sol";
import {IDiamondCut} from "contracts/Interfaces/IDiamondCut.sol";
import {LibUtil} from "contracts/Libraries/LibUtil.sol";
import {LibPayments, Recipient, Payer} from "contracts/Libraries/LibPayments.sol";
import {TransferrableOwnership} from "contracts/Helpers/TransferrableOwnership.sol";
import {GenericErrors} from "contracts/Errors/GenericErrors.sol";
contract EisenDiamond {
constructor(address _contractOwner, address _diamondCutFacet, address weth9, address permit2, uint256 fee) payable {
LibDiamond.setContractOwner(_contractOwner);
LibPayments.initializePayment(weth9, permit2, _contractOwner, fee);
IDiamondCut.FacetCut[] memory cut = new IDiamondCut.FacetCut[](1);
bytes4[] memory functionSelectors = new bytes4[](1);
functionSelectors[0] = IDiamondCut.diamondCut.selector;
cut[0] = IDiamondCut.FacetCut({
facetAddress: _diamondCutFacet,
action: IDiamondCut.FacetCutAction.Add,
functionSelectors: functionSelectors
});
LibDiamond.diamondCut(cut, address(0), "");
}
modifier onlyOwner() {
if (msg.sender != LibDiamond.contractOwner()) {
revert GenericErrors.GenericError(GenericErrors.ONLY_CONTRACT_OWNER);
}
_;
}
function setFee(uint256 fee) external onlyOwner {
LibPayments.setFee(fee);
}
function changeFeeCollector(address feeCollector) external onlyOwner {
LibPayments.changeFeeCollector(feeCollector);
}
fallback() external payable {
LibDiamond.DiamondStorage storage ds;
bytes32 position = LibDiamond.DIAMOND_STORAGE_POSITION;
assembly ("memory-safe") {
ds.slot := position
}
address facet = ds.selectorToFacetAndPosition[msg.sig].facetAddress;
if (facet == address(0)) {
revert LibDiamond.DiamondError(LibDiamond.FUNCTION_DOES_NOT_EXIST);
}
bytes4 selector = bytes4(msg.sig);
assembly ("memory-safe") {
calldatacopy(0, 0, calldatasize())
let result := delegatecall(gas(), facet, 0, calldatasize(), 0, 0)
returndatacopy(0, 0, returndatasize())
switch result
case 0 {
if eq(selector, 0xa0d0feeb) {
return(0, returndatasize())
}
revert(0, returndatasize())
}
default {
return(0, returndatasize())
}
}
}
receive() external payable {}
}
文件 6 的 17:GenericErrors.sol
pragma solidity 0.8.19;
library GenericErrors {
error DiffError(uint256 errorCode, uint256 stdValue, uint256 realValue);
error GenericError(uint256 errorCode);
uint256 public constant ALREADY_INITIALIZED = 1;
uint256 public constant CANNOT_AUTHORIZE_SELF = 2;
uint256 public constant CANNOT_BRIDGE_TO_SAME_NETWORK = 3;
uint256 public constant CONTRACT_CALL_NOT_ALLOWED = 4;
uint256 public constant WITHDRAW_FAILED = 5;
uint256 public constant EXTERNAL_CALL_FAILED = 6;
uint256 public constant INFORMATION_MISMATCH = 7;
uint256 public constant ZERO_AMOUNT = 8;
uint256 public constant INVALID_AMOUNT = 9;
uint256 public constant INSUFFICIENT_VALUE = 10;
uint256 public constant INSUFFICIENT_TOKEN = 11;
uint256 public constant INSUFFICIENT_BALANCE = 12;
uint256 public constant INVALID_DESTINATION_CHAIN = 13;
uint256 public constant INVALID_FALLBACK_ADDRESS = 14;
uint256 public constant INVALID_RECEIVER = 15;
uint256 public constant INVALID_SENDING_TOKEN = 16;
uint256 public constant NATIVE_ASSET_NOT_SUPPORTED = 17;
uint256 public constant NATIVE_ASSET_TRANSFER_FAILED = 18;
uint256 public constant NO_SWAP_DATA_PROVIDED = 19;
uint256 public constant NO_SWAP_FROM_ZERO_BALANCE = 20;
uint256 public constant NOT_A_CONTRACT = 21;
uint256 public constant NOT_INITIALIZED = 22;
uint256 public constant NO_TRANSFER_TO_NULL_ADDRESS = 23;
uint256 public constant NULL_ADDR_IS_NOT_AN_ERC20_TOKEN = 24;
uint256 public constant NULL_ADDR_IS_NOT_A_VALID_SPENDER = 25;
uint256 public constant ONLY_CONTRACT_OWNER = 26;
uint256 public constant RECOVERY_ADDRESS_CANNOT_BE_ZERO = 27;
uint256 public constant REENTRANCY_ERROR = 28;
uint256 public constant TOKEN_NOT_SUPPORTED = 29;
uint256 public constant REENTRANCY_LOCKED = 30;
uint256 public constant UNSUPPORTED_CHAIN_ID = 31;
uint256 public constant UN_AUTHORIZED = 32;
uint256 public constant INVALID_CALL_DATA = 33;
uint256 public constant INVALID_CONFIG = 34;
uint256 public constant INVALID_CALLER = 35;
uint256 public constant INVALID_CONTRACT = 36;
uint256 public constant INVALID_BIPS = 37;
uint256 public constant INVALID_PARAMS = 38;
uint256 public constant INVALID_INITIATOR = 39;
uint256 public constant INVALID_POOL = 40;
uint256 public constant INVALID_TOKEN = 41;
uint256 public constant INVALID_INPUT_TOKEN = 42;
uint256 public constant INVALID_PATH = 43;
uint256 public constant INVALID_BATCH_PATH = 44;
uint256 public constant INVALID_FEE_AMOUNT = 45;
uint256 public constant DEADLINE = 46;
uint256 public constant LENGTH_MISMATCH = 47;
uint256 public constant OVERFLOW_UNDERFLOW = 48;
uint256 public constant FROM_ADDR_IS_NOT_OWNER = 49;
uint256 public constant UNI3_SLICE_OUT_OF_BOUNDS = 50;
uint256 public constant UNI3_SLICE_OVERFLOW = 51;
uint256 public constant UNI3_NO_SLICE = 52;
uint256 public constant UNI3_TO_UINT24_OUT_OF_BOUNDS = 53;
uint256 public constant UNI3_TO_UINT24_OVERFLOW = 54;
uint256 public constant UNI3_TO_ADDRESS_OVERFLOW = 55;
uint256 public constant UNI3_TO_ADDRESS_OUT_OF_BOUNDS = 56;
uint256 public constant MAVERICK_TO_UINT256_OVERFLOW = 60;
uint256 public constant MAVERICK_TO_UINT256_OUT_OF_BOUNDS = 61;
uint256 public constant MAVERICK_TO_INT256_OVERFLOW = 62;
uint256 public constant MAVERICK_TO_INT256_OUT_OF_BOUNDS = 63;
uint256 public constant PENDLE_INSUFFICIENT_PT_REPAY = 71;
uint256 public constant PENDLE_INSUFFICIENT_SY_REPAY = 72;
uint256 public constant PENDLE_MARKET_EXPIRED = 73;
uint256 public constant PENDLE_INSUFFICIENT_PT_FOR_TRADE = 74;
uint256 public constant PENDLE_MARKET_ZERO_TOTAL_PT_OR_TOTAL_ASSET = 75;
uint256 public constant PENDLE_MARKET_ZERO_LN_IMPLILED_RATE = 76;
uint256 public constant PENDLE_MARKET_EXCHANGE_RATE_BELOW_ONE = 77;
uint256 public constant PENDLE_MARKET_RATE_SCALAR_BELOW_ZERO = 78;
uint256 public constant PENDLE_MARKET_PROPORTION_TOO_HIGH = 79;
uint256 public constant PENDLE_MARKET_PROPORTION_MUST_NOT_EQUAL_ONE = 710;
uint256 public constant SLIPPAGE = 101;
}
文件 7 的 17:IAllowanceTransfer.sol
pragma solidity ^0.8.17;
interface IAllowanceTransfer {
error AllowanceExpired(uint256 deadline);
error InsufficientAllowance(uint256 amount);
error ExcessiveInvalidation();
event NonceInvalidation(
address indexed owner, address indexed token, address indexed spender, uint48 newNonce, uint48 oldNonce
);
event Approval(
address indexed owner, address indexed token, address indexed spender, uint160 amount, uint48 expiration
);
event Permit(
address indexed owner,
address indexed token,
address indexed spender,
uint160 amount,
uint48 expiration,
uint48 nonce
);
event Lockdown(address indexed owner, address token, address spender);
struct PermitDetails {
address token;
uint160 amount;
uint48 expiration;
uint48 nonce;
}
struct PermitSingle {
PermitDetails details;
address spender;
uint256 sigDeadline;
}
struct PermitBatch {
PermitDetails[] details;
address spender;
uint256 sigDeadline;
}
struct PackedAllowance {
uint160 amount;
uint48 expiration;
uint48 nonce;
}
struct TokenSpenderPair {
address token;
address spender;
}
struct AllowanceTransferDetails {
address from;
address to;
uint160 amount;
address token;
}
function allowance(address, address, address) external view returns (uint160, uint48, uint48);
function approve(address token, address spender, uint160 amount, uint48 expiration) external;
function permit(address owner, PermitSingle memory permitSingle, bytes calldata signature) external;
function permit(address owner, PermitBatch memory permitBatch, bytes calldata signature) external;
function transferFrom(address from, address to, uint160 amount, address token) external;
function transferFrom(AllowanceTransferDetails[] calldata transferDetails) external;
function lockdown(TokenSpenderPair[] calldata approvals) external;
function invalidateNonces(address token, address spender, uint48 newNonce) external;
}
文件 8 的 17:IDiamondCut.sol
pragma solidity ^0.8.0;
interface IDiamondCut {
enum FacetCutAction {
Add,
Replace,
Remove
}
struct FacetCut {
address facetAddress;
FacetCutAction action;
bytes4[] functionSelectors;
}
function diamondCut(FacetCut[] calldata _diamondCut, address _init, bytes calldata _calldata) external;
event DiamondCut(FacetCut[] _diamondCut, address _init, bytes _calldata);
}
文件 9 的 17:IWETH9.sol
pragma solidity 0.8.19;
interface IWETH9 {
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(address src, address dst, uint256 wad) external returns (bool);
function deposit() external payable;
function withdraw(uint256 wad) external;
}
文件 10 的 17:LibBytes.sol
pragma solidity 0.8.19;
library LibBytes {
error SliceOverflow();
error SliceOutOfBounds();
error AddressOutOfBounds();
bytes16 private constant _SYMBOLS = "0123456789abcdef";
function slice(bytes memory _bytes, uint256 _start, uint256 _length) internal pure returns (bytes memory) {
if (_length + 31 < _length) revert SliceOverflow();
if (_bytes.length < _start + _length) revert SliceOutOfBounds();
bytes memory tempBytes;
assembly ("memory-safe") {
switch iszero(_length)
case 0 {
tempBytes := mload(0x40)
let lengthmod := and(_length, 31)
let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))
let end := add(mc, _length)
for {
let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)
} lt(mc, end) {
mc := add(mc, 0x20)
cc := add(cc, 0x20)
} {
mstore(mc, mload(cc))
}
mstore(tempBytes, _length)
mstore(0x40, and(add(mc, 31), not(31)))
}
default {
tempBytes := mload(0x40)
mstore(tempBytes, 0)
mstore(0x40, add(tempBytes, 0x20))
}
}
return tempBytes;
}
function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) {
if (_bytes.length < _start + 20) {
revert AddressOutOfBounds();
}
address tempAddress;
assembly ("memory-safe") {
tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)
}
return tempAddress;
}
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = _SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
}
文件 11 的 17:LibDiamond.sol
pragma solidity 0.8.19;
import {IDiamondCut} from "contracts/Interfaces/IDiamondCut.sol";
import {LibUtil} from "contracts/Libraries/LibUtil.sol";
import {GenericErrors} from "contracts/Errors/GenericErrors.sol";
library LibDiamond {
bytes32 internal constant DIAMOND_STORAGE_POSITION = keccak256("diamond.standard.diamond.storage");
error DiamondError(uint256 errorCode);
uint256 internal constant INCORRECT_FACET_CUT_ACTION = 1;
uint256 internal constant NO_SELECTORS_IN_FACE = 2;
uint256 internal constant FUNCTION_ALREADY_EXISTS = 3;
uint256 internal constant FACET_ADDRESS_IS_ZERO = 4;
uint256 internal constant FACET_ADDRESS_IS_NOT_ZERO = 5;
uint256 internal constant FACET_CONTAINS_NO_CODE = 6;
uint256 internal constant FUNCTION_DOES_NOT_EXIST = 7;
uint256 internal constant FUNCTION_IS_IMMUTABLE = 8;
uint256 internal constant INIT_ZERO_BUT_CALLDATA_NOT_EMPTY = 9;
uint256 internal constant CALLDATA_EMPTY_BUT_INIT_NOT_ZERO = 10;
uint256 internal constant INIT_REVERTED = 11;
struct FacetAddressAndPosition {
address facetAddress;
uint96 functionSelectorPosition;
}
struct FacetFunctionSelectors {
bytes4[] functionSelectors;
uint256 facetAddressPosition;
}
struct DiamondStorage {
mapping(bytes4 => FacetAddressAndPosition) selectorToFacetAndPosition;
mapping(address => FacetFunctionSelectors) facetFunctionSelectors;
address[] facetAddresses;
mapping(bytes4 => bool) supportedInterfaces;
address contractOwner;
}
function diamondStorage() internal pure returns (DiamondStorage storage ds) {
bytes32 position = DIAMOND_STORAGE_POSITION;
assembly ("memory-safe") {
ds.slot := position
}
}
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
function setContractOwner(address _newOwner) internal {
DiamondStorage storage ds = diamondStorage();
address previousOwner = ds.contractOwner;
ds.contractOwner = _newOwner;
emit OwnershipTransferred(previousOwner, _newOwner);
}
function contractOwner() internal view returns (address contractOwner_) {
contractOwner_ = diamondStorage().contractOwner;
}
function enforceIsContractOwner() internal view {
if (msg.sender != diamondStorage().contractOwner)
revert GenericErrors.GenericError(GenericErrors.ONLY_CONTRACT_OWNER);
}
event DiamondCut(IDiamondCut.FacetCut[] _diamondCut, address _init, bytes _calldata);
function diamondCut(IDiamondCut.FacetCut[] memory _diamondCut, address _init, bytes memory _calldata) internal {
for (uint256 facetIndex; facetIndex < _diamondCut.length; ) {
IDiamondCut.FacetCutAction action = _diamondCut[facetIndex].action;
if (action == IDiamondCut.FacetCutAction.Add) {
addFunctions(_diamondCut[facetIndex].facetAddress, _diamondCut[facetIndex].functionSelectors);
} else if (action == IDiamondCut.FacetCutAction.Replace) {
replaceFunctions(_diamondCut[facetIndex].facetAddress, _diamondCut[facetIndex].functionSelectors);
} else if (action == IDiamondCut.FacetCutAction.Remove) {
removeFunctions(_diamondCut[facetIndex].facetAddress, _diamondCut[facetIndex].functionSelectors);
} else {
revert DiamondError(INCORRECT_FACET_CUT_ACTION);
}
unchecked {
++facetIndex;
}
}
emit DiamondCut(_diamondCut, _init, _calldata);
initializeDiamondCut(_init, _calldata);
}
function addFunctions(address _facetAddress, bytes4[] memory _functionSelectors) internal {
if (_functionSelectors.length == 0) {
revert DiamondError(NO_SELECTORS_IN_FACE);
}
DiamondStorage storage ds = diamondStorage();
if (LibUtil.isZeroAddress(_facetAddress)) {
revert DiamondError(FACET_ADDRESS_IS_ZERO);
}
uint96 selectorPosition = uint96(ds.facetFunctionSelectors[_facetAddress].functionSelectors.length);
if (selectorPosition == 0) {
addFacet(ds, _facetAddress);
}
for (uint256 selectorIndex; selectorIndex < _functionSelectors.length; ) {
bytes4 selector = _functionSelectors[selectorIndex];
address oldFacetAddress = ds.selectorToFacetAndPosition[selector].facetAddress;
if (!LibUtil.isZeroAddress(oldFacetAddress)) {
revert DiamondError(FUNCTION_ALREADY_EXISTS);
}
addFunction(ds, selector, selectorPosition, _facetAddress);
unchecked {
++selectorPosition;
++selectorIndex;
}
}
}
function replaceFunctions(address _facetAddress, bytes4[] memory _functionSelectors) internal {
if (_functionSelectors.length == 0) {
revert DiamondError(NO_SELECTORS_IN_FACE);
}
DiamondStorage storage ds = diamondStorage();
if (LibUtil.isZeroAddress(_facetAddress)) {
revert DiamondError(FACET_ADDRESS_IS_ZERO);
}
uint96 selectorPosition = uint96(ds.facetFunctionSelectors[_facetAddress].functionSelectors.length);
if (selectorPosition == 0) {
addFacet(ds, _facetAddress);
}
for (uint256 selectorIndex; selectorIndex < _functionSelectors.length; ) {
bytes4 selector = _functionSelectors[selectorIndex];
address oldFacetAddress = ds.selectorToFacetAndPosition[selector].facetAddress;
if (oldFacetAddress == _facetAddress) {
revert DiamondError(FUNCTION_ALREADY_EXISTS);
}
removeFunction(ds, oldFacetAddress, selector);
addFunction(ds, selector, selectorPosition, _facetAddress);
unchecked {
++selectorPosition;
++selectorIndex;
}
}
}
function removeFunctions(address _facetAddress, bytes4[] memory _functionSelectors) internal {
if (_functionSelectors.length == 0) {
revert DiamondError(NO_SELECTORS_IN_FACE);
}
DiamondStorage storage ds = diamondStorage();
if (!LibUtil.isZeroAddress(_facetAddress)) {
revert DiamondError(FACET_ADDRESS_IS_NOT_ZERO);
}
for (uint256 selectorIndex; selectorIndex < _functionSelectors.length; ) {
bytes4 selector = _functionSelectors[selectorIndex];
address oldFacetAddress = ds.selectorToFacetAndPosition[selector].facetAddress;
removeFunction(ds, oldFacetAddress, selector);
unchecked {
++selectorIndex;
}
}
}
function addFacet(DiamondStorage storage ds, address _facetAddress) internal {
enforceHasContractCode(_facetAddress);
ds.facetFunctionSelectors[_facetAddress].facetAddressPosition = ds.facetAddresses.length;
ds.facetAddresses.push(_facetAddress);
}
function addFunction(
DiamondStorage storage ds,
bytes4 _selector,
uint96 _selectorPosition,
address _facetAddress
) internal {
ds.selectorToFacetAndPosition[_selector].functionSelectorPosition = _selectorPosition;
ds.facetFunctionSelectors[_facetAddress].functionSelectors.push(_selector);
ds.selectorToFacetAndPosition[_selector].facetAddress = _facetAddress;
}
function removeFunction(DiamondStorage storage ds, address _facetAddress, bytes4 _selector) internal {
if (LibUtil.isZeroAddress(_facetAddress)) {
revert DiamondError(FUNCTION_DOES_NOT_EXIST);
}
if (_facetAddress == address(this)) {
revert DiamondError(FUNCTION_IS_IMMUTABLE);
}
uint256 selectorPosition = ds.selectorToFacetAndPosition[_selector].functionSelectorPosition;
uint256 lastSelectorPosition = ds.facetFunctionSelectors[_facetAddress].functionSelectors.length - 1;
if (selectorPosition != lastSelectorPosition) {
bytes4 lastSelector = ds.facetFunctionSelectors[_facetAddress].functionSelectors[lastSelectorPosition];
ds.facetFunctionSelectors[_facetAddress].functionSelectors[selectorPosition] = lastSelector;
ds.selectorToFacetAndPosition[lastSelector].functionSelectorPosition = uint96(selectorPosition);
}
ds.facetFunctionSelectors[_facetAddress].functionSelectors.pop();
delete ds.selectorToFacetAndPosition[_selector];
if (lastSelectorPosition == 0) {
uint256 lastFacetAddressPosition = ds.facetAddresses.length - 1;
uint256 facetAddressPosition = ds.facetFunctionSelectors[_facetAddress].facetAddressPosition;
if (facetAddressPosition != lastFacetAddressPosition) {
address lastFacetAddress = ds.facetAddresses[lastFacetAddressPosition];
ds.facetAddresses[facetAddressPosition] = lastFacetAddress;
ds.facetFunctionSelectors[lastFacetAddress].facetAddressPosition = facetAddressPosition;
}
ds.facetAddresses.pop();
delete ds.facetFunctionSelectors[_facetAddress].facetAddressPosition;
}
}
function initializeDiamondCut(address _init, bytes memory _calldata) internal {
if (LibUtil.isZeroAddress(_init)) {
if (_calldata.length != 0) {
revert DiamondError(INIT_ZERO_BUT_CALLDATA_NOT_EMPTY);
}
} else {
if (_calldata.length == 0) {
revert DiamondError(CALLDATA_EMPTY_BUT_INIT_NOT_ZERO);
}
if (_init != address(this)) {
enforceHasContractCode(_init);
}
(bool success, bytes memory error) = _init.delegatecall(_calldata);
if (!success) {
if (error.length > 0) {
assembly ("memory-safe") {
let returndata_size := mload(error)
revert(add(32, error), returndata_size)
}
} else {
revert DiamondError(INIT_REVERTED);
}
}
}
}
function enforceHasContractCode(address _contract) internal view {
uint256 contractSize;
assembly ("memory-safe") {
contractSize := extcodesize(_contract)
}
if (contractSize == 0) {
revert DiamondError(FACET_CONTAINS_NO_CODE);
}
}
}
文件 12 的 17:LibPayments.sol
pragma solidity 0.8.19;
import {GenericErrors} from "contracts/Errors/GenericErrors.sol";
import {SafeCast160} from "permit2/src/libraries/SafeCast160.sol";
import {SafeTransferLib} from "contracts/Libraries/SafeTransferLib.sol";
import {Constants} from "contracts/Libraries/Constants.sol";
import {ERC20} from "solmate/tokens/ERC20.sol";
import {ERC721} from "solmate/tokens/ERC721.sol";
import {ERC1155} from "solmate/tokens/ERC1155.sol";
import {IWETH9} from "contracts/Interfaces/IWETH9.sol";
import {IAllowanceTransfer} from "permit2/src/interfaces/IAllowanceTransfer.sol";
import {UniERC20} from "contracts/Libraries/UniERC20.sol";
type Recipient is address;
type Payer is address;
library LibPayments {
using SafeTransferLib for address;
using SafeCast160 for uint256;
using UniERC20 for address;
bytes32 internal constant NAMESPACE = bytes32(0x6a2b33915c87ebbd2e7a47520fe4aaa6f0e18ef6bdebd64915d7aeced08d447e);
uint256 internal constant FEE_BIPS_BASE = 10_000;
struct PaymentStorage {
uint256 fee;
address feeCollector;
address WETH9;
address PERMIT2;
bool initialized;
}
event FeeChanged(uint256 feeOld, uint256 feeNew);
event FeeCollectorChanged(address feeCollectorOld, address feeCollectorNew);
event PaymentInitialized(address indexed weth9, address indexed permit2, address indexed feeCollector, uint256 fee);
function paymentStorage() internal pure returns (PaymentStorage storage payStor) {
bytes32 position = NAMESPACE;
assembly ("memory-safe") {
payStor.slot := position
}
}
function setFee(uint256 fee) internal {
PaymentStorage storage payStor = paymentStorage();
if (fee > FEE_BIPS_BASE / 10) {
revert GenericErrors.GenericError(GenericErrors.INVALID_FEE_AMOUNT);
}
emit FeeChanged(payStor.fee, fee);
payStor.fee = fee;
}
function changeFeeCollector(address feeCollector) internal {
PaymentStorage storage payStor = paymentStorage();
emit FeeCollectorChanged(payStor.feeCollector, feeCollector);
payStor.feeCollector = feeCollector;
}
function initializePayment(address weth9, address permit2, address feeCollector, uint256 fee) internal {
PaymentStorage storage payStor = paymentStorage();
if (!payStor.initialized) {
payStor.WETH9 = weth9;
payStor.PERMIT2 = permit2;
payStor.feeCollector = feeCollector;
payStor.fee = fee;
payStor.initialized = true;
} else {
revert GenericErrors.GenericError(GenericErrors.ALREADY_INITIALIZED);
}
emit PaymentInitialized(weth9, permit2, feeCollector, fee);
}
function WETH() internal view returns (address) {
return paymentStorage().WETH9;
}
function map(Recipient recipient) internal view returns (Recipient outRecipient) {
if (Recipient.unwrap(recipient) == Constants.MSG_SENDER) {
outRecipient = Recipient.wrap(msg.sender);
} else if (Recipient.unwrap(recipient) == Constants.ADDRESS_THIS) {
outRecipient = Recipient.wrap(address(this));
} else if (UniERC20.isETH(Recipient.unwrap(recipient))) {
outRecipient = Recipient.wrap(msg.sender);
} else {
outRecipient = recipient;
}
}
function payerMap(Payer payer) internal view returns (Payer outPayer) {
if (Payer.unwrap(payer) == Constants.MSG_SENDER) {
outPayer = Payer.wrap(msg.sender);
} else if (Payer.unwrap(payer) == Constants.ADDRESS_THIS) {
outPayer = Payer.wrap(address(this));
} else {
revert GenericErrors.GenericError(GenericErrors.INVALID_PARAMS);
}
}
function pay(address token, Recipient recipient, uint256 value) internal {
if (Recipient.unwrap(recipient) == address(this)) return;
if (token.isETH()) {
Recipient.unwrap(recipient).safeTransferETH(value);
} else {
if (value == Constants.CONTRACT_BALANCE) {
value = token.balanceOf(address(this));
}
token.safeTransfer(Recipient.unwrap(recipient), value);
}
}
function payPortion(address token, Recipient recipient, uint256 bips) internal {
if (bips == 0 || bips > 10_000) revert GenericErrors.GenericError(GenericErrors.INVALID_BIPS);
if (token.isETH()) {
uint256 balance = address(this).balance;
uint256 amount = (balance * bips) / FEE_BIPS_BASE;
Recipient.unwrap(recipient).safeTransferETH(amount);
} else {
uint256 balance = ERC20(token).balanceOf(address(this));
uint256 amount = (balance * bips) / FEE_BIPS_BASE;
token.safeTransfer(Recipient.unwrap(recipient), amount);
}
}
function sweep(address token, Recipient recipient, uint256 amountMinimum) internal {
uint256 balance;
if (token.isETH()) {
balance = address(this).balance;
if (balance < amountMinimum) revert GenericErrors.GenericError(GenericErrors.INSUFFICIENT_VALUE);
if (balance > 0) Recipient.unwrap(recipient).safeTransferETH(balance);
} else {
balance = token.balanceOf(address(this));
if (balance < amountMinimum) revert GenericErrors.GenericError(GenericErrors.INSUFFICIENT_TOKEN);
if (balance > 0) token.safeTransfer(Recipient.unwrap(recipient), balance);
}
}
function sweepERC721(address token, Recipient recipient, uint256 id) internal {
ERC721(token).safeTransferFrom(address(this), Recipient.unwrap(recipient), id);
}
function sweepERC1155(address token, Recipient recipient, uint256 id, uint256 amountMinimum) internal {
uint256 balance = ERC1155(token).balanceOf(address(this), id);
if (balance < amountMinimum) revert GenericErrors.GenericError(GenericErrors.INSUFFICIENT_TOKEN);
ERC1155(token).safeTransferFrom(address(this), Recipient.unwrap(recipient), id, balance, bytes(""));
}
function wrapETH(Recipient recipient, uint256 amount) internal returns (uint256 amountOut) {
if (amount == Constants.CONTRACT_BALANCE) {
amount = address(this).balance;
} else if (amount > address(this).balance) {
revert GenericErrors.GenericError(GenericErrors.INSUFFICIENT_VALUE);
}
if (amount > 0) {
PaymentStorage storage ps = paymentStorage();
IWETH9(ps.WETH9).deposit{value: amount}();
if (Recipient.unwrap(recipient) != address(this)) {
IWETH9(ps.WETH9).transfer(Recipient.unwrap(recipient), amount);
}
}
amountOut = amount;
}
function unwrapWETH9(Recipient recipient, uint256 amount) internal returns (uint256 amountOut) {
PaymentStorage storage ps = paymentStorage();
if (IWETH9(ps.WETH9).balanceOf(address(this)) < amount) {
revert GenericErrors.GenericError(GenericErrors.INSUFFICIENT_VALUE);
}
IWETH9(ps.WETH9).withdraw(amount);
if (Recipient.unwrap(recipient) != address(this)) {
Recipient.unwrap(recipient).safeTransferETH(amount);
}
amountOut = amount;
}
function approveMax(address token, address spender, uint256 amount) internal {
PaymentStorage storage ps = paymentStorage();
(uint256 allowance, , ) = IAllowanceTransfer(ps.PERMIT2).allowance(address(this), token, spender);
if (allowance < amount) {
IAllowanceTransfer(ps.PERMIT2).approve(token, spender, type(uint160).max, type(uint48).max);
}
}
function approveWithOutExpiration(address token, address spender, uint256 amount) internal {
PaymentStorage storage ps = paymentStorage();
IAllowanceTransfer(ps.PERMIT2).approve(token, spender, amount.toUint160(), type(uint48).max);
}
function permit(
address owner,
IAllowanceTransfer.PermitSingle memory permitSingle,
bytes memory signature
) internal {
PaymentStorage storage ps = paymentStorage();
IAllowanceTransfer(ps.PERMIT2).permit(owner, permitSingle, signature);
}
function permit(address owner, IAllowanceTransfer.PermitBatch memory permitBatch, bytes memory signature) internal {
PaymentStorage storage ps = paymentStorage();
IAllowanceTransfer(ps.PERMIT2).permit(owner, permitBatch, signature);
}
function permit2TransferFrom(address token, address from, address to, uint160 amount) internal {
_permit2TransferFrom(token, from, to, amount);
}
function permit2TransferFrom(IAllowanceTransfer.AllowanceTransferDetails[] memory batchDetails) internal {
address owner = msg.sender;
uint256 batchLength = batchDetails.length;
PaymentStorage storage ps = paymentStorage();
for (uint256 i = 0; i < batchLength; ++i) {
if (batchDetails[i].from != owner) revert GenericErrors.GenericError(GenericErrors.FROM_ADDR_IS_NOT_OWNER);
}
for (uint256 i = 0; i < batchLength; ++i) {
_permit2TransferFrom(
batchDetails[i].token,
batchDetails[i].from,
batchDetails[i].to,
batchDetails[i].amount
);
}
}
function payOrPermit2Transfer(address token, Payer payer, Recipient recipient, uint256 amount) internal {
if (Payer.unwrap(payer) == address(this)) pay(token, recipient, amount);
else payFrom(token, payer, recipient, amount.toUint160());
}
function payFrom(address token, Payer payer, Recipient recipient, uint256 amount) internal {
if (Payer.unwrap(payer) == Recipient.unwrap(recipient)) return;
if (!token.isETH()) {
_permit2TransferFrom(token, Payer.unwrap(payer), Recipient.unwrap(recipient), amount.toUint160());
}
}
function _permit2TransferFrom(address token, address from, address to, uint160 amount) internal {
if (from == to) return;
PaymentStorage storage ps = paymentStorage();
IAllowanceTransfer(ps.PERMIT2).transferFrom(from, to, amount, token);
}
}
文件 13 的 17:LibUtil.sol
pragma solidity 0.8.19;
import "./LibBytes.sol";
library LibUtil {
using LibBytes for bytes;
function getRevertMsg(bytes memory _res) internal pure returns (string memory) {
if (_res.length < 68) return "Transaction reverted silently";
bytes memory revertData = _res.slice(4, _res.length - 4);
return abi.decode(revertData, (string));
}
function isZeroAddress(address addr) internal pure returns (bool) {
return addr == address(0);
}
}
文件 14 的 17:SafeCast160.sol
pragma solidity ^0.8.17;
library SafeCast160 {
error UnsafeCast();
function toUint160(uint256 value) internal pure returns (uint160) {
if (value > type(uint160).max) revert UnsafeCast();
return uint160(value);
}
}
文件 15 的 17:SafeTransferLib.sol
pragma solidity ^0.8.4;
library SafeTransferLib {
error ETHTransferFailed();
error TransferFromFailed();
error TransferFailed();
error ApproveFailed();
uint256 internal constant GAS_STIPEND_NO_STORAGE_WRITES = 2300;
uint256 internal constant GAS_STIPEND_NO_GRIEF = 100000;
function safeTransferETH(address to, uint256 amount) internal {
assembly {
if iszero(call(gas(), to, amount, gas(), 0x00, gas(), 0x00)) {
mstore(0x00, 0xb12d13eb)
revert(0x1c, 0x04)
}
}
}
function safeTransferAllETH(address to) internal {
assembly {
if iszero(call(gas(), to, selfbalance(), gas(), 0x00, gas(), 0x00)) {
mstore(0x00, 0xb12d13eb)
revert(0x1c, 0x04)
}
}
}
function forceSafeTransferETH(address to, uint256 amount, uint256 gasStipend) internal {
assembly {
if lt(selfbalance(), amount) {
mstore(0x00, 0xb12d13eb)
revert(0x1c, 0x04)
}
if iszero(call(gasStipend, to, amount, gas(), 0x00, gas(), 0x00)) {
mstore(0x00, to)
mstore8(0x0b, 0x73)
mstore8(0x20, 0xff)
if iszero(create(amount, 0x0b, 0x16)) {
returndatacopy(gas(), returndatasize(), shr(20, gas()))
}
}
}
}
function forceSafeTransferAllETH(address to, uint256 gasStipend) internal {
assembly {
if iszero(call(gasStipend, to, selfbalance(), gas(), 0x00, gas(), 0x00)) {
mstore(0x00, to)
mstore8(0x0b, 0x73)
mstore8(0x20, 0xff)
if iszero(create(selfbalance(), 0x0b, 0x16)) {
returndatacopy(gas(), returndatasize(), shr(20, gas()))
}
}
}
}
function forceSafeTransferETH(address to, uint256 amount) internal {
assembly {
if lt(selfbalance(), amount) {
mstore(0x00, 0xb12d13eb)
revert(0x1c, 0x04)
}
if iszero(call(GAS_STIPEND_NO_GRIEF, to, amount, gas(), 0x00, gas(), 0x00)) {
mstore(0x00, to)
mstore8(0x0b, 0x73)
mstore8(0x20, 0xff)
if iszero(create(amount, 0x0b, 0x16)) {
returndatacopy(gas(), returndatasize(), shr(20, gas()))
}
}
}
}
function forceSafeTransferAllETH(address to) internal {
assembly {
if iszero(call(GAS_STIPEND_NO_GRIEF, to, selfbalance(), gas(), 0x00, gas(), 0x00)) {
mstore(0x00, to)
mstore8(0x0b, 0x73)
mstore8(0x20, 0xff)
if iszero(create(selfbalance(), 0x0b, 0x16)) {
returndatacopy(gas(), returndatasize(), shr(20, gas()))
}
}
}
}
function trySafeTransferETH(address to, uint256 amount, uint256 gasStipend) internal returns (bool success) {
assembly {
success := call(gasStipend, to, amount, gas(), 0x00, gas(), 0x00)
}
}
function trySafeTransferAllETH(address to, uint256 gasStipend) internal returns (bool success) {
assembly {
success := call(gasStipend, to, selfbalance(), gas(), 0x00, gas(), 0x00)
}
}
function safeTransferFrom(address token, address from, address to, uint256 amount) internal {
assembly {
let m := mload(0x40)
mstore(0x60, amount)
mstore(0x40, to)
mstore(0x2c, shl(96, from))
mstore(0x0c, 0x23b872dd000000000000000000000000)
if iszero(
and(
or(eq(mload(0x00), 1), iszero(returndatasize())),
call(gas(), token, 0, 0x1c, 0x64, 0x00, 0x20)
)
) {
mstore(0x00, 0x7939f424)
revert(0x1c, 0x04)
}
mstore(0x60, 0)
mstore(0x40, m)
}
}
function safeTransferAllFrom(address token, address from, address to) internal returns (uint256 amount) {
assembly {
let m := mload(0x40)
mstore(0x40, to)
mstore(0x2c, shl(96, from))
mstore(0x0c, 0x70a08231000000000000000000000000)
if iszero(
and(
gt(returndatasize(), 0x1f),
staticcall(gas(), token, 0x1c, 0x24, 0x60, 0x20)
)
) {
mstore(0x00, 0x7939f424)
revert(0x1c, 0x04)
}
mstore(0x00, 0x23b872dd)
amount := mload(0x60)
if iszero(
and(
or(eq(mload(0x00), 1), iszero(returndatasize())),
call(gas(), token, 0, 0x1c, 0x64, 0x00, 0x20)
)
) {
mstore(0x00, 0x7939f424)
revert(0x1c, 0x04)
}
mstore(0x60, 0)
mstore(0x40, m)
}
}
function safeTransfer(address token, address to, uint256 amount) internal {
assembly {
mstore(0x14, to)
mstore(0x34, amount)
mstore(0x00, 0xa9059cbb000000000000000000000000)
if iszero(
and(
or(eq(mload(0x00), 1), iszero(returndatasize())),
call(gas(), token, 0, 0x10, 0x44, 0x00, 0x20)
)
) {
mstore(0x00, 0x90b8ec18)
revert(0x1c, 0x04)
}
mstore(0x34, 0)
}
}
function safeTransferAll(address token, address to) internal returns (uint256 amount) {
assembly {
mstore(0x00, 0x70a08231)
mstore(0x20, address())
if iszero(
and(
gt(returndatasize(), 0x1f),
staticcall(gas(), token, 0x1c, 0x24, 0x34, 0x20)
)
) {
mstore(0x00, 0x90b8ec18)
revert(0x1c, 0x04)
}
mstore(0x14, to)
amount := mload(0x34)
mstore(0x00, 0xa9059cbb000000000000000000000000)
if iszero(
and(
or(eq(mload(0x00), 1), iszero(returndatasize())),
call(gas(), token, 0, 0x10, 0x44, 0x00, 0x20)
)
) {
mstore(0x00, 0x90b8ec18)
revert(0x1c, 0x04)
}
mstore(0x34, 0)
}
}
function safeApprove(address token, address to, uint256 amount) internal {
assembly {
mstore(0x14, to)
mstore(0x34, amount)
mstore(0x00, 0x095ea7b3000000000000000000000000)
if iszero(
and(
or(eq(mload(0x00), 1), iszero(returndatasize())),
call(gas(), token, 0, 0x10, 0x44, 0x00, 0x20)
)
) {
mstore(0x00, 0x3e3f8f73)
revert(0x1c, 0x04)
}
mstore(0x34, 0)
}
}
function safeApproveWithRetry(address token, address to, uint256 amount) internal {
assembly {
mstore(0x14, to)
mstore(0x34, amount)
mstore(0x00, 0x095ea7b3000000000000000000000000)
if iszero(
and(
or(eq(mload(0x00), 1), iszero(returndatasize())),
call(gas(), token, 0, 0x10, 0x44, 0x00, 0x20)
)
) {
mstore(0x34, 0)
mstore(0x00, 0x095ea7b3000000000000000000000000)
pop(call(gas(), token, 0, 0x10, 0x44, 0x00, 0x00))
mstore(0x34, amount)
if iszero(
and(
or(eq(mload(0x00), 1), iszero(returndatasize())),
call(gas(), token, 0, 0x10, 0x44, 0x00, 0x20)
)
) {
mstore(0x00, 0x3e3f8f73)
revert(0x1c, 0x04)
}
}
mstore(0x34, 0)
}
}
function balanceOf(address token, address account) internal view returns (uint256 amount) {
assembly {
mstore(0x14, account)
mstore(0x00, 0x70a08231000000000000000000000000)
amount := mul(
mload(0x20),
and(
gt(returndatasize(), 0x1f),
staticcall(gas(), token, 0x10, 0x24, 0x20, 0x20)
)
)
}
}
}
文件 16 的 17:TransferrableOwnership.sol
pragma solidity ^0.8.4;
contract TransferrableOwnership {
error Unauthorized();
error NewOwnerIsZeroAddress();
error NoHandoverRequest();
event OwnershipTransferred(address indexed oldOwner, address indexed newOwner);
event OwnershipHandoverRequested(address indexed pendingOwner);
event OwnershipHandoverCanceled(address indexed pendingOwner);
uint256 private constant _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE =
0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0;
uint256 private constant _OWNERSHIP_HANDOVER_REQUESTED_EVENT_SIGNATURE =
0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d;
uint256 private constant _OWNERSHIP_HANDOVER_CANCELED_EVENT_SIGNATURE =
0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92;
uint256 private constant _OWNER_SLOT_NOT = 0x8b78c6d8;
uint256 private constant _HANDOVER_SLOT_SEED = 0x389a75e1;
constructor(address newOwner) {
if (newOwner != address(0)) {
_initializeOwner(newOwner);
}
}
function _initializeOwner(address newOwner) internal virtual {
assembly ("memory-safe") {
newOwner := shr(96, shl(96, newOwner))
sstore(not(_OWNER_SLOT_NOT), newOwner)
log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, 0, newOwner)
}
}
function _setOwner(address newOwner) internal virtual {
assembly ("memory-safe") {
let ownerSlot := not(_OWNER_SLOT_NOT)
newOwner := shr(96, shl(96, newOwner))
log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, sload(ownerSlot), newOwner)
sstore(ownerSlot, newOwner)
}
}
function _checkOwner() internal view virtual {
assembly ("memory-safe") {
if iszero(eq(caller(), sload(not(_OWNER_SLOT_NOT)))) {
mstore(0x00, 0x82b42900)
revert(0x1c, 0x04)
}
}
}
function transferOwnership(address newOwner) public payable virtual onlyOwner {
assembly ("memory-safe") {
if iszero(shl(96, newOwner)) {
mstore(0x00, 0x7448fbae)
revert(0x1c, 0x04)
}
}
_setOwner(newOwner);
}
function requestOwnershipHandover() public payable virtual {
unchecked {
uint256 expires = block.timestamp + ownershipHandoverValidFor();
assembly ("memory-safe") {
mstore(0x0c, _HANDOVER_SLOT_SEED)
mstore(0x00, caller())
sstore(keccak256(0x0c, 0x20), expires)
log2(0, 0, _OWNERSHIP_HANDOVER_REQUESTED_EVENT_SIGNATURE, caller())
}
}
}
function cancelOwnershipTransfer() public payable virtual {
assembly ("memory-safe") {
mstore(0x0c, _HANDOVER_SLOT_SEED)
mstore(0x00, caller())
sstore(keccak256(0x0c, 0x20), 0)
log2(0, 0, _OWNERSHIP_HANDOVER_CANCELED_EVENT_SIGNATURE, caller())
}
}
function confirmOwnershipTransfer(address pendingOwner) public payable virtual onlyOwner {
assembly ("memory-safe") {
mstore(0x0c, _HANDOVER_SLOT_SEED)
mstore(0x00, pendingOwner)
let handoverSlot := keccak256(0x0c, 0x20)
if gt(timestamp(), sload(handoverSlot)) {
mstore(0x00, 0x6f5e8818)
revert(0x1c, 0x04)
}
sstore(handoverSlot, 0)
}
_setOwner(pendingOwner);
}
function owner() public view virtual returns (address result) {
assembly ("memory-safe") {
result := sload(not(_OWNER_SLOT_NOT))
}
}
function ownershipHandoverExpiresAt(address pendingOwner) public view virtual returns (uint256 result) {
assembly ("memory-safe") {
mstore(0x0c, _HANDOVER_SLOT_SEED)
mstore(0x00, pendingOwner)
result := sload(keccak256(0x0c, 0x20))
}
}
function ownershipHandoverValidFor() public view virtual returns (uint64) {
return 48 * 3600;
}
modifier onlyOwner() virtual {
_checkOwner();
_;
}
}
文件 17 的 17:UniERC20.sol
pragma solidity ^0.8.4;
import {ERC20} from "solmate/tokens/ERC20.sol";
import {SafeTransferLib} from "./SafeTransferLib.sol";
library UniERC20 {
using SafeTransferLib for address;
address internal constant ZERO_ADDRESS = address(0);
address internal constant ETH_ADDRESS = address(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE);
address internal constant MATIC_ADDRESS = address(0x0000000000000000000000000000000000001010);
function uniApprove(address token, address to, uint256 amount) internal {
if (!isETH(token)) {
if (amount == 0) {
token.safeApproveWithRetry(to, 0);
} else {
uint256 allowance = ERC20(token).allowance(address(this), to);
token.safeApproveWithRetry(to, amount);
}
}
}
function uniApproveMax(address token, address to, uint256 amount) internal {
if (!isETH(token)) {
uint256 allowance = ERC20(token).allowance(address(this), to);
token.safeApproveWithRetry(to, type(uint256).max);
}
}
function uniTransfer(address token, address payable to, uint256 amount) internal {
if (amount > 0) {
if (isETH(token)) {
to.call{value: amount}("");
} else {
token.safeTransfer(to, amount);
}
}
}
function uniBalanceOf(address token, address account) internal view returns (uint256) {
if (isETH(token)) {
return account.balance;
} else {
return token.balanceOf(account);
}
}
function isETH(address token) internal pure returns (bool) {
return
address(token) == address(ETH_ADDRESS) ||
address(token) == address(MATIC_ADDRESS) ||
address(token) == address(ZERO_ADDRESS);
}
}
{
"compilationTarget": {
"contracts/EisenDiamond.sol": "EisenDiamond"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 100000
},
"remappings": [
":@1inch/=node_modules/@1inch/",
":@chainlink/=node_modules/@chainlink/",
":@connext/=node_modules/@connext/",
":@ensdomains/=node_modules/@ensdomains/",
":@eth-optimism/=node_modules/@hop-protocol/sdk/node_modules/@eth-optimism/",
":@openzeppelin/=node_modules/@openzeppelin/",
":@uniswap/=node_modules/@uniswap/",
":base64-sol/=node_modules/base64-sol/",
":celer-network/=lib/sgn-v2-contracts/",
":create3-factory/=lib/create3-factory/src/",
":ds-test/=lib/forge-std/lib/ds-test/src/",
":eisen/=contracts/",
":era-contracts/=lib/foundry-zksync-era/lib/era-contracts/",
":era-system-contracts/=lib/foundry-zksync-era/lib/era-system-contracts/",
":eth-gas-reporter/=node_modules/eth-gas-reporter/",
":forge-gas-snapshot/=lib/permit2/lib/forge-gas-snapshot/src/",
":forge-std/=lib/forge-std/src/",
":foundry-zksync-era/=lib/foundry-zksync-era/",
":hardhat-deploy/=node_modules/hardhat-deploy/",
":hardhat/=node_modules/hardhat/",
":openzeppelin-contracts/=lib/permit2/lib/openzeppelin-contracts/",
":permit2/=lib/permit2/",
":sgn-v2-contracts/=lib/sgn-v2-contracts/contracts/",
":solady-gas-optimization/=lib/solady-gas-optimization/",
":solady/=node_modules/solady/",
":solidity-stringutils/=lib/foundry-zksync-era/lib/solidity-stringutils/",
":solmate/=lib/solmate/src/"
],
"viaIR": true
}
[{"inputs":[{"internalType":"address","name":"_contractOwner","type":"address"},{"internalType":"address","name":"_diamondCutFacet","type":"address"},{"internalType":"address","name":"weth9","type":"address"},{"internalType":"address","name":"permit2","type":"address"},{"internalType":"uint256","name":"fee","type":"uint256"}],"stateMutability":"payable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"errorCode","type":"uint256"}],"name":"DiamondError","type":"error"},{"inputs":[{"internalType":"uint256","name":"errorCode","type":"uint256"}],"name":"GenericError","type":"error"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"address","name":"feeCollector","type":"address"}],"name":"changeFeeCollector","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]