11import { AssetResult , TransactionResult , TransactionSignature } from '@algorandfoundation/algokit-utils/types/indexer'
22import {
33 AssetTransferTransactionModel ,
4+ AssetTransferTransactionSubType ,
45 LogicsigModel ,
56 MultisigModel ,
67 PaymentTransactionModel ,
@@ -12,6 +13,7 @@ import { invariant } from '@/utils/invariant'
1213import { publicKeyToAddress } from '@/utils/publickey-to-addess'
1314import * as algokit from '@algorandfoundation/algokit-utils'
1415import { asAsset } from '@/features/assets/mappers/asset-mappers'
16+ import { ZERO_ADDRESS } from '@/features/common/constants'
1517
1618export const asPaymentTransaction = ( transaction : TransactionResult ) : PaymentTransactionModel => {
1719 invariant ( transaction [ 'confirmed-round' ] , 'confirmed-round is not set' )
@@ -70,9 +72,33 @@ export const asAssetTransferTransaction = (transaction: TransactionResult, asset
7072 invariant ( transaction [ 'round-time' ] , 'round-time is not set' )
7173 invariant ( transaction [ 'asset-transfer-transaction' ] , 'asset-transfer-transaction is not set' )
7274
75+ const subType = ( ) => {
76+ invariant ( transaction [ 'asset-transfer-transaction' ] , 'asset-transfer-transaction is not set' )
77+
78+ if ( transaction [ 'asset-transfer-transaction' ] [ 'close-to' ] ) {
79+ return AssetTransferTransactionSubType . OptOut
80+ }
81+ if (
82+ transaction . sender === transaction [ 'asset-transfer-transaction' ] . receiver &&
83+ transaction [ 'asset-transfer-transaction' ] . amount === 0
84+ ) {
85+ return AssetTransferTransactionSubType . OptIn
86+ }
87+ if (
88+ transaction . sender === asset . params . clawback &&
89+ transaction [ 'asset-transfer-transaction' ] . sender &&
90+ transaction [ 'asset-transfer-transaction' ] . sender !== ZERO_ADDRESS
91+ ) {
92+ return AssetTransferTransactionSubType . Clawback
93+ }
94+
95+ undefined
96+ }
97+
7398 return {
7499 id : transaction . id ,
75100 type : TransactionType . AssetTransfer ,
101+ subType : subType ( ) ,
76102 asset : asAsset ( asset ) ,
77103 confirmedRound : transaction [ 'confirmed-round' ] ,
78104 roundTime : transaction [ 'round-time' ] * 1000 ,
@@ -88,5 +114,6 @@ export const asAssetTransferTransaction = (transaction: TransactionResult, asset
88114 }
89115 : undefined ,
90116 signature : transformSignature ( transaction . signature ) ,
117+ clawbackFrom : transaction [ 'asset-transfer-transaction' ] . sender ,
91118 }
92119}
0 commit comments