/* Crafted with love by Fueled on Bacon https://fueledonbacon.com */ //SPDX-License-Identifier: MIT pragma solidity ^0.8.15; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/finance/PaymentSplitter.sol"; import "../interfaces/IVenueFactory.sol"; import "../VenueSBT.sol"; contract VenueFactory is IVenueFactory, Ownable { address private _royaltyReceiver; //primary sales, FoB account address private _registar; uint96 private _royaltyFeeNumerator; //primary sales, 10000 is 100%, 360 for 3.6% uint96 private _royaltyFeeNumeratorSecondarySales; //10000 is 100%, 1000 for 10% uint256 private _splitterFoBShares; //36 -> 3.6% constructor( address registar, address royaltyReceiver, uint96 royaltyFeeNumerator, uint96 royaltyFeeNumeratorSecondarySales, uint256 splitterFoBShares ) { _registar = registar; _royaltyReceiver = royaltyReceiver; _royaltyFeeNumerator = royaltyFeeNumerator; _royaltyFeeNumeratorSecondarySales = royaltyFeeNumeratorSecondarySales; _splitterFoBShares = splitterFoBShares; } /// @inheritdoc IVenueFactory function setRoyaltyReceiver(address royaltyReceiver) external virtual override onlyOwner { _royaltyReceiver = royaltyReceiver; } /// @inheritdoc IVenueFactory function setRoyaltyFeeNumerator(uint96 royaltyFeeNumerator) external virtual override onlyOwner { _royaltyFeeNumerator = royaltyFeeNumerator; } /// @inheritdoc IVenueFactory function setRoyaltyFeeNumeratorSecondarySales(uint96 royaltyFeeNumeratorSecondarySales) external virtual override onlyOwner { _royaltyFeeNumeratorSecondarySales = royaltyFeeNumeratorSecondarySales; } /// @inheritdoc IVenueFactory function setSplitterFoBShares(uint96 splitterFoBShares) external virtual override onlyOwner { _splitterFoBShares = splitterFoBShares; } /// @inheritdoc IVenueFactory function setRegistar(address registar) external virtual override onlyOwner { _registar = registar; } /// @inheritdoc IVenueFactory function getInfo() external virtual override view returns(address, uint256, uint96, uint96) { return (_royaltyReceiver, _splitterFoBShares, _royaltyFeeNumerator, _royaltyFeeNumeratorSecondarySales); } function _getPayees(address payee1, address payee2) private pure returns(address[] memory path) { path = new address[](2); path[0] = payee1; path[1] = payee2; } function _getShares(uint256 share1, uint256 share2) private pure returns(uint256[] memory path) { path = new uint256[](2); path[0] = share1; path[1] = share2; } /// @inheritdoc IVenueFactory function deployVenue( string memory name, string memory symbol, string memory baseUri, address owner ) external virtual override returns (address, address) { if(msg.sender != _registar) revert VenueFactorySenderNotRegistar(); VenueSBT newVenue = new VenueSBT( name, symbol, baseUri, msg.sender, owner, _royaltyReceiver, _royaltyFeeNumerator, _royaltyFeeNumeratorSecondarySales ); address venue = address(newVenue); PaymentSplitter splitter = new PaymentSplitter( _getPayees(_royaltyReceiver, venue), _getShares(_splitterFoBShares, 100 - _splitterFoBShares) ); address royaltyReceiverSecondarySales = address(splitter); newVenue.setRoyaltyReceiverSecondarySales(royaltyReceiverSecondarySales); emit Deployment(venue, block.timestamp); return (venue, royaltyReceiverSecondarySales); } }