@@ -3,9 +3,14 @@ import * as Cardano from '../Cardano';
3
3
import {
4
4
Address ,
5
5
Assets ,
6
+ AuxiliaryData ,
6
7
BigNum ,
7
8
Certificates ,
8
9
Ed25519Signature ,
10
+ GeneralTransactionMetadata ,
11
+ Int ,
12
+ MetadataList ,
13
+ MetadataMap ,
9
14
MultiAsset ,
10
15
PublicKey ,
11
16
RewardAddress ,
@@ -14,6 +19,7 @@ import {
14
19
TransactionHash ,
15
20
TransactionInput ,
16
21
TransactionInputs ,
22
+ TransactionMetadatum ,
17
23
TransactionOutput ,
18
24
TransactionOutputs ,
19
25
TransactionUnspentOutput ,
@@ -22,13 +28,14 @@ import {
22
28
Vkey ,
23
29
Vkeywitness ,
24
30
Vkeywitnesses ,
25
- Withdrawals
31
+ Withdrawals ,
32
+ hash_auxiliary_data
26
33
} from '@emurgo/cardano-serialization-lib-nodejs' ;
27
34
28
35
import * as certificate from './certificate' ;
29
36
import { SerializationError } from '../errors' ;
30
37
import { SerializationFailure } from '..' ;
31
- import { coreToCsl , parseCslAddress } from '.' ;
38
+ import { parseCslAddress } from './parseCslAddress ' ;
32
39
export * as certificate from './certificate' ;
33
40
34
41
export const tokenMap = ( assets : Cardano . TokenMap ) => {
@@ -63,14 +70,54 @@ export const txOut = (core: Cardano.TxOut): TransactionOutput =>
63
70
export const utxo = ( core : Cardano . Utxo [ ] ) : TransactionUnspentOutput [ ] =>
64
71
core . map ( ( item ) => TransactionUnspentOutput . new ( txIn ( item [ 0 ] ) , txOut ( item [ 1 ] ) ) ) ;
65
72
66
- export const txBody = ( {
67
- inputs,
68
- outputs,
69
- fee,
70
- validityInterval,
71
- certificates,
72
- withdrawals
73
- } : Cardano . TxBodyAlonzo ) : TransactionBody => {
73
+ export const txMetadatum = ( metadatum : Cardano . Metadatum ) : TransactionMetadatum => {
74
+ switch ( typeof metadatum ) {
75
+ case 'bigint' :
76
+ return TransactionMetadatum . new_int ( Int . new ( BigNum . from_str ( metadatum . toString ( ) ) ) ) ;
77
+ case 'string' :
78
+ return TransactionMetadatum . new_text ( metadatum ) ;
79
+ default : {
80
+ if ( Array . isArray ( metadatum ) ) {
81
+ const metadataList = MetadataList . new ( ) ;
82
+ for ( const metadataItem of metadatum ) {
83
+ metadataList . add ( txMetadatum ( metadataItem ) ) ;
84
+ }
85
+ return TransactionMetadatum . new_list ( metadataList ) ;
86
+ } else if ( ArrayBuffer . isView ( metadatum ) ) {
87
+ return TransactionMetadatum . new_bytes ( metadatum ) ;
88
+ }
89
+ const metadataMap = MetadataMap . new ( ) ;
90
+ for ( const [ key , data ] of metadatum . entries ( ) ) {
91
+ metadataMap . insert ( txMetadatum ( key ) , txMetadatum ( data ) ) ;
92
+ }
93
+ return TransactionMetadatum . new_map ( metadataMap ) ;
94
+ }
95
+ }
96
+ } ;
97
+
98
+ export const txMetadata = ( blob : Map < bigint , Cardano . Metadatum > ) : GeneralTransactionMetadata => {
99
+ const metadata = GeneralTransactionMetadata . new ( ) ;
100
+ for ( const [ key , data ] of blob . entries ( ) ) {
101
+ metadata . insert ( BigNum . from_str ( key . toString ( ) ) , txMetadatum ( data ) ) ;
102
+ }
103
+ return metadata ;
104
+ } ;
105
+
106
+ export const txAuxiliaryData = ( auxiliaryData ?: Cardano . AuxiliaryData ) : AuxiliaryData | undefined => {
107
+ if ( ! auxiliaryData ) return ;
108
+ const result = AuxiliaryData . new ( ) ;
109
+ // TODO: add support for auxiliaryData.scripts
110
+ const { blob } = auxiliaryData . body ;
111
+ if ( blob ) {
112
+ result . set_metadata ( txMetadata ( blob ) ) ;
113
+ }
114
+ return result ;
115
+ } ;
116
+
117
+ export const txBody = (
118
+ { inputs, outputs, fee, validityInterval, certificates, withdrawals } : Cardano . TxBodyAlonzo ,
119
+ auxiliaryData ?: Cardano . AuxiliaryData
120
+ ) : TransactionBody => {
74
121
const cslInputs = TransactionInputs . new ( ) ;
75
122
for ( const input of inputs ) {
76
123
cslInputs . add ( txIn ( input ) ) ;
@@ -109,10 +156,14 @@ export const txBody = ({
109
156
}
110
157
cslBody . set_withdrawals ( cslWithdrawals ) ;
111
158
}
159
+ const cslAuxiliaryData = txAuxiliaryData ( auxiliaryData ) ;
160
+ if ( cslAuxiliaryData ) {
161
+ cslBody . set_auxiliary_data_hash ( hash_auxiliary_data ( cslAuxiliaryData ) ) ;
162
+ }
112
163
return cslBody ;
113
164
} ;
114
165
115
- export const tx = ( { body, witness } : Cardano . NewTxAlonzo ) : Transaction => {
166
+ export const tx = ( { body, witness, auxiliaryData } : Cardano . NewTxAlonzo ) : Transaction => {
116
167
const witnessSet = TransactionWitnessSet . new ( ) ;
117
168
const vkeyWitnesses = Vkeywitnesses . new ( ) ;
118
169
for ( const [ vkey , signature ] of witness . signatures . entries ( ) ) {
@@ -121,5 +172,6 @@ export const tx = ({ body, witness }: Cardano.NewTxAlonzo): Transaction => {
121
172
vkeyWitnesses . add ( vkeyWitness ) ;
122
173
}
123
174
witnessSet . set_vkeys ( vkeyWitnesses ) ;
124
- return Transaction . new ( coreToCsl . txBody ( body ) , witnessSet ) ;
175
+ // Possible optimization: only convert auxiliary data once
176
+ return Transaction . new ( txBody ( body , auxiliaryData ) , witnessSet , txAuxiliaryData ( auxiliaryData ) ) ;
125
177
} ;
0 commit comments