logos-messaging-rlnv2-contract/src/LinearPriceCalculator.sol
Richard Ramos 113b571021
feat: Ownable2StepUpgradeable to OwnableUpgradeable
This allows the contract to transfer ownership to address 0x000...000 as defined in https://github.com/waku-org/specs/pull/34: `At some point, the _Owner_ SHOULD renounce their privileges, and the contract MUST become immutable`. The problem with `Ownable2StepUpgradeable` is that it requires accepting the ownership transfer, which is not possible with address 0x0
2024-10-08 14:22:47 -04:00

46 lines
2.0 KiB
Solidity

// SPDX-License-Identifier: MIT
pragma solidity 0.8.24;
import { Ownable } from "openzeppelin-contracts/contracts/access/Ownable.sol";
import { IPriceCalculator } from "./IPriceCalculator.sol";
/// Address 0x0000...0000 was used instead of an ERC20 token address
error OnlyTokensAllowed();
/// @title Linear Price Calculator to determine the price to acquire a membership
contract LinearPriceCalculator is IPriceCalculator, Ownable {
/// @notice Address of the ERC20 token accepted by this contract.
address public token;
/// @notice The price per message per epoch
uint256 public pricePerMessagePerEpoch;
constructor(address _token, uint256 _pricePerMessagePerEpoch) Ownable() {
_setTokenAndPrice(_token, _pricePerMessagePerEpoch);
}
/// Set accepted token and price per message per epoch per period
/// @param _token The token accepted by RLN membership management
/// @param _pricePerMessagePerEpoch Price per message per epoch
function setTokenAndPrice(address _token, uint256 _pricePerMessagePerEpoch) external onlyOwner {
_setTokenAndPrice(_token, _pricePerMessagePerEpoch);
}
/// Set accepted token and price per message per epoch per period
/// @param _token The token accepted by RLN membership management
/// @param _pricePerMessagePerEpoch Price per message per epoch
function _setTokenAndPrice(address _token, uint256 _pricePerMessagePerEpoch) internal {
if (_token == address(0)) revert OnlyTokensAllowed();
token = _token;
pricePerMessagePerEpoch = _pricePerMessagePerEpoch;
}
/// Returns the token and price to pay in `token` for some `_rateLimit`
/// @param _rateLimit the rate limit the user wants to acquire
/// @return address of the erc20 token
/// @return uint price to pay for acquiring the specified `_rateLimit`
function calculate(uint32 _rateLimit) external view returns (address, uint256) {
return (token, uint256(_rateLimit) * pricePerMessagePerEpoch);
}
}