编译器
0.8.21+commit.d9974bed
文件 1 的 37: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 的 37: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;
}
}
文件 3 的 37:ERC1155Holder.sol
pragma solidity ^0.8.0;
import "./ERC1155Receiver.sol";
contract ERC1155Holder is ERC1155Receiver {
function onERC1155Received(
address,
address,
uint256,
uint256,
bytes memory
) public virtual override returns (bytes4) {
return this.onERC1155Received.selector;
}
function onERC1155BatchReceived(
address,
address,
uint256[] memory,
uint256[] memory,
bytes memory
) public virtual override returns (bytes4) {
return this.onERC1155BatchReceived.selector;
}
}
文件 4 的 37:ERC1155Receiver.sol
pragma solidity ^0.8.0;
import "../IERC1155Receiver.sol";
import "../../../utils/introspection/ERC165.sol";
abstract contract ERC1155Receiver is ERC165, IERC1155Receiver {
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId);
}
}
文件 5 的 37:ERC165.sol
pragma solidity ^0.8.0;
import "./IERC165.sol";
abstract contract ERC165 is IERC165 {
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}
文件 6 的 37:ERC721Holder.sol
pragma solidity ^0.8.0;
import "../IERC721Receiver.sol";
contract ERC721Holder is IERC721Receiver {
function onERC721Received(address, address, uint256, bytes memory) public virtual override returns (bytes4) {
return this.onERC721Received.selector;
}
}
文件 7 的 37:EnvelopLazyKioskService.sol
pragma solidity 0.8.21;
import "@envelop-subscription/contracts/ServiceProviderOwnable.sol";
import "./NFTKioskLazy.sol";
import "../interfaces/IModelWhiteList.sol";
contract EnvelopLazyKioskService is NFTKioskLazy, ServiceProviderOwnable {
address public modelWhiteListAddress;
constructor (address _subscrRegistry)
ServiceProviderOwnable(_subscrRegistry)
{
}
function setDisplayParams(
string calldata _name,
address _beneficiary,
uint256 _enableAfter,
uint256 _disableAfter,
address _priceModel
) public override(NFTKiosk)
{
require(
IModelWhiteList(modelWhiteListAddress).isModelEnabled(_priceModel),
"Unexpected price model address"
);
if (displays[hlpHashString(_name)].owner == address(0))
{
_checkAndFixSubscription(msg.sender);
}
super.setDisplayParams(
_name,
_beneficiary,
_enableAfter,
_disableAfter,
_priceModel
);
}
function setWhiteList(address _modelWhiteList) external onlyOwner {
modelWhiteListAddress = _modelWhiteList;
}
function checkUser(address _user) external view returns (bool ok, bool needFix) {
return _checkUserSubscription(_user);
}
}
文件 8 的 37:IDisplayPriceModel.sol
pragma solidity 0.8.21;
import "@envelop-protocol-v1/contracts/LibEnvelopTypes.sol";
import "../contracts/KTypes.sol";
interface IDisplayPriceModel {
event DiscountChanged(
bytes32 indexed display,
uint8 indexed DiscountType,
bytes32 DiscountParam,
uint16 DiscountPercent
);
event DefaultPriceChanged(
bytes32 indexed display,
address indexed payWithContract,
uint256 indexed priceAmount
);
function makeActionInModel(
ETypes.AssetItem calldata _assetItem,
address _buyer
) external returns(bool needMakeTansfer);
function getItemPrices(
ETypes.AssetItem memory _assetItem
) external view returns (KTypes.Price[] memory);
function getDefaultDisplayPrices(
ETypes.AssetItem memory _assetItem
) external view returns (KTypes.Price[] memory);
function getItemDiscounts(
ETypes.AssetItem memory _assetItem,
address _buyer,
address _referrer,
bytes32 _promoHash
) external view returns (KTypes.Discount[] memory);
function getBatchPrices(
ETypes.AssetItem[] memory _assetItemArray
) external view returns (KTypes.Price[] memory);
function getBatchDiscounts(
ETypes.AssetItem[] memory _assetItemArray,
address _buyer,
address _referrer,
bytes32 _promoHash
) external view returns (KTypes.Discount[] memory);
}
文件 9 的 37: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;
}
文件 10 的 37:IERC1155MetadataURI.sol
pragma solidity ^0.8.0;
import "../IERC1155.sol";
interface IERC1155MetadataURI is IERC1155 {
function uri(uint256 id) external view returns (string memory);
}
文件 11 的 37:IERC1155Mintable.sol
pragma solidity 0.8.21;
import "@openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol";
interface IERC1155Mintable is IERC1155MetadataURI {
function mint(address _to, uint256 _tokenId, uint256 _amount) external;
function burn(address _to, uint256 _tokenId, uint256 _amount) external;
function totalSupply(uint256 _id) external view returns (uint256);
function exists(uint256 _tokenId) external view returns(bool);
}
文件 12 的 37:IERC1155Receiver.sol
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165.sol";
interface IERC1155Receiver is IERC165 {
function onERC1155Received(
address operator,
address from,
uint256 id,
uint256 value,
bytes calldata data
) external returns (bytes4);
function onERC1155BatchReceived(
address operator,
address from,
uint256[] calldata ids,
uint256[] calldata values,
bytes calldata data
) external returns (bytes4);
}
文件 13 的 37:IERC165.sol
pragma solidity ^0.8.0;
interface IERC165 {
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
文件 14 的 37: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);
}
文件 15 的 37:IERC20Extended.sol
pragma solidity 0.8.21;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
interface IERC20Extended is IERC20 {
function mint(address _to, uint256 _value) external;
}
文件 16 的 37: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);
}
文件 17 的 37: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);
}
文件 18 的 37:IERC721Metadata.sol
pragma solidity ^0.8.0;
import "../IERC721.sol";
interface IERC721Metadata is IERC721 {
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function tokenURI(uint256 tokenId) external view returns (string memory);
}
文件 19 的 37:IERC721Mintable.sol
pragma solidity 0.8.21;
import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol";
interface IERC721Mintable is IERC721Metadata {
function mint(address _to, uint256 _tokenId) external;
function burn(uint256 _tokenId) external;
function exists(uint256 _tokenId) external view returns(bool);
}
文件 20 的 37:IERC721Receiver.sol
pragma solidity ^0.8.0;
interface IERC721Receiver {
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}
文件 21 的 37:IModelWhiteList.sol
pragma solidity 0.8.21;
interface IModelWhiteList {
function isModelEnabled(address _model) external view returns(bool);
}
文件 22 的 37:ISubscriptionRegistry.sol
pragma solidity 0.8.21;
import {SubscriptionType, PayOption, Tariff, Ticket} from "../contracts/SubscriptionRegistry.sol";
interface ISubscriptionRegistry {
function registerServiceTariff(Tariff calldata _newTariff) external returns(uint256);
function authorizeAgentForService(
address _agent,
uint256[] calldata _serviceTariffIndexes
) external returns (uint256[] memory);
function buySubscription(
address _service,
uint256 _tariffIndex,
uint256 _payWithIndex,
address _buyFor,
address _payer
) external payable returns(Ticket memory ticket);
function editServiceTariff(
uint256 _tariffIndex,
uint256 _timelockPeriod,
uint256 _ticketValidPeriod,
uint256 _counter,
bool _isAvailable,
address _beneficiary
) external;
function addTariffPayOption(
uint256 _tariffIndex,
address _paymentToken,
uint256 _paymentAmount,
uint16 _agentFeePercent
) external returns(uint256);
function editTariffPayOption(
uint256 _tariffIndex,
uint256 _payWithIndex,
address _paymentToken,
uint256 _paymentAmount,
uint16 _agentFeePercent
) external;
function checkUserSubscription(
address _user,
address _service
) external view returns (bool ok, bool needFix);
function checkAndFixUserSubscription(address _user) external returns (bool ok);
function fixUserSubscription(address _user, address _serviceFromProxy) external;
function getUserTicketForService(
address _service,
address _user
) external view returns(Ticket memory);
function getTariffsForService(address _service) external view returns (Tariff[] memory);
function getTicketPrice(
address _service,
uint256 _tariffIndex,
uint256 _payWithIndex
) external view returns (address, uint256);
function getAvailableAgentsTariffForService(
address _agent,
address _service
) external view returns(Tariff[] memory);
}
文件 23 的 37:ITrustedWrapper.sol
pragma solidity 0.8.21;
import "./IWrapper.sol";
interface ITrustedWrapper is IWrapper {
function trustedOperator() external view returns(address);
function wrapUnsafe(
ETypes.INData calldata _inData,
ETypes.AssetItem[] calldata _collateral,
address _wrappFor
)
external
payable
returns (ETypes.AssetItem memory);
function transferIn(
ETypes.AssetItem memory _assetItem,
address _from
)
external
payable
returns (uint256 _transferedValue);
}
文件 24 的 37:IUsersSBT.sol
pragma solidity 0.8.21;
interface IUsersSBT {
function mintWithRules(
address _to,
bytes2 _rules
) external returns(uint256 tokenId);
function mintWithRules(
address _to,
uint256 _balance,
bytes2 _rules
) external returns(uint256 tokenId);
function updateRules(
uint256 _tokenId,
bytes2 _rules
) external returns(bool changed);
function owner() external view returns(address);
}
文件 25 的 37:IWrapper.sol
pragma solidity 0.8.21;
import "../contracts/LibEnvelopTypes.sol";
interface IWrapper {
event WrappedV1(
address indexed inAssetAddress,
address indexed outAssetAddress,
uint256 indexed inAssetTokenId,
uint256 outTokenId,
address wnftFirstOwner,
uint256 nativeCollateralAmount,
bytes2 rules
);
event UnWrappedV1(
address indexed wrappedAddress,
address indexed originalAddress,
uint256 indexed wrappedId,
uint256 originalTokenId,
address beneficiary,
uint256 nativeCollateralAmount,
bytes2 rules
);
event CollateralAdded(
address indexed wrappedAddress,
uint256 indexed wrappedId,
uint8 assetType,
address collateralAddress,
uint256 collateralTokenId,
uint256 collateralBalance
);
event PartialUnWrapp(
address indexed wrappedAddress,
uint256 indexed wrappedId,
uint256 lastCollateralIndex
);
event SuspiciousFail(
address indexed wrappedAddress,
uint256 indexed wrappedId,
address indexed failedContractAddress
);
event EnvelopFee(
address indexed receiver,
address indexed wNFTConatract,
uint256 indexed wNFTTokenId,
uint256 amount
);
function wrap(
ETypes.INData calldata _inData,
ETypes.AssetItem[] calldata _collateral,
address _wrappFor
)
external
payable
returns (ETypes.AssetItem memory);
function addCollateral(
address _wNFTAddress,
uint256 _wNFTTokenId,
ETypes.AssetItem[] calldata _collateral
) external payable;
function unWrap(
address _wNFTAddress,
uint256 _wNFTTokenId
) external;
function unWrap(
ETypes.AssetType _wNFTType,
address _wNFTAddress,
uint256 _wNFTTokenId
) external;
function unWrap(
ETypes.AssetType _wNFTType,
address _wNFTAddress,
uint256 _wNFTTokenId,
bool _isEmergency
) external;
function chargeFees(
address _wNFTAddress,
uint256 _wNFTTokenId,
address _from,
address _to,
bytes1 _feeType
)
external
returns (bool);
function MAX_COLLATERAL_SLOTS() external view returns (uint256);
function protocolTechToken() external view returns (address);
function protocolWhiteList() external view returns (address);
function getWrappedToken(address _wNFTAddress, uint256 _wNFTTokenId)
external
view
returns (ETypes.WNFT memory);
function getOriginalURI(address _wNFTAddress, uint256 _wNFTTokenId)
external
view
returns(string memory);
function getCollateralBalanceAndIndex(
address _wNFTAddress,
uint256 _wNFTTokenId,
ETypes.AssetType _collateralType,
address _erc,
uint256 _tokenId
) external view returns (uint256, uint256);
}
文件 26 的 37:KTypes.sol
import "@envelop-protocol-v1/contracts/LibEnvelopTypes.sol";
pragma solidity 0.8.21;
library KTypes {
enum DiscountType {PROMO, REFERRAL, BATCH, TIME, WHITELIST, CUSTOM1, CUSTOM2, CUSTOM3}
struct Price {
address payWith;
uint256 amount;
}
struct DenominatedPrice {
address payWith;
uint256 amount;
uint256 denominator;
}
struct Discount {
DiscountType dsctType;
uint16 dsctPercent;
}
struct ItemForSale {
address owner;
ETypes.AssetItem nft;
Price[] prices;
}
struct Display {
address owner;
address beneficiary;
uint256 enableAfter;
uint256 disableAfter;
address priceModel;
ItemForSale[] items;
}
struct Place {
bytes32 display;
uint256 index;
}
}
文件 27 的 37:LibEnvelopTypes.sol
pragma solidity 0.8.21;
library ETypes {
enum AssetType {EMPTY, NATIVE, ERC20, ERC721, ERC1155, FUTURE1, FUTURE2, FUTURE3}
struct Asset {
AssetType assetType;
address contractAddress;
}
struct AssetItem {
Asset asset;
uint256 tokenId;
uint256 amount;
}
struct NFTItem {
address contractAddress;
uint256 tokenId;
}
struct Fee {
bytes1 feeType;
uint256 param;
address token;
}
struct Lock {
bytes1 lockType;
uint256 param;
}
struct Royalty {
address beneficiary;
uint16 percent;
}
struct WNFT {
AssetItem inAsset;
AssetItem[] collateral;
address unWrapDestination;
Fee[] fees;
Lock[] locks;
Royalty[] royalties;
bytes2 rules;
}
struct INData {
AssetItem inAsset;
address unWrapDestination;
Fee[] fees;
Lock[] locks;
Royalty[] royalties;
AssetType outType;
uint256 outBalance;
bytes2 rules;
}
struct WhiteListItem {
bool enabledForFee;
bool enabledForCollateral;
bool enabledRemoveFromCollateral;
address transferFeeModel;
}
struct Rules {
bytes2 onlythis;
bytes2 disabled;
}
}
文件 28 的 37:NFTKiosk.sol
pragma solidity 0.8.21;
import "@envelop-protocol-v1/contracts/TokenServiceExtended.sol";
import "@openzeppelin/contracts/token/ERC721/utils/ERC721Holder.sol";
import "@openzeppelin/contracts/token/ERC1155/utils/ERC1155Holder.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "../interfaces/IDisplayPriceModel.sol";
contract NFTKiosk is
TokenServiceExtended,
ReentrancyGuard,
ERC721Holder,
ERC1155Holder
{
uint256 constant public DEFAULT_INDEX = 0;
uint256 constant public PERCENT_DENOMINATOR = 10000;
bytes32 immutable public DEFAULT_DISPLAY = hlpHashString('NFTKiosk');
mapping(bytes32 => KTypes.Display) public displays;
mapping(bytes32 => address[]) public displayAdmins;
mapping(address => mapping(uint256 => KTypes.Place)) public assetAtDisplay;
event DisplayChanged(
bytes32 indexed display,
address indexed owner,
address indexed beneficiary,
uint256 enableAfter,
uint256 disableAfter,
address priceModel,
string name
);
event DisplayTransfer(
bytes32 indexed display,
address indexed from,
address indexed newOwner
);
event ItemAddedToDisplay(
bytes32 indexed display,
address indexed assetContract,
uint256 indexed assetTokenId,
uint256 placeIndex
);
event ItemPriceChanged(
bytes32 indexed display,
address indexed assetContract,
uint256 indexed assetTokenId
);
event EnvelopPurchase(
bytes32 indexed display,
address indexed assetContract,
uint256 indexed assetTokenId
);
event EnvelopReferrer(
address indexed referrer,
address indexed customer,
address indexed payWithToken,
uint256 payWithAmount,
uint16 percentDiscount
);
function setDisplayParams(
string calldata _name,
address _beneficiary,
uint256 _enableAfter,
uint256 _disableAfter,
address _priceModel
) public virtual
{
bytes32 _displayNameHash = hlpHashString(_name);
require(
(displays[_displayNameHash].owner == msg.sender
||displays[_displayNameHash].owner == address(0)),
"Only for Display Owner"
);
_setDisplayParams(
_displayNameHash,
msg.sender,
_beneficiary,
_enableAfter,
_disableAfter,
_priceModel
);
emit DisplayChanged(
_displayNameHash,
msg.sender,
_beneficiary,
_enableAfter,
_disableAfter,
_priceModel,
_name
);
}
function transferDisplay(address _to, bytes32 _displayNameHash)
external
{
require(displays[_displayNameHash].owner == msg.sender, "Only for Display Owner");
displays[_displayNameHash].owner = _to;
emit DisplayTransfer(_displayNameHash, msg.sender, _to);
}
function addItemToDisplay(
bytes32 _displayNameHash,
ETypes.AssetItem memory _assetItem,
KTypes.Price[] calldata _prices
)
public
returns (KTypes.Place memory place)
{
KTypes.Place memory p =
assetAtDisplay[_assetItem.asset.contractAddress][_assetItem.tokenId];
require(
p.display == bytes32(0) && p.index == 0,
"Already at display"
);
require(_assetItem.amount
<=_transferSafe(_assetItem, msg.sender, address(this)),
"Insufficient balance after NFT transfer"
);
if (msg.sender != displays[_displayNameHash].owner) {
require(
_displayNameHash == DEFAULT_DISPLAY,
"Only Default Display allow for any"
);
}
place = _addItemRecordAtDisplay(
_displayNameHash,
msg.sender,
_assetItem,
_prices
);
emit ItemAddedToDisplay(
place.display,
_assetItem.asset.contractAddress,
_assetItem.tokenId,
place.index
);
}
function addBatchItemsToDisplayWithSamePrice(
bytes32 _displayNameHash,
ETypes.AssetItem[] memory _assetItems,
KTypes.Price[] calldata _prices
)
external
returns (KTypes.Place[] memory)
{
KTypes.Place[] memory pls = new KTypes.Place[](_assetItems.length);
for (uint256 i = 0; i < _assetItems.length; ++i){
pls[i] = addItemToDisplay(_displayNameHash,_assetItems[i],_prices);
}
return pls;
}
function addAssetItemPriceAtIndex(
ETypes.AssetItem calldata _assetItem,
KTypes.Price[] calldata _prices
)
external
{
KTypes.Place memory p = getAssetItemPlace(_assetItem);
if (displays[p.display].items[p.index].owner != msg.sender)
{
require(
displays[p.display].owner == msg.sender,
"Only display owner can edit price"
);
}
_addItemPriceAtIndex(p.display, p.index, _prices);
emit ItemPriceChanged(
p.display,
_assetItem.asset.contractAddress,
_assetItem.tokenId
);
}
function editAssetItemPriceAtIndex(
ETypes.AssetItem calldata _assetItem,
uint256 _priceIndex,
KTypes.Price calldata _price
)
external
{
KTypes.Place memory p = getAssetItemPlace(_assetItem);
if (displays[p.display].items[p.index].owner != msg.sender)
{
require(displays[p.display].owner == msg.sender, "Only for display owner");
}
_editItemPriceAtIndex(p.display, p.index, _priceIndex ,_price);
emit ItemPriceChanged(
p.display,
_assetItem.asset.contractAddress,
_assetItem.tokenId
);
}
function removeLastPersonalPriceForAssetItem(
ETypes.AssetItem calldata _assetItem
)
external
{
KTypes.Place memory p = getAssetItemPlace(_assetItem);
if (displays[p.display].items[p.index].owner != msg.sender)
{
require(displays[p.display].owner == msg.sender, "Only for display owner");
}
KTypes.Price[] storage priceArray = displays[p.display].items[p.index].prices;
priceArray.pop();
emit ItemPriceChanged(
p.display,
_assetItem.asset.contractAddress,
_assetItem.tokenId
);
}
function buyAssetItem(
ETypes.AssetItem calldata _assetItem,
uint256 _priceIndex,
address _buyer,
address _referrer,
string calldata _promo
) external virtual payable nonReentrant
{
ETypes.AssetItem memory payWithItem;
{
(KTypes.Price[] memory pArray, KTypes.Discount[] memory dArray)
= _getAssetItemPricesAndDiscounts(
_assetItem, _buyer, _referrer, hlpHashString(_promo)
);
uint256 totalDiscountPercent;
for (uint256 i = 0; i < dArray.length; ++ i){
totalDiscountPercent += dArray[i].dsctPercent;
if (dArray[i].dsctType ==KTypes.DiscountType.REFERRAL){
emit EnvelopReferrer(
_referrer, msg.sender,
pArray[_priceIndex].payWith,
pArray[_priceIndex].amount,
uint16(dArray[i].dsctPercent)
);
}
}
payWithItem = ETypes.AssetItem(
ETypes.Asset(
pArray[_priceIndex].payWith == address(0)
?ETypes.AssetType.NATIVE
:ETypes.AssetType.ERC20,
pArray[_priceIndex].payWith
),
0,
pArray[_priceIndex].amount
* (PERCENT_DENOMINATOR - totalDiscountPercent) / PERCENT_DENOMINATOR
);
}
KTypes.Place memory p = getAssetItemPlace(_assetItem);
address beneficiary;
if (p.display == bytes32(0)) {
beneficiary = displays[DEFAULT_DISPLAY].beneficiary;
p.display = DEFAULT_DISPLAY;
p.index = DEFAULT_INDEX;
} else {
beneficiary = displays[p.display].beneficiary;
_removeAssetItemRecord(p.display, p.index,_assetItem);
}
require(
displays[p.display].enableAfter < block.timestamp
&& displays[p.display].disableAfter >= block.timestamp,
"Only in time"
);
if (!_canBuyForFree(p.display, msg.sender)) {
_receivePayment(payWithItem, beneficiary);
}
_transferSafe(_assetItem, address(this), _buyer);
emit EnvelopPurchase(p.display, _assetItem.asset.contractAddress, _assetItem.tokenId);
}
function addAdminToDisplay(bytes32 _displayNameHash, address _admin)
external
{
require(
displays[_displayNameHash].owner == msg.sender,
"Only display owner can add admins"
);
require(
!_isDisplayAdmin(_displayNameHash, _admin),
"Already admin"
);
displayAdmins[_displayNameHash].push(_admin);
}
function removeAdminFromDisplayByIndex(bytes32 _displayNameHash, uint256 _adminIndex)
external
{
require(
displays[_displayNameHash].owner == msg.sender,
"Only display owner can add admins"
);
address[] storage admins = displayAdmins[_displayNameHash];
if (_adminIndex != admins.length - 1) {
admins[_adminIndex] = admins[admins.length - 1];
}
admins.pop();
}
function getDisplayOwner(bytes32 _displayNameHash) public view returns (address) {
return displays[_displayNameHash].owner;
}
function getDisplay(bytes32 _displayNameHash)
public
view
returns (KTypes.Display memory)
{
return displays[_displayNameHash];
}
function getAssetItemPlace(ETypes.AssetItem memory _assetItem)
public
view
returns (KTypes.Place memory)
{
if (_assetItem.asset.assetType == ETypes.AssetType.ERC721) {
require(
_ownerOf(_assetItem) == address(this),
"Asset not transfered to kiosk"
);
} else {
require(
_balanceOf(_assetItem, address(this)) > 0,
"Asset not transfered to kiosk"
);
}
return assetAtDisplay[_assetItem.asset.contractAddress][_assetItem.tokenId];
}
function getAssetItemPricesAndDiscounts(
ETypes.AssetItem memory _assetItem,
address _buyer,
address _referrer,
string calldata _promo
)
external
view
returns (KTypes.Price[] memory, KTypes.Discount[] memory)
{
return _getAssetItemPricesAndDiscounts(
_assetItem,
_buyer,
_referrer,
hlpHashString(_promo)
);
}
function getDisplayAssetItems(bytes32 _displayNameHash)
public
view
virtual
returns (KTypes.ItemForSale[] memory)
{
return displays[_displayNameHash].items;
}
function getAssetItem(ETypes.AssetItem memory _assetItem)
public
view
returns (KTypes.ItemForSale memory)
{
KTypes.Place memory p = getAssetItemPlace(_assetItem);
return displays[p.display].items[p.index];
}
function hlpHashString(string memory _name) public pure returns (bytes32) {
return keccak256(abi.encode(_name));
}
function canBuyForFree(bytes32 _displayNameHash, address _who)
external
view
returns(bool)
{
return _canBuyForFree(_displayNameHash, _who);
}
function isDisplayAdmin(bytes32 _displayNameHash, address _who)
external
view
returns(bool)
{
return _isDisplayAdmin(_displayNameHash, _who);
}
function _setDisplayParams(
bytes32 _displayNameHash,
address _owner,
address _beneficiary,
uint256 _enableAfter,
uint256 _disableAfter,
address _priceModel
)
internal
{
KTypes.Display storage d = displays[_displayNameHash];
d.owner = _owner;
d.beneficiary = _beneficiary;
d.enableAfter = _enableAfter;
d.disableAfter = _disableAfter;
d.priceModel = _priceModel;
}
function _addItemRecordAtDisplay(
bytes32 _displayNameHash,
address _itemOwner,
ETypes.AssetItem memory _nft,
KTypes.Price[] calldata _prices
)
internal
returns (KTypes.Place memory)
{
KTypes.ItemForSale storage it = displays[_displayNameHash].items.push();
it.owner = _itemOwner;
it.nft = _nft;
if (_prices.length > 0){
for (uint256 i = 0; i < _prices.length; ++ i) {
it.prices.push(_prices[i]);
}
}
assetAtDisplay[_nft.asset.contractAddress][_nft.tokenId] = KTypes.Place(
_displayNameHash,
displays[_displayNameHash].items.length - 1
);
return assetAtDisplay[_nft.asset.contractAddress][_nft.tokenId];
}
function _addItemPriceAtIndex(
bytes32 _displayNameHash,
uint256 _itemIndex,
KTypes.Price[] calldata _prices
)
internal
{
KTypes.ItemForSale storage it = displays[_displayNameHash].items[_itemIndex];
for (uint256 i = 0; i < _prices.length; ++ i) {
it.prices.push(_prices[i]);
}
}
function _editItemPriceAtIndex(
bytes32 _displayNameHash,
uint256 _itemIndex,
uint256 _priceIndex,
KTypes.Price calldata _price
)
internal
{
displays[_displayNameHash].items[_itemIndex].prices[_priceIndex] = _price;
}
function _removeAssetItemRecord(
bytes32 _displayNameHash,
uint256 _itemIndex,
ETypes.AssetItem calldata _assetItem
)
internal
{
if (_itemIndex != displays[_displayNameHash].items.length - 1) {
displays[_displayNameHash].items[_itemIndex] = displays[_displayNameHash].items[
displays[_displayNameHash].items.length - 1
];
assetAtDisplay[
displays[_displayNameHash].items[_itemIndex].nft.asset.contractAddress
][
displays[_displayNameHash].items[_itemIndex].nft.tokenId
] = KTypes.Place(
_displayNameHash,
_itemIndex
);
}
displays[_displayNameHash].items.pop();
delete assetAtDisplay[_assetItem.asset.contractAddress][_assetItem.tokenId];
}
function _receivePayment(
ETypes.AssetItem memory _payWithItem,
address _beneficiary
) internal {
if (_payWithItem.asset.assetType == ETypes.AssetType.NATIVE )
{
require(_payWithItem.amount
<= _transferSafe(_payWithItem, address(this), _beneficiary),
"Insufficient balance after payment transfer"
);
if ((msg.value - _payWithItem.amount) > 0) {
address payable s = payable(msg.sender);
s.transfer(msg.value - _payWithItem.amount);
}
} else {
require(msg.value == 0, "Only ERC20 tokens");
require(_payWithItem.amount
<=_transferSafe(_payWithItem, msg.sender, _beneficiary),
"Insufficient balance after payment transfer"
);
}
}
function _getAssetItemPricesAndDiscounts(
ETypes.AssetItem memory _assetItem,
address _buyer,
address _referrer,
bytes32 _promoHash
)
internal
view
virtual
returns(KTypes.Price[] memory, KTypes.Discount[] memory)
{
KTypes.Place memory pl = getAssetItemPlace(_assetItem);
if (pl.display == bytes32(0) && pl.index == 0){
return (
IDisplayPriceModel(displays[DEFAULT_DISPLAY].priceModel).getItemPrices(_assetItem),
IDisplayPriceModel(displays[DEFAULT_DISPLAY].priceModel).getItemDiscounts(
_assetItem,
_buyer,
_referrer,
_promoHash
)
);
}
if (displays[pl.display].items[pl.index].prices.length > 0)
{
return (
displays[pl.display].items[pl.index].prices,
IDisplayPriceModel(displays[pl.display].priceModel).getItemDiscounts(
_assetItem,
_buyer,
_referrer,
_promoHash
)
);
}
return (
IDisplayPriceModel(displays[pl.display].priceModel).getItemPrices(_assetItem),
IDisplayPriceModel(displays[pl.display].priceModel).getItemDiscounts(
_assetItem,
_buyer,
_referrer,
_promoHash
)
);
}
function _canBuyForFree(bytes32 _displayNameHash, address _who)
internal
view
returns(bool _can)
{
if (displays[_displayNameHash].owner == _who) {
_can = true;
}
}
function _isDisplayAdmin(bytes32 _displayNameHash, address _who)
internal
view
returns(bool _isAdmin)
{
address[] memory admins = displayAdmins[_displayNameHash];
for (uint256 i = 0; i < admins.length; ++ i) {
if (admins[i] == _who) {
_isAdmin = true;
}
}
}
}
文件 29 的 37:NFTKioskLazy.sol
pragma solidity 0.8.21;
import "./NFTKiosk.sol";
contract NFTKioskLazy is NFTKiosk {
function buyAssetItem(
ETypes.AssetItem calldata _assetItem,
uint256 _priceIndex,
address _buyer,
address _referrer,
string calldata _promo
) external override payable nonReentrant
{
ETypes.AssetItem memory payWithItem;
{
(KTypes.Price[] memory pArray, KTypes.Discount[] memory dArray)
= _getAssetItemPricesAndDiscounts(
_assetItem, _buyer, _referrer, hlpHashString(_promo)
);
uint256 totalDiscountPercent;
for (uint256 i = 0; i < dArray.length; ++ i){
totalDiscountPercent += dArray[i].dsctPercent;
if (dArray[i].dsctType == KTypes.DiscountType.REFERRAL){
emit EnvelopReferrer(
_referrer, msg.sender,
pArray[_priceIndex].payWith,
pArray[_priceIndex].amount,
uint16(dArray[i].dsctPercent)
);
}
}
payWithItem = ETypes.AssetItem(
ETypes.Asset(
pArray[_priceIndex].payWith == address(0)
?ETypes.AssetType.NATIVE
:ETypes.AssetType.ERC20,
pArray[_priceIndex].payWith
),
0,
pArray[_priceIndex].amount
* (PERCENT_DENOMINATOR - totalDiscountPercent)
* (_assetItem.amount == 0 ? 1 : _assetItem.amount)
/ PERCENT_DENOMINATOR
);
}
address beneficiary;
address modelAddress;
bool hasRecord;
KTypes.Place memory p = getAssetItemPlace(_assetItem);
if (p.display == bytes32(0)) {
beneficiary = displays[DEFAULT_DISPLAY].beneficiary;
p.display = DEFAULT_DISPLAY;
p.index = DEFAULT_INDEX;
modelAddress = displays[DEFAULT_DISPLAY].priceModel;
} else {
beneficiary = displays[p.display].beneficiary;
modelAddress = displays[p.display].priceModel;
hasRecord = true;
}
require(
displays[p.display].enableAfter < block.timestamp
&& displays[p.display].disableAfter >= block.timestamp,
"Only in time"
);
if (!_canBuyForFree(p.display, msg.sender)) {
_receivePayment(payWithItem, beneficiary);
if (IDisplayPriceModel(modelAddress).makeActionInModel(_assetItem, _buyer)) {
if (hasRecord) {
_removeAssetItemRecord(p.display, p.index,_assetItem);
}
_transferSafe(_assetItem, address(this), _buyer);
emit EnvelopPurchase(p.display, _assetItem.asset.contractAddress, _assetItem.tokenId);
}
}
else {
if (hasRecord) {
_removeAssetItemRecord(p.display, p.index,_assetItem);
}
_transferSafe(_assetItem, address(this), _buyer);
emit EnvelopPurchase(p.display, _assetItem.asset.contractAddress, _assetItem.tokenId);
}
}
}
文件 30 的 37: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);
}
}
文件 31 的 37: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;
}
}
文件 32 的 37: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));
}
}
文件 33 的 37:ServiceProvider.sol
pragma solidity 0.8.21;
import "../interfaces/ISubscriptionRegistry.sol";
abstract contract ServiceProvider {
address public serviceProvider;
ISubscriptionRegistry public subscriptionRegistry;
bool public isEnabled = true;
constructor(address _subscrRegistry) {
require(_subscrRegistry != address(0), 'Non zero only');
serviceProvider = address(this);
subscriptionRegistry = ISubscriptionRegistry(_subscrRegistry);
}
function _registerServiceTariff(Tariff memory _newTariff)
internal virtual returns(uint256)
{
return subscriptionRegistry.registerServiceTariff(_newTariff);
}
function _editServiceTariff(
uint256 _tariffIndex,
uint256 _timelockPeriod,
uint256 _ticketValidPeriod,
uint256 _counter,
bool _isAvailable,
address _beneficiary
) internal virtual
{
subscriptionRegistry.editServiceTariff(
_tariffIndex,
_timelockPeriod,
_ticketValidPeriod,
_counter,
_isAvailable,
_beneficiary
);
}
function _addTariffPayOption(
uint256 _tariffIndex,
address _paymentToken,
uint256 _paymentAmount,
uint16 _agentFeePercent
) internal virtual returns(uint256)
{
return subscriptionRegistry.addTariffPayOption(
_tariffIndex,
_paymentToken,
_paymentAmount,
_agentFeePercent
);
}
function _editTariffPayOption(
uint256 _tariffIndex,
uint256 _payWithIndex,
address _paymentToken,
uint256 _paymentAmount,
uint16 _agentFeePercent
) internal virtual
{
subscriptionRegistry.editTariffPayOption(
_tariffIndex,
_payWithIndex,
_paymentToken,
_paymentAmount,
_agentFeePercent
);
}
function _authorizeAgentForService(
address _agent,
uint256[] memory _serviceTariffIndexes
) internal virtual returns (uint256[] memory)
{
return subscriptionRegistry.authorizeAgentForService(
_agent,
_serviceTariffIndexes
);
}
function _checkAndFixSubscription(address _user)
internal
returns (bool ok)
{
if (isEnabled) {
ok = subscriptionRegistry.checkAndFixUserSubscription(
_user
);
} else {
ok = true;
}
}
function _checkUserSubscription(address _user)
internal
view
returns (bool ok, bool needFix)
{
if (isEnabled) {
(ok, needFix) = subscriptionRegistry.checkUserSubscription(
_user,
address(this)
);
} else {
ok = true;
}
}
}
文件 34 的 37:ServiceProviderOwnable.sol
pragma solidity 0.8.21;
import "@openzeppelin/contracts/access/Ownable.sol";
import "./ServiceProvider.sol";
contract ServiceProviderOwnable is ServiceProvider, Ownable {
constructor(address _subscrRegistry)
ServiceProvider(_subscrRegistry)
{
}
function newTariff(Tariff memory _newTariff) external onlyOwner returns(uint256 tariffIndex) {
tariffIndex = _registerServiceTariff(_newTariff);
}
function registerServiceTariff(Tariff memory _newTariff)
external onlyOwner returns(uint256)
{
return _registerServiceTariff(_newTariff);
}
function editServiceTariff(
uint256 _tariffIndex,
uint256 _timelockPeriod,
uint256 _ticketValidPeriod,
uint256 _counter,
bool _isAvailable,
address _beneficiary
) external onlyOwner
{
_editServiceTariff(
_tariffIndex,
_timelockPeriod,
_ticketValidPeriod,
_counter,
_isAvailable,
_beneficiary
);
}
function addPayOption(
uint256 _tariffIndex,
address _paymentToken,
uint256 _paymentAmount,
uint16 _agentFeePercent
) external onlyOwner returns(uint256 index)
{
index = _addTariffPayOption(
_tariffIndex,
_paymentToken,
_paymentAmount,
_agentFeePercent
);
}
function editPayOption(
uint256 _tariffIndex,
uint256 _payWithIndex,
address _paymentToken,
uint256 _paymentAmount,
uint16 _agentFeePercent
) external onlyOwner
{
_editTariffPayOption(
_tariffIndex,
_payWithIndex,
_paymentToken,
_paymentAmount,
_agentFeePercent
);
}
function authorizeAgentForService(
address _agent,
uint256[] memory _serviceTariffIndexes
) external onlyOwner returns (uint256[] memory actualTariffs)
{
actualTariffs = _authorizeAgentForService(
_agent,
_serviceTariffIndexes
);
}
function setSubscriptionRegistry(address _subscrRegistry) external onlyOwner {
subscriptionRegistry = ISubscriptionRegistry(_subscrRegistry);
}
function setSubscriptionOnOff(bool _isEnable) external onlyOwner {
isEnabled = _isEnable;
}
}
文件 35 的 37:SubscriptionRegistry.sol
pragma solidity 0.8.21;
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "@envelop-protocol-v1/interfaces/ITrustedWrapper.sol";
import "@envelop-protocol-v1/contracts/LibEnvelopTypes.sol";
import "../interfaces/ISubscriptionRegistry.sol";
struct SubscriptionType {
uint256 timelockPeriod;
uint256 ticketValidPeriod;
uint256 counter;
bool isAvailable;
address beneficiary;
}
struct PayOption {
address paymentToken;
uint256 paymentAmount;
uint16 agentFeePercent;
}
struct Tariff {
SubscriptionType subscription;
PayOption[] payWith;
}
struct Ticket {
uint256 validUntil;
uint256 countsLeft;
}
contract SubscriptionRegistry is Ownable {
using SafeERC20 for IERC20;
uint256 constant public PERCENT_DENOMINATOR = 10000;
address public platformOwner;
uint16 public platformFeePercent = 50;
address public mainWrapper;
address public previousRegistry;
address public proxyRegistry;
mapping(address => bool) public whiteListedForPayments;
mapping(address => Tariff[]) public availableTariffs;
mapping(address => mapping(address => uint256[])) public agentServiceRegistry;
mapping(address => mapping(address => Ticket)) public userTickets;
event PlatfromFeeChanged(uint16 indexed newPercent);
event WhitelistPaymentTokenChanged(address indexed asset, bool indexed state);
event TariffChanged(address indexed service, uint256 indexed tariffIndex);
event TicketIssued(
address indexed service,
address indexed agent,
address indexed forUser,
uint256 tariffIndex
);
constructor(address _platformOwner) {
require(_platformOwner != address(0),'Zero platform fee receiver');
platformOwner = _platformOwner;
}
function registerServiceTariff(Tariff calldata _newTariff)
external
returns(uint256)
{
return _addTariff(msg.sender, _newTariff);
}
function editServiceTariff(
uint256 _tariffIndex,
uint256 _timelockPeriod,
uint256 _ticketValidPeriod,
uint256 _counter,
bool _isAvailable,
address _beneficiary
)
external
{
_editTariff(
msg.sender,
_tariffIndex,
_timelockPeriod,
_ticketValidPeriod,
_counter,
_isAvailable,
_beneficiary
);
}
function addTariffPayOption(
uint256 _tariffIndex,
address _paymentToken,
uint256 _paymentAmount,
uint16 _agentFeePercent
) external returns(uint256)
{
return _addTariffPayOption(
msg.sender,
_tariffIndex,
_paymentToken,
_paymentAmount,
_agentFeePercent
);
}
function editTariffPayOption(
uint256 _tariffIndex,
uint256 _payWithIndex,
address _paymentToken,
uint256 _paymentAmount,
uint16 _agentFeePercent
) external
{
_editTariffPayOption(
msg.sender,
_tariffIndex,
_payWithIndex,
_paymentToken,
_paymentAmount,
_agentFeePercent
);
}
function authorizeAgentForService(
address _agent,
uint256[] calldata _serviceTariffIndexes
) external virtual returns (uint256[] memory)
{
delete agentServiceRegistry[msg.sender][_agent];
uint256[] storage currentServiceTariffsOfAgent = agentServiceRegistry[msg.sender][_agent];
for(uint256 i; i < _serviceTariffIndexes.length; ++ i) {
if (availableTariffs[msg.sender][_serviceTariffIndexes[i]].subscription.isAvailable){
currentServiceTariffsOfAgent.push(_serviceTariffIndexes[i]);
}
}
return currentServiceTariffsOfAgent;
}
function buySubscription(
address _service,
uint256 _tariffIndex,
uint256 _payWithIndex,
address _buyFor,
address _payer
) external
payable
returns(Ticket memory ticket) {
require(_buyFor != address(0),'Cant buy ticket for nobody');
require(
availableTariffs[_service][_tariffIndex].subscription.isAvailable,
'This subscription not available'
);
require(
_isAgentAuthorized(msg.sender, _service, _tariffIndex),
'Agent not authorized for this service tariff'
);
(bool isValid, bool needFix) = _isTicketValid(_buyFor, _service);
require(!isValid, 'Only one valid ticket at time');
ticket = Ticket(
availableTariffs[_service][_tariffIndex].subscription.ticketValidPeriod + block.timestamp,
availableTariffs[_service][_tariffIndex].subscription.counter
);
userTickets[_buyFor][_service] = ticket;
if (availableTariffs[_service][_tariffIndex].payWith[_payWithIndex].paymentAmount > 0){
_processPayment(_service, _tariffIndex, _payWithIndex, _payer);
}
emit TicketIssued(_service, msg.sender, _buyFor, _tariffIndex);
}
function checkAndFixUserSubscription(
address _user
) external returns (bool ok){
address _service = msg.sender;
(bool isValid, bool needFix) = _isTicketValid(_user, msg.sender);
if (!isValid && previousRegistry != address(0)) {
(isValid, needFix) = ISubscriptionRegistry(previousRegistry).checkUserSubscription(
_user,
_service
);
if (isValid ) {
if (needFix){
ISubscriptionRegistry(previousRegistry).fixUserSubscription(
_user,
_service
);
}
ok = true;
return ok;
}
}
require(isValid,'Valid ticket not found');
if (needFix){
_fixUserSubscription(_user, msg.sender);
}
ok = true;
}
function fixUserSubscription(
address _user,
address _serviceFromProxy
) public {
require(proxyRegistry !=address(0) && msg.sender == proxyRegistry,
'Only for future registry'
);
_fixUserSubscription(_user, _serviceFromProxy);
}
function checkUserSubscription(
address _user,
address _service
) external view returns (bool ok, bool needFix) {
(ok, needFix) = _isTicketValid(_user, _service);
if (!ok && previousRegistry != address(0)) {
(ok, needFix) = ISubscriptionRegistry(previousRegistry).checkUserSubscription(
_user,
_service
);
}
}
function getUserTicketForService(
address _service,
address _user
) public view returns(Ticket memory)
{
return userTickets[_user][_service];
}
function getTariffsForService(address _service) external view returns (Tariff[] memory) {
return availableTariffs[_service];
}
function getTicketPrice(
address _service,
uint256 _tariffIndex,
uint256 _payWithIndex
) public view virtual returns (address, uint256)
{
if (availableTariffs[_service][_tariffIndex].subscription.timelockPeriod != 0)
{
return(
availableTariffs[_service][_tariffIndex].payWith[_payWithIndex].paymentToken,
availableTariffs[_service][_tariffIndex].payWith[_payWithIndex].paymentAmount
);
} else {
return(
availableTariffs[_service][_tariffIndex].payWith[_payWithIndex].paymentToken,
availableTariffs[_service][_tariffIndex].payWith[_payWithIndex].paymentAmount
+ availableTariffs[_service][_tariffIndex].payWith[_payWithIndex].paymentAmount
*availableTariffs[_service][_tariffIndex].payWith[_payWithIndex].agentFeePercent
/PERCENT_DENOMINATOR
+ availableTariffs[_service][_tariffIndex].payWith[_payWithIndex].paymentAmount
*_platformFeePercent(_service, _tariffIndex, _payWithIndex)
/PERCENT_DENOMINATOR
);
}
}
function getAvailableAgentsTariffForService(
address _agent,
address _service
) external view virtual returns(uint256[] memory, Tariff[] memory)
{
uint256 availableCount;
for (uint256 i; i < agentServiceRegistry[_service][_agent].length; ++i){
if (availableTariffs[_service][
agentServiceRegistry[_service][_agent][i]
].subscription.isAvailable
) {++availableCount;}
}
Tariff[] memory tariffs = new Tariff[](availableCount);
uint256[] memory indexes = new uint256[](availableCount);
for (uint256 i; i < agentServiceRegistry[_service][_agent].length; ++i){
if (availableTariffs[_service][
agentServiceRegistry[_service][_agent][i]
].subscription.isAvailable
)
{
tariffs[availableCount - 1] = availableTariffs[_service][
agentServiceRegistry[_service][_agent][i]
];
indexes[availableCount - 1] = agentServiceRegistry[_service][_agent][i];
--availableCount;
}
}
return (indexes, tariffs);
}
function setAssetForPaymentState(address _asset, bool _isEnable)
external onlyOwner
{
whiteListedForPayments[_asset] = _isEnable;
emit WhitelistPaymentTokenChanged(_asset, _isEnable);
}
function setMainWrapper(address _wrapper) external onlyOwner {
mainWrapper = _wrapper;
}
function setPlatformOwner(address _newOwner) external {
require(msg.sender == platformOwner, 'Only platform owner');
require(_newOwner != address(0),'Zero platform fee receiver');
platformOwner = _newOwner;
}
function setPlatformFeePercent(uint16 _newPercent) external {
require(msg.sender == platformOwner, 'Only platform owner');
platformFeePercent = _newPercent;
emit PlatfromFeeChanged(platformFeePercent);
}
function setPreviousRegistry(address _registry) external onlyOwner {
previousRegistry = _registry;
}
function setProxyRegistry(address _registry) external onlyOwner {
proxyRegistry = _registry;
}
function _processPayment(
address _service,
uint256 _tariffIndex,
uint256 _payWithIndex,
address _payer
)
internal
virtual
returns(bool)
{
if (availableTariffs[_service][_tariffIndex].subscription.timelockPeriod != 0){
require(msg.value == 0, 'Ether Not accepted in this method');
IERC20(
availableTariffs[_service][_tariffIndex].payWith[_payWithIndex].paymentToken
).safeTransferFrom(
_payer,
address(this),
availableTariffs[_service][_tariffIndex].payWith[_payWithIndex].paymentAmount
);
IERC20(
availableTariffs[_service][_tariffIndex].payWith[_payWithIndex].paymentToken
).safeApprove(
mainWrapper,
availableTariffs[_service][_tariffIndex].payWith[_payWithIndex].paymentAmount
);
ETypes.INData memory _inData;
ETypes.AssetItem[] memory _collateralERC20 = new ETypes.AssetItem[](1);
ETypes.Lock[] memory timeLock = new ETypes.Lock[](1);
timeLock[0] = ETypes.Lock(
0x00,
availableTariffs[_service][_tariffIndex].subscription.timelockPeriod + block.timestamp
);
_inData = ETypes.INData(
ETypes.AssetItem(
ETypes.Asset(ETypes.AssetType.EMPTY, address(0)),
0,0
),
address(0),
new ETypes.Fee[](0),
timeLock,
new ETypes.Royalty[](0),
ETypes.AssetType.ERC721,
0,
0x0000
);
_collateralERC20[0] = ETypes.AssetItem(
ETypes.Asset(
ETypes.AssetType.ERC20,
availableTariffs[_service][_tariffIndex].payWith[_payWithIndex].paymentToken
),
0,
availableTariffs[_service][_tariffIndex].payWith[_payWithIndex].paymentAmount
);
ITrustedWrapper(mainWrapper).wrap(
_inData,
_collateralERC20,
_payer
);
} else {
if (availableTariffs[_service][_tariffIndex]
.payWith[_payWithIndex]
.paymentToken != address(0)
)
{
require(msg.value == 0, 'Ether Not accepted in this method');
IERC20(
availableTariffs[_service][_tariffIndex].payWith[_payWithIndex].paymentToken
).safeTransferFrom(
_payer,
availableTariffs[_service][_tariffIndex].subscription.beneficiary,
availableTariffs[_service][_tariffIndex].payWith[_payWithIndex].paymentAmount
);
IERC20(
availableTariffs[_service][_tariffIndex].payWith[_payWithIndex].paymentToken
).safeTransferFrom(
_payer,
msg.sender,
availableTariffs[_service][_tariffIndex].payWith[_payWithIndex].paymentAmount
*availableTariffs[_service][_tariffIndex].payWith[_payWithIndex].agentFeePercent
/PERCENT_DENOMINATOR
);
uint256 _pFee = _platformFeePercent(_service, _tariffIndex, _payWithIndex);
if (_pFee > 0) {
IERC20(
availableTariffs[_service][_tariffIndex].payWith[_payWithIndex].paymentToken
).safeTransferFrom(
_payer,
platformOwner,
availableTariffs[_service][_tariffIndex].payWith[_payWithIndex].paymentAmount
*_pFee
/PERCENT_DENOMINATOR
);
}
} else {
(, uint256 needPay) = getTicketPrice(_service, _tariffIndex,_payWithIndex);
require(msg.value >= needPay, 'Not enough ether');
sendValue(
payable(availableTariffs[_service][_tariffIndex].subscription.beneficiary),
availableTariffs[_service][_tariffIndex].payWith[_payWithIndex].paymentAmount
);
sendValue(
payable(msg.sender),
availableTariffs[_service][_tariffIndex].payWith[_payWithIndex].paymentAmount
*availableTariffs[_service][_tariffIndex].payWith[_payWithIndex].agentFeePercent
/PERCENT_DENOMINATOR
);
uint256 _pFee = _platformFeePercent(_service, _tariffIndex, _payWithIndex);
if (_pFee > 0) {
sendValue(
payable(platformOwner),
availableTariffs[_service][_tariffIndex].payWith[_payWithIndex].paymentAmount
*_pFee
/PERCENT_DENOMINATOR
);
}
if ((msg.value - needPay) > 0) {
address payable s = payable(_payer);
s.transfer(msg.value - needPay);
}
}
}
}
function _platformFeePercent(
address _service,
uint256 _tariffIndex,
uint256 _payWithIndex
) internal view virtual returns(uint256)
{
return platformFeePercent;
}
function _addTariff(address _service, Tariff calldata _newTariff)
internal returns(uint256)
{
require (_newTariff.payWith.length > 0, 'No payment method');
for (uint256 i; i < _newTariff.payWith.length; ++i){
require(
whiteListedForPayments[_newTariff.payWith[i].paymentToken],
'Not whitelisted for payments'
);
}
require(
_newTariff.subscription.ticketValidPeriod > 0
|| _newTariff.subscription.counter > 0,
'Tariff has no valid ticket option'
);
availableTariffs[_service].push(_newTariff);
emit TariffChanged(_service, availableTariffs[_service].length - 1);
return availableTariffs[_service].length - 1;
}
function _editTariff(
address _service,
uint256 _tariffIndex,
uint256 _timelockPeriod,
uint256 _ticketValidPeriod,
uint256 _counter,
bool _isAvailable,
address _beneficiary
) internal
{
availableTariffs[_service][_tariffIndex].subscription.timelockPeriod = _timelockPeriod;
availableTariffs[_service][_tariffIndex].subscription.ticketValidPeriod = _ticketValidPeriod;
availableTariffs[_service][_tariffIndex].subscription.counter = _counter;
availableTariffs[_service][_tariffIndex].subscription.isAvailable = _isAvailable;
availableTariffs[_service][_tariffIndex].subscription.beneficiary = _beneficiary;
emit TariffChanged(_service, _tariffIndex);
}
function _addTariffPayOption(
address _service,
uint256 _tariffIndex,
address _paymentToken,
uint256 _paymentAmount,
uint16 _agentFeePercent
) internal returns(uint256)
{
require(whiteListedForPayments[_paymentToken], 'Not whitelisted for payments');
availableTariffs[_service][_tariffIndex].payWith.push(
PayOption(_paymentToken, _paymentAmount, _agentFeePercent)
);
emit TariffChanged(_service, _tariffIndex);
return availableTariffs[_service][_tariffIndex].payWith.length - 1;
}
function _editTariffPayOption(
address _service,
uint256 _tariffIndex,
uint256 _payWithIndex,
address _paymentToken,
uint256 _paymentAmount,
uint16 _agentFeePercent
) internal
{
require(whiteListedForPayments[_paymentToken], 'Not whitelisted for payments');
availableTariffs[_service][_tariffIndex].payWith[_payWithIndex]
= PayOption(_paymentToken, _paymentAmount, _agentFeePercent);
emit TariffChanged(_service, _tariffIndex);
}
function _fixUserSubscription(
address _user,
address _service
) internal {
if (userTickets[_user][_service].countsLeft > 0) {
-- userTickets[_user][_service].countsLeft;
}
}
function _isTicketValid(address _user, address _service)
internal
view
returns (bool isValid, bool needFix )
{
isValid = userTickets[_user][_service].validUntil > block.timestamp
|| userTickets[_user][_service].countsLeft > 0;
needFix = userTickets[_user][_service].countsLeft > 0;
}
function _isAgentAuthorized(
address _agent,
address _service,
uint256 _tariffIndex
)
internal
view
returns(bool authorized)
{
for (uint256 i; i < agentServiceRegistry[_service][_agent].length; ++ i){
if (agentServiceRegistry[_service][_agent][i] == _tariffIndex){
authorized = true;
return authorized;
}
}
}
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");
}
}
文件 36 的 37:TokenService.sol
pragma solidity 0.8.21;
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "../interfaces/IERC20Extended.sol";
import "./LibEnvelopTypes.sol";
import "../interfaces/IERC721Mintable.sol";
import "../interfaces/IERC1155Mintable.sol";
abstract contract TokenService {
using SafeERC20 for IERC20Extended;
error UnSupportedAsset(ETypes.AssetItem asset);
function _mintNFT(
ETypes.AssetType _mint_type,
address _contract,
address _mintFor,
uint256 _tokenId,
uint256 _outBalance
)
internal
virtual
{
if (_mint_type == ETypes.AssetType.ERC721) {
IERC721Mintable(_contract).mint(_mintFor, _tokenId);
} else if (_mint_type == ETypes.AssetType.ERC1155) {
IERC1155Mintable(_contract).mint(_mintFor, _tokenId, _outBalance);
}else {
revert UnSupportedAsset(
ETypes.AssetItem(
ETypes.Asset(_mint_type, _contract),
_tokenId, _outBalance
)
);
}
}
function _burnNFT(
ETypes.AssetType _burn_type,
address _contract,
address _burnFor,
uint256 _tokenId,
uint256 _balance
)
internal
virtual
{
if (_burn_type == ETypes.AssetType.ERC721) {
IERC721Mintable(_contract).burn(_tokenId);
} else if (_burn_type == ETypes.AssetType.ERC1155) {
IERC1155Mintable(_contract).burn(_burnFor, _tokenId, _balance);
}
}
function _transfer(
ETypes.AssetItem memory _assetItem,
address _from,
address _to
) internal virtual returns (bool _transfered){
if (_assetItem.asset.assetType == ETypes.AssetType.NATIVE) {
(bool success, ) = _to.call{ value: _assetItem.amount}("");
require(success, "transfer failed");
_transfered = true;
} else if (_assetItem.asset.assetType == ETypes.AssetType.ERC20) {
require(IERC20Extended(_assetItem.asset.contractAddress).balanceOf(_from) <= _assetItem.amount, "UPS!!!!");
IERC20Extended(_assetItem.asset.contractAddress).safeTransferFrom(_from, _to, _assetItem.amount);
_transfered = true;
} else if (_assetItem.asset.assetType == ETypes.AssetType.ERC721) {
IERC721Mintable(_assetItem.asset.contractAddress).transferFrom(_from, _to, _assetItem.tokenId);
_transfered = true;
} else if (_assetItem.asset.assetType == ETypes.AssetType.ERC1155) {
IERC1155Mintable(_assetItem.asset.contractAddress).safeTransferFrom(_from, _to, _assetItem.tokenId, _assetItem.amount, "");
_transfered = true;
} else {
revert UnSupportedAsset(_assetItem);
}
return _transfered;
}
function _transferSafe(
ETypes.AssetItem memory _assetItem,
address _from,
address _to
) internal virtual returns (uint256 _transferedValue){
uint256 balanceBefore;
if (_assetItem.asset.assetType == ETypes.AssetType.NATIVE) {
balanceBefore = _to.balance;
(bool success, ) = _to.call{ value: _assetItem.amount}("");
require(success, "transfer failed");
_transferedValue = _to.balance - balanceBefore;
} else if (_assetItem.asset.assetType == ETypes.AssetType.ERC20) {
balanceBefore = IERC20Extended(_assetItem.asset.contractAddress).balanceOf(_to);
if (_from == address(this)){
IERC20Extended(_assetItem.asset.contractAddress).safeTransfer(_to, _assetItem.amount);
} else {
IERC20Extended(_assetItem.asset.contractAddress).safeTransferFrom(_from, _to, _assetItem.amount);
}
_transferedValue = IERC20Extended(_assetItem.asset.contractAddress).balanceOf(_to) - balanceBefore;
} else if (_assetItem.asset.assetType == ETypes.AssetType.ERC721 &&
IERC721Mintable(_assetItem.asset.contractAddress).ownerOf(_assetItem.tokenId) == _from) {
balanceBefore = IERC721Mintable(_assetItem.asset.contractAddress).balanceOf(_to);
IERC721Mintable(_assetItem.asset.contractAddress).transferFrom(_from, _to, _assetItem.tokenId);
if (IERC721Mintable(_assetItem.asset.contractAddress).ownerOf(_assetItem.tokenId) == _to &&
IERC721Mintable(_assetItem.asset.contractAddress).balanceOf(_to) - balanceBefore == 1
) {
_transferedValue = 1;
}
} else if (_assetItem.asset.assetType == ETypes.AssetType.ERC1155) {
balanceBefore = IERC1155Mintable(_assetItem.asset.contractAddress).balanceOf(_to, _assetItem.tokenId);
IERC1155Mintable(_assetItem.asset.contractAddress).safeTransferFrom(_from, _to, _assetItem.tokenId, _assetItem.amount, "");
_transferedValue = IERC1155Mintable(_assetItem.asset.contractAddress).balanceOf(_to, _assetItem.tokenId) - balanceBefore;
} else {
revert UnSupportedAsset(_assetItem);
}
return _transferedValue;
}
function _transferEmergency(
ETypes.AssetItem memory _assetItem,
address _from,
address _to
) internal virtual returns (uint256 _transferedValue){
uint256 balanceBefore;
if (_assetItem.asset.assetType == ETypes.AssetType.NATIVE) {
balanceBefore = _to.balance;
(bool success, ) = _to.call{ value: _assetItem.amount}("");
_transferedValue = _to.balance - balanceBefore;
} else if (_assetItem.asset.assetType == ETypes.AssetType.ERC20) {
if (_from == address(this)){
(bool success, ) = _assetItem.asset.contractAddress.call(
abi.encodeWithSignature("transfer(address,uint256)", _to, _assetItem.amount)
);
} else {
(bool success, ) = _assetItem.asset.contractAddress.call(
abi.encodeWithSignature("transferFrom(address,address,uint256)", _from, _to, _assetItem.amount)
);
}
_transferedValue = _assetItem.amount;
} else if (_assetItem.asset.assetType == ETypes.AssetType.ERC721) {
(bool success, ) = _assetItem.asset.contractAddress.call(
abi.encodeWithSignature("transferFrom(address,address,uint256)", _from, _to, _assetItem.tokenId)
);
_transferedValue = 1;
} else if (_assetItem.asset.assetType == ETypes.AssetType.ERC1155) {
(bool success, ) = _assetItem.asset.contractAddress.call(
abi.encodeWithSignature("safeTransferFrom(address,address,uint256,uint256,bytes)", _from, _to, _assetItem.tokenId, _assetItem.amount, "")
);
_transferedValue = _assetItem.amount;
} else {
revert UnSupportedAsset(_assetItem);
}
return _transferedValue;
}
}
文件 37 的 37:TokenServiceExtended.sol
pragma solidity 0.8.21;
import "./TokenService.sol";
import "../interfaces/IUsersSBT.sol";
abstract contract TokenServiceExtended is TokenService {
event EnvelopRulesChanged(
address indexed wrappedAddress,
uint256 indexed wrappedIdaddress,
bytes2 newRules
);
function _balanceOf(
ETypes.AssetItem memory _assetItem,
address _holder
) internal view virtual returns (uint256 _balance){
if (_assetItem.asset.assetType == ETypes.AssetType.NATIVE) {
_balance = _holder.balance;
} else if (_assetItem.asset.assetType == ETypes.AssetType.ERC20) {
_balance = IERC20Extended(_assetItem.asset.contractAddress).balanceOf(_holder);
} else if (_assetItem.asset.assetType == ETypes.AssetType.ERC721) {
_balance = IERC721Mintable(_assetItem.asset.contractAddress).balanceOf(_holder);
} else if (_assetItem.asset.assetType == ETypes.AssetType.ERC1155) {
_balance = IERC1155Mintable(_assetItem.asset.contractAddress).balanceOf(_holder, _assetItem.tokenId);
} else {
revert UnSupportedAsset(_assetItem);
}
}
function _ownerOf(
ETypes.AssetItem memory _assetItem
) internal view virtual returns (address _owner){
if (_assetItem.asset.assetType == ETypes.AssetType.NATIVE) {
_owner = address(0);
} else if (_assetItem.asset.assetType == ETypes.AssetType.ERC20) {
_owner = address(0);
} else if (_assetItem.asset.assetType == ETypes.AssetType.ERC721) {
_owner = IERC721Mintable(_assetItem.asset.contractAddress).ownerOf(_assetItem.tokenId);
} else if (_assetItem.asset.assetType == ETypes.AssetType.ERC1155) {
_owner = address(0);
} else {
revert UnSupportedAsset(_assetItem);
}
}
function _mintWNFTWithRules(
ETypes.AssetType _mint_type,
address _contract,
address _mintFor,
uint256 _outBalance,
bytes2 _rules
)
internal
virtual
returns(uint256 tokenId)
{
if (_mint_type == ETypes.AssetType.ERC721) {
tokenId = IUsersSBT(_contract).mintWithRules(_mintFor, _rules);
} else if (_mint_type == ETypes.AssetType.ERC1155) {
tokenId = IUsersSBT(_contract).mintWithRules(_mintFor, _outBalance, _rules);
}else {
revert UnSupportedAsset(
ETypes.AssetItem(
ETypes.Asset(_mint_type, _contract),
tokenId, _outBalance
)
);
}
}
function _updateRules(
address _contract,
uint256 _tokenId,
bytes2 _rules
)
internal
virtual
returns(bool changed)
{
changed = IUsersSBT(_contract).updateRules(_tokenId, _rules);
if (changed){
emit EnvelopRulesChanged(_contract, _tokenId, _rules);
}
}
}
{
"compilationTarget": {
"contracts/EnvelopLazyKioskService.sol": "EnvelopLazyKioskService"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": [
":@Uopenzeppelin/=lib/openzeppelin-contracts-upgradeable/",
":@envelop-protocol-v1/=lib/envelop-protocol-v1/",
":@envelop-subscription/=lib/subscription/",
":@openzeppelin/=lib/openzeppelin-contracts/",
":@uniswap/=lib/",
":ds-test/=lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/src/",
":envelop-protocol-v1/=lib/envelop-protocol-v1/",
":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
":forge-std/=lib/forge-std/src/",
":openzeppelin-contracts/=lib/openzeppelin-contracts/",
":openzeppelin/=lib/openzeppelin-contracts/contracts/",
":subscription/=lib/subscription/"
]
}
[{"inputs":[{"internalType":"address","name":"_subscrRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"components":[{"components":[{"internalType":"enum ETypes.AssetType","name":"assetType","type":"uint8"},{"internalType":"address","name":"contractAddress","type":"address"}],"internalType":"struct ETypes.Asset","name":"asset","type":"tuple"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct ETypes.AssetItem","name":"asset","type":"tuple"}],"name":"UnSupportedAsset","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"display","type":"bytes32"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"enableAfter","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"disableAfter","type":"uint256"},{"indexed":false,"internalType":"address","name":"priceModel","type":"address"},{"indexed":false,"internalType":"string","name":"name","type":"string"}],"name":"DisplayChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"display","type":"bytes32"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"DisplayTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"display","type":"bytes32"},{"indexed":true,"internalType":"address","name":"assetContract","type":"address"},{"indexed":true,"internalType":"uint256","name":"assetTokenId","type":"uint256"}],"name":"EnvelopPurchase","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"referrer","type":"address"},{"indexed":true,"internalType":"address","name":"customer","type":"address"},{"indexed":true,"internalType":"address","name":"payWithToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"payWithAmount","type":"uint256"},{"indexed":false,"internalType":"uint16","name":"percentDiscount","type":"uint16"}],"name":"EnvelopReferrer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"wrappedAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"wrappedIdaddress","type":"uint256"},{"indexed":false,"internalType":"bytes2","name":"newRules","type":"bytes2"}],"name":"EnvelopRulesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"display","type":"bytes32"},{"indexed":true,"internalType":"address","name":"assetContract","type":"address"},{"indexed":true,"internalType":"uint256","name":"assetTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"placeIndex","type":"uint256"}],"name":"ItemAddedToDisplay","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"display","type":"bytes32"},{"indexed":true,"internalType":"address","name":"assetContract","type":"address"},{"indexed":true,"internalType":"uint256","name":"assetTokenId","type":"uint256"}],"name":"ItemPriceChanged","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"},{"inputs":[],"name":"DEFAULT_DISPLAY","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_INDEX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERCENT_DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_displayNameHash","type":"bytes32"},{"internalType":"address","name":"_admin","type":"address"}],"name":"addAdminToDisplay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"enum ETypes.AssetType","name":"assetType","type":"uint8"},{"internalType":"address","name":"contractAddress","type":"address"}],"internalType":"struct ETypes.Asset","name":"asset","type":"tuple"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct ETypes.AssetItem","name":"_assetItem","type":"tuple"},{"components":[{"internalType":"address","name":"payWith","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct KTypes.Price[]","name":"_prices","type":"tuple[]"}],"name":"addAssetItemPriceAtIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_displayNameHash","type":"bytes32"},{"components":[{"components":[{"internalType":"enum ETypes.AssetType","name":"assetType","type":"uint8"},{"internalType":"address","name":"contractAddress","type":"address"}],"internalType":"struct ETypes.Asset","name":"asset","type":"tuple"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct ETypes.AssetItem[]","name":"_assetItems","type":"tuple[]"},{"components":[{"internalType":"address","name":"payWith","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct KTypes.Price[]","name":"_prices","type":"tuple[]"}],"name":"addBatchItemsToDisplayWithSamePrice","outputs":[{"components":[{"internalType":"bytes32","name":"display","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"internalType":"struct KTypes.Place[]","name":"","type":"tuple[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_displayNameHash","type":"bytes32"},{"components":[{"components":[{"internalType":"enum ETypes.AssetType","name":"assetType","type":"uint8"},{"internalType":"address","name":"contractAddress","type":"address"}],"internalType":"struct ETypes.Asset","name":"asset","type":"tuple"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct ETypes.AssetItem","name":"_assetItem","type":"tuple"},{"components":[{"internalType":"address","name":"payWith","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct KTypes.Price[]","name":"_prices","type":"tuple[]"}],"name":"addItemToDisplay","outputs":[{"components":[{"internalType":"bytes32","name":"display","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"internalType":"struct KTypes.Place","name":"place","type":"tuple"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tariffIndex","type":"uint256"},{"internalType":"address","name":"_paymentToken","type":"address"},{"internalType":"uint256","name":"_paymentAmount","type":"uint256"},{"internalType":"uint16","name":"_agentFeePercent","type":"uint16"}],"name":"addPayOption","outputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"assetAtDisplay","outputs":[{"internalType":"bytes32","name":"display","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_agent","type":"address"},{"internalType":"uint256[]","name":"_serviceTariffIndexes","type":"uint256[]"}],"name":"authorizeAgentForService","outputs":[{"internalType":"uint256[]","name":"actualTariffs","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"enum ETypes.AssetType","name":"assetType","type":"uint8"},{"internalType":"address","name":"contractAddress","type":"address"}],"internalType":"struct ETypes.Asset","name":"asset","type":"tuple"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct ETypes.AssetItem","name":"_assetItem","type":"tuple"},{"internalType":"uint256","name":"_priceIndex","type":"uint256"},{"internalType":"address","name":"_buyer","type":"address"},{"internalType":"address","name":"_referrer","type":"address"},{"internalType":"string","name":"_promo","type":"string"}],"name":"buyAssetItem","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_displayNameHash","type":"bytes32"},{"internalType":"address","name":"_who","type":"address"}],"name":"canBuyForFree","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"checkUser","outputs":[{"internalType":"bool","name":"ok","type":"bool"},{"internalType":"bool","name":"needFix","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"displayAdmins","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"displays","outputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"beneficiary","type":"address"},{"internalType":"uint256","name":"enableAfter","type":"uint256"},{"internalType":"uint256","name":"disableAfter","type":"uint256"},{"internalType":"address","name":"priceModel","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"enum ETypes.AssetType","name":"assetType","type":"uint8"},{"internalType":"address","name":"contractAddress","type":"address"}],"internalType":"struct ETypes.Asset","name":"asset","type":"tuple"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct ETypes.AssetItem","name":"_assetItem","type":"tuple"},{"internalType":"uint256","name":"_priceIndex","type":"uint256"},{"components":[{"internalType":"address","name":"payWith","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct KTypes.Price","name":"_price","type":"tuple"}],"name":"editAssetItemPriceAtIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tariffIndex","type":"uint256"},{"internalType":"uint256","name":"_payWithIndex","type":"uint256"},{"internalType":"address","name":"_paymentToken","type":"address"},{"internalType":"uint256","name":"_paymentAmount","type":"uint256"},{"internalType":"uint16","name":"_agentFeePercent","type":"uint16"}],"name":"editPayOption","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tariffIndex","type":"uint256"},{"internalType":"uint256","name":"_timelockPeriod","type":"uint256"},{"internalType":"uint256","name":"_ticketValidPeriod","type":"uint256"},{"internalType":"uint256","name":"_counter","type":"uint256"},{"internalType":"bool","name":"_isAvailable","type":"bool"},{"internalType":"address","name":"_beneficiary","type":"address"}],"name":"editServiceTariff","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"enum ETypes.AssetType","name":"assetType","type":"uint8"},{"internalType":"address","name":"contractAddress","type":"address"}],"internalType":"struct ETypes.Asset","name":"asset","type":"tuple"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct ETypes.AssetItem","name":"_assetItem","type":"tuple"}],"name":"getAssetItem","outputs":[{"components":[{"internalType":"address","name":"owner","type":"address"},{"components":[{"components":[{"internalType":"enum ETypes.AssetType","name":"assetType","type":"uint8"},{"internalType":"address","name":"contractAddress","type":"address"}],"internalType":"struct ETypes.Asset","name":"asset","type":"tuple"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct ETypes.AssetItem","name":"nft","type":"tuple"},{"components":[{"internalType":"address","name":"payWith","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct KTypes.Price[]","name":"prices","type":"tuple[]"}],"internalType":"struct KTypes.ItemForSale","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"enum ETypes.AssetType","name":"assetType","type":"uint8"},{"internalType":"address","name":"contractAddress","type":"address"}],"internalType":"struct ETypes.Asset","name":"asset","type":"tuple"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct ETypes.AssetItem","name":"_assetItem","type":"tuple"}],"name":"getAssetItemPlace","outputs":[{"components":[{"internalType":"bytes32","name":"display","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"internalType":"struct KTypes.Place","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"enum ETypes.AssetType","name":"assetType","type":"uint8"},{"internalType":"address","name":"contractAddress","type":"address"}],"internalType":"struct ETypes.Asset","name":"asset","type":"tuple"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct ETypes.AssetItem","name":"_assetItem","type":"tuple"},{"internalType":"address","name":"_buyer","type":"address"},{"internalType":"address","name":"_referrer","type":"address"},{"internalType":"string","name":"_promo","type":"string"}],"name":"getAssetItemPricesAndDiscounts","outputs":[{"components":[{"internalType":"address","name":"payWith","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct KTypes.Price[]","name":"","type":"tuple[]"},{"components":[{"internalType":"enum KTypes.DiscountType","name":"dsctType","type":"uint8"},{"internalType":"uint16","name":"dsctPercent","type":"uint16"}],"internalType":"struct KTypes.Discount[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_displayNameHash","type":"bytes32"}],"name":"getDisplay","outputs":[{"components":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"beneficiary","type":"address"},{"internalType":"uint256","name":"enableAfter","type":"uint256"},{"internalType":"uint256","name":"disableAfter","type":"uint256"},{"internalType":"address","name":"priceModel","type":"address"},{"components":[{"internalType":"address","name":"owner","type":"address"},{"components":[{"components":[{"internalType":"enum ETypes.AssetType","name":"assetType","type":"uint8"},{"internalType":"address","name":"contractAddress","type":"address"}],"internalType":"struct ETypes.Asset","name":"asset","type":"tuple"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct ETypes.AssetItem","name":"nft","type":"tuple"},{"components":[{"internalType":"address","name":"payWith","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct KTypes.Price[]","name":"prices","type":"tuple[]"}],"internalType":"struct KTypes.ItemForSale[]","name":"items","type":"tuple[]"}],"internalType":"struct KTypes.Display","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_displayNameHash","type":"bytes32"}],"name":"getDisplayAssetItems","outputs":[{"components":[{"internalType":"address","name":"owner","type":"address"},{"components":[{"components":[{"internalType":"enum ETypes.AssetType","name":"assetType","type":"uint8"},{"internalType":"address","name":"contractAddress","type":"address"}],"internalType":"struct ETypes.Asset","name":"asset","type":"tuple"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct ETypes.AssetItem","name":"nft","type":"tuple"},{"components":[{"internalType":"address","name":"payWith","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct KTypes.Price[]","name":"prices","type":"tuple[]"}],"internalType":"struct KTypes.ItemForSale[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_displayNameHash","type":"bytes32"}],"name":"getDisplayOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"}],"name":"hlpHashString","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_displayNameHash","type":"bytes32"},{"internalType":"address","name":"_who","type":"address"}],"name":"isDisplayAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"modelWhiteListAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"uint256","name":"timelockPeriod","type":"uint256"},{"internalType":"uint256","name":"ticketValidPeriod","type":"uint256"},{"internalType":"uint256","name":"counter","type":"uint256"},{"internalType":"bool","name":"isAvailable","type":"bool"},{"internalType":"address","name":"beneficiary","type":"address"}],"internalType":"struct SubscriptionType","name":"subscription","type":"tuple"},{"components":[{"internalType":"address","name":"paymentToken","type":"address"},{"internalType":"uint256","name":"paymentAmount","type":"uint256"},{"internalType":"uint16","name":"agentFeePercent","type":"uint16"}],"internalType":"struct PayOption[]","name":"payWith","type":"tuple[]"}],"internalType":"struct Tariff","name":"_newTariff","type":"tuple"}],"name":"newTariff","outputs":[{"internalType":"uint256","name":"tariffIndex","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","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":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"uint256","name":"timelockPeriod","type":"uint256"},{"internalType":"uint256","name":"ticketValidPeriod","type":"uint256"},{"internalType":"uint256","name":"counter","type":"uint256"},{"internalType":"bool","name":"isAvailable","type":"bool"},{"internalType":"address","name":"beneficiary","type":"address"}],"internalType":"struct SubscriptionType","name":"subscription","type":"tuple"},{"components":[{"internalType":"address","name":"paymentToken","type":"address"},{"internalType":"uint256","name":"paymentAmount","type":"uint256"},{"internalType":"uint16","name":"agentFeePercent","type":"uint16"}],"internalType":"struct PayOption[]","name":"payWith","type":"tuple[]"}],"internalType":"struct Tariff","name":"_newTariff","type":"tuple"}],"name":"registerServiceTariff","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_displayNameHash","type":"bytes32"},{"internalType":"uint256","name":"_adminIndex","type":"uint256"}],"name":"removeAdminFromDisplayByIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"enum ETypes.AssetType","name":"assetType","type":"uint8"},{"internalType":"address","name":"contractAddress","type":"address"}],"internalType":"struct ETypes.Asset","name":"asset","type":"tuple"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct ETypes.AssetItem","name":"_assetItem","type":"tuple"}],"name":"removeLastPersonalPriceForAssetItem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"serviceProvider","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_enableAfter","type":"uint256"},{"internalType":"uint256","name":"_disableAfter","type":"uint256"},{"internalType":"address","name":"_priceModel","type":"address"}],"name":"setDisplayParams","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isEnable","type":"bool"}],"name":"setSubscriptionOnOff","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_subscrRegistry","type":"address"}],"name":"setSubscriptionRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_modelWhiteList","type":"address"}],"name":"setWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"subscriptionRegistry","outputs":[{"internalType":"contract ISubscriptionRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"bytes32","name":"_displayNameHash","type":"bytes32"}],"name":"transferDisplay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]