Wallet Provider
1. はじめに
最新バージョン
- npm: https://www.npmjs.com/package/@linenext/dapp-portal-sdk/v/1.6.0
- cdn: https://static.kaiawallet.io/js/dapp-portal-sdk-1.6.0.js
SDK アクセス(clientId & clientSecret)の取得方法
Unifi Apps SDK を統合するには、Unifi チームから clientId と clientSecret を受け取る必要があります。
手順:
- Unifi Apps 申請の提出
- 指示に従い、Unifi Apps SDK 利用規約 を確認して提出してください。
- 提出したメールアドレス宛に
clientIdとclientSecretを受け取ります。
絶対に 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 });
パラメータ
| Name | Type | Description |
|---|---|---|
| clientId*required | string | SDK 申請時に提供された clientId |
| chainId | string | デフォルト値は 1001(テストネット)です。開発後にメインネットを使用するには、値を 8217(メインネット)に設定してください。 |
レスポンス
DappPortalSDK オブジェクトを返します。このオブジェクトを通じて以下のメソッドを呼び出すことができます。
DappPortalSDK.init()を呼び出す前にliff.init()を呼び出してください。- LINE MINI App または LINE Login LIFF の起動時にウォレット接続(
connectWallet)をトリガーしないでください。必要なとき(例:アイテム購入、オンチェーンリワード)にのみ接続してください。 - これにより、LINE 経由のアクティブユーザーおよびアトリビューションを正確にトラッキングできます。
- SDK は一度だけ初期化し、
DappPortalSDKインスタンスをシングルトンとして管理してください。 DappPortalSDK.init()を複数回呼び出すことは避けてください。予期しない動作や不具合を引き起こす可能性があります。
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>
| method | params | Responses |
|---|---|---|
| kaia_accounts 現在ウォレットに接続されているアドレスの一覧を返します。ウォレットが接続されていない場合は、空の配列が返されます。 | null | |
| kaia_requestAccounts ウォレット接続を開始します。処理中に、ユーザーが Wallet Provider を選択するためのウィンドウが表示されます。選択したウォレットに関連付けられたアドレスの一覧を返します。 | null | |
| personal_sign (EIP-191) 署名手続きを開始します。OKX Wallet を含むさまざまなウォレットとの互換性を得るため、 personal_sign の使用を推奨します。 | [message: string, account: string] | 署名 |
kaia_connectAndSign (EIP-191)recommendedウォレット接続と署名を開始します。ユーザーに Wallet Provider の選択を促し、指定されたメッセージに署名します。 [account, signature] を配列として返します。 | [message: string] | account と signature を配列として |
| kaia_getBalance KAIA の残高を返します。 | [account: string, blockNumberOrHash: string] blockNumberOrHash には latest または earliest を設定できます。
| Kaia ブロックチェーンの最小単位である kei 単位の残高値。1 KAIA = 10^18 kei |
| kaia_sendTransaction 指定されたパラメータでトランザクションを構築します。 | from フィールドには、'kaia_accounts','kaia_requestAccounts' または 'kaia_connectAndSign' から取得したアカウントを指定してください。 | transactionHash |
エラー
{code: -32001, message: 'User canceled'}
| Code | Description |
|---|---|
| -32001 | |
| -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) |
|---|---|
| USDT | 0xd077a400968890eacc75cdc901f0356c943e4fdb |
| JPYC | 0xE7C3D8C9a439feDe00D2600032D5dB0Be71C3c29 |
パラメータ
- 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