🛠️SigPage
Contract Template of Signature Page component
API:
Source Code:
SigPage
// 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 "./ISigPage.sol";
import "../access/AccessControl.sol";
contract SigPage is ISigPage, AccessControl {
using ArrayUtils for uint256[];
using EnumerableSet for EnumerableSet.UintSet;
using SigsRepo for SigsRepo.Page;
SigsRepo.Page[2] internal _sigPages;
//##################
//## Write ##
//##################
function circulateDoc() external onlyKeeper {
_sigPages[0].circulateDoc();
_sigPages[1].circulateDoc();
emit CirculateDoc();
}
function setTiming(bool initPage, uint signingDays, uint closingDays)
external attorneyOrKeeper
{
initPage ? _sigPages[0].setTiming(signingDays, closingDays) :
_sigPages[1].setTiming(signingDays, closingDays);
}
function addBlank(bool initPage, bool beBuyer, uint256 seqOfDeal, uint256 acct)
external attorneyOrKeeper
{
initPage ? _sigPages[0].addBlank(beBuyer, seqOfDeal, acct) :
_sigPages[1].addBlank(beBuyer, seqOfDeal, acct);
}
function removeBlank(bool initPage, uint256 seqOfDeal, uint256 acct)
external attorneyOrKeeper
{
initPage ? _sigPages[0].removeBlank(seqOfDeal, acct) :
_sigPages[1].removeBlank(seqOfDeal, acct);
}
function signDoc(bool initPage, uint256 caller, bytes32 sigHash)
external onlyKeeper
{
if (initPage) {
_sigPages[0].signDoc(caller, sigHash);
} else {
_sigPages[1].signDoc(caller, sigHash);
}
}
function regSig(uint256 signer, uint sigDate, bytes32 sigHash)
external onlyKeeper returns (bool flag)
{
flag = _sigPages[1].regSig(signer, sigDate, sigHash);
}
//##################
//## read I/O ##
//##################
function getParasOfPage(bool initPage) external view
returns (SigsRepo.Signature memory)
{
return initPage ? _sigPages[0].blanks[0].sig :
_sigPages[1].blanks[0].sig;
}
function circulated() external view returns(bool) {
return _sigPages[0].circulated();
}
function established() external view
returns (bool flag)
{
flag = _sigPages[1].buyers.length() > 0
? _sigPages[1].established() && _sigPages[0].established()
: _sigPages[0].established();
}
function getCirculateDate() external view returns(uint48) {
return _sigPages[0].getCirculateDate();
}
function getSigningDays() external view returns(uint16) {
return _sigPages[0].getSigningDays();
}
function getClosingDays() external view returns(uint16) {
return _sigPages[0].getClosingDays();
}
function getSigDeadline() external view returns(uint48) {
return _sigPages[0].getSigDeadline();
}
function getClosingDeadline() external view returns(uint48) {
return _sigPages[0].getClosingDeadline();
}
function isBuyer(bool initPage, uint256 acct)
public view returns(bool flag)
{
flag = initPage ? _sigPages[0].buyers.contains(acct) :
_sigPages[1].buyers.contains(acct);
}
function isSeller(bool initPage, uint256 acct)
public view returns(bool flag)
{
flag = initPage ? _sigPages[0].sellers.contains(acct) :
_sigPages[1].sellers.contains(acct);
}
function isParty(uint256 acct) external view returns (bool flag) {
flag = _sigPages[0].buyers.contains(acct) ||
_sigPages[0].sellers.contains(acct) ||
_sigPages[1].buyers.contains(acct) ||
_sigPages[1].sellers.contains(acct);
}
function isInitSigner(uint256 acct)
external view returns (bool flag)
{
flag = _sigPages[0].isSigner(acct);
}
function isSigner(uint256 acct)
external view returns (bool flag)
{
flag = _sigPages[0].isSigner(acct) ||
_sigPages[1].isSigner(acct);
}
function getBuyers(bool initPage)
public view returns (uint256[] memory buyers)
{
buyers = initPage
? _sigPages[0].buyers.values()
: _sigPages[1].buyers.values();
}
function getSellers(bool initPage)
public view returns (uint256[] memory sellers)
{
sellers = initPage
? _sigPages[0].sellers.values()
: _sigPages[1].sellers.values();
}
function getParties() external view
returns (uint256[] memory parties)
{
uint256[] memory buyers =
getBuyers(true).merge(getBuyers(false));
uint256[] memory sellers =
getSellers(true).merge(getSellers(false));
parties = buyers.merge(sellers);
}
function getSigOfParty(bool initPage, uint256 acct)
external view
returns (
uint256[] memory seqOfDeals,
SigsRepo.Signature memory sig,
bytes32 sigHash
) {
if (initPage) {
return _sigPages[0].sigOfParty(acct);
} else {
return _sigPages[1].sigOfParty(acct);
}
}
function getSigsOfPage(bool initPage)
external view
returns (
SigsRepo.Signature[] memory sigsOfBuyer,
SigsRepo.Signature[] memory sigsOfSeller
)
{
if (initPage) {
return _sigPages[0].sigsOfPage();
} else {
return _sigPages[1].sigsOfPage();
}
}
}
ISigPage
// 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/ArrayUtils.sol";
import "../../../lib/EnumerableSet.sol";
import "../../../lib/SigsRepo.sol";
interface ISigPage {
event CirculateDoc();
//##################
//## Write I/O ##
//##################
function circulateDoc() external;
function setTiming(bool initPage, uint signingDays, uint closingDays) external;
function addBlank(bool initPage, bool beBuyer, uint256 seqOfDeal, uint256 acct)
external;
function removeBlank(bool initPage, uint256 seqOfDeal, uint256 acct)
external;
function signDoc(bool initPage, uint256 caller, bytes32 sigHash)
external;
function regSig(uint256 signer, uint sigDate, bytes32 sigHash)
external returns(bool flag);
//##################
//## read I/O ##
//##################
function getParasOfPage(bool initPage) external view
returns (SigsRepo.Signature memory);
function circulated() external view returns(bool);
function established() external view
returns (bool flag);
function getCirculateDate() external view returns(uint48);
function getSigningDays() external view returns(uint16);
function getClosingDays() external view returns(uint16);
function getSigDeadline() external view returns(uint48);
function getClosingDeadline() external view returns(uint48);
function isBuyer(bool initPage, uint256 acct)
external view returns(bool flag);
function isSeller(bool initPage, uint256 acct)
external view returns(bool flag);
function isParty(uint256 acct)
external view returns(bool flag);
function isInitSigner(uint256 acct)
external view returns (bool flag);
function isSigner(uint256 acct)
external view returns (bool flag);
function getBuyers(bool initPage)
external view returns (uint256[] memory buyers);
function getSellers(bool initPage)
external view returns (uint256[] memory sellers);
function getParties() external view
returns (uint256[] memory parties);
function getSigOfParty(bool initParty, uint256 acct) external view
returns (
uint256[] memory seqOfDeals,
SigsRepo.Signature memory sig,
bytes32 sigHash
);
function getSigsOfPage(bool initPage) external view
returns (
SigsRepo.Signature[] memory sigsOfBuyer,
SigsRepo.Signature[] memory sigsOfSeller
);
}