📋Alongs
Contract Template of Drag-Along and Tag-Along terms.
Name
Alongs
Dependent Contract
IAlongs, AccessControl, LinksRepo
API:
Source Code:
Alongs
// 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 "../../../common/access/AccessControl.sol";
import "./IAlongs.sol";
contract Alongs is IAlongs, AccessControl {
using LinksRepo for LinksRepo.Repo;
LinksRepo.Repo private _repo;
// ###############
// ## Write I/O ##
// ###############
function addDragger(bytes32 rule, uint256 dragger) external onlyAttorney {
_repo.addDragger(rule, dragger, _gk.getROM());
}
function removeDragger(uint256 dragger) external onlyAttorney {
_repo.removeDragger(dragger);
}
function addFollower(uint256 dragger, uint256 follower) external onlyAttorney {
_repo.addFollower(dragger, follower);
}
function removeFollower(uint256 dragger, uint256 follower) external onlyAttorney {
_repo.removeFollower(dragger, follower);
}
// ################
// ## 查询接口 ##
// ################
function isDragger(uint256 dragger) external view returns (bool) {
return _repo.isDragger(dragger, _gk.getROM());
}
function getLinkRule(uint256 dragger) external view returns (RulesParser.LinkRule memory) {
return _repo.getLinkRule(dragger, _gk.getROM());
}
function isFollower(uint256 dragger, uint256 follower)
external view returns (bool)
{
return _repo.isFollower(dragger, follower, _gk.getROM());
}
function getDraggers() external view returns (uint256[] memory) {
return _repo.getDraggers();
}
function getFollowers(uint256 dragger) external view returns (uint256[] memory) {
return _repo.getFollowers(dragger, _gk.getROM());
}
function priceCheck(
DealsRepo.Deal memory deal
) public view returns (bool) {
return _repo.priceCheck(deal, _gk.getROS(), _gk.getROM());
}
// #############
// ## Term ##
// #############
function isTriggered(address ia, DealsRepo.Deal memory deal) public view returns (bool) {
IRegisterOfMembers _rom = _gk.getROM();
IRegisterOfAgreements _roa = _gk.getROA();
if (_roa.getHeadOfFile(ia).state != uint8(FilesRepo.StateOfFile.Circulated))
return false;
if (deal.head.typeOfDeal ==
uint8(DealsRepo.TypeOfDeal.CapitalIncrease) ||
deal.head.typeOfDeal == uint8(DealsRepo.TypeOfDeal.PreEmptive)
) return false;
if (!_repo.isDragger(deal.head.seller, _rom)) return false;
RulesParser.LinkRule memory rule =
_repo.getLinkRule(deal.head.seller, _rom);
if (rule.triggerDate > 0 &&
(block.timestamp < rule.triggerDate ||
block.timestamp >= rule.triggerDate + uint(rule.effectiveDays)*86400 ))
return false;
if (rule.triggerType == uint8(LinksRepo.TriggerTypeOfAlongs.NoConditions))
return true;
uint40 controllor = _rom.controllor();
if (controllor != _rom.groupRep(deal.head.seller))
return false;
(uint40 newControllor, uint16 shareRatio) = _roa.mockResultsOfIA(ia);
if (controllor == newControllor && shareRatio > rule.shareRatioThreshold)
return false;
return priceCheck(deal);
}
}
IAlongs
// 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/LinksRepo.sol";
interface IAlongs {
// ################
// ## Write ##
// ################
function addDragger(bytes32 rule, uint256 dragger) external;
function removeDragger(uint256 dragger) external;
function addFollower(uint256 dragger, uint256 follower) external;
function removeFollower(uint256 dragger, uint256 follower) external;
// ###############
// ## Read I/O ##
// ###############
function isDragger(uint256 dragger) external view returns (bool);
function getLinkRule(uint256 dragger) external view
returns (RulesParser.LinkRule memory);
function isFollower(uint256 dragger, uint256 follower)
external view returns (bool);
function getDraggers() external view returns (uint256[] memory);
function getFollowers(uint256 dragger) external view returns (uint256[] memory);
function priceCheck(
DealsRepo.Deal memory deal
) external view returns (bool);
function isTriggered(address ia, DealsRepo.Deal memory deal) external view returns (bool);
}