/types/address.go

https://github.com/maticnetwork/cosmos-sdk · Go · 730 lines · 468 code · 139 blank · 123 comment · 112 complexity · fc4a64fd8707fa909ec1ff22650d1a46 MD5 · raw file

  1. package types
  2. import (
  3. "bytes"
  4. "encoding/hex"
  5. "encoding/json"
  6. "errors"
  7. "fmt"
  8. "strings"
  9. "gopkg.in/yaml.v2"
  10. "github.com/tendermint/tendermint/crypto"
  11. cryptoAmino "github.com/tendermint/tendermint/crypto/encoding/amino"
  12. "github.com/tendermint/tendermint/libs/bech32"
  13. )
  14. const (
  15. // Constants defined here are the defaults value for address.
  16. // You can use the specific values for your project.
  17. // Add the follow lines to the `main()` of your server.
  18. //
  19. // config := sdk.GetConfig()
  20. // config.SetBech32PrefixForAccount(yourBech32PrefixAccAddr, yourBech32PrefixAccPub)
  21. // config.SetBech32PrefixForValidator(yourBech32PrefixValAddr, yourBech32PrefixValPub)
  22. // config.SetBech32PrefixForConsensusNode(yourBech32PrefixConsAddr, yourBech32PrefixConsPub)
  23. // config.SetCoinType(yourCoinType)
  24. // config.SetFullFundraiserPath(yourFullFundraiserPath)
  25. // config.Seal()
  26. // AddrLen defines a valid address length
  27. AddrLen = 20
  28. // Bech32PrefixAccAddr defines the Bech32 prefix of an account's address
  29. Bech32MainPrefix = "cosmos"
  30. // Atom in https://github.com/satoshilabs/slips/blob/master/slip-0044.md
  31. CoinType = 118
  32. // BIP44Prefix is the parts of the BIP44 HD path that are fixed by
  33. // what we used during the fundraiser.
  34. FullFundraiserPath = "44'/118'/0'/0/0"
  35. // PrefixAccount is the prefix for account keys
  36. PrefixAccount = "acc"
  37. // PrefixValidator is the prefix for validator keys
  38. PrefixValidator = "val"
  39. // PrefixConsensus is the prefix for consensus keys
  40. PrefixConsensus = "cons"
  41. // PrefixPublic is the prefix for public keys
  42. PrefixPublic = "pub"
  43. // PrefixOperator is the prefix for operator keys
  44. PrefixOperator = "oper"
  45. // PrefixAddress is the prefix for addresses
  46. PrefixAddress = "addr"
  47. // Bech32PrefixAccAddr defines the Bech32 prefix of an account's address
  48. Bech32PrefixAccAddr = Bech32MainPrefix
  49. // Bech32PrefixAccPub defines the Bech32 prefix of an account's public key
  50. Bech32PrefixAccPub = Bech32MainPrefix + PrefixPublic
  51. // Bech32PrefixValAddr defines the Bech32 prefix of a validator's operator address
  52. Bech32PrefixValAddr = Bech32MainPrefix + PrefixValidator + PrefixOperator
  53. // Bech32PrefixValPub defines the Bech32 prefix of a validator's operator public key
  54. Bech32PrefixValPub = Bech32MainPrefix + PrefixValidator + PrefixOperator + PrefixPublic
  55. // Bech32PrefixConsAddr defines the Bech32 prefix of a consensus node address
  56. Bech32PrefixConsAddr = Bech32MainPrefix + PrefixValidator + PrefixConsensus
  57. // Bech32PrefixConsPub defines the Bech32 prefix of a consensus node public key
  58. Bech32PrefixConsPub = Bech32MainPrefix + PrefixValidator + PrefixConsensus + PrefixPublic
  59. )
  60. // Address is a common interface for different types of addresses used by the SDK
  61. type Address interface {
  62. Equals(Address) bool
  63. Empty() bool
  64. Marshal() ([]byte, error)
  65. MarshalJSON() ([]byte, error)
  66. Bytes() []byte
  67. String() string
  68. Format(s fmt.State, verb rune)
  69. }
  70. // Ensure that different address types implement the interface
  71. var _ Address = AccAddress{}
  72. var _ Address = ValAddress{}
  73. var _ Address = ConsAddress{}
  74. var _ yaml.Marshaler = AccAddress{}
  75. var _ yaml.Marshaler = ValAddress{}
  76. var _ yaml.Marshaler = ConsAddress{}
  77. // ----------------------------------------------------------------------------
  78. // account
  79. // ----------------------------------------------------------------------------
  80. // AccAddress a wrapper around bytes meant to represent an account address.
  81. // When marshaled to a string or JSON, it uses Bech32.
  82. type AccAddress []byte
  83. // AccAddressFromHex creates an AccAddress from a hex string.
  84. func AccAddressFromHex(address string) (addr AccAddress, err error) {
  85. if len(address) == 0 {
  86. return addr, errors.New("decoding Bech32 address failed: must provide an address")
  87. }
  88. bz, err := hex.DecodeString(address)
  89. if err != nil {
  90. return nil, err
  91. }
  92. return AccAddress(bz), nil
  93. }
  94. // VerifyAddressFormat verifies that the provided bytes form a valid address
  95. // according to the default address rules or a custom address verifier set by
  96. // GetConfig().SetAddressVerifier()
  97. func VerifyAddressFormat(bz []byte) error {
  98. verifier := GetConfig().GetAddressVerifier()
  99. if verifier != nil {
  100. return verifier(bz)
  101. }
  102. if len(bz) != AddrLen {
  103. return errors.New("Incorrect address length")
  104. }
  105. return nil
  106. }
  107. // AccAddressFromBech32 creates an AccAddress from a Bech32 string.
  108. func AccAddressFromBech32(address string) (addr AccAddress, err error) {
  109. if len(strings.TrimSpace(address)) == 0 {
  110. return AccAddress{}, nil
  111. }
  112. bech32PrefixAccAddr := GetConfig().GetBech32AccountAddrPrefix()
  113. bz, err := GetFromBech32(address, bech32PrefixAccAddr)
  114. if err != nil {
  115. return nil, err
  116. }
  117. err = VerifyAddressFormat(bz)
  118. if err != nil {
  119. return nil, err
  120. }
  121. return AccAddress(bz), nil
  122. }
  123. // Returns boolean for whether two AccAddresses are Equal
  124. func (aa AccAddress) Equals(aa2 Address) bool {
  125. if aa.Empty() && aa2.Empty() {
  126. return true
  127. }
  128. return bytes.Equal(aa.Bytes(), aa2.Bytes())
  129. }
  130. // Returns boolean for whether an AccAddress is empty
  131. func (aa AccAddress) Empty() bool {
  132. if aa == nil {
  133. return true
  134. }
  135. aa2 := AccAddress{}
  136. return bytes.Equal(aa.Bytes(), aa2.Bytes())
  137. }
  138. // Marshal returns the raw address bytes. It is needed for protobuf
  139. // compatibility.
  140. func (aa AccAddress) Marshal() ([]byte, error) {
  141. return aa, nil
  142. }
  143. // Unmarshal sets the address to the given data. It is needed for protobuf
  144. // compatibility.
  145. func (aa *AccAddress) Unmarshal(data []byte) error {
  146. *aa = data
  147. return nil
  148. }
  149. // MarshalJSON marshals to JSON using Bech32.
  150. func (aa AccAddress) MarshalJSON() ([]byte, error) {
  151. return json.Marshal(aa.String())
  152. }
  153. // MarshalYAML marshals to YAML using Bech32.
  154. func (aa AccAddress) MarshalYAML() (interface{}, error) {
  155. return aa.String(), nil
  156. }
  157. // UnmarshalJSON unmarshals from JSON assuming Bech32 encoding.
  158. func (aa *AccAddress) UnmarshalJSON(data []byte) error {
  159. var s string
  160. err := json.Unmarshal(data, &s)
  161. if err != nil {
  162. return err
  163. }
  164. aa2, err := AccAddressFromBech32(s)
  165. if err != nil {
  166. return err
  167. }
  168. *aa = aa2
  169. return nil
  170. }
  171. // UnmarshalYAML unmarshals from JSON assuming Bech32 encoding.
  172. func (aa *AccAddress) UnmarshalYAML(data []byte) error {
  173. var s string
  174. err := yaml.Unmarshal(data, &s)
  175. if err != nil {
  176. return err
  177. }
  178. aa2, err := AccAddressFromBech32(s)
  179. if err != nil {
  180. return err
  181. }
  182. *aa = aa2
  183. return nil
  184. }
  185. // Bytes returns the raw address bytes.
  186. func (aa AccAddress) Bytes() []byte {
  187. return aa
  188. }
  189. // String implements the Stringer interface.
  190. func (aa AccAddress) String() string {
  191. if aa.Empty() {
  192. return ""
  193. }
  194. bech32PrefixAccAddr := GetConfig().GetBech32AccountAddrPrefix()
  195. bech32Addr, err := bech32.ConvertAndEncode(bech32PrefixAccAddr, aa.Bytes())
  196. if err != nil {
  197. panic(err)
  198. }
  199. return bech32Addr
  200. }
  201. // Format implements the fmt.Formatter interface.
  202. // nolint: errcheck
  203. func (aa AccAddress) Format(s fmt.State, verb rune) {
  204. switch verb {
  205. case 's':
  206. s.Write([]byte(aa.String()))
  207. case 'p':
  208. s.Write([]byte(fmt.Sprintf("%p", aa)))
  209. default:
  210. s.Write([]byte(fmt.Sprintf("%X", []byte(aa))))
  211. }
  212. }
  213. // ----------------------------------------------------------------------------
  214. // validator operator
  215. // ----------------------------------------------------------------------------
  216. // ValAddress defines a wrapper around bytes meant to present a validator's
  217. // operator. When marshaled to a string or JSON, it uses Bech32.
  218. type ValAddress []byte
  219. // ValAddressFromHex creates a ValAddress from a hex string.
  220. func ValAddressFromHex(address string) (addr ValAddress, err error) {
  221. if len(address) == 0 {
  222. return addr, errors.New("decoding Bech32 address failed: must provide an address")
  223. }
  224. bz, err := hex.DecodeString(address)
  225. if err != nil {
  226. return nil, err
  227. }
  228. return ValAddress(bz), nil
  229. }
  230. // ValAddressFromBech32 creates a ValAddress from a Bech32 string.
  231. func ValAddressFromBech32(address string) (addr ValAddress, err error) {
  232. if len(strings.TrimSpace(address)) == 0 {
  233. return ValAddress{}, nil
  234. }
  235. bech32PrefixValAddr := GetConfig().GetBech32ValidatorAddrPrefix()
  236. bz, err := GetFromBech32(address, bech32PrefixValAddr)
  237. if err != nil {
  238. return nil, err
  239. }
  240. err = VerifyAddressFormat(bz)
  241. if err != nil {
  242. return nil, err
  243. }
  244. return ValAddress(bz), nil
  245. }
  246. // Returns boolean for whether two ValAddresses are Equal
  247. func (va ValAddress) Equals(va2 Address) bool {
  248. if va.Empty() && va2.Empty() {
  249. return true
  250. }
  251. return bytes.Equal(va.Bytes(), va2.Bytes())
  252. }
  253. // Returns boolean for whether an AccAddress is empty
  254. func (va ValAddress) Empty() bool {
  255. if va == nil {
  256. return true
  257. }
  258. va2 := ValAddress{}
  259. return bytes.Equal(va.Bytes(), va2.Bytes())
  260. }
  261. // Marshal returns the raw address bytes. It is needed for protobuf
  262. // compatibility.
  263. func (va ValAddress) Marshal() ([]byte, error) {
  264. return va, nil
  265. }
  266. // Unmarshal sets the address to the given data. It is needed for protobuf
  267. // compatibility.
  268. func (va *ValAddress) Unmarshal(data []byte) error {
  269. *va = data
  270. return nil
  271. }
  272. // MarshalJSON marshals to JSON using Bech32.
  273. func (va ValAddress) MarshalJSON() ([]byte, error) {
  274. return json.Marshal(va.String())
  275. }
  276. // MarshalYAML marshals to YAML using Bech32.
  277. func (va ValAddress) MarshalYAML() (interface{}, error) {
  278. return va.String(), nil
  279. }
  280. // UnmarshalJSON unmarshals from JSON assuming Bech32 encoding.
  281. func (va *ValAddress) UnmarshalJSON(data []byte) error {
  282. var s string
  283. err := json.Unmarshal(data, &s)
  284. if err != nil {
  285. return err
  286. }
  287. va2, err := ValAddressFromBech32(s)
  288. if err != nil {
  289. return err
  290. }
  291. *va = va2
  292. return nil
  293. }
  294. // UnmarshalYAML unmarshals from YAML assuming Bech32 encoding.
  295. func (va *ValAddress) UnmarshalYAML(data []byte) error {
  296. var s string
  297. err := yaml.Unmarshal(data, &s)
  298. if err != nil {
  299. return err
  300. }
  301. va2, err := ValAddressFromBech32(s)
  302. if err != nil {
  303. return err
  304. }
  305. *va = va2
  306. return nil
  307. }
  308. // Bytes returns the raw address bytes.
  309. func (va ValAddress) Bytes() []byte {
  310. return va
  311. }
  312. // String implements the Stringer interface.
  313. func (va ValAddress) String() string {
  314. if va.Empty() {
  315. return ""
  316. }
  317. bech32PrefixValAddr := GetConfig().GetBech32ValidatorAddrPrefix()
  318. bech32Addr, err := bech32.ConvertAndEncode(bech32PrefixValAddr, va.Bytes())
  319. if err != nil {
  320. panic(err)
  321. }
  322. return bech32Addr
  323. }
  324. // Format implements the fmt.Formatter interface.
  325. // nolint: errcheck
  326. func (va ValAddress) Format(s fmt.State, verb rune) {
  327. switch verb {
  328. case 's':
  329. s.Write([]byte(va.String()))
  330. case 'p':
  331. s.Write([]byte(fmt.Sprintf("%p", va)))
  332. default:
  333. s.Write([]byte(fmt.Sprintf("%X", []byte(va))))
  334. }
  335. }
  336. // ----------------------------------------------------------------------------
  337. // consensus node
  338. // ----------------------------------------------------------------------------
  339. // ConsAddress defines a wrapper around bytes meant to present a consensus node.
  340. // When marshaled to a string or JSON, it uses Bech32.
  341. type ConsAddress []byte
  342. // ConsAddressFromHex creates a ConsAddress from a hex string.
  343. func ConsAddressFromHex(address string) (addr ConsAddress, err error) {
  344. if len(address) == 0 {
  345. return addr, errors.New("decoding Bech32 address failed: must provide an address")
  346. }
  347. bz, err := hex.DecodeString(address)
  348. if err != nil {
  349. return nil, err
  350. }
  351. return ConsAddress(bz), nil
  352. }
  353. // ConsAddressFromBech32 creates a ConsAddress from a Bech32 string.
  354. func ConsAddressFromBech32(address string) (addr ConsAddress, err error) {
  355. if len(strings.TrimSpace(address)) == 0 {
  356. return ConsAddress{}, nil
  357. }
  358. bech32PrefixConsAddr := GetConfig().GetBech32ConsensusAddrPrefix()
  359. bz, err := GetFromBech32(address, bech32PrefixConsAddr)
  360. if err != nil {
  361. return nil, err
  362. }
  363. err = VerifyAddressFormat(bz)
  364. if err != nil {
  365. return nil, err
  366. }
  367. return ConsAddress(bz), nil
  368. }
  369. // get ConsAddress from pubkey
  370. func GetConsAddress(pubkey crypto.PubKey) ConsAddress {
  371. return ConsAddress(pubkey.Address())
  372. }
  373. // Returns boolean for whether two ConsAddress are Equal
  374. func (ca ConsAddress) Equals(ca2 Address) bool {
  375. if ca.Empty() && ca2.Empty() {
  376. return true
  377. }
  378. return bytes.Equal(ca.Bytes(), ca2.Bytes())
  379. }
  380. // Returns boolean for whether an ConsAddress is empty
  381. func (ca ConsAddress) Empty() bool {
  382. if ca == nil {
  383. return true
  384. }
  385. ca2 := ConsAddress{}
  386. return bytes.Equal(ca.Bytes(), ca2.Bytes())
  387. }
  388. // Marshal returns the raw address bytes. It is needed for protobuf
  389. // compatibility.
  390. func (ca ConsAddress) Marshal() ([]byte, error) {
  391. return ca, nil
  392. }
  393. // Unmarshal sets the address to the given data. It is needed for protobuf
  394. // compatibility.
  395. func (ca *ConsAddress) Unmarshal(data []byte) error {
  396. *ca = data
  397. return nil
  398. }
  399. // MarshalJSON marshals to JSON using Bech32.
  400. func (ca ConsAddress) MarshalJSON() ([]byte, error) {
  401. return json.Marshal(ca.String())
  402. }
  403. // MarshalYAML marshals to YAML using Bech32.
  404. func (ca ConsAddress) MarshalYAML() (interface{}, error) {
  405. return ca.String(), nil
  406. }
  407. // UnmarshalJSON unmarshals from JSON assuming Bech32 encoding.
  408. func (ca *ConsAddress) UnmarshalJSON(data []byte) error {
  409. var s string
  410. err := json.Unmarshal(data, &s)
  411. if err != nil {
  412. return err
  413. }
  414. ca2, err := ConsAddressFromBech32(s)
  415. if err != nil {
  416. return err
  417. }
  418. *ca = ca2
  419. return nil
  420. }
  421. // UnmarshalYAML unmarshals from YAML assuming Bech32 encoding.
  422. func (ca *ConsAddress) UnmarshalYAML(data []byte) error {
  423. var s string
  424. err := yaml.Unmarshal(data, &s)
  425. if err != nil {
  426. return err
  427. }
  428. ca2, err := ConsAddressFromBech32(s)
  429. if err != nil {
  430. return err
  431. }
  432. *ca = ca2
  433. return nil
  434. }
  435. // Bytes returns the raw address bytes.
  436. func (ca ConsAddress) Bytes() []byte {
  437. return ca
  438. }
  439. // String implements the Stringer interface.
  440. func (ca ConsAddress) String() string {
  441. if ca.Empty() {
  442. return ""
  443. }
  444. bech32PrefixConsAddr := GetConfig().GetBech32ConsensusAddrPrefix()
  445. bech32Addr, err := bech32.ConvertAndEncode(bech32PrefixConsAddr, ca.Bytes())
  446. if err != nil {
  447. panic(err)
  448. }
  449. return bech32Addr
  450. }
  451. // Format implements the fmt.Formatter interface.
  452. // nolint: errcheck
  453. func (ca ConsAddress) Format(s fmt.State, verb rune) {
  454. switch verb {
  455. case 's':
  456. s.Write([]byte(ca.String()))
  457. case 'p':
  458. s.Write([]byte(fmt.Sprintf("%p", ca)))
  459. default:
  460. s.Write([]byte(fmt.Sprintf("%X", []byte(ca))))
  461. }
  462. }
  463. // ----------------------------------------------------------------------------
  464. // auxiliary
  465. // ----------------------------------------------------------------------------
  466. // Bech32ifyAccPub returns a Bech32 encoded string containing the
  467. // Bech32PrefixAccPub prefix for a given account PubKey.
  468. func Bech32ifyAccPub(pub crypto.PubKey) (string, error) {
  469. bech32PrefixAccPub := GetConfig().GetBech32AccountPubPrefix()
  470. return bech32.ConvertAndEncode(bech32PrefixAccPub, pub.Bytes())
  471. }
  472. // MustBech32ifyAccPub returns the result of Bech32ifyAccPub panicing on failure.
  473. func MustBech32ifyAccPub(pub crypto.PubKey) string {
  474. enc, err := Bech32ifyAccPub(pub)
  475. if err != nil {
  476. panic(err)
  477. }
  478. return enc
  479. }
  480. // Bech32ifyValPub returns a Bech32 encoded string containing the
  481. // Bech32PrefixValPub prefix for a given validator operator's PubKey.
  482. func Bech32ifyValPub(pub crypto.PubKey) (string, error) {
  483. bech32PrefixValPub := GetConfig().GetBech32ValidatorPubPrefix()
  484. return bech32.ConvertAndEncode(bech32PrefixValPub, pub.Bytes())
  485. }
  486. // MustBech32ifyValPub returns the result of Bech32ifyValPub panicing on failure.
  487. func MustBech32ifyValPub(pub crypto.PubKey) string {
  488. enc, err := Bech32ifyValPub(pub)
  489. if err != nil {
  490. panic(err)
  491. }
  492. return enc
  493. }
  494. // Bech32ifyConsPub returns a Bech32 encoded string containing the
  495. // Bech32PrefixConsPub prefixfor a given consensus node's PubKey.
  496. func Bech32ifyConsPub(pub crypto.PubKey) (string, error) {
  497. bech32PrefixConsPub := GetConfig().GetBech32ConsensusPubPrefix()
  498. return bech32.ConvertAndEncode(bech32PrefixConsPub, pub.Bytes())
  499. }
  500. // MustBech32ifyConsPub returns the result of Bech32ifyConsPub panicing on
  501. // failure.
  502. func MustBech32ifyConsPub(pub crypto.PubKey) string {
  503. enc, err := Bech32ifyConsPub(pub)
  504. if err != nil {
  505. panic(err)
  506. }
  507. return enc
  508. }
  509. // GetAccPubKeyBech32 creates a PubKey for an account with a given public key
  510. // string using the Bech32 Bech32PrefixAccPub prefix.
  511. func GetAccPubKeyBech32(pubkey string) (pk crypto.PubKey, err error) {
  512. bech32PrefixAccPub := GetConfig().GetBech32AccountPubPrefix()
  513. bz, err := GetFromBech32(pubkey, bech32PrefixAccPub)
  514. if err != nil {
  515. return nil, err
  516. }
  517. pk, err = cryptoAmino.PubKeyFromBytes(bz)
  518. if err != nil {
  519. return nil, err
  520. }
  521. return pk, nil
  522. }
  523. // MustGetAccPubKeyBech32 returns the result of GetAccPubKeyBech32 panicing on
  524. // failure.
  525. func MustGetAccPubKeyBech32(pubkey string) (pk crypto.PubKey) {
  526. pk, err := GetAccPubKeyBech32(pubkey)
  527. if err != nil {
  528. panic(err)
  529. }
  530. return pk
  531. }
  532. // GetValPubKeyBech32 creates a PubKey for a validator's operator with a given
  533. // public key string using the Bech32 Bech32PrefixValPub prefix.
  534. func GetValPubKeyBech32(pubkey string) (pk crypto.PubKey, err error) {
  535. bech32PrefixValPub := GetConfig().GetBech32ValidatorPubPrefix()
  536. bz, err := GetFromBech32(pubkey, bech32PrefixValPub)
  537. if err != nil {
  538. return nil, err
  539. }
  540. pk, err = cryptoAmino.PubKeyFromBytes(bz)
  541. if err != nil {
  542. return nil, err
  543. }
  544. return pk, nil
  545. }
  546. // MustGetValPubKeyBech32 returns the result of GetValPubKeyBech32 panicing on
  547. // failure.
  548. func MustGetValPubKeyBech32(pubkey string) (pk crypto.PubKey) {
  549. pk, err := GetValPubKeyBech32(pubkey)
  550. if err != nil {
  551. panic(err)
  552. }
  553. return pk
  554. }
  555. // GetConsPubKeyBech32 creates a PubKey for a consensus node with a given public
  556. // key string using the Bech32 Bech32PrefixConsPub prefix.
  557. func GetConsPubKeyBech32(pubkey string) (pk crypto.PubKey, err error) {
  558. bech32PrefixConsPub := GetConfig().GetBech32ConsensusPubPrefix()
  559. bz, err := GetFromBech32(pubkey, bech32PrefixConsPub)
  560. if err != nil {
  561. return nil, err
  562. }
  563. pk, err = cryptoAmino.PubKeyFromBytes(bz)
  564. if err != nil {
  565. return nil, err
  566. }
  567. return pk, nil
  568. }
  569. // MustGetConsPubKeyBech32 returns the result of GetConsPubKeyBech32 panicing on
  570. // failure.
  571. func MustGetConsPubKeyBech32(pubkey string) (pk crypto.PubKey) {
  572. pk, err := GetConsPubKeyBech32(pubkey)
  573. if err != nil {
  574. panic(err)
  575. }
  576. return pk
  577. }
  578. // GetFromBech32 decodes a bytestring from a Bech32 encoded string.
  579. func GetFromBech32(bech32str, prefix string) ([]byte, error) {
  580. if len(bech32str) == 0 {
  581. return nil, errors.New("decoding Bech32 address failed: must provide an address")
  582. }
  583. hrp, bz, err := bech32.DecodeAndConvert(bech32str)
  584. if err != nil {
  585. return nil, err
  586. }
  587. if hrp != prefix {
  588. return nil, fmt.Errorf("invalid Bech32 prefix; expected %s, got %s", prefix, hrp)
  589. }
  590. return bz, nil
  591. }