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