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%
2.1 KB · 73 lines swift
Raw Blame History
1import Foundation23public protocol SolanaTokenListSource {4    func download() async throws -> Set<TokenMetadata>5}67public class SolanaTokenListSourceImpl: SolanaTokenListSource {8    // MARK: - Properties910    private let networkManager: NetworkManager11    private let tokenListURL: URL?1213    public init(url: String, networkManager: NetworkManager) {14        tokenListURL = URL(string: url)15        self.networkManager = networkManager16    }1718    public static func solanaLabs(networkManager: NetworkManager) -> SolanaTokenListSourceImpl {19        .init(20            url: "https://raw.githubusercontent.com/solana-labs/token-list/main/src/tokens/solana.tokenlist.json",21            networkManager: networkManager22        )23    }2425    public static func p2p(networkManager: NetworkManager) -> SolanaTokenListSourceImpl {26        .init(27            url: "https://raw.githubusercontent.com/p2p-org/solana-token-list/main/src/tokens/solana.tokenlist.json",28            networkManager: networkManager29        )30    }3132    // MARK: -3334    public func download() async throws -> Set<TokenMetadata> {35        guard let url = tokenListURL else { throw APIClientError.invalidAPIURL }36        let urlRequest = URLRequest(url: url)3738        // check for cancellation39        try Task.checkCancellation()4041        // get data42        let data = try await networkManager.requestData(request: urlRequest)4344        // check again for cancellation45        try Task.checkCancellation()4647        // decode data48        let tokenList: TokensList = try JSONDecoder().decode(TokensList.self, from: data)4950        // map tags51        let tokens: [TokenMetadata] = tokenList.tokens.map {52            var item = $053            item.tags = (item._tags ?? []).map {54                tokenList.tags?[$0] ?? TokenTag(name: $0, description: $0)55            }56            return item57        }5859        return Set(tokens)60    }61}6263extension SolanaTokenListSourceImpl {64    struct TokensList: Codable {65        let name: String?66        let logoURI: String?67        let keywords: [String]?68        let tags: [String: TokenTag]?69        let timestamp: String70        var tokens: [TokenMetadata]71    }72}73