上篇對接小狐狸錢包文章中已經說明了新版demo和舊版demo的區別,那么當我們使用新版demo時,如何獲取余額呢?
獲取小狐狸錢包余額
網上一搜都是使用web3.js提供的方法,但是當你用的時候發現,
//web3提供獲取余額的方法 var balance = web3.eth.getBalance("0xBcFf5a3c1970D795777d7471F2792832BAF5679d"); console.log(balance); // instanceof BigNumber
頁面控制台輸出
打開連接發現官方已經刪除了web3的支持。
那么我們如何獲取余額呢,那就繼續在官網找找......
於是找到了這個鏈接:https://eth.wiki/json-rpc/API#eth_call
於是舉一反三,根據之前的經驗最終研究明白了,以下代碼就是獲取制定賬戶余額的方法,獲取到的余額是16進制的wei,在獲取余額成功后我已經做了轉換,params中兩個參數,第一個是你要查詢的賬戶,第二個是固定參數,表示最新的
//獲取余額 ethereum.request({ method: 'eth_getBalance', params: [ '0xBcFf5a3c1970D795777d7471F2792832BAF5679d' , 'latest' ] }) .then((result) => { console.log("獲取余額success--->" + result) let formartEther = ethers.utils.formatEther(result); console.log(formartEther) }) .catch((error) => { console.log("獲取余額error--->" + error.code) });
獲取交易后的回執
上篇文章中還介紹過新版的交易方法返回的結果已經不是之前的回執單了,單純返回了一個32進制的wei,也就是一串0x開頭的代碼,這時候我們就要思考了,這串代碼到底是什么意思呢?
官網一通鼓搗,最終研究明白了,返回的一串代碼就是一個key,我們通過這個key就能獲取舊版交易返回的回執單。
先解釋一下回執單代表啥意思啊,如果你研究過我上篇的博客,就應該知道,舊版的交易方法成功之后會返回一個組成json串的回執單(銀行轉賬之后的打印單),如下代碼
{ "v":"0xe5", "r":"0x300b7fc6a9df2eea33a5254b1511e6f4afc33b5d16594f8e37e124bbc4128bb2", "s":"0x6f3b7d83ecafc36b043d4ed01124451c6a51efde7d3acaa634653efc812fb93b", "to":"0x3845bca19da119fc8935e2c1cd832e981a024f89", "gas":"0x7b0c", "from":"0xbcff5a3c1970d795777d7471f2792832baf5679d", "hash":"0xf0ad6c193c85afdb402d7b1bc856ba02ec6039ee3da6037d99fe8280b5760f2d", "nonce":"0x8", "input":"0x", "value":"0x1000000000000", "accessList":null, "blockHash":null, "blockNumber":null, "transactionIndex":null, "gasPrice":"0x2540be400", "type":"0x0" }
然后咱們就說新版的如何獲取上邊這個回執單,param參數中放的就是交易成功后返回的代碼串。
具體使用代碼如下。
ethereum .request({ method: 'eth_getTransactionReceipt', params: [ '0x178bf55c2984f6eeea2606d0128d5bba50a64c918f65c714dfdd5379705f34f3' ] }) .then((result) => { console.log("111success--->" + result.to) }) .catch((error) => { console.log("222error--->" + error.message) // If the request fails, the Promise will reject with an error. });
這個解析回執單的方法還有點問題,當這樣寫死代碼串的時候就沒問題,但是如果通過參數傳遞進去就報錯,不知道為什么呢,還在持續研究中。
研究過程
懷疑過是否是異步請求導致,交易信息還沒返回就先執行通過代碼串獲取回執單的方法
懷疑過參數傳遞問題
懷疑過參數類型問題
最終感覺確認了,交易成功后,會先返回一個交易結果代碼串,然后可能是過一段時間才能生成對應的回執單並進行返回,於是有了以下代碼,主要是做了個延時,在收到結果代碼串后,延時10秒再執行下一個方法。
//發出請求 調取小狐狸插件 並將參數進行傳遞 ethereum .request({ method: 'eth_sendTransaction', params: [ { from: fromAddress, to: toAddress, value: value, } ] }) .then((result) => { console.log(result) //'0xec9026d3a9d4cd4d44ac7cd49186a05c8a2db4d697a05207d8e804d2a245455a' if (result != null || result != undefined){ console.log("開始計時") let paramsStr = []; paramsStr[0] = result; //需要等待十秒 才能收到回執單信息 返回回執代碼串 和 回執單不是同時的 所以有時候能直接通過回執代碼串獲取到回執單 有時候獲取不到 可能跟網速有關系 所以在獲取到 //回執代碼串之后 延時十秒再獲取回執單即可 setTimeout(function () { getReceipt(paramsStr) },10000); } }) .catch((error) => { }); //獲取回執單的方法 function getReceipt(paramsStr) { ethereum.request({ method: 'eth_getTransactionReceipt', params: paramsStr }) .then((result) => { console.log(result) }) .catch((error) => { console.log("error--->" + error.message) // If the request fails, the Promise will reject with an error. }); }
這種解決方案不一定是最終解決方案,不過可以參考。
回執單如下,控制台打印輸出:
大牛還請指正。