POST URBAN社では、Venly APIを使用してNFTの独自マーケットプレイスを制作していました。
Venly APIで用意されているWallet API・NFT API・Market APIを全て使って、誰でも簡単にNFTを作成し、販売できるプラットフォームを作りました。
その際に、どのようにしてVenlyを使ってプラットフォーム構築をしたかは、以下の記事にまとめてあります。
Venly APIを使ったNFT独自マーケットプレイスの作り方
Venly APIの使い方
Venly APIは主に3つのAPI群が用意されてあります。
Wallet API
EthereumやPolygonなどの暗号通貨Walletを簡単に作成し、管理できるAPIです。
NFT API
NFTを作成するためのERC 1155スマートコントラクトを作成し、NFTメタデータを登録し、NFTをMint(作成)できるAPIが揃っています。
Market API
NFTマーケットプレイスを作成するのに便利な、NFTを販売できるAPIが用意されています。
これらの3つのAPIを使用すれば基本的にはNFTに関するほとんどの機能を実現できます。
Venly APIの認証
上記の3つのAPIを使うために、事前に運営から配布されたClient IDとClient SecretからAPIのAccess Tokenを取得して、認証する必要があります。
今回は、その認証を簡単にできるようにするRuby(Ruby on Rails)のクラスを解説していきます。
公式ドキュメント:How to authenticate - Venly API
Venly APIは全て基本的にBearer認証を使用してアクセスする必要があります。
そこで、各APIを叩く前にBearer用のTokenを取得します。
Bearer Tokenを取得する
公式ドキュメント:How to get a Bearer token - Venly API
Venlyに登録するとAPI使用用のClient IDとClient Secretが配布されます。
それらを使用してBearer Tokenを取得します。
今回は、RubyでPOSTリクエストを送信するために、Faraday を使用します。
まず、リクエスト用のclientを取得するメソッドを作ります。
def client(domain)
url = URI::Generic.build(scheme: "https", host: domain).to_s
Faraday.new(url: url) do |faraday|
faraday.adapter :net_http
faraday.response :json
end
end
これで、準備ができました。
Bearer Tokenを取得するAPIのエンドポイントは /auth/realms/Arkane/protocol/openid-connect/token です。
また、POSTするパラメータが3つ必要です。
CLIENT_ID = "Testaccount-capsule"
CLIENT_SECRET = ".................."
params = {
grant_type: "client_credentials", # これは固定でこの値
client_id: CLIENT_ID,
client_secret: CLIENT_SECRET
}
また、リクエストヘッダーで Content-Type を application/x-www-form-urlencoded にして送ります。
headers = {
"Content-Type": "application/x-www-form-urlencoded"
}
これらをメソッドにまとめます。
DOMAIN = "login-staging.arkane.network"
CLIENT_ID = "Testaccount-capsule"
CLIENT_SECRET = ".................."
def request_access_token
path = "/auth/realms/Arkane/protocol/openid-connect/token"
params = {
grant_type: "client_credentials",
client_id: CLIENT_ID,
client_secret: CLIENT_SECRET,
}
headers = {
"Content-Type": "application/x-www-form-urlencoded"
}
res = client(DOMAIN).post(path, params.to_query, headers)
return nil unless res.success?
res.body
end
これを叩くとこのようなレスポンスが返却されます。
{
"access_token" => "ey.........",
"expires_in" => 300,
"refresh_expires_in" => 3456000,
"refresh_token" => "ey.........",
"token_type" => "bearer",
"not-before-policy" => 1572970662,
"session_state" => "a2f27eb2-b741-4a18-b8be-9501d850fd7a",
"scope" => "view:wallets whitelabel market:buy:sale export:wallets email use:all-wallets sign:wallets view:profile market:create:sale save:transaction profile"
}
この access_token をBearer Tokenとして使います。
アクセストークンには使用期限(expires_in)が設けられているので、使用期限が切れると再取得する必要があります。
これをRailsのキャッシュシステムを使用して一定期間だけキャッシュし、期限が切れた時だけ再度アクセストークンを取得するようにします。
CACHE_KEY = "/venly/auth/access_token"
def get_accress_token
Rails.cache.fetch(CACHE_KEY, expires_in: 300.second) do
request_access_token
end
end
これでget_access_tokenを使えば、必要なタイミングで都度アクセストークンを取得し直してくれるようになります。
試しにEthereumの現在のガス代を取得する
Ethereumの現在のガス代を取得するエンドポイントを試しに叩いてみます。(https://docs.venly.io/api/api-products/wallet-api/get-fees)
def get_fees
path = "/api/transactions/ETHEREUM/fees"
params = {}
headers = {
"Authorization": "Bearer #{get_accress_token}"
}
res = client(DOMAIN).get(path, params, headers)
return nil unless res.success?
res.body
end
# get_feesを叩くと以下のレスポンスが返ってくる
{
"success" => true, "result" => [{
"gasPrice" => 310200000000,
"defaultPrice" => false
}, {
"gasPrice" => 353100000000,
"defaultPrice" => true
}, {
"gasPrice" => 445500000000,
"defaultPrice" => false
}, {
"gasPrice" => 479600000000,
"defaultPrice" => false
}]
}
いかがでしたでしょうか。
このようにして、REST API形式で用意されているVenlyのAPIを叩くために必要なAccess Tokenを取得できるようになりました。
ここまで出来れば、あとはAuthorizationヘッダーにセットして使いたいAPIを叩けばVenly APIが好きに使えます。
是非お試しください。
Good Luck Have Fun :)