Nhảy đến nội dung chính
Change page

Tiêu chuẩn Token có thể thanh toán ERC-1363

Lần cập nhật trang lần cuối: 4 tháng 4, 2025

Giới thiệu

ERC-1363 là gì?

ERC-1363 là một giao diện mở rộng cho các token ERC-20, hỗ trợ thực thi logic tùy chỉnh trên hợp đồng của người nhận sau khi chuyển token hoặc trên hợp đồng của người chi tiêu sau khi phê duyệt, tất cả chỉ trong một giao dịch duy nhất.

Sự khác biệt so với ERC-20

Các hoạt động ERC-20 tiêu chuẩn như transfer, transferFromapprove không cho phép thực thi mã trên hợp đồng của người nhận hoặc người chi tiêu mà không cần một giao dịch riêng biệt. Điều này tạo ra sự phức tạp trong quá trình phát triển giao diện người dùng và rào cản trong việc áp dụng vì người dùng phải đợi giao dịch đầu tiên được thực thi rồi mới gửi giao dịch thứ hai. Họ cũng phải trả GAS hai lần.

ERC-1363 giúp các token có thể thay thế thực hiện các hành động dễ dàng hơn và hoạt động mà không cần sử dụng bất kỳ trình lắng nghe ngoài chuỗi nào. Nó cho phép thực hiện một lệnh gọi lại trên hợp đồng của người nhận hoặc người chi tiêu, sau một lần chuyển hoặc một lần phê duyệt, trong một giao dịch duy nhất.

Điều kiện tiên quyết

Để hiểu rõ hơn về trang này, chúng tôi khuyên bạn nên đọc trước về:

Nội dung

ERC-1363 giới thiệu một Giao diện Lập trình Ứng dụng tiêu chuẩn cho các token ERC-20 để tương tác với các hợp đồng thông minh sau khi transfer, transferFrom hoặc approve.

Tiêu chuẩn này cung cấp chức năng cơ bản để chuyển token, cũng như cho phép token được phê duyệt để chúng có thể được chi tiêu bởi một bên thứ ba khác trên chuỗi, và sau đó thực hiện một lệnh gọi lại trên hợp đồng của người nhận hoặc người chi tiêu.

Có nhiều mục đích sử dụng được đề xuất của các hợp đồng thông minh có thể chấp nhận các lệnh gọi lại ERC-20.

Các ví dụ có thể là:

  • Bán token huy động vốn: token được gửi đi sẽ kích hoạt việc phân bổ phần thưởng ngay lập tức.
  • Dịch vụ: thanh toán kích hoạt quyền truy cập dịch vụ trong một bước.
  • Hóa đơn: token tự động thanh toán hóa đơn.
  • Đăng ký: việc phê duyệt mức phí hàng năm sẽ kích hoạt đăng ký trong khoản thanh toán của tháng đầu tiên.

Vì những lý do này, nó ban đầu được đặt tên là "Token có thể thanh toán".

Hành vi gọi lại còn mở rộng hơn nữa tiện ích của nó, cho phép các tương tác liền mạch như:

  • Góp cổ phần: token được chuyển sẽ kích hoạt việc khóa tự động trong một hợp đồng góp cổ phần.
  • Bỏ phiếu: token nhận được sẽ ghi nhận phiếu bầu trong một hệ thống quản trị.
  • Hoán đổi: việc phê duyệt token sẽ kích hoạt logic hoán đổi trong một bước duy nhất.

Các token ERC-1363 có thể được sử dụng cho các tiện ích cụ thể trong mọi trường hợp yêu cầu thực thi một lệnh gọi lại sau khi nhận được một lần chuyển hoặc một lần phê duyệt. ERC-1363 cũng hữu ích để tránh mất token hoặc khóa token trong các hợp đồng thông minh bằng cách xác minh khả năng xử lý token của người nhận.

Không giống như các đề xuất mở rộng ERC-20 khác, ERC-1363 không ghi đè các phương thức transfertransferFrom của ERC-20 và xác định các ID giao diện cần được triển khai để duy trì khả năng tương thích ngược với ERC-20.

Từ EIP-1363 (opens in a new tab):

Các phương thức

Các hợp đồng thông minh triển khai tiêu chuẩn ERC-1363 PHẢI triển khai tất cả các hàm trong giao diện ERC1363, cũng như các giao diện ERC20ERC165.

1pragma solidity ^0.8.0;
2
3/**
4 * @title ERC1363
5 * @dev Một giao diện mở rộng cho các token ERC-20 hỗ trợ thực thi mã trên hợp đồng của người nhận
6 * sau `transfer` hoặc `transferFrom`, hoặc mã trên hợp đồng của người chi tiêu sau `approve`, trong một giao dịch duy nhất.
7 */
8interface ERC1363 is ERC20, ERC165 {
9 /*
10 * LƯU Ý: mã định danh ERC-165 cho giao diện này là 0xb0202a11.
11 * 0xb0202a11 ===
12 * bytes4(keccak256('transferAndCall(address,uint256)')) ^
13 * bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^
14 * bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^
15 * bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^
16 * bytes4(keccak256('approveAndCall(address,uint256)')) ^
17 * bytes4(keccak256('approveAndCall(address,uint256,bytes)'))
18 */
19
20 /**
21 * @dev Di chuyển một lượng token `value` từ tài khoản của người gọi đến `to`
22 * và sau đó gọi `ERC1363Receiver::onTransferReceived` trên `to`.
23 * @param to Địa chỉ mà token đang được chuyển đến.
24 * @param value Số lượng token sẽ được chuyển.
25 * @return Một giá trị boolean cho biết hoạt động đã thành công trừ khi có lỗi.
26 */
27 function transferAndCall(address to, uint256 value) external returns (bool);
28
29 /**
30 * @dev Di chuyển một lượng token `value` từ tài khoản của người gọi đến `to`
31 * và sau đó gọi `ERC1363Receiver::onTransferReceived` trên `to`.
32 * @param to Địa chỉ mà token đang được chuyển đến.
33 * @param value Số lượng token sẽ được chuyển.
34 * @param data Dữ liệu bổ sung không có định dạng cụ thể, được gửi trong lệnh gọi đến `to`.
35 * @return Một giá trị boolean cho biết hoạt động đã thành công trừ khi có lỗi.
36 */
37 function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);
38
39 /**
40 * @dev Di chuyển một lượng token `value` từ `from` đến `to` bằng cơ chế cho phép
41 * và sau đó gọi `ERC1363Receiver::onTransferReceived` trên `to`.
42 * @param from Địa chỉ gửi token.
43 * @param to Địa chỉ mà token đang được chuyển đến.
44 * @param value Số lượng token sẽ được chuyển.
45 * @return Một giá trị boolean cho biết hoạt động đã thành công trừ khi có lỗi.
46 */
47 function transferFromAndCall(address from, address to, uint256 value) external returns (bool);
48
49 /**
50 * @dev Di chuyển một lượng token `value` từ `from` đến `to` bằng cơ chế cho phép
51 * và sau đó gọi `ERC1363Receiver::onTransferReceived` trên `to`.
52 * @param from Địa chỉ gửi token.
53 * @param to Địa chỉ mà token đang được chuyển đến.
54 * @param value Số lượng token sẽ được chuyển.
55 * @param data Dữ liệu bổ sung không có định dạng cụ thể, được gửi trong lệnh gọi đến `to`.
56 * @return Một giá trị boolean cho biết hoạt động đã thành công trừ khi có lỗi.
57 */
58 function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);
59
60 /**
61 * @dev Đặt một lượng token `value` làm mức cho phép của `spender` đối với token của người gọi
62 * và sau đó gọi `ERC1363Spender::onApprovalReceived` trên `spender`.
63 * @param spender Địa chỉ sẽ chi tiêu số tiền.
64 * @param value Số lượng token sẽ được chi tiêu.
65 * @return Một giá trị boolean cho biết hoạt động đã thành công trừ khi có lỗi.
66 */
67 function approveAndCall(address spender, uint256 value) external returns (bool);
68
69 /**
70 * @dev Đặt một lượng token `value` làm mức cho phép của `spender` đối với token của người gọi
71 * và sau đó gọi `ERC1363Spender::onApprovalReceived` trên `spender`.
72 * @param spender Địa chỉ sẽ chi tiêu số tiền.
73 * @param value Số lượng token sẽ được chi tiêu.
74 * @param data Dữ liệu bổ sung không có định dạng cụ thể, được gửi trong lệnh gọi đến `spender`.
75 * @return Một giá trị boolean cho biết hoạt động đã thành công trừ khi có lỗi.
76 */
77 function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);
78}
79
80interface ERC20 {
81 event Transfer(address indexed from, address indexed to, uint256 value);
82 event Approval(address indexed owner, address indexed spender, uint256 value);
83 function transfer(address to, uint256 value) external returns (bool);
84 function transferFrom(address from, address to, uint256 value) external returns (bool);
85 function approve(address spender, uint256 value) external returns (bool);
86 function totalSupply() external view returns (uint256);
87 function balanceOf(address account) external view returns (uint256);
88 function allowance(address owner, address spender) external view returns (uint256);
89}
90
91interface ERC165 {
92 function supportsInterface(bytes4 interfaceId) external view returns (bool);
93}
Hiện tất cả

Một hợp đồng thông minh muốn chấp nhận token ERC-1363 thông qua transferAndCall hoặc transferFromAndCall PHẢI triển khai giao diện ERC1363Receiver:

1/**
2 * @title ERC1363Receiver
3 * @dev Giao diện cho bất kỳ hợp đồng nào muốn hỗ trợ `transferAndCall` hoặc `transferFromAndCall` từ các hợp đồng token ERC-1363.
4 */
5interface ERC1363Receiver {
6 /**
7 * @dev Bất cứ khi nào token ERC-1363 được chuyển đến hợp đồng này qua `ERC1363::transferAndCall` hoặc `ERC1363::transferFromAndCall`
8 * bởi `operator` từ `from`, hàm này sẽ được gọi.
9 *
10 * LƯU Ý: Để chấp nhận việc chuyển, hàm này phải trả về
11 * `bytes4(keccak256(\"onTransferReceived(address,address,uint256,bytes)\"))`
12 * (tức là 0x88a7ca5c, hoặc bộ chọn hàm của chính nó).
13 *
14 * @param operator Địa chỉ đã gọi hàm `transferAndCall` hoặc `transferFromAndCall`.
15 * @param from Địa chỉ mà từ đó token được chuyển đi.
16 * @param value Số lượng token được chuyển.
17 * @param data Dữ liệu bổ sung không có định dạng cụ thể.
18 * @return `bytes4(keccak256(\"onTransferReceived(address,address,uint256,bytes)\"))` nếu việc chuyển được cho phép trừ khi có lỗi.
19 */
20 function onTransferReceived(address operator, address from, uint256 value, bytes calldata data) external returns (bytes4);
21}
Hiện tất cả

Một hợp đồng thông minh muốn chấp nhận token ERC-1363 thông qua approveAndCall PHẢI triển khai giao diện ERC1363Spender:

1/**
2 * @title ERC1363Spender
3 * @dev Giao diện cho bất kỳ hợp đồng nào muốn hỗ trợ `approveAndCall` từ các hợp đồng token ERC-1363.
4 */
5interface ERC1363Spender {
6 /**
7 * @dev Bất cứ khi nào một `owner` token ERC-1363 phê duyệt hợp đồng này qua `ERC1363::approveAndCall`
8 * để chi tiêu token của họ, hàm này sẽ được gọi.
9 *
10 * LƯU Ý: Để chấp nhận việc phê duyệt, hàm này phải trả về
11 * `bytes4(keccak256(\"onApprovalReceived(address,uint256,bytes)\"))`
12 * (tức là 0x7b04a2d0, hoặc bộ chọn hàm của chính nó).
13 *
14 * @param owner Địa chỉ đã gọi hàm `approveAndCall` và trước đây đã sở hữu các token.
15 * @param value Số lượng token sẽ được chi tiêu.
16 * @param data Dữ liệu bổ sung không có định dạng cụ thể.
17 * @return `bytes4(keccak256(\"onApprovalReceived(address,uint256,bytes)\"))` nếu việc phê duyệt được cho phép trừ khi có lỗi.
18 */
19 function onApprovalReceived(address owner, uint256 value, bytes calldata data) external returns (bytes4);
20}
Hiện tất cả

Đọc thêm

Bài viết này hữu ích không?