文件 1 的 8:IERC20.sol
pragma solidity 0.8.7;
interface IERC20 {
event Approval(address indexed owner_, address indexed spender_, uint256 amount_);
event Transfer(address indexed owner_, address indexed recipient_, uint256 amount_);
function approve(address spender_, uint256 amount_) external returns (bool success_);
function decreaseAllowance(address spender_, uint256 subtractedAmount_) external returns (bool success_);
function increaseAllowance(address spender_, uint256 addedAmount_) external returns (bool success_);
function permit(address owner_, address spender_, uint amount_, uint deadline_, uint8 v_, bytes32 r_, bytes32 s_) external;
function transfer(address recipient_, uint256 amount_) external returns (bool success_);
function transferFrom(address owner_, address recipient_, uint256 amount_) external returns (bool success_);
function allowance(address owner_, address spender_) external view returns (uint256 allowance_);
function balanceOf(address account_) external view returns (uint256 balance_);
function decimals() external view returns (uint8 decimals_);
function DOMAIN_SEPARATOR() external view returns (bytes32 domainSeparator_);
function name() external view returns (string memory name_);
function nonces(address owner_) external view returns (uint256 nonce_);
function symbol() external view returns (string memory symbol_);
function totalSupply() external view returns (uint256 totalSupply_);
}
文件 2 的 8:IGETToken.sol
pragma solidity >=0.8.0 <0.9.0;
import {IERC20} from "erc20/interfaces/IERC20.sol";
interface IGETToken is IERC20 {
function burn(uint256 amount) external;
}
文件 3 的 8:IMigrationLockedRevenueDistributionToken.sol
pragma solidity >=0.8.0 <0.9.0;
import {IERC20} from "erc20/interfaces/IERC20.sol";
interface IMigrationLockedRevenueDistributionToken is IERC20 {
function deposit(uint256 assets_, address receiver_) external returns (uint256 shares_);
function redeem(uint256 shares_, address receiver_, address owner_) external returns (uint256 assets_);
function previewDeposit(uint256 assets_) external view returns (uint256 shares_);
function previewRedeem(uint256 shares_, address owner_) external view returns (uint256 assets_);
function totalAssets() external view returns (uint256 totalManagedAssets_);
}
文件 4 的 8:IOPNMigration.sol
pragma solidity >=0.8.0 <0.9.0;
interface IOPNMigration {
event MintManagerSet(address indexed opnMintManager);
event AdminSet(address indexed admin, bool setting);
event XOpenTokenSet(address indexed xOpenToken);
event OPNTokenSet(address indexed openToken);
event MigrationStatusSet(bool setting);
event OPNMigrationComplete(
address indexed user,
uint256 amountGET,
uint256 amountXGET,
uint256 amountOPNToUserForGETMigration,
uint256 amountXOPNToUserForGETMigration,
uint256 amountXOPNToUserForXGETMigration,
uint256 amountOPNStakedForGETMigration,
uint256 amountGETRedeemedByXGET,
uint256 amountOPNMintedForXGETMigration
);
event StartOfMigrationSet(uint256 startOfMigration);
event EndOfMigrationSet(uint256 endOfMigration);
event StakeRateInitialSet(uint256 stakeRateInitial);
event DurationOfStakeMigrationPeriodSet(uint256 durationOfStakeMigrationPeriod);
function returnTotalAmountGETFromXGETRedemptionMigrated() external view returns (uint256);
function totalOPNStakedByTheMigration() external view returns (uint256 totalOPNStaked_);
function totalOPNMinted() external view returns (uint256 totalOPNMinted_);
function returnCurrentStakeRate() external view returns (uint256 stakeRate_);
function returnStakeRateAtTime(uint256 _timestamp) external view returns (uint256 stakeRate_);
function totalOPNSupply() external view returns (uint256 totalSupply_);
function totalXOPNSupply() external view returns (uint256 totalSupply_);
function totalGETMigratedInTotal() external view returns (uint256 totalGETMigrated_);
function totalXGETRedeemedInTotal() external view returns (uint256 totalXGETRedeemed_);
function depositRatioOfOPNtoXOPN() external view returns (uint256);
function previewRedeem(uint256 _shares) external view returns (uint256);
function previewDeposit(uint256 _assets) external view returns (uint256);
function returnMigrateDualTokenOutput(uint256 _amountGET, uint256 _amountXGET)
external
view
returns (
uint256 amountOPNToUserForGETMigration_,
uint256 amountXOPNToUserForXGETMigration_,
uint256 amountOPNStakedForGETMigration_,
uint256 amountXOPNToUserForGETMigration_,
uint256 amountGETRedeemedByXGET_
);
function migrateDualTokens(uint256 _amountGET, uint256 _amountXGET)
external
returns (
uint256 amountOPNToUserForGETMigration_,
uint256 amountXOPNToUserForXGETMigration_,
uint256 amountOPNStakedForGETMigration_,
uint256 amountXOPNToUserForGETMigration_,
uint256 amountGETRedeemedByXGET_
);
function setAddressConfig(address _openToken, address _xOpenToken, address _opnMintManager) external;
function setMigrationActive(bool _setting) external;
function setStartOfMigration(uint256 _startOfMigration) external;
function setEndOfMigration(uint256 _endOfMigration) external;
function setStakeRateInitial(uint256 _stakeRateInitial) external;
function setDurationOfStakeMigrationPeriod(uint256 _durationOfStakeMigrationPeriod) external;
}
文件 5 的 8:IOPNMintManager.sol
pragma solidity >=0.8.0 <0.9.0;
interface IOPNMintManager {
event MigrationMint(address indexed to, uint256 amount);
event DaoMint(address indexed to, uint256 amount);
event MigrationContractSet(address migrationContract);
event DAOContractAddressSet(address daoContractAddress);
event MintManagerSetInToken(address _newMigrationManager);
function opnTokenAddress() external view returns (address);
function issueTokensMigration(address _to, uint256 _amount) external;
function mintTokenPolygonInventory(address _to, uint256 _amount) external;
function setDaoContractAddress(address _daoContractAddress) external;
function setMintManangerInToken(address _newMigrationManager) external;
function withdrawOPN() external;
function setMigrationContract(address _migrationContract) external;
function withdrawTokens(address _tokenAddress, uint256 _amount) external;
}
文件 6 的 8:IOPNToken.sol
pragma solidity >=0.8.0 <0.9.0;
import {IERC20} from "erc20/interfaces/IERC20.sol";
interface IOPNToken is IERC20 {
function mintTokensByDAO(address _to, uint256 _amount) external;
function issueTokensMigration(address _to, uint256 _amount) external;
function mintTokenPolygonInventory(address _to, uint256 _amount) external;
function burn(uint256 _amount) external;
function finalizeMigration() external;
function setDAOControllerAddress(address _newDaoController) external;
function setMintManager(address _newMigrationManager) external;
function mintManagerAddress() external view returns (address);
function daoControllerAddress() external view returns (address);
function migrationIssuanceDisabledPermanently()
external
view
returns (bool);
event TokensBurned(address indexed from, uint256 amount);
event MigrationInventoryMint(address indexed to, uint256 amount);
event MigrationManagerSet(address indexed newMigrationManager);
event MigrationMint(address indexed to, uint256 amount);
event DaoMint(address indexed to, uint256 amount);
event DaoControllerSet(address _newDaoController);
event MigrationConfigFinalized();
}
文件 7 的 8:OPNMigration.sol
pragma solidity ^0.8.7;
import {IERC20} from "erc20/interfaces/IERC20.sol";
import "@solmate/src/auth/Owned.sol";
import "./interfaces/IMigrationLockedRevenueDistributionToken.sol";
import "./interfaces/IGETToken.sol";
import "./interfaces/IOPNToken.sol";
import "./interfaces/IOPNMintManager.sol";
import "./interfaces/IOPNMigration.sol";
contract OPNMigration is IOPNMigration, Owned {
uint256 public constant GET_TO_OPN_RATIO = 1e3;
uint256 public constant MIGRATION_AVAILABLE_UNTIL = 600 days;
uint256 public immutable chainId;
IOPNToken public openToken;
IOPNMintManager public opnMintManager;
IMigrationLockedRevenueDistributionToken public xOpenToken;
IGETToken public immutable liquidGETToken;
IMigrationLockedRevenueDistributionToken public immutable stakedGETToken;
address public immutable migrationDestinationAddress;
uint256 public totalLiquidGETMigrated;
uint256 public totalXGETRedeemed;
uint256 public totalGETMigratedByXGETMigration;
uint256 public totalOPNStakedByGETMigration;
uint256 public totalOPNMintedByAllMigration;
bool public isMigrationActive = false;
uint256 private locked = 1;
uint256 public durationOfStakeMigrationPeriod;
uint256 public startOfMigration;
uint256 public endOfMigration;
uint256 public stakeRateInitial;
constructor(
address _initialOwner,
address _liquidGETAddress,
address _stakedGETAddress,
uint256 _startOfMigration,
uint256 _startStakeRate,
uint256 _durationOfStakeMigrationPeriod,
address _bridgeMigrationAddress,
uint256 _chainId
) Owned(_initialOwner) {
liquidGETToken = IGETToken(_liquidGETAddress);
stakedGETToken = IMigrationLockedRevenueDistributionToken(
_stakedGETAddress
);
require(
_startOfMigration > block.timestamp,
"OPNMigration: Start of migration must be in the future"
);
startOfMigration = _startOfMigration;
endOfMigration = _startOfMigration + MIGRATION_AVAILABLE_UNTIL;
stakeRateInitial = _startStakeRate;
require(
MIGRATION_AVAILABLE_UNTIL > _durationOfStakeMigrationPeriod,
"OPNMigration: Duration of stake migration period must be less than the total migration period"
);
durationOfStakeMigrationPeriod = _durationOfStakeMigrationPeriod;
migrationDestinationAddress = _bridgeMigrationAddress;
chainId = _chainId;
}
modifier nonReentrant() {
require(locked == 1, "OPNMigration: Reentrant call");
locked = 2;
_;
locked = 1;
}
function migrateDualTokens(
uint256 _amountGET,
uint256 _amountXGET
)
external
override
nonReentrant
returns (
uint256 amountOPNToUserForGETMigration_,
uint256 amountXOPNToUserForXGETMigration_,
uint256 amountOPNStakedForGETMigration_,
uint256 amountXOPNToUserForGETMigration_,
uint256 amountGETRedeemedByXGET_
)
{
require(_isMigrationActive(), "OPNMigration: Migration not active");
require(
_amountGET > 0 || _amountXGET > 0,
"OPNMigration: Both amounts are 0"
);
if (_amountGET > 0) {
(
amountOPNToUserForGETMigration_,
amountOPNStakedForGETMigration_,
amountXOPNToUserForGETMigration_
) = _migrateLiquidGETTokens(_amountGET);
}
if (_amountXGET > 0) {
(
amountXOPNToUserForXGETMigration_,
amountGETRedeemedByXGET_
) = _migrateStakedXGETTokens(_amountXGET);
}
emit OPNMigrationComplete(
msg.sender,
_amountGET,
_amountXGET,
amountOPNToUserForGETMigration_,
amountXOPNToUserForGETMigration_,
amountXOPNToUserForXGETMigration_,
amountOPNStakedForGETMigration_,
amountGETRedeemedByXGET_,
amountGETRedeemedByXGET_ * GET_TO_OPN_RATIO
);
return (
amountOPNToUserForGETMigration_,
amountXOPNToUserForXGETMigration_,
amountOPNStakedForGETMigration_,
amountXOPNToUserForGETMigration_,
amountGETRedeemedByXGET_
);
}
function _burn(uint256 _amount) internal {
if (chainId == 1) {
liquidGETToken.burn(_amount);
} else {
require(
liquidGETToken.transfer(migrationDestinationAddress, _amount),
"OPNMigration: GET transfer to migration destination failed"
);
}
}
function _migrateLiquidGETTokens(
uint256 _amountGET
)
internal
returns (
uint256 amountOPNToUserForGETMigration_,
uint256 amountOPNStakedForGETMigration_,
uint256 amountXOPNToUserForGETMigration_
)
{
_migratorCheckGET(_amountGET);
totalLiquidGETMigrated += _amountGET;
uint256 amountOPNToMintGET_ = _amountGET * GET_TO_OPN_RATIO;
totalOPNMintedByAllMigration += amountOPNToMintGET_;
uint256 stakeRate_ = _returnCurrentStakeRate(block.timestamp);
if (stakeRate_ == 0) {
amountOPNToUserForGETMigration_ = amountOPNToMintGET_;
amountXOPNToUserForGETMigration_ = 0;
amountOPNStakedForGETMigration_ = 0;
} else {
amountOPNStakedForGETMigration_ =
(amountOPNToMintGET_ * stakeRate_) /
1e18;
amountOPNToUserForGETMigration_ =
amountOPNToMintGET_ -
amountOPNStakedForGETMigration_;
totalOPNStakedByGETMigration += amountOPNStakedForGETMigration_;
opnMintManager.issueTokensMigration(
address(this),
amountOPNStakedForGETMigration_
);
openToken.approve(
address(xOpenToken),
amountOPNStakedForGETMigration_
);
amountXOPNToUserForGETMigration_ = xOpenToken.deposit(
amountOPNStakedForGETMigration_,
msg.sender
);
}
opnMintManager.issueTokensMigration(
msg.sender,
amountOPNToUserForGETMigration_
);
return (
amountOPNToUserForGETMigration_,
amountOPNStakedForGETMigration_,
amountXOPNToUserForGETMigration_
);
}
function _migrateStakedXGETTokens(
uint256 _amountXGET
)
internal
returns (
uint256 amountXOPNToUserForXGETMigration_,
uint256 amountGETRedeemedByXGET_
)
{
amountGETRedeemedByXGET_ = _migratorCheckXGET(_amountXGET);
totalXGETRedeemed += _amountXGET;
totalGETMigratedByXGETMigration += amountGETRedeemedByXGET_;
uint256 amountOPNToMintXGET_ = amountGETRedeemedByXGET_ *
GET_TO_OPN_RATIO;
totalOPNMintedByAllMigration += amountOPNToMintXGET_;
opnMintManager.issueTokensMigration(
address(this),
amountOPNToMintXGET_
);
openToken.approve(address(xOpenToken), amountOPNToMintXGET_);
amountXOPNToUserForXGETMigration_ = xOpenToken.deposit(
amountOPNToMintXGET_,
msg.sender
);
return (amountXOPNToUserForXGETMigration_, amountGETRedeemedByXGET_);
}
function _migratorCheckGET(uint256 _amountGET) internal {
require(
liquidGETToken.balanceOf(msg.sender) >= _amountGET,
"OPNMigration: Insufficient GET balance"
);
require(
liquidGETToken.allowance(msg.sender, address(this)) >= _amountGET,
"OPNMigration: GET spend not approved"
);
require(
liquidGETToken.transferFrom(msg.sender, address(this), _amountGET),
"OPNMigration: GET transfer failed"
);
_burn(_amountGET);
}
function _migratorCheckXGET(
uint256 _amountXGET
) internal returns (uint256 amountGETRedeemedByXGET_) {
require(
stakedGETToken.balanceOf(msg.sender) >= _amountXGET,
"OPNMigration: Insufficient XGET balance"
);
require(
stakedGETToken.allowance(msg.sender, address(this)) >= _amountXGET,
"OPNMigration: XGET spend not approved"
);
require(
stakedGETToken.transferFrom(msg.sender, address(this), _amountXGET),
"OPNMigration: XGET transfer failed"
);
amountGETRedeemedByXGET_ = stakedGETToken.redeem(
_amountXGET,
address(this),
address(this)
);
_burn(amountGETRedeemedByXGET_);
return amountGETRedeemedByXGET_;
}
function _returnCurrentStakeRate(
uint256 _timestamp
) internal view returns (uint256 stakeRate_) {
unchecked {
if (_timestamp < startOfMigration) {
return 1e18;
}
if (
_timestamp > startOfMigration + durationOfStakeMigrationPeriod
) {
return 0;
}
uint256 elapsedTime_ = _timestamp - startOfMigration;
uint256 remainingDuration_ = durationOfStakeMigrationPeriod -
elapsedTime_;
stakeRate_ = uint256(
(stakeRateInitial * remainingDuration_) /
durationOfStakeMigrationPeriod
);
return stakeRate_;
}
}
function _checkLiquidMigrationReturn(
uint256 _amountGET
)
internal
view
returns (
uint256 amountOPNToUserForGETMigration_,
uint256 amountOPNStakedForGETMigration_,
uint256 amountXOPNToUserForGETMigration_
)
{
uint256 amountOPNToMintGET_ = _amountGET * GET_TO_OPN_RATIO;
amountOPNStakedForGETMigration_ =
(amountOPNToMintGET_ * _returnCurrentStakeRate(block.timestamp)) /
1e18;
amountOPNToUserForGETMigration_ =
amountOPNToMintGET_ -
amountOPNStakedForGETMigration_;
amountXOPNToUserForGETMigration_ = xOpenToken.previewDeposit(
amountOPNStakedForGETMigration_
);
return (
amountOPNToUserForGETMigration_,
amountOPNStakedForGETMigration_,
amountXOPNToUserForGETMigration_
);
}
function _checkStakedXGETMigrateReturns(
uint256 _amountXGET
)
internal
view
returns (
uint256 amountXOPNToUserForXGETMigration_,
uint256 amountGETRedeemedByXGET_
)
{
amountGETRedeemedByXGET_ = stakedGETToken.previewRedeem(
_amountXGET,
address(this)
);
uint256 amountOPNToMintXGET_ = amountGETRedeemedByXGET_ *
GET_TO_OPN_RATIO;
amountXOPNToUserForXGETMigration_ = xOpenToken.previewDeposit(
amountOPNToMintXGET_
);
return (amountXOPNToUserForXGETMigration_, amountGETRedeemedByXGET_);
}
function _isMigrationActive() internal view returns (bool) {
return block.timestamp >= startOfMigration && isMigrationActive;
}
function setAddressConfig(
address _openToken,
address _xOpenToken,
address _opnMintManager
) external override onlyOwner {
openToken = IOPNToken(_openToken);
opnMintManager = IOPNMintManager(_opnMintManager);
xOpenToken = IMigrationLockedRevenueDistributionToken(_xOpenToken);
emit OPNTokenSet(_openToken);
emit XOpenTokenSet(_xOpenToken);
emit MintManagerSet(_opnMintManager);
}
function setStartOfMigration(
uint256 _startOfMigration
) external override onlyOwner {
startOfMigration = _startOfMigration;
emit StartOfMigrationSet(_startOfMigration);
}
function setEndOfMigration(
uint256 _endOfMigration
) external override onlyOwner {
endOfMigration = _endOfMigration;
emit EndOfMigrationSet(_endOfMigration);
}
function setStakeRateInitial(
uint256 _stakeRateInitial
) external override onlyOwner {
stakeRateInitial = _stakeRateInitial;
emit StakeRateInitialSet(_stakeRateInitial);
}
function setDurationOfStakeMigrationPeriod(
uint256 _durationOfStakeMigrationPeriod
) external override onlyOwner {
durationOfStakeMigrationPeriod = _durationOfStakeMigrationPeriod;
emit DurationOfStakeMigrationPeriodSet(_durationOfStakeMigrationPeriod);
}
function setMigrationActive(bool _setting) external override onlyOwner {
if (_setting) {
require(
address(xOpenToken) != address(0),
"OPNMigration: xOpenToken not set"
);
require(
address(openToken) != address(0),
"OPNMigration: openToken not set"
);
require(
address(opnMintManager) != address(0),
"OPNMigration: opnMintManager not set"
);
}
isMigrationActive = _setting;
emit MigrationStatusSet(_setting);
}
function totalOPNStakedByTheMigration()
external
view
override
returns (uint256)
{
return totalOPNStakedByGETMigration;
}
function totalOPNMinted() external view override returns (uint256) {
return totalOPNMintedByAllMigration;
}
function returnCurrentStakeRate() external view override returns (uint256) {
return _returnCurrentStakeRate(block.timestamp);
}
function returnStakeRateAtTime(
uint256 _timestamp
) external view override returns (uint256) {
return _returnCurrentStakeRate(_timestamp);
}
function totalOPNSupply() external view override returns (uint256) {
return openToken.totalSupply();
}
function totalXOPNSupply() external view override returns (uint256) {
return xOpenToken.totalSupply();
}
function totalGETMigratedInTotal()
external
view
override
returns (uint256)
{
return totalLiquidGETMigrated + totalGETMigratedByXGETMigration;
}
function returnTotalAmountGETFromXGETRedemptionMigrated()
external
view
override
returns (uint256)
{
return totalGETMigratedByXGETMigration;
}
function totalXGETRedeemedInTotal()
external
view
override
returns (uint256)
{
return totalXGETRedeemed;
}
function returnMigrateDualTokenOutput(
uint256 _amountGET,
uint256 _amountXGET
)
external
view
override
returns (
uint256 amountOPNToUserForGETMigration_,
uint256 amountXOPNToUserForXGETMigration_,
uint256 amountOPNStakedForGETMigration_,
uint256 amountXOPNToUserForGETMigration_,
uint256 amountGETRedeemedByXGET_
)
{
if (_amountGET == 0 && _amountXGET == 0) {
return (0, 0, 0, 0, 0);
}
if (_amountGET > 0) {
(
amountOPNToUserForGETMigration_,
amountOPNStakedForGETMigration_,
amountXOPNToUserForGETMigration_
) = _checkLiquidMigrationReturn(_amountGET);
}
if (_amountXGET > 0) {
(
amountXOPNToUserForXGETMigration_,
amountGETRedeemedByXGET_
) = _checkStakedXGETMigrateReturns(_amountXGET);
}
return (
amountOPNToUserForGETMigration_,
amountXOPNToUserForXGETMigration_,
amountOPNStakedForGETMigration_,
amountXOPNToUserForGETMigration_,
amountGETRedeemedByXGET_
);
}
function previewDeposit(
uint256 _assets
) external view override returns (uint256) {
return xOpenToken.previewDeposit(_assets);
}
function previewRedeem(
uint256 _shares
) external view override returns (uint256) {
return xOpenToken.previewRedeem(_shares, address(this));
}
function depositRatioOfOPNtoXOPN()
external
view
override
returns (uint256)
{
return xOpenToken.previewDeposit(1e18);
}
}
文件 8 的 8:Owned.sol
pragma solidity >=0.8.0;
abstract contract Owned {
event OwnershipTransferred(address indexed user, address indexed newOwner);
address public owner;
modifier onlyOwner() virtual {
require(msg.sender == owner, "UNAUTHORIZED");
_;
}
constructor(address _owner) {
owner = _owner;
emit OwnershipTransferred(address(0), _owner);
}
function transferOwnership(address newOwner) public virtual onlyOwner {
owner = newOwner;
emit OwnershipTransferred(msg.sender, newOwner);
}
}
{
"compilationTarget": {
"src/migration/OPNMigration.sol": "OPNMigration"
},
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": [
":@solmate/src/=lib/solmate/src/",
":contract-test-utils/=lib/erc20-helper/lib/contract-test-utils/contracts/",
":ds-test/=lib/forge-std/lib/ds-test/src/",
":erc20-helper/=lib/erc20-helper/src/",
":erc20/=lib/erc20/contracts/",
":forge-std/=lib/forge-std/src/",
":revenue-distribution-token/=lib/revenue-distribution-token/contracts/",
":solmate/=lib/solmate/src/"
]
}
[{"inputs":[{"internalType":"address","name":"_initialOwner","type":"address"},{"internalType":"address","name":"_liquidGETAddress","type":"address"},{"internalType":"address","name":"_stakedGETAddress","type":"address"},{"internalType":"uint256","name":"_startOfMigration","type":"uint256"},{"internalType":"uint256","name":"_startStakeRate","type":"uint256"},{"internalType":"uint256","name":"_durationOfStakeMigrationPeriod","type":"uint256"},{"internalType":"address","name":"_bridgeMigrationAddress","type":"address"},{"internalType":"uint256","name":"_chainId","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"admin","type":"address"},{"indexed":false,"internalType":"bool","name":"setting","type":"bool"}],"name":"AdminSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"durationOfStakeMigrationPeriod","type":"uint256"}],"name":"DurationOfStakeMigrationPeriodSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"endOfMigration","type":"uint256"}],"name":"EndOfMigrationSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"setting","type":"bool"}],"name":"MigrationStatusSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"opnMintManager","type":"address"}],"name":"MintManagerSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountGET","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountXGET","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOPNToUserForGETMigration","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountXOPNToUserForGETMigration","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountXOPNToUserForXGETMigration","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOPNStakedForGETMigration","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountGETRedeemedByXGET","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOPNMintedForXGETMigration","type":"uint256"}],"name":"OPNMigrationComplete","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"openToken","type":"address"}],"name":"OPNTokenSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"stakeRateInitial","type":"uint256"}],"name":"StakeRateInitialSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"startOfMigration","type":"uint256"}],"name":"StartOfMigrationSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"xOpenToken","type":"address"}],"name":"XOpenTokenSet","type":"event"},{"inputs":[],"name":"GET_TO_OPN_RATIO","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIGRATION_AVAILABLE_UNTIL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"chainId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"depositRatioOfOPNtoXOPN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"durationOfStakeMigrationPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"endOfMigration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isMigrationActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidGETToken","outputs":[{"internalType":"contract IGETToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountGET","type":"uint256"},{"internalType":"uint256","name":"_amountXGET","type":"uint256"}],"name":"migrateDualTokens","outputs":[{"internalType":"uint256","name":"amountOPNToUserForGETMigration_","type":"uint256"},{"internalType":"uint256","name":"amountXOPNToUserForXGETMigration_","type":"uint256"},{"internalType":"uint256","name":"amountOPNStakedForGETMigration_","type":"uint256"},{"internalType":"uint256","name":"amountXOPNToUserForGETMigration_","type":"uint256"},{"internalType":"uint256","name":"amountGETRedeemedByXGET_","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"migrationDestinationAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openToken","outputs":[{"internalType":"contract IOPNToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"opnMintManager","outputs":[{"internalType":"contract IOPNMintManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_assets","type":"uint256"}],"name":"previewDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_shares","type":"uint256"}],"name":"previewRedeem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"returnCurrentStakeRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountGET","type":"uint256"},{"internalType":"uint256","name":"_amountXGET","type":"uint256"}],"name":"returnMigrateDualTokenOutput","outputs":[{"internalType":"uint256","name":"amountOPNToUserForGETMigration_","type":"uint256"},{"internalType":"uint256","name":"amountXOPNToUserForXGETMigration_","type":"uint256"},{"internalType":"uint256","name":"amountOPNStakedForGETMigration_","type":"uint256"},{"internalType":"uint256","name":"amountXOPNToUserForGETMigration_","type":"uint256"},{"internalType":"uint256","name":"amountGETRedeemedByXGET_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"returnStakeRateAtTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"returnTotalAmountGETFromXGETRedemptionMigrated","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_openToken","type":"address"},{"internalType":"address","name":"_xOpenToken","type":"address"},{"internalType":"address","name":"_opnMintManager","type":"address"}],"name":"setAddressConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_durationOfStakeMigrationPeriod","type":"uint256"}],"name":"setDurationOfStakeMigrationPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_endOfMigration","type":"uint256"}],"name":"setEndOfMigration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_setting","type":"bool"}],"name":"setMigrationActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakeRateInitial","type":"uint256"}],"name":"setStakeRateInitial","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startOfMigration","type":"uint256"}],"name":"setStartOfMigration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakeRateInitial","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakedGETToken","outputs":[{"internalType":"contract IMigrationLockedRevenueDistributionToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startOfMigration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalGETMigratedByXGETMigration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalGETMigratedInTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalLiquidGETMigrated","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalOPNMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalOPNMintedByAllMigration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalOPNStakedByGETMigration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalOPNStakedByTheMigration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalOPNSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalXGETRedeemed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalXGETRedeemedInTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalXOPNSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"xOpenToken","outputs":[{"internalType":"contract IMigrationLockedRevenueDistributionToken","name":"","type":"address"}],"stateMutability":"view","type":"function"}]