| 262 | } |
| 263 | |
| 264 | size_t ComputeScriptLen(Fragment fragment, Type sub0typ, size_t subsize, uint32_t k, size_t n_subs, |
| 265 | size_t n_keys, MiniscriptContext ms_ctx) { |
| 266 | switch (fragment) { |
| 267 | case Fragment::JUST_1: |
| 268 | case Fragment::JUST_0: return 1; |
| 269 | case Fragment::PK_K: return IsTapscript(ms_ctx) ? 33 : 34; |
| 270 | case Fragment::PK_H: return 3 + 21; |
| 271 | case Fragment::OLDER: |
| 272 | case Fragment::AFTER: return 1 + BuildScript(k).size(); |
| 273 | case Fragment::HASH256: |
| 274 | case Fragment::SHA256: return 4 + 2 + 33; |
| 275 | case Fragment::HASH160: |
| 276 | case Fragment::RIPEMD160: return 4 + 2 + 21; |
| 277 | case Fragment::MULTI: return 1 + BuildScript(n_keys).size() + BuildScript(k).size() + 34 * n_keys; |
| 278 | case Fragment::MULTI_A: return (1 + 32 + 1) * n_keys + BuildScript(k).size() + 1; |
| 279 | case Fragment::AND_V: return subsize; |
| 280 | case Fragment::WRAP_V: return subsize + (sub0typ << "x"_mst); |
| 281 | case Fragment::WRAP_S: |
| 282 | case Fragment::WRAP_C: |
| 283 | case Fragment::WRAP_N: |
| 284 | case Fragment::AND_B: |
| 285 | case Fragment::OR_B: return subsize + 1; |
| 286 | case Fragment::WRAP_A: |
| 287 | case Fragment::OR_C: return subsize + 2; |
| 288 | case Fragment::WRAP_D: |
| 289 | case Fragment::OR_D: |
| 290 | case Fragment::OR_I: |
| 291 | case Fragment::ANDOR: return subsize + 3; |
| 292 | case Fragment::WRAP_J: return subsize + 4; |
| 293 | case Fragment::THRESH: return subsize + n_subs + BuildScript(k).size(); |
| 294 | } |
| 295 | assert(false); |
| 296 | } |
| 297 | |
| 298 | InputStack& InputStack::SetAvailable(Availability avail) { |
| 299 | available = avail; |