---
title: "Chính sách"
description: "Thiết lập các rào chắn có thể lập trình để tự động cho phép, chặn hoặc chuyển các hành động nhạy cảm qua quy trình phê duyệt thông thường trong workspace của bạn."
url: https://docs.fystack.io/vi/product/policies
last_updated: 2026-11-13
---

> ## Documentation index
> Fetch the complete documentation index at: https://docs.fystack.io/llms.txt
> Use it to discover all available pages before exploring further.

# Chính sách

Thiết lập các rào chắn có thể lập trình để tự động cho phép, chặn hoặc chuyển các hành động nhạy cảm qua quy trình phê duyệt thông thường trong workspace của bạn. Chính sách đánh giá mọi lệnh rút tiền và lời gọi smart contract dựa trên các quy tắc bạn định nghĩa, nhờ đó hoạt động rủi ro bị chặn lại trước khi chạm tới blockchain.

## Tổng quan

Một **chính sách** là tập hợp các quy tắc tự động chạy mỗi khi có người khởi tạo một hành động được bảo vệ, chẳng hạn như yêu cầu rút tiền hoặc gọi smart contract. Mỗi quy tắc mô tả một điều kiện (ví dụ: "giá trị rút tiền trên $10,000 tới một địa chỉ không nằm trong whitelist") và một hiệu lực:

- **Deny**: chặn hoàn toàn hành động
- **Allow**: cho phép hành động bỏ qua hàng đợi phê duyệt và được thực hiện ngay

Chính sách đóng vai trò như một lớp phòng thủ luôn hoạt động, bổ sung cho việc phê duyệt của người ký. Thay vì trông chờ mọi người phê duyệt đều nhớ các quy tắc quản lý ngân quỹ, bạn mã hóa các quy tắc đó một lần và để Fystack áp dụng chúng cho mọi giao dịch.

_Image: Danh sách chính sách_

## Cách chính sách được đánh giá

Khi một hành động được bảo vệ diễn ra, Fystack kiểm tra nó với mọi chính sách đang hoạt động áp dụng cho ví liên quan và sử dụng mô hình quyết định an toàn cho lưu ký:

1. **Deny luôn thắng**: nếu bất kỳ quy tắc nào khớp với hiệu lực **Deny**, hành động sẽ bị chặn, ngay cả khi một quy tắc khác cho phép.
2. **Allow bỏ qua phê duyệt**: nếu một quy tắc khớp với hiệu lực **Allow** và không có quy tắc nào chặn, hành động sẽ bỏ qua hàng đợi phê duyệt và được thực hiện.
3. **Không khớp**: nếu không có quy tắc nào khớp, hành động tiếp tục đi qua luồng phê duyệt thông thường.

> **Note:** Việc đánh giá chính sách theo nguyên tắc **fail-closed**. Nếu vì bất kỳ lý do gì mà một chính sách không thể được đánh giá, hành động sẽ bị từ chối thay vì được cho qua. Điều này đảm bảo một cấu hình sai hoặc sự cố hệ thống không bao giờ có thể âm thầm làm suy yếu các biện pháp kiểm soát của bạn.

## Hành động kích hoạt

Mỗi quy tắc áp dụng cho một hành động kích hoạt, tức là loại thao tác mà quy tắc bảo vệ:

| Trigger | Bảo vệ |
| --- | --- |
| Withdrawal | Được đánh giá khi có yêu cầu rút tiền. Quy tắc có thể tham chiếu số tiền, giá trị USD, tài sản, địa chỉ đích, trạng thái whitelist, tuổi địa chỉ và hoạt động gần đây của ví, workspace và mạng lưới. |
| Contract Call | Được đánh giá khi một phương thức smart contract được gọi. Quy tắc có thể tham chiếu mạng lưới, địa chỉ hợp đồng, method selector, tên phương thức, giá trị native, gas limit và các tham số lời gọi đã được giải mã. |
| Web3 Transfer | Được đánh giá khi một giao dịch chuyển coin native hoặc ERC-20 được gửi qua Web3 raw-transaction API. Quy tắc sử dụng cùng các trường của rút tiền (số tiền, giá trị USD, tài sản, đích đến, mục sổ địa chỉ, ví nội bộ), nhờ đó một điều kiện có ý nghĩa như nhau trên cả hai trigger. Giao dịch chuyển ERC-20 cũng được đánh giá như Contract Call. |
| Web3 Message Signing | Được đánh giá khi một ví được yêu cầu ký thông điệp (`personal_sign`, `eth_sign`, `eth_signTypedData_v4`). Quy tắc có thể phát hiện token permit (EIP-2612, DAI, Permit2), spender, token, số tiền và thời hạn của chúng. Chỉ hỗ trợ Deny: một thông điệp đã ký luôn cần phê duyệt. |

## Cách tạo chính sách

### Bước 1: Mở trang Policies

Trên thanh bên trái, mở **Policies**, sau đó nhấp **Create Policy**.

### Bước 2: Đặt tên chính sách và chọn nhóm phê duyệt

Đặt cho chính sách một **Name** rõ ràng mô tả những gì nó bảo vệ (ví dụ: "Large withdrawal guard"). Sau đó chọn [**Nhóm phê duyệt**](https://docs.fystack.io/product/approval-group.md) sẽ xem xét các thay đổi đối với chính sách này.

Mọi chính sách đều gắn với một nhóm phê duyệt. Điều này có nghĩa là một chính sách không thể được tạo hoặc chỉnh sửa một cách âm thầm, mọi thay đổi đều phải được xem xét và phê duyệt, giống như một lệnh rút tiền.

_Image: Biểu mẫu tạo chính sách_

> **Note:** Nhóm phê duyệt được chọn sẵn theo mặc định của workspace. Bạn có thể đổi sang bất kỳ nhóm nào có các thành viên chịu trách nhiệm xem xét quy tắc của chính sách này.

### Bước 3: Áp dụng cho các ví cụ thể (tùy chọn)

Theo mặc định, chính sách áp dụng cho **tất cả các ví** trong workspace. Để giới hạn phạm vi cho một nhóm ví, hãy chọn một hoặc nhiều ví trong trường **Wallets**. Các quy tắc của chính sách sẽ chỉ được đánh giá cho các hành động trên những ví đó.

_Image: Bộ chọn ví_

### Bước 4: Thêm quy tắc

Thêm một hoặc nhiều quy tắc vào chính sách. Với mỗi quy tắc, chọn **Trigger** (Withdrawal, Contract Call, Web3 Transfer hoặc Web3 Message Signing), xây dựng **Condition** và chọn **Effect** (Allow hoặc Deny).

Trình xây dựng điều kiện hiển thị các trường có sẵn cho trigger đã chọn, nhờ đó bạn có thể tạo biểu thức mà không cần ghi nhớ tên trường. Để không phải viết quy tắc từ đầu, hãy bắt đầu từ một trong các [Mẫu chính sách](#policy-templates) bên dưới.

_Image: Biểu mẫu thêm quy tắc_

Chính sách cũng có thể được lập trình bằng trình xây dựng JSON, hữu ích cho người dùng nâng cao muốn sao chép/dán quy tắc hoặc dùng logic phức tạp hơn mức giao diện hỗ trợ.

_Image: Trình xây dựng JSON cho chính sách_

### Bước 5: Gửi để phê duyệt

Nhấp **Create**. Vì mọi chính sách đều phải qua phê duyệt, chính sách mới chưa có hiệu lực ngay, mà được gửi tới nhóm phê duyệt của nó dưới dạng yêu cầu **Pending Approval**, cùng với tất cả các quy tắc.

_Image: Yêu cầu phê duyệt chính sách_

### Bước 6: Phê duyệt chính sách

Một thành viên của nhóm phê duyệt được chỉ định mở yêu cầu đang chờ, xem xét chính sách được đề xuất cùng các quy tắc của nó và phê duyệt. Chỉ khi đó chính sách mới chuyển sang **Active** và bắt đầu bảo vệ giao dịch.

_Image: Hộp thoại phê duyệt chính sách_

> **Note:** Luồng phê duyệt tương tự cũng áp dụng cho các thay đổi chính sách và quy tắc sau này: chỉnh sửa quy tắc, thêm quy tắc hoặc xóa chính sách đều tạo ra một yêu cầu phê duyệt mới. Không có gì có hiệu lực cho đến khi nhóm phê duyệt đồng ý.

## Mẫu chính sách

Hãy bắt đầu từ một mẫu thay vì một chính sách trống. Mỗi mẫu dưới đây là một chính sách hoàn chỉnh cho một cấu hình ví phổ biến: những gì nó bảo vệ, các quy tắc được diễn giải bằng ngôn ngữ thông thường, và JSON bạn có thể dán thẳng vào trình chỉnh sửa chính sách.

> **Note:** Các con số trong mỗi mẫu là điểm khởi đầu, không phải khuyến nghị cho khối lượng giao dịch của bạn. Một mặc định tốt là đặt mỗi giới hạn Deny ở khoảng 2 đến 3 lần ngày bận rộn nhất bình thường của bạn, rồi điều chỉnh sau một tuần lưu lượng thực tế.

### Sử dụng mẫu

1. Vào **Policies**, nhấp **Create Policy** và chuyển trình chỉnh sửa sang tab **JSON**.
2. Dán **Policy JSON** của mẫu.
3. Chuyển lại sang **Form**. Chọn **Approval Group** và các **Wallets** mà chính sách cần áp dụng. Các mẫu cố ý để trống cả hai, và danh sách ví trống nghĩa là mọi ví trong workspace.
4. Mở từng quy tắc và thay thế mọi placeholder trong dấu ngoặc nhọn, chẳng hạn `<payout_api_key_id>`. Các quy tắc tham chiếu đến thành viên, khóa API, ví hoặc mục sổ địa chỉ sẽ hiển thị bộ chọn trong trình xây dựng, nhờ đó bạn có thể chọn theo tên thay vì phải tra cứu ID.
5. Điều chỉnh các giới hạn theo khối lượng của bạn, sau đó nhấp **Create** và đưa chính sách đi phê duyệt.

Bạn cũng có thể gửi cùng JSON đó tới [Policies API](https://docs.fystack.io/policies.md#create-a-policy).

### Chọn mẫu

| Mẫu | Áp dụng cho | Tự động phê duyệt | Giới hạn chính |
| --- | --- | --- | --- |
| Kho dự trữ | Ví lưu ký và ví ngân quỹ | Không có | Chỉ sổ địa chỉ, thời gian chờ 24 giờ, 250,000 USD mỗi ngày cho mỗi ví |
| Chi trả từ ví nóng | Ví vận hành mà đội ngũ của bạn sử dụng | Các khoản chi nhỏ tới địa chỉ tin cậy | 2,000 USD tới địa chỉ lạ, 50,000 USD mỗi ngày, 60 lệnh mỗi giờ |
| Bot chi trả qua API | Các ví mà một khóa API tự động dùng để chi trả | Các khoản chi tối đa 500 USD từ một khóa | Chỉ stablecoin, 2,000 USD mỗi khoản chi, 20,000 USD mỗi ngày cho khóa |
| Gom tiền nạp | Ví nạp tiền của khách hàng | Các lệnh sweep về ví ngân quỹ của bạn | Tiền chỉ có thể chuyển về ví ngân quỹ |
| Vận hành DeFi | Các ví sử dụng Web3 và dApp | Không có | Chỉ các hợp đồng được phê duyệt, không token lạ, không chữ ký rủi ro |
| Chốt chặn toàn workspace | Tất cả các ví | Không có | 500,000 USD mỗi ngày trên toàn workspace, đóng băng các lệnh rút lớn vào cuối tuần |

> **Note:** Các chính sách được xếp chồng. Áp dụng **Chốt chặn toàn workspace** cho tất cả các ví, sau đó thêm một mẫu cho mỗi nhóm ví. Vì Deny luôn thắng, chốt chặn này cũng giới hạn mọi thứ mà một chính sách hẹp hơn tự động phê duyệt.

### Kho dự trữ

**Dùng cho**: các ví giữ tiền dự trữ và chỉ chuyển tiền vài lần mỗi tuần. Không có gì được tự động phê duyệt, nên mọi giao dịch chuyển vẫn đến tay người phê duyệt, và các quy tắc chặn những giao dịch mà người phê duyệt không bao giờ nên được yêu cầu ký.

**Ví**: chọn các ví lưu ký và ví ngân quỹ của bạn.

| Hiệu lực | Quy tắc | Lý do |
| --- | --- | --- |
| **Deny** | Chặn rút tiền tới bất kỳ địa chỉ bên ngoài nào không có trong sổ địa chỉ. | Một lỗi gõ nhầm hoặc địa chỉ bị tráo trong clipboard không bao giờ có thể được phê duyệt do nhầm lẫn. |
| **Deny** | Chặn rút tiền tới địa chỉ được thêm vào sổ địa chỉ chưa đầy 24 giờ. | Người có quyền chỉnh sửa sổ địa chỉ không thể thêm một địa chỉ rồi rút cạn tiền tới đó ngay trong ngày. |
| **Deny** | Chặn lệnh rút tiền khiến ví vượt quá 250,000 USD trong 24 giờ, tính cả các lệnh rút đang chờ. | Hạn chế thiệt hại nếu người phê duyệt bị xâm phạm hoặc bị lừa. |
| **Deny** | Áp dụng quy tắc sổ địa chỉ cho các giao dịch chuyển native và ERC-20 được gửi qua Web3 API. | Đóng con đường vòng qua các quy tắc rút tiền. |

```json
{
  "name": "Treasury vault guard",
  "description": "Hard limits for custody and treasury wallets",
  "approval_group_id": "",
  "wallet_ids": [],
  "rules": [
    {
      "trigger_action": "withdrawal.create",
      "condition": "!withdrawal.destination_is_internal && !withdrawal.is_whitelisted",
      "effect": "DENY",
      "description": "Only send to address book entries or workspace wallets"
    },
    {
      "trigger_action": "withdrawal.create",
      "condition": "withdrawal.is_whitelisted && withdrawal.address_age_sec < 86400",
      "effect": "DENY",
      "description": "New address book addresses wait 24 hours"
    },
    {
      "trigger_action": "withdrawal.create",
      "condition": "wallet.projected_outflow_24h > 250000",
      "effect": "DENY",
      "description": "Cap each wallet at 250000 USD per 24 hours"
    },
    {
      "trigger_action": "web3.transfer",
      "condition": "!withdrawal.destination_is_internal && !withdrawal.is_whitelisted",
      "effect": "DENY",
      "description": "Apply the address book rule to Web3 transfers"
    }
  ]
}
```

**Tinh chỉnh**

- Cần thời gian chờ nghiêm ngặt hơn? Đổi `86400` (24 giờ) thành `172800` (48 giờ).
- Để giữ tiền lưu ký bên trong workspace, chỉ có thể chuyển tới các ví nóng của chính bạn, hãy thêm một quy tắc Deny: `wallet.purpose == 'custody' && !withdrawal.destination_is_internal`.
- Để giới hạn một tài sản theo đơn vị của chính nó, hãy thêm `withdrawal.asset_symbol == 'BTC' && wallet.asset_projected_outflow_24h > 5`.

### Chi trả từ ví nóng

**Dùng cho**: các ví vận hành mà đội ngũ của bạn dùng để chi trả hằng ngày. Các khoản chi nhỏ, thường lệ tới người nhận đã biết sẽ bỏ qua phê duyệt, còn mọi thứ khác sẽ được xem xét hoặc bị chặn.

**Ví**: chọn các ví nóng hoặc ví thanh toán của bạn.

| Hiệu lực | Quy tắc | Lý do |
| --- | --- | --- |
| **Deny** | Chặn rút tiền trên 2,000 USD tới các địa chỉ không có trong sổ địa chỉ. | Các khoản lớn hơn phải được gửi tới một địa chỉ đã được thẩm định. |
| **Deny** | Chặn lệnh rút tiền khiến ví vượt quá 50,000 USD trong 24 giờ. | Giới hạn tình huống xấu nhất, bao gồm cả các khoản chi được tự động phê duyệt. |
| **Deny** | Chặn rút tiền khi ví đã gửi 60 lệnh trong giờ qua. | Phát hiện một script hoặc phiên bị xâm phạm đang gửi nhiều lệnh rút nhỏ. |
| **Allow** | Bỏ qua phê duyệt cho các lệnh rút tối đa 1,000 USD tới địa chỉ đã nằm trong sổ địa chỉ ít nhất 24 giờ. | Người phê duyệt không còn mất thời gian cho các khoản chi thường lệ. |

**Điều gì xảy ra với một lệnh rút tiền**

| Lệnh rút tiền | Kết quả |
| --- | --- |
| 500 USD tới một mục sổ địa chỉ được thêm vào tuần trước | Được tự động phê duyệt bởi quy tắc Allow |
| 500 USD tới một địa chỉ được thêm vào một giờ trước | Chuyển tới người phê duyệt, vì địa chỉ còn quá mới đối với quy tắc Allow |
| 1,500 USD tới một địa chỉ lạ | Chuyển tới người phê duyệt |
| 5,000 USD tới một địa chỉ lạ | Bị chặn |
| 800 USD tới một địa chỉ tin cậy khi ví đã gửi 49,500 USD trong ngày | Bị chặn, vì Deny luôn thắng Allow |

```json
{
  "name": "Hot wallet payouts",
  "description": "Auto approve routine payouts and cap the worst case",
  "approval_group_id": "",
  "wallet_ids": [],
  "rules": [
    {
      "trigger_action": "withdrawal.create",
      "condition": "!withdrawal.destination_is_internal && !withdrawal.is_whitelisted && withdrawal.value_usd > 2000",
      "effect": "DENY",
      "description": "Unknown recipients are limited to 2000 USD"
    },
    {
      "trigger_action": "withdrawal.create",
      "condition": "wallet.projected_outflow_24h > 50000",
      "effect": "DENY",
      "description": "Cap each wallet at 50000 USD per 24 hours"
    },
    {
      "trigger_action": "withdrawal.create",
      "condition": "wallet.withdrawal_count_1h > 60",
      "effect": "DENY",
      "description": "Stop bursts of more than 60 withdrawals per hour"
    },
    {
      "trigger_action": "withdrawal.create",
      "condition": "withdrawal.is_whitelisted && withdrawal.address_age_sec >= 86400 && withdrawal.value_usd <= 1000",
      "effect": "ALLOW",
      "description": "Auto approve small payouts to trusted addresses"
    }
  ]
}
```

**Tinh chỉnh**

- Trước tiên hãy tăng hoặc giảm hạn mức tự động phê duyệt (`1000`). Giữ nó thấp hơn nhiều so với giới hạn hằng ngày của mỗi ví.
- Để chỉ tự động phê duyệt cho một số người nhận, chẳng hạn tài khoản sàn giao dịch của bạn, hãy thay `withdrawal.is_whitelisted` trong quy tắc Allow bằng điều kiện **Destination · Address book entry** là bất kỳ mục nào bạn tin cậy.
- Nếu đội ngũ của bạn làm việc theo giờ cố định, hãy thêm công thức giờ hành chính từ phần Công thức quy tắc bên dưới.

### Bot chi trả qua API

**Dùng cho**: một dịch vụ backend gửi các khoản chi cho khách hàng qua khóa API. Các khoản chi nhỏ được gửi đi mà không cần chờ người phê duyệt, các khoản trung bình sẽ được xem xét, và khóa có ngân sách cứng hằng ngày.

**Ví**: chọn các ví mà dịch vụ chi trả dùng để gửi tiền.

| Hiệu lực | Quy tắc | Lý do |
| --- | --- | --- |
| **Deny** | Chặn khóa chi trả gửi bất kỳ thứ gì ngoài USDT và USDC. | Khóa bị lộ không thể di chuyển các tài sản khác của bạn. |
| **Deny** | Chặn mọi khoản chi đơn lẻ từ khóa vượt quá 2,000 USD. | Các khoản chi lớn hơn phải do một người tạo. |
| **Deny** | Chặn khóa khi tổng các khoản chi của nó vượt quá 20,000 USD trong 24 giờ, trên tất cả các ví. | Ngân sách hằng ngày cho khóa, bất kể khóa dùng ví nào. |
| **Allow** | Bỏ qua phê duyệt cho các khoản chi tối đa 500 USD từ khóa. | Khách hàng nhận được các khoản chi nhỏ ngay lập tức. Các khoản chi từ 500 đến 2,000 USD sẽ được chuyển tới người phê duyệt. |

```json
{
  "name": "API payout bot",
  "description": "Budget and auto approval for the payout API key",
  "approval_group_id": "",
  "wallet_ids": [],
  "rules": [
    {
      "trigger_action": "withdrawal.create",
      "condition": "principal.api_key_id in ['<payout_api_key_id>'] && !(withdrawal.asset_symbol in ['USDT', 'USDC'])",
      "effect": "DENY",
      "description": "Payout key sends stablecoins only"
    },
    {
      "trigger_action": "withdrawal.create",
      "condition": "principal.api_key_id in ['<payout_api_key_id>'] && withdrawal.value_usd > 2000",
      "effect": "DENY",
      "description": "Payout key cannot send more than 2000 USD at once"
    },
    {
      "trigger_action": "withdrawal.create",
      "condition": "principal.api_key_id in ['<payout_api_key_id>'] && workspace.initiator_projected_outflow_24h > 20000",
      "effect": "DENY",
      "description": "Payout key is capped at 20000 USD per 24 hours"
    },
    {
      "trigger_action": "withdrawal.create",
      "condition": "principal.api_key_id in ['<payout_api_key_id>'] && withdrawal.value_usd <= 500",
      "effect": "ALLOW",
      "description": "Auto approve payouts up to 500 USD"
    }
  ]
}
```

**Tinh chỉnh**

- Thay `<payout_api_key_id>` trong mọi quy tắc, hoặc chọn khóa bằng bộ chọn **Initiator · API key**. Dùng cùng một khóa trong cả bốn quy tắc.
- Địa chỉ chi trả cho khách hàng thường không có trong sổ địa chỉ của bạn, vì vậy mẫu này không yêu cầu điều đó. Thay vào đó, rủi ro được kiểm soát bằng giới hạn cho mỗi khoản chi và giới hạn hằng ngày.
- Thêm các ký hiệu khác vào danh sách, chẳng hạn `'DAI'`, nếu bạn chi trả bằng các stablecoin khác.

### Gom tiền nạp

**Dùng cho**: các ví nạp tiền riêng cho từng khách hàng, nơi tiền chỉ được phép chuyển về ví ngân quỹ của bạn. Đích đến là cố định, vì vậy đây là luồng an toàn nhất để tự động hóa hoàn toàn.

**Ví**: chọn các ví nạp tiền của khách hàng, hoặc để trống danh sách để dựa vào việc kiểm tra mục đích ví.

| Hiệu lực | Quy tắc | Lý do |
| --- | --- | --- |
| **Deny** | Chặn rút tiền từ ví nạp tiền tới bất kỳ đâu ngoài ví ngân quỹ của bạn. | Tiền nạp không bao giờ có thể rời khỏi workspace trực tiếp. |
| **Allow** | Bỏ qua phê duyệt cho các giao dịch chuyển từ ví nạp tiền về ví ngân quỹ của bạn. | Các lệnh sweep chạy mà không cần chờ ai. |

```json
{
  "name": "Deposit sweep",
  "description": "Deposit wallets sweep to treasury only",
  "approval_group_id": "",
  "wallet_ids": [],
  "rules": [
    {
      "trigger_action": "withdrawal.create",
      "condition": "wallet.purpose == 'user' && !(withdrawal.destination_wallet_id in ['<treasury_wallet_id>'])",
      "effect": "DENY",
      "description": "Deposit wallets can only send to the treasury"
    },
    {
      "trigger_action": "withdrawal.create",
      "condition": "wallet.purpose == 'user' && withdrawal.destination_wallet_id in ['<treasury_wallet_id>']",
      "effect": "ALLOW",
      "description": "Auto approve sweeps to the treasury"
    }
  ]
}
```

**Tinh chỉnh**

- Thay `<treasury_wallet_id>`, hoặc chọn ví bằng bộ chọn **Destination · Workspace wallet**.
- Để cho phép nhiều hơn một đích sweep, hãy thêm ID của chúng vào cả hai danh sách.

### Vận hành DeFi

**Dùng cho**: các ví tương tác với dApp thông qua Web3 API. Mọi lời gọi vẫn được chuyển tới người phê duyệt, và các quy tắc sẽ chặn những lời gọi và chữ ký mà người phê duyệt thường không thể đánh giá được từ dữ liệu thô.

**Ví**: chọn các ví bạn kết nối với dApp.

| Hiệu lực | Quy tắc | Lý do |
| --- | --- | --- |
| **Deny** | Chặn lời gọi tới bất kỳ hợp đồng nào không có trong danh sách của bạn. | Một dApp lừa đảo không thể đưa lời gọi tới hợp đồng lạ đến trước mặt người phê duyệt. |
| **Deny** | Chặn việc cấp quyền token (`approve`, selector `0x095ea7b3`) trên bất kỳ hợp đồng nào ngoài danh sách token của bạn. | Allowance là cách phổ biến để rút cạn ví về sau. |
| **Deny** | Chặn chuyển các token không có trong danh mục tài sản của Fystack. | Token lạ không có giá trị USD, nên các giới hạn số tiền không thể áp dụng cho chúng. |
| **Deny** | Chặn việc ký token permit với số lượng không giới hạn. | Một permit đã ký cho phép spender di chuyển token về sau mà không cần thêm giao dịch nào từ bạn. |
| **Deny** | Chặn việc ký permit cho bất kỳ spender nào không có trong danh sách của bạn. | Lừa đảo permit thường yêu cầu bạn ký cho một spender của kẻ tấn công. |
| **Deny** | Chặn các yêu cầu `eth_sign`. | `eth_sign` có thể ký một giao dịch bị ẩn, và các dApp hiện đại không cần đến nó. |

```json
{
  "name": "DeFi operations guard",
  "description": "Approved contracts and safe signatures for dApp wallets",
  "approval_group_id": "",
  "wallet_ids": [],
  "rules": [
    {
      "trigger_action": "web3.contract_call",
      "condition": "!(resource.contract_address in ['<router_address>', '<vault_address>', '<token_address>'])",
      "effect": "DENY",
      "description": "Only call approved contracts"
    },
    {
      "trigger_action": "web3.contract_call",
      "condition": "resource.method_selector == '0x095ea7b3' && !(resource.contract_address in ['<token_address>'])",
      "effect": "DENY",
      "description": "Only approve allowances on known tokens"
    },
    {
      "trigger_action": "web3.transfer",
      "condition": "!withdrawal.asset_is_known",
      "effect": "DENY",
      "description": "Block transfers of unknown tokens"
    },
    {
      "trigger_action": "web3.sign_message",
      "condition": "resource.is_permit && resource.permit_amount_is_unlimited",
      "effect": "DENY",
      "description": "Block unlimited token permits"
    },
    {
      "trigger_action": "web3.sign_message",
      "condition": "resource.is_permit && !(resource.permit_spender in ['<trusted_spender_address>'])",
      "effect": "DENY",
      "description": "Block permits to untrusted spenders"
    },
    {
      "trigger_action": "web3.sign_message",
      "condition": "resource.method == 'eth_sign'",
      "effect": "DENY",
      "description": "Block raw eth_sign"
    }
  ]
}
```

**Tinh chỉnh**

- Địa chỉ hợp đồng và token phải viết thường.
- Thêm mọi hợp đồng mà chiến lược của bạn sử dụng, chẳng hạn router, vault và hợp đồng token, trước khi bật chính sách, nếu không các lời gọi hợp lệ sẽ bị chặn.
- Quy tắc ký thông điệp chỉ hỗ trợ Deny. Một chữ ký vượt qua các quy tắc này vẫn được chuyển tới người phê duyệt.

### Chốt chặn toàn workspace

**Dùng cho**: một lưới an toàn trên mọi ví. Nó phát hiện việc rút cạn tiền được phân tán qua nhiều ví, khóa hoặc thành viên, điều mà giới hạn của một ví đơn lẻ sẽ bỏ sót.

**Ví**: để trống danh sách để chính sách áp dụng cho tất cả các ví.

| Hiệu lực | Quy tắc | Lý do |
| --- | --- | --- |
| **Deny** | Chặn lệnh rút tiền khiến toàn bộ workspace vượt quá 500,000 USD trong 24 giờ. | Mức trần tuyệt đối, bất kể các chính sách khác cho phép gì. |
| **Deny** | Chặn rút tiền khi workspace đã gửi 300 lệnh trong giờ qua. | Phát hiện hành vi lạm dụng tự động được phân tán qua nhiều ví. |
| **Deny** | Chặn các lệnh rút trên 25,000 USD vào thứ Bảy và Chủ nhật (UTC). | Các giao dịch chuyển lớn phải chờ đến khi đội ngũ của bạn có mặt để theo dõi. |

```json
{
  "name": "Workspace backstop",
  "description": "Workspace wide ceilings for all wallets",
  "approval_group_id": "",
  "wallet_ids": [],
  "rules": [
    {
      "trigger_action": "withdrawal.create",
      "condition": "workspace.projected_outflow_24h > 500000",
      "effect": "DENY",
      "description": "Cap the workspace at 500000 USD per 24 hours"
    },
    {
      "trigger_action": "withdrawal.create",
      "condition": "workspace.withdrawal_count_1h > 300",
      "effect": "DENY",
      "description": "Stop bursts of more than 300 withdrawals per hour"
    },
    {
      "trigger_action": "withdrawal.create",
      "condition": "context.day_of_week in ['Saturday', 'Sunday'] && withdrawal.value_usd > 25000",
      "effect": "DENY",
      "description": "No withdrawals over 25000 USD on weekends"
    }
  ]
}
```

**Tinh chỉnh**

- Ngày và giờ được tính theo UTC.
- Đặt giới hạn workspace cao hơn tổng các ngày bận rộn nhất bình thường trên tất cả các ví, để chốt chặn chỉ kích hoạt khi có bất thường thực sự.

### Công thức quy tắc

Các quy tắc đơn lẻ bạn có thể thêm vào bất kỳ chính sách nào. Dán điều kiện vào tab **Expression** của một quy tắc, hoặc xây dựng nó trong **Fields**.

| Mục tiêu | Trigger | Hiệu lực | Điều kiện |
| --- | --- | --- | --- |
| Chặn một danh sách địa chỉ, chẳng hạn địa chỉ bị trừng phạt hoặc lừa đảo | Withdrawal | Deny | `` `withdrawal.address_book_id in ['<blocklist_entry_id>']` ``. Giữ các địa chỉ trong cùng một mục sổ địa chỉ, để khi cập nhật mục đó thì quy tắc cũng được cập nhật. |
| Chỉ owner và admin mới có thể gửi trên 50,000 USD | Withdrawal | Deny | `` `!(principal.role in ['owner', 'admin']) && withdrawal.value_usd > 50000` `` |
| Chỉ cho phép rút tiền lớn trong giờ hành chính (09:00 đến 18:00 UTC) | Withdrawal | Deny | `` `withdrawal.value_usd > 25000 && (context.hour < 9 \|\| context.hour >= 18)` ``. Có sử dụng dấu ngoặc, vì vậy hãy viết nó trong tab Expression. |
| Giới hạn một ví ở mức 5 BTC mỗi ngày | Withdrawal | Deny | `` `withdrawal.asset_symbol == 'BTC' && wallet.asset_projected_outflow_24h > 5` `` |
| Giới hạn một mạng lưới ở mức 100,000 USD mỗi ngày | Withdrawal | Deny | `` `withdrawal.network_code == '<network_code>' && workspace.network_projected_outflow_24h > 100000` `` |
| Tự động phê duyệt giao dịch chuyển giữa các ví của chính bạn | Withdrawal | Allow | `` `withdrawal.destination_is_internal && withdrawal.value_usd <= 10000` `` |
| Tự động phê duyệt nạp tiền vào các tài khoản sàn giao dịch tin cậy | Withdrawal | Allow | `` `withdrawal.address_book_id in ['<exchange_entry_id>'] && withdrawal.address_age_sec >= 172800 && withdrawal.value_usd <= 25000` `` |
| Ngăn công việc dồn ứ trong hàng đợi phê duyệt | Withdrawal | Deny | `` `wallet.pending_outflow > 100000` ``. Chặn các yêu cầu mới khi đã có 100,000 USD đang chờ. |
| Chặn các lời gọi hợp đồng tốn kém bất thường | Contract Call | Deny | `` `resource.gas_limit > 1000000` `` |

### Triển khai chính sách

Quy tắc Allow thay đổi việc ai phải xem xét một giao dịch, vì vậy hãy đưa chúng vào sau cùng.

1. **Tuần 1, chỉ quy tắc Deny**: tạo chính sách chỉ với các quy tắc Deny. Chưa có gì được tự động phê duyệt, và các quy tắc chỉ chặn những điều không bao giờ nên xảy ra.
2. **Xem xét hàng đợi phê duyệt**: tìm các lệnh rút tiền mà người phê duyệt lần nào cũng duyệt mà không thay đổi gì, chẳng hạn cùng người nhận, cùng tài sản và cùng khoảng số tiền.
3. **Thêm một quy tắc Allow hẹp**: viết một quy tắc Allow cho chính xác lưu lượng đó, với hạn mức thấp hơn mức bạn nghĩ mình cần.
4. **Nâng hạn mức từ từ**: chỉ mở rộng quy tắc Allow sau khi nó đã chạy ổn định một thời gian. Mỗi thay đổi đều phải qua phê duyệt và xuất hiện trong [Lịch sử thay đổi](#change-history) của chính sách.

> **Note:** Khi bạn thêm một quy tắc Allow, hãy kiểm tra rằng có một giới hạn Deny áp dụng cho cùng các ví, ví dụ giới hạn dòng tiền ra dự kiến theo ví hoặc theo khóa. Deny luôn thắng, nên giới hạn đó vẫn áp dụng cho các lệnh rút được tự động phê duyệt.

## Viết điều kiện quy tắc

Điều kiện là một biểu thức trả về true hoặc false. Khi biểu thức là true, hiệu lực của quy tắc sẽ được áp dụng. Kết hợp các trường bằng `and`, `or` và `not`, và so sánh giá trị bằng các toán tử như `>`, `>=`, `==` và `!=`.

_Image: Trình xây dựng điều kiện_

> **Note:** Bạn có thể xác thực một điều kiện trước khi lưu. Trình xây dựng kiểm tra biểu thức với các trường có sẵn của trigger và đánh dấu mọi lỗi, nhờ đó bạn không bao giờ gửi một quy tắc không thể chạy.

### Các trường điều kiện

Các trường có sẵn trong trình xây dựng phụ thuộc vào trigger của quy tắc. Hãy dùng các nhãn dưới đây khi quyết định trường nào phù hợp với một quy tắc.

#### Có sẵn trên mọi trigger

| Trường | Dùng cho |
| --- | --- |
| Initiator type | Hành động đến từ phiên web (`user`) hay từ khóa API (`api_key`). |
| Member | Quy tắc cho các thành viên workspace cụ thể. Chọn họ từ danh sách thành viên. |
| API key | Quy tắc cho các khóa API cụ thể, ví dụ một khóa chi trả tự động. Phiên web không có khóa API, vì vậy hãy kết hợp kiểm tra `is none of` với Initiator type. |
| User role | Quy tắc dựa trên vai trò trong workspace: owner, admin, signer, proposer hoặc viewer. |
| Hour | Kiểm soát theo thời điểm trong ngày, dùng giờ UTC từ 0 đến 23. |
| Day of week | Quy tắc theo giờ hành chính, cuối tuần hoặc chỉ ngày trong tuần. |
| Source wallet | Quy tắc cho các ví cụ thể trong cùng một chính sách. |
| Source wallet purpose | Quy tắc theo mục đích ví: general, custody, payment, user, one-time use, gas tank hoặc deployment. |
| Source wallet type | Kiểm soát khác nhau cho ví MPC và ví tiêu chuẩn. |
| User email (legacy) | Vẫn được đánh giá cho các quy tắc hiện có. Quy tắc mới dùng Member, vì email có thể thay đổi. |

#### Các trường rút tiền

| Trường | Dùng cho |
| --- | --- |
| Amount | Giới hạn theo đơn vị tài sản, chẳng hạn trên 10 ETH hoặc 1 BTC. |
| Value USD | Giới hạn theo đô la trên mọi tài sản. |
| Asset symbol | Quy tắc theo tài sản cho các ký hiệu như USDT, ETH, BTC hoặc SOL. |
| Native asset | Kiểm soát khác nhau cho tài sản native của mạng lưới so với token. |
| Destination address | Chặn hoặc cho phép các địa chỉ người nhận cụ thể. |
| Network code | Giới hạn theo mạng lưới, chẳng hạn quy tắc nghiêm ngặt hơn trên một chuỗi. |
| In address book | Kiểm soát cho người nhận có hoặc không nằm trong bất kỳ mục sổ địa chỉ nào. |
| Address book entry | Kiểm soát cho các mục sổ địa chỉ cụ thể. Một mục bao gồm tất cả địa chỉ của nó, vì vậy một mục hoạt động như một danh sách có tên. |
| Address age | Quy tắc thời gian chờ: số giây kể từ khi địa chỉ đích được thêm vào mục sổ địa chỉ của nó. |
| Internal wallet | Kiểm soát cho giao dịch chuyển giữa các ví trong cùng một workspace. |
| Workspace wallet | Kiểm soát cho giao dịch chuyển tới các ví cụ thể trong cùng một workspace. |

> **Note:** Các trường tham chiếu đến thành viên, khóa API, mục sổ địa chỉ hoặc ví sử dụng bộ chọn trong trình xây dựng điều kiện. Fystack lưu ID, hiển thị tên ở mọi nơi quy tắc xuất hiện (bao gồm cả yêu cầu phê duyệt), và khi bạn lưu sẽ kiểm tra rằng mỗi ID thuộc về workspace của bạn. Nếu sau đó một thực thể bị xóa hoặc thu hồi, quy tắc sẽ hiển thị nó như một tham chiếu không xác định và quy tắc chỉ có thể khớp ít hơn, không bao giờ nhiều hơn.

#### Các trường hoạt động rút tiền

| Trường | Dùng cho |
| --- | --- |
| Wallet outflow | Dòng tiền ra tính bằng USD theo từng ví trong 1, 6 hoặc 24 giờ qua. |
| Wallet withdrawal count | Kiểm soát đột biến khi có nhiều lệnh rút từ một ví trong giờ qua. |
| Workspace outflow | Dòng tiền ra tính bằng USD trên toàn workspace trong 1, 6 hoặc 24 giờ qua. |
| Workspace withdrawal count | Khối lượng rút tiền trên toàn workspace trong giờ qua. |
| Network outflow | Dòng tiền ra tính bằng USD của workspace trên mạng lưới đã chọn trong 1, 6 hoặc 24 giờ qua. |
| Network withdrawal count | Khối lượng rút tiền của workspace trên mạng lưới đã chọn trong giờ qua. |

#### Các trường hoạt động đang chờ và dự kiến

| Trường | Dùng cho |
| --- | --- |
| Pending outflow | Giá trị USD của các lệnh rút chưa được thực thi (đang chờ phê duyệt, đang xếp hàng hoặc đang nạp gas), bất kể đã tồn tại bao lâu. Có sẵn theo ví, workspace và mạng lưới. |
| Projected 24h outflow | Dòng tiền ra đã thực hiện trong 24 giờ qua, cộng dòng tiền ra đang chờ, cộng lệnh rút đang được kiểm tra. Dùng trường này cho các giới hạn: `projected 24h outflow over $100,000` nghĩa là lệnh rút này sẽ vượt quá giới hạn. Có sẵn theo ví, workspace và mạng lưới. |
| Projected 24h asset outflow | Cùng phép dự kiến đó cho ví nguồn, tính theo đơn vị của tài sản được rút, ví dụ tối đa 5 BTC mỗi ngày. |
| Initiator projected 24h outflow | Cùng phép dự kiến đó cho các lệnh rút được tạo bởi cùng một thành viên hoặc khóa API, trên toàn workspace. |

> **Note:** Các trường dòng tiền ra và số lượng được tính từ các lệnh rút đã thực hiện: chúng tính tiền sau khi lệnh rút đã được thực thi hoặc xác nhận. Các trường đang chờ và dự kiến cũng tính cả các lệnh rút chưa được thực thi. Khi một quy tắc đang hoạt động sử dụng trường đang chờ hoặc dự kiến, Fystack kiểm tra lần lượt từng lệnh rút của workspace, nhờ đó hai yêu cầu được gửi cùng lúc không thể cùng vượt qua một giới hạn. Yêu cầu phải chờ lượt quá 5 giây sẽ bị từ chối với HTTP 429 và có thể được thử lại.

#### Các trường lời gọi hợp đồng

| Trường | Dùng cho |
| --- | --- |
| Network code | Quy tắc lời gọi hợp đồng theo từng chuỗi. |
| Contract address | Chặn hợp đồng lạ hoặc cho phép hợp đồng đã biết. |
| Method selector | Kiểm tra hàm ở mức thấp, chẳng hạn selector chuyển ERC-20 `0xa9059cbb`. |
| Method name | Kiểm tra phương thức dễ đọc khi có metadata. |
| Value wei | Giá trị native gửi kèm lời gọi hợp đồng. |
| Gas limit | Chặn các lời gọi tốn kém bất thường hoặc rủi ro. |
| Decoded arguments | Quy tắc ở mức tham số khi Fystack có thể giải mã lời gọi. Giao dịch chuyển ERC-20 cung cấp người nhận và giá trị token. |

> **Note:** Tham số đã giải mã chỉ có sẵn khi lời gọi có thể được giải mã. Trong trình xây dựng JSON, hãy kiểm tra điều kiện bảo vệ trước khi đọc giá trị của tham số đã giải mã.

#### Các trường Web3 Transfer

Quy tắc Web3 Transfer sử dụng [Các trường rút tiền](#withdrawal-fields) cùng với các trường bên dưới. Không có các trường hoạt động, vì các giao dịch chuyển này không phải là lệnh rút tiền.

| Trường | Dùng cho |
| --- | --- |
| Asset in catalog | False khi hợp đồng token không có trong danh mục tài sản. Khi đó số tiền, giá trị USD và ký hiệu sẽ trống, vì vậy hãy chặn token lạ một cách tường minh nếu cần. |
| Token contract | Quy tắc cho một hợp đồng token cụ thể. Để trống đối với coin native. |

#### Các trường ký thông điệp

| Trường | Dùng cho |
| --- | --- |
| Signing method | `personal_sign`, `eth_sign`, or `eth_signTypedData_v4`. |
| Typed data type, domain name, verifying contract | Quy tắc cho các thông điệp typed-data cụ thể, chẳng hạn lệnh của một dApp đã biết. |
| Is a token permit | True đối với các thông điệp EIP-2612, DAI và Permit2, cho phép spender di chuyển token về sau mà không cần thêm chữ ký. |
| Permit spender | Chặn permit cho các spender bạn không tin tưởng. |
| Permit tokens | Các hợp đồng token mà permit bao gồm. Dùng trong trình chỉnh sửa biểu thức, ví dụ `'0x…' in resource.permit_tokens`. |
| Permit unlimited amount | True đối với allowance giá trị tối đa (2^159 trở lên, hoặc permit DAI có thiết lập allowed). |
| Permit deadline | Thời điểm Unix mà permit hoặc chữ ký của nó hết hạn. Bằng 0 khi thông điệp không có thời hạn. |

## Trạng thái chính sách

| Trạng thái | Ý nghĩa |
| --- | --- |
| Pending | Chính sách, hoặc một thay đổi đối với nó, đang chờ nhóm phê duyệt đồng ý. Chưa được áp dụng. |
| Active | Chính sách đã được phê duyệt và đang hoạt động. Các quy tắc của nó được đánh giá cho mọi hành động được bảo vệ trên các ví áp dụng. |
| Inactive | Chính sách đã bị tắt và không được đánh giá. |
| Rejected | Một thay đổi đang chờ đã bị người phê duyệt từ chối và không có hiệu lực. |

## Lịch sử thay đổi

Mọi thay đổi đối với chính sách đều được ghi lại. Mục **History** của chính sách hiển thị từng phiên bản cùng người đề xuất, những gì đã thay đổi (theo từng trường), và việc nó được phê duyệt hay bị từ chối. Điều này mang lại cho bạn một dấu vết kiểm toán đầy đủ về cách các rào chắn của bạn thay đổi theo thời gian.

_Image: Lịch sử thay đổi chính sách_

## Thực tiễn tốt nhất

- Bắt đầu với các quy tắc **Deny** cho những tình huống rủi ro cao nhất (giao dịch chuyển lớn, đích đến lạ) trước khi thêm các quy tắc **Allow** để tạo sự tiện lợi
- Hãy nhớ rằng **Deny luôn thắng**, hãy tận dụng điều này để đặt các giới hạn cứng mà không quy tắc Allow nào có thể ghi đè
- Giới hạn phạm vi chính sách cho các ví cụ thể khi các ví có mức độ rủi ro khác nhau, thay vì áp dụng một chính sách rộng cho mọi nơi
- Hạn chế sử dụng quy tắc **Allow**, vì chúng bỏ qua hàng đợi phê duyệt, nên chỉ dành chúng cho các mẫu giao dịch giá trị thấp và rõ ràng đáng tin cậy
- Khi một quy tắc **Allow** tin tưởng các mục sổ địa chỉ, hãy giữ lại điều kiện tuổi địa chỉ mà trình xây dựng tự thêm vào. Bất kỳ ai có quyền chỉnh sửa sổ địa chỉ đều có thể thêm một địa chỉ vào mục tin cậy, và việc kiểm tra tuổi buộc địa chỉ mới phải chờ trước khi được tự động phê duyệt
- Xác thực mọi điều kiện trước khi gửi, và xem xét thay đổi ở bước phê duyệt để xác nhận nó hoạt động như mong muốn
- Xử lý các thay đổi chính sách với sự cẩn trọng như với lệnh rút tiền, vì cổng phê duyệt tồn tại để không một cá nhân nào có thể âm thầm làm suy yếu các biện pháp kiểm soát của bạn
