メインコンテンツまでスキップ

Wallet Provider

1. はじめに

最新バージョン

SDK アクセス(clientId & clientSecret)の取得方法

Unifi Apps SDK を統合するには、Unifi チームから clientIdclientSecret を受け取る必要があります。

手順:

  1. Unifi Apps 申請の提出
  2. 指示に従い、Unifi Apps SDK 利用規約 を確認して提出してください。
  3. 提出したメールアドレス宛に clientIdclientSecret を受け取ります。
警告

絶対に clientSecret を公開しないでください。
漏洩した場合は、テクニカルサポート経由で再発行をリクエストしてください。

プロジェクト設定 & ドメイン登録

  • clientId はドメインが登録されている場合にのみ有効になります。
    • テスト目的では、http://localhost:3000 を使用できます。
    • 外部のテストドメインについては、テクニカルサポートまたはメール経由でホワイトリスト登録をリクエストしてください。
  • paymentProvider による決済には、有効な clientSecret が必要です。

SDK のインストール

npm、yarn、または pnpm を使用して SDK をインストールします。

npm install @linenext/dapp-portal-sdk
# or
yarn add @linenext/dapp-portal-sdk
# or
pnpm add @linenext/dapp-portal-sdk

2. SDK の初期化

SDK の初期化

Unifi Apps が読み込まれるたびに、必ず SDK を初期化する必要があります。

import DappPortalSDK from '@linenext/dapp-portal-sdk'
 
const sdk = await DappPortalSDK.init({
  clientId: '<CLIENT_ID>',
  chainId: '1001', // or '8217' for mainnet
});

パラメータ

NameTypeDescription
clientId*required
stringSDK 申請時に提供された clientId
chainId

stringデフォルト値は 1001(テストネット)です。開発後にメインネットを使用するには、値を 8217(メインネット)に設定してください。

レスポンス

DappPortalSDK オブジェクトを返します。このオブジェクトを通じて以下のメソッドを呼び出すことができます。

警告
LINE MINI App および LINE Login LIFF バージョンに関する注意
  • DappPortalSDK.init() を呼び出すliff.init() を呼び出してください。
  • LINE MINI App または LINE Login LIFF の起動時にウォレット接続(connectWallet)をトリガーしないでください。必要なとき(例:アイテム購入、オンチェーンリワード)にのみ接続してください。
  • これにより、LINE 経由のアクティブユーザーおよびアトリビューションを正確にトラッキングできます。
ヒント
ベストプラクティス
  • SDK は一度だけ初期化し、DappPortalSDK インスタンスをシングルトンとして管理してください。
  • DappPortalSDK.init() を複数回呼び出すことは避けてください。予期しない動作や不具合を引き起こす可能性があります。
デフォルトではシングルトンの使用を強制していません。これはマルチ構成のセットアップ(例:1 つのアプリ内でテストネットメインネットの両方を使用する)を可能にするためです。 そのような場合は、構成ごとに 1 つのシングルトンインスタンス(例:テストネット用に 1 つ、メインネット用に 1 つ)を管理してください。

WalletProvider は EIP-1193 標準に準拠しており、その中で定義されている EventEmitter インターフェースをサポートします。

sdk.getWalletProvider()

walletProvider を初期化し、開発者がさまざまなウォレット機能を利用できるようにします。

const walletProvider = sdk.getWalletProvider();

パラメータ

  • N/A

レスポンス

WalletProvider

walletProvider.getWalletType()

現在接続されているウォレットのタイプを返します。

const walletType = walletProvider.getWalletType();

パラメータ

  • N/A

レスポンス

enum WalletType {
Web = "Web",
Liff = "Liff",
Extension = "Extension",
Mobile = "Mobile",
OKX = "OKX",
BITGET = "BITGET"
}

walletProvider.request()

この関数は、リクエスト時に JSON-RPC API フォーマットを提供します。チェーンの正常性ステータスの取得や、ウォレットでのトランザクション署名のリクエストを送信できます。ウォレット接続の前に送信した場合、ユーザーには接続するウォレットタイプを選択する画面が表示されます。

利用可能な Kaia 関連のメソッド、そのパラメータ、および対応するレスポンスは、以下の表で確認できます。表に含まれていない RPC メソッドはチェーンノードに直接リクエストされます。Kaia docs の RPC API Reference を参照してください。

const getAccount = async() => {
   const accounts = await walletProvider.request({ method: 'kaia_accounts' }) as string[]; 
   return accounts[0]; 
} 
 
const requestAccount = async () => {
   const addresses = await walletProvider.request({ method: 'kaia_requestAccounts' }) as string[];
   return addresses[0];
}
 
const connectAndSign = async (msg:string) => {
   const [account, signature] = await walletProvider.request({ method: 'kaia_connectAndSign', params: [msg]}) as string[];
   return [account, signature];
}
 
const getBalance = async(params: [account:string,blockNumberOrHash:'latest' | 'earliest'])=>{
   return await walletProvider.request({ method: 'kaia_getBalance', params: params });
}
 
const transaction = {
  from: '0xYourWalletAddress', //The currently connected wallet account can be retrieved using the kaia_accounts method.
  to: '0xRecipientAddress', //Please replace it with a valid wallet address.
  value: '0x10',
  gas: '0x5208', //general gas usage for Kaia transaction
};
 
const sendTransaction = async(transaction) => {
    const transactionHash = await walletProvider.request({ method: 'kaia_sendTransaction', params: [transaction]});
    return transactionHash;
};

パラメータ

  • RequestArguments *required · object
    • method *required · string
    • params unknown[]

レスポンス

Promise<unknown>
methodparamsResponses
kaia_accounts

現在ウォレットに接続されているアドレスの一覧を返します。ウォレットが接続されていない場合は、空の配列が返されます。
null
['Account1']
kaia_requestAccounts

ウォレット接続を開始します。処理中に、ユーザーが Wallet Provider を選択するためのウィンドウが表示されます。選択したウォレットに関連付けられたアドレスの一覧を返します。
null
['Account1']
personal_sign (EIP-191)

署名手続きを開始します。OKX Wallet を含むさまざまなウォレットとの互換性を得るため、personal_sign の使用を推奨します。
[message: string, account: string]
"0xa3f20717a250c2b0b729b7e5becbff67fdaef7e0699da4de7ca5895b02a170a12d887fd3b17bfdce3481f10bea41f45ba9f709d39ce8325427b57afcfc994cee1b"
署名
kaia_connectAndSign (EIP-191)recommended

ウォレット接続と署名を開始します。ユーザーに Wallet Provider の選択を促し、指定されたメッセージに署名します。[account, signature] を配列として返します。

[message: string]
["account","0xa3f20717a250c2b0b729b7e5becbff67fdaef7e0699da4de7ca5895b02a170a12d887fd3b17bfdce3481f10bea41f45ba9f709d39ce8325427b57afcfc994cee1b"]
account と signature を配列として
kaia_getBalance

KAIA の残高を返します。
[account: string, blockNumberOrHash: string]

blockNumberOrHash には latest または earliest を設定できます。
  • latest: 最新のブロック
  • earliest: ジェネシスブロック(ブロック 0)
"0x00000000000000000"
Kaia ブロックチェーンの最小単位である kei 単位の残高値。
1 KAIA = 10^18 kei
kaia_sendTransaction

指定されたパラメータでトランザクションを構築します。
[{
  from: string,
  to: string,
  value: string,
  gas: string
 }]

from フィールドには、'kaia_accounts','kaia_requestAccounts' または 'kaia_connectAndSign' から取得したアカウントを指定してください。
"0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d059210"
transactionHash

エラー

{code: -32001, message: 'User canceled'}
CodeDescription
-32001
{
  "code": -32001,
  "message": "User canceled" 
}

//When the user dismissed the wallet connection popup.
{code: -32001, message: 'User closed popup', data: null}

//When the user clicks the dismiss button on the signature popup
{
  "code": -32001,
  "message": "User denied message signature"
}

//When the user clicks the dismiss button on the transaction popup
{
  "code": -32001,
  "message": "User denied transaction send."
}
-32004無効な from アドレスです(walletProvider.disconnectWallet() を実行した後、メソッドを再試行してください)
-32005パスワードの入力が正しくないためユーザーはログアウトされました(walletProvider.disconnectWallet() を実行した後、メソッドを再試行してください)
-32006ウォレットがまだ接続されていません(ウォレットが接続されている状態でエラーが発生した場合は、walletProvider.disconnectWallet() を実行した後、メソッドを再試行してください。ウォレットが接続されていない状態でエラーが発生した場合は、まずウォレットを接続してください)

walletProvider.disconnectWallet()

ウォレットの接続を解除します。 この関数を呼び出すと、接続解除を確認するためのウィンドウが表示されます。

 const disconnectWallet = async ()=>{
    await walletProvider.disconnectWallet();
    window.location.reload();
}

パラメータ

  • N/A

レスポンス

  • N/A

walletProvider.getErc20TokenBalanceWithDepositedBalance()

警告

なぜ getErc20TokenBalance() ではなくこのメソッドを使うのか?
Unifi は Unifi Wallet が保有する USDT・JPYC を内部プールに自動的に預け入れます。そのため getErc20TokenBalance() はこれらのトークンの預け入れ分を含まず、Unifi Wallet で接続したユーザーの場合、実際には残高があっても 0 を返すことがあり、アプリの残高チェックが誤って失敗して決済がブロックされる可能性があります。

トランザクションの前に USDT または JPYC の残高を確認する dapp では、代わりに getErc20TokenBalanceWithDepositedBalance() を使用してください。このメソッドは無条件に呼び出しても安全です。預け入れプールを持たない Unifi Wallet 以外のウォレットの場合は、預け入れ額 0 としてオンチェーン残高をそのまま返します。

このメソッドは、対応トークン(USDT、JPYC)について、オンチェーン残高と Unifi に預け入れられた残高の合計額を返します。

const getErc20TokenBalanceWithDepositedBalance = async(contractAddress:string,account:string)=> {
    return await walletProvider.getErc20TokenBalanceWithDepositedBalance(contractAddress,account);
}
 
const USDTContractAddress = '0xd077a400968890eacc75cdc901f0356c943e4fdb';
const account = 'my_account_address';
getErc20TokenBalanceWithDepositedBalance(USDTContractAddress, account).then(balance => {
    const formattedUSDTBalance = Number(microUSDTHexToUSDTDecimal(balance as string)).toFixed(2);
    //microUSDTHexToUSDTDecimal is format function to transform hexadecimal string to decimal string
    //https://github.com/techreadiness/unifi-apps-starter/blob/main/src/utils/format.ts
    console.log(formattedUSDTBalance);
    //0.00
})
トークンコントラクトアドレス(Kaia)
USDT0xd077a400968890eacc75cdc901f0356c943e4fdb
JPYC0xE7C3D8C9a439feDe00D2600032D5dB0Be71C3c29

パラメータ

  • contractAddress *required · string
  • account *required · string

レスポンス

64 バイトの 16 進数文字列。 返される値には、トークンの decimals 仕様に応じた小数スケーリングが含まれます。

例えば、USDT は 10⁶ の小数スケールを使用し、JPYC は 10¹⁸ の小数スケールを使用します。

string

walletProvider.getErc20TokenBalance()

ERC20 ベースのトークンのオンチェーン残高を返します。

const getErc20TokenBalance = async(contractAddress:string,account:string)=> {
    return await walletProvider.getErc20TokenBalance(contractAddress,account);
}
 
const USDTContractAddress = '0xd077a400968890eacc75cdc901f0356c943e4fdb';
const account = 'my_account_address';
getErc20TokenBalance(USDTContractAddress, account).then(balance => {
    const formattedUSDTBalance = Number(microUSDTHexToUSDTDecimal(balance as string)).toFixed(2);
    //microUSDTHexToUSDTDecimal is format function to transform hexadecimal string to decimal string
    //https://github.com/techreadiness/unifi-apps-starter/blob/main/src/utils/format.ts
    console.log(formattedUSDTBalance);
    //0.00
})

パラメータ

  • contractAddress *required · string
  • account *required · string

レスポンス

64 バイトの 16 進数文字列。 返される値には、トークンの decimals 仕様に応じた小数スケーリングが含まれます。

例えば、USDT は 10⁶ の小数スケールを使用し、JPYC は 10¹⁸ の小数スケールを使用します。

string

対応ライブラリ