编译器
0.8.17+commit.8df45f5f
文件 1 的 22:Address.sol
pragma solidity ^0.8.1;
library Address {
function isContract(address account) internal view returns (bool) {
return account.code.length > 0;
}
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, "Address: low-level call failed");
}
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata,
string memory errorMessage
) internal view returns (bytes memory) {
if (success) {
if (returndata.length == 0) {
require(isContract(target), "Address: call to non-contract");
}
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
function _revert(bytes memory returndata, string memory errorMessage) private pure {
if (returndata.length > 0) {
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
文件 2 的 22:BlackholePrevention.sol
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/utils/Address.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
import "@openzeppelin/contracts/token/ERC1155/IERC1155.sol";
contract BlackholePrevention {
using Address for address payable;
using SafeERC20 for IERC20;
event WithdrawStuckEther(address indexed receiver, uint256 amount);
event WithdrawStuckERC20(
address indexed receiver,
address indexed tokenAddress,
uint256 amount
);
event WithdrawStuckERC721(
address indexed receiver,
address indexed tokenAddress,
uint256 indexed tokenId
);
event WithdrawStuckERC1155(
address indexed receiver,
address indexed tokenAddress,
uint256 indexed tokenId,
uint256 amount
);
function _withdrawEther(address payable receiver, uint256 amount)
internal
virtual
{
require(receiver != address(0x0), "BHP:E-403");
if (address(this).balance >= amount) {
receiver.sendValue(amount);
emit WithdrawStuckEther(receiver, amount);
}
}
function _withdrawERC20(
address payable receiver,
address tokenAddress,
uint256 amount
) internal virtual {
require(receiver != address(0x0), "BHP:E-403");
if (IERC20(tokenAddress).balanceOf(address(this)) >= amount) {
IERC20(tokenAddress).safeTransfer(receiver, amount);
emit WithdrawStuckERC20(receiver, tokenAddress, amount);
}
}
function _withdrawERC721(
address payable receiver,
address tokenAddress,
uint256 tokenId
) internal virtual {
require(receiver != address(0x0), "BHP:E-403");
if (IERC721(tokenAddress).ownerOf(tokenId) == address(this)) {
IERC721(tokenAddress).transferFrom(
address(this),
receiver,
tokenId
);
emit WithdrawStuckERC721(receiver, tokenAddress, tokenId);
}
}
function _withdrawERC1155(
address payable receiver,
address tokenAddress,
uint256 tokenId,
uint256 amount
) internal virtual {
require(receiver != address(0x0), "BHP:E-403");
if (
IERC1155(tokenAddress).balanceOf(address(this), tokenId) >= amount
) {
IERC1155(tokenAddress).safeTransferFrom(
address(this),
receiver,
tokenId,
amount,
""
);
emit WithdrawStuckERC1155(receiver, tokenAddress, tokenId, amount);
}
}
}
文件 3 的 22:Context.sol
pragma solidity ^0.8.0;
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}
文件 4 的 22:IBaseProton.sol
pragma solidity 0.8.17;
interface IBaseProton {
function createProton(
address creator,
address receiver,
string memory tokenMetaUri
) external returns (uint256 newTokenId);
function createBasicProton(
address creator,
address receiver,
string memory tokenMetaUri
)
external
payable
returns (uint256 newTokenId);
function safeTransferFrom(address from, address to, uint256 tokenId) external;
}
文件 5 的 22:IChargedParticles.sol
pragma solidity 0.8.17;
interface IChargedParticles {
function getStateAddress() external view returns (address stateAddress);
function getSettingsAddress()
external
view
returns (address settingsAddress);
function getManagersAddress()
external
view
returns (address managersAddress);
function getFeesForDeposit(uint256 assetAmount)
external
view
returns (uint256 protocolFee);
function baseParticleMass(
address contractAddress,
uint256 tokenId,
string calldata walletManagerId,
address assetToken
) external returns (uint256);
function currentParticleCharge(
address contractAddress,
uint256 tokenId,
string calldata walletManagerId,
address assetToken
) external returns (uint256);
function currentParticleKinetics(
address contractAddress,
uint256 tokenId,
string calldata walletManagerId,
address assetToken
) external returns (uint256);
function currentParticleCovalentBonds(
address contractAddress,
uint256 tokenId,
string calldata basketManagerId
) external view returns (uint256);
function energizeParticle(
address contractAddress,
uint256 tokenId,
string calldata walletManagerId,
address assetToken,
uint256 assetAmount,
address referrer
) external returns (uint256 yieldTokensAmount);
function dischargeParticle(
address receiver,
address contractAddress,
uint256 tokenId,
string calldata walletManagerId,
address assetToken
) external returns (uint256 creatorAmount, uint256 receiverAmount);
function dischargeParticleAmount(
address receiver,
address contractAddress,
uint256 tokenId,
string calldata walletManagerId,
address assetToken,
uint256 assetAmount
) external returns (uint256 creatorAmount, uint256 receiverAmount);
function dischargeParticleForCreator(
address receiver,
address contractAddress,
uint256 tokenId,
string calldata walletManagerId,
address assetToken,
uint256 assetAmount
) external returns (uint256 receiverAmount);
function releaseParticle(
address receiver,
address contractAddress,
uint256 tokenId,
string calldata walletManagerId,
address assetToken
) external returns (uint256 creatorAmount, uint256 receiverAmount);
function releaseParticleAmount(
address receiver,
address contractAddress,
uint256 tokenId,
string calldata walletManagerId,
address assetToken,
uint256 assetAmount
) external returns (uint256 creatorAmount, uint256 receiverAmount);
function covalentBond(
address contractAddress,
uint256 tokenId,
string calldata basketManagerId,
address nftTokenAddress,
uint256 nftTokenId,
uint256 nftTokenAmount
) external returns (bool success);
function breakCovalentBond(
address receiver,
address contractAddress,
uint256 tokenId,
string calldata basketManagerId,
address nftTokenAddress,
uint256 nftTokenId,
uint256 nftTokenAmount
) external returns (bool success);
event Initialized(address indexed initiator);
event ControllerSet(address indexed controllerAddress, string controllerId);
event DepositFeeSet(uint256 depositFee);
event ProtocolFeesCollected(
address indexed assetToken,
uint256 depositAmount,
uint256 feesCollected
);
}
文件 6 的 22:IChargedState.sol
pragma solidity 0.8.17;
interface IChargedState {
function getDischargeTimelockExpiry(
address contractAddress,
uint256 tokenId
) external view returns (uint256 lockExpiry);
function getReleaseTimelockExpiry(address contractAddress, uint256 tokenId)
external
view
returns (uint256 lockExpiry);
function getBreakBondTimelockExpiry(
address contractAddress,
uint256 tokenId
) external view returns (uint256 lockExpiry);
function isApprovedForDischarge(
address contractAddress,
uint256 tokenId,
address operator
) external returns (bool);
function isApprovedForRelease(
address contractAddress,
uint256 tokenId,
address operator
) external returns (bool);
function isApprovedForBreakBond(
address contractAddress,
uint256 tokenId,
address operator
) external returns (bool);
function isApprovedForTimelock(
address contractAddress,
uint256 tokenId,
address operator
) external returns (bool);
function isEnergizeRestricted(address contractAddress, uint256 tokenId)
external
view
returns (bool);
function isCovalentBondRestricted(address contractAddress, uint256 tokenId)
external
view
returns (bool);
function getDischargeState(
address contractAddress,
uint256 tokenId,
address sender
)
external
returns (
bool allowFromAll,
bool isApproved,
uint256 timelock,
uint256 tempLockExpiry
);
function getReleaseState(
address contractAddress,
uint256 tokenId,
address sender
)
external
returns (
bool allowFromAll,
bool isApproved,
uint256 timelock,
uint256 tempLockExpiry
);
function getBreakBondState(
address contractAddress,
uint256 tokenId,
address sender
)
external
returns (
bool allowFromAll,
bool isApproved,
uint256 timelock,
uint256 tempLockExpiry
);
function setDischargeApproval(
address contractAddress,
uint256 tokenId,
address operator
) external;
function setReleaseApproval(
address contractAddress,
uint256 tokenId,
address operator
) external;
function setBreakBondApproval(
address contractAddress,
uint256 tokenId,
address operator
) external;
function setTimelockApproval(
address contractAddress,
uint256 tokenId,
address operator
) external;
function setApprovalForAll(
address contractAddress,
uint256 tokenId,
address operator
) external;
function setPermsForRestrictCharge(
address contractAddress,
uint256 tokenId,
bool state
) external;
function setPermsForAllowDischarge(
address contractAddress,
uint256 tokenId,
bool state
) external;
function setPermsForAllowRelease(
address contractAddress,
uint256 tokenId,
bool state
) external;
function setPermsForRestrictBond(
address contractAddress,
uint256 tokenId,
bool state
) external;
function setPermsForAllowBreakBond(
address contractAddress,
uint256 tokenId,
bool state
) external;
function setDischargeTimelock(
address contractAddress,
uint256 tokenId,
uint256 unlockBlock
) external;
function setReleaseTimelock(
address contractAddress,
uint256 tokenId,
uint256 unlockBlock
) external;
function setBreakBondTimelock(
address contractAddress,
uint256 tokenId,
uint256 unlockBlock
) external;
function setTemporaryLock(
address contractAddress,
uint256 tokenId,
bool isLocked
) external;
event Initialized(address indexed initiator);
event ControllerSet(address indexed controllerAddress, string controllerId);
event DischargeApproval(
address indexed contractAddress,
uint256 indexed tokenId,
address indexed owner,
address operator
);
event ReleaseApproval(
address indexed contractAddress,
uint256 indexed tokenId,
address indexed owner,
address operator
);
event BreakBondApproval(
address indexed contractAddress,
uint256 indexed tokenId,
address indexed owner,
address operator
);
event TimelockApproval(
address indexed contractAddress,
uint256 indexed tokenId,
address indexed owner,
address operator
);
event TokenDischargeTimelock(
address indexed contractAddress,
uint256 indexed tokenId,
address indexed operator,
uint256 unlockBlock
);
event TokenReleaseTimelock(
address indexed contractAddress,
uint256 indexed tokenId,
address indexed operator,
uint256 unlockBlock
);
event TokenBreakBondTimelock(
address indexed contractAddress,
uint256 indexed tokenId,
address indexed operator,
uint256 unlockBlock
);
event TokenTempLock(
address indexed contractAddress,
uint256 indexed tokenId,
uint256 unlockBlock
);
event PermsSetForRestrictCharge(
address indexed contractAddress,
uint256 indexed tokenId,
bool state
);
event PermsSetForAllowDischarge(
address indexed contractAddress,
uint256 indexed tokenId,
bool state
);
event PermsSetForAllowRelease(
address indexed contractAddress,
uint256 indexed tokenId,
bool state
);
event PermsSetForRestrictBond(
address indexed contractAddress,
uint256 indexed tokenId,
bool state
);
event PermsSetForAllowBreakBond(
address indexed contractAddress,
uint256 indexed tokenId,
bool state
);
}
文件 7 的 22:IERC1155.sol
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165.sol";
interface IERC1155 is IERC165 {
event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);
event TransferBatch(
address indexed operator,
address indexed from,
address indexed to,
uint256[] ids,
uint256[] values
);
event ApprovalForAll(address indexed account, address indexed operator, bool approved);
event URI(string value, uint256 indexed id);
function balanceOf(address account, uint256 id) external view returns (uint256);
function balanceOfBatch(
address[] calldata accounts,
uint256[] calldata ids
) external view returns (uint256[] memory);
function setApprovalForAll(address operator, bool approved) external;
function isApprovedForAll(address account, address operator) external view returns (bool);
function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes calldata data) external;
function safeBatchTransferFrom(
address from,
address to,
uint256[] calldata ids,
uint256[] calldata amounts,
bytes calldata data
) external;
}
文件 8 的 22:IERC165.sol
pragma solidity ^0.8.0;
interface IERC165 {
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
文件 9 的 22:IERC20.sol
pragma solidity ^0.8.0;
interface IERC20 {
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address to, 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 from, address to, uint256 amount) external returns (bool);
}
文件 10 的 22:IERC20Permit.sol
pragma solidity ^0.8.0;
interface IERC20Permit {
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
function nonces(address owner) external view returns (uint256);
function DOMAIN_SEPARATOR() external view returns (bytes32);
}
文件 11 的 22:IERC721.sol
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165.sol";
interface IERC721 is IERC165 {
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
function balanceOf(address owner) external view returns (uint256 balance);
function ownerOf(uint256 tokenId) external view returns (address owner);
function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
function safeTransferFrom(address from, address to, uint256 tokenId) external;
function transferFrom(address from, address to, uint256 tokenId) external;
function approve(address to, uint256 tokenId) external;
function setApprovalForAll(address operator, bool approved) external;
function getApproved(uint256 tokenId) external view returns (address operator);
function isApprovedForAll(address owner, address operator) external view returns (bool);
}
文件 12 的 22:IWETH.sol
pragma solidity >=0.5.0;
interface IWETH {
function deposit() external payable;
function transfer(address to, uint value) external returns (bool);
function withdraw(uint) external;
}
文件 13 的 22:IWeb3Packs.sol
pragma solidity 0.8.17;
import "./IWeb3PacksDefs.sol";
interface IWeb3Packs is IWeb3PacksDefs {
event BundledERC20(address indexed tokenAddress, uint256 amountOut);
event BundledERC721(address indexed tokenAddress, uint256 nftTokenId);
function bundle(
IWeb3PacksDefs.BundleChunk[] calldata bundleChunks,
address[] calldata referrals,
string calldata tokenMetaUri,
IWeb3PacksDefs.LockState calldata lockState,
bytes32 packType,
uint256 ethPackPrice
) external
payable
returns(uint256 tokenId);
function unbundle(
address payable receiver,
address tokenAddress,
uint256 tokenId,
bool sellAll
) external
payable;
function unbundleUnknown(
address payable receiver,
address tokenAddress,
uint256 tokenId,
bytes32[] memory packBundles,
bool sellAll
) external
payable;
function getPackBalances(
address tokenAddress,
uint256 tokenId
) external
returns (TokenAmount[] memory);
function getPackPriceEth(uint256 tokenId)
external
returns (uint256 packPriceEth);
function getReferralRewardsOf(address account)
external
returns (uint256 balance);
}
文件 14 的 22:IWeb3PacksBundler.sol
pragma solidity 0.8.17;
interface IWeb3PacksBundler {
event BundledTokenSS(address indexed token, uint256 amount);
event BundledTokenLP(address indexed token0, address indexed token1, uint256 amount0, uint256 amount1, uint256 liquidity);
function getLiquidityToken(uint256 packTokenId) external returns (address tokenAddress, uint256 tokenId);
function bundle(uint256 packTokenId, address sender)
payable
external
returns(
address tokenAddress,
uint256 amountOut,
uint256 nftTokenId
);
function unbundle(address payable receiver, uint256 packTokenId, bool sellAll)
external
returns(uint256 amountOut);
}
文件 15 的 22:IWeb3PacksDefs.sol
pragma solidity 0.8.17;
interface IWeb3PacksDefs {
error NotOwnerOrApproved();
error FundingFailed();
error SwapFailed();
error NullReceiver();
error ContractNotAllowed();
error NativeAssetTransferFailed();
error MismatchedTokens();
error NoBundlesInPack();
error FailedToExitWeth();
error BundlerNotRegistered(bytes32 bundlerId);
error MissingLiquidityUUID(address tokenAddress);
error UnsucessfulSwap(address tokenOut, uint256 amountIn, address router);
error InsufficientForFee(uint256 value, uint256 ethPackPrice, uint256 protocolFee);
struct RouterConfig {
address weth;
address token0;
address token1;
address manager;
address swapRouter;
address liquidityRouter;
bytes32 poolId;
bytes32 bundlerId;
uint256 slippage;
int24 tickLower;
int24 tickUpper;
}
struct BundleChunk {
bytes32 bundlerId;
uint256 percentBasisPoints;
}
struct Token {
address tokenAddress;
uint256 tokenDecimals;
string tokenSymbol;
}
struct TokenAmount {
address tokenAddress;
uint256 balance;
uint256 nftTokenId;
}
struct Route {
address token0;
address token1;
bool stable;
}
struct LiquidityPosition {
uint256 lpTokenId;
uint256 liquidity;
bool stable;
}
struct LockState {
uint256 ERC20Timelock;
uint256 ERC721Timelock;
}
}
文件 16 的 22:IWeb3PacksState.sol
pragma solidity 0.8.17;
interface IWeb3PacksState {
function getBundlerById(bytes32 bundlerId) external view returns (address bundler);
function setPackPriceByPackId(uint256 tokenId, uint256 packPrice) external;
function getPackPriceByPackId(uint256 tokenId) external view returns (uint256 packPrice);
function setBundlesByPackId(uint256 tokenId, bytes32[] memory bundles) external;
function getBundlesByPackId(uint256 tokenId) external view returns (bytes32[] memory bundles);
function addToReferrerBalance(address referrer, uint256 amount) external;
function getReferrerBalance(address referrer) external view returns (uint256 balance);
function claimReferralRewards(address payable account) external;
function setWeb3Packs(address web3packs) external;
function registerBundlerId(bytes32 bundlerId, address bundlerAddress) external;
}
文件 17 的 22:Ownable.sol
pragma solidity ^0.8.0;
import "../utils/Context.sol";
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor() {
_transferOwnership(_msgSender());
}
modifier onlyOwner() {
_checkOwner();
_;
}
function owner() public view virtual returns (address) {
return _owner;
}
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
文件 18 的 22:Pausable.sol
pragma solidity ^0.8.0;
import "../utils/Context.sol";
abstract contract Pausable is Context {
event Paused(address account);
event Unpaused(address account);
bool private _paused;
constructor() {
_paused = false;
}
modifier whenNotPaused() {
_requireNotPaused();
_;
}
modifier whenPaused() {
_requirePaused();
_;
}
function paused() public view virtual returns (bool) {
return _paused;
}
function _requireNotPaused() internal view virtual {
require(!paused(), "Pausable: paused");
}
function _requirePaused() internal view virtual {
require(paused(), "Pausable: not paused");
}
function _pause() internal virtual whenNotPaused {
_paused = true;
emit Paused(_msgSender());
}
function _unpause() internal virtual whenPaused {
_paused = false;
emit Unpaused(_msgSender());
}
}
文件 19 的 22:ReentrancyGuard.sol
pragma solidity ^0.8.0;
abstract contract ReentrancyGuard {
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
_status = _ENTERED;
}
function _nonReentrantAfter() private {
_status = _NOT_ENTERED;
}
function _reentrancyGuardEntered() internal view returns (bool) {
return _status == _ENTERED;
}
}
文件 20 的 22:SafeERC20.sol
pragma solidity ^0.8.0;
import "../IERC20.sol";
import "../extensions/IERC20Permit.sol";
import "../../../utils/Address.sol";
library SafeERC20 {
using Address for address;
function safeTransfer(IERC20 token, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
function safeApprove(IERC20 token, address spender, uint256 value) internal {
require(
(value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 oldAllowance = token.allowance(address(this), spender);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value));
}
function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
unchecked {
uint256 oldAllowance = token.allowance(address(this), spender);
require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value));
}
}
function forceApprove(IERC20 token, address spender, uint256 value) internal {
bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value);
if (!_callOptionalReturnBool(token, approvalCall)) {
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0));
_callOptionalReturn(token, approvalCall);
}
}
function safePermit(
IERC20Permit token,
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) internal {
uint256 nonceBefore = token.nonces(owner);
token.permit(owner, spender, value, deadline, v, r, s);
uint256 nonceAfter = token.nonces(owner);
require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
}
function _callOptionalReturn(IERC20 token, bytes memory data) private {
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {
(bool success, bytes memory returndata) = address(token).call(data);
return
success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token));
}
}
文件 21 的 22:TransferHelper.sol
pragma solidity >=0.6.0;
import '@openzeppelin/contracts/token/ERC20/IERC20.sol';
library TransferHelper {
function safeTransferFrom(
address token,
address from,
address to,
uint256 value
) internal {
(bool success, bytes memory data) =
token.call(abi.encodeWithSelector(IERC20.transferFrom.selector, from, to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))), 'STF');
}
function safeTransfer(
address token,
address to,
uint256 value
) internal {
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.transfer.selector, to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))), 'ST');
}
function safeApprove(
address token,
address to,
uint256 value
) internal {
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.approve.selector, to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))), 'SA');
}
function safeTransferETH(address to, uint256 value) internal {
(bool success, ) = to.call{value: value}(new bytes(0));
require(success, 'STE');
}
}
文件 22 的 22:Web3PacksV2.sol
pragma solidity 0.8.17;
import "@openzeppelin/contracts/utils/Address.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/Pausable.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@uniswap/v2-periphery/contracts/interfaces/IWETH.sol";
import "@uniswap/v3-periphery/contracts/libraries/TransferHelper.sol";
import "./lib/BlackholePrevention.sol";
import "./interfaces/IWeb3Packs.sol";
import "./interfaces/IWeb3PacksState.sol";
import "./interfaces/IWeb3PacksDefs.sol";
import "./interfaces/IWeb3PacksBundler.sol";
import "./interfaces/IChargedState.sol";
import "./interfaces/IChargedParticles.sol";
import "./interfaces/IBaseProton.sol";
contract Web3PacksV2 is
IWeb3Packs,
Ownable,
Pausable,
BlackholePrevention,
ReentrancyGuard
{
using Address for address payable;
event ChargedParticlesSet(address indexed chargedParticles);
event ChargedStateSet(address indexed chargedState);
event Web3PacksStateSet(address indexed web3state);
event ProtonSet(address indexed proton);
event PackBundled(uint256 indexed tokenId, address indexed receiver, bytes32 packType, uint256 ethPackPrice);
event PackUnbundled(uint256 indexed tokenId, address indexed receiver, uint256 ethAmount);
event ProtocolFeeSet(uint256 fee);
event Web3PacksTreasurySet(address indexed treasury);
uint256 private constant BASIS_POINTS = 10000;
address public _weth;
address public _proton;
address public _web3state;
address public _chargedParticles;
address public _chargedState;
address payable internal _treasury;
uint256 public _protocolFee;
string public _cpWalletManager = "generic.B";
string public _cpBasketManager = "generic.B";
constructor(
address weth,
address proton,
address chargedParticles,
address chargedState
) {
_weth = weth;
_proton = proton;
_chargedParticles = chargedParticles;
_chargedState = chargedState;
}
receive() external payable {}
function bundle(
IWeb3PacksDefs.BundleChunk[] calldata bundleChunks,
address[] calldata referrals,
string calldata tokenMetaUri,
IWeb3PacksDefs.LockState calldata lockState,
bytes32 packType,
uint256 ethPackPrice
)
external
override
payable
whenNotPaused
nonReentrant
returns(uint256 tokenId)
{
_collectFees(ethPackPrice);
uint256 rewards = _calculateReferralRewards(ethPackPrice, referrals);
tokenId = _bundle(
bundleChunks,
tokenMetaUri,
lockState,
ethPackPrice - rewards
);
emit PackBundled(tokenId, _msgSender(), packType, ethPackPrice);
}
function unbundle(
address payable receiver,
address tokenAddress,
uint256 tokenId,
bool sellAll
)
external
override
payable
whenNotPaused
nonReentrant
{
_collectFees(0);
uint256 ethAmount = _unbundle(
receiver,
tokenAddress,
tokenId,
sellAll
);
emit PackUnbundled(tokenId, receiver, ethAmount);
}
function unbundleUnknown(
address payable receiver,
address tokenAddress,
uint256 tokenId,
bytes32[] memory packBundles,
bool sellAll
)
external
override
payable
whenNotPaused
nonReentrant
{
_collectFees(0);
uint256 ethAmount = _unbundlePack(
receiver,
tokenAddress,
tokenId,
packBundles,
sellAll
);
emit PackUnbundled(tokenId, receiver, ethAmount);
}
function getPackBalances(address tokenAddress, uint256 tokenId) public override returns (TokenAmount[] memory) {
return _getPackBalances(tokenAddress, tokenId);
}
function getPackPriceEth(uint256 tokenId) public view override returns (uint256 packPriceEth) {
packPriceEth = IWeb3PacksState(_web3state).getPackPriceByPackId(tokenId);
}
function getReferralRewardsOf(address account) public view override returns (uint256 balance) {
balance = IWeb3PacksState(_web3state).getReferrerBalance(account);
}
function _bundle(
IWeb3PacksDefs.BundleChunk[] calldata bundleChunks,
string calldata tokenMetaUri,
IWeb3PacksDefs.LockState calldata lockState,
uint256 ethPackPrice
)
internal
returns(uint256 tokenId)
{
IWeb3PacksBundler bundler;
tokenId = _createBasicProton(tokenMetaUri);
IWETH(_weth).deposit{value: ethPackPrice}();
uint256 wethTotal = IERC20(_weth).balanceOf(address(this));
uint256 chunkWeth;
address tokenAddress;
uint256 amountOut;
uint256 nftTokenId;
bytes32[] memory packBundlerIds = new bytes32[](bundleChunks.length);
for (uint256 i; i < bundleChunks.length; i++) {
IWeb3PacksDefs.BundleChunk memory chunk = bundleChunks[i];
packBundlerIds[i] = chunk.bundlerId;
address bundlerAddress = IWeb3PacksState(_web3state).getBundlerById(chunk.bundlerId);
if (bundlerAddress == address(0)) {
revert BundlerNotRegistered(chunk.bundlerId);
}
bundler = IWeb3PacksBundler(bundlerAddress);
chunkWeth = (wethTotal * chunk.percentBasisPoints) / BASIS_POINTS;
TransferHelper.safeTransfer(_weth, address(bundler), chunkWeth);
(tokenAddress, amountOut, nftTokenId) = bundler.bundle(tokenId, _msgSender());
if (nftTokenId == 0) {
_energize(tokenId, tokenAddress, amountOut);
emit BundledERC20(tokenAddress, amountOut);
} else {
_bond(tokenId, tokenAddress, nftTokenId);
emit BundledERC721(tokenAddress, nftTokenId);
}
}
IWeb3PacksState(_web3state).setBundlesByPackId(tokenId, packBundlerIds);
IWeb3PacksState(_web3state).setPackPriceByPackId(tokenId, ethPackPrice);
_lock(lockState, tokenId);
IBaseProton(_proton).safeTransferFrom(address(this), _msgSender(), tokenId);
}
function _unbundle(
address payable receiver,
address tokenAddress,
uint256 packTokenId,
bool sellAll
)
internal
returns (uint ethAmount)
{
bytes32[] memory bundles = IWeb3PacksState(_web3state).getBundlesByPackId(packTokenId);
if (bundles.length == 0) {
revert NoBundlesInPack();
}
ethAmount = _unbundlePack(
receiver,
tokenAddress,
packTokenId,
bundles,
sellAll
);
bytes32[] memory empty;
IWeb3PacksState(_web3state).setBundlesByPackId(packTokenId, empty);
IWeb3PacksState(_web3state).setPackPriceByPackId(packTokenId, 0);
}
function _unbundlePack(
address payable receiver,
address tokenAddress,
uint256 packTokenId,
bytes32[] memory packBundles,
bool sellAll
)
internal
returns (uint ethAmount)
{
IWeb3PacksBundler bundler;
address owner = IERC721(tokenAddress).ownerOf(packTokenId);
if (_msgSender() != owner) {
revert NotOwnerOrApproved();
}
address assetTokenAddress;
uint256 assetTokenId;
for (uint i; i < packBundles.length; i++) {
address bundlerAddress = IWeb3PacksState(_web3state).getBundlerById(packBundles[i]);
if (bundlerAddress == address(0)) {
continue;
}
bundler = IWeb3PacksBundler(bundlerAddress);
(assetTokenAddress, assetTokenId) = bundler.getLiquidityToken(packTokenId);
if (assetTokenId == 0) {
_release(bundlerAddress, packTokenId, assetTokenAddress);
} else {
_breakBond(bundlerAddress, packTokenId, assetTokenAddress, assetTokenId);
}
ethAmount += bundler.unbundle(receiver, packTokenId, sellAll);
}
}
function _getPackBalances(address tokenAddress, uint256 tokenId) internal returns (TokenAmount[] memory) {
IWeb3PacksBundler bundler;
bytes32[] memory bundles = IWeb3PacksState(_web3state).getBundlesByPackId(tokenId);
uint256 bundleCount = bundles.length;
if (bundleCount == 0) {
revert NoBundlesInPack();
}
TokenAmount[] memory tokenBalances = new TokenAmount[](bundleCount);
for (uint i; i < bundleCount; i++) {
bytes32 bundlerId = bundles[i];
address bundlerAddress = IWeb3PacksState(_web3state).getBundlerById(bundlerId);
if (bundlerAddress == address(0)) {
continue;
}
bundler = IWeb3PacksBundler(bundlerAddress);
(address assetTokenAddress, uint256 assetTokenId) = bundler.getLiquidityToken(tokenId);
bool isNft = (assetTokenId > 0);
uint256 assetBalance = isNft ? 1 : _getMass(tokenAddress, tokenId, assetTokenAddress);
tokenBalances[i] = TokenAmount({
tokenAddress: assetTokenAddress,
balance: assetBalance,
nftTokenId: assetTokenId
});
}
return tokenBalances;
}
function _createBasicProton(
string memory tokenMetadataUri
)
internal
returns (uint256 mintedTokenId)
{
mintedTokenId = IBaseProton(_proton).createBasicProton(
address(this),
address(this),
tokenMetadataUri
);
}
function _energize(
uint256 packTokenId,
address assetTokenAddress,
uint256 assetTokenAmount
)
internal
{
if (assetTokenAmount == 0) {
assetTokenAmount = IERC20(assetTokenAddress).balanceOf(address(this));
}
TransferHelper.safeApprove(
assetTokenAddress,
address(_chargedParticles),
assetTokenAmount
);
IChargedParticles(_chargedParticles).energizeParticle(
_proton,
packTokenId,
_cpWalletManager,
assetTokenAddress,
assetTokenAmount,
address(this)
);
}
function _release(
address receiver,
uint256 packTokenId,
address assetTokenAddress
)
internal
{
IChargedParticles(_chargedParticles).releaseParticle(
receiver,
_proton,
packTokenId,
_cpWalletManager,
assetTokenAddress
);
}
function _bond(
uint256 packTokenId,
address nftTokenAddress,
uint256 nftTokenId
)
internal
{
IERC721(nftTokenAddress).setApprovalForAll(_chargedParticles, true);
IChargedParticles(_chargedParticles).covalentBond(
_proton,
packTokenId,
_cpBasketManager,
nftTokenAddress,
nftTokenId,
1
);
}
function _breakBond(
address receiver,
uint256 packTokenId,
address nftTokenAddress,
uint256 nftTokenId
)
internal
{
IChargedParticles(_chargedParticles).breakCovalentBond(
receiver,
_proton,
packTokenId,
_cpBasketManager,
nftTokenAddress,
nftTokenId,
1
);
}
function _lock(LockState calldata lockState, uint256 tokenId) internal {
if(lockState.ERC20Timelock > 0) {
IChargedState(_chargedState).setReleaseTimelock(
_proton,
tokenId,
lockState.ERC20Timelock
);
}
if(lockState.ERC721Timelock > 0) {
IChargedState(_chargedState).setBreakBondTimelock(
_proton,
tokenId,
lockState.ERC721Timelock
);
}
}
function _getMass(address tokenAddress, uint256 tokenId, address assetTokenAddress) internal returns (uint256 assetMass) {
assetMass = IChargedParticles(_chargedParticles)
.baseParticleMass(tokenAddress, tokenId, _cpWalletManager, assetTokenAddress);
}
function _collectFees(uint256 excludedAmount) internal {
if (_protocolFee > 0 && msg.value < (_protocolFee + excludedAmount)) {
revert InsufficientForFee(msg.value, excludedAmount, _protocolFee);
}
uint256 fees = msg.value - excludedAmount;
_treasury.sendValue(fees);
}
function _calculateReferralRewards(
uint256 ethPackPrice,
address[] memory referrals
) internal returns (uint256 fee) {
uint256 referralAmountTotal = ((ethPackPrice * 330) / BASIS_POINTS);
IWeb3PacksState _state = IWeb3PacksState(_web3state);
if (referrals.length > 0 && referrals[0] != address(0)) {
fee = referralAmountTotal;
if (referrals.length > 1 && referrals[1] != address(0)) {
if (referrals.length > 2 && referrals[2] != address(0)) {
_state.addToReferrerBalance(referrals[0], (ethPackPrice * 30) / BASIS_POINTS);
_state.addToReferrerBalance(referrals[1], (ethPackPrice * 30) / BASIS_POINTS);
_state.addToReferrerBalance(referrals[2], (ethPackPrice * 270) / BASIS_POINTS);
} else {
_state.addToReferrerBalance(referrals[0], (ethPackPrice * 30) / BASIS_POINTS);
_state.addToReferrerBalance(referrals[1], (ethPackPrice * 300) / BASIS_POINTS);
}
} else {
_state.addToReferrerBalance(referrals[0], referralAmountTotal);
}
payable(_web3state).sendValue(fee);
}
}
function setChargedParticles(address chargedParticles) external onlyOwner {
require(chargedParticles != address(0), "Invalid address for chargedParticles");
_chargedParticles = chargedParticles;
emit ChargedParticlesSet(chargedParticles);
}
function setChargedState(address chargedState) external onlyOwner {
require(chargedState != address(0), "Invalid address for chargedState");
_chargedState = chargedState;
emit ChargedStateSet(chargedState);
}
function setProton(address proton) external onlyOwner {
require(proton != address(0), "Invalid address for proton");
_proton = proton;
emit ProtonSet(proton);
}
function setWeb3PacksState(address web3state) external onlyOwner {
require(web3state != address(0), "Invalid address for web3state");
_web3state = web3state;
emit Web3PacksStateSet(web3state);
}
function setTreasury(address payable treasury) external onlyOwner {
require(treasury != address(0), "Invalid address for treasury");
_treasury = treasury;
emit Web3PacksTreasurySet(treasury);
}
function setProtocolFee(uint256 fee) external onlyOwner {
_protocolFee = fee;
emit ProtocolFeeSet(fee);
}
function pause() public onlyOwner {
_pause();
}
function unpause() public onlyOwner {
_unpause();
}
function withdrawEther(address payable receiver, uint256 amount) external virtual onlyOwner {
_withdrawEther(receiver, amount);
}
function withdrawErc20(address payable receiver, address tokenAddress, uint256 amount) external virtual onlyOwner {
_withdrawERC20(receiver, tokenAddress, amount);
}
function withdrawERC721(address payable receiver, address tokenAddress, uint256 tokenId) external virtual onlyOwner {
_withdrawERC721(receiver, tokenAddress, tokenId);
}
function withdrawERC1155(address payable receiver, address tokenAddress, uint256 tokenId, uint256 amount) external virtual onlyOwner {
_withdrawERC1155(receiver, tokenAddress, tokenId, amount);
}
function onERC721Received(
address,
address,
uint256,
bytes calldata
) external pure returns(bytes4) {
return this.onERC721Received.selector;
}
}
{
"compilationTarget": {
"contracts/Web3PacksV2.sol": "Web3PacksV2"
},
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs",
"useLiteralContent": true
},
"optimizer": {
"enabled": true,
"runs": 1000
},
"remappings": []
}
[{"inputs":[{"internalType":"address","name":"weth","type":"address"},{"internalType":"address","name":"proton","type":"address"},{"internalType":"address","name":"chargedParticles","type":"address"},{"internalType":"address","name":"chargedState","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"bytes32","name":"bundlerId","type":"bytes32"}],"name":"BundlerNotRegistered","type":"error"},{"inputs":[],"name":"ContractNotAllowed","type":"error"},{"inputs":[],"name":"FailedToExitWeth","type":"error"},{"inputs":[],"name":"FundingFailed","type":"error"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"ethPackPrice","type":"uint256"},{"internalType":"uint256","name":"protocolFee","type":"uint256"}],"name":"InsufficientForFee","type":"error"},{"inputs":[],"name":"MismatchedTokens","type":"error"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"MissingLiquidityUUID","type":"error"},{"inputs":[],"name":"NativeAssetTransferFailed","type":"error"},{"inputs":[],"name":"NoBundlesInPack","type":"error"},{"inputs":[],"name":"NotOwnerOrApproved","type":"error"},{"inputs":[],"name":"NullReceiver","type":"error"},{"inputs":[],"name":"SwapFailed","type":"error"},{"inputs":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address","name":"router","type":"address"}],"name":"UnsucessfulSwap","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"}],"name":"BundledERC20","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"nftTokenId","type":"uint256"}],"name":"BundledERC721","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"chargedParticles","type":"address"}],"name":"ChargedParticlesSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"chargedState","type":"address"}],"name":"ChargedStateSet","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":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"bytes32","name":"packType","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"ethPackPrice","type":"uint256"}],"name":"PackBundled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"}],"name":"PackUnbundled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"ProtocolFeeSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"proton","type":"address"}],"name":"ProtonSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"web3state","type":"address"}],"name":"Web3PacksStateSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"treasury","type":"address"}],"name":"Web3PacksTreasurySet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawStuckERC1155","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawStuckERC20","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"WithdrawStuckERC721","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawStuckEther","type":"event"},{"inputs":[],"name":"_chargedParticles","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_chargedState","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_cpBasketManager","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_cpWalletManager","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_protocolFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_proton","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_web3state","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_weth","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"bundlerId","type":"bytes32"},{"internalType":"uint256","name":"percentBasisPoints","type":"uint256"}],"internalType":"struct IWeb3PacksDefs.BundleChunk[]","name":"bundleChunks","type":"tuple[]"},{"internalType":"address[]","name":"referrals","type":"address[]"},{"internalType":"string","name":"tokenMetaUri","type":"string"},{"components":[{"internalType":"uint256","name":"ERC20Timelock","type":"uint256"},{"internalType":"uint256","name":"ERC721Timelock","type":"uint256"}],"internalType":"struct IWeb3PacksDefs.LockState","name":"lockState","type":"tuple"},{"internalType":"bytes32","name":"packType","type":"bytes32"},{"internalType":"uint256","name":"ethPackPrice","type":"uint256"}],"name":"bundle","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getPackBalances","outputs":[{"components":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"nftTokenId","type":"uint256"}],"internalType":"struct IWeb3PacksDefs.TokenAmount[]","name":"","type":"tuple[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getPackPriceEth","outputs":[{"internalType":"uint256","name":"packPriceEth","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getReferralRewardsOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"chargedParticles","type":"address"}],"name":"setChargedParticles","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"chargedState","type":"address"}],"name":"setChargedState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setProtocolFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"proton","type":"address"}],"name":"setProton","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"treasury","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"web3state","type":"address"}],"name":"setWeb3PacksState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"receiver","type":"address"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bool","name":"sellAll","type":"bool"}],"name":"unbundle","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address payable","name":"receiver","type":"address"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes32[]","name":"packBundles","type":"bytes32[]"},{"internalType":"bool","name":"sellAll","type":"bool"}],"name":"unbundleUnknown","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"receiver","type":"address"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawERC1155","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"receiver","type":"address"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"withdrawERC721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"receiver","type":"address"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawErc20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"receiver","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawEther","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]