Actions & Blinks程式實踐

閱讀時間約 10 分鐘

上篇瞭解完整個工作流程後,我們就來學習如何用程式碼構建屬於自己的Actions & Blinks吧!其實身為開發者,需要做的只有一件事:部署自己的後端伺服器用來接收GET/POST requests!這邊提供簡單的範例程式碼可以參考!

因為Actions & Blinks是一個有特定規範的服務,所以在接下來的程式碼講解中我不會帶到太多邏輯,只會介紹格式該怎麼設置。首先我們來講解GET函式中的架構。

在GET中我們主要是希望Actions Provider回傳要顯示的精美小視窗內容,而這必須符合特定格式(ActionGetResponse)的Response如下,其中每個欄位的意義寫在註解中:

const requestUrl = new URL(req.url);

const payload: ActionGetResponse = {

title: "Your title",

icon: new URL("/path-of-the-icon-file ", requestUrl.origin).toString(), // the path of icon should be the path under /public

description: "Your description",

label: "Does not matter", // this value will be ignored since `links.actions` exists

links: {

actions: [

{

label: "", // button text

href: `${baseHref}&amount=${"1"}`, //when user click the button, send a POST req to this url

},

{

label: "Send SOL", // button text

href: `${baseHref}token_amount={amount}`, // this href will have a text input and bring the variable

parameters: [ // if we have multiple parameters, there will be multiple lines of input, but only one button

{ // the input value will be the value of variable

name: "amount", // variableconst body: ActionPostRequest = await req.json();

// Validate to confirm the user publickey received is valid before use

let account: PublicKey;

try {

account = new PublicKey(body.account);

} catch (err) {

return new Response('Invalid "account" provided', {

status: 400,

headers: ACTIONS_CORS_HEADERS, //Must include CORS HEADERS

});

} name in the `href` above

label: "Enter the amount of SOL to send", // placeholder of the text input

required: true,

},

],

},

],

},

};

最終將payload包起來傳回去即可:

return Response.json(payload, {

headers,

});

在GET的外面要記得加上下面這段!不然會遇到CORS問題導致瀏覽器阻擋(不知道CORS是什麼沒關係,記得加上就對了!後面有一些其他設定也都是為了CORS)

export const OPTIONS = async (req: Request) => {

return new Response(null, { headers });

};

至此我們就成功建好GET的形式啦~其實很多地方都照抄格式即可,是不是很容易呀~


接著來看POST,我們知道在GET中的action在使用者點擊後會發送一POST req到對應的href(用同一個url帶入參數即可),所以我們的POST就是要處理使用者點擊後我們希望他的錢包做的事情,首先會用以下程式碼獲取使用者的錢包地址(account):

const body: ActionPostRequest = await req.json();

let account: PublicKey;

try {

account = new PublicKey(body.account);

} catch (err) {

return new Response('Invalid "account" provided', {

status: 400,

headers: ACTIONS_CORS_HEADERS, //Must include CORS HEADERS

});

}

接著我們要獲取透過url傳過來的參數值(此範例中是password),用以下的程式碼即可:

const params = new URL(req.url).searchParams;

const password = params.get("password");

在獲使用者選擇的參數後,我們就可以任意的編寫我們的程式碼,如同一般我們用@solana/web3.js製造transaction一樣。在範例程式中我們根據已經部署好的鏈上合約創建了一連串的instructions(airdropInstruction),至於中間如何創建instruction就不在今天的範圍內,是需要根據不同的鏈上合約來變化的。總之包完instructions後利用下面這段程式碼包成transaction,並設定好recentBlockhash & feePayer

const transaction = new Transaction().add(airdropInstruction);

transaction.recentBlockhash = (

await connection.getLatestBlockhash()

).blockhash;

transaction.feePayer = account;

最後回傳Response如下格式即可:

const payload: ActionPostResponse = await createPostResponse({

fields: {

transaction,

message: "Successfully claimed!",

},

});

return Response.json(payload, {

headers: ACTIONS_CORS_HEADERS,

});

到此我們終於建立好我們API entry了。最後別忘了加入 /app/actions.json/route.ts這也是為了避免CORS問題,可以照範例程式碼直接複製貼上就好!

至此我們終於大功告成。如果要測試我們的程式碼是否正確,可以到此網址,記得修改API route和port number:https://dial.to?action=solana-action : http:/ localhost: 3000/api/actions/your_api_route,還有一個重點是如果你的合約是部署在devnet上的話,要改用這個domain:https://dial.to/devnet才會正常呼叫到合約喔!


1會員
5內容數
留言0
查看全部
發表第一個留言支持創作者!
你可能也想看
Thumbnail
1.加權指數與櫃買指數 週五的加權指數在非農就業數據開出來後,雖稍微低於預期,但指數仍向上噴出,在美股開盤後於21500形成一個爆量假突破後急轉直下,就一路收至最低。 台股方面走勢需觀察週一在斷頭潮出現後,週二或週三開始有無買單進場支撐,在沒有明確的反轉訊號形成前,小夥伴盡量不要貿然抄底,或是追空
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
在上一篇part 1的文章中簡單的介紹了什麼是Solana Actions & Blinks後,這篇我來詳細一點介紹一下Solana Actions以開發者的角度來看是怎麼樣子的。
Thumbnail
Solana 和 Dialect 共同推出了一個名為「Actions and Blinks」的新概念,這個概念使得用戶可以通過瀏覽器插件實現一鍵 Swap、投票、捐贈、Mint 等功能。
Thumbnail
2023年過去了,有沒有回頭看看年初設定的目標達到了多少? 不管在工作上還是在生活中,當我們想要嘗試去突破自己的瓶頸,或是想達到某個成就時,你們想過,最困難的一件事是甚麼嗎?  「我的答案是,對自己嚴格。」 
Thumbnail
如何不需要使用指標也可以找到超買超賣區? 是想,如果你現在是Smart Money ,你依然會遵守一個簡單的原則,買在便宜的地方(Discount)/ 賣再貴的地方(Premuim)更延伸的說,不再貴的地方買多,不在便宜的地方做空。 思考步驟 找出你的交易區間,高低點 高低點劃分一半,上半部
Thumbnail
本次的展演恰如其名,科技劇場《無聲的戰爭 Silent Warfare》以東方墨家思想「兼愛非攻」思想及西方典故《聖誕節休戰》為核心,呼應著當前戰火未歇的烏俄戰爭,以及硝煙初升的以巴衝突,不僅因呼籲和平的重要性外,也回應與反思現代人們面臨智能科技所帶來的資訊焦慮及被
Thumbnail
Entry 通則: 所有的進場訊號的都有一個公式可以套入(ICT 2022 ICT mentorship)這邊的概念都在前面的基礎建設說明過了,這邊就請各位要開始把拚圖組起來了 Raid/Purged :要有明顯的Liquidity taken 如果套入MXMM的模型去看的話,就是在Smart
Thumbnail
這是我跟chatgpt協作整理出來的一些知識: 蠻神奇的事情是我記得CHATGPT無法連網,他居然能知道我這個專案是做 投資建議訊號推送的telegrambot機器人,我完全沒有頭緒他怎麼知道的
Thumbnail
不過因為網站和 repo 都是託管在 GitHub,就想說是不是可以直接在 GitHub 上讓他自動部署就好,我只要把文件上傳上去,接著 CI 就幫我弄好了。剛好之前 GitHub 就有推出 GitHub Actions,就是 GitHub 自己的 CI/CD 服務。剛好可以來試試看,
Thumbnail
1.加權指數與櫃買指數 週五的加權指數在非農就業數據開出來後,雖稍微低於預期,但指數仍向上噴出,在美股開盤後於21500形成一個爆量假突破後急轉直下,就一路收至最低。 台股方面走勢需觀察週一在斷頭潮出現後,週二或週三開始有無買單進場支撐,在沒有明確的反轉訊號形成前,小夥伴盡量不要貿然抄底,或是追空
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
在上一篇part 1的文章中簡單的介紹了什麼是Solana Actions & Blinks後,這篇我來詳細一點介紹一下Solana Actions以開發者的角度來看是怎麼樣子的。
Thumbnail
Solana 和 Dialect 共同推出了一個名為「Actions and Blinks」的新概念,這個概念使得用戶可以通過瀏覽器插件實現一鍵 Swap、投票、捐贈、Mint 等功能。
Thumbnail
2023年過去了,有沒有回頭看看年初設定的目標達到了多少? 不管在工作上還是在生活中,當我們想要嘗試去突破自己的瓶頸,或是想達到某個成就時,你們想過,最困難的一件事是甚麼嗎?  「我的答案是,對自己嚴格。」 
Thumbnail
如何不需要使用指標也可以找到超買超賣區? 是想,如果你現在是Smart Money ,你依然會遵守一個簡單的原則,買在便宜的地方(Discount)/ 賣再貴的地方(Premuim)更延伸的說,不再貴的地方買多,不在便宜的地方做空。 思考步驟 找出你的交易區間,高低點 高低點劃分一半,上半部
Thumbnail
本次的展演恰如其名,科技劇場《無聲的戰爭 Silent Warfare》以東方墨家思想「兼愛非攻」思想及西方典故《聖誕節休戰》為核心,呼應著當前戰火未歇的烏俄戰爭,以及硝煙初升的以巴衝突,不僅因呼籲和平的重要性外,也回應與反思現代人們面臨智能科技所帶來的資訊焦慮及被
Thumbnail
Entry 通則: 所有的進場訊號的都有一個公式可以套入(ICT 2022 ICT mentorship)這邊的概念都在前面的基礎建設說明過了,這邊就請各位要開始把拚圖組起來了 Raid/Purged :要有明顯的Liquidity taken 如果套入MXMM的模型去看的話,就是在Smart
Thumbnail
這是我跟chatgpt協作整理出來的一些知識: 蠻神奇的事情是我記得CHATGPT無法連網,他居然能知道我這個專案是做 投資建議訊號推送的telegrambot機器人,我完全沒有頭緒他怎麼知道的
Thumbnail
不過因為網站和 repo 都是託管在 GitHub,就想說是不是可以直接在 GitHub 上讓他自動部署就好,我只要把文件上傳上去,接著 CI 就幫我弄好了。剛好之前 GitHub 就有推出 GitHub Actions,就是 GitHub 自己的 CI/CD 服務。剛好可以來試試看,