# 9. 财务记录

系统允许使用USDC作为价值载体，支付新股认购款或股转对价；同时，也允许系统中簿记的公司对外支付USDC，或者在调用外部智能合约时，携带ETH以支付特定法律行为的费用或对价。

为方便用户自动簿记这些价值收支活动的财务记录，系统在<mark style="color:blue;">**总管理人合约**</mark>、相关的<mark style="color:blue;">**分项管理人合约**</mark>以及<mark style="color:blue;">**收银台合约**</mark>中设置了事件日志，以便可以实时、自动检索、汇总这些价值支付活动的财务记录。

<details>

<summary>9.1 兑换费率</summary>

#### 1. USD/CBP兑换费率

系统通过<mark style="color:blue;">**燃料库合约**</mark>以 USD/CBP 的兑换费率向公众发售 CBP，该费率由平台所有者确定。目前，兑换费率为 2,816.15 USD/CBP。平台用户可实时检索该兑换费率。

#### 2. USDC

USDC锚定美元，每个USDC的价格为1美元。

</details>

<details>

<summary>9.2 CBP收支记录</summary>

作为ERC-20标准化代币，CBP的收支记录由<mark style="color:blue;">**注册中心合约**</mark>统一簿记，自动记录每一笔转账记录的<mark style="color:blue;">**支付方**</mark>**、**<mark style="color:blue;">**收款方**</mark>和<mark style="color:blue;">**支付金额**</mark>。用户可根据CBP的支付方、收款方角色进一步区分CBP支付的具体场景、支付理由。例如，当支付方为“<mark style="color:blue;">**零地址**</mark>”时，代表平台向收款方铸币；当支付方为<mark style="color:blue;">**燃料库合约**</mark>地址时，为充值购入CBP。

```solidity
// CBP支付行为的事件日志接口
event Transfer(address indexed from, address indexed to, uint256 value);
```

</details>

<details>

<summary>9.3 USDC收支记录</summary>

ComBoox 提供了以 USDC 进行股权交易结算的接口。<mark style="color:blue;">**收银台合约**</mark>持有、接收、转发、转让和分配与这些交易相关的USDC付款，并记录所有此类USDC支付活动。

#### 1. 公司的USDC收入&#x20;

对于股东实缴出资款、股权认购款这种支付给公司的USDC，<mark style="color:blue;">**收银台合约**</mark>只会通过事件日志记录支付原因，不会将这些USDC分配到USDC<mark style="color:blue;">**暂存账户**</mark>或<mark style="color:blue;">**保证金账户**</mark>。

```solidity
// USDC收入函数
function collectUsd(TransferAuth memory auth, bytes32 remark) external anyKeeper {
    _transferWithAuthorization(auth);
    emit ReceiveUsd(auth.from, auth.value, remark);
}
```

#### 2.   公司的USDC支付

除前述的USDC分配场景外，公司的任何其他 USDC支付也应按照<mark style="color:blue;">**股东协议合约**</mark>中规定的公司治理程流程，经过<mark style="color:blue;">**股东会决议**</mark>或<mark style="color:blue;">**董事会决议**</mark>的批准才能对外支付，实质上是股东会决议或董事会决议的执行过程。

被授权的执行者需要调用<mark style="color:blue;">**总管理人合约**</mark>的ExecAction或ExecActionOfGM函数，进一步调用<mark style="color:blue;">**收银台合约**</mark>的TransferUSD函数来执行相关支付行为。&#x20;

#### &#x20;3.  USDC存款记录

#### (1)  分配 USDC 函数 <a href="#ref195894762" id="ref195894762"></a>

由于USDC的价格等于每单位1.00美元，因此以 USDC 进行的支付不会产生余额或零钱，任何对价或退款将直接结算到相关用户的账户中。&#x20;

然而，如果公司向其成员分配任何 USDC，则相应金额将在名为“\_lockers”的私有映射中按每个成员的用户编号进行分配。此后，成员可以根据自己的意愿随时提取分配的款项。

```solidity
// _lockers 映射表及收银台合约的分配利润函数
mapping(uint => uint) private _lockers;
function distrProfits(uint amt, uint seqOfDR) external onlyKeeper returns(
    WaterfallsRepo.Drop[] memory mlist
){
    if (balanceOfComp() < amt) 
        revert Cashier_Overflow(bytes32("Cashier_InsufficientAmt"));
    RulesParser.DistrRule memory rule =
        _gk.getSHA().getRule(seqOfDR).DistrRuleParser();
    IRegisterOfMembers _rom = _gk.getROM();
    IRegisterOfShares _ros = _gk.getROS();
    WaterfallsRepo.Drop memory drop;
    if ( rule.typeOfDistr == uint8(RulesParser.TypeOfDistr.ProRata)) {
        (drop, mlist, ) = _rivers.proRataDistr(amt, _rom, _ros, false);
    } else if (rule.typeOfDistr == uint8(RulesParser.TypeOfDistr.IntFront)) {
        (drop, mlist, ) = _rivers.intFrontDistr(amt, _ros, rule);
    } else revert Cashier_WrongState(bytes32("Cashier_WrongTypeOfDistr"));
    emit DistrProfits(amt, seqOfDR, drop.seqOfDistr);
    _distrUsd(mlist, bytes32("DistrProfits"));
}

function _distrUsd(WaterfallsRepo.Drop[] memory mlist, bytes32 remark) private {
    uint len = mlist.length;
    while (len > 0) {
        WaterfallsRepo.Drop memory drop = mlist[len-1];
        _depositUsd(drop.member, drop.income + drop.principal, remark);
        len--;
    }
}

function _depositUsd(uint payee, uint amt, bytes32 remark) private {
    if (payee == 0) {
        revert Cashier_WrongParty(bytes32("Cashier_ZeroPayee"));
    }
    emit DepositUsd(amt, payee, remark);
    _lockers[payee] += amt;
    _lockers[0] += amt;
}
```

#### (2)	取出 USDC 函数

存入用户存款账户的 USDC，仅能由该用户通过调用收银台合约的提取 USDC 函数来提取，任何其他账户均不得挪用或支取。

```solidity
// 取出USDC函数
function pickupUsd() external {
uint caller = _msgSender(msg.sender, 18000);
uint value = _lockers[caller];

if (value > 0) {
_lockers[caller] = 0;
_lockers[0] -= value;
emit PickupUsd(msg.sender, caller, value);

            if (!_gk.getBank().transfer(msg.sender, value)) 
                revert Cashier_TransferFailed(bytes32("Cashier_TransferFailed"));
        } else revert Cashier_Overflow(bytes32("Cashier_NoBalance"));
}
```

#### 4.    USDC保证金

#### (1)    存入USDC保证金&#x20;

系统允许经过验证的投资者在<mark style="color:blue;">**挂牌交易登记簿**</mark>的智能合约中以定价买单、市价买单、定价卖单、市价卖单、定价发行单和市价发行单六种订单挂牌交易标的公司的股份。挂牌定价买单时，系统需要将买方随单支付的USDC存入买方的保证金账户。

在存入保证金时，系统将调用<mark style="color:blue;">**收银台合约**</mark>的<mark style="color:blue;">**托管 USDC 函数**</mark>，并将相关金额存入一个名为 “\_coffers” 的私有映射中。这样，既可以甄别不同用户，又可以防止用户本人或任何其他用户取出保证金。

```solidity
// 收银台合约的美元托管函数
mapping(address => uint) private _coffers;
function _transferWithAuthorization(TransferAuth memory auth) private {
    _usd().transferWithAuthorization(
    auth.from,
    address(this),
    auth.value,
    auth.validAfter,
    auth.validBefore,
    auth.nonce,
    auth.v,
    auth.r,
    auth.s
);
}
function custodyUsd(TransferAuth memory auth, bytes32 remark) external anyKeeper {
    _transferWithAuthorization(auth);
    _coffers[auth.from] += auth.value;
    _coffers[address(0)] += auth.value;
    emit CustodyUsd(auth.from, auth.value, remark);
}
```

#### &#x20;(2)   **释放USDC保证金**

挂牌卖单或发行单时，系统会率先与已挂牌的现有买单进行交易撮合，成交后，随买单锁定的保证金将作为对价释放至卖方的暂存账户，或作为出资释放至公司。

释放保证金时，会调用<mark style="color:blue;">**收银台合约**</mark>的**释放USDC函数**，通过事件日志自动记录付款人、收款人、金额和付款原因。与<mark style="color:blue;">**暂存款**</mark>相似，也是通过Bytes32定长字符数组以ASCII编码保存款项用途的摘要说明。

```solidity
// 释放美元函数
function releaseUsd(address from, address to, uint amt, bytes32 remark) external anyKeeper {
        if(_coffers[from] < amt) 
            revert Cashier_Overflow("Cashier_InsufficientAmt");
        _coffers[from] -= amt;
        _coffers[address(0)] -= amt;
        emit ReleaseUsd(from, to, amt, remark);
        if (!_gk.getBank().transfer(to, amt)) 
            revert Cashier_TransferFailed(bytes32("Cashier_TransferFailed"));
}
```

#### &#x20;**(3)    USDC保证金用途说明**&#x20;

下表总结了存入或释放USDC保证金的原因及其ASCII编码，请见下表：

> USDC保证金用途说明

<table><thead><tr><th width="167.5999755859375" valign="top">情形</th><th width="213.4000244140625" valign="top">摘要</th><th valign="top">ASCII代码</th></tr></thead><tbody><tr><td valign="top">存入买单保证金</td><td valign="top">CustodyValueOfBid</td><td valign="top">0x437573746f647956616c75654f66426964000000000000000000000000000000</td></tr><tr><td valign="top">释放保证金给公司</td><td valign="top">CloseInitOfferAgainstBid</td><td valign="top">0x436c6f7365496e69744f66666572416761696e73744269640000000000000000</td></tr><tr><td valign="top">释放保证金给卖方</td><td valign="top">CloseOfferAgainstBid</td><td valign="top">0x436c6f73654f66666572416761696e7374426964000000000000000000000000</td></tr><tr><td valign="top">返还买单保证金</td><td valign="top">RefundValueOfBidOrder</td><td valign="top">0x526566756e6456616c75654f664269644f726465720000000000000000000000</td></tr></tbody></table>

</details>

## 相关源代码

[**RegCenter**](https://github.com/paul-lee-attorney/comboox/blob/master/contracts/center/RegCenter.sol) **|** [**GeneralKeeper**](https://github.com/paul-lee-attorney/comboox/blob/master/contracts/comps/GeneralKeeper.sol) **|** [**Cashier**](https://github.com/paul-lee-attorney/comboox/blob/master/contracts/comps/books/cashier/Cashier.sol)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://comboox.gitbook.io/whitepaper-cn/xi-tong-zong-shu/9.-cai-wu-ji-lu.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
