Khi tham gia vào các nền tảng tài chính phi tập trung (DeFi), việc sử dụng và quản lý các token đóng một vai trò quan trọng. Trong quá trình tham gia vào các giao dịch DeFi, bạn sẽ thường xuyên gặp phải các bước “approve” và “stake” token. Đây là hai hoạt động cơ bản nhưng lại có thể gây nhầm lẫn cho người mới tham gia. Trong bài viết này, chúng ta sẽ tìm hiểu về đoạn mã JavaScript dành cho việc approve và stake token trong môi trường DeFi, cùng với việc giải thích từng dòng code để hiểu rõ hơn về cách hoạt động của chúng.
Hàm Approve Token
async function approveTokenSpend(_mint_fee_wei, sClass) {
let gasEstimation;
try {
gasEstimation = await oContractToken.methods.approve(_CONTRACT_DATA[_NETWORK_ID].STACKING[sClass].address, _mint_fee_wei).estimateGas({
from: selectedAccount
});
console.log('gasEstimation', gasEstimation);
} catch (error) {
console.log(error);
showHideBtnsVal('#stake-btn', true);
notyf.error(formatEthErrorMsg(error));
return;
}
oContractToken.methods.approve(_CONTRACT_DATA[_NETWORK_ID].STACKING[sClass].address, _mint_fee_wei)
.send({
from: selectedAccount,
gas: gasEstimation
})
.on('transactionHash', (hash) => {
console.log("Transaction Hash: ", hash);
})
.on('receipt', (receipt) => {
console.log(receipt);
stackTokenMain(_mint_fee_wei, sClass);
})
.catch((error) => {
console.log(error);
notyf.error(formatEthErrorMsg(error));
showHideBtnsVal('#stake-btn', true);
return;
});
}
Đây là một đoạn mã JavaScript có tên hàm là approveTokenSpend
. Hàm này nhận vào hai tham số là _mint_fee_wei
và sClass
. Đoạn mã này có thể được sử dụng trong một ứng dụng blockchain để thực hiện việc chấp thuận chi tiêu token.
Dưới đây là giải thích chi tiết cho từng dòng trong đoạn mã:
async function approveTokenSpend(_mint_fee_wei, sClass) {
: Khai báo hàmapproveTokenSpend
với hai tham số đầu vào là_mint_fee_wei
vàsClass
. Hàm này được đánh dấu làasync
, có nghĩa là nó sẽ trả về mộtPromise
và có thể sử dụng từ khóaawait
bên trong hàm.let gasEstimation;
: Khai báo biếngasEstimation
để lưu trữ ước tính chi phí gas cho giao dịch.try {
: Bắt đầu một khối lệnhtry
để bắt lỗi nếu có.gasEstimation = await oContractToken.methods.approve(_CONTRACT_DATA[_NETWORK_ID].STACKING[sClass].address, _mint_fee_wei).estimateGas({
: Gọi phương thứcapprove
của đối tượngoContractToken
để chấp thuận chi tiêu token. Sử dụng phương thứcestimateGas
để ước tính chi phí gas cho giao dịch và lưu kết quả vào biếngasEstimation
.from: selectedAccount
: Thiết lập thuộc tínhfrom
của đối tượng truyền vào phương thứcestimateGas
bằng giá trị của biếnselectedAccount
.});
: Kết thúc khối lệnh truyền vào phương thứcestimateGas
.console.log('gasEstimation', gasEstimation);
: In ra giá trị của biếngasEstimation
để kiểm tra.} catch (error) {
: Bắt đầu một khối lệnhcatch
để xử lý lỗi nếu có.console.log(error);
: In ra thông tin lỗi.showHideBtnsVal('#stake-btn', true);
: Gọi hàmshowHideBtnsVal
với hai tham số đầu vào là chuỗi selector cho nút stake và giá trị boolean để hiển thị hoặc ẩn nút.notyf.error(formatEthErrorMsg(error));
: Gọi hàmformatEthErrorMsg
với tham số đầu vào là đối tượng lỗi và truyền kết quả vào phương thứcerror
của đối tượngnotyf
để hiển thị thông báo lỗi.return;
: Thoát khỏi hàm.
Hàm Stake Token
async function stackTokenMain(_amount_wei, sClass) {
let gasEstimation;
let oContractStacking = getContractObj(sClass);
try {
gasEstimation = await oContractStacking.methods.stake(_amount_wei).estimateGas({
from: selectedAccount
});
console.log('gasEstimation', gasEstimation);
} catch (error) {
console.log(error);
notyf.error(formatEthErrorMsg(error));
showHideBtnsVal('#stake-btn', true);
return;
}
oContractStacking.methods.stake(_amount_wei)
.send({
from: selectedAccount,
gas: gasEstimation
})
.on('transactionHash', (hash) => {
console.log("Transaction Hash: ", hash);
})
.on('receipt', (receipt) => {
$('#amount-to-stack').val('');
console.log(receipt);
showHideBtnsVal('#stake-btn', true);
// refreshBal(sClass);
loadInitialData(sClass);
})
.catch((error) => {
console.log(error);
showHideBtnsVal('#stake-btn', true);
notyf.error(formatEthErrorMsg(error));
return;
});
}
Đây là một đoạn mã JavaScript có tên hàm là stackTokenMain
. Hàm này nhận vào hai tham số là _amount_wei
và sClass
. Đoạn mã này có thể được sử dụng trong một ứng dụng blockchain để thực hiện việc stake token.
Dưới đây là giải thích chi tiết cho từng dòng trong đoạn mã:
async function stackTokenMain(_amount_wei, sClass) {
: Khai báo hàmstackTokenMain
với hai tham số đầu vào là_amount_wei
vàsClass
. Hàm này được đánh dấu làasync
, có nghĩa là nó sẽ trả về mộtPromise
và có thể sử dụng từ khóaawait
bên trong hàm.let gasEstimation;
: Khai báo biếngasEstimation
để lưu trữ ước tính chi phí gas cho giao dịch.let oContractStacking = getContractObj(sClass);
: Khai báo biếnoContractStacking
và gán giá trị trả về của hàmgetContractObj
với tham số đầu vào làsClass
.try {
: Bắt đầu một khối lệnhtry
để bắt lỗi nếu có.gasEstimation = await oContractStacking.methods.stake(_amount_wei).estimateGas({
: Gọi phương thứcstake
của đối tượngoContractStacking
để stake token. Sử dụng phương thứcestimateGas
để ước tính chi phí gas cho giao dịch và lưu kết quả vào biếngasEstimation
.from: selectedAccount
: Thiết lập thuộc tínhfrom
của đối tượng truyền vào phương thứcestimateGas
bằng giá trị của biếnselectedAccount
.});
: Kết thúc khối lệnh truyền vào phương thứcestimateGas
.console.log('gasEstimation', gasEstimation);
: In ra giá trị của biếngasEstimation
để kiểm tra.} catch (error) {
: Bắt đầu một khối lệnhcatch
để xử lý lỗi nếu có.console.log(error);
: In ra thông tin lỗi.notyf.error(formatEthErrorMsg(error));
: Gọi hàmformatEthErrorMsg
với tham số đầu vào là đối tượng lỗi và truyền kết quả vào phương thứcerror
của đối tượngnotyf
để hiển thị thông báo lỗi.showHideBtnsVal('#stake-btn', true);
: Gọi hàmshowHideBtnsVal
với hai tham số đầu vào là chuỗi selector cho nút stake và giá trị boolean để hiển thị hoặc ẩn nút.return;
: Thoát khỏi hàm.oContractStacking.methods.stake(_amount_wei)
: Gọi phương thứcstake
của đối tượngoContractStacking
để stake token..send({
: Gọi phương thứcsend
để gửi giao dịch.from: selectedAccount,
: Thiết lập thuộc tínhfrom
của đối tượng truyền vào phương thứcsend
bằng giá trị của biếnselectedAccount
.gas: gasEstimation
: Thiết lập thuộc tínhgas
của đối tượng truyền vào phương thứcsend
bằng giá trị của biếngasEstimation
.})
: Kết thúc khối lệnh truyền vào phương thứcsend
..on('transactionHash', (hash) => {
: Đăng ký sự kiệntransactionHash
để lắng nghe khi có thông tin về hash của giao dịch.console.log("Transaction Hash: ", hash);
: In ra thông tin về hash của giao dịch.})
: Kết thúc khối lệnh xử lý sự kiệntransactionHash
..on('receipt', (receipt) => {
: Đăng ký sự kiệnreceipt
để lắng nghe khi có thông tin về biên lai của giao dịch.$('#amount-to-stack').val('');
: Đặt giá trị của phần tử HTML có id làamount-to-stack
thành chuỗi rỗng.console.log(receipt);
: In ra thông tin về biên lai của giao dịch.showHideBtnsVal('#stake-btn', true);
: Gọi hàmshowHideBtnsVal
với hai tham số đầu vào là chuỗi selector cho nút stake và giá trị boolean để hiển thị hoặc ẩn nút.loadInitialData(sClass);
: Gọi hàmloadInitialData
với tham số đầu vào làsClass
.})
: Kết thúc khối lệnh xử lý sự kiệnreceipt
..catch((error) => {
: Bắt đầu một khối lệnh để xử lý lỗi nếu có.console.log(error);
: In ra thông tin lỗi.showHideBtnsVal('#stake-btn', true);
: Gọi hàmshowHideBtnsVal
với hai tham số đầu vào là chuỗi selector cho nút stake và giá trị boolean để hiển thị hoặc ẩn nút.notyf.error(formatEthErrorMsg(error));
: Gọi hàmformatEthErrorMsg
với tham số đầu vào là đối tượng lỗi và truyền kết quả vào phương thứcerror
của đối tượngnotyf
để hiển thị thông báo lỗi.
Lưu ý rằng bên trên chỉ là đoạn code javascript, còn phải kết nối với Solidity. Mình sẽ hướng dẫn ở phần khác. Hoặc bạn có thể tham khảo website staking token SGN: https://135web.net/
Như vậy, thông qua việc viết và giải thích đoạn mã JavaScript cho việc approve và stake token, chúng ta đã có cái nhìn rõ ràng hơn về cách thức hoạt động của hai hoạt động quan trọng trong DeFi. Việc sử dụng và quản lý token trong các giao dịch DeFi không chỉ đơn thuần là việc nhấn một vài nút, mà còn đòi hỏi hiểu biết về cách thức giao tiếp với hợp đồng thông minh và xác minh giao dịch của bạn trên blockchain. Hi vọng bài viết này đã giúp bạn hiểu rõ hơn về quy trình approve và stake token, từ đó tạo ra những giao dịch an toàn và hiệu quả trong thế giới DeFi đầy tiềm năng.
Vietnam Pham – Click Digital
- If you’d like to invest in blockchain advertising companies, just BUY token Saigon (SGN) at Pancakeswap: https://t.co/KJbk71cFe8 (do not worry about low liquidity)
- Backed by Click Digital Company
- Enhancing blockchain knowledge
- BSC address: 0xa29c5da6673fd66e96065f44da94e351a3e2af65
- Twitter: https://twitter.com/SaigonSGN135
- Staking SGN: http://135web.net
Digital Marketing Specialist