# TECHNICAL

Transfer agents *record changes of ownership*, maintain the issuer's security holder records, cancel and issue certificates, and distribute dividends.

<mark style="color:purple;">FUND OPERATIONS</mark>

adjustBalance

distributeDividends

[endOfDay](/bitnet/use-cases/drs/technical.md)

settleTransactions

settleCXTransactions

<mark style="color:purple;">TRANSACTION OPERATIONS</mark>

ADJUSTMENT\
AIP\
DIVIDEND\
DIVIDEND REINVESTMENT\
CASH\_LIQUIDATION\
SHARE\_LIQUIDATION\
CASH\_PURCHASE\
SHARE\_PURCHASE\
FULL\_LIQUIDATION\
SHARE\_TRANSFER\
CXFER\_OUT\
CXFER\_IN

DATA TYPES

```solidity
enum TransactionType {
    INVALID,
    ADJUSTMENT,
    AIP,
    DIVIDEND,
    DIVIDEND_REINVESTMENT,
    CASH_LIQUIDATION,
    SHARE_LIQUIDATION,
    CASH_PURCHASE,
    SHARE_PURCHASE,
    FULL_LIQUIDATION,
    SHARE_TRANSFER,
    CXFER_OUT,
    CXFER_IN
}
```

***

RESOURCES

TransactionIfaces.sol

{% code expandable="true" %}

```solidity
// SPDX-License-Identifier: Business Source License 1.1
pragma solidity 0.8.18;

import {IAuthorization} from "./IAuthorization.sol";

interface ITransactionStorage {
    enum TransactionType {
        INVALID,
        ADJUSTMENT,
        AIP,
        DIVIDEND,
        DIVIDEND_REINVESTMENT,
        CASH_LIQUIDATION,
        SHARE_LIQUIDATION,
        CASH_PURCHASE,
        SHARE_PURCHASE,
        FULL_LIQUIDATION,
        SHARE_TRANSFER,
        CXFER_OUT,
        CXFER_IN
    }

    struct TransactionDetail {
        TransactionType txType;
        uint256 date;
        uint256 amount;
        bool selfService;
    }

    struct ShareholderTransaction {
        bytes32 txId;
        TransactionDetail txDetail;
    }

    function clearTransactionStorage(
        address account,
        bytes32 requestId
    ) external returns (bool);

    function unlistFromAccountsWithPendingTransactions(
        address account
    ) external;

    function getAccountTransactions(
        address account
    ) external view returns (bytes32[] memory);

    function getTransactionDetail(
        bytes32 requestId
    ) external view returns (uint8, uint256, uint256, bool);

    function getAccountsWithTransactions(
        uint256 pageSize
    ) external view returns (address[] memory accounts);

    function getAccountsWithTransactionsCount() external view returns (uint256);

    function hasTransactions(address account) external view returns (bool);

    function isFromAccount(
        address account,
        bytes32 requestId
    ) external view returns (bool);
}

// Extended interface introduced for the new Share Transfer functionality,
// it was added in TransactionalModule_V3.sol
interface IExtendedTransactionDetail is ITransactionStorage {
    struct ExtendedTransactionDetail {
        TransactionType txType;
        uint256 date;
        uint256 amount;
        bool selfService;
        address source;
        address destination;
    }

    function getExtendedTransactionDetail(
        bytes32 requestId
    ) external view returns (uint8, address, address, uint256, uint256, bool);
}

interface IShareholderTransaction {
    function requestCashPurchase(
        address account,
        uint256 date,
        uint256 amount
    ) external;

    function requestCashLiquidation(
        address account,
        uint256 date,
        uint256 amount
    ) external;

    function requestFullLiquidation(address account, uint256 date) external;
}

interface IShareholderTransferTransaction {
    function requestShareTransfer(
        address account,
        address destination,
        uint256 date,
        uint256 amount
    ) external;
}

interface IShareholderSelfServiceTransaction {
    function requestSelfServiceCashPurchase(uint256 amount) external;

    function requestSelfServiceCashLiquidation(uint256 amount) external;

    function requestSelfServiceFullLiquidation() external;

    function enableSelfService() external;

    function disableSelfService() external;

    function isSelfServiceEnabled() external view returns (bool);
}

interface IShareholderSelfServiceTransferTransaction {
    function requestSelfServiceShareTransfer(
        uint256 amount,
        address destination
    ) external;
}

interface ITransferAgentTransaction {
    function setupAIP(address account, uint256 date, uint256 amount) external;
}

interface ICancellableSelfServiceTransaction {
    function cancelSelfServiceRequest(
        bytes32 requestId,
        string memory memo
    ) external;
}

interface ICancellableTransaction {
    function cancelRequest(
        address account,
        bytes32 requestId,
        string calldata memo
    ) external;
}

```

{% endcode %}


---

# 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/technical.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.
