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.6 KB · 109 lines swift
Raw Blame History
1import Foundation23public struct Token2022AccountState: TokenAccountLayoutState {4    static var ACCOUNT_TYPE: UInt8 { 2 }56    public let mint: PublicKey7    public let owner: PublicKey8    public let lamports: UInt649    public let delegateOption: UInt3210    public var delegate: PublicKey?11    public let isInitialized: Bool12    public let isFrozen: Bool13    public let state: UInt814    public let isNativeOption: UInt3215    public let rentExemptReserve: UInt64?16    public let isNativeRaw: UInt6417    public let isNative: Bool18    public var delegatedAmount: UInt6419    public let closeAuthorityOption: UInt3220    public var closeAuthority: PublicKey?2122    public var extensions: [AnyToken2022ExtensionState]2324    public init(25        mint: PublicKey,26        owner: PublicKey,27        lamports: UInt64,28        delegateOption: UInt32,29        delegate: PublicKey? = nil,30        isInitialized: Bool,31        isFrozen: Bool,32        state: UInt8,33        isNativeOption: UInt32,34        rentExemptReserve: UInt64? = nil,35        isNativeRaw: UInt64,36        isNative: Bool,37        delegatedAmount: UInt64,38        closeAuthorityOption: UInt32,39        closeAuthority: PublicKey? = nil,40        extensions: [AnyToken2022ExtensionState] = []41    ) {42        self.mint = mint43        self.owner = owner44        self.lamports = lamports45        self.delegateOption = delegateOption46        self.delegate = delegate47        self.isInitialized = isInitialized48        self.isFrozen = isFrozen49        self.state = state50        self.isNativeOption = isNativeOption51        self.rentExemptReserve = rentExemptReserve52        self.isNativeRaw = isNativeRaw53        self.isNative = isNative54        self.delegatedAmount = delegatedAmount55        self.closeAuthorityOption = closeAuthorityOption56        self.closeAuthority = closeAuthority57        self.extensions = extensions58    }59}6061extension Token2022AccountState: BorshCodable {62    public func serialize(to writer: inout Data) throws {63        try serializeCommonProperties(to: &writer)64        try Self.ACCOUNT_TYPE.serialize(to: &writer)65        for ext in extensions {66            try ext.serialize(to: &writer)67        }68    }6970    public init(from reader: inout BinaryReader) throws {71        let oldTokenProgramData = try TokenAccountState(from: &reader)72        mint = oldTokenProgramData.mint73        owner = oldTokenProgramData.owner74        lamports = oldTokenProgramData.lamports75        delegateOption = oldTokenProgramData.delegateOption76        delegate = oldTokenProgramData.delegate77        isInitialized = oldTokenProgramData.isInitialized78        isFrozen = oldTokenProgramData.isFrozen79        state = oldTokenProgramData.state80        isNativeOption = oldTokenProgramData.isNativeOption81        rentExemptReserve = oldTokenProgramData.rentExemptReserve82        isNativeRaw = oldTokenProgramData.isNativeRaw83        isNative = oldTokenProgramData.isNative84        delegatedAmount = oldTokenProgramData.delegatedAmount85        closeAuthorityOption = oldTokenProgramData.closeAuthorityOption86        closeAuthority = oldTokenProgramData.closeAuthority8788        guard reader.cursor < reader.bytes.count else {89            extensions = []90            return91        }9293        let accountType = try reader.read(count: 1)9495        // AccountType == 2 for AccountState96        guard accountType.first == Self.ACCOUNT_TYPE else {97            throw BinaryReaderError.dataMismatch98        }99100        var extensions = [AnyToken2022ExtensionState]()101        repeat {102            let ext = try AnyToken2022ExtensionState(from: &reader)103            extensions.append(ext)104        } while reader.cursor < reader.bytes.count105106        self.extensions = extensions107    }108}109