@@ -19,6 +19,7 @@ use bincode;
19
19
use k256:: ecdsa:: { RecoveryId , Signature , SigningKey } ;
20
20
use k256:: AffinePoint ;
21
21
use risc0_zkvm:: Digest ;
22
+ use rustler:: types:: atom;
22
23
use rustler:: types:: map:: map_new;
23
24
use rustler:: { atoms, Binary , Decoder , Encoder , NifResult } ;
24
25
use rustler:: { Env , Error , OwnedBinary , Term } ;
@@ -78,6 +79,7 @@ atoms! {
78
79
at_nk_commitment = "nk_commitment" ,
79
80
at_rand_seed = "rand_seed" ,
80
81
at_delta_proof = "Elixir.Anoma.Arm.DeltaProof" ,
82
+ at_aggregation_proof = "aggregation_proof" ,
81
83
at_signature = "signature" ,
82
84
at_recid = "recid" ,
83
85
at_delta_witness = "Elixir.Anoma.Arm.DeltaWitness" ,
@@ -98,6 +100,36 @@ pub trait RustlerDecoder<'a>: Sized + 'a {
98
100
fn rustler_decode ( term : Term < ' a > ) -> NifResult < Self > ;
99
101
}
100
102
103
+ impl < T > RustlerEncoder for Option < T >
104
+ where
105
+ T : RustlerEncoder ,
106
+ {
107
+ fn rustler_encode < ' c > ( & self , env : Env < ' c > ) -> Result < Term < ' c > , Error > {
108
+ match * self {
109
+ Some ( ref value) => value. rustler_encode ( env) ,
110
+ None => Ok ( atom:: nil ( ) . encode ( env) ) ,
111
+ }
112
+ }
113
+ }
114
+
115
+ impl < ' a , T > RustlerDecoder < ' a > for Option < T >
116
+ where
117
+ T : RustlerDecoder < ' a > ,
118
+ {
119
+ fn rustler_decode ( term : Term < ' a > ) -> NifResult < Self > {
120
+ if let Ok ( term) = RustlerDecoder :: rustler_decode ( term) {
121
+ Ok ( Some ( term) )
122
+ } else {
123
+ let decoded_atom: atom:: Atom = term. decode ( ) ?;
124
+ if decoded_atom == atom:: nil ( ) {
125
+ Ok ( None )
126
+ } else {
127
+ Err ( Error :: BadArg )
128
+ }
129
+ }
130
+ }
131
+ }
132
+
101
133
impl RustlerEncoder for Vec < u8 > {
102
134
fn rustler_encode < ' a > ( & self , env : Env < ' a > ) -> Result < Term < ' a > , Error > {
103
135
let mut erl_bin = OwnedBinary :: new ( self . len ( ) )
@@ -229,7 +261,7 @@ impl RustlerEncoder for ComplianceUnit {
229
261
impl < ' a > RustlerDecoder < ' a > for ComplianceUnit {
230
262
fn rustler_decode ( term : Term < ' a > ) -> NifResult < Self > {
231
263
let proof_term = term. map_get ( at_proof ( ) . encode ( term. get_env ( ) ) ) ;
232
- let proof: Vec < u8 > = RustlerDecoder :: rustler_decode ( proof_term?) ?;
264
+ let proof = RustlerDecoder :: rustler_decode ( proof_term?) ?;
233
265
let instance_term = term. map_get ( at_instance ( ) . encode ( term. get_env ( ) ) ) ;
234
266
let instance: Vec < u8 > = RustlerDecoder :: rustler_decode ( instance_term?) ?;
235
267
Ok ( ComplianceUnit { proof, instance } )
@@ -384,7 +416,7 @@ impl<'a> RustlerDecoder<'a> for LogicVerifierInputs {
384
416
let app_data_term = term. map_get ( at_app_data_key ( ) . encode ( term. get_env ( ) ) ) ?;
385
417
let app_data: AppData = app_data_term. decode ( ) ?;
386
418
let proof_term = term. map_get ( at_proof ( ) . encode ( term. get_env ( ) ) ) ?;
387
- let proof: Vec < u8 > = RustlerDecoder :: rustler_decode ( proof_term) ?;
419
+ let proof = RustlerDecoder :: rustler_decode ( proof_term) ?;
388
420
389
421
Ok ( LogicVerifierInputs {
390
422
tag,
@@ -1031,7 +1063,7 @@ impl RustlerEncoder for LogicVerifier {
1031
1063
impl < ' a > RustlerDecoder < ' a > for LogicVerifier {
1032
1064
fn rustler_decode ( term : Term < ' a > ) -> NifResult < Self > {
1033
1065
let proof_term = term. map_get ( at_proof ( ) . encode ( term. get_env ( ) ) ) ?;
1034
- let proof: Vec < u8 > = RustlerDecoder :: rustler_decode ( proof_term) ?;
1066
+ let proof = RustlerDecoder :: rustler_decode ( proof_term) ?;
1035
1067
1036
1068
let instance_term = term. map_get ( at_instance ( ) . encode ( term. get_env ( ) ) ) ?;
1037
1069
let instance: Vec < u8 > = RustlerDecoder :: rustler_decode ( instance_term) ?;
@@ -1078,6 +1110,13 @@ impl RustlerEncoder for Transaction {
1078
1110
Some ( balance) => balance. rustler_encode ( env) ?,
1079
1111
None => ( ) . encode ( env) ,
1080
1112
} ,
1113
+ ) ?
1114
+ . map_put (
1115
+ at_aggregation_proof ( ) . encode ( env) ,
1116
+ match & self . aggregation_proof {
1117
+ Some ( proof) => proof. rustler_encode ( env) ?,
1118
+ None => ( ) . encode ( env) ,
1119
+ } ,
1081
1120
) ?;
1082
1121
1083
1122
Ok ( map)
@@ -1098,10 +1137,15 @@ impl<'a> RustlerDecoder<'a> for Transaction {
1098
1137
Err ( _) => Some ( RustlerDecoder :: rustler_decode ( expected_balance_term) ?) ,
1099
1138
} ;
1100
1139
1140
+ let aggregation_proof_term = term. map_get ( at_aggregation_proof ( ) . encode ( term. get_env ( ) ) ) ?;
1141
+ let aggregation_proof: Option < Vec < u8 > > =
1142
+ RustlerDecoder :: rustler_decode ( aggregation_proof_term) ?;
1143
+
1101
1144
Ok ( Transaction {
1102
1145
actions,
1103
1146
delta_proof,
1104
1147
expected_balance,
1148
+ aggregation_proof,
1105
1149
} )
1106
1150
}
1107
1151
}
0 commit comments