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 Foundation23public protocol BorshSerializable {4 func serialize(to writer: inout Data) throws5}67extension UInt8: BorshSerializable {}8extension UInt16: BorshSerializable {}9extension UInt32: BorshSerializable {}10extension UInt64: BorshSerializable {}11extension UInt128: BorshSerializable {}12extension Int8: BorshSerializable {}13extension Int16: BorshSerializable {}14extension Int32: BorshSerializable {}15extension Int64: BorshSerializable {}16extension Int128: BorshSerializable {}1718public extension FixedWidthInteger {19 func serialize(to writer: inout Data) throws {20 writer.append(contentsOf: withUnsafeBytes(of: littleEndian) { Array($0) })21 }22}2324extension Float32: BorshSerializable {25 public func serialize(to writer: inout Data) throws {26 assert(!isNaN, "For portability reasons we do not allow to serialize NaNs.")27 var start = bitPattern.littleEndian28 writer.append(Data(buffer: UnsafeBufferPointer(start: &start, count: 1)))29 }30}3132extension Float64: BorshSerializable {33 public func serialize(to writer: inout Data) throws {34 assert(!isNaN, "For portability reasons we do not allow to serialize NaNs.")35 var start = bitPattern.littleEndian36 writer.append(Data(buffer: UnsafeBufferPointer(start: &start, count: 1)))37 }38}3940extension Bool: BorshSerializable {41 public func serialize(to writer: inout Data) throws {42 let intRepresentation: UInt8 = self ? 1 : 043 try intRepresentation.serialize(to: &writer)44 }45}4647extension Optional where Wrapped: BorshSerializable {48 func serialize(to writer: inout Data) throws {49 switch self {50 case let .some(value):51 try UInt8(1).serialize(to: &writer)52 try value.serialize(to: &writer)53 case .none:54 try UInt8(0).serialize(to: &writer)55 }56 }57}5859extension String: BorshSerializable {60 public func serialize(to writer: inout Data) throws {61 let data = Data(utf8)62 try UInt32(data.count).serialize(to: &writer)63 writer.append(data)64 }65}6667extension Array: BorshSerializable where Element: BorshSerializable {68 public func serialize(to writer: inout Data) throws {69 try UInt32(count).serialize(to: &writer)70 try forEach { try $0.serialize(to: &writer) }71 }7273 public func rawSerialized() throws -> Data {74 var data = Data()75 try forEach { try $0.serialize(to: &data) }76 return data77 }78}7980extension Set: BorshSerializable where Element: BorshSerializable & Comparable {81 public func serialize(to writer: inout Data) throws {82 try sorted().serialize(to: &writer)83 }84}8586extension Dictionary: BorshSerializable where Key: BorshSerializable & Comparable, Value: BorshSerializable {87 public func serialize(to writer: inout Data) throws {88 let sortedByKeys = sorted(by: { $0.key < $1.key })89 try UInt32(sortedByKeys.count).serialize(to: &writer)90 try sortedByKeys.forEach { key, value in91 try key.serialize(to: &writer)92 try value.serialize(to: &writer)93 }94 }95}96