编译器
0.8.17+commit.8df45f5f
文件 1 的 12:AddressUtils.sol
pragma solidity ^0.8.8;
import { UintUtils } from './UintUtils.sol';
library AddressUtils {
using UintUtils for uint256;
error AddressUtils__InsufficientBalance();
error AddressUtils__NotContract();
error AddressUtils__SendValueFailed();
function toString(address account) internal pure returns (string memory) {
return uint256(uint160(account)).toHexString(20);
}
function isContract(address account) internal view returns (bool) {
uint256 size;
assembly {
size := extcodesize(account)
}
return size > 0;
}
function sendValue(address payable account, uint256 amount) internal {
(bool success, ) = account.call{ value: amount }('');
if (!success) revert AddressUtils__SendValueFailed();
}
function functionCall(
address target,
bytes memory data
) internal returns (bytes memory) {
return
functionCall(target, data, 'AddressUtils: failed low-level call');
}
function functionCall(
address target,
bytes memory data,
string memory error
) internal returns (bytes memory) {
return _functionCallWithValue(target, data, 0, error);
}
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return
functionCallWithValue(
target,
data,
value,
'AddressUtils: failed low-level call with value'
);
}
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory error
) internal returns (bytes memory) {
if (value > address(this).balance)
revert AddressUtils__InsufficientBalance();
return _functionCallWithValue(target, data, value, error);
}
function excessivelySafeCall(
address target,
uint256 gasAmount,
uint256 value,
uint16 maxCopy,
bytes memory data
) internal returns (bool success, bytes memory returnData) {
returnData = new bytes(maxCopy);
assembly {
success := call(
gasAmount,
target,
value,
add(data, 0x20),
mload(data),
0,
0
)
let toCopy := returndatasize()
if gt(toCopy, maxCopy) {
toCopy := maxCopy
}
mstore(returnData, toCopy)
returndatacopy(add(returnData, 0x20), 0, toCopy)
}
}
function _functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory error
) private returns (bytes memory) {
if (!isContract(target)) revert AddressUtils__NotContract();
(bool success, bytes memory returnData) = target.call{ value: value }(
data
);
if (success) {
return returnData;
} else if (returnData.length > 0) {
assembly {
let returnData_size := mload(returnData)
revert(add(32, returnData), returnData_size)
}
} else {
revert(error);
}
}
}
文件 2 的 12:ERC721MetadataStorage.sol
pragma solidity ^0.8.8;
library ERC721MetadataStorage {
bytes32 internal constant STORAGE_SLOT =
keccak256('solidstate.contracts.storage.ERC721Metadata');
struct Layout {
string name;
string symbol;
string baseURI;
mapping(uint256 => string) tokenURIs;
}
function layout() internal pure returns (Layout storage l) {
bytes32 slot = STORAGE_SLOT;
assembly {
l.slot := slot
}
}
}
文件 3 的 12:EnumerableSet.sol
pragma solidity ^0.8.8;
library EnumerableSet {
error EnumerableSet__IndexOutOfBounds();
struct Set {
bytes32[] _values;
mapping(bytes32 => uint256) _indexes;
}
struct Bytes32Set {
Set _inner;
}
struct AddressSet {
Set _inner;
}
struct UintSet {
Set _inner;
}
function at(
Bytes32Set storage set,
uint256 index
) internal view returns (bytes32) {
return _at(set._inner, index);
}
function at(
AddressSet storage set,
uint256 index
) internal view returns (address) {
return address(uint160(uint256(_at(set._inner, index))));
}
function at(
UintSet storage set,
uint256 index
) internal view returns (uint256) {
return uint256(_at(set._inner, index));
}
function contains(
Bytes32Set storage set,
bytes32 value
) internal view returns (bool) {
return _contains(set._inner, value);
}
function contains(
AddressSet storage set,
address value
) internal view returns (bool) {
return _contains(set._inner, bytes32(uint256(uint160(value))));
}
function contains(
UintSet storage set,
uint256 value
) internal view returns (bool) {
return _contains(set._inner, bytes32(value));
}
function indexOf(
Bytes32Set storage set,
bytes32 value
) internal view returns (uint256) {
return _indexOf(set._inner, value);
}
function indexOf(
AddressSet storage set,
address value
) internal view returns (uint256) {
return _indexOf(set._inner, bytes32(uint256(uint160(value))));
}
function indexOf(
UintSet storage set,
uint256 value
) internal view returns (uint256) {
return _indexOf(set._inner, bytes32(value));
}
function length(Bytes32Set storage set) internal view returns (uint256) {
return _length(set._inner);
}
function length(AddressSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
function length(UintSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
function add(
Bytes32Set storage set,
bytes32 value
) internal returns (bool) {
return _add(set._inner, value);
}
function add(
AddressSet storage set,
address value
) internal returns (bool) {
return _add(set._inner, bytes32(uint256(uint160(value))));
}
function add(UintSet storage set, uint256 value) internal returns (bool) {
return _add(set._inner, bytes32(value));
}
function remove(
Bytes32Set storage set,
bytes32 value
) internal returns (bool) {
return _remove(set._inner, value);
}
function remove(
AddressSet storage set,
address value
) internal returns (bool) {
return _remove(set._inner, bytes32(uint256(uint160(value))));
}
function remove(
UintSet storage set,
uint256 value
) internal returns (bool) {
return _remove(set._inner, bytes32(value));
}
function toArray(
Bytes32Set storage set
) internal view returns (bytes32[] memory) {
return set._inner._values;
}
function toArray(
AddressSet storage set
) internal view returns (address[] memory) {
bytes32[] storage values = set._inner._values;
address[] storage array;
assembly {
array.slot := values.slot
}
return array;
}
function toArray(
UintSet storage set
) internal view returns (uint256[] memory) {
bytes32[] storage values = set._inner._values;
uint256[] storage array;
assembly {
array.slot := values.slot
}
return array;
}
function _at(
Set storage set,
uint256 index
) private view returns (bytes32) {
if (index >= set._values.length)
revert EnumerableSet__IndexOutOfBounds();
return set._values[index];
}
function _contains(
Set storage set,
bytes32 value
) private view returns (bool) {
return set._indexes[value] != 0;
}
function _indexOf(
Set storage set,
bytes32 value
) private view returns (uint256) {
unchecked {
return set._indexes[value] - 1;
}
}
function _length(Set storage set) private view returns (uint256) {
return set._values.length;
}
function _add(
Set storage set,
bytes32 value
) private returns (bool status) {
if (!_contains(set, value)) {
set._values.push(value);
set._indexes[value] = set._values.length;
status = true;
}
}
function _remove(
Set storage set,
bytes32 value
) private returns (bool status) {
uint256 valueIndex = set._indexes[value];
if (valueIndex != 0) {
unchecked {
bytes32 last = set._values[set._values.length - 1];
set._values[valueIndex - 1] = last;
set._indexes[last] = valueIndex;
}
set._values.pop();
delete set._indexes[value];
status = true;
}
}
}
文件 4 的 12:IDiamondReadable.sol
pragma solidity ^0.8.8;
interface IDiamondReadable {
struct Facet {
address target;
bytes4[] selectors;
}
function facets() external view returns (Facet[] memory diamondFacets);
function facetFunctionSelectors(
address facet
) external view returns (bytes4[] memory selectors);
function facetAddresses()
external
view
returns (address[] memory addresses);
function facetAddress(
bytes4 selector
) external view returns (address facet);
}
文件 5 的 12:IProxy.sol
pragma solidity ^0.8.8;
interface IProxy {
error Proxy__ImplementationIsNotContract();
fallback() external payable;
}
文件 6 的 12:IShardVaultProxy.sol
pragma solidity ^0.8.0;
interface IShardVaultProxy {
event MarketPlaceHelperProxyDeployed(address marketPlacerHelperProxy);
struct ShardVaultAddresses {
address shardVaultDiamond;
address marketPlaceHelper;
address collection;
address jpegdVault;
address jpegdVaultHelper;
address whitelist;
address[] authorized;
}
struct ShardVaultUints {
uint256 shardValue;
uint64 maxSupply;
uint64 maxMintBalance;
uint16 saleFeeBP;
uint16 acquisitionFeeBP;
uint16 yieldFeeBP;
uint16 ltvBufferBP;
uint16 ltvDeviationBP;
}
}
文件 7 的 12:MarketPlaceHelperProxy.sol
pragma solidity ^0.8.0;
import { OwnableStorage } from '@solidstate/contracts/access/ownable/OwnableStorage.sol';
import { Proxy } from '@solidstate/contracts/proxy/Proxy.sol';
contract MarketPlaceHelperProxy is Proxy {
address private immutable MARKETPLACE_HELPER_IMPLEMENTATION;
constructor(address marketplaceHelperImplementation) {
MARKETPLACE_HELPER_IMPLEMENTATION = marketplaceHelperImplementation;
OwnableStorage.layout().owner = msg.sender;
}
function _getImplementation() internal view override returns (address) {
return MARKETPLACE_HELPER_IMPLEMENTATION;
}
receive() external payable {}
}
文件 8 的 12:OwnableStorage.sol
pragma solidity ^0.8.8;
library OwnableStorage {
struct Layout {
address owner;
}
bytes32 internal constant STORAGE_SLOT =
keccak256('solidstate.contracts.storage.Ownable');
function layout() internal pure returns (Layout storage l) {
bytes32 slot = STORAGE_SLOT;
assembly {
l.slot := slot
}
}
}
文件 9 的 12:Proxy.sol
pragma solidity ^0.8.8;
import { AddressUtils } from '../utils/AddressUtils.sol';
import { IProxy } from './IProxy.sol';
abstract contract Proxy is IProxy {
using AddressUtils for address;
fallback() external payable virtual {
address implementation = _getImplementation();
if (!implementation.isContract())
revert Proxy__ImplementationIsNotContract();
assembly {
calldatacopy(0, 0, calldatasize())
let result := delegatecall(
gas(),
implementation,
0,
calldatasize(),
0,
0
)
returndatacopy(0, 0, returndatasize())
switch result
case 0 {
revert(0, returndatasize())
}
default {
return(0, returndatasize())
}
}
}
function _getImplementation() internal virtual returns (address);
}
文件 10 的 12:ShardVaultProxy.sol
pragma solidity ^0.8.0;
import { ERC721MetadataStorage } from '@solidstate/contracts/token/ERC721/metadata/ERC721MetadataStorage.sol';
import { IDiamondReadable } from '@solidstate/contracts/proxy/diamond/readable/IDiamondReadable.sol';
import { OwnableStorage } from '@solidstate/contracts/access/ownable/OwnableStorage.sol';
import { Proxy } from '@solidstate/contracts/proxy/Proxy.sol';
import { MarketPlaceHelperProxy } from '../helpers/MarketPlaceHelperProxy.sol';
import { IShardVaultProxy } from './IShardVaultProxy.sol';
import { ShardVaultStorage } from './ShardVaultStorage.sol';
contract ShardVaultProxy is Proxy, IShardVaultProxy {
address private immutable SHARD_VAULT_DIAMOND;
constructor(
ShardVaultAddresses memory addresses,
ShardVaultUints memory uints,
string memory name,
string memory symbol,
string memory baseURI,
bool isPUSDVault
) {
SHARD_VAULT_DIAMOND = addresses.shardVaultDiamond;
OwnableStorage.layout().owner = msg.sender;
ERC721MetadataStorage.Layout storage metadata = ERC721MetadataStorage
.layout();
metadata.name = name;
metadata.symbol = symbol;
metadata.baseURI = baseURI;
ShardVaultStorage.Layout storage l = ShardVaultStorage.layout();
address marketPlaceHelperProxy = address(
new MarketPlaceHelperProxy(addresses.marketPlaceHelper)
);
emit MarketPlaceHelperProxyDeployed(marketPlaceHelperProxy);
l.marketPlaceHelper = marketPlaceHelperProxy;
l.collection = addresses.collection;
l.jpegdVault = addresses.jpegdVault;
l.jpegdVaultHelper = addresses.jpegdVaultHelper;
l.whitelist = addresses.whitelist;
l.shardValue = uints.shardValue;
l.maxSupply = uints.maxSupply;
l.maxMintBalance = uints.maxMintBalance;
l.saleFeeBP = uints.saleFeeBP;
l.acquisitionFeeBP = uints.acquisitionFeeBP;
l.yieldFeeBP = uints.yieldFeeBP;
l.ltvBufferBP = uints.ltvBufferBP;
l.ltvDeviationBP = uints.ltvDeviationBP;
l.isPUSDVault = isPUSDVault;
uint256 authorizedLength = addresses.authorized.length;
unchecked {
for (uint256 i; i < authorizedLength; ++i) {
l.authorized[addresses.authorized[i]] = true;
}
}
}
function _getImplementation() internal view override returns (address) {
return IDiamondReadable(SHARD_VAULT_DIAMOND).facetAddress(msg.sig);
}
receive() external payable {}
}
文件 11 的 12:ShardVaultStorage.sol
pragma solidity ^0.8.0;
import { EnumerableSet } from '@solidstate/contracts/data/EnumerableSet.sol';
library ShardVaultStorage {
struct Layout {
uint256 shardValue;
uint256 accruedFees;
uint256 accruedJPEG;
uint256 cumulativeETHPerShard;
uint256 cumulativeJPEGPerShard;
mapping(uint256 => uint256) claimedETHPerShard;
mapping(uint256 => uint256) claimedJPEGPerShard;
address collection;
uint48 whitelistEndsAt;
uint16 saleFeeBP;
uint16 acquisitionFeeBP;
uint16 yieldFeeBP;
uint64 maxSupply;
uint64 maxMintBalance;
uint64 reservedSupply;
uint16 ltvBufferBP;
uint16 ltvDeviationBP;
bool isInvested;
bool isEnabled;
bool isPUSDVault;
bool isYieldClaiming;
address marketPlaceHelper;
address jpegdVault;
address jpegdVaultHelper;
address jpegdLP;
EnumerableSet.UintSet ownedTokenIds;
mapping(address => bool) authorized;
uint64 totalMintCount;
address whitelist;
}
bytes32 internal constant STORAGE_SLOT =
keccak256('insrt.contracts.storage.ShardVault');
function layout() internal pure returns (Layout storage l) {
bytes32 slot = STORAGE_SLOT;
assembly {
l.slot := slot
}
}
}
文件 12 的 12:UintUtils.sol
pragma solidity ^0.8.8;
library UintUtils {
error UintUtils__InsufficientHexLength();
bytes16 private constant HEX_SYMBOLS = '0123456789abcdef';
function add(uint256 a, int256 b) internal pure returns (uint256) {
return b < 0 ? sub(a, -b) : a + uint256(b);
}
function sub(uint256 a, int256 b) internal pure returns (uint256) {
return b < 0 ? add(a, -b) : a - uint256(b);
}
function toString(uint256 value) internal pure returns (string memory) {
if (value == 0) {
return '0';
}
uint256 temp = value;
uint256 digits;
while (temp != 0) {
digits++;
temp /= 10;
}
bytes memory buffer = new bytes(digits);
while (value != 0) {
digits -= 1;
buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
value /= 10;
}
return string(buffer);
}
function toHexString(uint256 value) internal pure returns (string memory) {
if (value == 0) {
return '0x00';
}
uint256 length = 0;
for (uint256 temp = value; temp != 0; temp >>= 8) {
unchecked {
length++;
}
}
return toHexString(value, length);
}
function toHexString(
uint256 value,
uint256 length
) internal pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = '0';
buffer[1] = 'x';
unchecked {
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = HEX_SYMBOLS[value & 0xf];
value >>= 4;
}
}
if (value != 0) revert UintUtils__InsufficientHexLength();
return string(buffer);
}
}
{
"compilationTarget": {
"contracts/shard/ShardVaultProxy.sol": "ShardVaultProxy"
},
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": [],
"viaIR": true
}
[{"inputs":[{"components":[{"internalType":"address","name":"shardVaultDiamond","type":"address"},{"internalType":"address","name":"marketPlaceHelper","type":"address"},{"internalType":"address","name":"collection","type":"address"},{"internalType":"address","name":"jpegdVault","type":"address"},{"internalType":"address","name":"jpegdVaultHelper","type":"address"},{"internalType":"address","name":"whitelist","type":"address"},{"internalType":"address[]","name":"authorized","type":"address[]"}],"internalType":"struct IShardVaultProxy.ShardVaultAddresses","name":"addresses","type":"tuple"},{"components":[{"internalType":"uint256","name":"shardValue","type":"uint256"},{"internalType":"uint64","name":"maxSupply","type":"uint64"},{"internalType":"uint64","name":"maxMintBalance","type":"uint64"},{"internalType":"uint16","name":"saleFeeBP","type":"uint16"},{"internalType":"uint16","name":"acquisitionFeeBP","type":"uint16"},{"internalType":"uint16","name":"yieldFeeBP","type":"uint16"},{"internalType":"uint16","name":"ltvBufferBP","type":"uint16"},{"internalType":"uint16","name":"ltvDeviationBP","type":"uint16"}],"internalType":"struct IShardVaultProxy.ShardVaultUints","name":"uints","type":"tuple"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"baseURI","type":"string"},{"internalType":"bool","name":"isPUSDVault","type":"bool"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"Proxy__ImplementationIsNotContract","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"marketPlacerHelperProxy","type":"address"}],"name":"MarketPlaceHelperProxyDeployed","type":"event"},{"stateMutability":"payable","type":"fallback"},{"stateMutability":"payable","type":"receive"}]