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.8 KB · 137 lines swift
Raw Blame History
1import Foundation23public struct EncodableWrapper: Encodable {4    let wrapped: Encodable56    public func encode(to encoder: Encoder) throws {7        try wrapped.encode(to: encoder)8    }9}1011public struct RequestAPI: Encodable {12    public init(method: String, params: [Encodable]) {13        self.method = method14        self.params = params15    }1617    public let id = UUID().uuidString18    public let method: String19    public let jsonrpc: String = "2.0"20    public let params: [Encodable]2122    enum CodingKeys: String, CodingKey {23        case id24        case method25        case jsonrpc26        case params27    }2829    public func encode(to encoder: Encoder) throws {30        var container = encoder.container(keyedBy: CodingKeys.self)31        try container.encode(id, forKey: .id)32        try container.encode(method, forKey: .method)33        try container.encode(jsonrpc, forKey: .jsonrpc)34        let wrappedDict = params.map(EncodableWrapper.init(wrapped:))35        try container.encode(wrappedDict, forKey: .params)36    }37}3839// MARK: - Transfer4041public enum Transfer {42    public static func compile() -> Data {43        var result = Data(capacity: 17) // FIXME: - capacity44        result.append(0x2) // program index45        let keyIndeces = [UInt8]([0, 1])46        result.append(Data.encodeLength(keyIndeces.count)) // key size47        result.append(contentsOf: keyIndeces) // keyIndeces48        result.append(UInt8(12)) // FIXME: transfer data size4950        result += UInt32(2).bytes // Program Index5152        let lamports = 300053        result += UInt64(lamports).bytes5455        return result56    }57}5859// MARK: - Public6061public struct OwnerInfoParams: Encodable {62    public let mint: String?63    public let programId: String?6465    public init(mint: String?, programId: String?) {66        self.mint = mint67        self.programId = programId68    }69}7071public typealias Commitment = String7273public struct RequestConfiguration: Encodable {74    public let commitment: Commitment?75    public let encoding: String?76    public let dataSlice: DataSlice?77    public let filters: [[String: EncodableWrapper]]?78    public let limit: Int?79    public let before: String?80    public let until: String?81    public let skipPreflight: Bool?82    public let preflightCommitment: Commitment?83    public let searchTransactionHistory: Bool?84    public let replaceRecentBlockhash: Bool?8586    public init?(87        commitment: Commitment? = nil,88        encoding: String? = nil,89        dataSlice: DataSlice? = nil,90        filters: [[String: EncodableWrapper]]? = nil,91        limit: Int? = nil,92        before: String? = nil,93        until: String? = nil,94        skipPreflight: Bool? = nil,95        preflightCommitment: Commitment? = nil,96        searchTransactionHistory: Bool? = nil,97        replaceRecentBlockhash: Bool? = nil98    ) {99        if commitment == nil,100           encoding == nil,101           dataSlice == nil,102           filters == nil,103           limit == nil,104           before == nil,105           until == nil,106           skipPreflight == nil,107           preflightCommitment == nil,108           searchTransactionHistory == nil,109           replaceRecentBlockhash == nil110        {111            return nil112        }113114        self.commitment = commitment115        self.encoding = encoding116        self.dataSlice = dataSlice117        self.filters = filters118        self.limit = limit119        self.before = before120        self.until = until121        self.skipPreflight = skipPreflight122        self.preflightCommitment = preflightCommitment123        self.searchTransactionHistory = searchTransactionHistory124        self.replaceRecentBlockhash = replaceRecentBlockhash125    }126}127128public struct DataSlice: Encodable {129    public let offset: Int130    public let length: Int131132    public init(offset: Int, length: Int) {133        self.offset = offset134        self.length = length135    }136}137