1
1
import * as Cardano from '../Cardano' ;
2
+ import { AssetInfo } from '../Asset' ;
3
+ import { AssetProvider } from '../Provider' ;
2
4
import { Inspector , resolveInputs } from './txInspector' ;
3
5
import { coalesceValueQuantities } from './coalesceValueQuantities' ;
4
6
import { subtractValueQuantities } from './subtractValueQuantities' ;
5
7
import uniq from 'lodash/uniq' ;
6
8
9
+ export type AssetInfoWithAmount = { amount : Cardano . Lovelace ; assetInfo : AssetInfo } ;
10
+
11
+ export type TokenTransferValue = {
12
+ assets : Map < Cardano . AssetId , AssetInfoWithAmount > ;
13
+ coins : Cardano . Lovelace ;
14
+ } ;
15
+
7
16
export type TokenTransferInspection = {
8
- fromAddress : Map < Cardano . PaymentAddress , Cardano . Value > ;
9
- toAddress : Map < Cardano . PaymentAddress , Cardano . Value > ;
17
+ fromAddress : Map < Cardano . PaymentAddress , TokenTransferValue > ;
18
+ toAddress : Map < Cardano . PaymentAddress , TokenTransferValue > ;
10
19
} ;
11
20
21
+ /** Arguments for the token transfer inspector. */
12
22
export interface TokenTransferInspectorArgs {
23
+ /** The input resolver. */
13
24
inputResolver : Cardano . InputResolver ;
25
+
26
+ /** The asset provider to resolve AssetInfo for assets in the fromAddress field. */
27
+ fromAddressAssetProvider : AssetProvider ;
28
+
29
+ /** The asset provider to resolve AssetInfo for assets in the toAddress field. */
30
+ toAddressAssetProvider : AssetProvider ;
14
31
}
15
32
16
33
export type TokenTransferInspector = ( args : TokenTransferInspectorArgs ) => Inspector < TokenTransferInspection > ;
@@ -99,9 +116,41 @@ const removeZeroBalanceEntries = (addressMap: Map<Cardano.PaymentAddress, Cardan
99
116
}
100
117
} ;
101
118
119
+ const toTokenTransferValue = async (
120
+ assetProvider : AssetProvider ,
121
+ addressMap : Map < Cardano . PaymentAddress , Cardano . Value >
122
+ ) : Promise < Map < Cardano . PaymentAddress , TokenTransferValue > > => {
123
+ const tokenTransferValue = new Map < Cardano . PaymentAddress , TokenTransferValue > ( ) ;
124
+
125
+ for ( const [ address , value ] of addressMap . entries ( ) ) {
126
+ const coins = value . coins ;
127
+ const assetIds = uniq ( value . assets && value . assets . size > 0 ? [ ...value . assets . keys ( ) ] : [ ] ) ;
128
+ const assetInfos = new Map < Cardano . AssetId , AssetInfoWithAmount > ( ) ;
129
+
130
+ if ( assetIds . length > 0 ) {
131
+ const assets = await assetProvider . getAssets ( {
132
+ assetIds,
133
+ extraData : { nftMetadata : true , tokenMetadata : true }
134
+ } ) ;
135
+
136
+ for ( const asset of assets ) {
137
+ const amount = value . assets ?. get ( asset . assetId ) ?? 0n ;
138
+ assetInfos . set ( asset . assetId , { amount, assetInfo : asset } ) ;
139
+ }
140
+ }
141
+
142
+ tokenTransferValue . set ( address , {
143
+ assets : assetInfos ,
144
+ coins
145
+ } ) ;
146
+ }
147
+
148
+ return tokenTransferValue ;
149
+ } ;
150
+
102
151
/** Inspect a transaction and return a map of addresses and their balances. */
103
152
export const tokenTransferInspector : TokenTransferInspector =
104
- ( { inputResolver } ) =>
153
+ ( { inputResolver, fromAddressAssetProvider , toAddressAssetProvider } ) =>
105
154
async ( tx ) => {
106
155
const { resolvedInputs } = await resolveInputs ( tx . body . inputs , inputResolver ) ;
107
156
@@ -118,5 +167,8 @@ export const tokenTransferInspector: TokenTransferInspector =
118
167
removeZeroBalanceEntries ( fromAddress ) ;
119
168
removeZeroBalanceEntries ( toAddress ) ;
120
169
121
- return { fromAddress, toAddress } ;
170
+ return {
171
+ fromAddress : await toTokenTransferValue ( fromAddressAssetProvider , fromAddress ) ,
172
+ toAddress : await toTokenTransferValue ( toAddressAssetProvider , toAddress )
173
+ } ;
122
174
} ;
0 commit comments