waddrmgr+wallet: allow account import for simnet wallets

Simnet was previously left out as it didn't have defined HD versions for
some of our key scopes. To allow testing importing accounts into simnet
wallets, we fall back to use the mainnet HD versions.

This commit also addresses an issue with simnet wallets that would arise
whenever ScopedKeyManager.AccountProperties was invoked:

`failed to retrieve account public key: unsupported net SimNet`
This commit is contained in:
Wilmer Paulino 2021-04-14 16:47:32 -07:00
parent fe61cc5d78
commit e1dfc4d1b7
No known key found for this signature in database
GPG key ID: 6DF57B9F9514972F
2 changed files with 32 additions and 1 deletions

View file

@ -43,6 +43,11 @@ const (
// HDVersionTestNetBIP0084 is the HDVersion for BIP-0084 on the test // HDVersionTestNetBIP0084 is the HDVersion for BIP-0084 on the test
// network. // network.
HDVersionTestNetBIP0084 HDVersion = 0x045f1cf6 // vpub HDVersionTestNetBIP0084 HDVersion = 0x045f1cf6 // vpub
// HDVersionSimNetBIP0044 is the HDVersion for BIP-0044 on the
// simulation test network. There aren't any other versions defined for
// the simulation test network.
HDVersionSimNetBIP0044 HDVersion = 0x0420bd3a // spub
) )
// DerivationPath represents a derivation path from a particular key manager's // DerivationPath represents a derivation path from a particular key manager's
@ -2238,6 +2243,21 @@ func (s *ScopedKeyManager) cloneKeyWithVersion(key *hdkeychain.ExtendedKey) (
return nil, fmt.Errorf("unsupported scope %v", s.scope) return nil, fmt.Errorf("unsupported scope %v", s.scope)
} }
case wire.SimNet:
switch s.scope {
case KeyScopeBIP0044:
version = HDVersionSimNetBIP0044
// We use the mainnet versions for simnet keys when the keys
// belong to a key scope which simnet doesn't have a defined
// version for.
case KeyScopeBIP0049Plus:
version = HDVersionMainNetBIP0049
case KeyScopeBIP0084:
version = HDVersionMainNetBIP0084
default:
return nil, fmt.Errorf("unsupported scope %v", s.scope)
}
default: default:
return nil, fmt.Errorf("unsupported net %v", net) return nil, fmt.Errorf("unsupported net %v", net)
} }

View file

@ -37,7 +37,9 @@ func keyScopeFromPubKey(pubKey *hdkeychain.ExtendedKey,
// force the standard BIP-0049 derivation scheme (nested witness pubkeys // force the standard BIP-0049 derivation scheme (nested witness pubkeys
// everywhere), while a witness address type will force the standard // everywhere), while a witness address type will force the standard
// BIP-0084 derivation scheme. // BIP-0084 derivation scheme.
case waddrmgr.HDVersionMainNetBIP0044, waddrmgr.HDVersionTestNetBIP0044: case waddrmgr.HDVersionMainNetBIP0044, waddrmgr.HDVersionTestNetBIP0044,
waddrmgr.HDVersionSimNetBIP0044:
if addrType == nil { if addrType == nil {
return waddrmgr.KeyScope{}, nil, errors.New("address " + return waddrmgr.KeyScope{}, nil, errors.New("address " +
"type must be specified for account public " + "type must be specified for account public " +
@ -111,6 +113,15 @@ func (w *Wallet) isPubKeyForNet(pubKey *hdkeychain.ExtendedKey) bool {
version == waddrmgr.HDVersionTestNetBIP0049 || version == waddrmgr.HDVersionTestNetBIP0049 ||
version == waddrmgr.HDVersionTestNetBIP0084 version == waddrmgr.HDVersionTestNetBIP0084
// For simnet, we'll also allow the mainnet versions since simnet
// doesn't have defined versions for some of our key scopes, and the
// mainnet versions are usually used as the default regardless of the
// network/key scope.
case wire.SimNet:
return version == waddrmgr.HDVersionSimNetBIP0044 ||
version == waddrmgr.HDVersionMainNetBIP0049 ||
version == waddrmgr.HDVersionMainNetBIP0084
default: default:
return false return false
} }