Chính sách

Chính sách của Fystack là các rào chắn có thể lập trình cho những thao tác nhạy cảm trên ví. Một chính sách áp dụng cho một workspace, có thể thu hẹp xuống các ví cụ thể, và chứa các quy tắc đánh giá một biểu thức dựa trên payload hành động có cấu trúc.

Các quy tắc được thực thi cho bốn hành động:

  • Name
    withdrawal.create
    Type
    trigger_action
    Description

    Được đánh giá trước khi giao dịch rút tiền được tạo. DENY sẽ chặn yêu cầu. ALLOW khớp sẽ bỏ qua phê duyệt giao dịch và cho phép giao dịch rút tiền chuyển sang bước ký.

  • Name
    web3.transfer
    Type
    trigger_action
    Description

    Được đánh giá khi một giao dịch chuyển coin gốc hoặc ERC-20 được gửi qua Web3 raw-transaction API. Sử dụng cùng các trường withdrawal.* như withdrawal.create, nên một điều kiện được hiểu giống nhau trên cả hai trigger. Các trường velocity không khả dụng, vì những giao dịch chuyển này không phải là rút tiền. Giao dịch chuyển ERC-20 cũng được đánh giá như web3.contract_call.

  • Name
    web3.contract_call
    Type
    trigger_action
    Description

    Được đánh giá trước khi các lệnh gọi hợp đồng EVM và giao dịch chuyển token ERC-20 được gửi đi ký. DENY ghi nhận hoạt động là denied_by_policy. ALLOW khớp sẽ bỏ qua phê duyệt giao dịch và chuyển sang bước ký.

  • Name
    web3.sign_message
    Type
    trigger_action
    Description

    Được đánh giá khi một ví được yêu cầu ký message bằng personal_sign, eth_sign hoặc eth_signTypedData_v4. Chỉ hỗ trợ từ chối: một message được ký luôn phải qua phê duyệt.

Schema chính sách được sinh ra từ action schema ở backend trong Apex. Hãy dùng Lấy schema chính sách khi xây dựng UI builder hoặc kiểm tra động tính khả dụng của các trường. Để có các quy tắc dựng sẵn, xem Mẫu chính sách.


Cấu trúc chính sách

Chính sách là vùng chứa. Quy tắc là đơn vị thực thi.

{
  "name": "Large withdrawal guard",
  "approval_group_id": "a1b2c3d4-e5f6-7890-1234-567890abcdef",
  "wallet_ids": [],
  "rules": [
    {
      "trigger_action": "withdrawal.create",
      "condition": "withdrawal.value_usd > 10000 && !withdrawal.is_whitelisted",
      "effect": "DENY"
    }
  ]
}
  • Name
    approval_group_id
    Type
    string
    Description

    Nhóm phê duyệt xem xét việc tạo, chỉnh sửa, xóa chính sách và các thay đổi quy tắc.

  • Name
    wallet_ids
    Type
    string[]
    Description

    Các ví mà chính sách này áp dụng. Mảng rỗng nghĩa là mọi ví trong workspace.

  • Name
    rules
    Type
    array
    Description

    Tối đa 50 quy tắc. Mỗi quy tắc có trigger_action, condition, effect, description tùy chọn và is_enabled tùy chọn.

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

  • Name
    pending
    Type
    status
    Description

    Đã tạo nhưng chưa được phê duyệt. Chính sách đang chờ sẽ không được đánh giá.

  • Name
    active
    Type
    status
    Description

    Đã được phê duyệt và đang hoạt động. Bộ đánh giá chỉ tải các chính sách đang hoạt động.

  • Name
    inactive
    Type
    status
    Description

    Đã bị vô hiệu hóa và không được đánh giá.

  • Name
    rejected
    Type
    status
    Description

    Bị từ chối trong quá trình phê duyệt và không được đánh giá.


Đánh giá chính sách

Với mỗi yêu cầu được bảo vệ, Fystack tải các chính sách đang hoạt động của workspace, biên dịch các quy tắc được bật, lọc các quy tắc khớp theo hành động và ví mục tiêu, sau đó xác định kết quả:

  1. Nếu bất kỳ quy tắc khớp nào có effect: "DENY", hành động sẽ bị chặn.
  2. Ngược lại, nếu bất kỳ quy tắc khớp nào có effect: "ALLOW", hành động được tiếp tục và bỏ qua phê duyệt giao dịch.
  3. Ngược lại, không có quy tắc chính sách nào khớp. Hành động tiếp tục theo luồng phê duyệt thông thường.

DENY luôn được ưu tiên hơn ALLOW, nên thứ tự quy tắc không bao giờ thay đổi kết quả. Trong nhóm effect thắng, quy tắc khớp đầu tiên theo thứ tự khai báo được dùng để quy kết, nhờ đó API có thể trả về rule_id và lý do chính sách ổn định.

Không có effect "yêu cầu phê duyệt" riêng. Phê duyệt là mặc định cho mọi hành động không khớp với quy tắc ALLOW nào.

Việc đánh giá theo cơ chế fail-closed. Lỗi cache, cơ sở dữ liệu, biên dịch hoặc đánh giá runtime đều dẫn đến từ chối hành động. Mỗi lần đánh giá có thời gian chờ 100 ms.

Phạm vi và cache

Chính sách được giới hạn theo workspace. Apex cache một gói chính sách đã biên dịch cho mỗi workspace và vô hiệu hóa nó sau khi có phê duyệt, từ chối chính sách hoặc thay đổi ví mục tiêu. Việc lọc ví diễn ra trong quá trình đánh giá, nên một gói của workspace có thể phục vụ tất cả các ví trong workspace đó.


Điều kiện

condition là một biểu thức phải trả về giá trị boolean. Tham chiếu các trường theo tên phần và tên trường, ví dụ principal.role, withdrawal.value_usd, wallet.purpose hoặc resource.method_selector.

Sử dụng các toán tử boolean, so sánh và kiểm tra thành viên thông thường:

&&  ||  !  ==  !=  >  >=  <  <=  in

in kiểm tra thành viên trong một danh sách literal hoặc một trường kiểu danh sách, ví dụ principal.api_key_id in ["<api_key_id>"] hoặc "0x…" in resource.permit_tokens.

Ví dụ:

  • Name
    Chặn rút tiền lớn đến địa chỉ ngoài danh sách cho phép
    Type
    DENY
    Description

    withdrawal.value_usd > 10000 && !withdrawal.is_whitelisted

  • Name
    Giới hạn mỗi ví ở mức $100,000 mỗi ngày
    Type
    DENY
    Description

    wallet.projected_outflow_24h > 100000

  • Name
    Giữ tiền lưu ký bên trong workspace
    Type
    DENY
    Description

    wallet.purpose == "custody" && !withdrawal.destination_is_internal

  • Name
    Bỏ qua phê duyệt cho API key chi trả
    Type
    ALLOW
    Description

    principal.initiator_type == "api_key" && principal.api_key_id in ["<api_key_id>"] && withdrawal.value_usd < 1000

  • Name
    Bỏ qua phê duyệt cho các mục sổ địa chỉ đã lâu
    Type
    ALLOW
    Description

    withdrawal.is_whitelisted && withdrawal.address_age_sec >= 86400 && withdrawal.value_usd <= 1000

  • Name
    Chặn rút tiền giá trị cao vào cuối tuần
    Type
    DENY
    Description

    (context.day_of_week == "Saturday" || context.day_of_week == "Sunday") && withdrawal.value_usd > 25000

  • Name
    Chặn giao dịch chuyển ERC-20 có gas cao
    Type
    DENY
    Description

    resource.method_selector == "0xa9059cbb" && resource.gas_limit > 100000

  • Name
    Chặn token permit không giới hạn
    Type
    DENY
    Description

    resource.is_permit && resource.permit_amount_is_unlimited

resource.decoded_args là động. Hãy bảo vệ các trường động bằng has(...) trước khi đọc chúng, ví dụ has(resource.decoded_args.to) && resource.decoded_args.to == "0x000000000000000000000000000000000000dead".

Trường tham chiếu

Các trường được đánh dấu ref trong schema chứa ID hoặc mã của một thực thể khác trong workspace: workspace_user, api_key, wallet, address_book, network hoặc asset_symbol. Các condition builder nên hiển thị bộ chọn cho những trường này.

Khi một quy tắc được lưu, Fystack kiểm tra rằng mỗi ID được tham chiếu thuộc về workspace của bạn. Nếu một thực thể sau đó bị xóa hoặc thu hồi, quy tắc vẫn giữ ID đó và chỉ có thể khớp ít hơn, không bao giờ nhiều hơn.


Action schema

Action schema định nghĩa các trường có thể dùng trong một điều kiện. Các trường được đánh dấu deprecated vẫn được đánh giá cho các quy tắc hiện có nhưng không nên dùng trong quy tắc mới.

Các trường chung

Mọi trigger action đều cung cấp các trường sau.

  • Name
    principal.user_id
    Type
    string · ref workspace_user
    Description

    ID của thành viên workspace đã khởi tạo hành động. Để trống khi bên khởi tạo là API key.

  • Name
    principal.role
    Type
    string
    Description

    Vai trò trong workspace. Một trong owner, admin, signer, proposer hoặc viewer.

  • Name
    principal.initiator_type
    Type
    string
    Description

    user cho phiên web, hoặc api_key cho API key.

  • Name
    principal.api_key_id
    Type
    string · ref api_key
    Description

    ID của API key đã khởi tạo hành động. Để trống với phiên web, vì vậy hãy kết hợp với principal.initiator_type.

  • Name
    principal.user_email
    Type
    string · deprecated
    Description

    Email của người dùng khởi tạo. Hãy dùng principal.user_id thay thế, vì email có thể thay đổi.

  • Name
    wallet.id
    Type
    string · ref wallet
    Description

    ID của ví nguồn. Dùng cho các quy tắc nhắm đến các ví cụ thể trong một chính sách.

  • Name
    wallet.purpose
    Type
    string
    Description

    Mục đích của ví nguồn. Một trong general, custody, payment, user, one_time_use, gas_tank hoặc deployment.

  • Name
    wallet.type
    Type
    string
    Description

    Loại ví nguồn. standard hoặc mpc.

  • Name
    context.hour
    Type
    integer
    Description

    Giờ UTC tại thời điểm đánh giá, từ 0 đến 23.

  • Name
    context.day_of_week
    Type
    string
    Description

    Tên ngày trong tuần theo UTC, ví dụ Monday hoặc Saturday.

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

Khả dụng trên withdrawal.create và web3.transfer.

  • Name
    withdrawal.amount
    Type
    number
    Description

    Số lượng tài sản được yêu cầu.

  • Name
    withdrawal.value_usd
    Type
    number
    Description

    Giá trị được yêu cầu tính bằng USD.

  • Name
    withdrawal.asset_symbol
    Type
    string · ref asset_symbol
    Description

    Ký hiệu tài sản, chẳng hạn USDT, ETH hoặc BTC.

  • Name
    withdrawal.asset_is_native
    Type
    boolean
    Description

    Tài sản có phải là tài sản gốc của mạng lưới hay không.

  • Name
    withdrawal.asset_is_known
    Type
    boolean
    Description

    Token có nằm trong danh mục tài sản của Fystack hay không. Khi là false, amount, value_usd và asset_symbol sẽ trống, vì vậy hãy từ chối rõ ràng các token không xác định nếu cần.

  • Name
    withdrawal.token_address
    Type
    string
    Description

    Địa chỉ hợp đồng token. Để trống với coin gốc.

  • Name
    withdrawal.destination_address
    Type
    string
    Description

    Địa chỉ người nhận.

  • Name
    withdrawal.network_code
    Type
    string · ref network
    Description

    Mã mạng lưới nội bộ.

  • Name
    withdrawal.is_whitelisted
    Type
    boolean
    Description

    Địa chỉ đích có nằm trong bất kỳ mục sổ địa chỉ nào của workspace hay không.

  • Name
    withdrawal.address_book_id
    Type
    string · ref address_book
    Description

    Mục sổ địa chỉ chứa địa chỉ đích. Một mục bao gồm tất cả các địa chỉ của nó, nên một mục hoạt động như một danh sách có tên.

  • Name
    withdrawal.address_age_sec
    Type
    number
    Description

    Số giây kể từ khi địa chỉ đích được thêm vào mục sổ địa chỉ của nó. Dùng trường này cho các quy tắc thời gian chờ đối với người nhận mới thêm.

  • Name
    withdrawal.destination_is_internal
    Type
    boolean
    Description

    Đích có phải là một ví khác trong cùng workspace hay không.

  • Name
    withdrawal.destination_wallet_id
    Type
    string · ref wallet
    Description

    Ví đích khi đích là nội bộ.

Các trường velocity của rút tiền

Chỉ khả dụng trên withdrawal.create. Mọi giá trị đều tính bằng USD trừ khi có ghi chú khác.

  • Name
    wallet.outflow_1h / outflow_6h / outflow_24h
    Type
    number
    Description

    Dòng tiền ra thực tế của ví nguồn trong 1, 6 hoặc 24 giờ qua.

  • Name
    wallet.withdrawal_count_1h
    Type
    integer
    Description

    Số lần thử rút tiền từ ví nguồn trong giờ qua.

  • Name
    wallet.pending_outflow
    Type
    number
    Description

    Giá trị các giao dịch rút tiền từ ví nguồn chưa được thực thi.

  • Name
    wallet.projected_outflow_24h
    Type
    number
    Description

    Dòng tiền ra thực tế trong 24 giờ, cộng dòng tiền ra đang chờ, cộng giao dịch rút tiền đang được kiểm tra, đối với ví nguồn.

  • Name
    wallet.asset_projected_outflow_24h
    Type
    number
    Description

    Cùng phép dự báo đó cho ví nguồn nhưng 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.

  • Name
    workspace.outflow_1h / outflow_6h / outflow_24h
    Type
    number
    Description

    Dòng tiền ra thực tế của workspace trong 1, 6 hoặc 24 giờ qua.

  • Name
    workspace.withdrawal_count_1h
    Type
    integer
    Description

    Số lần thử rút tiền của workspace trong giờ qua.

  • Name
    workspace.pending_outflow
    Type
    number
    Description

    Giá trị các giao dịch rút tiền của workspace chưa được thực thi.

  • Name
    workspace.projected_outflow_24h
    Type
    number
    Description

    Dự báo của workspace: dòng tiền ra thực tế trong 24 giờ, cộng dòng tiền ra đang chờ, cộng giao dịch rút tiền đang được kiểm tra.

  • Name
    workspace.network_outflow_1h / network_outflow_6h / network_outflow_24h
    Type
    number
    Description

    Dòng tiền ra thực tế của workspace trên mạng lưới hiện tại trong 1, 6 hoặc 24 giờ qua.

  • Name
    workspace.network_withdrawal_count_1h
    Type
    integer
    Description

    Số lần thử rút tiền của workspace trên mạng lưới hiện tại trong giờ qua.

  • Name
    workspace.network_pending_outflow
    Type
    number
    Description

    Dòng tiền ra đang chờ của workspace trên mạng lưới hiện tại.

  • Name
    workspace.network_projected_outflow_24h
    Type
    number
    Description

    Dự báo của workspace trên mạng lưới hiện tại.

  • Name
    workspace.initiator_projected_outflow_24h
    Type
    number
    Description

    Dự báo cho các giao dịch rút tiền được tạo bởi cùng một thành viên hoặc API key, trên toàn workspace.

Các trường dòng tiền ra và số lượng là giá trị thực tế: chúng chỉ tính một giao dịch rút tiền sau khi nó đạt trạng thái cuối là đã thực thi hoặc thành công. Dòng tiền ra đang chờ tính các giao dịch rút tiền đang chờ phê duyệt, đang trong hàng đợi hoặc đang nạp gas, bất kể đã tồn tại bao lâu.

Khi một quy tắc đang hoạt động sử dụng trường pending hoặc projected, Fystack đánh giá lần lượt từng giao dịch rút tiền của workspace, nên hai yêu cầu đồng thời 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ể thử lại.

Các trường web3.contract_call

  • Name
    resource.network_code
    Type
    string · ref network
    Description

    Mã mạng lưới nội bộ.

  • Name
    resource.contract_address
    Type
    string
    Description

    Địa chỉ hợp đồng viết thường lấy từ trường to của giao dịch thô.

  • Name
    resource.method_selector
    Type
    string
    Description

    Selector 4 byte viết thường, ví dụ 0xa9059cbb.

  • Name
    resource.method_name
    Type
    string
    Description

    Tên phương thức lấy từ metadata của yêu cầu nếu được cung cấp.

  • Name
    resource.value_wei
    Type
    string
    Description

    Giá trị coin gốc được gửi kèm lệnh gọi, biểu diễn dưới dạng chuỗi.

  • Name
    resource.gas_limit
    Type
    integer
    Description

    Giới hạn gas lấy từ giao dịch thô.

  • Name
    resource.decoded_args
    Type
    map
    Description

    Các đối số đã giải mã khi Fystack nhận diện được lệnh gọi. transfer của ERC-20 cung cấp to và value.

Các trường web3.sign_message

  • Name
    resource.method
    Type
    string
    Description

    Phương thức ký. Một trong personal_sign, eth_sign hoặc eth_signTypedData_v4.

  • Name
    resource.network_code
    Type
    string · ref network
    Description

    Mã mạng lưới nội bộ.

  • Name
    resource.typed_data_primary_type
    Type
    string
    Description

    Primary type EIP-712, dành cho message typed-data.

  • Name
    resource.typed_data_domain_name
    Type
    string
    Description

    Domain name EIP-712, dành cho message typed-data.

  • Name
    resource.typed_data_verifying_contract
    Type
    string
    Description

    Verifying contract EIP-712, dành cho message typed-data.

  • Name
    resource.is_permit
    Type
    boolean
    Description

    true với các message EIP-2612, DAI và Permit2, cho phép bên chi tiêu di chuyển token sau này mà không cần chữ ký khác.

  • Name
    resource.permit_spender
    Type
    string
    Description

    Địa chỉ được permit ủy quyền.

  • Name
    resource.permit_tokens
    Type
    string[]
    Description

    Các hợp đồng token mà permit bao gồm. Dùng với in, ví dụ "0x…" in resource.permit_tokens.

  • Name
    resource.permit_amount_is_unlimited
    Type
    boolean
    Description

    true với các allowance giá trị tối đa (2159 trở lên, hoặc DAI permit có đặt allowed).

  • Name
    resource.permit_deadline
    Type
    integer
    Description

    Thời điểm Unix mà permit hoặc chữ ký của nó hết hạn. 0 khi message không có thời hạn.


Vòng đời phê duyệt

Các thao tác tạo, cập nhật và xóa chính sách đều cần phê duyệt. Thao tác thay đổi sẽ tạo một yêu cầu phê duyệt policy và trả về status: "pending_approval" kèm approval_request_id. Thay đổi chính sách chỉ được áp dụng sau khi nhóm phê duyệt đạt ngưỡng.

Các thao tác tạo, cập nhật và xóa quy tắc tuân theo cùng mô hình khi chính sách cha có nhóm phê duyệt. Bản sửa đổi đang chờ lưu các khác biệt ở cấp trường để kiểm toán và xem xét.

Cập nhật ví mục tiêu qua /wallets được áp dụng ngay sau khi xác thực và vô hiệu hóa cache. Hãy dùng endpoint cập nhật chính sách khi bạn muốn các thay đổi ví mục tiêu được xem xét như một phần của bản sửa đổi chính sách lớn hơn.


Xác thực

Các endpoint của Policy API chấp nhận yêu cầu được ký bằng API key hoặc bearer access token.

  • Name
    ACCESS-API-KEY
    Type
    header
    Description

    UUID của API key cho các yêu cầu xác thực bằng HMAC.

  • Name
    ACCESS-TIMESTAMP
    Type
    header
    Description

    Dấu thời gian UNIX tính bằng giây dùng để tạo chữ ký HMAC.

  • Name
    ACCESS-SIGN
    Type
    header
    Description

    Chữ ký HMAC mã hóa Base64. Xem Xác thực để biết định dạng ký.

  • Name
    Authorization
    Type
    header
    Description

    Bearer access token cho các yêu cầu theo phiên người dùng.

Các endpoint quyết định phê duyệt chính sách vẫn là endpoint theo phiên người dùng. Hãy dùng bearer access token cho các thao tác phê duyệt và từ chối yêu cầu phê duyệt.

Cấu trúc phản hồi

Các phản hồi JSON thành công sử dụng cấu trúc envelope tiêu chuẩn của Fystack.

  • Name
    success
    Type
    boolean
    Description

    true khi yêu cầu thành công.

  • Name
    message
    Type
    string
    Description

    Thông báo phản hồi, thường là success.

  • Name
    code
    Type
    integer
    Description

    Mã kết quả dạng số. Phản hồi thành công dùng 0.

  • Name
    data
    Type
    object | array | null
    Description

    Payload phản hồi riêng của từng endpoint.

Lỗi xác thực dùng cùng envelope với success: false và một mảng errors.

Kiểu dữ liệu

Policy

  • Name
    id
    Type
    string
    Description

    UUID của chính sách.

  • Name
    created_at
    Type
    string
    Description

    Dấu thời gian ISO khi chính sách được tạo.

  • Name
    updated_at
    Type
    string
    Description

    Dấu thời gian ISO khi chính sách được cập nhật lần cuối.

  • Name
    name
    Type
    string
    Description

    Tên chính sách. Từ 3 đến 100 ký tự.

  • Name
    description
    Type
    string
    Description

    Mô tả tùy chọn. Tối đa 500 ký tự.

  • Name
    status
    Type
    string
    Description

    Một trong pending, rejected, active hoặc inactive.

  • Name
    version
    Type
    integer
    Description

    Số phiên bản của chính sách.

  • Name
    workspace_id
    Type
    string
    Description

    UUID của workspace.

  • Name
    approval_group_id
    Type
    string | null
    Description

    UUID của nhóm phê duyệt được gán cho chính sách.

  • Name
    wallet_ids
    Type
    string[]
    Description

    UUID của các ví mục tiêu. Mảng rỗng nghĩa là chính sách áp dụng cho tất cả các ví trong workspace.

  • Name
    rules
    Type
    PolicyRule[]
    Description

    Có mặt ở các endpoint tải sẵn quy tắc.

  • Name
    approval_group
    Type
    object
    Description

    Có mặt ở các endpoint tải sẵn nhóm phê duyệt.

  • Name
    pending_approval_request
    Type
    object
    Description

    Có mặt khi chính sách có yêu cầu phê duyệt đang chờ.

PolicyRule

  • Name
    id
    Type
    string
    Description

    UUID của quy tắc.

  • Name
    policy_id
    Type
    string
    Description

    UUID của chính sách cha.

  • Name
    trigger_action
    Type
    string
    Description

    Một trong withdrawal.create, web3.transfer, web3.contract_call hoặc web3.sign_message.

  • Name
    condition
    Type
    string
    Description

    Biểu thức điều kiện boolean. Từ 1 đến 4000 ký tự.

  • Name
    effect
    Type
    string
    Description

    Một trong ALLOW hoặc DENY.

  • Name
    description
    Type
    string
    Description

    Mô tả tùy chọn. Tối đa 500 ký tự.

  • Name
    is_enabled
    Type
    boolean
    Description

    Quy tắc có được bật hay không. Mặc định là true khi tạo nếu bỏ qua.

Phản hồi thay đổi

Các endpoint thay đổi chính sách và quy tắc trả về payload thay đổi trong data.

  • Name
    status
    Type
    string
    Description

    Một trong applied, pending_approval hoặc deleted, tùy theo thao tác.

  • Name
    policy
    Type
    Policy
    Description

    Được trả về bởi các endpoint thay đổi chính sách khi phù hợp.

  • Name
    rule
    Type
    PolicyRule
    Description

    Được trả về bởi các endpoint thay đổi quy tắc khi phù hợp.

  • Name
    approval_request_id
    Type
    string
    Description

    Được trả về khi thay đổi đang chờ phê duyệt.

Lấy schema chính sách

GET
/policy/schema

Trả về các trường mà một điều kiện có thể tham chiếu, được nhóm theo trigger_action và phần. Dùng endpoint này cho condition builder và bản xem trước phía client.

Mỗi trường có name và type. Các khóa tùy chọn:

  • Name
    enum
    Type
    string[]
    Description

    Các giá trị được phép của trường.

  • Name
    ref
    Type
    string
    Description

    Thực thể mà trường tham chiếu đến. Hãy hiển thị bộ chọn cho nó. Xem Trường tham chiếu.

  • Name
    deprecated
    Type
    boolean
    Description

    Vẫn được đánh giá cho các quy tắc hiện có. Hãy ẩn nó khỏi trình tạo quy tắc mới.

Request

GET
/policy/schema
curl -X GET https://api.fystack.io/api/v1/policy/schema \
  -H "ACCESS-API-KEY: your_api_key" \
  -H "ACCESS-TIMESTAMP: 1667836889" \
  -H "ACCESS-SIGN: YourBase64EncodedSignature=="

Response

200
{
  "success": true,
  "message": "success",
  "code": 0,
  "data": {
    "withdrawal.create": {
      "principal": [
        { "name": "user_email", "type": "string", "deprecated": true },
        { "name": "user_id", "type": "string", "ref": "workspace_user" },
        { "name": "role", "type": "string", "enum": ["owner", "admin", "signer", "proposer", "viewer"] },
        { "name": "initiator_type", "type": "string", "enum": ["user", "api_key"] },
        { "name": "api_key_id", "type": "string", "ref": "api_key" }
      ],
      "withdrawal": [
        { "name": "amount", "type": "number" },
        { "name": "value_usd", "type": "number" },
        { "name": "asset_symbol", "type": "string", "ref": "asset_symbol" },
        { "name": "asset_is_native", "type": "boolean" },
        { "name": "asset_is_known", "type": "boolean" },
        { "name": "token_address", "type": "string" },
        { "name": "destination_address", "type": "string" },
        { "name": "network_code", "type": "string", "ref": "network" },
        { "name": "is_whitelisted", "type": "boolean" },
        { "name": "address_age_sec", "type": "number" },
        { "name": "address_book_id", "type": "string", "ref": "address_book" },
        { "name": "destination_is_internal", "type": "boolean" },
        { "name": "destination_wallet_id", "type": "string", "ref": "wallet" }
      ],
      "wallet": [
        { "name": "id", "type": "string", "ref": "wallet" },
        { "name": "purpose", "type": "string", "enum": ["general", "custody", "payment", "user", "one_time_use", "gas_tank", "deployment"] },
        { "name": "type", "type": "string", "enum": ["standard", "mpc"] },
        { "name": "outflow_1h", "type": "number" },
        { "name": "outflow_6h", "type": "number" },
        { "name": "outflow_24h", "type": "number" },
        { "name": "withdrawal_count_1h", "type": "integer" },
        { "name": "pending_outflow", "type": "number" },
        { "name": "projected_outflow_24h", "type": "number" },
        { "name": "asset_projected_outflow_24h", "type": "number" }
      ],
      "workspace": [
        { "name": "outflow_1h", "type": "number" },
        { "name": "outflow_6h", "type": "number" },
        { "name": "outflow_24h", "type": "number" },
        { "name": "withdrawal_count_1h", "type": "integer" },
        { "name": "network_outflow_1h", "type": "number" },
        { "name": "network_outflow_6h", "type": "number" },
        { "name": "network_outflow_24h", "type": "number" },
        { "name": "network_withdrawal_count_1h", "type": "integer" },
        { "name": "pending_outflow", "type": "number" },
        { "name": "projected_outflow_24h", "type": "number" },
        { "name": "network_pending_outflow", "type": "number" },
        { "name": "network_projected_outflow_24h", "type": "number" },
        { "name": "initiator_projected_outflow_24h", "type": "number" }
      ],
      "context": [
        { "name": "hour", "type": "integer" },
        { "name": "day_of_week", "type": "string" }
      ]
    },
    "web3.transfer": {
      "principal": [ "... same as withdrawal.create ..." ],
      "withdrawal": [ "... same as withdrawal.create ..." ],
      "wallet": [
        { "name": "id", "type": "string", "ref": "wallet" },
        { "name": "purpose", "type": "string", "enum": ["general", "custody", "payment", "user", "one_time_use", "gas_tank", "deployment"] },
        { "name": "type", "type": "string", "enum": ["standard", "mpc"] }
      ],
      "context": [ "... same as withdrawal.create ..." ]
    },
    "web3.contract_call": {
      "principal": [ "... same as withdrawal.create ..." ],
      "resource": [
        { "name": "network_code", "type": "string", "ref": "network" },
        { "name": "contract_address", "type": "string" },
        { "name": "method_selector", "type": "string" },
        { "name": "method_name", "type": "string" },
        { "name": "value_wei", "type": "string" },
        { "name": "gas_limit", "type": "integer" },
        { "name": "decoded_args", "type": "map" }
      ],
      "wallet": [ "... id, purpose, type ..." ],
      "context": [ "... same as withdrawal.create ..." ]
    },
    "web3.sign_message": {
      "principal": [ "... same as withdrawal.create ..." ],
      "resource": [
        { "name": "method", "type": "string", "enum": ["personal_sign", "eth_sign", "eth_signTypedData_v4"] },
        { "name": "network_code", "type": "string", "ref": "network" },
        { "name": "typed_data_primary_type", "type": "string" },
        { "name": "typed_data_domain_name", "type": "string" },
        { "name": "typed_data_verifying_contract", "type": "string" },
        { "name": "is_permit", "type": "boolean" },
        { "name": "permit_spender", "type": "string" },
        { "name": "permit_tokens", "type": "string[]" },
        { "name": "permit_amount_is_unlimited", "type": "boolean" },
        { "name": "permit_deadline", "type": "integer" }
      ],
      "wallet": [ "... id, purpose, type ..." ],
      "context": [ "... same as withdrawal.create ..." ]
    }
  }
}

Xác thực quy tắc

POST
/workspaces/{workspace_id}/policies/rules/validate

Xác thực nội dung quy tắc mà không tạo hoặc cập nhật quy tắc.

Tham số đường dẫn

  • Name
    workspace_id
    Type
    string
    Description

    UUID của workspace.

Tham số body

  • Name
    trigger_action
    Type
    string
    Required
    required
    Description

    Một trong withdrawal.create, web3.transfer, web3.contract_call hoặc web3.sign_message.

  • Name
    condition
    Type
    string
    Required
    required
    Description

    Từ 1 đến 4000 ký tự. Phải biên dịch được thành biểu thức boolean.

  • Name
    effect
    Type
    string
    Required
    required
    Description

    Một trong ALLOW hoặc DENY. Quy tắc web3.sign_message chỉ hỗ trợ từ chối.

Dữ liệu phản hồi

  • Name
    valid
    Type
    boolean
    Description

    true khi nội dung quy tắc hợp lệ.

Request

POST
/workspaces/{workspace_id}/policies/rules/validate
curl -X POST https://api.fystack.io/api/v1/workspaces/{workspace_id}/policies/rules/validate \
  -H "ACCESS-API-KEY: your_api_key" \
  -H "ACCESS-TIMESTAMP: 1667836889" \
  -H "ACCESS-SIGN: YourBase64EncodedSignature==" \
  -H "Content-Type: application/json" \
  -d '{
    "trigger_action": "withdrawal.create",
    "condition": "withdrawal.value_usd > 10000",
    "effect": "DENY"
  }'

Response

200
{
  "success": true,
  "message": "success",
  "code": 0,
  "data": { "valid": true }
}

Tạo chính sách

POST
/workspaces/{workspace_id}/policies

Tạo một thay đổi chính sách.

Tham số đường dẫn

  • Name
    workspace_id
    Type
    string
    Description

    UUID của workspace.

Tham số body

  • Name
    name
    Type
    string
    Required
    required
    Description

    Từ 3 đến 100 ký tự.

  • Name
    description
    Type
    string
    Description

    Tùy chọn. Tối đa 500 ký tự.

  • Name
    approval_group_id
    Type
    string
    Required
    required
    Description

    UUID của nhóm phê duyệt.

  • Name
    wallet_ids
    Type
    string[]
    Description

    Tùy chọn. Tối đa 500 UUID ví.

  • Name
    rules
    Type
    PolicyRuleCreate[]
    Description

    Tùy chọn. Tối đa 50 quy tắc.

Request

POST
/workspaces/{workspace_id}/policies
curl -X POST https://api.fystack.io/api/v1/workspaces/{workspace_id}/policies \
  -H "ACCESS-API-KEY: your_api_key" \
  -H "ACCESS-TIMESTAMP: 1667836889" \
  -H "ACCESS-SIGN: YourBase64EncodedSignature==" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Large withdrawal guard",
    "approval_group_id": "a1b2c3d4-e5f6-7890-1234-567890abcdef",
    "wallet_ids": [],
    "rules": [
      {
        "trigger_action": "withdrawal.create",
        "condition": "withdrawal.value_usd > 10000",
        "effect": "DENY"
      }
    ]
  }'

Response

200
{
  "success": true,
  "message": "success",
  "code": 0,
  "data": {
    "status": "pending_approval",
    "approval_request_id": "b7e2a1c4-9d8f-4a3b-8c1d-2e3f4a5b6c7d",
    "policy": {
      "id": "9c8b7a6d-5e4f-3210-9a8b-7c6d5e4f3210",
      "name": "Large withdrawal guard",
      "status": "pending",
      "version": 1,
      "wallet_ids": []
    }
  }
}

Liệt kê chính sách

GET
/workspaces/{workspace_id}/policies

Trả về các chính sách trong một workspace.

Tham số đường dẫn

  • Name
    workspace_id
    Type
    string
    Description

    UUID của workspace.

Tham số truy vấn

  • Name
    status
    Type
    string
    Description

    Tùy chọn. Một trong pending, rejected, active hoặc inactive.

  • Name
    limit
    Type
    integer
    Description

    Tùy chọn. Tối đa 1000.

  • Name
    offset
    Type
    integer
    Description

    Tùy chọn. Tối đa 100000.

Dữ liệu phản hồi

  • Name
    data
    Type
    Policy[]
    Description

    Mảng các đối tượng chính sách.

Request

GET
/workspaces/{workspace_id}/policies
curl -X GET "https://api.fystack.io/api/v1/workspaces/{workspace_id}/policies?status=active&limit=20&offset=0" \
  -H "ACCESS-API-KEY: your_api_key" \
  -H "ACCESS-TIMESTAMP: 1667836889" \
  -H "ACCESS-SIGN: YourBase64EncodedSignature=="

Lấy một chính sách

GET
/workspaces/{workspace_id}/policies/{policy_id}

Trả về một chính sách.

Tham số đường dẫn

  • Name
    workspace_id
    Type
    string
    Description

    UUID của workspace.

  • Name
    policy_id
    Type
    string
    Description

    UUID của chính sách.

Dữ liệu phản hồi

  • Name
    data
    Type
    Policy
    Description

    Đối tượng chính sách, bao gồm quy tắc, nhóm phê duyệt và yêu cầu phê duyệt đang chờ nếu có.

Request

GET
/workspaces/{workspace_id}/policies/{policy_id}
curl -X GET https://api.fystack.io/api/v1/workspaces/{workspace_id}/policies/{policy_id} \
  -H "ACCESS-API-KEY: your_api_key" \
  -H "ACCESS-TIMESTAMP: 1667836889" \
  -H "ACCESS-SIGN: YourBase64EncodedSignature=="

Cập nhật chính sách

PUT
/workspaces/{workspace_id}/policies/{policy_id}

Cập nhật các trường của chính sách.

Tham số đường dẫn

  • Name
    workspace_id
    Type
    string
    Description

    UUID của workspace.

  • Name
    policy_id
    Type
    string
    Description

    UUID của chính sách.

Tham số body

  • Name
    name
    Type
    string
    Description

    Tùy chọn. Từ 3 đến 100 ký tự.

  • Name
    description
    Type
    string
    Description

    Tùy chọn. Tối đa 500 ký tự.

  • Name
    approval_group_id
    Type
    string
    Description

    UUID của nhóm phê duyệt, tùy chọn.

  • Name
    wallet_ids
    Type
    string[]
    Description

    Tùy chọn. Tối đa 500 UUID ví. Gửi mảng rỗng để áp dụng cho tất cả các ví.

  • Name
    rules
    Type
    PolicyRuleCreate[]
    Description

    Tùy chọn. Thay thế toàn bộ tập quy tắc nếu có. Gửi mảng rỗng để xóa tất cả quy tắc.

Request

PUT
/workspaces/{workspace_id}/policies/{policy_id}
curl -X PUT https://api.fystack.io/api/v1/workspaces/{workspace_id}/policies/{policy_id} \
  -H "ACCESS-API-KEY: your_api_key" \
  -H "ACCESS-TIMESTAMP: 1667836889" \
  -H "ACCESS-SIGN: YourBase64EncodedSignature==" \
  -H "Content-Type: application/json" \
  -d '{
    "description": "Updated policy description",
    "wallet_ids": ["e0851607-417a-475a-b399-5f3aa262b81d"]
  }'

Xóa chính sách

DELETE
/workspaces/{workspace_id}/policies/{policy_id}

Xóa một chính sách hoặc tạo một thay đổi xóa đang chờ phê duyệt.

Tham số đường dẫn

  • Name
    workspace_id
    Type
    string
    Description

    UUID của workspace.

  • Name
    policy_id
    Type
    string
    Description

    UUID của chính sách.

Dữ liệu phản hồi

  • Name
    data
    Type
    Mutation response
    Description

    Phản hồi thay đổi chính sách.

Request

DELETE
/workspaces/{workspace_id}/policies/{policy_id}
curl -X DELETE https://api.fystack.io/api/v1/workspaces/{workspace_id}/policies/{policy_id} \
  -H "ACCESS-API-KEY: your_api_key" \
  -H "ACCESS-TIMESTAMP: 1667836889" \
  -H "ACCESS-SIGN: YourBase64EncodedSignature=="

Lấy lịch sử chính sách

GET
/workspaces/{workspace_id}/policies/{policy_id}/history

Trả về các bản sửa đổi của một chính sách.

Tham số đường dẫn

  • Name
    workspace_id
    Type
    string
    Description

    UUID của workspace.

  • Name
    policy_id
    Type
    string
    Description

    UUID của chính sách.

Dữ liệu phản hồi

  • Name
    data
    Type
    PolicyRevision[]
    Description

    Mảng các bản sửa đổi chính sách, bao gồm changes ở cấp trường nếu có.

Request

GET
/workspaces/{workspace_id}/policies/{policy_id}/history
curl -X GET https://api.fystack.io/api/v1/workspaces/{workspace_id}/policies/{policy_id}/history \
  -H "ACCESS-API-KEY: your_api_key" \
  -H "ACCESS-TIMESTAMP: 1667836889" \
  -H "ACCESS-SIGN: YourBase64EncodedSignature=="

Lấy danh sách ví của chính sách

GET
/workspaces/{workspace_id}/policies/{policy_id}/wallets

Trả về chính sách cùng wallet_ids hiện tại của nó.

Tham số đường dẫn

  • Name
    workspace_id
    Type
    string
    Description

    UUID của workspace.

  • Name
    policy_id
    Type
    string
    Description

    UUID của chính sách.

Dữ liệu phản hồi

  • Name
    data
    Type
    Policy
    Description

    Đối tượng chính sách.

Request

GET
/workspaces/{workspace_id}/policies/{policy_id}/wallets
curl -X GET https://api.fystack.io/api/v1/workspaces/{workspace_id}/policies/{policy_id}/wallets \
  -H "ACCESS-API-KEY: your_api_key" \
  -H "ACCESS-TIMESTAMP: 1667836889" \
  -H "ACCESS-SIGN: YourBase64EncodedSignature=="

Cập nhật danh sách ví của chính sách

PUT
/workspaces/{workspace_id}/policies/{policy_id}/wallets

Thay thế danh sách ví mục tiêu của một chính sách.

Tham số đường dẫn

  • Name
    workspace_id
    Type
    string
    Description

    UUID của workspace.

  • Name
    policy_id
    Type
    string
    Description

    UUID của chính sách.

Tham số body

  • Name
    wallet_ids
    Type
    string[]
    Description

    Tùy chọn. Tối đa 500 UUID ví. Gửi mảng rỗng để áp dụng cho tất cả các ví.

Request

PUT
/workspaces/{workspace_id}/policies/{policy_id}/wallets
curl -X PUT https://api.fystack.io/api/v1/workspaces/{workspace_id}/policies/{policy_id}/wallets \
  -H "ACCESS-API-KEY: your_api_key" \
  -H "ACCESS-TIMESTAMP: 1667836889" \
  -H "ACCESS-SIGN: YourBase64EncodedSignature==" \
  -H "Content-Type: application/json" \
  -d '{ "wallet_ids": ["e0851607-417a-475a-b399-5f3aa262b81d"] }'

Tạo quy tắc chính sách

POST
/workspaces/{workspace_id}/policies/{policy_id}/rules

Tạo một quy tắc trong một chính sách có sẵn.

Tham số đường dẫn

  • Name
    workspace_id
    Type
    string
    Description

    UUID của workspace.

  • Name
    policy_id
    Type
    string
    Description

    UUID của chính sách.

Tham số body

  • Name
    id
    Type
    string
    Description

    UUID của quy tắc, tùy chọn.

  • Name
    trigger_action
    Type
    string
    Required
    required
    Description

    Một trong withdrawal.create, web3.transfer, web3.contract_call hoặc web3.sign_message.

  • Name
    condition
    Type
    string
    Required
    required
    Description

    Từ 1 đến 4000 ký tự.

  • Name
    effect
    Type
    string
    Required
    required
    Description

    Một trong ALLOW hoặc DENY. Quy tắc web3.sign_message chỉ hỗ trợ từ chối.

  • Name
    description
    Type
    string
    Description

    Tùy chọn. Tối đa 500 ký tự.

  • Name
    is_enabled
    Type
    boolean
    Description

    Tùy chọn. Mặc định là true.

Request

POST
/workspaces/{workspace_id}/policies/{policy_id}/rules
curl -X POST https://api.fystack.io/api/v1/workspaces/{workspace_id}/policies/{policy_id}/rules \
  -H "ACCESS-API-KEY: your_api_key" \
  -H "ACCESS-TIMESTAMP: 1667836889" \
  -H "ACCESS-SIGN: YourBase64EncodedSignature==" \
  -H "Content-Type: application/json" \
  -d '{
    "trigger_action": "web3.contract_call",
    "condition": "resource.gas_limit > 100000",
    "effect": "DENY",
    "is_enabled": true
  }'

Cập nhật quy tắc chính sách

PUT
/workspaces/{workspace_id}/policies/rules/{rule_id}

Cập nhật các trường có thể thay đổi của quy tắc. Trigger action là bất biến, hãy xóa và tạo lại quy tắc để thay đổi nó.

Tham số đường dẫn

  • Name
    workspace_id
    Type
    string
    Description

    UUID của workspace.

  • Name
    rule_id
    Type
    string
    Description

    UUID của quy tắc.

Tham số body

  • Name
    condition
    Type
    string
    Description

    Tùy chọn. Từ 1 đến 4000 ký tự.

  • Name
    effect
    Type
    string
    Description

    Tùy chọn. Một trong ALLOW hoặc DENY.

  • Name
    description
    Type
    string
    Description

    Tùy chọn. Tối đa 500 ký tự.

  • Name
    is_enabled
    Type
    boolean
    Description

    Tùy chọn.

Request

PUT
/workspaces/{workspace_id}/policies/rules/{rule_id}
curl -X PUT https://api.fystack.io/api/v1/workspaces/{workspace_id}/policies/rules/{rule_id} \
  -H "ACCESS-API-KEY: your_api_key" \
  -H "ACCESS-TIMESTAMP: 1667836889" \
  -H "ACCESS-SIGN: YourBase64EncodedSignature==" \
  -H "Content-Type: application/json" \
  -d '{
    "condition": "resource.gas_limit > 150000",
    "is_enabled": true
  }'

Xóa quy tắc chính sách

DELETE
/workspaces/{workspace_id}/policies/rules/{rule_id}

Xóa một quy tắc chính sách hoặc tạo một thay đổi xóa quy tắc đang chờ phê duyệt.

Tham số đường dẫn

  • Name
    workspace_id
    Type
    string
    Description

    UUID của workspace.

  • Name
    rule_id
    Type
    string
    Description

    UUID của quy tắc.

Dữ liệu phản hồi

  • Name
    data
    Type
    Mutation response
    Description

    Phản hồi thay đổi quy tắc.

Request

DELETE
/workspaces/{workspace_id}/policies/rules/{rule_id}
curl -X DELETE https://api.fystack.io/api/v1/workspaces/{workspace_id}/policies/rules/{rule_id} \
  -H "ACCESS-API-KEY: your_api_key" \
  -H "ACCESS-TIMESTAMP: 1667836889" \
  -H "ACCESS-SIGN: YourBase64EncodedSignature=="

Mẫu thiết kế

Dùng quy tắc DENY cho các biện pháp kiểm soát cứng: danh sách trừng phạt, người nhận không xác định, mục sổ địa chỉ mới, giới hạn dòng tiền ra dự báo, token không xác định, permit không giới hạn hoặc các phương thức hợp đồng rủi ro cao.

Dùng quy tắc ALLOW một cách hạn chế. ALLOW khớp sẽ bỏ qua phê duyệt, nên điều kiện cần chính xác: giá trị USD thấp, bên khởi tạo đáng tin cậy, ví mục tiêu đã biết, mạng lưới đã biết, và người nhận đã biết kèm kiểm tra tuổi địa chỉ, hoặc hợp đồng và phương thức đã biết.

Kết hợp mỗi ALLOW với một mức trần DENY, chẳng hạn wallet.projected_outflow_24h hoặc workspace.initiator_projected_outflow_24h. Vì DENY luôn được ưu tiên, mức trần này cũng giới hạn luồng tự động phê duyệt.

Giữ các tập chính sách nhỏ và rõ ràng. Chính sách rộng trên toàn workspace hữu ích cho các biện pháp kiểm soát cơ bản, còn chính sách theo phạm vi ví phù hợp hơn khi ví nóng, ví ngân quỹ hoặc ví khách hàng có ngưỡng rủi ro khác nhau.

Xem Mẫu chính sách để có các ví dụ đầy đủ.