barretenberg
Loading...
Searching...
No Matches
bridge_call_data.hpp
1#pragma once
2#include "../constants.hpp"
3#include "barretenberg/common/serialize.hpp"
4#include "barretenberg/common/throw_or_abort.hpp"
5#include "barretenberg/crypto/pedersen_commitment/pedersen.hpp"
6#include "barretenberg/ecc/curves/grumpkin/grumpkin.hpp"
7
8namespace join_split_example {
9namespace proofs {
10namespace notes {
11namespace native {
12
28
29 static constexpr uint256_t input_asset_id_a_shift = DEFI_BRIDGE_ADDRESS_ID_LEN;
30 static constexpr uint256_t input_asset_id_b_shift = input_asset_id_a_shift + DEFI_BRIDGE_OUTPUT_B_ASSET_ID_LEN;
31 static constexpr uint256_t output_asset_id_a_shift = input_asset_id_b_shift + DEFI_BRIDGE_INPUT_A_ASSET_ID_LEN;
32 static constexpr uint256_t output_asset_id_b_shift = output_asset_id_a_shift + DEFI_BRIDGE_OUTPUT_A_ASSET_ID_LEN;
33 static constexpr uint256_t bitconfig_shift = output_asset_id_b_shift + DEFI_BRIDGE_INPUT_B_ASSET_ID_LEN;
34 static constexpr uint256_t aux_data_shift = bitconfig_shift + DEFI_BRIDGE_BITCONFIG_LEN;
35
48 struct bit_config {
49 bool second_input_in_use = false;
50 bool second_output_in_use = false;
51
52 bool operator==(const bit_config& other) const
53 {
54 bool res = (second_input_in_use == other.second_input_in_use);
55 res = res && (second_output_in_use == other.second_output_in_use);
56 return res;
57 }
58
59 uint256_t to_uint256_t() const
60 {
61 constexpr auto input_asset_id_a_shift = DEFI_BRIDGE_ADDRESS_ID_LEN;
62 constexpr auto output_asset_id_a_shift = input_asset_id_a_shift + DEFI_BRIDGE_INPUT_A_ASSET_ID_LEN;
63 constexpr auto output_asset_id_b_shift = output_asset_id_a_shift + DEFI_BRIDGE_OUTPUT_A_ASSET_ID_LEN;
64 constexpr auto input_asset_id_b_shift = output_asset_id_b_shift + DEFI_BRIDGE_OUTPUT_B_ASSET_ID_LEN;
65 constexpr auto bitconfig_shift = input_asset_id_b_shift + DEFI_BRIDGE_INPUT_B_ASSET_ID_LEN;
66
67 uint256_t result(second_input_in_use);
68 result += uint256_t(second_output_in_use) << 1;
69 result = result << bitconfig_shift;
70 return result;
71 }
72
73 static bit_config from_uint256_t(const uint256_t& bridge_call_data = 0)
74 {
75 constexpr auto input_asset_id_a_shift = DEFI_BRIDGE_ADDRESS_ID_LEN;
76 constexpr auto output_asset_id_a_shift = input_asset_id_a_shift + DEFI_BRIDGE_INPUT_A_ASSET_ID_LEN;
77 constexpr auto output_asset_id_b_shift = output_asset_id_a_shift + DEFI_BRIDGE_OUTPUT_A_ASSET_ID_LEN;
78 constexpr auto input_asset_id_b_shift = output_asset_id_b_shift + DEFI_BRIDGE_OUTPUT_B_ASSET_ID_LEN;
79 constexpr auto bitconfig_shift = input_asset_id_b_shift + DEFI_BRIDGE_INPUT_B_ASSET_ID_LEN;
80 constexpr auto bitconfig_mask = (1ULL << DEFI_BRIDGE_BITCONFIG_LEN) - 1;
81 uint32_t config_u32 = uint32_t((bridge_call_data >> bitconfig_shift) & bitconfig_mask);
82
83 bit_config result;
84 result.second_input_in_use = config_u32 & 1ULL;
85 result.second_output_in_use = (config_u32 >> 1) & 1ULL;
86 return result;
87 }
88 };
89
90 uint32_t bridge_address_id;
91 uint32_t input_asset_id_a;
92 uint32_t input_asset_id_b = 0;
93 uint32_t output_asset_id_a;
94 uint32_t output_asset_id_b;
95 bit_config config;
96 uint64_t aux_data = 0;
97
98 static bridge_call_data from_uint256_t(const uint256_t& bridge_call_data = 0)
99 {
100 uint256_t one = 1;
101 struct bridge_call_data result;
102 result.bridge_address_id =
103 static_cast<uint32_t>(bridge_call_data & uint256_t((one << DEFI_BRIDGE_ADDRESS_ID_LEN) - 1));
104 result.input_asset_id_a = static_cast<uint32_t>((bridge_call_data >> input_asset_id_a_shift) &
105 uint256_t((one << DEFI_BRIDGE_INPUT_A_ASSET_ID_LEN) - 1));
106 result.input_asset_id_b = static_cast<uint32_t>((bridge_call_data >> input_asset_id_b_shift) &
107 uint256_t((one << DEFI_BRIDGE_INPUT_B_ASSET_ID_LEN) - 1));
108 result.output_asset_id_a = static_cast<uint32_t>(((bridge_call_data >> output_asset_id_a_shift) &
109 uint256_t((one << DEFI_BRIDGE_OUTPUT_A_ASSET_ID_LEN) - 1)));
110 result.output_asset_id_b = static_cast<uint32_t>((bridge_call_data >> output_asset_id_b_shift) &
111 uint256_t((one << DEFI_BRIDGE_OUTPUT_B_ASSET_ID_LEN) - 1));
112 result.aux_data =
113 static_cast<uint32_t>((bridge_call_data >> aux_data_shift) & uint256_t((one << DEFI_BRIDGE_AUX_DATA) - 1));
114 result.config = bit_config::from_uint256_t(bridge_call_data);
115 return result;
116 }
117
118 uint256_t to_uint256_t() const
119 {
120 // The bridge contract address is the 160-bit address mapped to a 32-bit integer just like asset ids.
121 // check if the asset ids are 30 bits.
122 bool input_asset_id_a_check = ((input_asset_id_a >> DEFI_BRIDGE_INPUT_A_ASSET_ID_LEN) == 0);
123 bool input_asset_id_b_check = ((input_asset_id_b >> DEFI_BRIDGE_INPUT_A_ASSET_ID_LEN) == 0);
124 bool output_asset_id_a_check = ((output_asset_id_a >> DEFI_BRIDGE_OUTPUT_A_ASSET_ID_LEN) == 0);
125 bool output_asset_id_b_check = ((output_asset_id_b >> DEFI_BRIDGE_OUTPUT_B_ASSET_ID_LEN) == 0);
126
127 if (!(input_asset_id_a_check && input_asset_id_b_check && output_asset_id_a_check && output_asset_id_b_check)) {
128 throw_or_abort("Structure of the bridge_call_data incorrect!");
129 }
130
131 constexpr uint32_t input_asset_id_a_offset = DEFI_BRIDGE_ADDRESS_ID_LEN;
132 constexpr uint32_t input_asset_id_b_offset = input_asset_id_a_offset + DEFI_BRIDGE_OUTPUT_B_ASSET_ID_LEN;
133 constexpr uint32_t output_asset_id_a_offset = input_asset_id_b_offset + DEFI_BRIDGE_INPUT_A_ASSET_ID_LEN;
134 constexpr uint32_t output_asset_id_b_offset = output_asset_id_a_offset + DEFI_BRIDGE_OUTPUT_A_ASSET_ID_LEN;
135 constexpr uint32_t bitconfig_offset = output_asset_id_b_offset + DEFI_BRIDGE_INPUT_B_ASSET_ID_LEN;
136 constexpr uint32_t aux_data_offset = bitconfig_offset + DEFI_BRIDGE_BITCONFIG_LEN;
137
138 uint256_t result = static_cast<uint256_t>(bridge_address_id) +
139 (static_cast<uint256_t>(input_asset_id_a) << input_asset_id_a_offset) +
140 (static_cast<uint256_t>(input_asset_id_b) << input_asset_id_b_offset) +
141 (static_cast<uint256_t>(output_asset_id_a) << output_asset_id_a_offset) +
142 (static_cast<uint256_t>(output_asset_id_b) << output_asset_id_b_offset) +
143 config.to_uint256_t() + (static_cast<uint256_t>(aux_data) << aux_data_offset);
144
145 return result;
146 }
147
148 operator uint256_t() const { return to_uint256_t(); }
149
150 bool operator==(bridge_call_data const& other) const
151 {
152 bool res = bridge_address_id == other.bridge_address_id;
153 res = res && (input_asset_id_a == other.input_asset_id_a);
154 res = res && (input_asset_id_b == other.input_asset_id_b);
155 res = res && (output_asset_id_a == other.output_asset_id_a);
156 res = res && (output_asset_id_b == other.output_asset_id_b);
157 res = res && (aux_data == other.aux_data);
158 res = res && (config == other.config);
159 return res;
160 };
161};
162
163inline std::ostream& operator<<(std::ostream& os, bridge_call_data::bit_config const& config)
164{
165 os << " second_input_in_use: " << config.second_input_in_use << ",\n"
166 << " second_output_in_use: " << config.second_output_in_use << ",\n";
167 return os;
168}
169
170inline std::ostream& operator<<(std::ostream& os, bridge_call_data const& bridge_call_data)
171{
172 os << "{\n"
173 << " bridge_address_id: " << bridge_call_data.bridge_address_id << ",\n"
174 << " input_asset_id_a: " << bridge_call_data.input_asset_id_a << ",\n"
175 << " input_asset_id_b: " << bridge_call_data.input_asset_id_b << ",\n"
176 << " output_asset_id_a: " << bridge_call_data.output_asset_id_a << ",\n"
177 << " output_asset_id_b: " << bridge_call_data.output_asset_id_a << "\n}" << bridge_call_data.config
178 << " aux_data: " << bridge_call_data.aux_data << "\n}";
179 return os;
180}
181
182} // namespace native
183} // namespace notes
184} // namespace proofs
185} // namespace join_split_example
Definition: uint256.hpp:25