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%
3.0 KB · 96 lines swift
Raw Blame History
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