Royalty
Trong hướng dẫn này bạn sẽ tiếp tục build non-fungible token (NFT) smart contract của mình, và tìm hiểu cách triển khai các perpetual royalty vào các NFT. Việc này sẽ cho phép mọi người nhận được phần trăm của giá mua khi NFT được bán.
Giới thiệu
Bây giờ, bạn sẽ có một NFT contract hoàn chỉnh đầy đủ, ngoại trừ việc hỗ trợ royalty. Để bắt đầu, hãy chuyển sang branch 5.approval
từ GitHub repository của chúng tôi, hoặc tiếp tục công việc của bạn từ các hướng dẫn trước.
git checkout 5.approval
6.royalty
branch. :::Suy nghĩ về vấn đề
Để triển khai tính năng này, trước tiên bạn cần hiểu các NFT được bán như thế nào. Trong bài hướng dẫn trước, bạn đã thấy cách ai đó có một NFT và họ có thể đưa nó lên marketplace bằng cách sử dụng function nft_approve
kèm theo một message có thể được giải mã đúng cách. Khi một user mua NFT của bạn trên marketplace, điều gì sẽ xảy ra?
Sử dụng kiến thức bạn đang có, một kết luận hợp lý sẽ là marketplace transfer NFT tới người mua bằng cách thực hiện một cross-contract call và gọi NFT contract của method nft_transfer
. Khi function đó kết thúc, marketplace sẽ thanh toán cho người bán số tiền đúng bằng người mua đã trả.
Bây giờ hãy nghĩ về cách việc này có thể được mở rộng để cho phép cắt giảm khoản thanh toán cho các account khác không chỉ là người bán.
Mở rộng giải pháp hiện tại
Vì các perpetual royalty sẽ dựa trên cơ sở mỗi token, nên có thể an toàn khi giả định rằng bạn nên thay đổi cấu trúc của Token
và JsonToken
. Bạn cần một số cách để theo dõi tỷ lệ phần trăm nên có của mỗi tài khoản với một royalty. Một mẹo nhỏ là bạn có thể tạo ra một map của một account và một integer.
Bây giờ, bạn cần một vài cách để chuyển tiếp thông tin đó đến marketplace. Phương pháp này sẽ có thể transfer NFT chính xác như giải pháp cũ nhưng với lợi ích được bổ sung là thông báo cho marketplace chính xác những account nào sẽ được thanh toán số tiền bao nhiêu. Nếu bạn triển khai một phương pháp transfer NFT và sau đó tính toán chính xác account nào được thanh toán bao nhiêu dựa trên số dư được truyền vào, đó sẽ là một điều tyệt vời.
Đây là phác thảo của nhưng tiêu chuẩn royalty. Bây giờ hãy tiếp tục và sửa đổi smart contract của chúng ta để thêm vào hành vi này.
Các sửa đổi với contract
Điều đầu tiên bạn sẽ muốn làm là thêm thông tin royalty vào các cấu trúc. Open the nft-contract/src/metadata.ts
file and add royalty
to the Token
and JsonToken
structs:
royalty: { [accountId: string]: number };
Thứ hai, bạn cũng sẽ muốn thêm royalty
tới JsonToken
struct:
Loading...
Internal helper function
royaltyToPayout
To simplify the payout calculation, let's add a helper royaltyToPayout
function to src/internal.ts
. This will convert a percentage to the actual amount that should be paid. In order to allow for percentages less than 1%, you can give 100% a value of 10,000
. This means that the minimum percentage you can give out is 0.01%, or 1
. For example, if you wanted the account benji.testnet
to have a perpetual royalty of 20%, you would insert the pair "benji.testnet": 2000
into the payout map.
Loading...
If you were to use the royaltyToPayout
function and pass in 2000
as the royaltyPercentage
and an amountToPay
of 1 NEAR, it would return a value of 0.2 NEAR.
Các royalty
nft_payout
Bây giờ hãy triển khai một phương pháp để kiểm tra xem những account nào sẽ được thanh toán từ một NFT với một số tiền hoặc một số dư nhất định. Open the nft-contract/src/royalty.ts
file, and modify the internalNftPayout
function as shown.
Loading...
This function will loop through the token's royalty map and take the balance and convert that to a payout using the royaltyToPayout
function you created earlier. Nó sẽ cung cấp cho chủ sở sữu token bất cứ thứ gì còn lại từ tổng các royalty. Ví dụ:
Bạn có một token với royalty field như dưới đây:
Token {
owner_id: "damian",
royalty: {
"benji": 1000,
"josh": 500,
"mike": 2000
}
}
Nếu một user call nft_payout
trên token và truyền vào một số dư là 1 NEAR, nó sẽ loop qua royalty field của token và chèn thông tin dưới đây vào payout object:
Payout {
payout: {
"benji": 0.1 NEAR,
"josh": 0.05 NEAR,
"mike": 0.2 NEAR
}
}
Cuối cùng, nó sẽ chèn damian
vào payout object và đưa cho anh ấy 1 NEAR - 0.1 - 0.05 - 0.2 = 0.65 NEAR
.
nft_transfer_payout
Bây giờ thì bạn đã biết làm cách nào để tính các khoản thanh toán, đã đến lúc tạo function sẽ transfer NFT và trả lại khoản thanh toán cho marketplace.
Loading...
Các perpetual royalty
Để thêm tính năng hỗ trợ cho perpetual royalty, hãy chỉnh sửa file src/mint.ts
. Đầu tiên, thêm một tham số tùy chọn cho perpetual royalty. Điều này sẽ xác định tỷ lệ phần trăm sẽ được chuyển vào các account khi NFT được mua. Bạn cũng cần tạo và chèn royalty vào trong Token
object:
Loading...