snarkvm_circuit_program/response/
mod.rs1#[cfg(test)]
17use snarkvm_circuit_types::environment::assert_scope;
18
19mod from_outputs;
20mod process_outputs_from_callback;
21
22use crate::{Identifier, ProgramID, Value, compute_function_id};
23use snarkvm_circuit_network::Aleo;
24use snarkvm_circuit_types::{Field, U16, environment::prelude::*};
25
26pub enum OutputID<A: Aleo> {
27 Constant(Field<A>),
29 Public(Field<A>),
31 Private(Field<A>),
33 Record(Field<A>, Field<A>),
35 ExternalRecord(Field<A>),
37 Future(Field<A>),
39}
40
41#[cfg(feature = "console")]
42impl<A: Aleo> Inject for OutputID<A> {
43 type Primitive = console::OutputID<A::Network>;
44
45 fn new(_: Mode, output: Self::Primitive) -> Self {
47 match output {
48 console::OutputID::Constant(field) => Self::Constant(Field::new(Mode::Public, field)),
50 console::OutputID::Public(field) => Self::Public(Field::new(Mode::Public, field)),
52 console::OutputID::Private(field) => Self::Private(Field::new(Mode::Public, field)),
54 console::OutputID::Record(commitment, checksum) => {
56 Self::Record(Field::new(Mode::Public, commitment), Field::new(Mode::Public, checksum))
57 }
58 console::OutputID::ExternalRecord(hash) => Self::ExternalRecord(Field::new(Mode::Public, hash)),
60 console::OutputID::Future(hash) => Self::Future(Field::new(Mode::Public, hash)),
62 }
63 }
64}
65
66impl<A: Aleo> OutputID<A> {
67 fn constant(expected_hash: Field<A>) -> Self {
69 let output_hash = Field::new(Mode::Public, expected_hash.eject_value());
71 A::assert_eq(&output_hash, expected_hash);
73 Self::Constant(output_hash)
75 }
76
77 fn public(expected_hash: Field<A>) -> Self {
79 let output_hash = Field::new(Mode::Public, expected_hash.eject_value());
81 A::assert_eq(&output_hash, expected_hash);
83 Self::Public(output_hash)
85 }
86
87 fn private(expected_hash: Field<A>) -> Self {
89 let output_hash = Field::new(Mode::Public, expected_hash.eject_value());
91 A::assert_eq(&output_hash, expected_hash);
93 Self::Private(output_hash)
95 }
96
97 fn record(expected_commitment: Field<A>, expected_checksum: Field<A>) -> Self {
99 let output_commitment = Field::new(Mode::Public, expected_commitment.eject_value());
101 let output_checksum = Field::new(Mode::Public, expected_checksum.eject_value());
102 A::assert_eq(&output_commitment, expected_commitment);
104 A::assert_eq(&output_checksum, expected_checksum);
105 Self::Record(output_commitment, output_checksum)
107 }
108
109 fn external_record(expected_hash: Field<A>) -> Self {
111 let output_hash = Field::new(Mode::Public, expected_hash.eject_value());
113 A::assert_eq(&output_hash, expected_hash);
115 Self::ExternalRecord(output_hash)
117 }
118
119 fn future(expected_hash: Field<A>) -> Self {
121 let output_hash = Field::new(Mode::Public, expected_hash.eject_value());
123 A::assert_eq(&output_hash, expected_hash);
125 Self::Future(output_hash)
127 }
128}
129
130#[cfg(feature = "console")]
131impl<A: Aleo> Eject for OutputID<A> {
132 type Primitive = console::OutputID<A::Network>;
133
134 fn eject_mode(&self) -> Mode {
136 match self {
137 Self::Constant(field) => field.eject_mode(),
138 Self::Public(field) => field.eject_mode(),
139 Self::Private(field) => field.eject_mode(),
140 Self::Record(commitment, checksum) => Mode::combine(commitment.eject_mode(), [checksum.eject_mode()]),
141 Self::ExternalRecord(hash) => hash.eject_mode(),
142 Self::Future(hash) => hash.eject_mode(),
143 }
144 }
145
146 fn eject_value(&self) -> Self::Primitive {
148 match self {
149 Self::Constant(field) => console::OutputID::Constant(field.eject_value()),
150 Self::Public(field) => console::OutputID::Public(field.eject_value()),
151 Self::Private(field) => console::OutputID::Private(field.eject_value()),
152 Self::Record(commitment, checksum) => {
153 console::OutputID::Record(commitment.eject_value(), checksum.eject_value())
154 }
155 Self::ExternalRecord(hash) => console::OutputID::ExternalRecord(hash.eject_value()),
156 Self::Future(hash) => console::OutputID::Future(hash.eject_value()),
157 }
158 }
159}
160
161pub struct Response<A: Aleo> {
162 output_ids: Vec<OutputID<A>>,
164 outputs: Vec<Value<A>>,
166}
167
168impl<A: Aleo> Response<A> {
169 pub fn output_ids(&self) -> &[OutputID<A>] {
171 &self.output_ids
172 }
173
174 pub fn outputs(&self) -> &[Value<A>] {
176 &self.outputs
177 }
178}
179
180#[cfg(feature = "console")]
181impl<A: Aleo> Eject for Response<A> {
182 type Primitive = console::Response<A::Network>;
183
184 fn eject_mode(&self) -> Mode {
186 Mode::combine(self.output_ids.eject_mode(), [self.outputs.eject_mode()])
187 }
188
189 fn eject_value(&self) -> Self::Primitive {
191 Self::Primitive::from((
192 self.output_ids.iter().map(|output_id| output_id.eject_value()).collect(),
193 self.outputs.eject_value(),
194 ))
195 }
196}