| 21 | |
| 22 | namespace { |
| 23 | class DestinationEncoder |
| 24 | { |
| 25 | private: |
| 26 | const CChainParams& m_params; |
| 27 | |
| 28 | public: |
| 29 | explicit DestinationEncoder(const CChainParams& params) : m_params(params) {} |
| 30 | |
| 31 | std::string operator()(const PKHash& id) const |
| 32 | { |
| 33 | std::vector<unsigned char> data = m_params.Base58Prefix(CChainParams::PUBKEY_ADDRESS); |
| 34 | data.insert(data.end(), id.begin(), id.end()); |
| 35 | return EncodeBase58Check(data); |
| 36 | } |
| 37 | |
| 38 | std::string operator()(const ScriptHash& id) const |
| 39 | { |
| 40 | std::vector<unsigned char> data = m_params.Base58Prefix(CChainParams::SCRIPT_ADDRESS); |
| 41 | data.insert(data.end(), id.begin(), id.end()); |
| 42 | return EncodeBase58Check(data); |
| 43 | } |
| 44 | |
| 45 | std::string operator()(const WitnessV0KeyHash& id) const |
| 46 | { |
| 47 | std::vector<unsigned char> data = {0}; |
| 48 | data.reserve(33); |
| 49 | ConvertBits<8, 5, true>([&](unsigned char c) { data.push_back(c); }, id.begin(), id.end()); |
| 50 | return bech32::Encode(bech32::Encoding::BECH32, m_params.Bech32HRP(), data); |
| 51 | } |
| 52 | |
| 53 | std::string operator()(const WitnessV0ScriptHash& id) const |
| 54 | { |
| 55 | std::vector<unsigned char> data = {0}; |
| 56 | data.reserve(53); |
| 57 | ConvertBits<8, 5, true>([&](unsigned char c) { data.push_back(c); }, id.begin(), id.end()); |
| 58 | return bech32::Encode(bech32::Encoding::BECH32, m_params.Bech32HRP(), data); |
| 59 | } |
| 60 | |
| 61 | std::string operator()(const WitnessV1Taproot& tap) const |
| 62 | { |
| 63 | std::vector<unsigned char> data = {1}; |
| 64 | data.reserve(53); |
| 65 | ConvertBits<8, 5, true>([&](unsigned char c) { data.push_back(c); }, tap.begin(), tap.end()); |
| 66 | return bech32::Encode(bech32::Encoding::BECH32M, m_params.Bech32HRP(), data); |
| 67 | } |
| 68 | |
| 69 | std::string operator()(const WitnessUnknown& id) const |
| 70 | { |
| 71 | const std::vector<unsigned char>& program = id.GetWitnessProgram(); |
| 72 | if (id.GetWitnessVersion() < 1 || id.GetWitnessVersion() > 16 || program.size() < 2 || program.size() > 40) { |
| 73 | return {}; |
| 74 | } |
| 75 | std::vector<unsigned char> data = {(unsigned char)id.GetWitnessVersion()}; |
| 76 | data.reserve(1 + CeilDiv(program.size() * 8, 5u)); |
| 77 | ConvertBits<8, 5, true>([&](unsigned char c) { data.push_back(c); }, program.begin(), program.end()); |
| 78 | return bech32::Encode(bech32::Encoding::BECH32M, m_params.Bech32HRP(), data); |
| 79 | } |
| 80 | |