# DRS

Book entry = wallet balances

Settlement = smart contracts, atomic

Netting = not needed, RTGS

Custody = wallets

Corporate actions = smart contracts

***

<mark style="color:purple;">PROBLEM</mark>

<figure><img src="/files/fqoh3gPXq1D5JXKfgKK6" alt=""><figcaption></figcaption></figure>

* [FORM TA-2/A](https://www.sec.gov/Archives/edgar/data/1630490/000163049025000005/xslFTA2X01/primary_doc.xml)
* FIS Investor Services LLC /TA CIK#: [0001630490 (see all company filings)](https://www.sec.gov/cgi-bin/browse-edgar?action=getcompany\&CIK=0001630490\&owner=exclude\&count=40)

<mark style="color:purple;">SOLUTION</mark>

Bitstream blockchain book-entry. [TransferAgentModule\_V5.sol](https://arbiscan.io/address/0x0a5e03aaa760873c22c25f132ee642a2d4cc9865#code)

***

### TECHNICAL IMPLEMENTATION

* tokenized new issue = DTC book entry&#x20;
* wallets = DTC participant acc
* smart contracts = DTC settlement

<mark style="color:red;">**distributeDividends (0xbce049b7)**</mark>

Distributes dividends to the account if it has holdings. The amount of shares to distribute in the form of divideds are calculated as follows: Share dividends = (account's balance \* rate) / price This operation will mint or burn shares according to the rate provided. If rate > 0 it will mint shares If rate < 0 it will burn shares

accounts (address\[])\
date (uint256): The date of the request as a UNIX timestamp\
rate (int256): The rate for the given shareholder\
price (uint256): The NAV price per share

<mark style="color:red;">**distributeDividends (0xd2920e5f)**</mark>

Distributes full or proportional dividends to the account if it has holdings. The amount of shares to distribute in the form of divideds are calculated as follows: If the adjusted shares for the account are greather than zero, Share dividends = (adjusted shares \* rate) / price Otherwise, Share dividends = (account's balance \* rate) / price This operation will mint or burn shares according to the rate provided. If rate > 0 it will mint shares If rate < 0 it will burn shares

accounts (address\[])\
adjustedShares (uint256\[])\
date (uint256): The date of the request as a UNIX timestamp\
rate (int256): The rate for the given shareholder\
price (uint256): The NAV price per share

<mark style="color:red;">endOfDay (0x72cfff36)</mark>

Distributes dividends and settles existing requests prior to the specified date for the given account.

accounts (address\[])\
txIds (bytes32\[])\
date (uint256): The date of the request as a UNIX timestamp\
rate (int256): The rate\
price (uint256): The NAV price per share

<mark style="color:red;">**endOfDay (0xa4152129)**</mark>

Distributes full or partial dividends and settles existing requests prior to the specified date for the given account.

accounts (address\[])\
adjustedShares (uint256\[])\
txIds (bytes32\[])\
rate (int256): The rate\
price (uint256): The NAV price per share

<mark style="color:red;">**settleTransactions (0xfd059319)**</mark>

Settles existing requests prior to the specified date for the given account. This operation will mint or burn shares according to the request type.

accounts (address\[])\
txIds (bytes32\[])\
rate (int256): The rate\
price (uint256): The NAV price per share

<mark style="color:red;">**settleCXTransaction (0xda9d15b6)**</mark>

Settles the given cross-chain request prior to the specified date for the given account. This operation will mint or burn shares according to the request type.

account (address)&#x20;the address of the shareholders' account\
requestId (bytes32)&#x20;the id of the request to process\\

date (uint256)&#x20;the maximum date to process the request represented as a UNIX timestamp\\

price (uint256)&#x20;The NAV price per share

<mark style="color:red;">**settleCXTransactions (0x23b2a067)**</mark>

Settles all the account's request given as an array of id's prior to the specified date.

account (address)

&#x20;the address of the shareholders' account\
requestIds (bytes32\[])\
date (uint256)&#x20;the maximum date to finish processing request from represented as a UNIX timestamp\
price (uint256)&#x20;the NAV price per share

### USER / DATA FLOWS

<mark style="color:red;">INVESTOR BUYS SHARES</mark>

1. Investor submits purchase request via Transactional Module.
2. Transactional Module checks Authorization Module for investor whitelist status.
3. Transactional Module stores pending transaction.
4. Admin calls Transfer Agent Module with NAV price at end of day.
5. Transfer Agent Module reads pending transactions from Transactional Module.
6. Transfer Agent Module calculates shares = (cash amount × scale factor) / price.
7. Transfer Agent Module calls Fund Token to mint shares to investor.
8. Fund Token checks Authorization Module to verify recipient is authorized.
9. Fund Token mints shares to investor balance.
10. Transfer Agent Module clears transaction from Transactional Module.

<mark style="color:red;">DAILY DIVIDEND DISTRIBUTION</mark>

1. Admin calls Transfer Agent Module with rate and price.
2. Transfer Agent Module checks Authorization Module to verify caller is admin.
3. Transfer Agent Module reads investor balance from Fund Token.
4. Transfer Agent Module calculates dividend shares = (balance × rate) / price.
5. Transfer Agent Module calls Fund Token to mint dividend shares.
6. Fund Token updates investor balance.
7. Transfer Agent Module emits DividendDistributed event.

<mark style="color:red;">INVESTOR REDEEMS SHARES</mark>

1. Investor submits liquidation request via Transactional Module.
2. Transactional Module stores pending redemption.
3. Admin calls Transfer Agent Module at end of day.
4. Transfer Agent Module reads pending liquidation from Transactional Module.
5. Transfer Agent Module calls Fund Token to burn shares.
6. Fund Token reduces investor balance.
7. Transfer Agent Module clears transaction from Transactional Module.
8. Off chain system triggers USD wire to investor.

<mark style="color:red;">ACCOUNT RECOVERY (LOST KEYS)</mark>

1. Admin calls Transfer Agent Module recoverAccount function.
2. Transfer Agent Module checks Transactional Module for pending transactions.
3. Transfer Agent Module calls Fund Token to transfer full balance to new address.
4. Transfer Agent Module calls Authorization Module to deauthorize old address.
5. Authorization Module updates whitelist.

<mark style="color:red;">CROSS CHAIN TRANSFER OUT</mark>

1. Investor requests CXFER\_OUT via Transactional Module.
2. Admin calls Transfer Agent Module settleCXTransaction.
3. Transfer Agent Module burns shares from Fund Token.
4. Bridge system mints equivalent on destination chain.

<mark style="color:red;">CROSS CHAIN TRANSFER IN</mark>

1. Bridge system records CXFER\_IN in Transactional Module.
2. Admin calls Transfer Agent Module settleCXTransaction.
3. Transfer Agent Module mints shares on Fund Token.
4. Investor receives shares on this chain.

<figure><img src="/files/UZYbexGox8W8WOQzQRdX" alt="" width="563"><figcaption></figcaption></figure>

***

RESOURCES

<https://www.ici.org/viewpoints/view_18_interval_funds>

<https://www.ici.org/system/files/attachments/20_ppr_interval_funds.pdf>

<https://www.dtcc.com/itp-hub/dist/downloads/Impact_of_fails_Infographic_2020.pdf>


---

# 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://docs.xft.finance/bitnet/use-cases/drs.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.
