SPB Git

spb/os-vault Public

Self-custody, multi-chain crypto wallet for macOS. One recovery phrase, six chain families, zero API keys — nothing leaves your Mac.

Swift 96% Shell 3.4% Makefile 0.6%
1.9 KB · 81 lines swift
Raw Blame History
1import Foundation23extension Array {4    @inlinable5    init(reserveCapacity: Int) {6        self = [Element]()7        self.reserveCapacity(reserveCapacity)8    }910    @inlinable11    var slice: ArraySlice<Element> {12        self[startIndex ..< endIndex]13    }14}1516public extension Array where Element == UInt8 {17    init(hex: String) {18        self.init(reserveCapacity: hex.unicodeScalars.lazy.underestimatedCount)19        var buffer: UInt8?20        var skip = hex.hasPrefix("0x") ? 2 : 021        for char in hex.unicodeScalars.lazy {22            guard skip == 0 else {23                skip -= 124                continue25            }26            guard char.value >= 48, char.value <= 102 else {27                removeAll()28                return29            }30            let v: UInt831            let c = UInt8(char.value)32            switch c {33            case let c where c <= 57:34                v = c - 4835            case let c where c >= 65 && c <= 70:36                v = c - 5537            case let c where c >= 97:38                v = c - 8739            default:40                removeAll()41                return42            }43            if let b = buffer {44                append(b << 4 | v)45                buffer = nil46            } else {47                buffer = v48            }49        }50        if let b = buffer {51            append(b)52        }53    }5455    func toHexString() -> String {56        lazy.reduce(into: "") {57            var s = String($1, radix: 16)58            if s.count == 1 {59                s = "0" + s60            }61            $0 += s62        }63    }64}6566public extension Array where Element == UInt8 {67    func toBase64() -> String {68        Data(self).base64EncodedString()69    }7071    init(base64: String) {72        self.init()7374        guard let decodedData = Data(base64Encoded: base64) else {75            return76        }7778        append(contentsOf: decodedData.bytes)79    }80}81