Bitcoin ABC 0.26.3
P2P Digital Currency
Loading...
Searching...
No Matches
iguana.cpp
Go to the documentation of this file.
1// Copyright (c) 2024 The Bitcoin developers
2// Distributed under the MIT software license, see the accompanying
3// file COPYING or http://www.opensource.org/licenses/mit-license.php.
4
5#include <clientversion.h>
6#include <common/args.h>
7#include <iguana_formatter.h>
9#include <memory>
10#include <policy/policy.h>
11#include <span.h>
12#include <streams.h>
13#include <tinyformat.h>
14#include <util/strencodings.h>
15#include <util/string.h>
16#include <util/translation.h>
17
18#include <iostream>
19
20const std::function<std::string(const char *)> G_TRANSLATION_FUN = nullptr;
21
23const std::string DEFAULT_FORMAT = "human";
24
26 args.AddArg("-version", "Print version and exit", ArgsManager::ALLOW_ANY,
28 args.AddArg("-tx", "Raw tx hex to run the debugger for (required)",
30 args.AddArg(
31 "-inputindex",
32 strprintf("Input index to run (default: %d)", DEFAULT_INPUT_INDEX),
34 args.AddArg("-scriptpubkey",
35 "Hex of the scriptPubKey of the output being spent (required)",
37 args.AddArg("-value",
38 "Value (in sats) of the output being spent (required)",
40 args.AddArg("-format",
41 strprintf("Output format for the debug trace (Options: human, "
42 "csv. Default: %d)",
45}
46
47int main(int argc, char *argv[]) {
48 ArgsManager args;
49 SetupHelpOptions(args);
50 SetupIguanaArgs(args);
51
52 std::string error;
53 if (!args.ParseParameters(argc, argv, error)) {
54 std::cerr << "Error parsing command line arguments: " << error
55 << std::endl;
56 return -1;
57 }
58
59 if (args.GetBoolArg("-version")) {
60 std::cout << "Iguana " << FormatFullVersion() << std::endl;
61 return 0;
62 }
63
64 if (HelpRequested(args)) {
65 std::cout << "Usage: iguana [options]" << std::endl;
66 std::cout << args.GetHelpMessage();
67 return 0;
68 }
69
70 const std::string outputFormat = args.GetArg("-format", DEFAULT_FORMAT);
71 std::unique_ptr<IguanaFormatter> formatter;
72 if (outputFormat == "human") {
74 } else if (outputFormat == "csv") {
75 formatter.reset(new FormatterCsv());
76 } else {
77 std::cerr << "Unsupported output format " << outputFormat << std::endl;
78 return -1;
79 }
80
81 std::vector<std::string> missingArgs;
82 if (!args.IsArgSet("-tx")) {
83 missingArgs.push_back("-tx");
84 }
85 if (!args.IsArgSet("-scriptpubkey")) {
86 missingArgs.push_back("-scriptpubkey");
87 }
88 if (!args.IsArgSet("-value")) {
89 missingArgs.push_back("-value");
90 }
91 if (!missingArgs.empty()) {
92 std::cerr << "Missing required args " << Join(missingArgs, ", ") << ". "
93 << "Provide -h to see a description for each." << std::endl;
94 return -1;
95 }
96
97 std::string tx_hex = args.GetArg("-tx", "");
98 std::vector<uint8_t> tx_raw = ParseHex(tx_hex);
101 tx_stream >> tx;
102
103 const int64_t inputIndex =
104 args.GetIntArg("-inputindex", DEFAULT_INPUT_INDEX);
105
106 if (inputIndex < 0 || tx.vin.size() <= (size_t)inputIndex) {
107 std::cerr << "Transaction doesn't have input index " << inputIndex
108 << std::endl;
109 return -1;
110 }
111
112 const Amount value = args.GetIntArg("-value", 0) * Amount::satoshi();
113
114 std::string scriptPubKeyHex = args.GetArg("-scriptpubkey", "");
115 std::vector<uint8_t> scriptPubKeyRaw = ParseHex(scriptPubKeyHex);
116 CScript scriptPubKey(scriptPubKeyRaw.begin(), scriptPubKeyRaw.end());
117 CTxOut txout(value, scriptPubKey);
118
120
122
123 IguanaInterpreter iguana(tx, inputIndex, txout, flags);
124 IguanaResult result = iguana.Run();
125
126 if (!formatter->Format(result)) {
127 return -1;
128 }
129
130 return 0;
131}
bool HelpRequested(const ArgsManager &args)
Definition args.cpp:732
void SetupHelpOptions(ArgsManager &args)
Add help options to the args manager.
Definition args.cpp:737
int main(void)
Definition bench.c:157
int flags
@ ALLOW_ANY
Definition args.h:103
@ ALLOW_INT
Definition args.h:101
@ ALLOW_STRING
Definition args.h:102
bool ParseParameters(int argc, const char *const argv[], std::string &error)
Definition args.cpp:201
std::string GetHelpMessage() const
Get the help string.
Definition args.cpp:653
bool IsArgSet(const std::string &strArg) const
Return true if the given argument has been manually set.
Definition args.cpp:381
int64_t GetIntArg(const std::string &strArg, int64_t nDefault) const
Return integer argument or default value.
Definition args.cpp:526
std::string GetArg(const std::string &strArg, const std::string &strDefault) const
Return string argument or default value.
Definition args.cpp:494
bool GetBoolArg(const std::string &strArg, bool fDefault) const
Return boolean argument or default value.
Definition args.cpp:556
void AddArg(const std::string &name, const std::string &help, unsigned int flags, const OptionsCategory &cat)
Add argument.
Definition args.cpp:620
Double ended buffer combining vector and stream-like interfaces.
Definition streams.h:177
A mutable version of CTransaction.
std::vector< CTxIn > vin
Serialized script, used inside transaction inputs and outputs.
Definition script.h:431
An output of a transaction.
Users of this module must hold an ECCVerifyHandle.
Definition pubkey.h:223
std::string FormatFullVersion()
const std::function< std::string(const char *)> G_TRANSLATION_FUN
Translate string to current locale using Qt.
Definition iguana.cpp:20
const int64_t DEFAULT_INPUT_INDEX
Definition iguana.cpp:22
const std::string DEFAULT_FORMAT
Definition iguana.cpp:23
void SetupIguanaArgs(ArgsManager &args)
Definition iguana.cpp:25
bool error(const char *fmt, const Args &...args)
Definition logging.h:226
static constexpr uint32_t STANDARD_SCRIPT_VERIFY_FLAGS
Standard script verification flags that standard transactions will comply with.
Definition policy.h:91
T GetRand(T nMax=std::numeric_limits< T >::max()) noexcept
Generate a uniform random integer of type T in the range [0..nMax) nMax defaults to std::numeric_limi...
Definition random.h:85
Span< const std::byte > MakeByteSpan(V &&v) noexcept
Definition span.h:301
auto Join(const std::vector< T > &list, const BaseType &separator, UnaryOp unary_op) -> decltype(unary_op(list.at(0)))
Join a list of items.
Definition string.h:63
static constexpr Amount satoshi() noexcept
Definition amount.h:33
#define strprintf
Format arguments and return the string or write to given std::ostream (see tinyformat::format doc for...
template std::vector< std::byte > ParseHex(std::string_view)