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%
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