| 119 | bool IsRange() const override { return m_derive != DeriveType::NO; } |
| 120 | size_t GetSize() const override { return 33; } |
| 121 | bool GetPubKey(int pos, const SigningProvider& arg, CPubKey& out) const override |
| 122 | { |
| 123 | if (IsHardened()) { |
| 124 | CExtKey key; |
| 125 | if (!GetExtKey(arg, key)) return false; |
| 126 | for (auto entry : m_path) { |
| 127 | key.Derive(key, entry); |
| 128 | } |
| 129 | if (m_derive == DeriveType::UNHARDENED) key.Derive(key, pos); |
| 130 | if (m_derive == DeriveType::HARDENED) key.Derive(key, pos | 0x80000000UL); |
| 131 | out = key.Neuter().pubkey; |
| 132 | } else { |
| 133 | // TODO: optimize by caching |
| 134 | CExtPubKey key = m_extkey; |
| 135 | for (auto entry : m_path) { |
| 136 | key.Derive(key, entry); |
| 137 | } |
| 138 | if (m_derive == DeriveType::UNHARDENED) key.Derive(key, pos); |
| 139 | assert(m_derive != DeriveType::HARDENED); |
| 140 | out = key.pubkey; |
| 141 | } |
| 142 | return true; |
| 143 | } |
| 144 | std::string ToString() const override |
| 145 | { |
| 146 | std::string ret = EncodeExtPubKey(m_extkey) + FormatKeyPath(m_path); |