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.
DENYsẽ chặn yêu cầu.ALLOWkhớ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ý.
DENYghi nhận hoạt động làdenied_by_policy.ALLOWkhớ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_signhoặceth_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,descriptiontùy chọn vàis_enabledtù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ả:
- Nếu bất kỳ quy tắc khớp nào có
effect: "DENY", hành động sẽ bị chặn. - 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. - 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,proposerhoặcviewer.
- Name
- principal.initiator_type
- Type
- string
- Description
usercho phiên web, hoặcapi_keycho 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_idthay 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_tankhoặcdeployment.
- Name
- wallet.type
- Type
- string
- Description
Loại ví nguồn.
standardhoặcmpc.
- Name
- context.hour
- Type
- integer
- Description
Giờ UTC tại thời điểm đánh giá, từ
0đến23.
- Name
- context.day_of_week
- Type
- string
- Description
Tên ngày trong tuần theo UTC, ví dụ
MondayhoặcSaturday.
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,ETHhoặcBTC.
- 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_usdvàasset_symbolsẽ 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
tocủ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.
transfercủa ERC-20 cung cấptovà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_signhoặceth_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
truevớ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
truevới các allowance giá trị tối đa (2159 trở lên, hoặc DAI permit có đặtallowed).
- 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.
0khi 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
truekhi 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,activehoặcinactive.
- 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_callhoặcweb3.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
ALLOWhoặcDENY.
- 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à
truekhi 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_approvalhoặcdeleted, 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
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
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
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_callhoặcweb3.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
ALLOWhoặcDENY. Quy tắcweb3.sign_messagechỉ hỗ trợ từ chối.
Dữ liệu phản hồi
- Name
- valid
- Type
- boolean
- Description
truekhi nội dung quy tắc hợp lệ.
Request
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
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
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
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,activehoặcinactive.
- 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
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
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
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
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
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
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
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
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
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
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
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
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
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
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_callhoặcweb3.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
ALLOWhoặcDENY. Quy tắcweb3.sign_messagechỉ 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
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
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
ALLOWhoặcDENY.
- 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
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
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
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 đủ.