0%

【Discord Bot】03: Monitor Smart Contract Event

前兩篇介紹完Discord bot的基本概念後,接下來就是根據case不同去做的進階功能,當初會寫bot也是在玩NFT需要,心血來潮就寫了一個可以監聽鏈上合約的bot,這篇會教學如何實踐這樣的功能。

Install Libraries

因為要到區塊鏈上互動,所以需要先安裝一些library:

1
2
npm install web3
npm install --save dotenv // to use .env file in project

取得Web3節點

我們需要一個節點才能夠和鏈上合約交互,具體原理就不細講,有興趣可以去找相關資料。建立節點的方式有很多,可以用local端,也可以使用別人提供的API去連結,像是AlchemyInfura,這篇以Alchemy為例(原理基本上大同小異)。

首先需要註冊會員,用gmail綁定就可以,註冊完畢後點選create app,network選擇你要監聽合約的鏈。(若有選擇方案的畫面,選擇免費的就可以了,很夠用的)

圖一、建立一個app

完成後就可以在Apps中看到你的App,點選VIEW KEY並將HTTPS中的URL複製起來,在根目錄新增 .env 檔設定環境變數。

1
ALCHEMY_URL=https://eth-mainnet.g.alchemy.com/v2/{YOUR-API-KEY}

檢查是否吃得到環境變數:

1
2
3
require('dotenv').config();

console.log(process.env.ALCHEMY_URL);

建立指令

在我這個case,我需要去察看合約上某個NFT是否正在質押,因此利用 query 指令去查詢NFT質押狀態,在 commands/ 底下新增 query.js:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
const { SlashCommandBuilder } = require('discord.js');

const contractAddress = "0xF10A5F9FEEF5b3C52C7ca71dC11e467B727C7222";
const contractABI = [
{
"inputs":[
{
"internalType":"uint256",
"name":"tokenId",
"type":"uint256"
}
],
"name":"revvingPeriod",
"outputs":[
{
"internalType":"bool",
"name":"revving",
"type":"bool"
},
{
"internalType":"uint256",
"name":"current",
"type":"uint256"
},
{
"internalType":"uint256",
"name":"total",
"type":"uint256"
}
],
"stateMutability":"view",
"type":"function"
}
];

require('dotenv').config();

const Web3 = require("web3");
const web3 = new Web3(process.env.ALCHEMY_URL); // 利用Alchemy建立與區塊鏈的連結
const NFT = new web3.eth.Contract(contractABI, contractAddress); // 利用地址與ABI訪問合約

module.exports = {
data: new SlashCommandBuilder()
.setName('query')
.setDescription('Query staking NFT!')
.addStringOption(option =>
option.setName('id')
.setDescription('ID of NFT')
.setRequired(true)),
async execute(interaction) {
// process your case here

var val = parseInt(interaction.options.get('id').value);

const res = await NFT.methods.revvingPeriod(val).call(function (err, res) {
if (err) {
console.log("An error occured", err);
return;
}
});

const staking = res[0];
if(staking){
await interaction.reply('`ID ' + val + ' is staking!`');
}else{
await interaction.reply('`ID ' + val + " isn't staking!`");
}
},
};

contractAddress 就是合約的地址,至於ABI的部分可以上Etherscan,點選contract/code,最底下會有合約的ABI,選擇你需要用到的function就可以了(全部複製也可以)

圖二、找到需要的ABI

完成後將指令deploy一次就可以運行囉,這就是最基本和區塊鏈智慧合約交互的Disocrd bot,目前只有讀取合約的部分,還沒有加入寫合約的功能,以後有需要的話會再更新,不過bot可能會在公開的Server下使用,不太建議利用bot去寫合約(牽涉到私鑰安全性的問題)。

圖三、在Discord上查詢NFT是否正在質押

Discord bot教學系列暫時告一段落,未來有需要或是想看甚麼功能才會再更新了~ ✌

Reference