1
+ /* eslint-disable promise/param-names */
1
2
import * as Cardano from '../Cardano' ;
2
3
import { AssetInfo } from '../Asset' ;
3
4
import { AssetProvider } from '../Provider' ;
4
- import { Inspector , resolveInputs } from './txInspector' ;
5
+ import { Inspector , ResolutionResult , resolveInputs } from './txInspector' ;
6
+ import { Logger } from 'ts-log' ;
7
+ import { Milliseconds } from './time' ;
8
+ import { TimeoutError } from '../errors' ;
5
9
import { coalesceValueQuantities } from './coalesceValueQuantities' ;
10
+ import { promiseTimeout } from './promiseTimeout' ;
6
11
import { subtractValueQuantities } from './subtractValueQuantities' ;
7
- import uniq from 'lodash/uniq.js' ;
12
+ import { tryGetAssetInfos } from './tryGetAssetInfos' ;
13
+ import uniq from 'lodash/uniq' ;
8
14
9
15
export type AssetInfoWithAmount = { amount : Cardano . Lovelace ; assetInfo : AssetInfo } ;
10
16
@@ -28,10 +34,23 @@ export interface TokenTransferInspectorArgs {
28
34
29
35
/** The asset provider to resolve AssetInfo for assets in the toAddress field. */
30
36
toAddressAssetProvider : AssetProvider ;
37
+
38
+ /** Timeout provided by the app that consumes the inspector to personalise the UI response */
39
+ timeout : Milliseconds ;
40
+
41
+ /** logger */
42
+ logger : Logger ;
31
43
}
32
44
33
45
export type TokenTransferInspector = ( args : TokenTransferInspectorArgs ) => Inspector < TokenTransferInspection > ;
34
46
47
+ type IntoTokenTransferValueProps = {
48
+ addressMap : Map < Cardano . PaymentAddress , Cardano . Value > ;
49
+ assetProvider : AssetProvider ;
50
+ timeout : Milliseconds ;
51
+ logger : Logger ;
52
+ } ;
53
+
35
54
const coalesceByAddress = < T extends { address : Cardano . PaymentAddress ; value : Cardano . Value } > (
36
55
elements : T [ ]
37
56
) : Map < Cardano . PaymentAddress , Cardano . Value > => {
@@ -116,10 +135,12 @@ const removeZeroBalanceEntries = (addressMap: Map<Cardano.PaymentAddress, Cardan
116
135
}
117
136
} ;
118
137
119
- const toTokenTransferValue = async (
120
- assetProvider : AssetProvider ,
121
- addressMap : Map < Cardano . PaymentAddress , Cardano . Value >
122
- ) : Promise < Map < Cardano . PaymentAddress , TokenTransferValue > > => {
138
+ const intoTokenTransferValue = async ( {
139
+ logger,
140
+ assetProvider,
141
+ timeout,
142
+ addressMap
143
+ } : IntoTokenTransferValueProps ) : Promise < Map < Cardano . PaymentAddress , TokenTransferValue > > => {
123
144
const tokenTransferValue = new Map < Cardano . PaymentAddress , TokenTransferValue > ( ) ;
124
145
125
146
for ( const [ address , value ] of addressMap . entries ( ) ) {
@@ -128,9 +149,11 @@ const toTokenTransferValue = async (
128
149
const assetInfos = new Map < Cardano . AssetId , AssetInfoWithAmount > ( ) ;
129
150
130
151
if ( assetIds . length > 0 ) {
131
- const assets = await assetProvider . getAssets ( {
152
+ const assets = await tryGetAssetInfos ( {
132
153
assetIds,
133
- extraData : { nftMetadata : true , tokenMetadata : true }
154
+ assetProvider,
155
+ logger,
156
+ timeout
134
157
} ) ;
135
158
136
159
for ( const asset of assets ) {
@@ -150,9 +173,20 @@ const toTokenTransferValue = async (
150
173
151
174
/** Inspect a transaction and return a map of addresses and their balances. */
152
175
export const tokenTransferInspector : TokenTransferInspector =
153
- ( { inputResolver, fromAddressAssetProvider, toAddressAssetProvider } ) =>
176
+ ( { inputResolver, fromAddressAssetProvider, toAddressAssetProvider, timeout , logger } ) =>
154
177
async ( tx ) => {
155
- const { resolvedInputs } = await resolveInputs ( tx . body . inputs , inputResolver ) ;
178
+ let resolvedInputs : ResolutionResult [ 'resolvedInputs' ] ;
179
+
180
+ try {
181
+ const inputResolution = await promiseTimeout ( resolveInputs ( tx . body . inputs , inputResolver ) , timeout ) ;
182
+ resolvedInputs = inputResolution . resolvedInputs ;
183
+ } catch ( error ) {
184
+ if ( error instanceof TimeoutError ) {
185
+ logger . error ( 'Error: Inputs resolution timed out' ) ;
186
+ }
187
+
188
+ resolvedInputs = [ ] ;
189
+ }
156
190
157
191
const coalescedInputsByAddress = coalesceByAddress ( resolvedInputs ) ;
158
192
const coalescedOutputsByAddress = coalesceByAddress ( tx . body . outputs ) ;
@@ -168,7 +202,17 @@ export const tokenTransferInspector: TokenTransferInspector =
168
202
removeZeroBalanceEntries ( toAddress ) ;
169
203
170
204
return {
171
- fromAddress : await toTokenTransferValue ( fromAddressAssetProvider , fromAddress ) ,
172
- toAddress : await toTokenTransferValue ( toAddressAssetProvider , toAddress )
205
+ fromAddress : await intoTokenTransferValue ( {
206
+ addressMap : fromAddress ,
207
+ assetProvider : fromAddressAssetProvider ,
208
+ logger,
209
+ timeout
210
+ } ) ,
211
+ toAddress : await intoTokenTransferValue ( {
212
+ addressMap : toAddress ,
213
+ assetProvider : toAddressAssetProvider ,
214
+ logger,
215
+ timeout
216
+ } )
173
217
} ;
174
218
} ;
0 commit comments