¡El código fuente de este contrato está verificado!
Metadatos del Contrato
Compilador
0.8.19+commit.7dd6d404
Idioma
Solidity
Cuentas
0x0f...b03a
$500
¡El código fuente de este contrato está verificado!
Metadatos del Contrato
Compilador
0.8.21+commit.d9974bed
Idioma
Solidity
Código Fuente del Contrato
Archivo 1 de 7: Context.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.0.0) (utils/Context.sol)pragmasolidity ^0.8.20;/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/abstractcontractContext{
function_msgSender() internalviewvirtualreturns (address) {
returnmsg.sender;
}
function_msgData() internalviewvirtualreturns (bytescalldata) {
returnmsg.data;
}
}
Código Fuente del Contrato
Archivo 2 de 7: IERC20.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)pragmasolidity ^0.8.20;/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/interfaceIERC20{
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/eventTransfer(addressindexedfrom, addressindexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/eventApproval(addressindexed owner, addressindexed spender, uint256 value);
/**
* @dev Returns the value of tokens in existence.
*/functiontotalSupply() externalviewreturns (uint256);
/**
* @dev Returns the value of tokens owned by `account`.
*/functionbalanceOf(address account) externalviewreturns (uint256);
/**
* @dev Moves a `value` amount of tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/functiontransfer(address to, uint256 value) externalreturns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/functionallowance(address owner, address spender) externalviewreturns (uint256);
/**
* @dev Sets a `value` amount of tokens as the allowance of `spender` over the
* caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/functionapprove(address spender, uint256 value) externalreturns (bool);
/**
* @dev Moves a `value` amount of tokens from `from` to `to` using the
* allowance mechanism. `value` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/functiontransferFrom(addressfrom, address to, uint256 value) externalreturns (bool);
}
Código Fuente del Contrato
Archivo 3 de 7: IMintableBurnableERC20.sol
// SPDX-License-Identifier: MITpragmasolidity 0.8.21;import {IERC20} from"@openzeppelin/contracts/token/ERC20/IERC20.sol";
// Interface for ERC with mint and burn functions.interfaceIMintableBurnableERC20isIERC20{
/**
* @notice Mint new tokens.
* @param to The address of the recipient.
* @param amount The amount of tokens to mint.
*/functionmint(address to, uint256 amount) external;
/**
* @notice Burn tokens.
* @param amount The amount of tokens to burn.
*/functionburn(uint256 amount) external;
}
Código Fuente del Contrato
Archivo 4 de 7: Ownable.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)pragmasolidity ^0.8.20;import {Context} from"../utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* The initial owner is set to the address provided by the deployer. This can
* later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/abstractcontractOwnableisContext{
addressprivate _owner;
/**
* @dev The caller account is not authorized to perform an operation.
*/errorOwnableUnauthorizedAccount(address account);
/**
* @dev The owner is not a valid owner account. (eg. `address(0)`)
*/errorOwnableInvalidOwner(address owner);
eventOwnershipTransferred(addressindexed previousOwner, addressindexed newOwner);
/**
* @dev Initializes the contract setting the address provided by the deployer as the initial owner.
*/constructor(address initialOwner) {
if (initialOwner ==address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(initialOwner);
}
/**
* @dev Throws if called by any account other than the owner.
*/modifieronlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/functionowner() publicviewvirtualreturns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/function_checkOwner() internalviewvirtual{
if (owner() != _msgSender()) {
revert OwnableUnauthorizedAccount(_msgSender());
}
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/functionrenounceOwnership() publicvirtualonlyOwner{
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/functiontransferOwnership(address newOwner) publicvirtualonlyOwner{
if (newOwner ==address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/function_transferOwnership(address newOwner) internalvirtual{
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
Código Fuente del Contrato
Archivo 5 de 7: Pausable.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.0.0) (utils/Pausable.sol)pragmasolidity ^0.8.20;import {Context} from"../utils/Context.sol";
/**
* @dev Contract module which allows children to implement an emergency stop
* mechanism that can be triggered by an authorized account.
*
* This module is used through inheritance. It will make available the
* modifiers `whenNotPaused` and `whenPaused`, which can be applied to
* the functions of your contract. Note that they will not be pausable by
* simply including this module, only once the modifiers are put in place.
*/abstractcontractPausableisContext{
boolprivate _paused;
/**
* @dev Emitted when the pause is triggered by `account`.
*/eventPaused(address account);
/**
* @dev Emitted when the pause is lifted by `account`.
*/eventUnpaused(address account);
/**
* @dev The operation failed because the contract is paused.
*/errorEnforcedPause();
/**
* @dev The operation failed because the contract is not paused.
*/errorExpectedPause();
/**
* @dev Initializes the contract in unpaused state.
*/constructor() {
_paused =false;
}
/**
* @dev Modifier to make a function callable only when the contract is not paused.
*
* Requirements:
*
* - The contract must not be paused.
*/modifierwhenNotPaused() {
_requireNotPaused();
_;
}
/**
* @dev Modifier to make a function callable only when the contract is paused.
*
* Requirements:
*
* - The contract must be paused.
*/modifierwhenPaused() {
_requirePaused();
_;
}
/**
* @dev Returns true if the contract is paused, and false otherwise.
*/functionpaused() publicviewvirtualreturns (bool) {
return _paused;
}
/**
* @dev Throws if the contract is paused.
*/function_requireNotPaused() internalviewvirtual{
if (paused()) {
revert EnforcedPause();
}
}
/**
* @dev Throws if the contract is not paused.
*/function_requirePaused() internalviewvirtual{
if (!paused()) {
revert ExpectedPause();
}
}
/**
* @dev Triggers stopped state.
*
* Requirements:
*
* - The contract must not be paused.
*/function_pause() internalvirtualwhenNotPaused{
_paused =true;
emit Paused(_msgSender());
}
/**
* @dev Returns to normal state.
*
* Requirements:
*
* - The contract must be paused.
*/function_unpause() internalvirtualwhenPaused{
_paused =false;
emit Unpaused(_msgSender());
}
}
Código Fuente del Contrato
Archivo 6 de 7: PausableWithDelay.sol
// SPDX-License-Identifier: MITpragmasolidity 0.8.21;import {Pausable} from"@openzeppelin/contracts/utils/Pausable.sol";
import {Ownable} from"@openzeppelin/contracts/access/Ownable.sol";
// Allows the contract to be paused and only unpaused after a delay has passed. The owner can add other accounts that can pause the contract, yet only the owner can unpause the contract.contractPausableWithDelayisPausable, Ownable{
// The delay after which the contract can be unpaused, added to the block.timestamp when the contract is paused.uint256public delay;
// The timestamp after which the contract can be unpaused.uint256public unpausableAt;
// The accounts that can pause the contract.mapping(address account =>bool canPause) public canPause;
// The contract is cannot be unpaused yet.errorCannotUnpauseYet(uint256 unpausableAt);
// The caller is not the owner or a pauser.errorUnauthorizedPause();
// Checks that the caller is the owner or a authorized pauser.modifieronlyOwnerOrPauser() {
_checkOwnerOrPauser();
_;
}
constructor(uint256 delay_) Ownable(_msgSender()) {
_setDelay(delay_);
}
/**
* @notice Sets the delay after which the contract can be unpaused.
* @param newDelay The new delay.
*/function_setDelay(uint256 newDelay) internalvirtual{
delay = newDelay;
}
/**
* @notice Sets whether an account can pause the contract.
* @param account The account to set.
* @param canPause_ Whether the account can pause the contract.
*/functionsetCanPause(address account, bool canPause_) externalvirtual{
canPause[account] = canPause_;
}
/**
* @notice Pauses the contract.
*/functionpause() externalonlyOwnerOrPauser{
_pause();
}
/**
* @notice Pauses the contract with a delay to unpause.
*/functionpauseWithDelay() externalonlyOwnerOrPauser{
unpausableAt =block.timestamp+ delay;
_pause();
}
/**
* @notice Unpauses the contract.
* @dev The contract cannot be unpaused before the delay has passed.
*/functionunpause() externalonlyOwner{
if (unpausableAt !=0&& unpausableAt >block.timestamp)
revert CannotUnpauseYet(unpausableAt);
_unpause();
}
/**
* @notice Sets the delay after which the contract can be unpaused.
* @param newDelay The new delay.
*/functionsetDelay(uint256 newDelay) externalonlyOwner{
_setDelay(newDelay);
}
/**
* @notice Checks that the caller is the owner or a authorized pauser, reverts otherwise.
*/function_checkOwnerOrPauser() internalview{
if (_msgSender() != owner() &&!canPause[_msgSender()])
revert UnauthorizedPause();
}
}
Código Fuente del Contrato
Archivo 7 de 7: SwapperMinter.sol
// SPDX-License-Identifier: MITpragmasolidity 0.8.21;import {PausableWithDelay} from"./PausableWithDelay.sol";
import {IMintableBurnableERC20} from"./interfaces/IMintableBurnableERC20.sol";
// This contract is used to swap legacy RMRK tokens for new RMRK tokens. It can mint new RMRK tokens.contractSwapperMinterisPausableWithDelay{
IMintableBurnableERC20 publicimmutable LEGACY_RMRK;
IMintableBurnableERC20 publicimmutable NEW_RMRK;
uint256publicconstant MULTIPLIER =10**8; // To go from 10 decimals to 18 decimals// Emitted when legacy RMRK tokens are swapped for new RMRK tokens. Amount is in New RMRK tokens.eventSwapped(addressindexed sender, addressindexed to, uint256 amount);
constructor(address legacyRmrk_,
address newRmrk_,
uint256 delay
) PausableWithDelay(delay) {
LEGACY_RMRK = IMintableBurnableERC20(legacyRmrk_);
NEW_RMRK = IMintableBurnableERC20(newRmrk_);
}
/**
* @notice Swaps legacy RMRK tokens for the new RMRK tokens.
* @param amount The amount of legacy RMRK tokens to swap.
* @param to The address to send the new RMRK tokens to.
* @dev The msg.sender needs to approve the contract to transfer the legacy RMRK tokens.
*/functionswapLegacyRMRK(uint256 amount, address to) externalwhenNotPaused{
// Legacy RMRK does not allow for burning, so we send to dead.
LEGACY_RMRK.transferFrom(
_msgSender(),
0x000000000000000000000000000000000000dEaD,
amount
);
NEW_RMRK.mint(to, amount * MULTIPLIER);
emit Swapped(_msgSender(), to, amount);
}
}