1 #ifndef LIBWALLY_CORE_WALLY_HPP
2 #define LIBWALLY_CORE_WALLY_HPP
3 #pragma once
4
5 #include <type_traits>
6 #include <string>
7 #include <wally_address.h>
8 #include <wally_anti_exfil.h>
9 #include <wally_bip32.h>
10 #include <wally_bip38.h>
11 #include <wally_bip39.h>
12 #include <wally_core.h>
13 #include <wally_crypto.h>
14 #include <wally_psbt.h>
15 #include <wally_script.h>
16 #include <wally_symmetric.h>
17 #include <wally_transaction.h>
18
19 /* These wrappers allow passing containers such as std::vector, std::array,
20 * std::string and custom classes as input/output buffers to wally functions.
21 */
22 namespace wally {
23
24 namespace detail {
get_p(const P & p,std::false_type,std::true_type)25 template <class P> inline auto get_p(const P& p, std::false_type, std::true_type) {
26 return &p[0];
27 }
get_p(const P & p,std::true_type,std::false_type)28 template <class P> inline auto get_p(const P& p, std::true_type, std::false_type) {
29 return p;
30 }
get_p(const P & p,std::false_type,std::false_type)31 template <class P> inline auto get_p(const P& p, std::false_type, std::false_type) {
32 return p.get();
33 }
get_p(const P & p)34 template <class P> inline auto get_p(const P& p) {
35 return get_p(p, std::is_pointer<P>{}, std::is_array<P>{});
36 }
get_p(const std::string & p)37 template <> inline auto get_p(const std::string& p) {
38 return p.c_str();
39 }
get_p(const std::nullptr_t & p)40 template <> inline auto get_p(const std::nullptr_t& p) {
41 return p;
42 }
43 } /* namespace detail */
44
45 /* BEGIN AUTOGENERATED */
bip32_key_free(const struct ext_key * hdkey)46 inline int bip32_key_free(const struct ext_key* hdkey) {
47 int ret = ::bip32_key_free(hdkey);
48 return ret;
49 }
50
51 template <class BASE58>
bip32_key_from_base58(const BASE58 & base58,struct ext_key * output)52 inline int bip32_key_from_base58(const BASE58& base58, struct ext_key* output) {
53 int ret = ::bip32_key_from_base58(detail::get_p(base58), output);
54 return ret;
55 }
56
57 template <class BASE58>
bip32_key_from_base58_alloc(const BASE58 & base58,struct ext_key ** output)58 inline int bip32_key_from_base58_alloc(const BASE58& base58, struct ext_key** output) {
59 int ret = ::bip32_key_from_base58_alloc(detail::get_p(base58), output);
60 return ret;
61 }
62
63 template <class HDKEY>
bip32_key_from_parent(const HDKEY & hdkey,uint32_t child_num,uint32_t flags,struct ext_key * output)64 inline int bip32_key_from_parent(const HDKEY& hdkey, uint32_t child_num, uint32_t flags, struct ext_key* output) {
65 int ret = ::bip32_key_from_parent(detail::get_p(hdkey), child_num, flags, output);
66 return ret;
67 }
68
69 template <class HDKEY>
bip32_key_from_parent_alloc(const HDKEY & hdkey,uint32_t child_num,uint32_t flags,struct ext_key ** output)70 inline int bip32_key_from_parent_alloc(const HDKEY& hdkey, uint32_t child_num, uint32_t flags, struct ext_key** output) {
71 int ret = ::bip32_key_from_parent_alloc(detail::get_p(hdkey), child_num, flags, output);
72 return ret;
73 }
74
75 template <class HDKEY, class CHILD_PATH>
bip32_key_from_parent_path(const HDKEY & hdkey,const CHILD_PATH & child_path,uint32_t flags,struct ext_key * output)76 inline int bip32_key_from_parent_path(const HDKEY& hdkey, const CHILD_PATH& child_path, uint32_t flags, struct ext_key* output) {
77 int ret = ::bip32_key_from_parent_path(detail::get_p(hdkey), child_path.data(), child_path.size(), flags, output);
78 return ret;
79 }
80
81 template <class HDKEY, class CHILD_PATH>
bip32_key_from_parent_path_alloc(const HDKEY & hdkey,const CHILD_PATH & child_path,uint32_t flags,struct ext_key ** output)82 inline int bip32_key_from_parent_path_alloc(const HDKEY& hdkey, const CHILD_PATH& child_path, uint32_t flags, struct ext_key** output) {
83 int ret = ::bip32_key_from_parent_path_alloc(detail::get_p(hdkey), child_path.data(), child_path.size(), flags, output);
84 return ret;
85 }
86
87 template <class BYTES>
bip32_key_from_seed(const BYTES & bytes,uint32_t version,uint32_t flags,struct ext_key * output)88 inline int bip32_key_from_seed(const BYTES& bytes, uint32_t version, uint32_t flags, struct ext_key* output) {
89 int ret = ::bip32_key_from_seed(bytes.data(), bytes.size(), version, flags, output);
90 return ret;
91 }
92
93 template <class BYTES>
bip32_key_from_seed_alloc(const BYTES & bytes,uint32_t version,uint32_t flags,struct ext_key ** output)94 inline int bip32_key_from_seed_alloc(const BYTES& bytes, uint32_t version, uint32_t flags, struct ext_key** output) {
95 int ret = ::bip32_key_from_seed_alloc(bytes.data(), bytes.size(), version, flags, output);
96 return ret;
97 }
98
99 template <class HDKEY, class BYTES_OUT>
bip32_key_get_fingerprint(const HDKEY & hdkey,BYTES_OUT & bytes_out)100 inline int bip32_key_get_fingerprint(const HDKEY& hdkey, BYTES_OUT& bytes_out) {
101 int ret = ::bip32_key_get_fingerprint(detail::get_p(hdkey), bytes_out.data(), bytes_out.size());
102 return ret;
103 }
104
105 template <class CHAIN_CODE, class PUB_KEY, class PRIV_KEY, class HASH160, class PARENT160>
bip32_key_init(uint32_t version,uint32_t depth,uint32_t child_num,const CHAIN_CODE & chain_code,const PUB_KEY & pub_key,const PRIV_KEY & priv_key,const HASH160 & hash160,const PARENT160 & parent160,struct ext_key * output)106 inline int bip32_key_init(uint32_t version, uint32_t depth, uint32_t child_num, const CHAIN_CODE& chain_code, const PUB_KEY& pub_key, const PRIV_KEY& priv_key, const HASH160& hash160, const PARENT160& parent160, struct ext_key* output) {
107 int ret = ::bip32_key_init(version, depth, child_num, chain_code.data(), chain_code.size(), pub_key.data(), pub_key.size(), priv_key.data(), priv_key.size(), hash160.data(), hash160.size(), parent160.data(), parent160.size(), output);
108 return ret;
109 }
110
111 template <class CHAIN_CODE, class PUB_KEY, class PRIV_KEY, class HASH160, class PARENT160>
bip32_key_init_alloc(uint32_t version,uint32_t depth,uint32_t child_num,const CHAIN_CODE & chain_code,const PUB_KEY & pub_key,const PRIV_KEY & priv_key,const HASH160 & hash160,const PARENT160 & parent160,struct ext_key ** output)112 inline int bip32_key_init_alloc(uint32_t version, uint32_t depth, uint32_t child_num, const CHAIN_CODE& chain_code, const PUB_KEY& pub_key, const PRIV_KEY& priv_key, const HASH160& hash160, const PARENT160& parent160, struct ext_key** output) {
113 int ret = ::bip32_key_init_alloc(version, depth, child_num, chain_code.data(), chain_code.size(), pub_key.data(), pub_key.size(), priv_key.data(), priv_key.size(), hash160.data(), hash160.size(), parent160.data(), parent160.size(), output);
114 return ret;
115 }
116
117 template <class HDKEY, class BYTES_OUT>
bip32_key_serialize(const HDKEY & hdkey,uint32_t flags,BYTES_OUT & bytes_out)118 inline int bip32_key_serialize(const HDKEY& hdkey, uint32_t flags, BYTES_OUT& bytes_out) {
119 int ret = ::bip32_key_serialize(detail::get_p(hdkey), flags, bytes_out.data(), bytes_out.size());
120 return ret;
121 }
122
bip32_key_strip_private_key(struct ext_key * hdkey)123 inline int bip32_key_strip_private_key(struct ext_key* hdkey) {
124 int ret = ::bip32_key_strip_private_key(hdkey);
125 return ret;
126 }
127
128 template <class HDKEY>
bip32_key_to_base58(const HDKEY & hdkey,uint32_t flags,char ** output)129 inline int bip32_key_to_base58(const HDKEY& hdkey, uint32_t flags, char** output) {
130 int ret = ::bip32_key_to_base58(detail::get_p(hdkey), flags, output);
131 return ret;
132 }
133
134 template <class BYTES>
bip32_key_unserialize(const BYTES & bytes,struct ext_key * output)135 inline int bip32_key_unserialize(const BYTES& bytes, struct ext_key* output) {
136 int ret = ::bip32_key_unserialize(bytes.data(), bytes.size(), output);
137 return ret;
138 }
139
140 template <class BYTES>
bip32_key_unserialize_alloc(const BYTES & bytes,struct ext_key ** output)141 inline int bip32_key_unserialize_alloc(const BYTES& bytes, struct ext_key** output) {
142 int ret = ::bip32_key_unserialize_alloc(bytes.data(), bytes.size(), output);
143 return ret;
144 }
145
146 template <class BYTES, class PASS>
bip38_from_private_key(const BYTES & bytes,const PASS & pass,uint32_t flags,char ** output)147 inline int bip38_from_private_key(const BYTES& bytes, const PASS& pass, uint32_t flags, char** output) {
148 int ret = ::bip38_from_private_key(bytes.data(), bytes.size(), pass.data(), pass.size(), flags, output);
149 return ret;
150 }
151
152 template <class BIP38>
bip38_get_flags(const BIP38 & bip38,size_t * written)153 inline int bip38_get_flags(const BIP38& bip38, size_t* written) {
154 int ret = ::bip38_get_flags(detail::get_p(bip38), written);
155 return ret;
156 }
157
158 template <class BYTES, class PASS, class BYTES_OUT>
bip38_raw_from_private_key(const BYTES & bytes,const PASS & pass,uint32_t flags,BYTES_OUT & bytes_out)159 inline int bip38_raw_from_private_key(const BYTES& bytes, const PASS& pass, uint32_t flags, BYTES_OUT& bytes_out) {
160 int ret = ::bip38_raw_from_private_key(bytes.data(), bytes.size(), pass.data(), pass.size(), flags, bytes_out.data(), bytes_out.size());
161 return ret;
162 }
163
164 template <class BYTES>
bip38_raw_get_flags(const BYTES & bytes,size_t * written=0)165 inline int bip38_raw_get_flags(const BYTES& bytes, size_t* written = 0) {
166 size_t n;
167 int ret = ::bip38_raw_get_flags(bytes.data(), bytes.size(), written ? written : &n);
168 return written || ret != WALLY_OK ? ret : n == static_cast<size_t>(bytes.size()) ? WALLY_OK : WALLY_EINVAL;
169 }
170
171 template <class BYTES, class PASS, class BYTES_OUT>
bip38_raw_to_private_key(const BYTES & bytes,const PASS & pass,uint32_t flags,BYTES_OUT & bytes_out)172 inline int bip38_raw_to_private_key(const BYTES& bytes, const PASS& pass, uint32_t flags, BYTES_OUT& bytes_out) {
173 int ret = ::bip38_raw_to_private_key(bytes.data(), bytes.size(), pass.data(), pass.size(), flags, bytes_out.data(), bytes_out.size());
174 return ret;
175 }
176
177 template <class BIP38, class PASS, class BYTES_OUT>
bip38_to_private_key(const BIP38 & bip38,const PASS & pass,uint32_t flags,BYTES_OUT & bytes_out)178 inline int bip38_to_private_key(const BIP38& bip38, const PASS& pass, uint32_t flags, BYTES_OUT& bytes_out) {
179 int ret = ::bip38_to_private_key(detail::get_p(bip38), pass.data(), pass.size(), flags, bytes_out.data(), bytes_out.size());
180 return ret;
181 }
182
bip39_get_languages(char ** output)183 inline int bip39_get_languages(char** output) {
184 int ret = ::bip39_get_languages(output);
185 return ret;
186 }
187
188 template <class W>
bip39_get_word(const W & w,size_t index,char ** output)189 inline int bip39_get_word(const W& w, size_t index, char** output) {
190 int ret = ::bip39_get_word(detail::get_p(w), index, output);
191 return ret;
192 }
193
194 template <class LANG>
bip39_get_wordlist(const LANG & lang,struct words ** output)195 inline int bip39_get_wordlist(const LANG& lang, struct words** output) {
196 int ret = ::bip39_get_wordlist(detail::get_p(lang), output);
197 return ret;
198 }
199
200 template <class W, class BYTES>
bip39_mnemonic_from_bytes(const W & w,const BYTES & bytes,char ** output)201 inline int bip39_mnemonic_from_bytes(const W& w, const BYTES& bytes, char** output) {
202 int ret = ::bip39_mnemonic_from_bytes(detail::get_p(w), bytes.data(), bytes.size(), output);
203 return ret;
204 }
205
206 template <class W, class MNEMONIC, class BYTES_OUT>
bip39_mnemonic_to_bytes(const W & w,const MNEMONIC & mnemonic,BYTES_OUT & bytes_out,size_t * written=0)207 inline int bip39_mnemonic_to_bytes(const W& w, const MNEMONIC& mnemonic, BYTES_OUT& bytes_out, size_t* written = 0) {
208 size_t n;
209 int ret = ::bip39_mnemonic_to_bytes(detail::get_p(w), detail::get_p(mnemonic), bytes_out.data(), bytes_out.size(), written ? written : &n);
210 return written || ret != WALLY_OK ? ret : n == static_cast<size_t>(bytes_out.size()) ? WALLY_OK : WALLY_EINVAL;
211 }
212
213 template <class MNEMONIC, class PASSPHRASE, class BYTES_OUT>
bip39_mnemonic_to_seed(const MNEMONIC & mnemonic,const PASSPHRASE & passphrase,BYTES_OUT & bytes_out,size_t * written=0)214 inline int bip39_mnemonic_to_seed(const MNEMONIC& mnemonic, const PASSPHRASE& passphrase, BYTES_OUT& bytes_out, size_t* written = 0) {
215 size_t n;
216 int ret = ::bip39_mnemonic_to_seed(detail::get_p(mnemonic), detail::get_p(passphrase), bytes_out.data(), bytes_out.size(), written ? written : &n);
217 return written || ret != WALLY_OK ? ret : n == static_cast<size_t>(bytes_out.size()) ? WALLY_OK : WALLY_EINVAL;
218 }
219
220 template <class W>
bip39_mnemonic_validate(const W & w,const char * mnemonic)221 inline int bip39_mnemonic_validate(const W& w, const char* mnemonic) {
222 int ret = ::bip39_mnemonic_validate(detail::get_p(w), mnemonic);
223 return ret;
224 }
225
226 template <class BYTES, class ADDR_FAMILY>
addr_segwit_from_bytes(const BYTES & bytes,const ADDR_FAMILY & addr_family,uint32_t flags,char ** output)227 inline int addr_segwit_from_bytes(const BYTES& bytes, const ADDR_FAMILY& addr_family, uint32_t flags, char** output) {
228 int ret = ::wally_addr_segwit_from_bytes(bytes.data(), bytes.size(), detail::get_p(addr_family), flags, output);
229 return ret;
230 }
231
232 template <class ADDR, class ADDR_FAMILY, class BYTES_OUT>
addr_segwit_to_bytes(const ADDR & addr,const ADDR_FAMILY & addr_family,uint32_t flags,BYTES_OUT & bytes_out,size_t * written=0)233 inline int addr_segwit_to_bytes(const ADDR& addr, const ADDR_FAMILY& addr_family, uint32_t flags, BYTES_OUT& bytes_out, size_t* written = 0) {
234 size_t n;
235 int ret = ::wally_addr_segwit_to_bytes(detail::get_p(addr), detail::get_p(addr_family), flags, bytes_out.data(), bytes_out.size(), written ? written : &n);
236 return written || ret != WALLY_OK ? ret : n == static_cast<size_t>(bytes_out.size()) ? WALLY_OK : WALLY_EINVAL;
237 }
238
239 template <class ADDR, class BYTES_OUT>
address_to_scriptpubkey(const ADDR & addr,uint32_t network,BYTES_OUT & bytes_out,size_t * written=0)240 inline int address_to_scriptpubkey(const ADDR& addr, uint32_t network, BYTES_OUT& bytes_out, size_t* written = 0) {
241 size_t n;
242 int ret = ::wally_address_to_scriptpubkey(detail::get_p(addr), network, bytes_out.data(), bytes_out.size(), written ? written : &n);
243 return written || ret != WALLY_OK ? ret : n == static_cast<size_t>(bytes_out.size()) ? WALLY_OK : WALLY_EINVAL;
244 }
245
246 template <class ENTROPY, class BYTES_OUT>
ae_host_commit_from_bytes(const ENTROPY & entropy,uint32_t flags,BYTES_OUT & bytes_out)247 inline int ae_host_commit_from_bytes(const ENTROPY& entropy, uint32_t flags, BYTES_OUT& bytes_out) {
248 int ret = ::wally_ae_host_commit_from_bytes(entropy.data(), entropy.size(), flags, bytes_out.data(), bytes_out.size());
249 return ret;
250 }
251
252 template <class PRIV_KEY, class BYTES, class ENTROPY, class BYTES_OUT>
ae_sig_from_bytes(const PRIV_KEY & priv_key,const BYTES & bytes,const ENTROPY & entropy,uint32_t flags,BYTES_OUT & bytes_out)253 inline int ae_sig_from_bytes(const PRIV_KEY& priv_key, const BYTES& bytes, const ENTROPY& entropy, uint32_t flags, BYTES_OUT& bytes_out) {
254 int ret = ::wally_ae_sig_from_bytes(priv_key.data(), priv_key.size(), bytes.data(), bytes.size(), entropy.data(), entropy.size(), flags, bytes_out.data(), bytes_out.size());
255 return ret;
256 }
257
258 template <class PRIV_KEY, class BYTES, class COMMITMENT, class S2C_OPENING_OUT>
ae_signer_commit_from_bytes(const PRIV_KEY & priv_key,const BYTES & bytes,const COMMITMENT & commitment,uint32_t flags,S2C_OPENING_OUT & s2c_opening_out)259 inline int ae_signer_commit_from_bytes(const PRIV_KEY& priv_key, const BYTES& bytes, const COMMITMENT& commitment, uint32_t flags, S2C_OPENING_OUT& s2c_opening_out) {
260 int ret = ::wally_ae_signer_commit_from_bytes(priv_key.data(), priv_key.size(), bytes.data(), bytes.size(), commitment.data(), commitment.size(), flags, s2c_opening_out.data(), s2c_opening_out.size());
261 return ret;
262 }
263
264 template <class PUB_KEY, class BYTES, class ENTROPY, class S2C_OPENING, class SIG>
ae_verify(const PUB_KEY & pub_key,const BYTES & bytes,const ENTROPY & entropy,const S2C_OPENING & s2c_opening,uint32_t flags,const SIG & sig)265 inline int ae_verify(const PUB_KEY& pub_key, const BYTES& bytes, const ENTROPY& entropy, const S2C_OPENING& s2c_opening, uint32_t flags, const SIG& sig) {
266 int ret = ::wally_ae_verify(pub_key.data(), pub_key.size(), bytes.data(), bytes.size(), entropy.data(), entropy.size(), s2c_opening.data(), s2c_opening.size(), flags, sig.data(), sig.size());
267 return ret;
268 }
269
270 template <class KEY, class BYTES, class BYTES_OUT>
aes(const KEY & key,const BYTES & bytes,uint32_t flags,BYTES_OUT & bytes_out)271 inline int aes(const KEY& key, const BYTES& bytes, uint32_t flags, BYTES_OUT& bytes_out) {
272 int ret = ::wally_aes(key.data(), key.size(), bytes.data(), bytes.size(), flags, bytes_out.data(), bytes_out.size());
273 return ret;
274 }
275
276 template <class KEY, class IV, class BYTES, class BYTES_OUT>
aes_cbc(const KEY & key,const IV & iv,const BYTES & bytes,uint32_t flags,BYTES_OUT & bytes_out,size_t * written=0)277 inline int aes_cbc(const KEY& key, const IV& iv, const BYTES& bytes, uint32_t flags, BYTES_OUT& bytes_out, size_t* written = 0) {
278 size_t n;
279 int ret = ::wally_aes_cbc(key.data(), key.size(), iv.data(), iv.size(), bytes.data(), bytes.size(), flags, bytes_out.data(), bytes_out.size(), written ? written : &n);
280 return written || ret != WALLY_OK ? ret : n == static_cast<size_t>(bytes_out.size()) ? WALLY_OK : WALLY_EINVAL;
281 }
282
283 template <class BYTES>
base58_from_bytes(const BYTES & bytes,uint32_t flags,char ** output)284 inline int base58_from_bytes(const BYTES& bytes, uint32_t flags, char** output) {
285 int ret = ::wally_base58_from_bytes(bytes.data(), bytes.size(), flags, output);
286 return ret;
287 }
288
289 template <class STR_IN>
base58_get_length(const STR_IN & str_in,size_t * written)290 inline int base58_get_length(const STR_IN& str_in, size_t* written) {
291 int ret = ::wally_base58_get_length(detail::get_p(str_in), written);
292 return ret;
293 }
294
295 template <class STR_IN, class BYTES_OUT>
base58_to_bytes(const STR_IN & str_in,uint32_t flags,BYTES_OUT & bytes_out,size_t * written=0)296 inline int base58_to_bytes(const STR_IN& str_in, uint32_t flags, BYTES_OUT& bytes_out, size_t* written = 0) {
297 size_t n;
298 int ret = ::wally_base58_to_bytes(detail::get_p(str_in), flags, bytes_out.data(), bytes_out.size(), written ? written : &n);
299 return written || ret != WALLY_OK ? ret : n == static_cast<size_t>(bytes_out.size()) ? WALLY_OK : WALLY_EINVAL;
300 }
301
302 template <class BYTES>
base64_from_bytes(const BYTES & bytes,uint32_t flags,char ** output)303 inline int base64_from_bytes(const BYTES& bytes, uint32_t flags, char** output) {
304 int ret = ::wally_base64_from_bytes(bytes.data(), bytes.size(), flags, output);
305 return ret;
306 }
307
308 template <class STR_IN>
base64_get_maximum_length(const STR_IN & str_in,uint32_t flags,size_t * written)309 inline int base64_get_maximum_length(const STR_IN& str_in, uint32_t flags, size_t* written) {
310 int ret = ::wally_base64_get_maximum_length(detail::get_p(str_in), flags, written);
311 return ret;
312 }
313
314 template <class STR_IN, class BYTES_OUT>
base64_to_bytes(const STR_IN & str_in,uint32_t flags,BYTES_OUT & bytes_out,size_t * written=0)315 inline int base64_to_bytes(const STR_IN& str_in, uint32_t flags, BYTES_OUT& bytes_out, size_t* written = 0) {
316 size_t n;
317 int ret = ::wally_base64_to_bytes(detail::get_p(str_in), flags, bytes_out.data(), bytes_out.size(), written ? written : &n);
318 return written || ret != WALLY_OK ? ret : n == static_cast<size_t>(bytes_out.size()) ? WALLY_OK : WALLY_EINVAL;
319 }
320
321 template <class HDKEY, class ADDR_FAMILY>
bip32_key_to_addr_segwit(const HDKEY & hdkey,const ADDR_FAMILY & addr_family,uint32_t flags,char ** output)322 inline int bip32_key_to_addr_segwit(const HDKEY& hdkey, const ADDR_FAMILY& addr_family, uint32_t flags, char** output) {
323 int ret = ::wally_bip32_key_to_addr_segwit(detail::get_p(hdkey), detail::get_p(addr_family), flags, output);
324 return ret;
325 }
326
327 template <class HDKEY>
bip32_key_to_address(const HDKEY & hdkey,uint32_t flags,uint32_t version,char ** output)328 inline int bip32_key_to_address(const HDKEY& hdkey, uint32_t flags, uint32_t version, char** output) {
329 int ret = ::wally_bip32_key_to_address(detail::get_p(hdkey), flags, version, output);
330 return ret;
331 }
332
333 template <class BYTES>
bzero(const BYTES & bytes,size_t bytes_len)334 inline int bzero(const BYTES& bytes, size_t bytes_len) {
335 int ret = ::wally_bzero(detail::get_p(bytes), bytes_len);
336 return ret;
337 }
338
cleanup(uint32_t flags)339 inline int cleanup(uint32_t flags) {
340 int ret = ::wally_cleanup(flags);
341 return ret;
342 }
343
344 template <class PRIV_KEY>
ec_private_key_verify(const PRIV_KEY & priv_key)345 inline int ec_private_key_verify(const PRIV_KEY& priv_key) {
346 int ret = ::wally_ec_private_key_verify(priv_key.data(), priv_key.size());
347 return ret;
348 }
349
350 template <class PUB_KEY, class BYTES_OUT>
ec_public_key_decompress(const PUB_KEY & pub_key,BYTES_OUT & bytes_out)351 inline int ec_public_key_decompress(const PUB_KEY& pub_key, BYTES_OUT& bytes_out) {
352 int ret = ::wally_ec_public_key_decompress(pub_key.data(), pub_key.size(), bytes_out.data(), bytes_out.size());
353 return ret;
354 }
355
356 template <class PRIV_KEY, class BYTES_OUT>
ec_public_key_from_private_key(const PRIV_KEY & priv_key,BYTES_OUT & bytes_out)357 inline int ec_public_key_from_private_key(const PRIV_KEY& priv_key, BYTES_OUT& bytes_out) {
358 int ret = ::wally_ec_public_key_from_private_key(priv_key.data(), priv_key.size(), bytes_out.data(), bytes_out.size());
359 return ret;
360 }
361
362 template <class PUB_KEY, class BYTES_OUT>
ec_public_key_negate(const PUB_KEY & pub_key,BYTES_OUT & bytes_out)363 inline int ec_public_key_negate(const PUB_KEY& pub_key, BYTES_OUT& bytes_out) {
364 int ret = ::wally_ec_public_key_negate(pub_key.data(), pub_key.size(), bytes_out.data(), bytes_out.size());
365 return ret;
366 }
367
368 template <class PUB_KEY>
ec_public_key_verify(const PUB_KEY & pub_key)369 inline int ec_public_key_verify(const PUB_KEY& pub_key) {
370 int ret = ::wally_ec_public_key_verify(pub_key.data(), pub_key.size());
371 return ret;
372 }
373
374 template <class PRIV_KEY, class BYTES, class BYTES_OUT>
ec_sig_from_bytes(const PRIV_KEY & priv_key,const BYTES & bytes,uint32_t flags,BYTES_OUT & bytes_out)375 inline int ec_sig_from_bytes(const PRIV_KEY& priv_key, const BYTES& bytes, uint32_t flags, BYTES_OUT& bytes_out) {
376 int ret = ::wally_ec_sig_from_bytes(priv_key.data(), priv_key.size(), bytes.data(), bytes.size(), flags, bytes_out.data(), bytes_out.size());
377 return ret;
378 }
379
380 template <class BYTES, class BYTES_OUT>
ec_sig_from_der(const BYTES & bytes,BYTES_OUT & bytes_out)381 inline int ec_sig_from_der(const BYTES& bytes, BYTES_OUT& bytes_out) {
382 int ret = ::wally_ec_sig_from_der(bytes.data(), bytes.size(), bytes_out.data(), bytes_out.size());
383 return ret;
384 }
385
386 template <class SIG, class BYTES_OUT>
ec_sig_normalize(const SIG & sig,BYTES_OUT & bytes_out)387 inline int ec_sig_normalize(const SIG& sig, BYTES_OUT& bytes_out) {
388 int ret = ::wally_ec_sig_normalize(sig.data(), sig.size(), bytes_out.data(), bytes_out.size());
389 return ret;
390 }
391
392 template <class SIG, class BYTES_OUT>
ec_sig_to_der(const SIG & sig,BYTES_OUT & bytes_out,size_t * written=0)393 inline int ec_sig_to_der(const SIG& sig, BYTES_OUT& bytes_out, size_t* written = 0) {
394 size_t n;
395 int ret = ::wally_ec_sig_to_der(sig.data(), sig.size(), bytes_out.data(), bytes_out.size(), written ? written : &n);
396 return written || ret != WALLY_OK ? ret : n == static_cast<size_t>(bytes_out.size()) ? WALLY_OK : WALLY_EINVAL;
397 }
398
399 template <class BYTES, class SIG, class BYTES_OUT>
ec_sig_to_public_key(const BYTES & bytes,const SIG & sig,BYTES_OUT & bytes_out)400 inline int ec_sig_to_public_key(const BYTES& bytes, const SIG& sig, BYTES_OUT& bytes_out) {
401 int ret = ::wally_ec_sig_to_public_key(bytes.data(), bytes.size(), sig.data(), sig.size(), bytes_out.data(), bytes_out.size());
402 return ret;
403 }
404
405 template <class PUB_KEY, class BYTES, class SIG>
ec_sig_verify(const PUB_KEY & pub_key,const BYTES & bytes,uint32_t flags,const SIG & sig)406 inline int ec_sig_verify(const PUB_KEY& pub_key, const BYTES& bytes, uint32_t flags, const SIG& sig) {
407 int ret = ::wally_ec_sig_verify(pub_key.data(), pub_key.size(), bytes.data(), bytes.size(), flags, sig.data(), sig.size());
408 return ret;
409 }
410
411 template <class PUB_KEY, class PRIV_KEY, class BYTES_OUT>
ecdh(const PUB_KEY & pub_key,const PRIV_KEY & priv_key,BYTES_OUT & bytes_out)412 inline int ecdh(const PUB_KEY& pub_key, const PRIV_KEY& priv_key, BYTES_OUT& bytes_out) {
413 int ret = ::wally_ecdh(pub_key.data(), pub_key.size(), priv_key.data(), priv_key.size(), bytes_out.data(), bytes_out.size());
414 return ret;
415 }
416
417 template <class BYTES, class BYTES_OUT>
format_bitcoin_message(const BYTES & bytes,uint32_t flags,BYTES_OUT & bytes_out,size_t * written=0)418 inline int format_bitcoin_message(const BYTES& bytes, uint32_t flags, BYTES_OUT& bytes_out, size_t* written = 0) {
419 size_t n;
420 int ret = ::wally_format_bitcoin_message(bytes.data(), bytes.size(), flags, bytes_out.data(), bytes_out.size(), written ? written : &n);
421 return written || ret != WALLY_OK ? ret : n == static_cast<size_t>(bytes_out.size()) ? WALLY_OK : WALLY_EINVAL;
422 }
423
free_string(char * str)424 inline int free_string(char* str) {
425 int ret = ::wally_free_string(str);
426 return ret;
427 }
428
get_operations(struct wally_operations * output)429 inline int get_operations(struct wally_operations* output) {
430 int ret = ::wally_get_operations(output);
431 return ret;
432 }
433
434 template <class BYTES, class BYTES_OUT>
hash160(const BYTES & bytes,BYTES_OUT & bytes_out)435 inline int hash160(const BYTES& bytes, BYTES_OUT& bytes_out) {
436 int ret = ::wally_hash160(bytes.data(), bytes.size(), bytes_out.data(), bytes_out.size());
437 return ret;
438 }
439
440 template <class BYTES>
hex_from_bytes(const BYTES & bytes,char ** output)441 inline int hex_from_bytes(const BYTES& bytes, char** output) {
442 int ret = ::wally_hex_from_bytes(bytes.data(), bytes.size(), output);
443 return ret;
444 }
445
446 template <class HEX, class BYTES_OUT>
hex_to_bytes(const HEX & hex,BYTES_OUT & bytes_out,size_t * written=0)447 inline int hex_to_bytes(const HEX& hex, BYTES_OUT& bytes_out, size_t* written = 0) {
448 size_t n;
449 int ret = ::wally_hex_to_bytes(detail::get_p(hex), bytes_out.data(), bytes_out.size(), written ? written : &n);
450 return written || ret != WALLY_OK ? ret : n == static_cast<size_t>(bytes_out.size()) ? WALLY_OK : WALLY_EINVAL;
451 }
452
453 template <class KEY, class BYTES, class BYTES_OUT>
hmac_sha256(const KEY & key,const BYTES & bytes,BYTES_OUT & bytes_out)454 inline int hmac_sha256(const KEY& key, const BYTES& bytes, BYTES_OUT& bytes_out) {
455 int ret = ::wally_hmac_sha256(key.data(), key.size(), bytes.data(), bytes.size(), bytes_out.data(), bytes_out.size());
456 return ret;
457 }
458
459 template <class KEY, class BYTES, class BYTES_OUT>
hmac_sha512(const KEY & key,const BYTES & bytes,BYTES_OUT & bytes_out)460 inline int hmac_sha512(const KEY& key, const BYTES& bytes, BYTES_OUT& bytes_out) {
461 int ret = ::wally_hmac_sha512(key.data(), key.size(), bytes.data(), bytes.size(), bytes_out.data(), bytes_out.size());
462 return ret;
463 }
464
init(uint32_t flags)465 inline int init(uint32_t flags) {
466 int ret = ::wally_init(flags);
467 return ret;
468 }
469
is_elements_build(size_t * written)470 inline int is_elements_build(size_t* written) {
471 int ret = ::wally_is_elements_build(written);
472 return ret;
473 }
474
475 template <class MAP_IN, class KEY, class VALUE>
map_add(const MAP_IN & map_in,const KEY & key,const VALUE & value)476 inline int map_add(const MAP_IN& map_in, const KEY& key, const VALUE& value) {
477 int ret = ::wally_map_add(detail::get_p(map_in), key.data(), key.size(), value.data(), value.size());
478 return ret;
479 }
480
481 template <class MAP_IN, class PUB_KEY, class FINGERPRINT, class CHILD_PATH>
map_add_keypath_item(const MAP_IN & map_in,const PUB_KEY & pub_key,const FINGERPRINT & fingerprint,const CHILD_PATH & child_path)482 inline int map_add_keypath_item(const MAP_IN& map_in, const PUB_KEY& pub_key, const FINGERPRINT& fingerprint, const CHILD_PATH& child_path) {
483 int ret = ::wally_map_add_keypath_item(detail::get_p(map_in), pub_key.data(), pub_key.size(), fingerprint.data(), fingerprint.size(), child_path.data(), child_path.size());
484 return ret;
485 }
486
487 template <class MAP_IN, class KEY>
map_find(const MAP_IN & map_in,const KEY & key,size_t * written=0)488 inline int map_find(const MAP_IN& map_in, const KEY& key, size_t* written = 0) {
489 size_t n;
490 int ret = ::wally_map_find(detail::get_p(map_in), key.data(), key.size(), written ? written : &n);
491 return written || ret != WALLY_OK ? ret : n == static_cast<size_t>(key.size()) ? WALLY_OK : WALLY_EINVAL;
492 }
493
map_free(struct wally_map * map_in)494 inline int map_free(struct wally_map* map_in) {
495 int ret = ::wally_map_free(map_in);
496 return ret;
497 }
498
map_init_alloc(size_t allocation_len,struct wally_map ** output)499 inline int map_init_alloc(size_t allocation_len, struct wally_map** output) {
500 int ret = ::wally_map_init_alloc(allocation_len, output);
501 return ret;
502 }
503
504 template <class MAP_IN>
map_sort(const MAP_IN & map_in,uint32_t flags)505 inline int map_sort(const MAP_IN& map_in, uint32_t flags) {
506 int ret = ::wally_map_sort(detail::get_p(map_in), flags);
507 return ret;
508 }
509
510 template <class PASS, class SALT, class BYTES_OUT>
pbkdf2_hmac_sha256(const PASS & pass,const SALT & salt,uint32_t flags,uint32_t cost,BYTES_OUT & bytes_out)511 inline int pbkdf2_hmac_sha256(const PASS& pass, const SALT& salt, uint32_t flags, uint32_t cost, BYTES_OUT& bytes_out) {
512 int ret = ::wally_pbkdf2_hmac_sha256(pass.data(), pass.size(), salt.data(), salt.size(), flags, cost, bytes_out.data(), bytes_out.size());
513 return ret;
514 }
515
516 template <class PASS, class SALT, class BYTES_OUT>
pbkdf2_hmac_sha512(const PASS & pass,const SALT & salt,uint32_t flags,uint32_t cost,BYTES_OUT & bytes_out)517 inline int pbkdf2_hmac_sha512(const PASS& pass, const SALT& salt, uint32_t flags, uint32_t cost, BYTES_OUT& bytes_out) {
518 int ret = ::wally_pbkdf2_hmac_sha512(pass.data(), pass.size(), salt.data(), salt.size(), flags, cost, bytes_out.data(), bytes_out.size());
519 return ret;
520 }
521
522 template <class PSBT>
psbt_add_input_at(const PSBT & psbt,uint32_t index,uint32_t flags,const struct wally_tx_input * input)523 inline int psbt_add_input_at(const PSBT& psbt, uint32_t index, uint32_t flags, const struct wally_tx_input* input) {
524 int ret = ::wally_psbt_add_input_at(detail::get_p(psbt), index, flags, input);
525 return ret;
526 }
527
528 template <class PSBT>
psbt_add_output_at(const PSBT & psbt,uint32_t index,uint32_t flags,const struct wally_tx_output * output)529 inline int psbt_add_output_at(const PSBT& psbt, uint32_t index, uint32_t flags, const struct wally_tx_output* output) {
530 int ret = ::wally_psbt_add_output_at(detail::get_p(psbt), index, flags, output);
531 return ret;
532 }
533
534 template <class PSBT>
psbt_clone_alloc(const PSBT & psbt,uint32_t flags,struct wally_psbt ** output)535 inline int psbt_clone_alloc(const PSBT& psbt, uint32_t flags, struct wally_psbt** output) {
536 int ret = ::wally_psbt_clone_alloc(detail::get_p(psbt), flags, output);
537 return ret;
538 }
539
540 template <class PSBT>
psbt_combine(const PSBT & psbt,const struct wally_psbt * src)541 inline int psbt_combine(const PSBT& psbt, const struct wally_psbt* src) {
542 int ret = ::wally_psbt_combine(detail::get_p(psbt), src);
543 return ret;
544 }
545
546 template <class PSBT>
psbt_extract(const PSBT & psbt,struct wally_tx ** output)547 inline int psbt_extract(const PSBT& psbt, struct wally_tx** output) {
548 int ret = ::wally_psbt_extract(detail::get_p(psbt), output);
549 return ret;
550 }
551
psbt_finalize(struct wally_psbt * psbt)552 inline int psbt_finalize(struct wally_psbt* psbt) {
553 int ret = ::wally_psbt_finalize(psbt);
554 return ret;
555 }
556
psbt_free(struct wally_psbt * psbt)557 inline int psbt_free(struct wally_psbt* psbt) {
558 int ret = ::wally_psbt_free(psbt);
559 return ret;
560 }
561
562 template <class BASE64>
psbt_from_base64(const BASE64 & base64,struct wally_psbt ** output)563 inline int psbt_from_base64(const BASE64& base64, struct wally_psbt** output) {
564 int ret = ::wally_psbt_from_base64(detail::get_p(base64), output);
565 return ret;
566 }
567
568 template <class BYTES>
psbt_from_bytes(const BYTES & bytes,struct wally_psbt ** output)569 inline int psbt_from_bytes(const BYTES& bytes, struct wally_psbt** output) {
570 int ret = ::wally_psbt_from_bytes(bytes.data(), bytes.size(), output);
571 return ret;
572 }
573
574 template <class PSBT>
psbt_get_length(const PSBT & psbt,uint32_t flags,size_t * written)575 inline int psbt_get_length(const PSBT& psbt, uint32_t flags, size_t* written) {
576 int ret = ::wally_psbt_get_length(detail::get_p(psbt), flags, written);
577 return ret;
578 }
579
psbt_init_alloc(uint32_t version,size_t inputs_allocation_len,size_t outputs_allocation_len,size_t global_unknowns_allocation_len,struct wally_psbt ** output)580 inline int psbt_init_alloc(uint32_t version, size_t inputs_allocation_len, size_t outputs_allocation_len, size_t global_unknowns_allocation_len, struct wally_psbt** output) {
581 int ret = ::wally_psbt_init_alloc(version, inputs_allocation_len, outputs_allocation_len, global_unknowns_allocation_len, output);
582 return ret;
583 }
584
585 template <class INPUT, class PUB_KEY, class FINGERPRINT, class CHILD_PATH>
psbt_input_add_keypath_item(const INPUT & input,const PUB_KEY & pub_key,const FINGERPRINT & fingerprint,const CHILD_PATH & child_path)586 inline int psbt_input_add_keypath_item(const INPUT& input, const PUB_KEY& pub_key, const FINGERPRINT& fingerprint, const CHILD_PATH& child_path) {
587 int ret = ::wally_psbt_input_add_keypath_item(detail::get_p(input), pub_key.data(), pub_key.size(), fingerprint.data(), fingerprint.size(), child_path.data(), child_path.size());
588 return ret;
589 }
590
591 template <class INPUT, class PUB_KEY, class SIG>
psbt_input_add_signature(const INPUT & input,const PUB_KEY & pub_key,const SIG & sig)592 inline int psbt_input_add_signature(const INPUT& input, const PUB_KEY& pub_key, const SIG& sig) {
593 int ret = ::wally_psbt_input_add_signature(detail::get_p(input), pub_key.data(), pub_key.size(), sig.data(), sig.size());
594 return ret;
595 }
596
597 template <class INPUT, class PUB_KEY>
psbt_input_find_keypath(const INPUT & input,const PUB_KEY & pub_key,size_t * written=0)598 inline int psbt_input_find_keypath(const INPUT& input, const PUB_KEY& pub_key, size_t* written = 0) {
599 size_t n;
600 int ret = ::wally_psbt_input_find_keypath(detail::get_p(input), pub_key.data(), pub_key.size(), written ? written : &n);
601 return written || ret != WALLY_OK ? ret : n == static_cast<size_t>(pub_key.size()) ? WALLY_OK : WALLY_EINVAL;
602 }
603
604 template <class INPUT, class PUB_KEY>
psbt_input_find_signature(const INPUT & input,const PUB_KEY & pub_key,size_t * written=0)605 inline int psbt_input_find_signature(const INPUT& input, const PUB_KEY& pub_key, size_t* written = 0) {
606 size_t n;
607 int ret = ::wally_psbt_input_find_signature(detail::get_p(input), pub_key.data(), pub_key.size(), written ? written : &n);
608 return written || ret != WALLY_OK ? ret : n == static_cast<size_t>(pub_key.size()) ? WALLY_OK : WALLY_EINVAL;
609 }
610
611 template <class INPUT, class KEY>
psbt_input_find_unknown(const INPUT & input,const KEY & key,size_t * written=0)612 inline int psbt_input_find_unknown(const INPUT& input, const KEY& key, size_t* written = 0) {
613 size_t n;
614 int ret = ::wally_psbt_input_find_unknown(detail::get_p(input), key.data(), key.size(), written ? written : &n);
615 return written || ret != WALLY_OK ? ret : n == static_cast<size_t>(key.size()) ? WALLY_OK : WALLY_EINVAL;
616 }
617
618 template <class INPUT>
psbt_input_is_finalized(const INPUT & input,size_t * written)619 inline int psbt_input_is_finalized(const INPUT& input, size_t* written) {
620 int ret = ::wally_psbt_input_is_finalized(detail::get_p(input), written);
621 return ret;
622 }
623
624 template <class INPUT, class FINAL_SCRIPTSIG>
psbt_input_set_final_scriptsig(const INPUT & input,const FINAL_SCRIPTSIG & final_scriptsig)625 inline int psbt_input_set_final_scriptsig(const INPUT& input, const FINAL_SCRIPTSIG& final_scriptsig) {
626 int ret = ::wally_psbt_input_set_final_scriptsig(detail::get_p(input), final_scriptsig.data(), final_scriptsig.size());
627 return ret;
628 }
629
630 template <class INPUT>
psbt_input_set_final_witness(const INPUT & input,const struct wally_tx_witness_stack * final_witness)631 inline int psbt_input_set_final_witness(const INPUT& input, const struct wally_tx_witness_stack* final_witness) {
632 int ret = ::wally_psbt_input_set_final_witness(detail::get_p(input), final_witness);
633 return ret;
634 }
635
636 template <class INPUT>
psbt_input_set_keypaths(const INPUT & input,const struct wally_map * map_in)637 inline int psbt_input_set_keypaths(const INPUT& input, const struct wally_map* map_in) {
638 int ret = ::wally_psbt_input_set_keypaths(detail::get_p(input), map_in);
639 return ret;
640 }
641
642 template <class INPUT, class SCRIPT>
psbt_input_set_redeem_script(const INPUT & input,const SCRIPT & script)643 inline int psbt_input_set_redeem_script(const INPUT& input, const SCRIPT& script) {
644 int ret = ::wally_psbt_input_set_redeem_script(detail::get_p(input), script.data(), script.size());
645 return ret;
646 }
647
648 template <class INPUT>
psbt_input_set_sighash(const INPUT & input,uint32_t sighash)649 inline int psbt_input_set_sighash(const INPUT& input, uint32_t sighash) {
650 int ret = ::wally_psbt_input_set_sighash(detail::get_p(input), sighash);
651 return ret;
652 }
653
654 template <class INPUT>
psbt_input_set_signatures(const INPUT & input,const struct wally_map * map_in)655 inline int psbt_input_set_signatures(const INPUT& input, const struct wally_map* map_in) {
656 int ret = ::wally_psbt_input_set_signatures(detail::get_p(input), map_in);
657 return ret;
658 }
659
660 template <class INPUT>
psbt_input_set_unknowns(const INPUT & input,const struct wally_map * map_in)661 inline int psbt_input_set_unknowns(const INPUT& input, const struct wally_map* map_in) {
662 int ret = ::wally_psbt_input_set_unknowns(detail::get_p(input), map_in);
663 return ret;
664 }
665
666 template <class INPUT>
psbt_input_set_utxo(const INPUT & input,const struct wally_tx * utxo)667 inline int psbt_input_set_utxo(const INPUT& input, const struct wally_tx* utxo) {
668 int ret = ::wally_psbt_input_set_utxo(detail::get_p(input), utxo);
669 return ret;
670 }
671
672 template <class INPUT, class SCRIPT>
psbt_input_set_witness_script(const INPUT & input,const SCRIPT & script)673 inline int psbt_input_set_witness_script(const INPUT& input, const SCRIPT& script) {
674 int ret = ::wally_psbt_input_set_witness_script(detail::get_p(input), script.data(), script.size());
675 return ret;
676 }
677
678 template <class INPUT>
psbt_input_set_witness_utxo(const INPUT & input,const struct wally_tx_output * witness_utxo)679 inline int psbt_input_set_witness_utxo(const INPUT& input, const struct wally_tx_output* witness_utxo) {
680 int ret = ::wally_psbt_input_set_witness_utxo(detail::get_p(input), witness_utxo);
681 return ret;
682 }
683
684 template <class PSBT>
psbt_is_elements(const PSBT & psbt,size_t * written)685 inline int psbt_is_elements(const PSBT& psbt, size_t* written) {
686 int ret = ::wally_psbt_is_elements(detail::get_p(psbt), written);
687 return ret;
688 }
689
690 template <class PSBT>
psbt_is_finalized(const PSBT & psbt,size_t * written)691 inline int psbt_is_finalized(const PSBT& psbt, size_t* written) {
692 int ret = ::wally_psbt_is_finalized(detail::get_p(psbt), written);
693 return ret;
694 }
695
696 template <class OUTPUT, class PUB_KEY, class FINGERPRINT, class CHILD_PATH>
psbt_output_add_keypath_item(const OUTPUT & output,const PUB_KEY & pub_key,const FINGERPRINT & fingerprint,const CHILD_PATH & child_path)697 inline int psbt_output_add_keypath_item(const OUTPUT& output, const PUB_KEY& pub_key, const FINGERPRINT& fingerprint, const CHILD_PATH& child_path) {
698 int ret = ::wally_psbt_output_add_keypath_item(detail::get_p(output), pub_key.data(), pub_key.size(), fingerprint.data(), fingerprint.size(), child_path.data(), child_path.size());
699 return ret;
700 }
701
702 template <class OUTPUT, class PUB_KEY>
psbt_output_find_keypath(const OUTPUT & output,const PUB_KEY & pub_key,size_t * written=0)703 inline int psbt_output_find_keypath(const OUTPUT& output, const PUB_KEY& pub_key, size_t* written = 0) {
704 size_t n;
705 int ret = ::wally_psbt_output_find_keypath(detail::get_p(output), pub_key.data(), pub_key.size(), written ? written : &n);
706 return written || ret != WALLY_OK ? ret : n == static_cast<size_t>(pub_key.size()) ? WALLY_OK : WALLY_EINVAL;
707 }
708
709 template <class OUTPUT, class KEY>
psbt_output_find_unknown(const OUTPUT & output,const KEY & key,size_t * written=0)710 inline int psbt_output_find_unknown(const OUTPUT& output, const KEY& key, size_t* written = 0) {
711 size_t n;
712 int ret = ::wally_psbt_output_find_unknown(detail::get_p(output), key.data(), key.size(), written ? written : &n);
713 return written || ret != WALLY_OK ? ret : n == static_cast<size_t>(key.size()) ? WALLY_OK : WALLY_EINVAL;
714 }
715
716 template <class OUTPUT>
psbt_output_set_keypaths(const OUTPUT & output,const struct wally_map * map_in)717 inline int psbt_output_set_keypaths(const OUTPUT& output, const struct wally_map* map_in) {
718 int ret = ::wally_psbt_output_set_keypaths(detail::get_p(output), map_in);
719 return ret;
720 }
721
722 template <class OUTPUT, class SCRIPT>
psbt_output_set_redeem_script(const OUTPUT & output,const SCRIPT & script)723 inline int psbt_output_set_redeem_script(const OUTPUT& output, const SCRIPT& script) {
724 int ret = ::wally_psbt_output_set_redeem_script(detail::get_p(output), script.data(), script.size());
725 return ret;
726 }
727
728 template <class OUTPUT>
psbt_output_set_unknowns(const OUTPUT & output,const struct wally_map * map_in)729 inline int psbt_output_set_unknowns(const OUTPUT& output, const struct wally_map* map_in) {
730 int ret = ::wally_psbt_output_set_unknowns(detail::get_p(output), map_in);
731 return ret;
732 }
733
734 template <class OUTPUT, class SCRIPT>
psbt_output_set_witness_script(const OUTPUT & output,const SCRIPT & script)735 inline int psbt_output_set_witness_script(const OUTPUT& output, const SCRIPT& script) {
736 int ret = ::wally_psbt_output_set_witness_script(detail::get_p(output), script.data(), script.size());
737 return ret;
738 }
739
740 template <class PSBT>
psbt_remove_input(const PSBT & psbt,uint32_t index)741 inline int psbt_remove_input(const PSBT& psbt, uint32_t index) {
742 int ret = ::wally_psbt_remove_input(detail::get_p(psbt), index);
743 return ret;
744 }
745
746 template <class PSBT>
psbt_remove_output(const PSBT & psbt,uint32_t index)747 inline int psbt_remove_output(const PSBT& psbt, uint32_t index) {
748 int ret = ::wally_psbt_remove_output(detail::get_p(psbt), index);
749 return ret;
750 }
751
752 template <class PSBT>
psbt_set_global_tx(const PSBT & psbt,const struct wally_tx * tx)753 inline int psbt_set_global_tx(const PSBT& psbt, const struct wally_tx* tx) {
754 int ret = ::wally_psbt_set_global_tx(detail::get_p(psbt), tx);
755 return ret;
756 }
757
758 template <class PSBT, class KEY>
psbt_sign(const PSBT & psbt,const KEY & key,uint32_t flags)759 inline int psbt_sign(const PSBT& psbt, const KEY& key, uint32_t flags) {
760 int ret = ::wally_psbt_sign(detail::get_p(psbt), key.data(), key.size(), flags);
761 return ret;
762 }
763
764 template <class PSBT>
psbt_to_base64(const PSBT & psbt,uint32_t flags,char ** output)765 inline int psbt_to_base64(const PSBT& psbt, uint32_t flags, char** output) {
766 int ret = ::wally_psbt_to_base64(detail::get_p(psbt), flags, output);
767 return ret;
768 }
769
770 template <class PSBT, class BYTES_OUT>
psbt_to_bytes(const PSBT & psbt,uint32_t flags,BYTES_OUT & bytes_out,size_t * written=0)771 inline int psbt_to_bytes(const PSBT& psbt, uint32_t flags, BYTES_OUT& bytes_out, size_t* written = 0) {
772 size_t n;
773 int ret = ::wally_psbt_to_bytes(detail::get_p(psbt), flags, bytes_out.data(), bytes_out.size(), written ? written : &n);
774 return written || ret != WALLY_OK ? ret : n == static_cast<size_t>(bytes_out.size()) ? WALLY_OK : WALLY_EINVAL;
775 }
776
777 template <class SIG, class S2C_DATA, class S2C_OPENING>
s2c_commitment_verify(const SIG & sig,const S2C_DATA & s2c_data,const S2C_OPENING & s2c_opening,uint32_t flags)778 inline int s2c_commitment_verify(const SIG& sig, const S2C_DATA& s2c_data, const S2C_OPENING& s2c_opening, uint32_t flags) {
779 int ret = ::wally_s2c_commitment_verify(sig.data(), sig.size(), s2c_data.data(), s2c_data.size(), s2c_opening.data(), s2c_opening.size(), flags);
780 return ret;
781 }
782
783 template <class PRIV_KEY, class BYTES, class S2C_DATA, class S2C_OPENING_OUT, class BYTES_OUT>
s2c_sig_from_bytes(const PRIV_KEY & priv_key,const BYTES & bytes,const S2C_DATA & s2c_data,uint32_t flags,S2C_OPENING_OUT & s2c_opening_out,BYTES_OUT & bytes_out)784 inline int s2c_sig_from_bytes(const PRIV_KEY& priv_key, const BYTES& bytes, const S2C_DATA& s2c_data, uint32_t flags, S2C_OPENING_OUT& s2c_opening_out, BYTES_OUT& bytes_out) {
785 int ret = ::wally_s2c_sig_from_bytes(priv_key.data(), priv_key.size(), bytes.data(), bytes.size(), s2c_data.data(), s2c_data.size(), flags, s2c_opening_out.data(), s2c_opening_out.size(), bytes_out.data(), bytes_out.size());
786 return ret;
787 }
788
789 template <class BYTES, class BYTES_OUT>
script_push_from_bytes(const BYTES & bytes,uint32_t flags,BYTES_OUT & bytes_out,size_t * written=0)790 inline int script_push_from_bytes(const BYTES& bytes, uint32_t flags, BYTES_OUT& bytes_out, size_t* written = 0) {
791 size_t n;
792 int ret = ::wally_script_push_from_bytes(bytes.data(), bytes.size(), flags, bytes_out.data(), bytes_out.size(), written ? written : &n);
793 return written || ret != WALLY_OK ? ret : n == static_cast<size_t>(bytes_out.size()) ? WALLY_OK : WALLY_EINVAL;
794 }
795
796 template <class BYTES, class BYTES_OUT>
scriptpubkey_csv_2of2_then_1_from_bytes(const BYTES & bytes,uint32_t csv_blocks,uint32_t flags,BYTES_OUT & bytes_out,size_t * written=0)797 inline int scriptpubkey_csv_2of2_then_1_from_bytes(const BYTES& bytes, uint32_t csv_blocks, uint32_t flags, BYTES_OUT& bytes_out, size_t* written = 0) {
798 size_t n;
799 int ret = ::wally_scriptpubkey_csv_2of2_then_1_from_bytes(bytes.data(), bytes.size(), csv_blocks, flags, bytes_out.data(), bytes_out.size(), written ? written : &n);
800 return written || ret != WALLY_OK ? ret : n == static_cast<size_t>(bytes_out.size()) ? WALLY_OK : WALLY_EINVAL;
801 }
802
803 template <class BYTES, class BYTES_OUT>
scriptpubkey_csv_2of2_then_1_from_bytes_opt(const BYTES & bytes,uint32_t csv_blocks,uint32_t flags,BYTES_OUT & bytes_out,size_t * written=0)804 inline int scriptpubkey_csv_2of2_then_1_from_bytes_opt(const BYTES& bytes, uint32_t csv_blocks, uint32_t flags, BYTES_OUT& bytes_out, size_t* written = 0) {
805 size_t n;
806 int ret = ::wally_scriptpubkey_csv_2of2_then_1_from_bytes_opt(bytes.data(), bytes.size(), csv_blocks, flags, bytes_out.data(), bytes_out.size(), written ? written : &n);
807 return written || ret != WALLY_OK ? ret : n == static_cast<size_t>(bytes_out.size()) ? WALLY_OK : WALLY_EINVAL;
808 }
809
810 template <class BYTES, class BYTES_OUT>
scriptpubkey_csv_2of3_then_2_from_bytes(const BYTES & bytes,uint32_t csv_blocks,uint32_t flags,BYTES_OUT & bytes_out,size_t * written=0)811 inline int scriptpubkey_csv_2of3_then_2_from_bytes(const BYTES& bytes, uint32_t csv_blocks, uint32_t flags, BYTES_OUT& bytes_out, size_t* written = 0) {
812 size_t n;
813 int ret = ::wally_scriptpubkey_csv_2of3_then_2_from_bytes(bytes.data(), bytes.size(), csv_blocks, flags, bytes_out.data(), bytes_out.size(), written ? written : &n);
814 return written || ret != WALLY_OK ? ret : n == static_cast<size_t>(bytes_out.size()) ? WALLY_OK : WALLY_EINVAL;
815 }
816
817 template <class BYTES>
scriptpubkey_get_type(const BYTES & bytes,size_t * written=0)818 inline int scriptpubkey_get_type(const BYTES& bytes, size_t* written = 0) {
819 size_t n;
820 int ret = ::wally_scriptpubkey_get_type(bytes.data(), bytes.size(), written ? written : &n);
821 return written || ret != WALLY_OK ? ret : n == static_cast<size_t>(bytes.size()) ? WALLY_OK : WALLY_EINVAL;
822 }
823
824 template <class BYTES, class BYTES_OUT>
scriptpubkey_multisig_from_bytes(const BYTES & bytes,uint32_t threshold,uint32_t flags,BYTES_OUT & bytes_out,size_t * written=0)825 inline int scriptpubkey_multisig_from_bytes(const BYTES& bytes, uint32_t threshold, uint32_t flags, BYTES_OUT& bytes_out, size_t* written = 0) {
826 size_t n;
827 int ret = ::wally_scriptpubkey_multisig_from_bytes(bytes.data(), bytes.size(), threshold, flags, bytes_out.data(), bytes_out.size(), written ? written : &n);
828 return written || ret != WALLY_OK ? ret : n == static_cast<size_t>(bytes_out.size()) ? WALLY_OK : WALLY_EINVAL;
829 }
830
831 template <class BYTES, class BYTES_OUT>
scriptpubkey_op_return_from_bytes(const BYTES & bytes,uint32_t flags,BYTES_OUT & bytes_out,size_t * written=0)832 inline int scriptpubkey_op_return_from_bytes(const BYTES& bytes, uint32_t flags, BYTES_OUT& bytes_out, size_t* written = 0) {
833 size_t n;
834 int ret = ::wally_scriptpubkey_op_return_from_bytes(bytes.data(), bytes.size(), flags, bytes_out.data(), bytes_out.size(), written ? written : &n);
835 return written || ret != WALLY_OK ? ret : n == static_cast<size_t>(bytes_out.size()) ? WALLY_OK : WALLY_EINVAL;
836 }
837
838 template <class BYTES, class BYTES_OUT>
scriptpubkey_p2pkh_from_bytes(const BYTES & bytes,uint32_t flags,BYTES_OUT & bytes_out,size_t * written=0)839 inline int scriptpubkey_p2pkh_from_bytes(const BYTES& bytes, uint32_t flags, BYTES_OUT& bytes_out, size_t* written = 0) {
840 size_t n;
841 int ret = ::wally_scriptpubkey_p2pkh_from_bytes(bytes.data(), bytes.size(), flags, bytes_out.data(), bytes_out.size(), written ? written : &n);
842 return written || ret != WALLY_OK ? ret : n == static_cast<size_t>(bytes_out.size()) ? WALLY_OK : WALLY_EINVAL;
843 }
844
845 template <class BYTES, class BYTES_OUT>
scriptpubkey_p2sh_from_bytes(const BYTES & bytes,uint32_t flags,BYTES_OUT & bytes_out,size_t * written=0)846 inline int scriptpubkey_p2sh_from_bytes(const BYTES& bytes, uint32_t flags, BYTES_OUT& bytes_out, size_t* written = 0) {
847 size_t n;
848 int ret = ::wally_scriptpubkey_p2sh_from_bytes(bytes.data(), bytes.size(), flags, bytes_out.data(), bytes_out.size(), written ? written : &n);
849 return written || ret != WALLY_OK ? ret : n == static_cast<size_t>(bytes_out.size()) ? WALLY_OK : WALLY_EINVAL;
850 }
851
852 template <class SCRIPTPUBKEY>
scriptpubkey_to_address(const SCRIPTPUBKEY & scriptpubkey,uint32_t network,char ** output)853 inline int scriptpubkey_to_address(const SCRIPTPUBKEY& scriptpubkey, uint32_t network, char** output) {
854 int ret = ::wally_scriptpubkey_to_address(scriptpubkey.data(), scriptpubkey.size(), network, output);
855 return ret;
856 }
857
858 template <class SCRIPT, class BYTES, class SIGHASH, class BYTES_OUT>
scriptsig_multisig_from_bytes(const SCRIPT & script,const BYTES & bytes,const SIGHASH & sighash,uint32_t flags,BYTES_OUT & bytes_out,size_t * written=0)859 inline int scriptsig_multisig_from_bytes(const SCRIPT& script, const BYTES& bytes, const SIGHASH& sighash, uint32_t flags, BYTES_OUT& bytes_out, size_t* written = 0) {
860 size_t n;
861 int ret = ::wally_scriptsig_multisig_from_bytes(script.data(), script.size(), bytes.data(), bytes.size(), sighash.data(), sighash.size(), flags, bytes_out.data(), bytes_out.size(), written ? written : &n);
862 return written || ret != WALLY_OK ? ret : n == static_cast<size_t>(bytes_out.size()) ? WALLY_OK : WALLY_EINVAL;
863 }
864
865 template <class PUB_KEY, class SIG, class BYTES_OUT>
scriptsig_p2pkh_from_der(const PUB_KEY & pub_key,const SIG & sig,BYTES_OUT & bytes_out,size_t * written=0)866 inline int scriptsig_p2pkh_from_der(const PUB_KEY& pub_key, const SIG& sig, BYTES_OUT& bytes_out, size_t* written = 0) {
867 size_t n;
868 int ret = ::wally_scriptsig_p2pkh_from_der(pub_key.data(), pub_key.size(), sig.data(), sig.size(), bytes_out.data(), bytes_out.size(), written ? written : &n);
869 return written || ret != WALLY_OK ? ret : n == static_cast<size_t>(bytes_out.size()) ? WALLY_OK : WALLY_EINVAL;
870 }
871
872 template <class PUB_KEY, class SIG, class BYTES_OUT>
scriptsig_p2pkh_from_sig(const PUB_KEY & pub_key,const SIG & sig,uint32_t sighash,BYTES_OUT & bytes_out,size_t * written=0)873 inline int scriptsig_p2pkh_from_sig(const PUB_KEY& pub_key, const SIG& sig, uint32_t sighash, BYTES_OUT& bytes_out, size_t* written = 0) {
874 size_t n;
875 int ret = ::wally_scriptsig_p2pkh_from_sig(pub_key.data(), pub_key.size(), sig.data(), sig.size(), sighash, bytes_out.data(), bytes_out.size(), written ? written : &n);
876 return written || ret != WALLY_OK ? ret : n == static_cast<size_t>(bytes_out.size()) ? WALLY_OK : WALLY_EINVAL;
877 }
878
879 template <class PASS, class SALT, class BYTES_OUT>
scrypt(const PASS & pass,const SALT & salt,uint32_t cost,uint32_t block_size,uint32_t parallelism,BYTES_OUT & bytes_out)880 inline int scrypt(const PASS& pass, const SALT& salt, uint32_t cost, uint32_t block_size, uint32_t parallelism, BYTES_OUT& bytes_out) {
881 int ret = ::wally_scrypt(pass.data(), pass.size(), salt.data(), salt.size(), cost, block_size, parallelism, bytes_out.data(), bytes_out.size());
882 return ret;
883 }
884
885 template <class BYTES>
secp_randomize(const BYTES & bytes)886 inline int secp_randomize(const BYTES& bytes) {
887 int ret = ::wally_secp_randomize(bytes.data(), bytes.size());
888 return ret;
889 }
890
set_operations(const struct wally_operations * ops)891 inline int set_operations(const struct wally_operations* ops) {
892 int ret = ::wally_set_operations(ops);
893 return ret;
894 }
895
896 template <class BYTES, class BYTES_OUT>
sha256(const BYTES & bytes,BYTES_OUT & bytes_out)897 inline int sha256(const BYTES& bytes, BYTES_OUT& bytes_out) {
898 int ret = ::wally_sha256(bytes.data(), bytes.size(), bytes_out.data(), bytes_out.size());
899 return ret;
900 }
901
902 template <class BYTES, class BYTES_OUT>
sha256_midstate(const BYTES & bytes,BYTES_OUT & bytes_out)903 inline int sha256_midstate(const BYTES& bytes, BYTES_OUT& bytes_out) {
904 int ret = ::wally_sha256_midstate(bytes.data(), bytes.size(), bytes_out.data(), bytes_out.size());
905 return ret;
906 }
907
908 template <class BYTES, class BYTES_OUT>
sha256d(const BYTES & bytes,BYTES_OUT & bytes_out)909 inline int sha256d(const BYTES& bytes, BYTES_OUT& bytes_out) {
910 int ret = ::wally_sha256d(bytes.data(), bytes.size(), bytes_out.data(), bytes_out.size());
911 return ret;
912 }
913
914 template <class BYTES, class BYTES_OUT>
sha512(const BYTES & bytes,BYTES_OUT & bytes_out)915 inline int sha512(const BYTES& bytes, BYTES_OUT& bytes_out) {
916 int ret = ::wally_sha512(bytes.data(), bytes.size(), bytes_out.data(), bytes_out.size());
917 return ret;
918 }
919
920 template <class BYTES, class LABEL, class BYTES_OUT>
symmetric_key_from_parent(const BYTES & bytes,uint32_t version,const LABEL & label,BYTES_OUT & bytes_out)921 inline int symmetric_key_from_parent(const BYTES& bytes, uint32_t version, const LABEL& label, BYTES_OUT& bytes_out) {
922 int ret = ::wally_symmetric_key_from_parent(bytes.data(), bytes.size(), version, label.data(), label.size(), bytes_out.data(), bytes_out.size());
923 return ret;
924 }
925
926 template <class BYTES, class BYTES_OUT>
symmetric_key_from_seed(const BYTES & bytes,BYTES_OUT & bytes_out)927 inline int symmetric_key_from_seed(const BYTES& bytes, BYTES_OUT& bytes_out) {
928 int ret = ::wally_symmetric_key_from_seed(bytes.data(), bytes.size(), bytes_out.data(), bytes_out.size());
929 return ret;
930 }
931
932 template <class TX>
tx_add_input(const TX & tx,const struct wally_tx_input * input)933 inline int tx_add_input(const TX& tx, const struct wally_tx_input* input) {
934 int ret = ::wally_tx_add_input(detail::get_p(tx), input);
935 return ret;
936 }
937
938 template <class TX>
tx_add_input_at(const TX & tx,uint32_t index,const struct wally_tx_input * input)939 inline int tx_add_input_at(const TX& tx, uint32_t index, const struct wally_tx_input* input) {
940 int ret = ::wally_tx_add_input_at(detail::get_p(tx), index, input);
941 return ret;
942 }
943
944 template <class TX>
tx_add_output(const TX & tx,const struct wally_tx_output * output)945 inline int tx_add_output(const TX& tx, const struct wally_tx_output* output) {
946 int ret = ::wally_tx_add_output(detail::get_p(tx), output);
947 return ret;
948 }
949
950 template <class TX>
tx_add_output_at(const TX & tx,uint32_t index,const struct wally_tx_output * output)951 inline int tx_add_output_at(const TX& tx, uint32_t index, const struct wally_tx_output* output) {
952 int ret = ::wally_tx_add_output_at(detail::get_p(tx), index, output);
953 return ret;
954 }
955
956 template <class TX, class TXHASH, class SCRIPT, class WITNESS>
tx_add_raw_input(const TX & tx,const TXHASH & txhash,uint32_t utxo_index,uint32_t sequence,const SCRIPT & script,const WITNESS & witness,uint32_t flags)957 inline int tx_add_raw_input(const TX& tx, const TXHASH& txhash, uint32_t utxo_index, uint32_t sequence, const SCRIPT& script, const WITNESS& witness, uint32_t flags) {
958 int ret = ::wally_tx_add_raw_input(detail::get_p(tx), txhash.data(), txhash.size(), utxo_index, sequence, script.data(), script.size(), detail::get_p(witness), flags);
959 return ret;
960 }
961
962 template <class TX, class TXHASH, class SCRIPT, class WITNESS>
tx_add_raw_input_at(const TX & tx,uint32_t index,const TXHASH & txhash,uint32_t utxo_index,uint32_t sequence,const SCRIPT & script,const WITNESS & witness,uint32_t flags)963 inline int tx_add_raw_input_at(const TX& tx, uint32_t index, const TXHASH& txhash, uint32_t utxo_index, uint32_t sequence, const SCRIPT& script, const WITNESS& witness, uint32_t flags) {
964 int ret = ::wally_tx_add_raw_input_at(detail::get_p(tx), index, txhash.data(), txhash.size(), utxo_index, sequence, script.data(), script.size(), detail::get_p(witness), flags);
965 return ret;
966 }
967
968 template <class TX, class SCRIPT>
tx_add_raw_output(const TX & tx,uint64_t satoshi,const SCRIPT & script,uint32_t flags)969 inline int tx_add_raw_output(const TX& tx, uint64_t satoshi, const SCRIPT& script, uint32_t flags) {
970 int ret = ::wally_tx_add_raw_output(detail::get_p(tx), satoshi, script.data(), script.size(), flags);
971 return ret;
972 }
973
974 template <class TX, class SCRIPT>
tx_add_raw_output_at(const TX & tx,uint32_t index,uint64_t satoshi,const SCRIPT & script,uint32_t flags)975 inline int tx_add_raw_output_at(const TX& tx, uint32_t index, uint64_t satoshi, const SCRIPT& script, uint32_t flags) {
976 int ret = ::wally_tx_add_raw_output_at(detail::get_p(tx), index, satoshi, script.data(), script.size(), flags);
977 return ret;
978 }
979
980 template <class TX>
tx_clone_alloc(const TX & tx,uint32_t flags,struct wally_tx ** output)981 inline int tx_clone_alloc(const TX& tx, uint32_t flags, struct wally_tx** output) {
982 int ret = ::wally_tx_clone_alloc(detail::get_p(tx), flags, output);
983 return ret;
984 }
985
tx_free(struct wally_tx * tx)986 inline int tx_free(struct wally_tx* tx) {
987 int ret = ::wally_tx_free(tx);
988 return ret;
989 }
990
991 template <class BYTES>
tx_from_bytes(const BYTES & bytes,uint32_t flags,struct wally_tx ** output)992 inline int tx_from_bytes(const BYTES& bytes, uint32_t flags, struct wally_tx** output) {
993 int ret = ::wally_tx_from_bytes(bytes.data(), bytes.size(), flags, output);
994 return ret;
995 }
996
997 template <class HEX>
tx_from_hex(const HEX & hex,uint32_t flags,struct wally_tx ** output)998 inline int tx_from_hex(const HEX& hex, uint32_t flags, struct wally_tx** output) {
999 int ret = ::wally_tx_from_hex(detail::get_p(hex), flags, output);
1000 return ret;
1001 }
1002
1003 template <class TX, class SCRIPT, class BYTES_OUT>
tx_get_btc_signature_hash(const TX & tx,size_t index,const SCRIPT & script,uint64_t satoshi,uint32_t sighash,uint32_t flags,BYTES_OUT & bytes_out)1004 inline int tx_get_btc_signature_hash(const TX& tx, size_t index, const SCRIPT& script, uint64_t satoshi, uint32_t sighash, uint32_t flags, BYTES_OUT& bytes_out) {
1005 int ret = ::wally_tx_get_btc_signature_hash(detail::get_p(tx), index, script.data(), script.size(), satoshi, sighash, flags, bytes_out.data(), bytes_out.size());
1006 return ret;
1007 }
1008
1009 template <class TX>
tx_get_length(const TX & tx,uint32_t flags,size_t * written)1010 inline int tx_get_length(const TX& tx, uint32_t flags, size_t* written) {
1011 int ret = ::wally_tx_get_length(detail::get_p(tx), flags, written);
1012 return ret;
1013 }
1014
1015 template <class TX, class SCRIPT, class EXTRA, class BYTES_OUT>
tx_get_signature_hash(const TX & tx,size_t index,const SCRIPT & script,const EXTRA & extra,uint32_t extra_offset,uint64_t satoshi,uint32_t sighash,uint32_t tx_sighash,uint32_t flags,BYTES_OUT & bytes_out)1016 inline int tx_get_signature_hash(const TX& tx, size_t index, const SCRIPT& script, const EXTRA& extra, uint32_t extra_offset, uint64_t satoshi, uint32_t sighash, uint32_t tx_sighash, uint32_t flags, BYTES_OUT& bytes_out) {
1017 int ret = ::wally_tx_get_signature_hash(detail::get_p(tx), index, script.data(), script.size(), extra.data(), extra.size(), extra_offset, satoshi, sighash, tx_sighash, flags, bytes_out.data(), bytes_out.size());
1018 return ret;
1019 }
1020
1021 template <class TX>
tx_get_total_output_satoshi(const TX & tx,uint64_t * value_out)1022 inline int tx_get_total_output_satoshi(const TX& tx, uint64_t* value_out) {
1023 int ret = ::wally_tx_get_total_output_satoshi(detail::get_p(tx), value_out);
1024 return ret;
1025 }
1026
1027 template <class TX, class BYTES_OUT>
tx_get_txid(const TX & tx,BYTES_OUT & bytes_out)1028 inline int tx_get_txid(const TX& tx, BYTES_OUT& bytes_out) {
1029 int ret = ::wally_tx_get_txid(detail::get_p(tx), bytes_out.data(), bytes_out.size());
1030 return ret;
1031 }
1032
1033 template <class TX>
tx_get_vsize(const TX & tx,size_t * written)1034 inline int tx_get_vsize(const TX& tx, size_t* written) {
1035 int ret = ::wally_tx_get_vsize(detail::get_p(tx), written);
1036 return ret;
1037 }
1038
1039 template <class TX>
tx_get_weight(const TX & tx,size_t * written)1040 inline int tx_get_weight(const TX& tx, size_t* written) {
1041 int ret = ::wally_tx_get_weight(detail::get_p(tx), written);
1042 return ret;
1043 }
1044
1045 template <class TX>
tx_get_witness_count(const TX & tx,size_t * written)1046 inline int tx_get_witness_count(const TX& tx, size_t* written) {
1047 int ret = ::wally_tx_get_witness_count(detail::get_p(tx), written);
1048 return ret;
1049 }
1050
tx_init_alloc(uint32_t version,uint32_t locktime,size_t inputs_allocation_len,size_t outputs_allocation_len,struct wally_tx ** output)1051 inline int tx_init_alloc(uint32_t version, uint32_t locktime, size_t inputs_allocation_len, size_t outputs_allocation_len, struct wally_tx** output) {
1052 int ret = ::wally_tx_init_alloc(version, locktime, inputs_allocation_len, outputs_allocation_len, output);
1053 return ret;
1054 }
1055
tx_input_free(struct wally_tx_input * input)1056 inline int tx_input_free(struct wally_tx_input* input) {
1057 int ret = ::wally_tx_input_free(input);
1058 return ret;
1059 }
1060
1061 template <class TXHASH, class SCRIPT, class WITNESS>
tx_input_init_alloc(const TXHASH & txhash,uint32_t utxo_index,uint32_t sequence,const SCRIPT & script,const WITNESS & witness,struct wally_tx_input ** output)1062 inline int tx_input_init_alloc(const TXHASH& txhash, uint32_t utxo_index, uint32_t sequence, const SCRIPT& script, const WITNESS& witness, struct wally_tx_input** output) {
1063 int ret = ::wally_tx_input_init_alloc(txhash.data(), txhash.size(), utxo_index, sequence, script.data(), script.size(), detail::get_p(witness), output);
1064 return ret;
1065 }
1066
1067 template <class TX>
tx_is_coinbase(const TX & tx,size_t * written)1068 inline int tx_is_coinbase(const TX& tx, size_t* written) {
1069 int ret = ::wally_tx_is_coinbase(detail::get_p(tx), written);
1070 return ret;
1071 }
1072
1073 template <class TX_OUTPUT_IN>
tx_output_clone(const TX_OUTPUT_IN & tx_output_in,struct wally_tx_output * output)1074 inline int tx_output_clone(const TX_OUTPUT_IN& tx_output_in, struct wally_tx_output* output) {
1075 int ret = ::wally_tx_output_clone(detail::get_p(tx_output_in), output);
1076 return ret;
1077 }
1078
1079 template <class TX_OUTPUT_IN>
tx_output_clone_alloc(const TX_OUTPUT_IN & tx_output_in,struct wally_tx_output ** output)1080 inline int tx_output_clone_alloc(const TX_OUTPUT_IN& tx_output_in, struct wally_tx_output** output) {
1081 int ret = ::wally_tx_output_clone_alloc(detail::get_p(tx_output_in), output);
1082 return ret;
1083 }
1084
tx_output_free(struct wally_tx_output * output)1085 inline int tx_output_free(struct wally_tx_output* output) {
1086 int ret = ::wally_tx_output_free(output);
1087 return ret;
1088 }
1089
1090 template <class SCRIPT>
tx_output_init(uint64_t satoshi,const SCRIPT & script,struct wally_tx_output * output)1091 inline int tx_output_init(uint64_t satoshi, const SCRIPT& script, struct wally_tx_output* output) {
1092 int ret = ::wally_tx_output_init(satoshi, script.data(), script.size(), output);
1093 return ret;
1094 }
1095
1096 template <class SCRIPT>
tx_output_init_alloc(uint64_t satoshi,const SCRIPT & script,struct wally_tx_output ** output)1097 inline int tx_output_init_alloc(uint64_t satoshi, const SCRIPT& script, struct wally_tx_output** output) {
1098 int ret = ::wally_tx_output_init_alloc(satoshi, script.data(), script.size(), output);
1099 return ret;
1100 }
1101
1102 template <class TX>
tx_remove_input(const TX & tx,size_t index)1103 inline int tx_remove_input(const TX& tx, size_t index) {
1104 int ret = ::wally_tx_remove_input(detail::get_p(tx), index);
1105 return ret;
1106 }
1107
1108 template <class TX>
tx_remove_output(const TX & tx,size_t index)1109 inline int tx_remove_output(const TX& tx, size_t index) {
1110 int ret = ::wally_tx_remove_output(detail::get_p(tx), index);
1111 return ret;
1112 }
1113
1114 template <class TX, class SCRIPT>
tx_set_input_script(const TX & tx,size_t index,const SCRIPT & script)1115 inline int tx_set_input_script(const TX& tx, size_t index, const SCRIPT& script) {
1116 int ret = ::wally_tx_set_input_script(detail::get_p(tx), index, script.data(), script.size());
1117 return ret;
1118 }
1119
1120 template <class TX>
tx_set_input_witness(const TX & tx,size_t index,const struct wally_tx_witness_stack * stack)1121 inline int tx_set_input_witness(const TX& tx, size_t index, const struct wally_tx_witness_stack* stack) {
1122 int ret = ::wally_tx_set_input_witness(detail::get_p(tx), index, stack);
1123 return ret;
1124 }
1125
1126 template <class TX, class BYTES_OUT>
tx_to_bytes(const TX & tx,uint32_t flags,BYTES_OUT & bytes_out,size_t * written=0)1127 inline int tx_to_bytes(const TX& tx, uint32_t flags, BYTES_OUT& bytes_out, size_t* written = 0) {
1128 size_t n;
1129 int ret = ::wally_tx_to_bytes(detail::get_p(tx), flags, bytes_out.data(), bytes_out.size(), written ? written : &n);
1130 return written || ret != WALLY_OK ? ret : n == static_cast<size_t>(bytes_out.size()) ? WALLY_OK : WALLY_EINVAL;
1131 }
1132
1133 template <class TX>
tx_to_hex(const TX & tx,uint32_t flags,char ** output)1134 inline int tx_to_hex(const TX& tx, uint32_t flags, char** output) {
1135 int ret = ::wally_tx_to_hex(detail::get_p(tx), flags, output);
1136 return ret;
1137 }
1138
tx_vsize_from_weight(size_t weight,size_t * written)1139 inline int tx_vsize_from_weight(size_t weight, size_t* written) {
1140 int ret = ::wally_tx_vsize_from_weight(weight, written);
1141 return ret;
1142 }
1143
1144 template <class STACK, class WITNESS>
tx_witness_stack_add(const STACK & stack,const WITNESS & witness)1145 inline int tx_witness_stack_add(const STACK& stack, const WITNESS& witness) {
1146 int ret = ::wally_tx_witness_stack_add(detail::get_p(stack), witness.data(), witness.size());
1147 return ret;
1148 }
1149
1150 template <class STACK>
tx_witness_stack_add_dummy(const STACK & stack,uint32_t flags)1151 inline int tx_witness_stack_add_dummy(const STACK& stack, uint32_t flags) {
1152 int ret = ::wally_tx_witness_stack_add_dummy(detail::get_p(stack), flags);
1153 return ret;
1154 }
1155
1156 template <class STACK>
tx_witness_stack_clone_alloc(const STACK & stack,struct wally_tx_witness_stack ** output)1157 inline int tx_witness_stack_clone_alloc(const STACK& stack, struct wally_tx_witness_stack** output) {
1158 int ret = ::wally_tx_witness_stack_clone_alloc(detail::get_p(stack), output);
1159 return ret;
1160 }
1161
tx_witness_stack_free(struct wally_tx_witness_stack * stack)1162 inline int tx_witness_stack_free(struct wally_tx_witness_stack* stack) {
1163 int ret = ::wally_tx_witness_stack_free(stack);
1164 return ret;
1165 }
1166
tx_witness_stack_init_alloc(size_t allocation_len,struct wally_tx_witness_stack ** output)1167 inline int tx_witness_stack_init_alloc(size_t allocation_len, struct wally_tx_witness_stack** output) {
1168 int ret = ::wally_tx_witness_stack_init_alloc(allocation_len, output);
1169 return ret;
1170 }
1171
1172 template <class STACK, class WITNESS>
tx_witness_stack_set(const STACK & stack,size_t index,const WITNESS & witness)1173 inline int tx_witness_stack_set(const STACK& stack, size_t index, const WITNESS& witness) {
1174 int ret = ::wally_tx_witness_stack_set(detail::get_p(stack), index, witness.data(), witness.size());
1175 return ret;
1176 }
1177
1178 template <class STACK>
tx_witness_stack_set_dummy(const STACK & stack,size_t index,uint32_t flags)1179 inline int tx_witness_stack_set_dummy(const STACK& stack, size_t index, uint32_t flags) {
1180 int ret = ::wally_tx_witness_stack_set_dummy(detail::get_p(stack), index, flags);
1181 return ret;
1182 }
1183
1184 template <class BYTES>
varbuff_get_length(const BYTES & bytes,size_t * written=0)1185 inline int varbuff_get_length(const BYTES& bytes, size_t* written = 0) {
1186 size_t n;
1187 int ret = ::wally_varbuff_get_length(bytes.data(), bytes.size(), written ? written : &n);
1188 return written || ret != WALLY_OK ? ret : n == static_cast<size_t>(bytes.size()) ? WALLY_OK : WALLY_EINVAL;
1189 }
1190
1191 template <class BYTES, class BYTES_OUT>
varbuff_to_bytes(const BYTES & bytes,BYTES_OUT & bytes_out,size_t * written=0)1192 inline int varbuff_to_bytes(const BYTES& bytes, BYTES_OUT& bytes_out, size_t* written = 0) {
1193 size_t n;
1194 int ret = ::wally_varbuff_to_bytes(bytes.data(), bytes.size(), bytes_out.data(), bytes_out.size(), written ? written : &n);
1195 return written || ret != WALLY_OK ? ret : n == static_cast<size_t>(bytes_out.size()) ? WALLY_OK : WALLY_EINVAL;
1196 }
1197
varint_get_length(uint64_t value,size_t * written)1198 inline int varint_get_length(uint64_t value, size_t* written) {
1199 int ret = ::wally_varint_get_length(value, written);
1200 return ret;
1201 }
1202
1203 template <class BYTES_OUT>
varint_to_bytes(uint64_t value,BYTES_OUT & bytes_out,size_t * written=0)1204 inline int varint_to_bytes(uint64_t value, BYTES_OUT& bytes_out, size_t* written = 0) {
1205 size_t n;
1206 int ret = ::wally_varint_to_bytes(value, bytes_out.data(), bytes_out.size(), written ? written : &n);
1207 return written || ret != WALLY_OK ? ret : n == static_cast<size_t>(bytes_out.size()) ? WALLY_OK : WALLY_EINVAL;
1208 }
1209
1210 template <class PRIV_KEY>
wif_from_bytes(const PRIV_KEY & priv_key,uint32_t prefix,uint32_t flags,char ** output)1211 inline int wif_from_bytes(const PRIV_KEY& priv_key, uint32_t prefix, uint32_t flags, char** output) {
1212 int ret = ::wally_wif_from_bytes(priv_key.data(), priv_key.size(), prefix, flags, output);
1213 return ret;
1214 }
1215
1216 template <class WIF>
wif_is_uncompressed(const WIF & wif,size_t * written)1217 inline int wif_is_uncompressed(const WIF& wif, size_t* written) {
1218 int ret = ::wally_wif_is_uncompressed(detail::get_p(wif), written);
1219 return ret;
1220 }
1221
1222 template <class WIF>
wif_to_address(const WIF & wif,uint32_t prefix,uint32_t version,char ** output)1223 inline int wif_to_address(const WIF& wif, uint32_t prefix, uint32_t version, char** output) {
1224 int ret = ::wally_wif_to_address(detail::get_p(wif), prefix, version, output);
1225 return ret;
1226 }
1227
1228 template <class WIF, class BYTES_OUT>
wif_to_bytes(const WIF & wif,uint32_t prefix,uint32_t flags,BYTES_OUT & bytes_out)1229 inline int wif_to_bytes(const WIF& wif, uint32_t prefix, uint32_t flags, BYTES_OUT& bytes_out) {
1230 int ret = ::wally_wif_to_bytes(detail::get_p(wif), prefix, flags, bytes_out.data(), bytes_out.size());
1231 return ret;
1232 }
1233
1234 template <class WIF, class BYTES_OUT>
wif_to_public_key(const WIF & wif,uint32_t prefix,BYTES_OUT & bytes_out,size_t * written=0)1235 inline int wif_to_public_key(const WIF& wif, uint32_t prefix, BYTES_OUT& bytes_out, size_t* written = 0) {
1236 size_t n;
1237 int ret = ::wally_wif_to_public_key(detail::get_p(wif), prefix, bytes_out.data(), bytes_out.size(), written ? written : &n);
1238 return written || ret != WALLY_OK ? ret : n == static_cast<size_t>(bytes_out.size()) ? WALLY_OK : WALLY_EINVAL;
1239 }
1240
1241 template <class SCRIPT, class BYTES, class SIGHASH>
witness_multisig_from_bytes(const SCRIPT & script,const BYTES & bytes,const SIGHASH & sighash,uint32_t flags,struct wally_tx_witness_stack ** witness)1242 inline int witness_multisig_from_bytes(const SCRIPT& script, const BYTES& bytes, const SIGHASH& sighash, uint32_t flags, struct wally_tx_witness_stack** witness) {
1243 int ret = ::wally_witness_multisig_from_bytes(script.data(), script.size(), bytes.data(), bytes.size(), sighash.data(), sighash.size(), flags, witness);
1244 return ret;
1245 }
1246
1247 template <class PUB_KEY, class SIG>
witness_p2wpkh_from_der(const PUB_KEY & pub_key,const SIG & sig,struct wally_tx_witness_stack ** witness)1248 inline int witness_p2wpkh_from_der(const PUB_KEY& pub_key, const SIG& sig, struct wally_tx_witness_stack** witness) {
1249 int ret = ::wally_witness_p2wpkh_from_der(pub_key.data(), pub_key.size(), sig.data(), sig.size(), witness);
1250 return ret;
1251 }
1252
1253 template <class PUB_KEY, class SIG>
witness_p2wpkh_from_sig(const PUB_KEY & pub_key,const SIG & sig,uint32_t sighash,struct wally_tx_witness_stack ** witness)1254 inline int witness_p2wpkh_from_sig(const PUB_KEY& pub_key, const SIG& sig, uint32_t sighash, struct wally_tx_witness_stack** witness) {
1255 int ret = ::wally_witness_p2wpkh_from_sig(pub_key.data(), pub_key.size(), sig.data(), sig.size(), sighash, witness);
1256 return ret;
1257 }
1258
1259 template <class BYTES, class BYTES_OUT>
witness_program_from_bytes(const BYTES & bytes,uint32_t flags,BYTES_OUT & bytes_out,size_t * written=0)1260 inline int witness_program_from_bytes(const BYTES& bytes, uint32_t flags, BYTES_OUT& bytes_out, size_t* written = 0) {
1261 size_t n;
1262 int ret = ::wally_witness_program_from_bytes(bytes.data(), bytes.size(), flags, bytes_out.data(), bytes_out.size(), written ? written : &n);
1263 return written || ret != WALLY_OK ? ret : n == static_cast<size_t>(bytes_out.size()) ? WALLY_OK : WALLY_EINVAL;
1264 }
1265
1266 #ifdef BUILD_ELEMENTS
1267 template <class HDKEY, class CHILD_PATH>
bip32_key_with_tweak_from_parent_path(const HDKEY & hdkey,const CHILD_PATH & child_path,uint32_t flags,struct ext_key * output)1268 inline int bip32_key_with_tweak_from_parent_path(const HDKEY& hdkey, const CHILD_PATH& child_path, uint32_t flags, struct ext_key* output) {
1269 int ret = ::bip32_key_with_tweak_from_parent_path(detail::get_p(hdkey), child_path.data(), child_path.size(), flags, output);
1270 return ret;
1271 }
1272
1273 template <class HDKEY, class CHILD_PATH>
bip32_key_with_tweak_from_parent_path_alloc(const HDKEY & hdkey,const CHILD_PATH & child_path,uint32_t flags,struct ext_key ** output)1274 inline int bip32_key_with_tweak_from_parent_path_alloc(const HDKEY& hdkey, const CHILD_PATH& child_path, uint32_t flags, struct ext_key** output) {
1275 int ret = ::bip32_key_with_tweak_from_parent_path_alloc(detail::get_p(hdkey), child_path.data(), child_path.size(), flags, output);
1276 return ret;
1277 }
1278
1279 template <class BYTES, class BYTES_OUT>
asset_blinding_key_from_seed(const BYTES & bytes,BYTES_OUT & bytes_out)1280 inline int asset_blinding_key_from_seed(const BYTES& bytes, BYTES_OUT& bytes_out) {
1281 int ret = ::wally_asset_blinding_key_from_seed(bytes.data(), bytes.size(), bytes_out.data(), bytes_out.size());
1282 return ret;
1283 }
1284
1285 template <class BYTES, class SCRIPT, class BYTES_OUT>
asset_blinding_key_to_ec_private_key(const BYTES & bytes,const SCRIPT & script,BYTES_OUT & bytes_out)1286 inline int asset_blinding_key_to_ec_private_key(const BYTES& bytes, const SCRIPT& script, BYTES_OUT& bytes_out) {
1287 int ret = ::wally_asset_blinding_key_to_ec_private_key(bytes.data(), bytes.size(), script.data(), script.size(), bytes_out.data(), bytes_out.size());
1288 return ret;
1289 }
1290
1291 template <class VALUES, class ABF, class VBF, class BYTES_OUT>
asset_final_vbf(const VALUES & values,size_t num_inputs,const ABF & abf,const VBF & vbf,BYTES_OUT & bytes_out)1292 inline int asset_final_vbf(const VALUES& values, size_t num_inputs, const ABF& abf, const VBF& vbf, BYTES_OUT& bytes_out) {
1293 int ret = ::wally_asset_final_vbf(values.data(), values.size(), num_inputs, abf.data(), abf.size(), vbf.data(), vbf.size(), bytes_out.data(), bytes_out.size());
1294 return ret;
1295 }
1296
1297 template <class ASSET, class ABF, class BYTES_OUT>
asset_generator_from_bytes(const ASSET & asset,const ABF & abf,BYTES_OUT & bytes_out)1298 inline int asset_generator_from_bytes(const ASSET& asset, const ABF& abf, BYTES_OUT& bytes_out) {
1299 int ret = ::wally_asset_generator_from_bytes(asset.data(), asset.size(), abf.data(), abf.size(), bytes_out.data(), bytes_out.size());
1300 return ret;
1301 }
1302
1303 template <class ONLINE_KEYS, class OFFLINE_KEYS, class SUB_PUBKEY, class ONLINE_PRIV_KEY, class SUMMED_KEY, class BYTES_OUT>
asset_pak_whitelistproof(const ONLINE_KEYS & online_keys,const OFFLINE_KEYS & offline_keys,size_t key_index,const SUB_PUBKEY & sub_pubkey,const ONLINE_PRIV_KEY & online_priv_key,const SUMMED_KEY & summed_key,BYTES_OUT & bytes_out,size_t * written=0)1304 inline int asset_pak_whitelistproof(const ONLINE_KEYS& online_keys, const OFFLINE_KEYS& offline_keys, size_t key_index, const SUB_PUBKEY& sub_pubkey, const ONLINE_PRIV_KEY& online_priv_key, const SUMMED_KEY& summed_key, BYTES_OUT& bytes_out, size_t* written = 0) {
1305 size_t n;
1306 int ret = ::wally_asset_pak_whitelistproof(online_keys.data(), online_keys.size(), offline_keys.data(), offline_keys.size(), key_index, sub_pubkey.data(), sub_pubkey.size(), online_priv_key.data(), online_priv_key.size(), summed_key.data(), summed_key.size(), bytes_out.data(), bytes_out.size(), written ? written : &n);
1307 return written || ret != WALLY_OK ? ret : n == static_cast<size_t>(bytes_out.size()) ? WALLY_OK : WALLY_EINVAL;
1308 }
1309
asset_pak_whitelistproof_size(size_t num_keys,size_t * written)1310 inline int asset_pak_whitelistproof_size(size_t num_keys, size_t* written) {
1311 int ret = ::wally_asset_pak_whitelistproof_size(num_keys, written);
1312 return ret;
1313 }
1314
1315 template <class PUB_KEY, class PRIV_KEY, class ASSET, class ABF, class VBF, class COMMITMENT, class EXTRA, class GENERATOR, class BYTES_OUT>
asset_rangeproof(uint64_t value,const PUB_KEY & pub_key,const PRIV_KEY & priv_key,const ASSET & asset,const ABF & abf,const VBF & vbf,const COMMITMENT & commitment,const EXTRA & extra,const GENERATOR & generator,uint64_t min_value,int exp,int min_bits,BYTES_OUT & bytes_out,size_t * written=0)1316 inline int asset_rangeproof(uint64_t value, const PUB_KEY& pub_key, const PRIV_KEY& priv_key, const ASSET& asset, const ABF& abf, const VBF& vbf, const COMMITMENT& commitment, const EXTRA& extra, const GENERATOR& generator, uint64_t min_value, int exp, int min_bits, BYTES_OUT& bytes_out, size_t* written = 0) {
1317 size_t n;
1318 int ret = ::wally_asset_rangeproof(value, pub_key.data(), pub_key.size(), priv_key.data(), priv_key.size(), asset.data(), asset.size(), abf.data(), abf.size(), vbf.data(), vbf.size(), commitment.data(), commitment.size(), extra.data(), extra.size(), generator.data(), generator.size(), min_value, exp, min_bits, bytes_out.data(), bytes_out.size(), written ? written : &n);
1319 return written || ret != WALLY_OK ? ret : n == static_cast<size_t>(bytes_out.size()) ? WALLY_OK : WALLY_EINVAL;
1320 }
1321
1322 template <class OUTPUT_ASSET, class OUTPUT_ABF, class OUTPUT_GENERATOR, class BYTES, class ASSET, class ABF, class GENERATOR, class BYTES_OUT>
asset_surjectionproof(const OUTPUT_ASSET & output_asset,const OUTPUT_ABF & output_abf,const OUTPUT_GENERATOR & output_generator,const BYTES & bytes,const ASSET & asset,const ABF & abf,const GENERATOR & generator,BYTES_OUT & bytes_out,size_t * written=0)1323 inline int asset_surjectionproof(const OUTPUT_ASSET& output_asset, const OUTPUT_ABF& output_abf, const OUTPUT_GENERATOR& output_generator, const BYTES& bytes, const ASSET& asset, const ABF& abf, const GENERATOR& generator, BYTES_OUT& bytes_out, size_t* written = 0) {
1324 size_t n;
1325 int ret = ::wally_asset_surjectionproof(output_asset.data(), output_asset.size(), output_abf.data(), output_abf.size(), output_generator.data(), output_generator.size(), bytes.data(), bytes.size(), asset.data(), asset.size(), abf.data(), abf.size(), generator.data(), generator.size(), bytes_out.data(), bytes_out.size(), written ? written : &n);
1326 return written || ret != WALLY_OK ? ret : n == static_cast<size_t>(bytes_out.size()) ? WALLY_OK : WALLY_EINVAL;
1327 }
1328
asset_surjectionproof_size(size_t num_inputs,size_t * written)1329 inline int asset_surjectionproof_size(size_t num_inputs, size_t* written) {
1330 int ret = ::wally_asset_surjectionproof_size(num_inputs, written);
1331 return ret;
1332 }
1333
1334 template <class PUB_KEY, class PRIV_KEY, class PROOF, class COMMITMENT, class EXTRA, class GENERATOR, class ASSET_OUT, class ABF_OUT, class VBF_OUT>
asset_unblind(const PUB_KEY & pub_key,const PRIV_KEY & priv_key,const PROOF & proof,const COMMITMENT & commitment,const EXTRA & extra,const GENERATOR & generator,ASSET_OUT & asset_out,ABF_OUT & abf_out,VBF_OUT & vbf_out,uint64_t * value_out)1335 inline int asset_unblind(const PUB_KEY& pub_key, const PRIV_KEY& priv_key, const PROOF& proof, const COMMITMENT& commitment, const EXTRA& extra, const GENERATOR& generator, ASSET_OUT& asset_out, ABF_OUT& abf_out, VBF_OUT& vbf_out, uint64_t* value_out) {
1336 int ret = ::wally_asset_unblind(pub_key.data(), pub_key.size(), priv_key.data(), priv_key.size(), proof.data(), proof.size(), commitment.data(), commitment.size(), extra.data(), extra.size(), generator.data(), generator.size(), asset_out.data(), asset_out.size(), abf_out.data(), abf_out.size(), vbf_out.data(), vbf_out.size(), value_out);
1337 return ret;
1338 }
1339
1340 template <class NONCE_HASH, class PROOF, class COMMITMENT, class EXTRA, class GENERATOR, class ASSET_OUT, class ABF_OUT, class VBF_OUT>
asset_unblind_with_nonce(const NONCE_HASH & nonce_hash,const PROOF & proof,const COMMITMENT & commitment,const EXTRA & extra,const GENERATOR & generator,ASSET_OUT & asset_out,ABF_OUT & abf_out,VBF_OUT & vbf_out,uint64_t * value_out)1341 inline int asset_unblind_with_nonce(const NONCE_HASH& nonce_hash, const PROOF& proof, const COMMITMENT& commitment, const EXTRA& extra, const GENERATOR& generator, ASSET_OUT& asset_out, ABF_OUT& abf_out, VBF_OUT& vbf_out, uint64_t* value_out) {
1342 int ret = ::wally_asset_unblind_with_nonce(nonce_hash.data(), nonce_hash.size(), proof.data(), proof.size(), commitment.data(), commitment.size(), extra.data(), extra.size(), generator.data(), generator.size(), asset_out.data(), asset_out.size(), abf_out.data(), abf_out.size(), vbf_out.data(), vbf_out.size(), value_out);
1343 return ret;
1344 }
1345
1346 template <class VBF, class GENERATOR, class BYTES_OUT>
asset_value_commitment(uint64_t value,const VBF & vbf,const GENERATOR & generator,BYTES_OUT & bytes_out)1347 inline int asset_value_commitment(uint64_t value, const VBF& vbf, const GENERATOR& generator, BYTES_OUT& bytes_out) {
1348 int ret = ::wally_asset_value_commitment(value, vbf.data(), vbf.size(), generator.data(), generator.size(), bytes_out.data(), bytes_out.size());
1349 return ret;
1350 }
1351
1352 template <class ADDRESS, class PUB_KEY>
confidential_addr_from_addr(const ADDRESS & address,uint32_t prefix,const PUB_KEY & pub_key,char ** output)1353 inline int confidential_addr_from_addr(const ADDRESS& address, uint32_t prefix, const PUB_KEY& pub_key, char** output) {
1354 int ret = ::wally_confidential_addr_from_addr(detail::get_p(address), prefix, pub_key.data(), pub_key.size(), output);
1355 return ret;
1356 }
1357
1358 template <class ADDRESS, class ADDR_FAMILY, class CONFIDENTIAL_ADDR_FAMILY, class PUB_KEY>
confidential_addr_from_addr_segwit(const ADDRESS & address,const ADDR_FAMILY & addr_family,const CONFIDENTIAL_ADDR_FAMILY & confidential_addr_family,const PUB_KEY & pub_key,char ** output)1359 inline int confidential_addr_from_addr_segwit(const ADDRESS& address, const ADDR_FAMILY& addr_family, const CONFIDENTIAL_ADDR_FAMILY& confidential_addr_family, const PUB_KEY& pub_key, char** output) {
1360 int ret = ::wally_confidential_addr_from_addr_segwit(detail::get_p(address), detail::get_p(addr_family), detail::get_p(confidential_addr_family), pub_key.data(), pub_key.size(), output);
1361 return ret;
1362 }
1363
1364 template <class ADDRESS, class CONFIDENTIAL_ADDR_FAMILY, class BYTES_OUT>
confidential_addr_segwit_to_ec_public_key(const ADDRESS & address,const CONFIDENTIAL_ADDR_FAMILY & confidential_addr_family,BYTES_OUT & bytes_out)1365 inline int confidential_addr_segwit_to_ec_public_key(const ADDRESS& address, const CONFIDENTIAL_ADDR_FAMILY& confidential_addr_family, BYTES_OUT& bytes_out) {
1366 int ret = ::wally_confidential_addr_segwit_to_ec_public_key(detail::get_p(address), detail::get_p(confidential_addr_family), bytes_out.data(), bytes_out.size());
1367 return ret;
1368 }
1369
1370 template <class ADDRESS>
confidential_addr_to_addr(const ADDRESS & address,uint32_t prefix,char ** output)1371 inline int confidential_addr_to_addr(const ADDRESS& address, uint32_t prefix, char** output) {
1372 int ret = ::wally_confidential_addr_to_addr(detail::get_p(address), prefix, output);
1373 return ret;
1374 }
1375
1376 template <class ADDRESS, class CONFIDENTIAL_ADDR_FAMILY, class ADDR_FAMILY>
confidential_addr_to_addr_segwit(const ADDRESS & address,const CONFIDENTIAL_ADDR_FAMILY & confidential_addr_family,const ADDR_FAMILY & addr_family,char ** output)1377 inline int confidential_addr_to_addr_segwit(const ADDRESS& address, const CONFIDENTIAL_ADDR_FAMILY& confidential_addr_family, const ADDR_FAMILY& addr_family, char** output) {
1378 int ret = ::wally_confidential_addr_to_addr_segwit(detail::get_p(address), detail::get_p(confidential_addr_family), detail::get_p(addr_family), output);
1379 return ret;
1380 }
1381
1382 template <class ADDRESS, class BYTES_OUT>
confidential_addr_to_ec_public_key(const ADDRESS & address,uint32_t prefix,BYTES_OUT & bytes_out)1383 inline int confidential_addr_to_ec_public_key(const ADDRESS& address, uint32_t prefix, BYTES_OUT& bytes_out) {
1384 int ret = ::wally_confidential_addr_to_ec_public_key(detail::get_p(address), prefix, bytes_out.data(), bytes_out.size());
1385 return ret;
1386 }
1387
1388 template <class REDEEM_SCRIPT, class SCRIPT, class BYTES_OUT>
elements_pegin_contract_script_from_bytes(const REDEEM_SCRIPT & redeem_script,const SCRIPT & script,uint32_t flags,BYTES_OUT & bytes_out,size_t * written=0)1389 inline int elements_pegin_contract_script_from_bytes(const REDEEM_SCRIPT& redeem_script, const SCRIPT& script, uint32_t flags, BYTES_OUT& bytes_out, size_t* written = 0) {
1390 size_t n;
1391 int ret = ::wally_elements_pegin_contract_script_from_bytes(redeem_script.data(), redeem_script.size(), script.data(), script.size(), flags, bytes_out.data(), bytes_out.size(), written ? written : &n);
1392 return written || ret != WALLY_OK ? ret : n == static_cast<size_t>(bytes_out.size()) ? WALLY_OK : WALLY_EINVAL;
1393 }
1394
1395 template <class GENESIS_BLOCKHASH, class MAINCHAIN_SCRIPT, class SUB_PUBKEY, class WHITELISTPROOF, class BYTES_OUT>
elements_pegout_script_from_bytes(const GENESIS_BLOCKHASH & genesis_blockhash,const MAINCHAIN_SCRIPT & mainchain_script,const SUB_PUBKEY & sub_pubkey,const WHITELISTPROOF & whitelistproof,uint32_t flags,BYTES_OUT & bytes_out,size_t * written=0)1396 inline int elements_pegout_script_from_bytes(const GENESIS_BLOCKHASH& genesis_blockhash, const MAINCHAIN_SCRIPT& mainchain_script, const SUB_PUBKEY& sub_pubkey, const WHITELISTPROOF& whitelistproof, uint32_t flags, BYTES_OUT& bytes_out, size_t* written = 0) {
1397 size_t n;
1398 int ret = ::wally_elements_pegout_script_from_bytes(genesis_blockhash.data(), genesis_blockhash.size(), mainchain_script.data(), mainchain_script.size(), sub_pubkey.data(), sub_pubkey.size(), whitelistproof.data(), whitelistproof.size(), flags, bytes_out.data(), bytes_out.size(), written ? written : &n);
1399 return written || ret != WALLY_OK ? ret : n == static_cast<size_t>(bytes_out.size()) ? WALLY_OK : WALLY_EINVAL;
1400 }
1401
elements_pegout_script_size(size_t genesis_blockhash_len,size_t mainchain_script_len,size_t sub_pubkey_len,size_t whitelistproof_len,size_t * written)1402 inline int elements_pegout_script_size(size_t genesis_blockhash_len, size_t mainchain_script_len, size_t sub_pubkey_len, size_t whitelistproof_len, size_t* written) {
1403 int ret = ::wally_elements_pegout_script_size(genesis_blockhash_len, mainchain_script_len, sub_pubkey_len, whitelistproof_len, written);
1404 return ret;
1405 }
1406
psbt_elements_init_alloc(uint32_t version,size_t inputs_allocation_len,size_t outputs_allocation_len,size_t global_unknowns_allocation_len,struct wally_psbt ** output)1407 inline int psbt_elements_init_alloc(uint32_t version, size_t inputs_allocation_len, size_t outputs_allocation_len, size_t global_unknowns_allocation_len, struct wally_psbt** output) {
1408 int ret = ::wally_psbt_elements_init_alloc(version, inputs_allocation_len, outputs_allocation_len, global_unknowns_allocation_len, output);
1409 return ret;
1410 }
1411
psbt_input_clear_value(struct wally_psbt_input * input)1412 inline int psbt_input_clear_value(struct wally_psbt_input* input) {
1413 int ret = ::wally_psbt_input_clear_value(input);
1414 return ret;
1415 }
1416
1417 template <class INPUT, class ABF>
psbt_input_set_abf(const INPUT & input,const ABF & abf)1418 inline int psbt_input_set_abf(const INPUT& input, const ABF& abf) {
1419 int ret = ::wally_psbt_input_set_abf(detail::get_p(input), abf.data(), abf.size());
1420 return ret;
1421 }
1422
1423 template <class INPUT, class ASSET>
psbt_input_set_asset(const INPUT & input,const ASSET & asset)1424 inline int psbt_input_set_asset(const INPUT& input, const ASSET& asset) {
1425 int ret = ::wally_psbt_input_set_asset(detail::get_p(input), asset.data(), asset.size());
1426 return ret;
1427 }
1428
1429 template <class INPUT, class SCRIPT>
psbt_input_set_claim_script(const INPUT & input,const SCRIPT & script)1430 inline int psbt_input_set_claim_script(const INPUT& input, const SCRIPT& script) {
1431 int ret = ::wally_psbt_input_set_claim_script(detail::get_p(input), script.data(), script.size());
1432 return ret;
1433 }
1434
1435 template <class INPUT, class GENESIS_BLOCKHASH>
psbt_input_set_genesis_blockhash(const INPUT & input,const GENESIS_BLOCKHASH & genesis_blockhash)1436 inline int psbt_input_set_genesis_blockhash(const INPUT& input, const GENESIS_BLOCKHASH& genesis_blockhash) {
1437 int ret = ::wally_psbt_input_set_genesis_blockhash(detail::get_p(input), genesis_blockhash.data(), genesis_blockhash.size());
1438 return ret;
1439 }
1440
1441 template <class INPUT>
psbt_input_set_pegin_tx(const INPUT & input,const struct wally_tx * pegin_tx)1442 inline int psbt_input_set_pegin_tx(const INPUT& input, const struct wally_tx* pegin_tx) {
1443 int ret = ::wally_psbt_input_set_pegin_tx(detail::get_p(input), pegin_tx);
1444 return ret;
1445 }
1446
1447 template <class INPUT, class PROOF>
psbt_input_set_txoutproof(const INPUT & input,const PROOF & proof)1448 inline int psbt_input_set_txoutproof(const INPUT& input, const PROOF& proof) {
1449 int ret = ::wally_psbt_input_set_txoutproof(detail::get_p(input), proof.data(), proof.size());
1450 return ret;
1451 }
1452
1453 template <class INPUT>
psbt_input_set_value(const INPUT & input,uint64_t value)1454 inline int psbt_input_set_value(const INPUT& input, uint64_t value) {
1455 int ret = ::wally_psbt_input_set_value(detail::get_p(input), value);
1456 return ret;
1457 }
1458
1459 template <class INPUT, class VBF>
psbt_input_set_vbf(const INPUT & input,const VBF & vbf)1460 inline int psbt_input_set_vbf(const INPUT& input, const VBF& vbf) {
1461 int ret = ::wally_psbt_input_set_vbf(detail::get_p(input), vbf.data(), vbf.size());
1462 return ret;
1463 }
1464
1465 template <class OUTPUT, class ABF>
psbt_output_set_abf(const OUTPUT & output,const ABF & abf)1466 inline int psbt_output_set_abf(const OUTPUT& output, const ABF& abf) {
1467 int ret = ::wally_psbt_output_set_abf(detail::get_p(output), abf.data(), abf.size());
1468 return ret;
1469 }
1470
1471 template <class OUTPUT, class COMMITMENT>
psbt_output_set_asset_commitment(const OUTPUT & output,const COMMITMENT & commitment)1472 inline int psbt_output_set_asset_commitment(const OUTPUT& output, const COMMITMENT& commitment) {
1473 int ret = ::wally_psbt_output_set_asset_commitment(detail::get_p(output), commitment.data(), commitment.size());
1474 return ret;
1475 }
1476
1477 template <class OUTPUT, class PUB_KEY>
psbt_output_set_blinding_pubkey(const OUTPUT & output,const PUB_KEY & pub_key)1478 inline int psbt_output_set_blinding_pubkey(const OUTPUT& output, const PUB_KEY& pub_key) {
1479 int ret = ::wally_psbt_output_set_blinding_pubkey(detail::get_p(output), pub_key.data(), pub_key.size());
1480 return ret;
1481 }
1482
1483 template <class OUTPUT, class NONCE>
psbt_output_set_nonce(const OUTPUT & output,const NONCE & nonce)1484 inline int psbt_output_set_nonce(const OUTPUT& output, const NONCE& nonce) {
1485 int ret = ::wally_psbt_output_set_nonce(detail::get_p(output), nonce.data(), nonce.size());
1486 return ret;
1487 }
1488
1489 template <class OUTPUT, class PROOF>
psbt_output_set_rangeproof(const OUTPUT & output,const PROOF & proof)1490 inline int psbt_output_set_rangeproof(const OUTPUT& output, const PROOF& proof) {
1491 int ret = ::wally_psbt_output_set_rangeproof(detail::get_p(output), proof.data(), proof.size());
1492 return ret;
1493 }
1494
1495 template <class OUTPUT, class PROOF>
psbt_output_set_surjectionproof(const OUTPUT & output,const PROOF & proof)1496 inline int psbt_output_set_surjectionproof(const OUTPUT& output, const PROOF& proof) {
1497 int ret = ::wally_psbt_output_set_surjectionproof(detail::get_p(output), proof.data(), proof.size());
1498 return ret;
1499 }
1500
1501 template <class OUTPUT, class COMMITMENT>
psbt_output_set_value_commitment(const OUTPUT & output,const COMMITMENT & commitment)1502 inline int psbt_output_set_value_commitment(const OUTPUT& output, const COMMITMENT& commitment) {
1503 int ret = ::wally_psbt_output_set_value_commitment(detail::get_p(output), commitment.data(), commitment.size());
1504 return ret;
1505 }
1506
1507 template <class OUTPUT, class VBF>
psbt_output_set_vbf(const OUTPUT & output,const VBF & vbf)1508 inline int psbt_output_set_vbf(const OUTPUT& output, const VBF& vbf) {
1509 int ret = ::wally_psbt_output_set_vbf(detail::get_p(output), vbf.data(), vbf.size());
1510 return ret;
1511 }
1512
1513 template <class TX, class TXHASH, class SCRIPT, class WITNESS, class NONCE, class ENTROPY, class ISSUANCE_AMOUNT, class INFLATION_KEYS, class ISSUANCE_AMOUNT_RANGEPROOF, class INFLATION_KEYS_RANGEPROOF, class PEGIN_WITNESS>
tx_add_elements_raw_input(const TX & tx,const TXHASH & txhash,uint32_t utxo_index,uint32_t sequence,const SCRIPT & script,const WITNESS & witness,const NONCE & nonce,const ENTROPY & entropy,const ISSUANCE_AMOUNT & issuance_amount,const INFLATION_KEYS & inflation_keys,const ISSUANCE_AMOUNT_RANGEPROOF & issuance_amount_rangeproof,const INFLATION_KEYS_RANGEPROOF & inflation_keys_rangeproof,const PEGIN_WITNESS & pegin_witness,uint32_t flags)1514 inline int tx_add_elements_raw_input(const TX& tx, const TXHASH& txhash, uint32_t utxo_index, uint32_t sequence, const SCRIPT& script, const WITNESS& witness, const NONCE& nonce, const ENTROPY& entropy, const ISSUANCE_AMOUNT& issuance_amount, const INFLATION_KEYS& inflation_keys, const ISSUANCE_AMOUNT_RANGEPROOF& issuance_amount_rangeproof, const INFLATION_KEYS_RANGEPROOF& inflation_keys_rangeproof, const PEGIN_WITNESS& pegin_witness, uint32_t flags) {
1515 int ret = ::wally_tx_add_elements_raw_input(detail::get_p(tx), txhash.data(), txhash.size(), utxo_index, sequence, script.data(), script.size(), detail::get_p(witness), nonce.data(), nonce.size(), entropy.data(), entropy.size(), issuance_amount.data(), issuance_amount.size(), inflation_keys.data(), inflation_keys.size(), issuance_amount_rangeproof.data(), issuance_amount_rangeproof.size(), inflation_keys_rangeproof.data(), inflation_keys_rangeproof.size(), detail::get_p(pegin_witness), flags);
1516 return ret;
1517 }
1518
1519 template <class TX, class TXHASH, class SCRIPT, class WITNESS, class NONCE, class ENTROPY, class ISSUANCE_AMOUNT, class INFLATION_KEYS, class ISSUANCE_AMOUNT_RANGEPROOF, class INFLATION_KEYS_RANGEPROOF, class PEGIN_WITNESS>
tx_add_elements_raw_input_at(const TX & tx,uint32_t index,const TXHASH & txhash,uint32_t utxo_index,uint32_t sequence,const SCRIPT & script,const WITNESS & witness,const NONCE & nonce,const ENTROPY & entropy,const ISSUANCE_AMOUNT & issuance_amount,const INFLATION_KEYS & inflation_keys,const ISSUANCE_AMOUNT_RANGEPROOF & issuance_amount_rangeproof,const INFLATION_KEYS_RANGEPROOF & inflation_keys_rangeproof,const PEGIN_WITNESS & pegin_witness,uint32_t flags)1520 inline int tx_add_elements_raw_input_at(const TX& tx, uint32_t index, const TXHASH& txhash, uint32_t utxo_index, uint32_t sequence, const SCRIPT& script, const WITNESS& witness, const NONCE& nonce, const ENTROPY& entropy, const ISSUANCE_AMOUNT& issuance_amount, const INFLATION_KEYS& inflation_keys, const ISSUANCE_AMOUNT_RANGEPROOF& issuance_amount_rangeproof, const INFLATION_KEYS_RANGEPROOF& inflation_keys_rangeproof, const PEGIN_WITNESS& pegin_witness, uint32_t flags) {
1521 int ret = ::wally_tx_add_elements_raw_input_at(detail::get_p(tx), index, txhash.data(), txhash.size(), utxo_index, sequence, script.data(), script.size(), detail::get_p(witness), nonce.data(), nonce.size(), entropy.data(), entropy.size(), issuance_amount.data(), issuance_amount.size(), inflation_keys.data(), inflation_keys.size(), issuance_amount_rangeproof.data(), issuance_amount_rangeproof.size(), inflation_keys_rangeproof.data(), inflation_keys_rangeproof.size(), detail::get_p(pegin_witness), flags);
1522 return ret;
1523 }
1524
1525 template <class TX, class SCRIPT, class ASSET, class VALUE, class NONCE, class SURJECTIONPROOF, class RANGEPROOF>
tx_add_elements_raw_output(const TX & tx,const SCRIPT & script,const ASSET & asset,const VALUE & value,const NONCE & nonce,const SURJECTIONPROOF & surjectionproof,const RANGEPROOF & rangeproof,uint32_t flags)1526 inline int tx_add_elements_raw_output(const TX& tx, const SCRIPT& script, const ASSET& asset, const VALUE& value, const NONCE& nonce, const SURJECTIONPROOF& surjectionproof, const RANGEPROOF& rangeproof, uint32_t flags) {
1527 int ret = ::wally_tx_add_elements_raw_output(detail::get_p(tx), script.data(), script.size(), asset.data(), asset.size(), value.data(), value.size(), nonce.data(), nonce.size(), surjectionproof.data(), surjectionproof.size(), rangeproof.data(), rangeproof.size(), flags);
1528 return ret;
1529 }
1530
1531 template <class TX, class SCRIPT, class ASSET, class VALUE, class NONCE, class SURJECTIONPROOF, class RANGEPROOF>
tx_add_elements_raw_output_at(const TX & tx,uint32_t index,const SCRIPT & script,const ASSET & asset,const VALUE & value,const NONCE & nonce,const SURJECTIONPROOF & surjectionproof,const RANGEPROOF & rangeproof,uint32_t flags)1532 inline int tx_add_elements_raw_output_at(const TX& tx, uint32_t index, const SCRIPT& script, const ASSET& asset, const VALUE& value, const NONCE& nonce, const SURJECTIONPROOF& surjectionproof, const RANGEPROOF& rangeproof, uint32_t flags) {
1533 int ret = ::wally_tx_add_elements_raw_output_at(detail::get_p(tx), index, script.data(), script.size(), asset.data(), asset.size(), value.data(), value.size(), nonce.data(), nonce.size(), surjectionproof.data(), surjectionproof.size(), rangeproof.data(), rangeproof.size(), flags);
1534 return ret;
1535 }
1536
1537 template <class BYTES_OUT>
tx_confidential_value_from_satoshi(uint64_t satoshi,BYTES_OUT & bytes_out)1538 inline int tx_confidential_value_from_satoshi(uint64_t satoshi, BYTES_OUT& bytes_out) {
1539 int ret = ::wally_tx_confidential_value_from_satoshi(satoshi, bytes_out.data(), bytes_out.size());
1540 return ret;
1541 }
1542
1543 template <class VALUE>
tx_confidential_value_to_satoshi(const VALUE & value,uint64_t * value_out)1544 inline int tx_confidential_value_to_satoshi(const VALUE& value, uint64_t* value_out) {
1545 int ret = ::wally_tx_confidential_value_to_satoshi(value.data(), value.size(), value_out);
1546 return ret;
1547 }
1548
1549 template <class TXHASH, class SCRIPT, class WITNESS, class NONCE, class ENTROPY, class ISSUANCE_AMOUNT, class INFLATION_KEYS, class ISSUANCE_AMOUNT_RANGEPROOF, class INFLATION_KEYS_RANGEPROOF, class PEGIN_WITNESS>
tx_elements_input_init_alloc(const TXHASH & txhash,uint32_t utxo_index,uint32_t sequence,const SCRIPT & script,const WITNESS & witness,const NONCE & nonce,const ENTROPY & entropy,const ISSUANCE_AMOUNT & issuance_amount,const INFLATION_KEYS & inflation_keys,const ISSUANCE_AMOUNT_RANGEPROOF & issuance_amount_rangeproof,const INFLATION_KEYS_RANGEPROOF & inflation_keys_rangeproof,const PEGIN_WITNESS & pegin_witness,struct wally_tx_input ** output)1550 inline int tx_elements_input_init_alloc(const TXHASH& txhash, uint32_t utxo_index, uint32_t sequence, const SCRIPT& script, const WITNESS& witness, const NONCE& nonce, const ENTROPY& entropy, const ISSUANCE_AMOUNT& issuance_amount, const INFLATION_KEYS& inflation_keys, const ISSUANCE_AMOUNT_RANGEPROOF& issuance_amount_rangeproof, const INFLATION_KEYS_RANGEPROOF& inflation_keys_rangeproof, const PEGIN_WITNESS& pegin_witness, struct wally_tx_input** output) {
1551 int ret = ::wally_tx_elements_input_init_alloc(txhash.data(), txhash.size(), utxo_index, sequence, script.data(), script.size(), detail::get_p(witness), nonce.data(), nonce.size(), entropy.data(), entropy.size(), issuance_amount.data(), issuance_amount.size(), inflation_keys.data(), inflation_keys.size(), issuance_amount_rangeproof.data(), issuance_amount_rangeproof.size(), inflation_keys_rangeproof.data(), inflation_keys_rangeproof.size(), detail::get_p(pegin_witness), output);
1552 return ret;
1553 }
1554
1555 template <class INPUT>
tx_elements_input_is_pegin(const INPUT & input,size_t * written)1556 inline int tx_elements_input_is_pegin(const INPUT& input, size_t* written) {
1557 int ret = ::wally_tx_elements_input_is_pegin(detail::get_p(input), written);
1558 return ret;
1559 }
1560
tx_elements_input_issuance_free(struct wally_tx_input * input)1561 inline int tx_elements_input_issuance_free(struct wally_tx_input* input) {
1562 int ret = ::wally_tx_elements_input_issuance_free(input);
1563 return ret;
1564 }
1565
1566 template <class INPUT, class NONCE, class ENTROPY, class ISSUANCE_AMOUNT, class INFLATION_KEYS, class ISSUANCE_AMOUNT_RANGEPROOF, class INFLATION_KEYS_RANGEPROOF>
tx_elements_input_issuance_set(const INPUT & input,const NONCE & nonce,const ENTROPY & entropy,const ISSUANCE_AMOUNT & issuance_amount,const INFLATION_KEYS & inflation_keys,const ISSUANCE_AMOUNT_RANGEPROOF & issuance_amount_rangeproof,const INFLATION_KEYS_RANGEPROOF & inflation_keys_rangeproof)1567 inline int tx_elements_input_issuance_set(const INPUT& input, const NONCE& nonce, const ENTROPY& entropy, const ISSUANCE_AMOUNT& issuance_amount, const INFLATION_KEYS& inflation_keys, const ISSUANCE_AMOUNT_RANGEPROOF& issuance_amount_rangeproof, const INFLATION_KEYS_RANGEPROOF& inflation_keys_rangeproof) {
1568 int ret = ::wally_tx_elements_input_issuance_set(detail::get_p(input), nonce.data(), nonce.size(), entropy.data(), entropy.size(), issuance_amount.data(), issuance_amount.size(), inflation_keys.data(), inflation_keys.size(), issuance_amount_rangeproof.data(), issuance_amount_rangeproof.size(), inflation_keys_rangeproof.data(), inflation_keys_rangeproof.size());
1569 return ret;
1570 }
1571
1572 template <class ENTROPY, class BYTES_OUT>
tx_elements_issuance_calculate_asset(const ENTROPY & entropy,BYTES_OUT & bytes_out)1573 inline int tx_elements_issuance_calculate_asset(const ENTROPY& entropy, BYTES_OUT& bytes_out) {
1574 int ret = ::wally_tx_elements_issuance_calculate_asset(entropy.data(), entropy.size(), bytes_out.data(), bytes_out.size());
1575 return ret;
1576 }
1577
1578 template <class ENTROPY, class BYTES_OUT>
tx_elements_issuance_calculate_reissuance_token(const ENTROPY & entropy,uint32_t flags,BYTES_OUT & bytes_out)1579 inline int tx_elements_issuance_calculate_reissuance_token(const ENTROPY& entropy, uint32_t flags, BYTES_OUT& bytes_out) {
1580 int ret = ::wally_tx_elements_issuance_calculate_reissuance_token(entropy.data(), entropy.size(), flags, bytes_out.data(), bytes_out.size());
1581 return ret;
1582 }
1583
1584 template <class TXHASH, class CONTRACT_HASH, class BYTES_OUT>
tx_elements_issuance_generate_entropy(const TXHASH & txhash,uint32_t index,const CONTRACT_HASH & contract_hash,BYTES_OUT & bytes_out)1585 inline int tx_elements_issuance_generate_entropy(const TXHASH& txhash, uint32_t index, const CONTRACT_HASH& contract_hash, BYTES_OUT& bytes_out) {
1586 int ret = ::wally_tx_elements_issuance_generate_entropy(txhash.data(), txhash.size(), index, contract_hash.data(), contract_hash.size(), bytes_out.data(), bytes_out.size());
1587 return ret;
1588 }
1589
tx_elements_output_commitment_free(struct wally_tx_output * output)1590 inline int tx_elements_output_commitment_free(struct wally_tx_output* output) {
1591 int ret = ::wally_tx_elements_output_commitment_free(output);
1592 return ret;
1593 }
1594
1595 template <class OUTPUT, class ASSET, class VALUE, class NONCE, class SURJECTIONPROOF, class RANGEPROOF>
tx_elements_output_commitment_set(const OUTPUT & output,const ASSET & asset,const VALUE & value,const NONCE & nonce,const SURJECTIONPROOF & surjectionproof,const RANGEPROOF & rangeproof)1596 inline int tx_elements_output_commitment_set(const OUTPUT& output, const ASSET& asset, const VALUE& value, const NONCE& nonce, const SURJECTIONPROOF& surjectionproof, const RANGEPROOF& rangeproof) {
1597 int ret = ::wally_tx_elements_output_commitment_set(detail::get_p(output), asset.data(), asset.size(), value.data(), value.size(), nonce.data(), nonce.size(), surjectionproof.data(), surjectionproof.size(), rangeproof.data(), rangeproof.size());
1598 return ret;
1599 }
1600
1601 template <class SCRIPT, class ASSET, class VALUE, class NONCE, class SURJECTIONPROOF, class RANGEPROOF>
tx_elements_output_init(const SCRIPT & script,const ASSET & asset,const VALUE & value,const NONCE & nonce,const SURJECTIONPROOF & surjectionproof,const RANGEPROOF & rangeproof,struct wally_tx_output * output)1602 inline int tx_elements_output_init(const SCRIPT& script, const ASSET& asset, const VALUE& value, const NONCE& nonce, const SURJECTIONPROOF& surjectionproof, const RANGEPROOF& rangeproof, struct wally_tx_output* output) {
1603 int ret = ::wally_tx_elements_output_init(script.data(), script.size(), asset.data(), asset.size(), value.data(), value.size(), nonce.data(), nonce.size(), surjectionproof.data(), surjectionproof.size(), rangeproof.data(), rangeproof.size(), output);
1604 return ret;
1605 }
1606
1607 template <class SCRIPT, class ASSET, class VALUE, class NONCE, class SURJECTIONPROOF, class RANGEPROOF>
tx_elements_output_init_alloc(const SCRIPT & script,const ASSET & asset,const VALUE & value,const NONCE & nonce,const SURJECTIONPROOF & surjectionproof,const RANGEPROOF & rangeproof,struct wally_tx_output ** output)1608 inline int tx_elements_output_init_alloc(const SCRIPT& script, const ASSET& asset, const VALUE& value, const NONCE& nonce, const SURJECTIONPROOF& surjectionproof, const RANGEPROOF& rangeproof, struct wally_tx_output** output) {
1609 int ret = ::wally_tx_elements_output_init_alloc(script.data(), script.size(), asset.data(), asset.size(), value.data(), value.size(), nonce.data(), nonce.size(), surjectionproof.data(), surjectionproof.size(), rangeproof.data(), rangeproof.size(), output);
1610 return ret;
1611 }
1612
1613 template <class TX, class SCRIPT, class VALUE, class BYTES_OUT>
tx_get_elements_signature_hash(const TX & tx,size_t index,const SCRIPT & script,const VALUE & value,uint32_t sighash,uint32_t flags,BYTES_OUT & bytes_out)1614 inline int tx_get_elements_signature_hash(const TX& tx, size_t index, const SCRIPT& script, const VALUE& value, uint32_t sighash, uint32_t flags, BYTES_OUT& bytes_out) {
1615 int ret = ::wally_tx_get_elements_signature_hash(detail::get_p(tx), index, script.data(), script.size(), value.data(), value.size(), sighash, flags, bytes_out.data(), bytes_out.size());
1616 return ret;
1617 }
1618
1619 template <class TX>
tx_is_elements(const TX & tx,size_t * written)1620 inline int tx_is_elements(const TX& tx, size_t* written) {
1621 int ret = ::wally_tx_is_elements(detail::get_p(tx), written);
1622 return ret;
1623 }
1624 #endif // BUILD_ELEMENTS
1625 /* END AUTOGENERATED */
1626
get_secp_context()1627 inline struct secp256k1_context_struct *get_secp_context() {
1628 return ::wally_get_secp_context();
1629 }
1630
get_new_secp_context()1631 inline struct secp256k1_context_struct *get_new_secp_context() {
1632 return ::wally_get_new_secp_context();
1633 }
1634
secp_context_free(struct secp256k1_context_struct * ctx)1635 inline void secp_context_free(struct secp256k1_context_struct *ctx) {
1636 ::wally_secp_context_free(ctx);
1637 }
1638
clear(void * p,size_t n)1639 inline int clear(void *p, size_t n) {
1640 return ::wally_bzero(p, n);
1641 }
1642
clear(O & out)1643 template<typename O> inline int clear(O& out) {
1644 return ::wally_bzero(out.data(), out.size());
1645 }
1646
is_elements_build()1647 inline bool is_elements_build()
1648 {
1649 size_t ret;
1650 ::wally_is_elements_build(&ret);
1651 return ret != 0;
1652 }
1653
1654 } /* namespace wally */
1655
1656 #endif /* LIBWALLY_CORE_WALLY_HPP */
1657