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 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