Bitcoin Forum
May 04, 2024, 11:02:41 PM *
News: Latest Bitcoin Core release: 27.0 [Torrent]
 
   Home   Help Search Login Register More  
Pages: [1]
  Print  
Author Topic: ComBoox:一种基于区块链的公司股权簿记平台  (Read 175 times)
paul.lee.attorney (OP)
Newbie
*
Offline Offline

Activity: 29
Merit: 0


View Profile
January 25, 2024, 03:52:44 PM
Last edit: February 07, 2024, 04:22:24 AM by paul.lee.attorney
 #1

ComBoox:一种基于区块链的公司股权簿记系统 (一)

系统综述

ComBoox是基于区块链技术开发的股权及公司治理文件簿记系统,能帮助用户在区块链上快速搭建起合法、安全、透明、可信的公司股权簿记和公司治理文件簿记智能合约体系,让公司的投资人、股东、高管、合作伙伴等利害关系方可以在智能合约的自动控制下完成股权认购、股权转让、股权质押、支付对价、签约、提案、表决、提名、就职、辞任等几乎所有的股权交易行为和公司治理活动。

不同于简单的股权凭证通证化,ComBoox不依靠任何法律文件约束来确保权益实现,而是通过智能合约的技术手段全面接管股权交易和公司治理活动,彻底排除义务人违约的可能性。

借助区块链和智能合约的技术特点,ComBoox可以根本解决困扰资本市场多年的“内部人控制、误导性陈述”等公司治理难题,彻底实现:

    (1)权利人直接行权;

    (2)义务人没机会违约;及

    (3)信息实时披露

股权簿记上链,意味着投资人可以方便的利用加密资产或央行数字货币支付股权对价,相当于将公司股权对接到了拥有万亿美元流动性规模的加密资产市场上,让公司股权价值有机会在巨大流动性支撑下获得重新的评估和确认。
1714863761
Hero Member
*
Offline Offline

Posts: 1714863761

View Profile Personal Message (Offline)

Ignore
1714863761
Reply with quote  #2

1714863761
Report to moderator
The block chain is the main innovation of Bitcoin. It is the first distributed timestamping system.
Advertised sites are not endorsed by the Bitcoin Forum. They may be unsafe, untrustworthy, or illegal in your jurisdiction.
1714863761
Hero Member
*
Offline Offline

Posts: 1714863761

View Profile Personal Message (Offline)

Ignore
1714863761
Reply with quote  #2

1714863761
Report to moderator
paul.lee.attorney (OP)
Newbie
*
Offline Offline

Activity: 29
Merit: 0


View Profile
January 26, 2024, 01:54:35 AM
Last edit: January 29, 2024, 10:28:13 AM by paul.lee.attorney
 #2

1.1.公司治理难题

长久以来,困扰资本市场的公司治理难题主要体现在三大方面:

    (1)权利人行权不畅
不论是撤换高管、变更会计政策、召集临时股东会,还是执行《股东协议》的强买权、拖卖权或对赌条款,投资人行使股东权利时总难以避免需要获得公司秘书、实际控制人、公司高管乃至公司登记管理机关的配合,这有时会非常困难,不但耗时费力,而且可能会演变成旷日持久的股东纠纷,甚至造成公司停产歇业的严重后果。

    (2)义务人故意违约
股权交易过程中,买方迟延支付对价,卖方恶意控制公章、证照、拖延控制权交割;公司运营中,高管越权审批,实控人挪用运营资金... 归根结底,这些问题本质上都是违约行为,要么是对《股权认购协议》、《股权转让协议》等股权交易合同的违反,要么是对《公司章程》、《股东协议》等公司治理契约的违反。

    (3)信息披露不及时、不准确
出让控制权、定向增发、新股东举牌等重大股权变动情况,股东会决议、董事会纪要等公司治理文件,都是判断公司未来经营方向、营利能力、股权估值的重要依据,直接影响投资人的投资决策和公司股权价值。信息披露不及时、不准确、不完整,往往成为导致股东纠纷、证券交易纠纷的重要原因。

1.2.区块链解决方案

区块链和智能合约(“智能合约”或“合约”)技术的出现,给解决上述问题提供了一个良好的契机。如果用区块链来簿记股权,用智能合约定义并自动控制与股权交易、公司治理相关的活动,就可以最大限度的排除人为因素影响,从而实现:

    (1)权利人直接行权
权利人通过电子签名技术验证身份并发出行权指令,通过触发智能合约的特定API调用相关的函数和方法,按事先设定的流程和条件直接改变股东名册、会议纪要等簿记状态,进而实现行权结果。在这一过程中,不必通过公司秘书、簿记管理人等任何第三方去代表行权或代理行权,让行使权利的动作不受任何第三方的影响或控制。

    (2)义务人没机会违约
之所以会出现“违约”情况,是因为权利的实现需要义务人作出配合行为,当把股权簿记、会议纪要这种权益簿记交付给智能合约自动控制时,很多传统意义上需要义务人配合的“请求权”就变成了可由权利人单方行使的“处分权”,彻底消除了义务人违反合同的可能性。对于《公司章程》、《股东协议》等组织法范畴的契约而言,很多违约情形实质上是实控人或高管的经营行为超越了授权范围或违反了办事流程,智能合约具有刚性且严密的代码逻辑,可以严密的控制经营行为的时间、权限、流程等条件,从根本上杜绝此类公司治理问题。

    (3)信息实时披露
公司治理的法律行为大致可分为签约、表决、支付、就职、辞任等几个具体类别,现有技术完全可以将这些以“意思表示”、“权益变更”为核心属性的法律行为在链上实现,也就是用区块链来簿记这些法律行为的数字化轨迹、用智能合约来自动甄别主体身份、自动判断行权条件、自动控制行为流程。区块链是一个信息实时共享的分布式系统,链上完成的法律行为在变更权益簿记、发生法律效力的同时就实现了信息披露,法律行为和信息披露不再是两个独立的动作,不再有任何时间上或逻辑上的割裂,不可能出现迟延披露、虚假披露、误导性陈述的问题。

1.3.通证化与公司估值

股权是一种典型的簿记权益,同时也是资本市场的交易标的。

    (1)IPO资本溢价
同一家公司,如果将其股权挂牌上市,可以让公众投资人方便的买进、卖出,让股权的流动性获得极大的释放,那么股权价值或公司价值就会获得飞跃式的提升,这就是IPO可创造资本溢价的基本原理。
    
    (2)股权通证化
与之同理,如果用区块链来簿记公司股权,就可以方便的用加密资产或央行数字货币支付股权对价,而且可以在智能合约自动控制下充分实现“券款对付”、“支付即结算”、“无需清算交割”的高效交易,交易成本和执行效率可远超现有的证券交易模式。 这就相当于将公司股权对接到了拥有万亿美元流动性规模的加密资产市场上,让公司股权价值有机会在巨大流动性支撑下获得重新的评估和确认。

    (3)Web3.0资本市场
当然,“股权上链”并不简单等于将股票或出资证明书通证化,或者将“股权登记簿”或“股东名册”单一簿记上链,更重要的是将可能影响公司股权价值的因素全部纳入区块链的自动化控制体系,将股权交易、公司治理等与股权处分、股东行权相关的活动全部置于智能合约的自动控制下,让它们可以遵循公司章程等内部契约和证券法规等外部规范的规定有序的开展,让资本市场可以依靠并信赖智能合约刚性的代码逻辑自动控制公司股权的创设、变更、行使和消灭。通过实现“代码即法律”的基本理念,建立起去中心化、不依赖信任关系、充分实现数字主权的真正Web3.0意义上的资本市场“价值互联”。

1.4.特点与优势

为适应千差万别的需求,ComBoox秉持“动态设置、即插即用”的理念尽量保持智能合约体系的灵活性和可扩展性,具体而言:

    ① 经营模式:既可以采用股东管理公司的DAO模式,也可以采用董事、高管管理公司的经理人模式;

    ② 所有者规模:既可以将股东人数限定在50人(或更少)以内,适用于小规模的有限责任公司,也可以将股东人数规模提升至无数量限制的上市公司水平;

    ③ 股权结构:既可以实现“同股同权”的普通股权结构,也可以灵活划分股权类别,给特殊类别的股份赋予特殊股东权利特殊表决权重

    ④ 治理规则:既可以灵活的设定提案规则、表决规则、董事高管席位分配规则、一致行动人规则、财产处分规则等一般的公司治理规则,也可以设定随售权、拖售权、强买权、强卖权、优先认购权、锁定期、反稀释等特殊的投资人权益以满足私募投资的需要;

    ⑤ 支付方式:既可以用链上原生加密货币支付股权、质权、期权的对价,也可以通过哈希时间锁等技术在链下或跨链用法定货币、央行数字货币或其他加密货币支付对价,充分兼容各类支付需求;

    ⑥ 法人主体:既可以用来簿记直接投资的公司股权,也可以将此类公司作为独立的股东或投资人进一步簿记其子公司、下属企业的公司股权并间接控制下属公司的治理活动,从而搭建更复杂的网状持股结构;及

    ⑦ 版本升级:既可以采用现有的智能合约模版来创建公司簿记,也可以特殊定制或升级改造全新的智能合约模版以满足特殊需求。
paul.lee.attorney (OP)
Newbie
*
Offline Offline

Activity: 29
Merit: 0


View Profile
January 26, 2024, 10:50:03 AM
Last edit: January 29, 2024, 10:31:44 AM by paul.lee.attorney
 #3

2.计算控制模型

ComBoox公司股权及治理文件簿记系统(“系统”)采用“状态机”模型,模拟、控制股权交易活动及公司治理行为,具体来说:

2.1.状态
将股东名册、会议纪要等信息簿记在每一时点所记录的信息内容视为不同的状态,用各类登记簿合约来分别记录。

2.2.转变过程
将股权转让等股权交易活动,或股东会表决等公司治理行为视为信息簿记在不同状态之间的转变过程,用管理人合约来详细的定义并控制其行为主体、行动步骤、行权条件和行为结果。
https://i.ibb.co/3CkS5Zr/image.png

2.3.条件与流程
将公司章程等组织法类文件中规定的表决规则、提名规则等公司治理规则,以及优先权、随售权、反稀释等股权交易规则,视为信息簿记状态转换过程中所需遵循的规则、条件和流程,用股东协议合约来定义各项规则的属性值、期限值或条件判断阈值,随时反馈管理人合约在自动执行过程中的查询请求。

2.4.写指令脚本
投资协议视为促使股权簿记状态发生转变的一系列写操作指令所构成的批处理程序或脚本,将其中约定的标的股权、当事方、数量、价格等交易要素视为写指令的输入参数,用投资协议合约来定义,使之可在管理人合约的控制下自动执行。
paul.lee.attorney (OP)
Newbie
*
Offline Offline

Activity: 29
Merit: 0


View Profile
January 28, 2024, 04:53:27 PM
Last edit: January 29, 2024, 10:50:11 AM by paul.lee.attorney
 #4

3.系统架构

系统由登记簿合约管理人合约股东协议合约投资协议合约四大类智能合约构成。

https://i.ibb.co/BKwnzND/Sys-Architecture.png

3.1.登记簿合约

登记簿合约定义了股权、质权、期权等权益簿记和股东名册、董事高管名册、股东会纪要、董事会纪要等公司治理文件簿记。 核心功能是定义各类簿记对象的属性构成、数据结构、参数校验算法和逻辑校验算法,以及这些簿记对象增、删、改、查的基础方法和API。

3.1.1.登记簿合约的功能

用户行权时:
  ① 登记簿合约会根据管理人合约的调用指令, 检索并反馈特定权益的状态值或特定法律行为的历史轨迹信息;

  ② 管理人合约依据上述反馈信息校验行权条件是否成就,或计算相关参数的具体数值;

  ③ 管理人合约调用特定的登记簿合约修改特定权益的状态值,或者将法律行为的内容、后果或轨迹信息记录下来。

例如,董事就职时,需要调用总管理人合约的董事就职接口,输入批准其任职的股东会决议编号和拟就任的职位编号:

  ①   总管理人合约会向注册中心合约查询指令发出账户的用户编号,随后调用董事高管名册管理人合约的“董事就职”接口,处理后续“就职”动作;

  ② 董事高管名册管理人合约会首先调用股东会决议登记簿,查询并核实该项动议类别是否为批准董事任职,以及是否已获得股东会表决通过; 

  ③ 若类别相符且已通过表决,则董事高管名册管理人合约会再次调用股东会决议登记簿,核实行权用户编号与职位信息中候选人编号是否一致,若一致则将该项动议的状态信息修改为“已执行”;

  ④ 董事高管名册管理人合约调取董事高管名册登记簿,将用户编号、就职日期记录下来,完成董事就职的法律动作记录。

https://i.ibb.co/ZdDM6Jg/Director-Take-Position.png


在上述过程中,股东会纪要合约董事高管名册合约就属于登记簿合约,前者根据管理人合约的请求反馈动议的类别和表决情况,供管理人合约判断行权的先决条件是否成就,后者则进一步核实行权用户与候选人的数字身份一致性,最后由管理人合约将用户编号、就职日期等信息写入高管名册合约以记录“就职”动作的行为轨迹。

3.1.2.登记簿合约的分类

根据簿记信息的类别,登记簿合约可分为权益簿记和治理文件簿记两大类别,具体包括:

  ① 股东协议登记簿(Register of Constitutions, “ROC”): 跟踪记录所有版本股东协议的合约地址、效力状态及创建、审议、表决时间表,可查询并获取当前有效的股东协议,以及已失效的历史版本股东协议;

文件对象的数据结构
Code:
    struct Head {
        uint48 circulateDate;
        uint8 signingDays;
        uint8 closingDays;
        uint16 seqOfVR;
        uint8 frExecDays;
        uint8 dtExecDays;
        uint8 dtConfirmDays;
        uint48 proposeDate;
        uint8 invExitDays;
        uint8 votePrepareDays;
        uint8 votingDays;
        uint8 execDaysForPutOpt;
        uint64 seqOfMotion;
        uint8 state;
    }

    struct Ref {
        bytes32 docUrl;
        bytes32 docHash;
    }

    struct File {
        bytes32 snOfDoc;
        Head head;
        Ref ref;
    }

    struct Repo {
        mapping(address => File) files;
        EnumerableSet.AddressSet filesList;
    }
paul.lee.attorney (OP)
Newbie
*
Offline Offline

Activity: 29
Merit: 0


View Profile
January 30, 2024, 02:03:17 PM
 #5

    ② 董事高管名册(Register of Directors, “ROD”): 簿记所有董事、高管的职位信息,包括任职候选人的用户编号、该高管的提名人、任命高管的动议表决规则、高管就职日期、任职期限届满日等信息,可供系统其他智能合约查阅核实高管身份和职权有效性;

职位对象的数据结构
Code:
    struct Position {
        uint16 title;
        uint16 seqOfPos;
        uint40 acct;
        uint40 nominator;
        uint48 startDate;
        uint48 endDate;
        uint16 seqOfVR;
        uint16 titleOfNominator;
        uint16 argu;
    }

    ③ 董事会纪要(Board Meeting Minutes, “BMM”): 簿记提交董事会表决的各项动议信息,包括动议的提案用户、提案时间、表决开始及终止时间、表决投票结果、有效表决票的态度、委托投票安排、决议执行人、决议执行状态等信息,可供系统其他智能合约查阅动议的内容索引、审核状态、流程时间表、提案人、执行人等信息;

动议对象的数据结构
Code:
    struct Head {
        uint16 typeOfMotion;
        uint64 seqOfMotion;
        uint16 seqOfVR;
        uint40 creator;
        uint40 executor;
        uint48 createDate;
        uint32 data;
    }

    struct Body {
        uint40 proposer;
        uint48 proposeDate;
        uint48 shareRegDate;
        uint48 voteStartDate;
        uint48 voteEndDate;
        uint16 para;
        uint8 state;
    }

    struct Motion {
        Head head;
        Body body;
        RulesParser.VotingRule votingRule;
        uint contents;
    }
paul.lee.attorney (OP)
Newbie
*
Offline Offline

Activity: 29
Merit: 0


View Profile
February 01, 2024, 05:14:17 AM
 #6

    ④ 股东名册(Register of Members, “ROM”): 簿记各股东的持股及表决权情况,包括持有股权的编号、认缴出资总额、实缴出资总额、清洁(无质押、无股转合约安排)实缴出资总额及表决权权重等信息,供查阅核实股东身份、持股编号清单、认缴实缴出资总额、计算表决权总额等信息;

股东对象的数据结构

Code:
    struct Checkpoint {
        uint48 timestamp;
        uint16 votingWeight;
        uint64 paid;
        uint64 par;
        uint64 cleanPaid;
    }

    struct History {
        mapping (uint256 => Checkpoint) checkpoints;
    }

    struct Member {
        Checkpoints.History votesInHand;
        // class => seqList
        mapping(uint => EnumerableSet.UintSet) sharesOfClass;
        EnumerableSet.UintSet classesBelonged;
    }

    ⑤ 股东会纪要(General Meeting Minutes, “GMM”): 簿记提交股东会表决的各项动议信息,包括动议的提案人、提案时间、表决开始及终止时间、表决投票结果、有效表决票的态度、委托投票安排、决议执行人、决议执行状态等信息,可供系统其他智能合约查阅动议的内容索引、审核状态、流程时间表、提案人、执行人等信息;

    ⑥ 投资协议登记簿(Register of Agreements, “ROA”):跟踪记录所有股权认购、股权转让等投资协议的合约地址、效力状态及履行时间表,可模拟交易结果并推算交割后公司控制权归属及股权比例情况,方便判断拖售权、随售权等特殊股东权益的行权条件成就情况,可查询获取所有投资协议合约对象;

    ⑦ 期权登记簿(Register of Options, “ROO”):簿记股东协议约定的强买权、强卖权等以股权为标的的期权信息,包括权利人、义务人、行权期开始时间、结束时间、触发条件、行权价格、标的股份类别、标的股份实缴金额等;

期权对象的数据结构
Code:
    struct Cond {
        uint32 seqOfCond;
        uint8 logicOpr;
        uint8 compOpr1;
        uint64 para1;
        uint8 compOpr2;
        uint64 para2;
        uint8 compOpr3;
        uint64 para3;
    }

    struct Head {
        uint32 seqOfOpt;
        uint8 typeOfOpt;
        uint16 classOfShare;
        uint32 rate;
        uint48 issueDate;
        uint48 triggerDate;
        uint16 execDays;
        uint16 closingDays;
        uint40 obligor;
    }

    struct Body {
        uint48 closingDeadline;
        uint40 rightholder;
        uint64 paid;
        uint64 par;
        uint8 state;
        uint16 para;
        uint16 argu;
    }

    struct Option {
        Head head;
        Cond cond;
        Body body;
    }


    ⑧ 质权登记簿(Register of Pledges, “ROP”):簿记股权出质信息,可查询获取所有股权质押信息,包括债权人、债务人、出质人、质押实缴金额、担保债权金额、债权到期日、担保到期日等;

质权对象的数据结构
Code:
    struct Head {
        uint32 seqOfShare;
        uint16 seqOfPld;
        uint48 createDate;
        uint16 daysToMaturity;
        uint16 guaranteeDays;
        uint40 creditor;
        uint40 debtor;
        uint40 pledgor;
        uint8 state;
    }

    struct Body {
        uint64 paid;
        uint64 par;
        uint64 guaranteedAmt;
        uint16 preSeq;
        uint16 execDays;
        uint16 para;
        uint16 argu;
    }

    struct Pledge {
        Head head;
        Body body;
        bytes32 hashLock;
    }


    ⑨ 股权登记簿(Register of Shares, “ROS”):簿记公司股权信息,可查询获取公司所有已发行的股份信息,包括股东、股份类别、表决权重、发行日期、实缴期限、票面金额、实缴金额、发行价格等;

股权对象的数据结构
Code:
    struct Head {
        uint16 class;
        uint32 seqOfShare;
        uint32 preSeq;
        uint48 issueDate;
        uint40 shareholder;
        uint32 priceOfPaid;
        uint32 priceOfPar;
        uint16 votingWeight;
        uint8 argu;
    }

    struct Body {
        uint48 payInDeadline;
        uint64 paid;
        uint64 par;
        uint64 cleanPaid;
        uint8 state;
        uint8 para;
    }

    struct Share {
        Head head;
        Body body;
    }

    ⑩ 股权挂牌交易登记簿(List of Orders, “LOO”):簿记以挂牌出让、集中竞价方式交易的新股发行要约、股权转让要约、股权认购要约、适格投资人、成交交易等信息。

卖单链表节点的数据结构
Code:
    struct Node {
        uint32 prev;
        uint32 next;
        uint32 seqOfShare;
        uint64 paid;
        uint32 price;
        uint48 expireDate;
        uint16 votingWeight;
    }
paul.lee.attorney (OP)
Newbie
*
Offline Offline

Activity: 29
Merit: 0


View Profile
February 02, 2024, 06:22:02 AM
Last edit: February 07, 2024, 04:21:22 AM by paul.lee.attorney
 #7

3.2. 管理人合约

管理人合约定义了关于公司治理、股权交易的几十种法律行为的API,以此管理和控制相关法律行为的行为主体、行权条件、行动流程和法律后果。

3.2.1.管理人合约的功能

用户行权时,管理人合约会按照特定的法律逻辑调用股东协议合约、特定的登记簿合约,查询法律行为需要满足哪些前提条件(或后续计算需要依赖哪些中间参数),结合从API接口获取的输入参数,计算并判断行权条件是否成就,或算出中间参数的具体数值;若所有条件均成就,则调用特定的登记簿合约来修改特定簿记权益的状态值,或者将特定法律行为的意思表示内容、行为轨迹信息记录下来。

例如,股东表决时,用户需要调用总管理人合约的“投票表决”API,输入目标动议编号及赞同、反对或弃权的表决态度,之后,总管理人合约会调用注册中心合约查询行权账户的用户编号,再调用股东会议纪要管理人合约的“投票表决”API,转交后续步骤的控制权。其后,股东会议纪要管理人合约会:
    ① 从股东会纪要登记簿中查询获取该项动议的数据对象;
    ② 根据动议对象的表决规则编号从股东协议合约中查询获取表决规则并推算出动议的表决期;
    ③ 根据当前区块时间戳判断是否处于表决期;
    ④ 若处于表决期,则再调用股东名册合约验证用户是否为公司股东;
    ⑤ 若是股东,则再从动议对象的代理权映射表中获得该股东的受托表决情况,进而再调取股东名册合约查询并计算投票人所代表的表决权权重;
    ⑥ 最后,将投票人用户编号、表决态度、表决权重、表决时间等信息存储记录在股东会纪要登记簿的动议对象中。
从前例可知,管理人合约是各项法律行为行权条件和逻辑流程的控制中枢。为满足EIP-170规范的容量要求,系统定义了总管理人分项管理人两类合约。

3.2.2.总管理人合约

总管理人合约(“General Keeper”)处于公司簿记系统最上层,具备如下核心功能:
    ① 是公司簿记系统唯一的写操作指令入口,负责将写指令路由到特定的分项簿记管理人合约;
    ② 同时也是各登记簿合约的地址索引中枢,可根据查询请求反馈特定登记簿合约的账户地址;
    ③ 对外代表公司法人主体,以公司名义完成链上法律行为,例如,签署或执行智能合约、支付代币、行使表决权等;
    ④ 代表公司法人持有ETH、CBP等链上加密资产,根据股东会决议或董事会决议,支付特定金额的加密资产至决议规定的特定账户;
    ⑤ 临时存储股转交易的ETH对价收入,可根据股权卖方的调用请求将暂存的ETH划转至卖方主钥匙账户地址。

3.2.3.分项管理人合约

分项管理人合约是控制法律行为主体、条件、流程与后果的核心计算层,具体包括:

    ① 股东协议登记簿管理人(“ROC Keeper”): 控制股东协议合约的创建、传阅、签署、激活、加入几项法律行为,负责管理股东协议登记簿;

ROC Keeper API
Code:

function createSHA(uint version, uint caller) external;

function circulateSHA(address body, bytes32 docUrl, bytes32 docHash, uint caller) external;

function signSHA(address sha, bytes32 sigHash, uint caller) external;

function activateSHA(address body, uint caller) external;

function acceptSHA(bytes32 sigHash, uint caller) external;


    ② 董事高管名册管理人(“ROD Keeper”): 控制董事和高管的就职、解职、辞职几项法律行为,负责管理高管名册登记簿

ROD Keeper API
Code:

function takeSeat(uint256 seqOfMotion, uint256 seqOfPos, uint caller) external;

function removeDirector (uint256 seqOfMotion, uint256 seqOfPos, uint caller) external;

function takePosition(uint256 seqOfMotion, uint256 seqOfPos, uint caller) external;

function removeOfficer (uint256 seqOfMotion, uint256 seqOfPos, uint caller) external;

function quitPosition(uint256 seqOfPos, uint caller) external;


    ③ 董事会纪要管理人(“BMM Keeper”): 控制董事会动议的创建、提案、委托投票代理人、投票表决、统计表决结果、执行决议等法律动作,其中的动议包括任命及解职高管、审议文件、支付公司持有的代币、调用智能合约几大类别,负责管理董事会纪要登记簿

BMM Keeper API
Code:

function nominateOfficer(uint256 seqOfPos, uint candidate, uint nominator) external;

function createMotionToRemoveOfficer(uint256 seqOfPos, uint nominator) external;

function createMotionToApproveDoc(uint doc, uint seqOfVR, uint executor, uint proposer) external;

function proposeToTransferFund(
    address to, bool isCBP, uint amt,
    uint expireDate, uint seqOfVR, uint executor, uint proposer
) external;

function createAction(
    uint seqOfVR, address[] memory targets, uint256[] memory values,
    bytes[] memory params, bytes32 desHash, uint executor, uint proposer
) external;

function entrustDelegaterForBoardMeeting(uint256 seqOfMotion, uint delegate, uint caller) external;

function proposeMotionToBoard (uint seqOfMotion, uint caller) external;

function castVote(uint256 seqOfMotion, uint attitude, bytes32 sigHash, uint caller) external;

function voteCounting(uint256 seqOfMotion) external;

function transferFund(
    address to, bool isCBP, uint amt,
    uint expireDate, uint seqOfMotion, uint caller
) external;

function execAction(
    uint typeOfAction, address[] memory targets, uint256[] memory values,
    bytes[] memory params, bytes32 desHash, uint256 seqOfMotion
    uint caller
) external;


    ④ 股东名册管理人(“ROM Keeper”): 控制设定股东人数上限、设置实缴出资哈希锁、解锁并提取实缴出资、撤回被锁定的实缴出资、减少注册资本几项法律行为,管理股东名册和股权登记簿两个登记簿合约;

ROM Keeper API
Code:

function setMaxQtyOfMembers(uint max) external;

function setPayInAmt(
    uint seqOfShare,
    uint amt,
    uint expireDate,
    bytes32 hashLock
) external;

function requestPaidInCapital(bytes32 hashLock, string memory hashKey) external;

function withdrawPayInAmt(bytes32 hashLock, uint seqOfShare) external;

function payInCapital(uint seqOfShare, uint amt, uint caller) external payable;

function decreaseCapital(uint256 seqOfShare, uint paid, uint par) external;

function updatePaidInDeadline(uint256 seqOfShare, uint line) external;


    ⑤ 股东会纪要管理人(“GMM Keeper”): 控制股东会动议的创建、提案、委托投票代理人、投票表决、统计表决结果、执行决议等法律动作,其中的动议包括任命及解职董事、审议文件、支付代币、调用智能合约几大类别,管理股东会纪要登记簿;

GMM Keeper API
Code:

function nominateDirector(uint256 seqOfPos, uint candidate, uint nominator) external;

function createMotionToRemoveDirector(uint256 seqOfPos, uint caller) external;

function proposeDocOfGM(
    uint doc, uint seqOfVR, uint executor, uint proposer
) external;

function proposeToDistributeProfits(
    uint amt, uint expireDate, uint seqOfVR, uint executor, uint caller
) external;

function proposeToTransferFund(
    address to, bool isCBP, uint amt, uint expireDate,
    uint seqOfVR, uint executor, uint proposer
) external;

function createActionOfGM(
    uint seqOfVR, address[] memory targets, uint256[] memory values,
    bytes[] memory params, bytes32 desHash, uint executor, uint proposer
) external;

function entrustDelegaterForGeneralMeeting(uint256 seqOfMotion, uint delegate, uint caller) external;

function proposeMotionToGeneralMeeting(uint256 seqOfMotion, uint caller) external;

function castVoteOfGM(
    uint256 seqOfMotion, uint attitude, bytes32 sigHash, uint caller
) external;

function voteCountingOfGM(uint256 seqOfMotion) external;

function distributeProfits(uint amt, uint expireDate, uint seqOfMotion, uint caller) external;

function transferFund(
    address to, bool isCBP, uint amt,
    uint expireDate, uint seqOfMotion, uint caller
) external;

function execActionOfGM(
    uint seqOfVR, address[] memory targets, uint256[] memory values,
    bytes[] memory params, bytes32 desHash, uint256 seqOfMotion, uint caller
) external returns(uint);


    ⑥ 投资协议登记簿管理人(“ROA Keeper”):控制投资协议合约的创建、传阅、签署、锁定标的股权、解锁并提取股权、发行新股、转让股权、终止交易、支付对价几项法律行为,管理投资协议登记簿和股权登记簿两项簿记;

ROA Keeper API
Code:

function createIA(uint256 version, address primeKeyOfCaller, uint caller) external;

function circulateIA(address ia, bytes32 docUrl, bytes32 docHash, uint256 caller) external;

function signIA(address ia, uint256 caller, bytes32 sigHash) external;

function pushToCoffer(
    address ia,
    uint256 seqOfDeal,
    bytes32 hashLock,
    uint closingDeadline,
    uint256 caller
) external;

function closeDeal(address ia, uint256 seqOfDeal, string memory hashKey) external;

function transferTargetShare(address ia, uint256 seqOfDeal, uint256 caller) external;

function issueNewShare(address ia, uint256 seqOfDeal, uint caller) external;

function terminateDeal(address ia, uint256 seqOfDeal, uint256 caller) external;

function payOffApprovedDeal(address ia, uint seqOfDeal, uint msgValue, uint caller) external;


    ⑦ 期权登记簿管理人(“ROO Keeper”):控制期权触发条件的输入、行使期权、设定期权质押、支付期权标的股对价、执行期权质权、请求否决人购买标的股、支付否决交易标的股对价、执行否决人股权几项法律行为,管理期权登记簿、股权登记簿两项簿记;

ROO Keeper API
Code:

function updateOracle(uint256 seqOfOpt, uint d1, uint d2, uint d3) external;

function execOption(uint256 seqOfOpt) external;

function createSwap(uint256 seqOfOpt, uint seqOfTarget, uint paidOfTarget, uint seqOfPledge) external;

function payOffSwap(uint256 seqOfOpt, uint256 seqOfSwap) external payable;

function terminateSwap(uint256 seqOfOpt, uint256 seqOfSwap) external;

function requestToBuy(address ia, uint seqOfDeal, uint paidOfTarget, uint seqOfPledge) external;

function payOffRejectedDeal(address ia, uint seqOfDeal, uint seqOfSwap) external payable;

function pickupPledgedShare(address ia, uint seqOfDeal, uint seqOfSwap) external;


    ⑧ 质权登记簿管理人(“ROP Keeper”):控制设立质权、转让质权、偿付债务、延长担保期、锁定质权、解锁并释放质权、撤销质权、执行质权几项法律行为,管理质权登记簿、股权登记簿、投资协议登记簿三项簿记且在执行质权时会自动生成投资协议合约;

ROP Keeper API
Code:

function createPledge(
    bytes32 snOfPld,
    uint paid,
    uint par,
    uint guaranteedAmt,
    uint execDays,
    uint caller
) external;

function transferPledge(
    uint256 seqOfShare,
    uint256 seqOfPld,
    uint buyer,
    uint amt,
    uint caller
) external;

function refundDebt(uint256 seqOfShare, uint256 seqOfPld, uint amt, uint caller) external;

function extendPledge(uint256 seqOfShare, uint256 seqOfPld, uint extDays, uint caller) external;

function lockPledge(uint256 seqOfShare, uint256 seqOfPld, bytes32 hashLock, uint caller) external;

function releasePledge(
    uint256 seqOfShare,
    uint256 seqOfPld,
    string memory hashKey,
    uint caller
) external;

function execPledge(
    bytes32 snOfDeal,
    uint256 seqOfPld,
    uint version,
    uint buyer,
    uint groupOfBuyer,
    uint caller
) external;

function revokePledge(uint256 seqOfShare, uint256 seqOfPld, uint caller) external;


    ⑨ 特殊股东权益管理人(“SHA Keeper”):控制行使随售权、接受随售请求、行使反稀释权、接受反稀释赠与股份、行使优先购买权、计算优先认购股份总额几项法律行为,管理投资协议登记簿、股权登记簿两项簿记且会自动生成《投资协议》;

SHA Keeper API
Code:

function execTagAlong(
    address ia,
    uint256 seqOfDeal,
    uint256 seqOfShare,
    uint paid,
    uint par,
    bytes32 sigHash
) external;

function execDragAlong(
    address ia,
    uint256 seqOfDeal,
    uint256 seqOfShare,
    uint paid,
    uint par,
    bytes32 sigHash
) external;

function acceptAlongDeal(
    address ia,
    uint256 seqOfDeal,
    bytes32 sigHash
) external;

function execAntiDilution(
    address ia,
    uint256 seqOfDeal,
    uint256 seqOfShare,
    bytes32 sigHash
) external;

function takeGiftShares(address ia, uint256 seqOfDeal) external;

function execFirstRefusal(
    uint256 seqOfRule,
    uint256 seqOfRightholder,
    address ia,
    uint256 seqOfDeal,
    bytes32 sigHash
) external;

function computeFirstRefusal(address ia, uint256 seqOfDeal) external;

   
    ⑩ 股权挂牌交易登记簿管理人(“LOO Keeper”):控制注册投资人、批准投资人、撤销投资资格、挂牌新股发行要约、撤回新股发行要约、挂牌股转要约、撤回股转要约、提交购买订单几项法律行为,管理股权挂牌交易登记簿、股权登记簿、股东名册登记簿三个登记簿合约。

LOO Keeper API
Code:

function regInvestor(uint userNo, uint groupRep, bytes32 idHash) external;

function approveInvestor(uint caller, uint caller, uint seqOfLR) external;

function revokeInvestor(uint caller, uint caller, uint seqOfLR) external;

function placeInitialOffer(
    uint caller, uint classOfShare, uint execHours,
    uint paid, uint price, uint seqOfLR
) external;

function withdrawInitialOffer(
    uint caller, uint classOfShare, uint seqOfOrder, uint seqOfLR
) external;

function placeSellOrder(
    uint caller, uint seqOfClass, uint execHours, uint paid,
    uint price, uint seqOfLR, bool sortFromHead
) external;

function withdrawSellOrder(uint caller, uint classOfShare, uint seqOfOrder) external;

function placeBuyOrder(uint caller, uint classOfShare, uint paid, uint price) external payable;

paul.lee.attorney (OP)
Newbie
*
Offline Offline

Activity: 29
Merit: 0


View Profile
February 07, 2024, 04:20:26 AM
 #8

3.3.股东协议合约

股东协议合约用来动态定义跟股权交易、公司治理相关的行为规则和行权条件,是规范整个公司治理结构和行为规则的宪法类文件。

用户行权时,股东协议合约会根据簿记管理人合约的查询指令检索特定条款,然后反馈某种法律行为所需遵循的特定条件阈值、参数,或者反馈特定条件是否成就的判断结果,供管理人合约后续计算使用。

例如,股东表决时,管理人合约会调用股东协议合约,查询特定表决规则项下的表决期限安排,然后根据反馈的天数和该议案的提案日计算表决开始日和结束日,最后根据当前的区块时间戳判断是否处于表决期内。

股东协议合约的具体条款按公司治理的法律逻辑抽象定义为不同的数据对象和方法,在起草过程中可以动态的给数据对象的特定属性设定不同的值,以此定义某类法律行为的不同规则,经股东会审议表决通过后发生法律效力。

比如,可以给增资交易设定30天的审议期限和三分之二的表决通过阈值、给股转交易设定15天的审议期限和二分之一的表决通过阈值,那么在相关协议提交股东会审议表决过程中,管理人合约就可以根据交易类别来计算和判断不同表决程序的时间流程和通过情况。

股东协议合约中规定的各项公司治理、股权交易规则按其复杂程度和规制事项分为“规则”和“条款”两大类别,分别由两个映射表来存储、管理。

3.3.1.“规则”

规则”用bytes32来定义、依靠“规则解析库合约”解析其每条规则的关键属性值、期限值或条件判断阈值,使之可以转变为结构化数据对象。

表决规则对象及其解析函数
Code:
// Object of VotingRule
struct VotingRule{
    uint16 seqOfRule;
    uint8 qtyOfSubRule;
    uint8 seqOfSubRule;
    uint8 authority;
    uint16 headRatio;
    uint16 amountRatio;
    bool onlyAttendance;
    bool impliedConsent;
    bool partyAsConsent;
    bool againstShallBuy;
    uint8 frExecDays;
    uint8 dtExecDays;
    uint8 dtConfirmDays;
    uint8 invExitDays;
    uint8 votePrepareDays;
    uint8 votingDays;
    uint8 execDaysForPutOpt;
    uint40[2] vetoers;
    uint16 para;
}

function votingRuleParser(bytes32 sn) public pure returns (VotingRule memory rule) {
    uint _sn = uint(sn);
    rule = VotingRule({
    seqOfRule: uint16(_sn >> 240),
        qtyOfSubRule: uint8(_sn >> 232),
        seqOfSubRule: uint8(_sn >> 224),
        authority: uint8(_sn >> 216),
        headRatio: uint16(_sn >> 200),
        amountRatio: uint16(_sn >> 184),
        onlyAttendance: uint8(_sn >> 176) == 1,
        impliedConsent: uint8(_sn >> 168) == 1,
        partyAsConsent: uint8(_sn >> 160) == 1,
        againstShallBuy: uint8(_sn >> 152) == 1,
        frExecDays: uint8(_sn >> 144),
        dtExecDays: uint8(_sn >> 136),
        dtConfirmDays: uint8(_sn >> 128),
        invExitDays: uint8(_sn >> 120),
        votePrepareDays: uint8(_sn >> 112),
        votingDays: uint8(_sn >> 104),
        execDaysForPutOpt: uint8(_sn >> 96),
        vetoers: [uint40(_sn >> 56), uint40(_sn >> 16)],
        para: uint16(_sn)
    });
}


每条规则都对应着自己的规则编号,可以方便的建立起从“编号”到“规则”的映射表,然后根据规则编号从映射表中检索到特定规则对象。

规则映射表
Code:
    // seq => rule
    mapping(uint256 => bytes32) rules;


目前的规则包括:公司治理一般规则、表决规则、高管职位分配规则、优先权规则、一致行动人规则,以及股权挂牌交易规则

3.3.2.“条款”

条款”由独立的智能合约定义,依靠结构化数据对象及其方法来定义复杂法律行为的行权条件、行为流程和中间参数算法。每个条款都对应着自己的条款编号,可以动态的建立起从“编号”到“合约地址”的映射表,然后根据条款编号从映射表中检索到特定条款的智能合约。

条款映射表
Code:
    

// title => body
mapping(uint256 => address) terms;


目前的条款合约包括:反稀释条款、锁定期条款、拖售权条款、随售权条款,以及(强买、强卖)期权条款。

所以,股东间协议合约可以理解为以“规则映射表”和“条款映射表”为核心的规则数据库,用于动态设定各项规则的参数并在运行时检索获取它们。规则解析库合约和各类条款合约的功能则是按照法律逻辑将各种规则和条款建立模型,抽象的定义出其核心属性构成,然后通过暴露出的API让用户可以动态设置这些规则和条款的不同属性值、参数值。这样,系统运行时,就可以根据用户指令,由特定的管理人合约按特定法律行为的预设逻辑去检索股东间协议合约,获取特定规则的属性值、参数值,再进行条件判断或流程控制。

LockUp条款接口
Code:

interface ILockUp {

    struct Locker {
        uint48 dueDate;
        EnumerableSet.UintSet keyHolders;
    }

    function setLocker(uint256 seqOfShare, uint dueDate) external;

    function delLocker(uint256 seqOfShare) external;

    function addKeyholder(uint256 seqOfShare, uint256 keyholder) external;

    function removeKeyholder(uint256 seqOfShare, uint256 keyholder) external;

    function isLocked(uint256 seqOfShare) external view returns (bool);

    function getLocker(uint256 seqOfShare) external view returns (uint48 dueDate, uint256[] memory keyHolders);

    function lockedShares() external view returns (uint256[] memory);

    function isTriggered(DealsRepo.Deal memory deal) external view returns (bool);

    function isExempted(address ia, DealsRepo.Deal memory deal) external view returns (bool);

}

paul.lee.attorney (OP)
Newbie
*
Offline Offline

Activity: 29
Merit: 0


View Profile
February 21, 2024, 06:32:55 AM
 #9

3.4.投资协议合约

投资协议合约用于动态定义增发股权、转让股权等股权交易安排的各项交易要素,例如标的股权、转让价格、转让数量、买方身份、签约截止日、交割截止日、合同当事方等等。

投资协议合约妥善签署后,当事方可调用管理人合约的相关接口推动协议的审议、表决、支付及交割流程,管理人合约将按投资协议股东协议的相关约定自动完成权利人身份识别、行权条件校验、交易流程控制,直至实现最后的交易目的——变更股权簿记。

投资协议合约本质上是一系列变更股权簿记状态的写指令脚本,在管理人合约的控制下按股东协议事先规定的条件和流程,在相关当事方的外部触发动作推动下有序的自动履行,合约执行的最后目标就是修改股权登记簿合约中簿记的股权状态信息,进而实现增发股权或转让股权的交易目的。

如果股东协议中约定有“优先权”、“随售权”、“拖售权”、“反稀释”等特殊股东权益,则相关权利人可在股权交易的行权期间调用管理人合约的相关接口行权,管理人合约则会自动按股东协议合约中定义的算法和流程变更投资协议合约的交易相对方(优先权)、添加股权赠与交易(反稀释)或增加相同出让价格的交易(随售权)等操作,从而实现股东协议中约定的各种商业安排。

投资协议合约规定的股权交易实质性要素(标的股权、买方、数量、价格、交割截止日等)由结构化数据对象——“交易订单”来具体定义,关于合同当事方构成、签约截止日、交割截止日等程序性要素则由可复用、可继承的智能合约组件——“签字页”来定义。

3.4.1.交易订单

交易订单定义了在股权登记簿中发行新股或变更已有股权所需要的全部信息,而且还特意定义了一个bytes32的哈希时间锁,供交易双方链下或跨链支付股权对价时使用。

交易订单的数据结构

Code:
struct Head {
    uint8 typeOfDeal;
    uint16 seqOfDeal;
    uint16 preSeq;
    uint16 classOfShare;
    uint32 seqOfShare;
    uint40 seller;
    uint32 priceOfPaid;
    uint32 priceOfPar;
    uint48 closingDeadline;
    uint16 votingWeight;
}

struct Body {
    uint40 buyer;
    uint40 groupOfBuyer;
    uint64 paid;
    uint64 par;
    uint8 state;
    uint16 para;
    uint16 argu;
    bool flag;
}

struct Deal {
    Head head;
    Body body;
    bytes32 hashLock;
}

按股权交易的买方及标的股权的性质差异,交易订单被分为增资、对外转股、内部转股3种基本类别。这3种基本交易订单类别的排列组合,进一步构成了7种投资协议类别。
股东协议中,可针对上述7种不同的投资协议类别设定不同的表决规则,从而满足投资人的否决权安排或其他特殊权益要求。

3.4.2.签字页

签字页是一个独立、可复用、可继承的组件类智能合约,定义了合同当事方、签名栏、签约截止日、交割截止日几项关键的履约要素。
投资协议合约定义了初始签字页和补充签字页两个签字页。初始签字页供合同当事方在订立合同时签署,补充签字页将在权利人行使“优先权”、“随售权”、“拖售权”、“反稀释权”等特殊股东权益时由管理人合约自动生成。
当事方调用管理人合约的签约接口签署合同时,管理人合约会在签名栏中记录签约动作的区块编号及区块时间戳。签名栏预留了签名哈希属性,供当事方存证纸质签名的彩扫件使用。

签字页的数据结构
Code:
struct Signature {
    uint40 signer;
    uint48 sigDate;
    uint64 blocknumber;
    bool flag;
    uint16 para;
    uint16 arg;
    uint16 seq;
    uint16 attr;
    uint32 data;
}

struct Blank{
    EnumerableSet.UintSet seqOfDeals;
    Signature sig;
    bytes32 sigHash;
}

struct Page {
    // party => Blank
    mapping(uint256 => Blank) blanks;
    EnumerableSet.UintSet buyers;
    EnumerableSet.UintSet sellers;
}

paul.lee.attorney (OP)
Newbie
*
Offline Offline

Activity: 29
Merit: 0


View Profile
February 22, 2024, 04:28:46 AM
 #10

4.身份识别与权限控制

系统的平稳安全运行及各项功能实现,严格依赖于对写操作的权限控制和写操作指令的路由控制,也就是对可能改变各智能合约状态的调用指令(“写指令”),需要在处理前严格审核验证指令发出账户的身份和权限,同时严格控制每个智能合约自身发出的写指令所指向的目标合约地址及API接口,从“收、发”两个方向严格控制写指令的行进路径,从而确保整个系统的状态信息可按既定的商业法律逻辑有序更新。

系统中可能发生的写指令主要分为三大类:
    ① 系统配置类:由外部账户触发,不直接导致法律后果的合同起草、系统配置行为;
    ② 法律行为类:由外部账户触发,会产生直接法律后果的股权交易、公司治理行为;及
    ③ 算法控制类:被前两类写指令调用后,管理人合约根据系统预设算法有序发出的,可改变登记簿合约、股东协议合约、投资协议合约等其他智能合约状态的写操作指令。
针对上述3类写指令,系统按照其不同的行为性质、影响范围,综合采用3种不同的身份识别方法。

4.1.合约层面的角色权限控制

系统配置类和算法控制类指令,并不涉及系统所簿记的法律权益处分,一般只在本公司的簿记系统内部起作用,属于系统配置、算法设计、运营维护等技术活动范畴,因此采用可继承、具有组件属性的访问控制合约在每个智能合约层面进行身份校验,以账户地址来识别指令发出者的身份。

访问控制合约是一个可复用、可继承、组件类智能合约,专门负责在智能合约层面定义角色分组及其校验算法。系统中的每一个智能合约均是继承了它的子合约,因此均可使用其定义的角色分组来校验控制写操作权限。

访问控制合约设定有“所有者”和“管理人”两个特别角色,以及一个角色组--“律师组”(律师组的管理员为“法务总监”),根据写指令发出者的账户地址来识别其角色身份。

角色组及角色库的数据结构
Code:
struct Role {
    address admin;
    mapping(address => bool) isMember;
}

struct Repo {
    address owner;
    uint8 state; // 0-pending; 1-initiated; 2-finalized
    mapping(bytes32 => Role) roles;
}

4.1.1.所有者

所有者在创设智能合约时由部署该合约的账户自由设定,具备自由创建角色组并任命角色组管理员的权力,在商业法律逻辑上映射“股东”身份,其权限设计体现了股东对合同、章程、决议等法律文件的提案权、内容审核权和决策权。

所有者可以将其角色转让给另一个账户,转让后会失去自身的“所有者”身份。

管理人”是唯一不受所有者影响的角色,从而确保其角色任命和控制权限的相对独立性,从制度维护和职责独立的角度上制衡“所有者”。

4.1.2.管理人

管理人在创设智能合约时由部署该合约的账户自由设定,具备特殊的系统配置权限,在商业法律逻辑上映射“公司秘书或会计师”身份,其权限设计体现了公司秘书和会计师相对独立于股东、高管的制度维护职权和独立责任承担的特点。

管理人可以将其角色转让给另一个账户,转让后会失去自身的“管理人”身份。

分项管理人合约的所有接口均设定为只有“管理人”才有调用权限,因此在这些合约部署完成后,会将总管理人合约地址设定为它们的“管理人”,从而将其写操作权限全部收归总管理人合约统一调用,进而排除任何其他外部账户或系统外合约干扰公司治理活动的可能,确保公司簿记系统可以安全其不受人力干扰的自动运行。

总管理人合约的“管理人”,具备如下特殊权限:
    ① 设定及变更各分项管理人合约及登记簿合约的合约地址注册;
    ② 设定或撤销各分项管理人合约和登记簿合约的“管理人”任命;
    ③ 向系统输入作为行权触发条件的链外数据(例如,营收、净利润等财务数据);及
    ④ 设定实缴出资的哈希锁,从而使得新股东在链下或跨链实缴出资时可自动获得公司的出资证明书。

因此,其权限特点非常接近于“公司秘书”或“总会计师”。

如果总管理人合约管理人将“零地址”设定为新任“管理人”,就相当于彻底放弃了人为干预公司簿记系统运行的可能性,将系统完全交由智能合约体系自动运行。

作为代价,这种自动运行的簿记系统将不能进行部分合约的模版升级,也不能再以链外数据作为特殊股东权利的触发条件了。

paul.lee.attorney (OP)
Newbie
*
Offline Offline

Activity: 29
Merit: 0


View Profile
April 01, 2024, 05:32:23 AM
 #11

4.1.3.律师组及法务总监

法务总监律师角色组的管理员,有权给任何账户地址赋予律师角色。

作为角色组成员的律师,可调用“辞职”接口辞去合同律师身份。

作为角色组管理员的法务总监,可调用“撤销角色组”接口一次性解除对所有合同律师的聘任。

对于股东协议投资协议这两类特殊的合约,只有具备“律师”角色的账户才能调用相关写操作接口去“起草”合同内容,如公司治理的各项行为规则、权益条款...股权交易的标的股权、价格、数量等交易要素,以及设定合同当事方、签约期限、交割截止日等合同履行要素。

因此,股东在创设股东协议投资协议合同后,需要以“所有者”身份任命“法务总监”(法务总监可再任命一名或多名律师),由法务总监或律师负责起草合同内容;起草完成后,经“所有者”确认合同内容无误再调用“合同定稿”接口,一次性撤销“律师”角色组,并将“所有者”身份转让给“零地址”,从而使得合同内容不能再做人为改动。

需要强调的是,如果没有将合约的“所有者”转让给“零地址”,则“所有者”可通过再次任命“法务总监”的方式继续修改合约内容。


4.2.公司内部的指令路由机制

登记簿合约的API通常会允许若干个分项管理人合约来调用,因此在单一合约层面依靠角色分组来控制写操作权限就会很不经济。所以,系统在总管理人合约中设置了两个地址注册表,专门解决算法控制类指令在公司内部簿记合约间的路由需求。

总管理人合约设置有两个特殊的地址注册表,分别用来记录“分项管理人合约”和“登记簿合约”两大类智能合约的地址信息。这两个注册表以正整数为检索键、以合约地址为映射值,可以很方便的检索并获取对应的合约地址。

总管理人合约的地址注册表
Code:
mapping(uint256 => address) private _books;
mapping(uint256 => address) private _keepers;

系统部署时,将各分项管理人合约登记簿合约的合约地址按其各自的编号录入注册表;系统运行时,相关写指令接口就会在处理写操作之前,自动调用总管理人合约的查询接口,查询并验证指令发出账户的地址是否与注册表中特定合约的地址相符,从而完成算法指令的身份校验。

比如,股权登记簿的股权转让接口,在交割股转交易时需要由投资协议簿记管理人合约来调用,在执行反稀释权益时又需要由特殊股东权益管理人合约来调用,因此其调用权限就不能通过访问控制合约中唯一的“管理人”角色来授权,而是通过查询总管理人合约的地址注册表来校验,只要指令发出账户的地址与任何一个分项管理人合约相符,即通过权限验证。

分项管理人身份校验函数
Code:
function isKeeper(address caller) external view returns (bool) { 
    uint256 len = 10;
    while (len > 0) {
        if (caller == _keepers[len]) return true;
        len--;
    }
    return false;
}
Pages: [1]
  Print  
 
Jump to:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.19 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!