👮ROOKeeper
Keepers of Register of Options
Name
ROOKeeper
Dependent Contract
IROOKeeper, AccessControl, OptionsRepo, SwapsRepo
API:
Source Code:
ROOKeeper
// SPDX-License-Identifier: UNLICENSED
/* *
* Copyright (c) 2021-2023 LI LI @ JINGTIAN & GONGCHENG.
*
* This WORK is licensed under ComBoox SoftWare License 1.0, a copy of which
* can be obtained at:
* [https://github.com/paul-lee-attorney/comboox]
*
* THIS WORK IS PROVIDED ON AN "AS IS" BASIS, WITHOUT
* WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
* TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. IN NO
* EVENT SHALL ANY CONTRIBUTOR BE LIABLE TO YOU FOR ANY DAMAGES.
*
* YOU ARE PROHIBITED FROM DEPLOYING THE SMART CONTRACTS OF THIS WORK, IN WHOLE
* OR IN PART, FOR WHATEVER PURPOSE, ON ANY BLOCKCHAIN NETWORK THAT HAS ONE OR
* MORE NODES THAT ARE OUT OF YOUR CONTROL.
* */
pragma solidity ^0.8.8;
import "./IROOKeeper.sol";
import "../common/access/AccessControl.sol";
contract ROOKeeper is IROOKeeper, AccessControl {
// ##################
// ## Option ##
// ##################
function updateOracle(
uint256 seqOfOpt,
uint d1,
uint d2,
uint d3
) external onlyDK {
_gk.getROO().updateOracle(seqOfOpt, d1, d2, d3);
}
function execOption(uint256 seqOfOpt, uint256 caller)
external onlyDK
{
_gk.getROO().execOption(seqOfOpt, caller);
}
function createSwap(
uint256 seqOfOpt,
uint seqOfTarget,
uint paidOfTarget,
uint seqOfPledge,
uint256 caller
) external onlyDK {
IRegisterOfOptions _roo = _gk.getROO();
IRegisterOfShares _ros = _gk.getROS();
SwapsRepo.Swap memory swap =
_roo.createSwap(seqOfOpt, seqOfTarget, paidOfTarget, seqOfPledge, caller);
_ros.decreaseCleanPaid(swap.seqOfTarget, swap.paidOfTarget);
if (swap.isPutOpt)
_ros.decreaseCleanPaid(swap.seqOfPledge, swap.paidOfPledge);
}
function payOffSwap(
uint256 seqOfOpt,
uint256 seqOfSwap,
uint msgValue,
uint caller
) external onlyDK {
IRegisterOfShares _ros = _gk.getROS();
uint centPrice = _gk.getCentPrice();
SwapsRepo.Swap memory swap =
_gk.getROO().payOffSwap(seqOfOpt, seqOfSwap, msgValue, centPrice);
uint valueOfDeal = uint(swap.paidOfTarget) * uint(swap.priceOfDeal) * centPrice / 100;
uint buyer = _ros.getShare(swap.seqOfPledge).head.shareholder;
require (caller == buyer, "ROOK.payOffSwap: wrong payer");
_ros.increaseCleanPaid(swap.seqOfTarget, swap.paidOfTarget);
_ros.transferShare(swap.seqOfTarget, swap.paidOfTarget, swap.paidOfTarget, buyer, swap.priceOfDeal, swap.priceOfDeal);
if (swap.isPutOpt)
_ros.increaseCleanPaid(swap.seqOfPledge, swap.paidOfPledge);
msgValue -= valueOfDeal;
_gk.saveToCoffer(
_ros.getShare(swap.seqOfTarget).head.shareholder,
valueOfDeal
);
if (msgValue > 0)
_gk.saveToCoffer(caller, msgValue);
}
function terminateSwap(
uint256 seqOfOpt,
uint256 seqOfSwap,
uint caller
) external onlyDK {
SwapsRepo.Swap memory swap =
_gk.getROO().terminateSwap(seqOfOpt, seqOfSwap);
IRegisterOfShares _ros = _gk.getROS();
uint seller = _ros.getShare(swap.seqOfTarget).head.shareholder;
require (caller == seller, "ROOK.terminateSwap: wrong ");
_ros.increaseCleanPaid(swap.seqOfTarget, swap.paidOfTarget);
if(swap.isPutOpt) {
_ros.increaseCleanPaid(swap.seqOfPledge, swap.paidOfPledge);
_ros.transferShare(swap.seqOfPledge, swap.paidOfPledge, swap.paidOfPledge,
seller, swap.priceOfDeal, swap.priceOfDeal);
}
}
// ==== AgainstToBuy ====
function requestToBuy(
address ia,
uint seqOfDeal,
uint paidOfTarget,
uint seqOfPledge,
uint caller
) external onlyDK {
IRegisterOfShares _ros = _gk.getROS();
SwapsRepo.Swap memory swap =
IInvestmentAgreement(ia).createSwap(_gk.getROA().getFile(ia).head.seqOfMotion,
seqOfDeal, paidOfTarget, seqOfPledge, caller);
_ros.decreaseCleanPaid(swap.seqOfTarget, swap.paidOfTarget);
_ros.decreaseCleanPaid(swap.seqOfPledge, swap.paidOfPledge);
}
function payOffRejectedDeal(
address ia,
uint seqOfDeal,
uint seqOfSwap,
uint msgValue,
uint caller
) external onlyDK {
IRegisterOfShares _ros = _gk.getROS();
uint centPrice = _gk.getCentPrice();
SwapsRepo.Swap memory swap =
IInvestmentAgreement(ia).payOffSwap(_gk.getROA().getFile(ia).head.seqOfMotion,
seqOfDeal, seqOfSwap, msgValue, centPrice);
uint valueOfDeal = uint(swap.paidOfTarget) * uint(swap.priceOfDeal) * centPrice / 100;
_ros.increaseCleanPaid(swap.seqOfTarget, swap.paidOfTarget);
_ros.increaseCleanPaid(swap.seqOfPledge, swap.paidOfPledge);
uint40 buyer = _ros.getShare(swap.seqOfPledge).head.shareholder;
require(caller == buyer, "ROAK.payOffRD: not buyer");
_ros.transferShare(swap.seqOfTarget, swap.paidOfTarget, swap.paidOfTarget,
buyer, swap.priceOfDeal, swap.priceOfDeal);
_gk.saveToCoffer(
_ros.getShare(swap.seqOfTarget).head.shareholder,
valueOfDeal
);
msgValue -= valueOfDeal;
if (msgValue > 0)
_gk.saveToCoffer(caller, msgValue);
}
function pickupPledgedShare(
address ia,
uint seqOfDeal,
uint seqOfSwap,
uint caller
) external onlyDK {
IRegisterOfShares _ros = _gk.getROS();
SwapsRepo.Swap memory swap =
IInvestmentAgreement(ia).terminateSwap(_gk.getROA().getFile(ia).head.seqOfMotion,
seqOfDeal, seqOfSwap);
uint40 seller = _ros.getShare(swap.seqOfTarget).head.shareholder;
require(caller == seller, "ROAK.pickupPledgedShare: not seller");
_ros.increaseCleanPaid(swap.seqOfTarget, swap.paidOfTarget);
_ros.increaseCleanPaid(swap.seqOfPledge, swap.paidOfPledge);
_ros.transferShare(swap.seqOfPledge, swap.paidOfPledge, swap.paidOfPledge, seller, swap.priceOfDeal, swap.priceOfDeal);
}
}
IROOKeeper
// SPDX-License-Identifier: UNLICENSED
/* *
* Copyright (c) 2021-2023 LI LI @ JINGTIAN & GONGCHENG.
*
* This WORK is licensed under ComBoox SoftWare License 1.0, a copy of which
* can be obtained at:
* [https://github.com/paul-lee-attorney/comboox]
*
* THIS WORK IS PROVIDED ON AN "AS IS" BASIS, WITHOUT
* WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
* TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. IN NO
* EVENT SHALL ANY CONTRIBUTOR BE LIABLE TO YOU FOR ANY DAMAGES.
*
* YOU ARE PROHIBITED FROM DEPLOYING THE SMART CONTRACTS OF THIS WORK, IN WHOLE
* OR IN PART, FOR WHATEVER PURPOSE, ON ANY BLOCKCHAIN NETWORK THAT HAS ONE OR
* MORE NODES THAT ARE OUT OF YOUR CONTROL.
* */
pragma solidity ^0.8.8;
import "../../lib/OptionsRepo.sol";
import "../../lib/SwapsRepo.sol";
interface IROOKeeper {
// #################
// ## ROOKeeper ##
// #################
function updateOracle(
uint256 seqOfOpt,
uint d1,
uint d2,
uint d3
) external;
function execOption(uint256 seqOfOpt, uint256 caller)
external;
function createSwap(
uint256 seqOfOpt,
uint seqOfTarget,
uint paidOfTarget,
uint seqOfPledge,
uint256 caller
) external;
function payOffSwap(
uint256 seqOfOpt,
uint256 seqOfSwap,
uint msgValue,
uint caller
) external;
function terminateSwap(
uint256 seqOfOpt,
uint256 seqOfSwap,
uint caller
) external;
// ==== Swap ====
function requestToBuy(
address ia,
uint seqOfDeal,
uint paidOfTarget,
uint seqOfPledge,
uint caller
) external;
function payOffRejectedDeal(
address ia,
uint seqOfDeal,
uint seqOfSwap,
uint msgValue,
uint caller
) external;
function pickupPledgedShare(
address ia,
uint seqOfDeal,
uint seqOfSwap,
uint caller
) external;
}