Skip to content
This repository has been archived by the owner on May 28, 2019. It is now read-only.

Commit

Permalink
Improved validation for upper and lower case addresses
Browse files Browse the repository at this point in the history
  • Loading branch information
ArtemGoryunov committed Sep 11, 2018
1 parent 015b7b6 commit d6a56f7
Showing 1 changed file with 32 additions and 12 deletions.
44 changes: 32 additions & 12 deletions Sources/Ethereum/EthereumAddress.swift
Original file line number Diff line number Diff line change
Expand Up @@ -18,21 +18,15 @@ public struct EthereumAddress: Address, Hashable {

/// Validates that the string is a valid address.
static public func isValid(string: String) -> Bool {
guard let data = Data(hexString: string) else {
return false
}

let uppers = CharacterSet(charactersIn: "ABCDEF")
let lowers = CharacterSet(charactersIn: "abcdef")

let hasUppers = (string.rangeOfCharacter(from: uppers) != nil)
let hasLowers = (string.rangeOfCharacter(from: lowers) != nil)

// If all characters are uppercase or lowercase, return true
if (hasUppers && !hasLowers) || (!hasUppers && hasLowers) {
guard !isAdressWithoutChecksum(string: string) else {
return true
}

guard let data = Data(hexString: string) else {
return false
}

let eip55String = EthereumAddress.computeEIP55String(for: data)
return string == eip55String
}
Expand All @@ -56,7 +50,7 @@ public struct EthereumAddress: Address, Hashable {

/// Creates an address with an hexadecimal string representation.
public init?(string: String) {
guard let data = Data(hexString: string), data.count == EthereumAddress.size else {
guard let data = Data(hexString: string), EthereumAddress.isValid(data: data) else {
return nil
}
self.data = data
Expand Down Expand Up @@ -97,4 +91,30 @@ extension EthereumAddress {

return string
}

fileprivate static func isAdressWithoutChecksum(string: String) -> Bool {
guard string.hasPrefix("0x"), let data = Data(hexString: string), isValid(data: data) else {
return false
}

var hasUppers: Bool = false
var hasLowers: Bool = false

for character in string {
switch character {
case "A", "B", "C", "D", "E", "F": hasUppers = true
case "a", "b", "c", "d", "e", "f": hasLowers = true
default: break
}
}

// If all characters are uppercase or lowercase, return true
if (hasUppers && !hasLowers) || (!hasUppers && hasLowers) {
return true
}

return false
}

}

0 comments on commit d6a56f7

Please sign in to comment.