diff --git a/Sources/Web3Core/KeystoreManager/BIP32Keystore.swift b/Sources/Web3Core/KeystoreManager/BIP32Keystore.swift index 4277cca61..22b305431 100755 --- a/Sources/Web3Core/KeystoreManager/BIP32Keystore.swift +++ b/Sources/Web3Core/KeystoreManager/BIP32Keystore.swift @@ -149,71 +149,76 @@ public class BIP32Keystore: AbstractKeystore { } else { newIndex = UInt32.zero } + guard let newNode = parentNode.derive(index: newIndex, derivePrivateKey: true, hardened: false) else { throw AbstractKeystoreError.keyDerivationError } guard let newAddress = Utilities.publicToAddress(newNode.publicKey) else { throw AbstractKeystoreError.keyDerivationError } - let prefixPath = self.rootPrefix - var newPath: String - if newNode.isHardened { - newPath = prefixPath + "/" + String(newNode.index % HDNode.hardenedIndexPrefix) + "'" - } else { - newPath = prefixPath + "/" + String(newNode.index) - } + let newPath = rootPrefix + "/" + String(newNode.index) addressStorage.add(address: newAddress, for: newPath) } public func createNewCustomChildAccount(password: String, path: String) throws { - guard let decryptedRootNode = try getPrefixNodeData(password) else { + guard let decryptedRootNode = try getPrefixNodeData(password), + let keystoreParams else { throw AbstractKeystoreError.encryptionError("Failed to decrypt a keystore") } guard let rootNode = HDNode(decryptedRootNode) else { throw AbstractKeystoreError.encryptionError("Failed to deserialize a root node") } - let prefixPath = self.rootPrefix - var pathAppendix: String? + + let prefixPath = rootPrefix + var pathAppendix = path + if path.hasPrefix(prefixPath) { - let upperIndex = (path.range(of: prefixPath)?.upperBound)! - if upperIndex < path.endIndex { - pathAppendix = String(path[path.index(after: upperIndex)]) + if let upperIndex = (path.range(of: prefixPath)?.upperBound), upperIndex < path.endIndex { + pathAppendix = String(path[path.index(after: upperIndex).. [EthereumAddress] { + guard let decryptedRootNode = try? getPrefixNodeData(password), + let rootNode = HDNode(decryptedRootNode) else { + throw AbstractKeystoreError.encryptionError("Failed to decrypt a keystore") + } + return try [UInt](0..