# Nhà máy Onetappy

### Các Khái Niệm Chính

| Tên                                   | Loại                       | Mô tả                                                                                                                                    |
| ------------------------------------- | -------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
| `kho bạc`                             | `CommitRevealTreasury`     | Kho bạc được tạo và liên kết nội bộ bởi hợp đồng factory, dùng để quản lý tiền gửi, thu nhập của nền tảng và đối tác, cùng các quỹ khác. |
| `quản trị`                            | `địa chỉ`                  | Địa chỉ quản trị viên (tài khoản đã triển khai hợp đồng), có quyền cấu hình toàn cục và quyền khẩn cấp.                                  |
| `platformFeeBps`                      | `uint16`                   | Phí nền tảng theo điểm cơ bản (bps).                                                                                                     |
| `creatorAbsentPartnerDepositSlashBps` | `uint16`                   | Tỷ lệ phạt (bps) áp dụng lên tiền gửi của đối tác khi Người tạo vắng mặt.                                                                |
| `_isPartner`                          | `mapping(address => bool)` | Bản đồ danh sách trắng đối tác, đánh dấu liệu một địa chỉ có phải là đối tác đã đăng ký hay không.                                       |
| `BPS_DENOMINATOR`                     | `uint256`                  | Hằng mẫu số điểm cơ bản, cố định tại `10_000`.                                                                                           |

***

### Kiểm tra Đối tác (`isPartner`)

Kiểm tra liệu một địa chỉ cụ thể có phải là đối tác đã đăng ký hay không.

```solidity
function isPartner(address account) public view returns (bool)
```

**Tham số:**

| Tham số   | Loại      | Mô tả                |
| --------- | --------- | -------------------- |
| `account` | `địa chỉ` | Địa chỉ cần kiểm tra |

**Giá trị Trả về:**

* `true`: Địa chỉ là đối tác
* `false`: Địa chỉ không phải là đối tác

***

### Đặt Đối tác (`setPartner`)

Thêm hoặc xóa một đối tác. Chỉ có quản trị viên mới có thể gọi (`quản trị`).

```solidity
function setPartner(address partner, bool enabled) external onlyAdmin
```

**Tham số:**

| Tham số   | Loại      | Mô tả                                          |
| --------- | --------- | ---------------------------------------------- |
| `partner` | `địa chỉ` | Địa chỉ đối tác (không thể là địa chỉ 0)       |
| `enabled` | `bool`    | `true` để thêm đối tác, `false` để xóa đối tác |

**Sự kiện Phát ra:**

* `PartnerAdded` phát ra khi một đối tác được thêm
* `PartnerRemoved` phát ra khi một đối tác bị xóa

***

### Đặt Phí Nền tảng (`setPlatformFeeBps`)

Đặt tỷ lệ phí nền tảng theo điểm cơ bản (bps). Chỉ có quản trị viên mới có thể gọi.

```solidity
function setPlatformFeeBps(uint16 bps) external onlyAdmin
```

**Tham số:**

| Tham số | Loại     | Mô tả                            |
| ------- | -------- | -------------------------------- |
| `bps`   | `uint16` | Tỷ lệ phí nền tảng (0 \~ 10.000) |

***

### Đặt Tỷ lệ Phạt Khi Người Tạo Vắng Mặt (`setCreatorAbsentPartnerDepositSlashBps`)

Đặt tỷ lệ phạt áp dụng lên tiền gửi của đối tác khi Người tạo vắng mặt (bps). Chỉ có quản trị viên mới có thể gọi.

```solidity
function setCreatorAbsentPartnerDepositSlashBps(uint16 bps) external onlyAdmin
```

**Tham số:**

| Tham số | Loại     | Mô tả                    |
| ------- | -------- | ------------------------ |
| `bps`   | `uint16` | Tỷ lệ phạt (0 \~ 10.000) |

***

### Tạo Phiên (`createSession`)

Tạo một phiên Commit-Reveal mới bởi một đối tác. Hàm xác thực tỷ lệ phí và số dư tiền gửi của đối tác, và khóa tiền gửi tương ứng trong Kho bạc.

```solidity
function createSession(
    SessionConfig memory partialConfig
) external onlyPartner returns (address)
```

**Tham số:**

`partialConfig`:

```solidity
struct SessionConfig {
    address admin;                                // Địa chỉ quản trị viên
    address creator;                              // Người tạo phiên
    address treasury;                             // Địa chỉ hợp đồng kho bạc
    bytes32 sessionCommitment;                    // Cam kết băm của Người tạo
    address paymentToken;                         // Token thanh toán (address(0) cho ETH)
    uint256 ticketPrice;                          // Giá mỗi vé
    uint256 totalTickets;                         // Tổng số vé (cũng là độ dài của ticketToPlayer)
    uint16 partnerShareBps;                       // Phần doanh thu đối tác (BPS)
    uint16 platformFeeBps;                        // Tỷ lệ phí nền tảng (BPS)
    uint16 unsoldTicketsPartnerDepositSlashBps;   // Tỷ lệ phạt tiền gửi cho vé không bán được
    uint16 creatorAbsentPartnerDepositSlashBps;   // Tỷ lệ phạt tiền gửi nếu người tạo vắng mặt
    uint256 commitDurationSeconds;                // Thời lượng giai đoạn Commit
    uint256 revealDurationSeconds;                // Thời lượng giai đoạn Reveal
    uint256 unlockTimestamp;                      // Dấu thời gian bắt đầu phiên
}
```

Mô tả các trường được chọn:

| Trường                                | Loại      | Mô tả                                               |
| ------------------------------------- | --------- | --------------------------------------------------- |
| `sessionCommitment`                   | `bytes32` | Giá trị cam kết phiên (bắt buộc, không thể là 0)    |
| `paymentToken`                        | `địa chỉ` | Địa chỉ token thanh toán; `address(0)` chỉ ra ETH   |
| `ticketPrice`                         | `uint256` | Giá mỗi vé                                          |
| `totalTickets`                        | `uint256` | Tổng số vé                                          |
| `commitDurationSeconds`               | `uint256` | Thời lượng giai đoạn Commit (tính theo giây)        |
| `revealDurationSeconds`               | `uint256` | Thời lượng giai đoạn Reveal (tính theo giây)        |
| `unlockTimestamp`                     | `uint256` | Dấu thời gian mở khóa phiên                         |
| `partnerShareBps`                     | `uint16`  | Phần doanh thu của đối tác (bps)                    |
| `unsoldTicketsPartnerDepositSlashBps` | `uint16`  | Tỷ lệ phạt tiền gửi cho vé không bán được (bps)     |
| `creatorAbsentPartnerDepositSlashBps` | `uint16`  | Tỷ lệ phạt tiền gửi nếu đối tác không tiết lộ (bps) |

**Luật Xác thực:**

* `sessionCommitment` không được để trống
* `partnerShareBps + platformFeeBps ≤ 10.000`
* Tiền gửi khả dụng của Đối tác trong Kho bạc ≥ `ticketPrice * totalTickets`

**Giá trị Trả về:**

* Địa chỉ của `CommitRevealSession` hợp đồng

**Sự kiện Phát ra:**

* `SessionCreated`

***

### Mở Khóa Khẩn Cấp Tiền Gửi Đối Tác (`emergencyUnlockPartnerDeposit`)

Quản trị viên mở khóa khẩn cấp tiền gửi của đối tác trong một Phiên cụ thể. Chỉ có quản trị viên mới có thể gọi. Tiền gửi được mở khóa và chuyển cho địa chỉ đối tác đã tạo hợp đồng.

```solidity
function emergencyUnlockPartnerDeposit(
    address session,
    address partner
) external onlyAdmin
```

***

### Sự kiện

#### `SessionCreated`

```solidity
event SessionCreated(
    address indexed creator,
    address indexed session,
    SessionConfig config
);
```

Được kích hoạt khi một phiên Commit-Reveal mới được tạo thành công và đăng ký trong Kho bạc.

***

#### `PartnerAdded`

```solidity
event PartnerAdded(address partner);
```

Được kích hoạt khi một đối tác mới được thêm.

***

#### `PartnerRemoved`

```solidity
event PartnerRemoved(address partner);
```

Được kích hoạt khi một đối tác bị xóa.


---

# 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://onetappy.gitbook.io/docs/docs-vi/tai-lieu-onetappy/nha-may-onetappy.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.
