@@ -7,6 +7,8 @@ import { queryBankBalances } from '../queryBankBalances.js';
7
7
8
8
/** @typedef {import('@agoric/smart-wallet/src/types.js').Petname } Petname */
9
9
10
+ /** @typedef {import('@keplr-wallet/types').Coin } Coin */
11
+
10
12
/**
11
13
* @typedef {{
12
14
* brand?: unknown,
@@ -17,6 +19,17 @@ import { queryBankBalances } from '../queryBankBalances.js';
17
19
* }} PurseInfo
18
20
*/
19
21
22
+ /**
23
+ * @typedef {[
24
+ * string,
25
+ * {
26
+ * brand: unknown,
27
+ * issuerName: string,
28
+ * displayInfo: unknown
29
+ * }
30
+ * ][]} VBankAssets
31
+ */
32
+
20
33
const POLL_INTERVAL_MS = 6000 ;
21
34
22
35
/**
@@ -82,51 +95,128 @@ export const watchWallet = async (chainStorageWatcher, address) => {
82
95
83
96
const watchChainBalances = ( ) => {
84
97
const brandToPurse = new Map ( ) ;
85
- let vbankAssets ;
86
- let bank ;
87
-
88
- const possiblyUpdateBankPurses = ( ) => {
89
- if ( ! vbankAssets || ! bank ) return ;
90
-
91
- const bankMap = new Map ( bank . map ( ( { denom, amount } ) => [ denom , amount ] ) ) ;
92
-
93
- vbankAssets . forEach ( ( [ denom , info ] ) => {
94
- const amount = bankMap . get ( denom ) ?? 0n ;
95
- const purseInfo = {
96
- brand : info . brand ,
97
- currentAmount : AmountMath . make ( info . brand , BigInt ( amount ) ) ,
98
- brandPetname : info . issuerName ,
99
- pursePetname : info . issuerName ,
100
- displayInfo : info . displayInfo ,
101
- } ;
102
- brandToPurse . set ( info . brand , purseInfo ) ;
103
- } ) ;
104
-
105
- updatePurses ( brandToPurse ) ;
106
- } ;
107
-
108
- const watchBank = async ( ) => {
109
- const balances = await queryBankBalances (
110
- address ,
111
- chainStorageWatcher . rpcAddr ,
112
- ) ;
113
- bank = balances ;
114
- possiblyUpdateBankPurses ( ) ;
115
- setTimeout ( watchBank , POLL_INTERVAL_MS ) ;
116
- } ;
117
98
118
- const watchVbankAssets = async ( ) => {
119
- chainStorageWatcher . watchLatest (
120
- [ 'data' , 'published.agoricNames.vbankAsset' ] ,
121
- value => {
122
- vbankAssets = value ;
123
- possiblyUpdateBankPurses ( ) ;
124
- } ,
125
- ) ;
126
- } ;
99
+ {
100
+ /** @type {VBankAssets } */
101
+ let vbankAssets ;
102
+ /** @type {Coin[] } */
103
+ let bank ;
104
+
105
+ const possiblyUpdateBankPurses = ( ) => {
106
+ if ( ! vbankAssets || ! bank ) return ;
107
+
108
+ const bankMap = new Map (
109
+ bank . map ( ( { denom, amount } ) => [ denom , amount ] ) ,
110
+ ) ;
111
+
112
+ vbankAssets . forEach ( ( [ denom , info ] ) => {
113
+ const amount = bankMap . get ( denom ) ?? 0n ;
114
+ const purseInfo = {
115
+ brand : info . brand ,
116
+ currentAmount : AmountMath . make ( info . brand , BigInt ( amount ) ) ,
117
+ brandPetname : info . issuerName ,
118
+ pursePetname : info . issuerName ,
119
+ displayInfo : info . displayInfo ,
120
+ } ;
121
+ brandToPurse . set ( info . brand , purseInfo ) ;
122
+ } ) ;
123
+
124
+ updatePurses ( brandToPurse ) ;
125
+ } ;
126
+
127
+ const watchBank = async ( ) => {
128
+ const balances = await queryBankBalances (
129
+ address ,
130
+ chainStorageWatcher . rpcAddr ,
131
+ ) ;
132
+ bank = balances ;
133
+ possiblyUpdateBankPurses ( ) ;
134
+ setTimeout ( watchBank , POLL_INTERVAL_MS ) ;
135
+ } ;
136
+
137
+ const watchVbankAssets = ( ) => {
138
+ chainStorageWatcher . watchLatest (
139
+ [ 'data' , 'published.agoricNames.vbankAsset' ] ,
140
+ value => {
141
+ vbankAssets = value ;
142
+ possiblyUpdateBankPurses ( ) ;
143
+ } ,
144
+ ) ;
145
+ } ;
146
+
147
+ void watchVbankAssets ( ) ;
148
+ void watchBank ( ) ;
149
+ }
127
150
128
- void watchVbankAssets ( ) ;
129
- void watchBank ( ) ;
151
+ {
152
+ /** @type { [string, unknown][] } */
153
+ let agoricBrands ;
154
+ /** @type { {balance: unknown, brand: unknown}[] } */
155
+ let nonBankPurses ;
156
+ /** @type { Map<unknown, { displayInfo: unknown }> } */
157
+ let brandToBoardAux ;
158
+
159
+ const possiblyUpdateNonBankPurses = ( ) => {
160
+ if ( ! agoricBrands || ! nonBankPurses || ! brandToBoardAux ) return ;
161
+
162
+ nonBankPurses . forEach ( ( { balance, brand } ) => {
163
+ const petname = agoricBrands
164
+ ?. find ( ( [ _petname , b ] ) => b === brand )
165
+ ?. at ( 0 ) ;
166
+ const { displayInfo } = brandToBoardAux . get ( brand ) ?? { } ;
167
+ const purseInfo = {
168
+ brand,
169
+ currentAmount : balance ,
170
+ brandPetname : petname ,
171
+ pursePetname : petname ,
172
+ displayInfo,
173
+ } ;
174
+ brandToPurse . set ( brand , purseInfo ) ;
175
+ } ) ;
176
+
177
+ updatePurses ( brandToPurse ) ;
178
+ } ;
179
+
180
+ const watchBrands = ( ) => {
181
+ chainStorageWatcher . watchLatest (
182
+ [ 'data' , 'published.agoricNames.brand' ] ,
183
+ value => {
184
+ agoricBrands = value ;
185
+ possiblyUpdateNonBankPurses ( ) ;
186
+ } ,
187
+ ) ;
188
+ } ;
189
+
190
+ const watchPurses = ( ) =>
191
+ chainStorageWatcher . watchLatest (
192
+ [ 'data' , `published.wallet.${ address } .current` ] ,
193
+ async value => {
194
+ const { purses } = value ;
195
+ if ( nonBankPurses === purses ) return ;
196
+
197
+ await null ;
198
+ if ( purses . length !== nonBankPurses ?. length ) {
199
+ const brands = purses . map ( p => p . brand ) ;
200
+ try {
201
+ const boardAux = await Promise . all (
202
+ chainStorageWatcher . queryBoardAux ( brands ) ,
203
+ ) ;
204
+ brandToBoardAux = new Map (
205
+ brands . map ( ( brand , index ) => [ brand , boardAux [ index ] ] ) ,
206
+ ) ;
207
+ } catch ( e ) {
208
+ console . error ( 'Error getting boardAux for brands' , brands , e ) ;
209
+ }
210
+ }
211
+
212
+ nonBankPurses = purses ;
213
+ possiblyUpdateNonBankPurses ( ) ;
214
+ } ,
215
+ ) ;
216
+
217
+ void watchBrands ( ) ;
218
+ void watchPurses ( ) ;
219
+ }
130
220
} ;
131
221
132
222
const watchWalletUpdates = async ( ) => {
0 commit comments